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