Use NSWorkspace methods instead of Launch Services and Finder functions.
[WebKit-https.git] / WebKit / WebView.subproj / IFWebFrame.mm
1 /*      
2         IFWebFrame.m
3             
4             Copyright 2001, Apple, Inc. All rights reserved.
5 */
6 #import <Cocoa/Cocoa.h>
7
8 #import <WebKit/IFWebFrame.h>
9 #import <WebKit/IFWebFramePrivate.h>
10 #import <WebKit/IFWebViewPrivate.h>
11 #import <WebKit/IFWebDataSourcePrivate.h>
12 #import <WebKit/IFBaseWebControllerPrivate.h>
13 #import <WebKit/IFWebController.h>
14 #import <WebKit/IFLocationChangeHandler.h>
15 #import <WebKit/IFDownloadHandler.h>
16 #import <WebFoundation/WebFoundation.h>
17
18 #import <WebKit/WebKitDebug.h>
19
20 #import <khtml_part.h>
21 #import <rendering/render_frames.h>
22
23 @implementation IFWebFrame
24
25 - init
26 {
27     return [self initWithName: nil view: nil provisionalDataSource: nil controller: nil];
28 }
29
30 - initWithName: (NSString *)n view: v provisionalDataSource: (IFWebDataSource *)d controller: (id<IFWebController>)c
31 {
32     [super init];
33
34     _private = [[IFWebFramePrivate alloc] init];   
35
36     [self _setState: IFWEBFRAMESTATE_UNINITIALIZED];    
37
38     [self setController: c];
39
40     // Allow controller to override?
41     if (d && [self setProvisionalDataSource: d] == NO){
42         [self autorelease];
43         return nil;
44     }
45     
46     [_private setName: n];
47     
48     if (v)
49         [self setView: v];
50     
51     return self;
52 }
53
54 - (void)dealloc
55 {
56     [_private release];
57     [super dealloc];
58 }
59
60 - (NSString *)name
61 {
62     return [_private name];
63 }
64
65
66 - (void)setView: v
67 {
68     [_private setView: v];
69     [v _setController: [self controller]];
70 }
71
72 - view
73 {
74     return [_private view];
75 }
76
77 - (id <IFWebController>)controller
78 {
79     return [_private controller];
80 }
81
82
83 - (void)setController: (id <IFWebController>)controller
84 {
85     [_private setController: controller];
86 }
87
88
89 - (IFWebDataSource *)provisionalDataSource
90 {
91     return [_private provisionalDataSource];
92 }
93
94
95 - (IFWebDataSource *)dataSource
96 {
97     return [_private dataSource];
98 }
99
100
101 // FIXME:  The name of this method is a little misleading, perhaps
102 // we could call it prepareProvisionalDataSource?.
103 - (BOOL)setProvisionalDataSource: (IFWebDataSource *)newDataSource
104 {
105     IFWebDataSource *oldDataSource;
106     id <IFLocationChangeHandler>locationChangeHandler;
107     IFURLPolicy urlPolicy;
108     
109     WEBKIT_ASSERT ([self controller] != nil);
110
111     // Unfortunately the view must be non-nil, this is ultimately due
112     // to KDE parser requiring a KHTMLView.  Once we settle on a final
113     // KDE drop we should fix this dependency.
114     WEBKIT_ASSERT ([self view] != nil);
115
116     urlPolicy = [[self controller] URLPolicyForURL:[newDataSource inputURL]];
117
118     if(urlPolicy == IFURLPolicyUseContentPolicy){
119             
120         if ([self _state] != IFWEBFRAMESTATE_COMPLETE){
121             [self stopLoading];
122         }
123         
124         locationChangeHandler = [[self controller] provideLocationChangeHandlerForFrame: self];
125     
126         [newDataSource _setLocationChangeHandler: locationChangeHandler];
127     
128         oldDataSource = [self dataSource];
129         
130         // Is this the top frame?  If so set the data source's parent to nil.
131         if (self == [[self controller] mainFrame])
132             [newDataSource _setParent: nil];
133             
134         // Otherwise set the new data source's parent to the old data source's parent.
135         else if (oldDataSource && oldDataSource != newDataSource)
136             [newDataSource _setParent: [oldDataSource parent]];
137                 
138         [newDataSource _setController: [self controller]];
139         
140         [_private setProvisionalDataSource: newDataSource];
141         
142         [[self view] provisionalDataSourceChanged: newDataSource];
143     
144     #ifdef OLD_WAY
145         // This introduces a nasty dependency on the view.
146         khtml::RenderPart *renderPartFrame = [self _renderFramePart];
147         id view = [self view];
148         if (renderPartFrame && [view isKindOfClass: NSClassFromString(@"IFWebView")])
149             renderPartFrame->setWidget ([view _provisionalWidget]);
150     #endif
151     
152         [self _setState: IFWEBFRAMESTATE_PROVISIONAL];
153     }
154     
155     else if(urlPolicy == IFURLPolicyOpenExternally){
156         return [[NSWorkspace sharedWorkspace] openURL:[newDataSource inputURL]];
157     }
158     
159     // Do nothing in the IFURLPolicyIgnore case.
160
161     return YES;
162 }
163
164
165 - (void)startLoading
166 {
167     if (self == [[self controller] mainFrame])
168         WEBKITDEBUGLEVEL (WEBKIT_LOG_DOCUMENTLOAD, "loading %s", [[[[self provisionalDataSource] inputURL] absoluteString] cString]);
169
170     // Force refresh is irrelevant, as this will always be the first load.
171     // The controller will transition the provisional data source to the
172     // committed data source.
173     [_private->provisionalDataSource startLoading: NO];
174 }
175
176
177 - (void)stopLoading
178 {
179     [_private->provisionalDataSource stopLoading];
180     [_private->dataSource stopLoading];
181 }
182
183
184 - (void)reload: (BOOL)forceRefresh
185 {
186     [_private->dataSource _clearErrors];
187
188     [_private->dataSource startLoading: forceRefresh];
189 }
190
191
192 - (void)reset
193 {
194     [_private setDataSource: nil];
195     [[_private view] _resetWidget];
196     [_private setView: nil];
197 }
198
199 - (IFWebFrame *)frameNamed:(NSString *)name
200 {
201     if([name isEqualToString:@"_self"] || [name isEqualToString:@"_current"])
202         return self;
203     
204     else if([name isEqualToString:@"_top"])
205         return [[self controller] mainFrame];
206         
207     else if([name isEqualToString:@"_parent"]){
208         if([[self dataSource] parent]){
209             return [[[self dataSource] parent] webFrame];
210         }else{
211             return self;
212         }
213     }else{
214         return [[self controller] frameNamed:name];
215     }
216 }
217
218 @end