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