15ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark/* 2d0825bca7fe65beaee391d30da42e937db621564Steve Block * Copyright (C) 2008, 2009, 2010 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 */ 255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#if USE(PLUGIN_HOST_PROCESS) 275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#ifndef NetscapePluginInstanceProxy_h 295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#define NetscapePluginInstanceProxy_h 305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <JavaScriptCore/JSGlobalData.h> 322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <JavaScriptCore/Strong.h> 335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <WebCore/Timer.h> 345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <WebKit/npapi.h> 355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <wtf/Deque.h> 36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h> 375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <wtf/HashMap.h> 385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <wtf/PassRefPtr.h> 395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <wtf/RefCounted.h> 405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include <wtf/RetainPtr.h> 415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#include "WebKitPluginHostTypes.h" 425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace JSC { 445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark namespace Bindings { 455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark class Instance; 465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark class RootObject; 475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 48545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch class ArgList; 495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} 505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark@class WebHostedNetscapePluginView; 51d0825bca7fe65beaee391d30da42e937db621564Steve Block@class WebFrame; 525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace WebKit { 545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass HostedNetscapePluginStream; 565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass NetscapePluginHostProxy; 57d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass PluginRequest; 58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkclass ProxyInstance; 595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkclass NetscapePluginInstanceProxy : public RefCounted<NetscapePluginInstanceProxy> { 615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkpublic: 6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen static PassRefPtr<NetscapePluginInstanceProxy> create(NetscapePluginHostProxy*, WebHostedNetscapePluginView *, bool fullFramePlugin); 635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark ~NetscapePluginInstanceProxy(); 645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t pluginID() const 66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(m_pluginID); 68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return m_pluginID; 70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block uint32_t renderContextID() const { ASSERT(fastMallocSize(this)); return m_renderContextID; } 725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void setRenderContextID(uint32_t renderContextID) { m_renderContextID = renderContextID; } 735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RendererType rendererType() const { return m_rendererType; } 756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen void setRendererType(RendererType rendererType) { m_rendererType = rendererType; } 765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block WebHostedNetscapePluginView *pluginView() const { ASSERT(fastMallocSize(this)); return m_pluginView; } 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block NetscapePluginHostProxy* hostProxy() const { ASSERT(fastMallocSize(this)); return m_pluginHostProxy; } 795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool cancelStreamLoad(uint32_t streamID, NPReason); 815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void disconnectStream(HostedNetscapePluginStream*); 825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void setManualStream(PassRefPtr<HostedNetscapePluginStream>); 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch HostedNetscapePluginStream* manualStream() const { return m_manualStream.get(); } 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void pluginHostDied(); 875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void resize(NSRect size, NSRect clipRect); 895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void destroy(); 905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void focusChanged(bool hasFocus); 915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void windowFocusChanged(bool hasFocus); 925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void windowFrameChanged(NSRect frame); 935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void mouseEvent(NSView *pluginView, NSEvent *, NPCocoaEventType); 955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void keyEvent(NSView *pluginView, NSEvent *, NPCocoaEventType); 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void insertText(NSString *); 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool wheelEvent(NSView *pluginView, NSEvent *); 980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void syntheticKeyDownWithCommandModifier(int keyCode, char character); 990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void flagsChanged(NSEvent *); 100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void print(CGContextRef, unsigned width, unsigned height); 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block void snapshot(CGContextRef, unsigned width, unsigned height); 102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void startTimers(bool throttleTimers); 1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void stopTimers(); 1055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void invalidateRect(double x, double y, double width, double height); 107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // NPRuntime 1095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool getWindowNPObject(uint32_t& objectID); 110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark bool getPluginElementNPObject(uint32_t& objectID); 111692e5dbf12901edacf14812a6fae25462920af42Steve Block bool forgetBrowserObjectID(uint32_t objectID); // Will fail if the ID is being sent to plug-in right now (i.e., retain/release calls aren't balanced). 112692e5dbf12901edacf14812a6fae25462920af42Steve Block 113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch bool evaluate(uint32_t objectID, const WTF::String& script, data_t& resultData, mach_msg_type_number_t& resultLength, bool allowPopups); 1145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool invoke(uint32_t objectID, const JSC::Identifier& methodName, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 1155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool invokeDefault(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 1165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool construct(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength); 117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark bool enumerate(uint32_t objectID, data_t& resultData, mach_msg_type_number_t& resultLength); 1185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool getProperty(uint32_t objectID, const JSC::Identifier& propertyName, data_t &resultData, mach_msg_type_number_t& resultLength); 1205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool getProperty(uint32_t objectID, unsigned propertyName, data_t &resultData, mach_msg_type_number_t& resultLength); 1215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool setProperty(uint32_t objectID, const JSC::Identifier& propertyName, data_t valueData, mach_msg_type_number_t valueLength); 1225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool setProperty(uint32_t objectID, unsigned propertyName, data_t valueData, mach_msg_type_number_t valueLength); 1235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool removeProperty(uint32_t objectID, const JSC::Identifier& propertyName); 1245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool removeProperty(uint32_t objectID, unsigned propertyName); 1255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool hasProperty(uint32_t objectID, const JSC::Identifier& propertyName); 1265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool hasProperty(uint32_t objectID, unsigned propertyName); 1275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool hasMethod(uint32_t objectID, const JSC::Identifier& methodName); 1285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void status(const char* message); 1305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark NPError loadURL(const char* url, const char* target, const char* postData, uint32_t postDataLength, LoadURLFlags, uint32_t& requestID); 1315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t& cookiesData, mach_msg_type_number_t& cookiesLength); 1330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool setCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t cookiesData, mach_msg_type_number_t cookiesLength); 1340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getProxy(data_t urlData, mach_msg_type_number_t urlLength, data_t& proxyData, mach_msg_type_number_t& proxyLength); 1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getAuthenticationInfo(data_t protocolData, data_t hostData, uint32_t port, data_t schemeData, data_t realmData, 1370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch data_t& usernameData, mach_msg_type_number_t& usernameLength, data_t& passwordData, mach_msg_type_number_t& passwordLength); 1380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool convertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, 1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch double& destX, double& destY, NPCoordinateSpace destSpace); 1408a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark PassRefPtr<JSC::Bindings::Instance> createBindingsInstance(PassRefPtr<JSC::Bindings::RootObject>); 1425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark RetainPtr<NSData *> marshalValues(JSC::ExecState*, const JSC::ArgList& args); 143692e5dbf12901edacf14812a6fae25462920af42Steve Block void marshalValue(JSC::ExecState*, JSC::JSValue, data_t& resultData, mach_msg_type_number_t& resultLength); 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JSC::JSValue demarshalValue(JSC::ExecState*, const char* valueData, mach_msg_type_number_t valueLength); 1455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 146692e5dbf12901edacf14812a6fae25462920af42Steve Block // No-op if the value does not contain a local object. 147692e5dbf12901edacf14812a6fae25462920af42Steve Block void retainLocalObject(JSC::JSValue); 148692e5dbf12901edacf14812a6fae25462920af42Steve Block void releaseLocalObject(JSC::JSValue); 149692e5dbf12901edacf14812a6fae25462920af42Steve Block 150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void addInstance(ProxyInstance*); 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void removeInstance(ProxyInstance*); 152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void cleanup(); 154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void invalidate(); 155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void willCallPluginFunction(); 15728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu void didCallPluginFunction(bool& stopped); 158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark bool shouldStop(); 159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t nextRequestID(); 161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t checkIfAllowedToLoadURL(const char* url, const char* target); 1630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void cancelCheckIfAllowedToLoadURL(uint32_t checkID); 1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void checkIfAllowedToLoadURLResult(uint32_t checkID, bool allowed); 1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void resolveURL(const char* url, const char* target, data_t& resolvedURLData, mach_msg_type_number_t& resolvedURLLength); 1670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void didDraw(); 169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void privateBrowsingModeDidChange(bool isPrivateBrowsingEnabled); 170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 171dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch static void setGlobalException(const WTF::String&); 1728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static void moveGlobalExceptionToExecState(JSC::ExecState*); 1738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block 1745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // Reply structs 1755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark struct Reply { 1765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark enum Type { 1775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark InstantiatePlugin, 1785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark GetScriptableNPObject, 1795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark BooleanAndData, 1805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark Boolean 1815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 1825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark Reply(Type type) 184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark : m_type(type) 185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark { 186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 1885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark virtual ~Reply() { } 1895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark Type m_type; 1915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 1925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark struct InstantiatePluginReply : public Reply { 1945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark static const int ReplyType = InstantiatePlugin; 1955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 1966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen InstantiatePluginReply(kern_return_t resultCode, uint32_t renderContextID, RendererType rendererType) 1975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : Reply(InstantiatePlugin) 1985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_resultCode(resultCode) 1995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_renderContextID(renderContextID) 2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_rendererType(rendererType) 2015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 2025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark kern_return_t m_resultCode; 2055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint32_t m_renderContextID; 2066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RendererType m_rendererType; 2075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 2085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark struct GetScriptableNPObjectReply : public Reply { 2105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark static const Reply::Type ReplyType = GetScriptableNPObject; 2115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark GetScriptableNPObjectReply(uint32_t objectID) 2135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : Reply(ReplyType) 2145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_objectID(objectID) 2155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 2165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint32_t m_objectID; 2195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 2205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark struct BooleanReply : public Reply { 2225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark static const Reply::Type ReplyType = Boolean; 2235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark BooleanReply(boolean_t result) 2255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : Reply(ReplyType) 2265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_result(result) 2275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 2285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark boolean_t m_result; 2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 2325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark struct BooleanAndDataReply : public Reply { 2345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark static const Reply::Type ReplyType = BooleanAndData; 2355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark BooleanAndDataReply(boolean_t returnValue, RetainPtr<CFDataRef> result) 2375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark : Reply(ReplyType) 2385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_returnValue(returnValue) 2395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark , m_result(result) 2405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 2415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark boolean_t m_returnValue; 2445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark RetainPtr<CFDataRef> m_result; 2455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark }; 2465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark void setCurrentReply(uint32_t requestID, Reply* reply) 2485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(!m_replies.contains(requestID)); 250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark m_replies.set(requestID, reply); 2515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark template <typename T> 254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark std::auto_ptr<T> waitForReply(uint32_t requestID) 2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark { 256dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RefPtr<NetscapePluginInstanceProxy> protect(this); // Plug-in host may crash while we are waiting for reply, releasing all instances to the instance proxy. 257dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 258d0825bca7fe65beaee391d30da42e937db621564Steve Block willCallPluginFunction(); 2595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_waitingForReply = true; 260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 261563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark Reply* reply = processRequestsAndWaitForReply(requestID); 262563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (reply) 263563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(reply->m_type == T::ReplyType); 2645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark m_waitingForReply = false; 26628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 26728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu bool stopped = false; 26828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu didCallPluginFunction(stopped); 26928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (stopped) { 27028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // The instance proxy may have been deleted from didCallPluginFunction(), so a null reply needs to be returned. 27128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu delete static_cast<T*>(reply); 27228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return std::auto_ptr<T>(); 27328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 274d0825bca7fe65beaee391d30da42e937db621564Steve Block 275563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return std::auto_ptr<T>(static_cast<T*>(reply)); 2765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark } 2775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 278d0825bca7fe65beaee391d30da42e937db621564Steve Block void webFrameDidFinishLoadWithReason(WebFrame*, NPReason); 279d0825bca7fe65beaee391d30da42e937db621564Steve Block 2805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkprivate: 281d0825bca7fe65beaee391d30da42e937db621564Steve Block NetscapePluginInstanceProxy(NetscapePluginHostProxy*, WebHostedNetscapePluginView*, bool fullFramePlugin); 2825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 283d0825bca7fe65beaee391d30da42e937db621564Steve Block NPError loadRequest(NSURLRequest*, const char* cTarget, bool currentEventIsUserGesture, uint32_t& streamID); 2845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark class PluginRequest; 2865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void performRequest(PluginRequest*); 2875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void evaluateJavaScript(PluginRequest*); 2885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void stopAllStreams(); 290563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark Reply* processRequestsAndWaitForReply(uint32_t requestID); 291563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 2925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark NetscapePluginHostProxy* m_pluginHostProxy; 2935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark WebHostedNetscapePluginView *m_pluginView; 2945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark void requestTimerFired(WebCore::Timer<NetscapePluginInstanceProxy>*); 2965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark WebCore::Timer<NetscapePluginInstanceProxy> m_requestTimer; 297d0825bca7fe65beaee391d30da42e937db621564Steve Block Deque<RefPtr<PluginRequest> > m_pluginRequests; 2985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 2995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark HashMap<uint32_t, RefPtr<HostedNetscapePluginStream> > m_streams; 3005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t m_currentURLRequestID; 3025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint32_t m_pluginID; 3045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark uint32_t m_renderContextID; 3056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen RendererType m_rendererType; 3065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark bool m_waitingForReply; 308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark HashMap<uint32_t, Reply*> m_replies; 3095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark // NPRuntime 311692e5dbf12901edacf14812a6fae25462920af42Steve Block 3120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void addValueToArray(NSMutableArray *, JSC::ExecState* exec, JSC::JSValue value); 3135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool demarshalValueFromArray(JSC::ExecState*, NSArray *array, NSUInteger& index, JSC::JSValue& result); 3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void demarshalValues(JSC::ExecState*, data_t valuesData, mach_msg_type_number_t valuesLength, JSC::MarkedArgumentBuffer& result); 3165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 317ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch class LocalObjectMap { 318ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(LocalObjectMap); 319692e5dbf12901edacf14812a6fae25462920af42Steve Block public: 320692e5dbf12901edacf14812a6fae25462920af42Steve Block LocalObjectMap(); 321692e5dbf12901edacf14812a6fae25462920af42Steve Block ~LocalObjectMap(); 32281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch uint32_t idForObject(JSC::JSGlobalData&, JSC::JSObject*); 323692e5dbf12901edacf14812a6fae25462920af42Steve Block void retain(JSC::JSObject*); 324692e5dbf12901edacf14812a6fae25462920af42Steve Block void release(JSC::JSObject*); 325692e5dbf12901edacf14812a6fae25462920af42Steve Block void clear(); 326692e5dbf12901edacf14812a6fae25462920af42Steve Block bool forget(uint32_t); 327692e5dbf12901edacf14812a6fae25462920af42Steve Block bool contains(uint32_t) const; 328692e5dbf12901edacf14812a6fae25462920af42Steve Block JSC::JSObject* get(uint32_t) const; 329692e5dbf12901edacf14812a6fae25462920af42Steve Block 330692e5dbf12901edacf14812a6fae25462920af42Steve Block private: 3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch HashMap<uint32_t, JSC::Strong<JSC::JSObject> > m_idToJSObjectMap; 332692e5dbf12901edacf14812a6fae25462920af42Steve Block // The pair consists of object ID and a reference count. One reference belongs to remote plug-in, 333692e5dbf12901edacf14812a6fae25462920af42Steve Block // and the proxy will add transient references for arguments that are being sent out. 334692e5dbf12901edacf14812a6fae25462920af42Steve Block HashMap<JSC::JSObject*, pair<uint32_t, uint32_t> > m_jsObjectToIDMap; 335692e5dbf12901edacf14812a6fae25462920af42Steve Block uint32_t m_objectIDCounter; 336692e5dbf12901edacf14812a6fae25462920af42Steve Block }; 337692e5dbf12901edacf14812a6fae25462920af42Steve Block 338692e5dbf12901edacf14812a6fae25462920af42Steve Block LocalObjectMap m_localObjects; 339692e5dbf12901edacf14812a6fae25462920af42Steve Block 340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark typedef HashSet<ProxyInstance*> ProxyInstanceSet; 341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ProxyInstanceSet m_instances; 3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch uint32_t m_urlCheckCounter; 3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch typedef HashMap<uint32_t, RetainPtr<id> > URLCheckMap; 3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch URLCheckMap m_urlChecks; 346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark unsigned m_pluginFunctionCallDepth; 348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark bool m_shouldStopSoon; 349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark uint32_t m_currentRequestID; 350ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 351ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // All NPRuntime functions will return false when destroying a plug-in. This is necessary because there may be unhandled messages waiting, 352ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // and spinning in processRequests() will unexpectedly execute them from inside destroy(). That's not a good time to execute arbitrary JavaScript, 353ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // since both loading and rendering data structures may be in inconsistent state. 354ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // This suppresses calls from all plug-ins, even those in different pages, since JS might affect the frame with plug-in that's being stopped. 355ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // 356ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: Plug-ins can execute arbitrary JS from destroy() in same process case, and other browsers also support that. 357ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // A better fix may be to make sure that unrelated messages are postponed until after destroy() returns. 358ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Another possible fix may be to send destroy message at a time when internal structures are consistent. 359ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // 360ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // FIXME: We lack similar message suppression in other cases - resize() is also triggered by layout, so executing arbitrary JS is also problematic. 361ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block static bool m_inDestroy; 362ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 363231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool m_pluginIsWaitingForDraw; 3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RefPtr<HostedNetscapePluginStream> m_manualStream; 366d0825bca7fe65beaee391d30da42e937db621564Steve Block 367d0825bca7fe65beaee391d30da42e937db621564Steve Block typedef HashMap<WebFrame*, RefPtr<PluginRequest> > FrameLoadMap; 368d0825bca7fe65beaee391d30da42e937db621564Steve Block FrameLoadMap m_pendingFrameLoads; 3695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}; 3705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} // namespace WebKit 3725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark 3735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#endif // NetscapePluginInstanceProxy_h 3745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#endif // USE(PLUGIN_HOST_PROCESS) 375