2 // WebPluginController.m
5 // Created by Chris Blumenberg on Wed Oct 23 2002.
6 // Copyright (c) 2002 Apple Computer, Inc. All rights reserved.
9 #import <WebKit/WebPluginController.h>
11 #import <WebKit/WebBridge.h>
12 #import <WebKit/WebFramePrivate.h>
13 #import <WebKit/WebFrameView.h>
14 #import <WebKit/WebHTMLViewPrivate.h>
15 #import <WebKit/WebKitLogging.h>
16 #import <WebKit/WebNSViewExtras.h>
17 #import <WebKit/WebPlugin.h>
18 #import <WebKit/WebPluginContainer.h>
19 #import <WebKit/WebPluginContainerCheck.h>
20 #import <WebKit/WebPluginPackage.h>
21 #import <WebKit/WebPluginViewFactory.h>
22 #import <WebKit/WebViewPrivate.h>
23 #import <WebKit/WebUIDelegate.h>
25 #import <WebCore/WebCoreBridge.h>
27 #import <Foundation/NSURL_NSURLExtras.h>
28 #import <Foundation/NSURLRequest.h>
30 @interface NSView (PluginSecrets)
31 - (void)setContainingWindow:(NSWindow *)w;
34 // For compatibility only.
35 @interface NSObject (OldPluginAPI)
36 + (NSView *)pluginViewWithArguments:(NSDictionary *)arguments;
39 @interface NSView (OldPluginAPI)
40 - (void)pluginInitialize;
43 - (void)pluginDestroy;
46 static NSMutableSet *pluginViews = nil;
48 @implementation WebPluginController
50 + (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)pluginPackage
53 Class viewFactory = [pluginPackage viewFactory];
56 if ([viewFactory respondsToSelector:@selector(plugInViewWithArguments:)]) {
57 view = [viewFactory plugInViewWithArguments:arguments];
58 } else if ([viewFactory respondsToSelector:@selector(pluginViewWithArguments:)]) {
59 view = [viewFactory pluginViewWithArguments:arguments];
66 if (pluginViews == nil) {
67 pluginViews = [[NSMutableSet alloc] init];
69 [pluginViews addObject:view];
74 + (BOOL)isPlugInView:(NSView *)view
76 return [pluginViews containsObject:view];
79 - (id)initWithDocumentView:(NSView *)view
83 _views = [[NSMutableArray alloc] init];
84 _checksInProgress = (NSMutableSet *)CFSetCreateMutable(NULL, 0, NULL);
89 - (void)startAllPlugins
95 if ([_views count] > 0) {
96 LOG(Plugins, "starting WebKit plugins : %@", [_views description]);
99 int i, count = [_views count];
100 for (i = 0; i < count; i++) {
101 id aView = [_views objectAtIndex:i];
102 if ([aView respondsToSelector:@selector(webPlugInStart)])
103 [aView webPlugInStart];
104 else if ([aView respondsToSelector:@selector(pluginStart)])
110 - (void)stopAllPlugins
116 if ([_views count] > 0) {
117 LOG(Plugins, "stopping WebKit plugins: %@", [_views description]);
120 int i, count = [_views count];
121 for (i = 0; i < count; i++) {
122 id aView = [_views objectAtIndex:i];
123 if ([aView respondsToSelector:@selector(webPlugInStop)])
124 [aView webPlugInStop];
125 else if ([aView respondsToSelector:@selector(pluginStop)])
131 - (void)addPlugin:(NSView *)view
133 if (!_documentView) {
134 ERROR("can't add a plug-in to a defunct WebPluginController");
138 if (![_views containsObject:view]) {
139 [_views addObject:view];
141 LOG(Plugins, "initializing plug-in %@", view);
142 if ([view respondsToSelector:@selector(webPlugInInitialize)])
143 [view webPlugInInitialize];
144 else if ([view respondsToSelector:@selector(pluginInitialize)])
145 [view pluginInitialize];
148 LOG(Plugins, "starting plug-in %@", view);
149 if ([view respondsToSelector:@selector(webPlugInStart)])
150 [view webPlugInStart];
151 else if ([view respondsToSelector:@selector(pluginStart)])
154 if ([view respondsToSelector:@selector(setContainingWindow:)])
155 [view setContainingWindow:[_documentView window]];
160 - (void)_webPluginContainerCancelCheckIfAllowedToLoadRequest:(id)checkIdentifier
162 [checkIdentifier cancel];
163 [_checksInProgress removeObject:checkIdentifier];
166 - (void)_cancelOutstandingChecks
168 NSEnumerator *e = [_checksInProgress objectEnumerator];
170 while ((check = [e nextObject])) {
173 [_checksInProgress release];
174 _checksInProgress = nil;
177 - (void)destroyAllPlugins
179 [self stopAllPlugins];
181 if ([_views count] > 0) {
182 LOG(Plugins, "destroying WebKit plugins: %@", [_views description]);
185 [self _cancelOutstandingChecks];
187 int i, count = [_views count];
188 for (i = 0; i < count; i++) {
189 id aView = [_views objectAtIndex:i];
190 if ([aView respondsToSelector:@selector(webPlugInDestroy)]) {
191 [aView webPlugInDestroy];
192 } else if ([aView respondsToSelector:@selector(pluginDestroy)]) {
193 [aView pluginDestroy];
195 [pluginViews removeObject:aView];
197 [_views makeObjectsPerformSelector:@selector(removeFromSuperviewWithoutNeedingDisplay)];
204 - (id)_webPluginContainerCheckIfAllowedToLoadRequest:(NSURLRequest *)request inFrame:(NSString *)target resultObject:(id)obj selector:(SEL)selector
206 WebPluginContainerCheck *check = [WebPluginContainerCheck checkWithRequest:request target:target resultObject:obj selector:selector controller:self];
207 [_checksInProgress addObject:check];
213 - (void)webPlugInContainerLoadRequest:(NSURLRequest *)request inFrame:(NSString *)target
216 ERROR("nil URL passed");
219 if (!_documentView) {
220 ERROR("could not load URL %@ because plug-in has already been destroyed", request);
223 WebFrame *frame = [_documentView _frame];
225 ERROR("could not load URL %@ because plug-in has already been stopped", request);
231 NSString *JSString = [[request URL] _web_scriptIfJavaScriptURL];
233 if ([frame findFrameNamed:target] != frame) {
234 ERROR("JavaScript requests can only be made on the frame that contains the plug-in");
237 [[frame _bridge] stringByEvaluatingJavaScriptFromString:JSString];
240 ERROR("could not load URL %@", [request URL]);
243 [frame _loadRequest:request inFrameNamed:target];
247 // For compatibility only.
248 - (void)showURL:(NSURL *)URL inFrame:(NSString *)target
250 [self webPlugInContainerLoadRequest:[NSURLRequest requestWithURL:URL] inFrame:target];
253 - (void)webPlugInContainerShowStatus:(NSString *)message
258 if (!_documentView) {
259 ERROR("could not show status message (%@) because plug-in has already been destroyed", message);
262 WebView *v = [_documentView _webView];
263 [[v _UIDelegateForwarder] webView:v setStatusText:message];
266 // For compatibility only.
267 - (void)showStatus:(NSString *)message
269 [self webPlugInContainerShowStatus:message];
272 - (NSColor *)webPlugInContainerSelectionColor
274 return [[_documentView _bridge] selectionColor];
277 // For compatibility only.
278 - (NSColor *)selectionColor
280 return [self webPlugInContainerSelectionColor];
283 - (WebFrame *)webFrame
285 return [_documentView _frame];
288 - (WebBridge *)bridge
290 return [[self webFrame] _bridge];
295 return [[self webFrame] webView];