18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginController.h"
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMNodeInternal.h"
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebDataSourceInternal.h"
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebFrameInternal.h"
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebFrameView.h"
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebHTMLViewPrivate.h"
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebKitErrorsPrivate.h"
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebKitLogging.h"
39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import "WebNSObjectExtras.h"
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebNSURLExtras.h"
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebNSViewExtras.h"
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPlugin.h"
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginContainer.h"
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginContainerCheck.h"
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginPackage.h"
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginPrivate.h"
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebPluginViewFactory.h"
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebUIDelegate.h"
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebViewInternal.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/NSURLRequest.h>
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/DocumentLoader.h>
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Frame.h>
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameLoader.h>
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/HTMLMediaElement.h>
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/HTMLNames.h>
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/MediaPlayerProxy.h>
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/PlatformString.h>
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/ResourceRequest.h>
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ScriptController.h>
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/WebCoreURLResponse.h>
61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <objc/objc-runtime.h>
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <runtime/JSLock.h>
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkusing namespace HTMLNames;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (PluginSecrets)
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setContainingWindow:(NSWindow *)w;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For compatibility only.
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSObject (OldPluginAPI)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSView *)pluginViewWithArguments:(NSDictionary *)arguments;
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSView (OldPluginAPI)
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginInitialize;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginStart;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginStop;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginDestroy;
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isKindOfClass(id, NSString* className);
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void installFlip4MacPlugInWorkaroundIfNecessary();
85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSMutableSet *pluginViews = nil;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebPluginController
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSView *)plugInViewWithArguments:(NSDictionary *)arguments fromPluginPackage:(WebPluginPackage *)pluginPackage
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pluginPackage load];
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Class viewFactory = [pluginPackage viewFactory];
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSView *view = nil;
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([viewFactory respondsToSelector:@selector(plugInViewWithArguments:)]) {
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view = [viewFactory plugInViewWithArguments:arguments];
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else if ([viewFactory respondsToSelector:@selector(pluginViewWithArguments:)]) {
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        view = [viewFactory pluginViewWithArguments:arguments];
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (view == nil) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (pluginViews == nil) {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pluginViews = [[NSMutableSet alloc] init];
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [pluginViews addObject:view];
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return view;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (BOOL)isPlugInView:(NSView *)view
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [pluginViews containsObject:view];
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithDocumentView:(NSView *)view
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super init];
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _documentView = view;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _views = [[NSMutableArray alloc] init];
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _checksInProgress = (NSMutableSet *)CFMakeCollectable(CFSetCreateMutable(NULL, 0, NULL));
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setDataSource:(WebDataSource *)dataSource
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _dataSource = dataSource;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_views release];
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_checksInProgress release];
141967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
142967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [_viewsNotInDocument release];
143967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (void)stopOnePlugin:(NSView *)view
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if ([view respondsToSelector:@selector(webPlugInStop)]) {
150643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [view webPlugInStop];
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if ([view respondsToSelector:@selector(pluginStop)]) {
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [view pluginStop];
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
157643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block- (void)destroyOnePlugin:(NSView *)view
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
160643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if ([view respondsToSelector:@selector(webPlugInDestroy)]) {
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
162643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [view webPlugInDestroy];
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    } else if ([view respondsToSelector:@selector(pluginDestroy)]) {
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
165643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [view pluginDestroy];
166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
167643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)startAllPlugins
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_started)
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_views count] > 0)
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "starting WebKit plugins : %@", [_views description]);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int count = [_views count];
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < count; i++) {
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id aView = [_views objectAtIndex:i];
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([aView respondsToSelector:@selector(webPlugInStart)]) {
1810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [aView webPlugInStart];
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if ([aView respondsToSelector:@selector(pluginStart)]) {
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [aView pluginStart];
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _started = YES;
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)stopAllPlugins
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_started)
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_views count] > 0) {
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "stopping WebKit plugins: %@", [_views description]);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int viewsCount = [_views count];
201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < viewsCount; i++)
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [self stopOnePlugin:[_views objectAtIndex:i]];
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
204967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int viewsNotInDocumentCount = [_viewsNotInDocument count];
206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < viewsNotInDocumentCount; i++)
207967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        [self stopOnePlugin:[_viewsNotInDocument objectAtIndex:i]];
208967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
209967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _started = NO;
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
213967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
214967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)pluginViewCreated:(NSView *)view
215967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
216967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!_viewsNotInDocument)
217967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        _viewsNotInDocument= [[NSMutableArray alloc] init];
218967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (![_viewsNotInDocument containsObject:view])
219967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        [_viewsNotInDocument addObject:view];
220967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
222967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch+ (void)pluginViewHidden:(NSView *)view
223967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
224967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    [pluginViews removeObject:view];
225967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
226967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
227967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addPlugin:(NSView *)view
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_documentView) {
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("can't add a plug-in to a defunct WebPluginController");
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![_views containsObject:view]) {
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_views addObject:view];
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[_documentView _webView] addPluginInstanceView:view];
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
239967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
240967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if ([_viewsNotInDocument containsObject:view])
241967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            [_viewsNotInDocument removeObject:view];
242967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
243967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        BOOL oldDefersCallbacks = [[self webView] defersCallbacks];
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!oldDefersCallbacks)
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            [[self webView] setDefersCallbacks:YES];
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
248dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (isKindOfClass(view, @"WmvPlugin"))
249dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            installFlip4MacPlugInWorkaroundIfNecessary();
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "initializing plug-in %@", view);
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([view respondsToSelector:@selector(webPlugInInitialize)]) {
2530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view webPlugInInitialize];
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if ([view respondsToSelector:@selector(pluginInitialize)]) {
2560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [view pluginInitialize];
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!oldDefersCallbacks)
261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            [[self webView] setDefersCallbacks:NO];
262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (_started) {
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG(Plugins, "starting plug-in %@", view);
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ([view respondsToSelector:@selector(webPlugInStart)]) {
2660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [view webPlugInStart];
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else if ([view respondsToSelector:@selector(pluginStart)]) {
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [view pluginStart];
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if ([view respondsToSelector:@selector(setContainingWindow:)]) {
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                JSC::JSLock::DropAllLocks dropAllLocks(JSC::SilenceAssertionsOnly);
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [view setContainingWindow:[_documentView window]];
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)destroyPlugin:(NSView *)view
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
283967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
284967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if ([_views containsObject:view] || [_viewsNotInDocument containsObject:view]) {
285967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#else
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_views containsObject:view]) {
287967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
288643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (_started)
289643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            [self stopOnePlugin:view];
290643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [self destroyOnePlugin:view];
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(NETSCAPE_PLUGIN_API)
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (Frame* frame = core([self webFrame]))
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame->script()->cleanupScriptObjectsForPlugin(self);
2950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginViews removeObject:view];
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[_documentView _webView] removePluginInstanceView:view];
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_views removeObject:view];
300967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
301967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        [_viewsNotInDocument removeObject:view];
302967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_webPluginContainerCancelCheckIfAllowedToLoadRequest:(id)checkIdentifier
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [checkIdentifier cancel];
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_checksInProgress removeObject:checkIdentifier];
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void cancelOutstandingCheck(const void *item, void *context)
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [(id)item cancel];
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_cancelOutstandingChecks
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_checksInProgress) {
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFSetApplyFunction((CFSetRef)_checksInProgress, cancelOutstandingCheck, NULL);
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_checksInProgress release];
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _checksInProgress = nil;
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)destroyAllPlugins
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self stopAllPlugins];
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([_views count] > 0) {
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG(Plugins, "destroying WebKit plugins: %@", [_views description]);
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _cancelOutstandingChecks];
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
336f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int viewsCount = [_views count];
337f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < viewsCount; i++) {
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id aView = [_views objectAtIndex:i];
339643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        [self destroyOnePlugin:aView];
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(NETSCAPE_PLUGIN_API)
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (Frame* frame = core([self webFrame]))
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frame->script()->cleanupScriptObjectsForPlugin(self);
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginViews removeObject:aView];
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[_documentView _webView] removePluginInstanceView:aView];
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
349967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
350967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
351f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    int viewsNotInDocumentCount = [_viewsNotInDocument count];
352f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    for (int i = 0; i < viewsNotInDocumentCount; i++)
353967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        [self destroyOnePlugin:[_viewsNotInDocument objectAtIndex:i]];
354967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#endif
355967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_views makeObjectsPerformSelector:@selector(removeFromSuperviewWithoutNeedingDisplay)];
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_views release];
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _views = nil;
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _documentView = nil;
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_webPluginContainerCheckIfAllowedToLoadRequest:(NSURLRequest *)request inFrame:(NSString *)target resultObject:(id)obj selector:(SEL)selector
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebPluginContainerCheck *check = [WebPluginContainerCheck checkWithRequest:request target:target resultObject:obj selector:selector controller:self contextInfo:nil];
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_checksInProgress addObject:check];
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [check start];
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return check;
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)webPlugInContainerLoadRequest:(NSURLRequest *)request inFrame:(NSString *)target
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!request) {
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("nil URL passed");
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_documentView) {
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("could not load URL %@ because plug-in has already been destroyed", request);
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebFrame *frame = [_dataSource webFrame];
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frame) {
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LOG_ERROR("could not load URL %@ because plug-in has already been stopped", request);
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!target) {
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        target = @"_top";
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *JSString = [[request URL] _webkit_scriptIfJavaScriptURL];
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (JSString) {
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([frame findFrameNamed:target] != frame) {
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("JavaScript requests can only be made on the frame that contains the plug-in");
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [frame _stringByEvaluatingJavaScriptFromString:JSString];
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else {
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!request) {
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LOG_ERROR("could not load URL %@", [request URL]);
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        core(frame)->loader()->load(request, target, false);
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)webPlugInContainerShowStatus:(NSString *)message
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!message)
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        message = @"";
410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebView *v = [_dataSource _webView];
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[v _UIDelegateForwarder] webView:v setStatusText:message];
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For compatibility only.
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)showStatus:(NSString *)message
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self webPlugInContainerShowStatus:message];
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSColor *)webPlugInContainerSelectionColor
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool primary = true;
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Frame* frame = core([self webFrame]))
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        primary = frame->selection()->isFocusedAndActive();
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return primary ? [NSColor selectedTextBackgroundColor] : [NSColor secondarySelectedControlColor];
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// For compatibility only.
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSColor *)selectionColor
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self webPlugInContainerSelectionColor];
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)webFrame
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [_dataSource webFrame];
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)webView
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self webFrame] webView];
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)URLPolicyCheckReferrer
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURL *responseURL = [[[[self webFrame] _dataSource] response] URL];
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(responseURL);
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [responseURL _web_originalDataAsString];
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginView:(NSView *)pluginView receivedResponse:(NSURLResponse *)response
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([pluginView respondsToSelector:@selector(webPlugInMainResourceDidReceiveResponse:)])
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginView webPlugInMainResourceDidReceiveResponse:response];
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Cancel the load since this plug-in does its own loading.
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // FIXME: See <rdar://problem/4258008> for a problem with this.
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSError *error = [[NSError alloc] _initWithPluginErrorCode:WebKitErrorPlugInWillHandleLoad
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                        contentURL:[response URL]
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                     pluginPageURL:nil
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                                                        pluginName:nil // FIXME: Get this from somewhere
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                          MIMEType:[response MIMEType]];
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [_dataSource _documentLoader]->cancelMainResourceLoad(error);
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [error release];
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginView:(NSView *)pluginView receivedData:(NSData *)data
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([pluginView respondsToSelector:@selector(webPlugInMainResourceDidReceiveData:)])
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginView webPlugInMainResourceDidReceiveData:data];
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginView:(NSView *)pluginView receivedError:(NSError *)error
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([pluginView respondsToSelector:@selector(webPlugInMainResourceDidFailWithError:)])
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginView webPlugInMainResourceDidFailWithError:error];
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)pluginViewFinishedLoading:(NSView *)pluginView
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([pluginView respondsToSelector:@selector(webPlugInMainResourceDidFinishLoading)])
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [pluginView webPlugInMainResourceDidFinishLoading];
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
487563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
488563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic WebCore::HTMLMediaElement* mediaProxyClient(DOMElement* element)
489563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
490563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!element) {
491563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        LOG_ERROR("nil element passed");
492563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return nil;
493563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
494563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Element* node = core(element);
496563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!node || (!node->hasTagName(HTMLNames::videoTag) && !node->hasTagName(HTMLNames::audioTag))) {
497563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        LOG_ERROR("invalid media element passed");
498563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return nil;
499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return static_cast<WebCore::HTMLMediaElement*>(node);
502563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
503563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_webPluginContainerSetMediaPlayerProxy:(WebMediaPlayerProxy *)proxy forElement:(DOMElement *)element
505563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCore::HTMLMediaElement* client = mediaProxyClient(element);
507563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (client)
508563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        client->setMediaPlayerProxy(proxy);
509563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
510563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_webPluginContainerPostMediaPlayerNotification:(int)notification forElement:(DOMElement *)element
512563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
513563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCore::HTMLMediaElement* client = mediaProxyClient(element);
514563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (client)
515563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        client->deliverNotification((MediaPlayerProxyNotificationType)notification);
516563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
517563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#endif
518563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic bool isKindOfClass(id object, NSString *className)
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    Class cls = NSClassFromString(className);
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!cls)
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return false;
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return [object isKindOfClass:cls];
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
531dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
532dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Existing versions of the Flip4Mac WebKit plug-in have an object lifetime bug related to an NSAlert that is
533dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// used to notify the user about updates to the plug-in. This bug can result in Safari crashing if the page
534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// containing the plug-in navigates while the alert is displayed (<rdar://problem/7313430>).
535dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
536dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// The gist of the bug is thus: Flip4Mac sets an instance of the TSUpdateCheck class as the modal delegate of the
537dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// NSAlert instance. This TSUpdateCheck instance itself has a delegate. The delegate is set to the WmvPlugin
538dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// instance which is the NSView subclass that is exposed to WebKit as the plug-in view. Since this relationship
539dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// is that of delegates the TSUpdateCheck does not retain the WmvPlugin. This leads to a bug if the WmvPlugin
540dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// instance is destroyed before the TSUpdateCheck instance as the TSUpdateCheck instance will be left with a
541dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// pointer to a stale object. This will happen if a page containing the Flip4Mac plug-in triggers a navigation
542dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// while the update sheet is visible as the WmvPlugin instance is removed from the view hierarchy and there are
543dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// no other references to keep the object alive.
544dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
545dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// We work around this bug by patching the following two messages:
546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
547dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// 1) -[NSAlert beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:]
548dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// 2) -[TSUpdateCheck alertDidEnd:returnCode:contextInfo:]
549dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
550dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Our override of 1) detects whether it is Flip4Mac's update sheet triggering the alert by checking whether the
551dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// modal delegate is an instance of TSUpdateCheck. If it is, it retains the modal delegate's delegate.
552dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
553dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// Our override of 2) then autoreleases the delegate, balancing the retain we added in 1).
554dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block//
555dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// These two overrides have the effect of ensuring that the WmvPlugin instance will always outlive the TSUpdateCheck
556dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block// instance, preventing the TSUpdateCheck instance from accessing a stale delegate pointer and crashing the application.
557dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
558dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
559dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (*beginSheetModalForWindowIMP)(id, SEL, NSWindow *, id, SEL, void*);
560dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic beginSheetModalForWindowIMP original_NSAlert_beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_;
561dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
562dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocktypedef void (*alertDidEndIMP)(id, SEL, NSAlert *, NSInteger, void*);
563dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic alertDidEndIMP original_TSUpdateCheck_alertDidEnd_returnCode_contextInfo_;
564dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
565dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void WebKit_TSUpdateCheck_alertDidEnd_returnCode_contextInfo_(id object, SEL selector, NSAlert *alert, NSInteger returnCode, void* contextInfo)
566dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
567dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    [[object delegate] autorelease];
568dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
569dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    original_TSUpdateCheck_alertDidEnd_returnCode_contextInfo_(object, selector, alert, returnCode, contextInfo);
570dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
571dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
572dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void WebKit_NSAlert_beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_(id object, SEL selector, NSWindow *window, id modalDelegate, SEL didEndSelector, void* contextInfo)
573dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
574dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (isKindOfClass(modalDelegate, @"TSUpdateCheck"))
575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [[modalDelegate delegate] retain];
576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
577dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    original_NSAlert_beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_(object, selector, window, modalDelegate, didEndSelector, contextInfo);
578dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
579dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
580dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockstatic void installFlip4MacPlugInWorkaroundIfNecessary()
581dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
582dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    static bool hasInstalledFlip4MacPlugInWorkaround;
583dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!hasInstalledFlip4MacPlugInWorkaround) {
584dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Class TSUpdateCheck = objc_lookUpClass("TSUpdateCheck");
585dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!TSUpdateCheck)
586dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
588dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        Method methodToPatch = class_getInstanceMethod(TSUpdateCheck, @selector(alertDidEnd:returnCode:contextInfo:));
589dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!methodToPatch)
590dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return;
591dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        IMP originalMethod = method_setImplementation(methodToPatch, reinterpret_cast<IMP>(WebKit_TSUpdateCheck_alertDidEnd_returnCode_contextInfo_));
593dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        original_TSUpdateCheck_alertDidEnd_returnCode_contextInfo_ = reinterpret_cast<alertDidEndIMP>(originalMethod);
594dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
595dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        methodToPatch = class_getInstanceMethod(objc_getRequiredClass("NSAlert"), @selector(beginSheetModalForWindow:modalDelegate:didEndSelector:contextInfo:));
596dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        originalMethod = method_setImplementation(methodToPatch, reinterpret_cast<IMP>(WebKit_NSAlert_beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_));
597dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        original_NSAlert_beginSheetModalForWindow_modalDelegate_didEndSelector_contextInfo_ = reinterpret_cast<beginSheetModalForWindowIMP>(originalMethod);
598dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
599dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        hasInstalledFlip4MacPlugInWorkaround = true;
600dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
601dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
602