15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/* 25ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Copyright (C) 2008 Apple Inc. All Rights Reserved. 35ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 45ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * Redistribution and use in source and binary forms, with or without 55ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * modification, are permitted provided that the following conditions 65ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * are met: 75ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 1. Redistributions of source code must retain the above copyright 85ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * notice, this list of conditions and the following disclaimer. 95ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 2. Redistributions in binary form must reproduce the above copyright 105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * notice, this list of conditions and the following disclaimer in the 115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * documentation and/or other materials provided with the distribution. 125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * 135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark */ 25e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block 26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API) 275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebHostedNetscapePluginView.h" 295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "HostedNetscapePluginStream.h" 315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginInstanceProxy.h" 325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostManager.h" 335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostProxy.h" 34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "WebTextInputWindowController.h" 350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "WebFrameInternal.h" 365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebView.h" 375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebViewInternal.h" 385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebUIDelegate.h" 395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <CoreFoundation/CoreFoundation.h> 4153733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#import <WebCore/BridgeJSC.h> 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/Frame.h> 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/FrameLoaderTypes.h> 446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#import <WebCore/FrameView.h> 45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebCore/HTMLPlugInElement.h> 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/RenderEmbeddedObject.h> 475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/WebCoreObjCExtras.h> 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/runtime_root.h> 495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <runtime/InitializeThreading.h> 505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <wtf/Assertions.h> 5121939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h> 525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing namespace WebCore; 545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace WebKit; 555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkextern "C" { 575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "WebKitPluginClientServer.h" 585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "WebKitPluginHost.h" 595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark@implementation WebHostedNetscapePluginView 625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark+ (void)initialize 645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark JSC::initializeThreading(); 6621939df44de1705786c545cd1bf519d47250322dBen Murdoch WTF::initializeMainThreadToProcessMainThread(); 675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#ifndef BUILDING_ON_TIGER 685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark WebCoreObjCFinalizeOnMainThread(self); 695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#endif 705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark WKSendUserChangeNotifications(); 715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (id)initWithFrame:(NSRect)frame 745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark pluginPackage:(WebNetscapePluginPackage *)pluginPackage 755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark URL:(NSURL *)URL 765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark baseURL:(NSURL *)baseURL 775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark MIMEType:(NSString *)MIME 785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark attributeKeys:(NSArray *)keys 795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark attributeValues:(NSArray *)values 805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark loadManually:(BOOL)loadManually 81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark element:(PassRefPtr<WebCore::HTMLPlugInElement>)element 825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark self = [super initWithFrame:frame pluginPackage:pluginPackage URL:URL baseURL:baseURL MIMEType:MIME attributeKeys:keys attributeValues:values loadManually:loadManually element:element]; 845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!self) 855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return nil; 865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return self; 885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)handleMouseMoved:(NSEvent *)event 915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseMoved); 945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)setAttributeKeys:(NSArray *)keys andValues:(NSArray *)values 975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 98cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!_attributeKeys); 99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT(!_attributeValues); 1005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _attributeKeys.adoptNS([keys copy]); 1025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _attributeValues.adoptNS([values copy]); 1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (BOOL)createPlugin 1065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ASSERT(!_proxy); 1085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark NSString *userAgent = [[self webView] userAgentForURL:_baseURL.get()]; 110d0825bca7fe65beaee391d30da42e937db621564Steve Block BOOL accleratedCompositingEnabled = false; 111d0825bca7fe65beaee391d30da42e937db621564Steve Block#if USE(ACCELERATED_COMPOSITING) 112d0825bca7fe65beaee391d30da42e937db621564Steve Block accleratedCompositingEnabled = [[[self webView] preferences] acceleratedCompositingEnabled]; 113d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 114d0825bca7fe65beaee391d30da42e937db621564Steve Block 11506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen _proxy = NetscapePluginHostManager::shared().instantiatePlugin([_pluginPackage.get() path], [_pluginPackage.get() pluginHostArchitecture], [_pluginPackage.get() bundleIdentifier], self, _MIMEType.get(), _attributeKeys.get(), _attributeValues.get(), userAgent, _sourceURL.get(), 116d0825bca7fe65beaee391d30da42e937db621564Steve Block _mode == NP_FULL, _isPrivateBrowsingEnabled, accleratedCompositingEnabled); 1175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!_proxy) 1185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return NO; 1195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (_proxy->rendererType() == UseSoftwareRenderer) 1215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _softwareRenderer = WKSoftwareCARendererCreate(_proxy->renderContextID()); 1225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark else { 1235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _pluginLayer = WKMakeRenderLayer(_proxy->renderContextID()); 124d0825bca7fe65beaee391d30da42e937db621564Steve Block 1256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (accleratedCompositingEnabled && _proxy->rendererType() == UseAcceleratedCompositing) { 126e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // FIXME: This code can be shared between WebHostedNetscapePluginView and WebNetscapePluginView. 127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#ifndef BUILDING_ON_LEOPARD 128e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // Since this layer isn't going to be inserted into a view, we need to create another layer and flip its geometry 129e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // in order to get the coordinate system right. 130e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block RetainPtr<CALayer> realPluginLayer(AdoptNS, _pluginLayer.releaseRef()); 131e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 132e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block _pluginLayer.adoptNS([[CALayer alloc] init]); 133e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block _pluginLayer.get().bounds = realPluginLayer.get().bounds; 134e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block _pluginLayer.get().geometryFlipped = YES; 135e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 136e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block realPluginLayer.get().autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; 137e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block [_pluginLayer.get() addSublayer:realPluginLayer.get()]; 138e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#endif 139e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // Eagerly enter compositing mode, since we know we'll need it. This avoids firing setNeedsStyleRecalc() 1416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen // for iframes that contain composited plugins at bad times. https://bugs.webkit.org/show_bug.cgi?id=39033 1426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen core([self webFrame])->view()->enterCompositingMode(); 143d0825bca7fe65beaee391d30da42e937db621564Steve Block [self element]->setNeedsStyleRecalc(SyntheticStyleChange); 1446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } else 145d0825bca7fe65beaee391d30da42e937db621564Steve Block self.wantsLayer = YES; 1465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 1475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // Update the window frame. 1495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->windowFrameChanged([[self window] frame]); 1505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return YES; 1525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 154d0825bca7fe65beaee391d30da42e937db621564Steve Block// FIXME: This method is an ideal candidate to move up to the base class 155d0825bca7fe65beaee391d30da42e937db621564Steve Block- (CALayer *)pluginLayer 156d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 157d0825bca7fe65beaee391d30da42e937db621564Steve Block return _pluginLayer.get(); 158d0825bca7fe65beaee391d30da42e937db621564Steve Block} 159d0825bca7fe65beaee391d30da42e937db621564Steve Block 1605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)setLayer:(CALayer *)newLayer 1615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // FIXME: This should use the same implementation as WebNetscapePluginView (and move to the base class). 1635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [super setLayer:newLayer]; 1645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_pluginLayer) 1665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [newLayer addSublayer:_pluginLayer.get()]; 1675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block- (void)privateBrowsingModeDidChange 170cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{ 171cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (_proxy) 172cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block _proxy->privateBrowsingModeDidChange(_isPrivateBrowsingEnabled); 173cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block} 174cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)loadStream 1765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 1785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)updateAndSetWindow 1805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 1815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!_proxy) 1825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return; 1835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 184e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // The base coordinates of a window and it's contentView happen to be the equal at a userSpaceScaleFactor 185e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // of 1. For non-1.0 scale factors this assumption is false. 186e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block NSView *windowContentView = [[self window] contentView]; 187e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block NSRect boundsInWindow = [self convertRect:[self bounds] toView:windowContentView]; 188e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1898a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block NSRect visibleRectInWindow; 1908a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1918a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // Core Animation plug-ins need to be updated (with a 0,0,0,0 clipRect) when 1928a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // moved to a background tab. We don't do this for Core Graphics plug-ins as 1938a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // older versions of Flash have historical WebKit-specific code that isn't 1948a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block // compatible with this behavior. 1958a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block BOOL shouldClipOutPlugin = _pluginLayer && [self shouldClipOutPlugin]; 1968a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (!shouldClipOutPlugin) 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch visibleRectInWindow = [self actualVisibleRectInWindow]; 1988a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block else 1998a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block visibleRectInWindow = NSZeroRect; 2005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // Flip Y to convert NSWindow coordinates to top-left-based window coordinates. 2025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark float borderViewHeight = [[self currentWindow] frame].size.height; 2035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark boundsInWindow.origin.y = borderViewHeight - NSMaxY(boundsInWindow); 2048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 2058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block if (!shouldClipOutPlugin) 2068a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block visibleRectInWindow.origin.y = borderViewHeight - NSMaxY(visibleRectInWindow); 2075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _previousSize = boundsInWindow.size; 2090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _proxy->resize(boundsInWindow, visibleRectInWindow); 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CGRect bounds = NSRectToCGRect([self bounds]); 21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CGRect frame = NSRectToCGRect([self frame]); 21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We're not scaled, or in a subframe 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch CATransform3D scaleTransform = CATransform3DIdentity; 21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (CGSizeEqualToSize(bounds.size, frame.size)) { 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We're in a subframe. Backing store is boundsInWindow.size. 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (boundsInWindow.size.width && boundsInWindow.size.height) 22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scaleTransform = CATransform3DMakeScale(frame.size.width / boundsInWindow.size.width, frame.size.height / boundsInWindow.size.height, 1); 22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } else { 22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // We're in the main frame with scaling. Need to mimic the frame/bounds scaling on Widgets. 22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (frame.size.width && frame.size.height) 22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch scaleTransform = CATransform3DMakeScale(bounds.size.width / frame.size.width, bounds.size.height / frame.size.height, 1); 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch _pluginLayer.get().sublayerTransform = scaleTransform; 2285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)windowFocusChanged:(BOOL)hasFocus 2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) 2335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->windowFocusChanged(hasFocus); 2345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (BOOL)shouldStop 2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!_proxy) 239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return YES; 240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return _proxy->shouldStop(); 2425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)destroyPlugin 2455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) { 2475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_softwareRenderer) { 2485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark WKSoftwareCARendererDestroy(_softwareRenderer); 2495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _softwareRenderer = 0; 2505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->destroy(); 2535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy = 0; 2545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _pluginLayer = 0; 2575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)startTimers 2605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) 2625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->startTimers(_isCompletelyObscured); 2635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)stopTimers 2665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) 2685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->stopTimers(); 2695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)focusChanged 2725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) 2745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->focusChanged(_hasFocus); 2755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)windowFrameDidChange:(NSNotification *)notification 2785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy && [self window]) 2805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->windowFrameChanged([[self window] frame]); 2815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 2825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)addWindowObservers 2845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 2855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [super addWindowObservers]; 2865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ASSERT([self window]); 2885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 289563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NSWindow *window = [self window]; 2905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 2925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [notificationCenter addObserver:self selector:@selector(windowFrameDidChange:) 293563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark name:NSWindowDidMoveNotification object:window]; 2945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [notificationCenter addObserver:self selector:@selector(windowFrameDidChange:) 295563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark name:NSWindowDidResizeNotification object:window]; 296563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 297563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (_proxy) 298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _proxy->windowFrameChanged([window frame]); 299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark [self updateAndSetWindow]; 3005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)removeWindowObservers 3035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [super removeWindowObservers]; 3055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 3075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [notificationCenter removeObserver:self name:NSWindowDidMoveNotification object:nil]; 3085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark [notificationCenter removeObserver:self name:NSWindowDidResizeNotification object:nil]; 3095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)mouseDown:(NSEvent *)event 3125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseDown); 3155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)mouseUp:(NSEvent *)event 3185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseUp); 3215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)mouseDragged:(NSEvent *)event 3245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseDragged); 3275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 329692e5dbf12901edacf14812a6fae25462920af42Steve Block- (void)handleMouseEntered:(NSEvent *)event 3305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Set cursor to arrow. Plugins often handle cursor internally, but those that don't will just get this default one. 332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [[NSCursor arrowCursor] set]; 333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 3345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseEntered); 3365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 338692e5dbf12901edacf14812a6fae25462920af42Steve Block- (void)handleMouseExited:(NSEvent *)event 3395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->mouseEvent(self, event, NPCocoaEventMouseExited); 342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Set cursor back to arrow cursor. Because NSCursor doesn't know about changes that the plugin made, we could get confused about what we think the 344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // current cursor is otherwise. Therefore we have no choice but to unconditionally reset the cursor when the mouse exits the plugin. 345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // FIXME: This should be job of plugin host, see <rdar://problem/7654434>. 346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [[NSCursor arrowCursor] set]; 3475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)scrollWheel:(NSEvent *)event 3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool processedEvent = false; 3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (_isStarted && _proxy) 3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch processedEvent = _proxy->wheelEvent(self, event); 3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!processedEvent) 3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [super scrollWheel:event]; 3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 360563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSTextInputContext *)inputContext 361563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return [[WebTextInputWindowController sharedTextInputWindowController] inputContext]; 363563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 364563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)keyDown:(NSEvent *)event 3665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 367563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (!_isStarted || !_proxy) 368563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 369563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 370563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark NSString *string = nil; 371563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if ([[WebTextInputWindowController sharedTextInputWindowController] interpretKeyEvent:event string:&string]) { 372563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (string) 373563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _proxy->insertText(string); 374563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 375563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 376563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 377563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _proxy->keyEvent(self, event, NPCocoaEventKeyDown); 3785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)keyUp:(NSEvent *)event 3815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 3825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_isStarted && _proxy) 3835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy->keyEvent(self, event, NPCocoaEventKeyUp); 3845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 3855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)flagsChanged:(NSEvent *)event 3870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 3880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (_isStarted && _proxy) 3890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->flagsChanged(event); 3900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 3910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)sendModifierEventWithKeyCode:(int)keyCode character:(char)character 3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (_isStarted && _proxy) 3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->syntheticKeyDownWithCommandModifier(keyCode, character); 3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)pluginHostDied 3995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 40028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (_element->renderer() && _element->renderer()->isEmbeddedObject()) { 40128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // FIXME: The renderer could also be a RenderApplet, we should handle that. 40228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu RenderEmbeddedObject* renderer = toRenderEmbeddedObject(_element->renderer()); 403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block renderer->setShowsCrashedPluginIndicator(); 40428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 4055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _pluginLayer = nil; 4075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark _proxy = 0; 4085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // No need for us to be layer backed anymore 4105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark self.wantsLayer = NO; 4115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [self invalidatePluginContentRect:[self bounds]]; 4135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block- (void)visibleRectDidChange 416dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 417dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block [super visibleRectDidChange]; 418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WKSyncSurfaceToView(self); 419dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 4205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (void)drawRect:(NSRect)rect 4225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 423f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (_cachedSnapshot) { 424f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch NSRect sourceRect = { NSZeroPoint, [_cachedSnapshot.get() size] }; 425f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch [_cachedSnapshot.get() drawInRect:[self bounds] fromRect:sourceRect operation:NSCompositeSourceOver fraction:1]; 426f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 427f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } 428f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 4295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (_proxy) { 430563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (_softwareRenderer) { 431231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if ([NSGraphicsContext currentContextDrawingToScreen]) { 432563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark WKSoftwareCARendererRender(_softwareRenderer, (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort], NSRectToCGRect(rect)); 433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block _proxy->didDraw(); 434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } else 435563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark _proxy->print(reinterpret_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]), [self bounds].size.width, [self bounds].size.height); 436f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch } else if (_snapshotting && [self supportsSnapshotting]) { 437dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block _proxy->snapshot(reinterpret_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]), [self bounds].size.width, [self bounds].size.height); 438563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 439dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return; 4415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 4425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark- (PassRefPtr<JSC::Bindings::Instance>)createPluginBindingsInstance:(PassRefPtr<JSC::Bindings::RootObject>)rootObject 4455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{ 4465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark if (!_proxy) 4475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return 0; 4485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark return _proxy->createBindingsInstance(rootObject); 4505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 4515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)pluginView:(NSView *)pluginView receivedResponse:(NSURLResponse *)response 4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(_loadManually); 4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(!_proxy->manualStream()); 4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->setManualStream(HostedNetscapePluginStream::create(_proxy.get(), core([self webFrame])->loader())); 4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->manualStream()->startStreamWithResponse(response); 4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)pluginView:(NSView *)pluginView receivedData:(NSData *)data 4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(_loadManually); 4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 4680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (HostedNetscapePluginStream* manualStream = _proxy->manualStream()) 4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch manualStream->didReceiveData(0, static_cast<const char*>([data bytes]), [data length]); 4720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)pluginView:(NSView *)pluginView receivedError:(NSError *)error 4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(_loadManually); 4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (HostedNetscapePluginStream* manualStream = _proxy->manualStream()) 4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch manualStream->didFail(0, error); 4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)pluginViewFinishedLoading:(NSView *)pluginView 4850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT(_loadManually); 4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (HostedNetscapePluginStream* manualStream = _proxy->manualStream()) 4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch manualStream->didFinishLoading(0); 4920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 4930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_webPluginContainerCancelCheckIfAllowedToLoadRequest:(id)webPluginContainerCheck 4950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 4960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT([webPluginContainerCheck isKindOfClass:[WebPluginContainerCheck class]]); 4970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch id contextInfo = [webPluginContainerCheck contextInfo]; 499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block ASSERT([contextInfo isKindOfClass:[NSNumber class]]); 5000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 5020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 5030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t checkID = [(NSNumber *)contextInfo unsignedIntValue]; 5050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->cancelCheckIfAllowedToLoadURL(checkID); 5060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 5070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_containerCheckResult:(PolicyAction)policy contextInfo:(id)contextInfo 5090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 5100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ASSERT([contextInfo isKindOfClass:[NSNumber class]]); 5110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!_proxy) 5120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 5130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t checkID = [(NSNumber *)contextInfo unsignedIntValue]; 5150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch _proxy->checkIfAllowedToLoadURLResult(checkID, (policy == PolicyUse)); 5160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 5170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 518d0825bca7fe65beaee391d30da42e937db621564Steve Block- (void)webFrame:(WebFrame *)webFrame didFinishLoadWithReason:(NPReason)reason 519d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 520d0825bca7fe65beaee391d30da42e937db621564Steve Block if (_isStarted && _proxy) 521d0825bca7fe65beaee391d30da42e937db621564Steve Block _proxy->webFrameDidFinishLoadWithReason(webFrame, reason); 522d0825bca7fe65beaee391d30da42e937db621564Steve Block} 523d0825bca7fe65beaee391d30da42e937db621564Steve Block 524d0825bca7fe65beaee391d30da42e937db621564Steve Block- (void)webFrame:(WebFrame *)webFrame didFinishLoadWithError:(NSError *)error 525d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 526d0825bca7fe65beaee391d30da42e937db621564Steve Block NPReason reason = NPRES_DONE; 527d0825bca7fe65beaee391d30da42e937db621564Steve Block if (error) 528d0825bca7fe65beaee391d30da42e937db621564Steve Block reason = HostedNetscapePluginStream::reasonForError(error); 529d0825bca7fe65beaee391d30da42e937db621564Steve Block [self webFrame:webFrame didFinishLoadWithReason:reason]; 530d0825bca7fe65beaee391d30da42e937db621564Steve Block} 531d0825bca7fe65beaee391d30da42e937db621564Steve Block 5325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark@end 5335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 534e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API) 535