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