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/WebPluginPackage.h>
20 #import <WebKit/WebPluginViewFactory.h>
21 #import <WebKit/WebViewPrivate.h>
22 #import <WebKit/WebUIDelegate.h>
24 #import <WebCore/WebCoreBridge.h>
26 #import <Foundation/NSURL_NSURLExtras.h>
27 #import <Foundation/NSURLRequest.h>
29 @interface NSView (PluginSecrets)
30 - (void)setContainingWindow:(NSWindow *)w;
33 // For compatibility only.
34 @interface NSObject (OldPluginAPI)
35 + (NSView *)pluginViewWithArguments:(NSDictionary *)arguments;
38 @interface NSView (OldPluginAPI)
39 - (void)pluginInitialize;
42 - (void)pluginDestroy;
45 static NSMutableSet *pluginViews = nil;
47 @implementation WebPluginController
49 + (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)pluginPackage
52 Class viewFactory = [pluginPackage viewFactory];
55 if ([viewFactory respondsToSelector:@selector(plugInViewWithArguments:)]) {
56 view = [viewFactory plugInViewWithArguments:arguments];
57 } else if ([viewFactory respondsToSelector:@selector(pluginViewWithArguments:)]) {
58 view = [viewFactory pluginViewWithArguments:arguments];
65 if (pluginViews == nil) {
66 pluginViews = [[NSMutableSet alloc] init];
68 [pluginViews addObject:view];
73 + (BOOL)isPlugInView:(NSView *)view
75 return [pluginViews containsObject:view];
78 - (id)initWithDocumentView:(NSView *)view
82 _views = [[NSMutableArray alloc] init];
86 - (void)startAllPlugins
92 if ([_views count] > 0) {
93 LOG(Plugins, "starting WebKit plugins : %@", [_views description]);
96 int i, count = [_views count];
97 for (i = 0; i < count; i++) {
98 id aView = [_views objectAtIndex:i];
99 if ([aView respondsToSelector:@selector(webPlugInStart)])
100 [aView webPlugInStart];
101 else if ([aView respondsToSelector:@selector(pluginStart)])
107 - (void)stopAllPlugins
113 if ([_views count] > 0) {
114 LOG(Plugins, "stopping WebKit plugins: %@", [_views description]);
117 int i, count = [_views count];
118 for (i = 0; i < count; i++) {
119 id aView = [_views objectAtIndex:i];
120 if ([aView respondsToSelector:@selector(webPlugInStop)])
121 [aView webPlugInStop];
122 else if ([aView respondsToSelector:@selector(pluginStop)])
128 - (void)addPlugin:(NSView *)view
130 if (!_documentView) {
131 ERROR("can't add a plug-in to a defunct WebPluginController");
135 if (![_views containsObject:view]) {
136 [_views addObject:view];
138 LOG(Plugins, "initializing plug-in %@", view);
139 if ([view respondsToSelector:@selector(webPlugInInitialize)])
140 [view webPlugInInitialize];
141 else if ([view respondsToSelector:@selector(pluginInitialize)])
142 [view pluginInitialize];
145 LOG(Plugins, "starting plug-in %@", view);
146 if ([view respondsToSelector:@selector(webPlugInStart)])
147 [view webPlugInStart];
148 else if ([view respondsToSelector:@selector(pluginStart)])
151 if ([view respondsToSelector:@selector(setContainingWindow:)])
152 [view setContainingWindow:[_documentView window]];
157 - (void)destroyAllPlugins
159 [self stopAllPlugins];
161 if ([_views count] > 0) {
162 LOG(Plugins, "destroying WebKit plugins: %@", [_views description]);
165 int i, count = [_views count];
166 for (i = 0; i < count; i++) {
167 id aView = [_views objectAtIndex:i];
168 if ([aView respondsToSelector:@selector(webPlugInDestroy)]) {
169 [aView webPlugInDestroy];
170 } else if ([aView respondsToSelector:@selector(pluginDestroy)]) {
171 [aView pluginDestroy];
173 [pluginViews removeObject:aView];
175 [_views makeObjectsPerformSelector:@selector(removeFromSuperviewWithoutNeedingDisplay)];
182 - (id)_webPluginContainerCheckIfAllowedToLoadRequest:(NSURLRequest *)Request inFrame:(NSString *)target resultObject:(id)obj selector:(SEL)selector
184 // FIXME: really implement this
185 [obj performSelector:selector withObject:(id)YES];
189 - (void)_webPluginContainerCancelCheckIfAllowedToLoadRequest:(id)checkIdentifier
191 // FIXME: really implement this
194 - (void)webPlugInContainerLoadRequest:(NSURLRequest *)request inFrame:(NSString *)target
197 ERROR("nil URL passed");
200 if (!_documentView) {
201 ERROR("could not load URL %@ because plug-in has already been destroyed", request);
204 WebFrame *frame = [_documentView _frame];
206 ERROR("could not load URL %@ because plug-in has already been stopped", request);
212 NSString *JSString = [[request URL] _web_scriptIfJavaScriptURL];
214 if ([frame findFrameNamed:target] != frame) {
215 ERROR("JavaScript requests can only be made on the frame that contains the plug-in");
218 [[frame _bridge] stringByEvaluatingJavaScriptFromString:JSString];
221 ERROR("could not load URL %@", [request URL]);
224 [frame _loadRequest:request inFrameNamed:target];
228 // For compatibility only.
229 - (void)showURL:(NSURL *)URL inFrame:(NSString *)target
231 [self webPlugInContainerLoadRequest:[NSURLRequest requestWithURL:URL] inFrame:target];
234 - (void)webPlugInContainerShowStatus:(NSString *)message
239 if (!_documentView) {
240 ERROR("could not show status message (%@) because plug-in has already been destroyed", message);
243 WebView *v = [_documentView _webView];
244 [[v _UIDelegateForwarder] webView:v setStatusText:message];
247 // For compatibility only.
248 - (void)showStatus:(NSString *)message
250 [self webPlugInContainerShowStatus:message];
253 - (NSColor *)webPlugInContainerSelectionColor
255 return [[_documentView _bridge] selectionColor];
258 // For compatibility only.
259 - (NSColor *)selectionColor
261 return [self webPlugInContainerSelectionColor];
264 - (WebFrame *)webFrame
266 return [_documentView _frame];