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
26e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#if USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginInstanceProxy.h"
295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "HostedNetscapePluginStream.h"
315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "NetscapePluginHostProxy.h"
325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "ProxyInstance.h"
33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import "ProxyRuntimeObject.h"
345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebDataSourceInternal.h"
355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebFrameInternal.h"
365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebHostedNetscapePluginView.h"
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebKitNSStringExtras.h"
385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebNSDataExtras.h"
395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebNSURLExtras.h"
405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebPluginRequest.h"
415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebUIDelegate.h"
425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebUIDelegatePrivate.h"
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import "WebViewInternal.h"
448a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#import <JavaScriptCore/Error.h>
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <JavaScriptCore/JSLock.h>
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <JavaScriptCore/PropertyNameArray.h>
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/CookieJar.h>
485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/DocumentLoader.h>
495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/Frame.h>
505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/FrameLoader.h>
515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/FrameTree.h>
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/KURL.h>
53a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#import <WebCore/ProxyServer.h>
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/SecurityOrigin.h>
555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/ScriptController.h>
565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <WebCore/ScriptValue.h>
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/StringSourceProvider.h>
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/npruntime_impl.h>
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/runtime_object.h>
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebKitSystemInterface.h>
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <mach/mach.h>
625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import <utility>
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <wtf/RefCountedLeakCounter.h>
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <wtf/text/CString.h>
655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkextern "C" {
675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginClientServer.h"
685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark#import "WebKitPluginHost.h"
695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace JSC;
725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace JSC::Bindings;
735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace std;
745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkusing namespace WebCore;
755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarknamespace WebKit {
775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
78d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass NetscapePluginInstanceProxy::PluginRequest : public RefCounted<NetscapePluginInstanceProxy::PluginRequest> {
795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkpublic:
80d0825bca7fe65beaee391d30da42e937db621564Steve Block    static PassRefPtr<PluginRequest> create(uint32_t requestID, NSURLRequest* request, NSString* frameName, bool allowPopups)
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
82d0825bca7fe65beaee391d30da42e937db621564Steve Block        return adoptRef(new PluginRequest(requestID, request, frameName, allowPopups));
83d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
84d0825bca7fe65beaee391d30da42e937db621564Steve Block
85d0825bca7fe65beaee391d30da42e937db621564Steve Block    uint32_t requestID() const { return m_requestID; }
86d0825bca7fe65beaee391d30da42e937db621564Steve Block    NSURLRequest* request() const { return m_request.get(); }
87d0825bca7fe65beaee391d30da42e937db621564Steve Block    NSString* frameName() const { return m_frameName.get(); }
88d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool allowPopups() const { return m_allowPopups; }
89d0825bca7fe65beaee391d30da42e937db621564Steve Block
90d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate:
91d0825bca7fe65beaee391d30da42e937db621564Steve Block    PluginRequest(uint32_t requestID, NSURLRequest* request, NSString* frameName, bool allowPopups)
925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        : m_requestID(requestID)
935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        , m_request(request)
945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        , m_frameName(frameName)
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        , m_allowPopups(allowPopups)
965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    {
975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    uint32_t m_requestID;
100d0825bca7fe65beaee391d30da42e937db621564Steve Block    RetainPtr<NSURLRequest*> m_request;
101d0825bca7fe65beaee391d30da42e937db621564Steve Block    RetainPtr<NSString*> m_frameName;
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool m_allowPopups;
1035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark};
1045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
105692e5dbf12901edacf14812a6fae25462920af42Steve BlockNetscapePluginInstanceProxy::LocalObjectMap::LocalObjectMap()
106692e5dbf12901edacf14812a6fae25462920af42Steve Block    : m_objectIDCounter(0)
107692e5dbf12901edacf14812a6fae25462920af42Steve Block{
108692e5dbf12901edacf14812a6fae25462920af42Steve Block}
109692e5dbf12901edacf14812a6fae25462920af42Steve Block
110692e5dbf12901edacf14812a6fae25462920af42Steve BlockNetscapePluginInstanceProxy::LocalObjectMap::~LocalObjectMap()
111692e5dbf12901edacf14812a6fae25462920af42Steve Block{
112692e5dbf12901edacf14812a6fae25462920af42Steve Block}
113692e5dbf12901edacf14812a6fae25462920af42Steve Block
114692e5dbf12901edacf14812a6fae25462920af42Steve Blockinline bool NetscapePluginInstanceProxy::LocalObjectMap::contains(uint32_t objectID) const
115692e5dbf12901edacf14812a6fae25462920af42Steve Block{
116692e5dbf12901edacf14812a6fae25462920af42Steve Block    return m_idToJSObjectMap.contains(objectID);
117692e5dbf12901edacf14812a6fae25462920af42Steve Block}
118692e5dbf12901edacf14812a6fae25462920af42Steve Block
119692e5dbf12901edacf14812a6fae25462920af42Steve Blockinline JSC::JSObject* NetscapePluginInstanceProxy::LocalObjectMap::get(uint32_t objectID) const
120692e5dbf12901edacf14812a6fae25462920af42Steve Block{
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (objectID == HashTraits<uint32_t>::emptyValue() || HashTraits<uint32_t>::isDeletedValue(objectID))
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return 0;
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
12481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return m_idToJSObjectMap.get(objectID).get();
125692e5dbf12901edacf14812a6fae25462920af42Steve Block}
126692e5dbf12901edacf14812a6fae25462920af42Steve Block
12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochuint32_t NetscapePluginInstanceProxy::LocalObjectMap::idForObject(JSGlobalData& globalData, JSObject* object)
128692e5dbf12901edacf14812a6fae25462920af42Steve Block{
129692e5dbf12901edacf14812a6fae25462920af42Steve Block    // This method creates objects with refcount of 1, but doesn't increase refcount when returning
130692e5dbf12901edacf14812a6fae25462920af42Steve Block    // found objects. This extra count accounts for the main "reference" kept by plugin process.
131692e5dbf12901edacf14812a6fae25462920af42Steve Block
132692e5dbf12901edacf14812a6fae25462920af42Steve Block    // To avoid excessive IPC, plugin process doesn't send each NPObject release/retain call to
133692e5dbf12901edacf14812a6fae25462920af42Steve Block    // Safari. It only sends one when the last reference is removed, and it can destroy the proxy
134692e5dbf12901edacf14812a6fae25462920af42Steve Block    // NPObject.
135692e5dbf12901edacf14812a6fae25462920af42Steve Block
136692e5dbf12901edacf14812a6fae25462920af42Steve Block    // However, the browser may be sending the same object out to plug-in as a function call
137692e5dbf12901edacf14812a6fae25462920af42Steve Block    // argument at the same time - neither side can know what the other one is doing. So,
138692e5dbf12901edacf14812a6fae25462920af42Steve Block    // is to make PCForgetBrowserObject call return a boolean result, making it possible for
139692e5dbf12901edacf14812a6fae25462920af42Steve Block    // the browser to make plugin host keep the proxy with zero refcount for a little longer.
140692e5dbf12901edacf14812a6fae25462920af42Steve Block
141692e5dbf12901edacf14812a6fae25462920af42Steve Block    uint32_t objectID = 0;
142692e5dbf12901edacf14812a6fae25462920af42Steve Block
143692e5dbf12901edacf14812a6fae25462920af42Steve Block    HashMap<JSC::JSObject*, pair<uint32_t, uint32_t> >::iterator iter = m_jsObjectToIDMap.find(object);
144692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (iter != m_jsObjectToIDMap.end())
145692e5dbf12901edacf14812a6fae25462920af42Steve Block        return iter->second.first;
146692e5dbf12901edacf14812a6fae25462920af42Steve Block
147692e5dbf12901edacf14812a6fae25462920af42Steve Block    do {
148692e5dbf12901edacf14812a6fae25462920af42Steve Block        objectID = ++m_objectIDCounter;
149692e5dbf12901edacf14812a6fae25462920af42Steve Block    } while (!m_objectIDCounter || m_objectIDCounter == static_cast<uint32_t>(-1) || m_idToJSObjectMap.contains(objectID));
150692e5dbf12901edacf14812a6fae25462920af42Steve Block
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_idToJSObjectMap.set(objectID, Strong<JSObject>(globalData, object));
152692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_jsObjectToIDMap.set(object, make_pair<uint32_t, uint32_t>(objectID, 1));
153692e5dbf12901edacf14812a6fae25462920af42Steve Block
154692e5dbf12901edacf14812a6fae25462920af42Steve Block    return objectID;
155692e5dbf12901edacf14812a6fae25462920af42Steve Block}
156692e5dbf12901edacf14812a6fae25462920af42Steve Block
157692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid NetscapePluginInstanceProxy::LocalObjectMap::retain(JSC::JSObject* object)
158692e5dbf12901edacf14812a6fae25462920af42Steve Block{
159692e5dbf12901edacf14812a6fae25462920af42Steve Block    HashMap<JSC::JSObject*, pair<uint32_t, uint32_t> >::iterator iter = m_jsObjectToIDMap.find(object);
160692e5dbf12901edacf14812a6fae25462920af42Steve Block    ASSERT(iter != m_jsObjectToIDMap.end());
161692e5dbf12901edacf14812a6fae25462920af42Steve Block
162692e5dbf12901edacf14812a6fae25462920af42Steve Block    iter->second.second = iter->second.second + 1;
163692e5dbf12901edacf14812a6fae25462920af42Steve Block}
164692e5dbf12901edacf14812a6fae25462920af42Steve Block
165692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid NetscapePluginInstanceProxy::LocalObjectMap::release(JSC::JSObject* object)
166692e5dbf12901edacf14812a6fae25462920af42Steve Block{
167692e5dbf12901edacf14812a6fae25462920af42Steve Block    HashMap<JSC::JSObject*, pair<uint32_t, uint32_t> >::iterator iter = m_jsObjectToIDMap.find(object);
168692e5dbf12901edacf14812a6fae25462920af42Steve Block    ASSERT(iter != m_jsObjectToIDMap.end());
169692e5dbf12901edacf14812a6fae25462920af42Steve Block
170692e5dbf12901edacf14812a6fae25462920af42Steve Block    ASSERT(iter->second.second > 0);
171692e5dbf12901edacf14812a6fae25462920af42Steve Block    iter->second.second = iter->second.second - 1;
172692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (!iter->second.second) {
173692e5dbf12901edacf14812a6fae25462920af42Steve Block        m_idToJSObjectMap.remove(iter->second.first);
174692e5dbf12901edacf14812a6fae25462920af42Steve Block        m_jsObjectToIDMap.remove(iter);
175692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
176692e5dbf12901edacf14812a6fae25462920af42Steve Block}
177692e5dbf12901edacf14812a6fae25462920af42Steve Block
178692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid NetscapePluginInstanceProxy::LocalObjectMap::clear()
179692e5dbf12901edacf14812a6fae25462920af42Steve Block{
180692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_idToJSObjectMap.clear();
181692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_jsObjectToIDMap.clear();
182692e5dbf12901edacf14812a6fae25462920af42Steve Block}
183692e5dbf12901edacf14812a6fae25462920af42Steve Block
184692e5dbf12901edacf14812a6fae25462920af42Steve Blockbool NetscapePluginInstanceProxy::LocalObjectMap::forget(uint32_t objectID)
185692e5dbf12901edacf14812a6fae25462920af42Steve Block{
186dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (objectID == HashTraits<uint32_t>::emptyValue() || HashTraits<uint32_t>::isDeletedValue(objectID)) {
187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::LocalObjectMap::forget: local object id %u is not valid.", objectID);
188dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
189dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
190dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HashMap<uint32_t, JSC::Strong<JSC::JSObject> >::iterator iter = m_idToJSObjectMap.find(objectID);
192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (iter == m_idToJSObjectMap.end()) {
193dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::LocalObjectMap::forget: local object %u doesn't exist.", objectID);
194dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
195dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
196692e5dbf12901edacf14812a6fae25462920af42Steve Block
197692e5dbf12901edacf14812a6fae25462920af42Steve Block    HashMap<JSC::JSObject*, pair<uint32_t, uint32_t> >::iterator rIter = m_jsObjectToIDMap.find(iter->second.get());
198692e5dbf12901edacf14812a6fae25462920af42Steve Block
199692e5dbf12901edacf14812a6fae25462920af42Steve Block    // If the object is being sent to plug-in right now, then it's not the time to forget.
200692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (rIter->second.second != 1)
201692e5dbf12901edacf14812a6fae25462920af42Steve Block        return false;
202692e5dbf12901edacf14812a6fae25462920af42Steve Block
203692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_jsObjectToIDMap.remove(rIter);
204692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_idToJSObjectMap.remove(iter);
205692e5dbf12901edacf14812a6fae25462920af42Steve Block    return true;
206692e5dbf12901edacf14812a6fae25462920af42Steve Block}
207692e5dbf12901edacf14812a6fae25462920af42Steve Block
2085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkstatic uint32_t pluginIDCounter;
2095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
210ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool NetscapePluginInstanceProxy::m_inDestroy;
211ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
213231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockstatic WTF::RefCountedLeakCounter netscapePluginInstanceProxyCounter("NetscapePluginInstanceProxy");
214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNetscapePluginInstanceProxy::NetscapePluginInstanceProxy(NetscapePluginHostProxy* pluginHostProxy, WebHostedNetscapePluginView *pluginView, bool fullFramePlugin)
2175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    : m_pluginHostProxy(pluginHostProxy)
2185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_pluginView(pluginView)
2195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_requestTimer(this, &NetscapePluginInstanceProxy::requestTimerFired)
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_currentURLRequestID(0)
2215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_renderContextID(0)
2226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    , m_rendererType(UseSoftwareRenderer)
2235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    , m_waitingForReply(false)
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    , m_urlCheckCounter(0)
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_pluginFunctionCallDepth(0)
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_shouldStopSoon(false)
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    , m_currentRequestID(0)
228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    , m_pluginIsWaitingForDraw(false)
2295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(m_pluginView);
2315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (fullFramePlugin) {
2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // For full frame plug-ins, the first requestID will always be the one for the already
2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // open stream.
2355e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        ++m_currentURLRequestID;
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Assign a plug-in ID.
2395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    do {
2405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_pluginID = ++pluginIDCounter;
2415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } while (pluginHostProxy->pluginInstance(m_pluginID) || !m_pluginID);
242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    netscapePluginInstanceProxyCounter.increment();
245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
2465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
24806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian MonsenPassRefPtr<NetscapePluginInstanceProxy> NetscapePluginInstanceProxy::create(NetscapePluginHostProxy* pluginHostProxy, WebHostedNetscapePluginView *pluginView, bool fullFramePlugin)
24906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen{
25006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    RefPtr<NetscapePluginInstanceProxy> proxy = adoptRef(new NetscapePluginInstanceProxy(pluginHostProxy, pluginView, fullFramePlugin));
25106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    pluginHostProxy->addPluginInstance(proxy.get());
25206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return proxy.release();
25306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen}
25406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2555ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNetscapePluginInstanceProxy::~NetscapePluginInstanceProxy()
2565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_pluginHostProxy);
258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_pluginID = 0;
260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    deleteAllValues(m_replies);
261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
262231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    netscapePluginInstanceProxyCounter.decrement();
264231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
2655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NetscapePluginInstanceProxy::resize(NSRect size, NSRect clipRect)
2685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    uint32_t requestID = 0;
2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
271dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    requestID = nextRequestID();
2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _WKPHResizePluginInstance(m_pluginHostProxy->port(), m_pluginID, requestID,
2740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                              size.origin.x, size.origin.y, size.size.width, size.size.height,
2750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                              clipRect.origin.x, clipRect.origin.y, clipRect.size.width, clipRect.size.height);
2760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
277dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID);
2785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::stopAllStreams()
2815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Vector<RefPtr<HostedNetscapePluginStream> > streamsCopy;
2835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    copyValuesToVector(m_streams, streamsCopy);
2845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    for (size_t i = 0; i < streamsCopy.size(); i++)
2855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        streamsCopy[i]->stop();
2865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
2875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
288563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::cleanup()
2895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
2905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    stopAllStreams();
2915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
292563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_requestTimer.stop();
2935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
2945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Clear the object map, this will cause any outstanding JS objects that the plug-in had a reference to
2955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // to go away when the next garbage collection takes place.
296692e5dbf12901edacf14812a6fae25462920af42Steve Block    m_localObjects.clear();
2975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
298563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (Frame* frame = core([m_pluginView webFrame]))
299563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        frame->script()->cleanupScriptObjectsForPlugin(m_pluginView);
300563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
301563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ProxyInstanceSet instances;
302563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    instances.swap(m_instances);
303563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Invalidate all proxy instances.
305563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ProxyInstanceSet::const_iterator end = instances.end();
306563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (ProxyInstanceSet::const_iterator it = instances.begin(); it != end; ++it)
307563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        (*it)->invalidate();
308563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
309563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_pluginView = nil;
310231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_manualStream = 0;
311563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
312563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
313563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::invalidate()
314563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
315563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // If the plug-in host has died, the proxy will be null.
316563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!m_pluginHostProxy)
317563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
318563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_pluginHostProxy->removePluginInstance(this);
3205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_pluginHostProxy = 0;
3215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
323563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::destroy()
324563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    uint32_t requestID = nextRequestID();
326ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
327ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    ASSERT(!m_inDestroy);
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_inDestroy = true;
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
330d0825bca7fe65beaee391d30da42e937db621564Steve Block    FrameLoadMap::iterator end = m_pendingFrameLoads.end();
331d0825bca7fe65beaee391d30da42e937db621564Steve Block    for (FrameLoadMap::iterator it = m_pendingFrameLoads.begin(); it != end; ++it)
332d0825bca7fe65beaee391d30da42e937db621564Steve Block        [(it->first) _setInternalLoadDelegate:nil];
333d0825bca7fe65beaee391d30da42e937db621564Steve Block
334563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHDestroyPluginInstance(m_pluginHostProxy->port(), m_pluginID, requestID);
3350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // If the plug-in host crashes while we're waiting for a reply, the last reference to the instance proxy
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // will go away. Prevent this by protecting it here.
3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RefPtr<NetscapePluginInstanceProxy> protect(this);
339563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
340563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We don't care about the reply here - we just want to block until the plug-in instance has been torn down.
341563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID);
342563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_inDestroy = false;
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
345563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cleanup();
346563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    invalidate();
347563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
348563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::setManualStream(PassRefPtr<HostedNetscapePluginStream> manualStream)
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(!m_manualStream);
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_manualStream = manualStream;
3540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::cancelStreamLoad(uint32_t streamID, NPReason reason)
3575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    HostedNetscapePluginStream* stream = 0;
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_manualStream && streamID == 1)
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        stream = m_manualStream.get();
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    else
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        stream = m_streams.get(streamID).get();
3640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!stream)
3660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
3670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    stream->cancelLoad(reason);
3690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
3705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::disconnectStream(HostedNetscapePluginStream* stream)
3735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
3745e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    if (stream == m_manualStream) {
3755e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        m_manualStream = 0;
3765e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        return;
3775e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    }
3785e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
3795e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block    ASSERT(m_streams.get(stream->streamID()) == stream);
3805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_streams.remove(stream->streamID());
3815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::pluginHostDied()
3845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
3855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_pluginHostProxy = 0;
386563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    [m_pluginView pluginHostDied];
388563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
389563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    cleanup();
3905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::focusChanged(bool hasFocus)
3935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
3945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceFocusChanged(m_pluginHostProxy->port(), m_pluginID, hasFocus);
3955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
3965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
3975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::windowFocusChanged(bool hasFocus)
3985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
3995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceWindowFocusChanged(m_pluginHostProxy->port(), m_pluginID, hasFocus);
4005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::windowFrameChanged(NSRect frame)
4035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceWindowFrameChanged(m_pluginHostProxy->port(), m_pluginID, frame.origin.x, frame.origin.y, frame.size.width, frame.size.height,
4055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                          NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]));
4065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::startTimers(bool throttleTimers)
4095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceStartTimers(m_pluginHostProxy->port(), m_pluginID, throttleTimers);
4115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::mouseEvent(NSView *pluginView, NSEvent *event, NPCocoaEventType type)
4145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSPoint screenPoint = [[event window] convertBaseToScreen:[event locationInWindow]];
4165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSPoint pluginPoint = [pluginView convertPoint:[event locationInWindow] fromView:nil];
4175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    int clickCount;
4195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (type == NPCocoaEventMouseEntered || type == NPCocoaEventMouseExited)
4205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        clickCount = 0;
4215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    else
4225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        clickCount = [event clickCount];
4235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceMouseEvent(m_pluginHostProxy->port(), m_pluginID,
4265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  [event timestamp],
4275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  type, [event modifierFlags],
4285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  pluginPoint.x, pluginPoint.y,
4295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  screenPoint.x, screenPoint.y,
4305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  NSMaxY([[[NSScreen screens] objectAtIndex:0] frame]),
4315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  [event buttonNumber], clickCount,
4325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                  [event deltaX], [event deltaY], [event deltaZ]);
4335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::keyEvent(NSView *pluginView, NSEvent *event, NPCocoaEventType type)
4365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
4375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSData *charactersData = [[event characters] dataUsingEncoding:NSUTF8StringEncoding];
4385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSData *charactersIgnoringModifiersData = [[event charactersIgnoringModifiers] dataUsingEncoding:NSUTF8StringEncoding];
4395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
4405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceKeyboardEvent(m_pluginHostProxy->port(), m_pluginID,
4415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                     [event timestamp],
4425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                     type, [event modifierFlags],
4435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                     const_cast<char*>(reinterpret_cast<const char*>([charactersData bytes])), [charactersData length],
4445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                     const_cast<char*>(reinterpret_cast<const char*>([charactersIgnoringModifiersData bytes])), [charactersIgnoringModifiersData length],
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     [event isARepeat], [event keyCode], WKGetNSEventKeyChar(event));
4460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::syntheticKeyDownWithCommandModifier(int keyCode, char character)
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSData *charactersData = [NSData dataWithBytes:&character length:1];
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _WKPHPluginInstanceKeyboardEvent(m_pluginHostProxy->port(), m_pluginID,
4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     [NSDate timeIntervalSinceReferenceDate],
4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     NPCocoaEventKeyDown, NSCommandKeyMask,
4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     const_cast<char*>(reinterpret_cast<const char*>([charactersData bytes])), [charactersData length],
4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     const_cast<char*>(reinterpret_cast<const char*>([charactersData bytes])), [charactersData length],
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     false, keyCode, character);
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::flagsChanged(NSEvent *event)
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _WKPHPluginInstanceKeyboardEvent(m_pluginHostProxy->port(), m_pluginID,
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     [event timestamp], NPCocoaEventFlagsChanged,
4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                     [event modifierFlags], 0, 0, 0, 0, false, [event keyCode], 0);
4655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
4665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
467563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::insertText(NSString *text)
468563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    NSData *textData = [text dataUsingEncoding:NSUTF8StringEncoding];
470563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHPluginInstanceInsertText(m_pluginHostProxy->port(), m_pluginID,
472563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                                  const_cast<char*>(reinterpret_cast<const char*>([textData bytes])), [textData length]);
473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
474563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::wheelEvent(NSView *pluginView, NSEvent *event)
4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSPoint pluginPoint = [pluginView convertPoint:[event locationInWindow] fromView:nil];
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    uint32_t requestID = nextRequestID();
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _WKPHPluginInstanceWheelEvent(m_pluginHostProxy->port(), m_pluginID, requestID,
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                  [event timestamp], [event modifierFlags],
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                  pluginPoint.x, pluginPoint.y, [event buttonNumber],
4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                  [event deltaX], [event deltaY], [event deltaZ]);
4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    auto_ptr<NetscapePluginInstanceProxy::BooleanReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanReply>(requestID);
4860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!reply.get() || !reply->m_result)
4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
492563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::print(CGContextRef context, unsigned width, unsigned height)
493563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
494563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    uint32_t requestID = nextRequestID();
495563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    _WKPHPluginInstancePrint(m_pluginHostProxy->port(), m_pluginID, requestID, width, height);
496563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
497563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    auto_ptr<NetscapePluginInstanceProxy::BooleanAndDataReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanAndDataReply>(requestID);
498563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!reply.get() || !reply->m_returnValue)
499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CGDataProvider> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(reply->m_result.get()));
502563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CGColorSpaceRef> colorSpace(AdoptCF, CGColorSpaceCreateDeviceRGB());
503563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RetainPtr<CGImageRef> image(AdoptCF, CGImageCreate(width, height, 8, 32, width * 4, colorSpace.get(), kCGImageAlphaFirst, dataProvider.get(), 0, false, kCGRenderingIntentDefault));
504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
505563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Flip the context and draw the image.
506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CGContextSaveGState(context);
507563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CGContextTranslateCTM(context, 0.0, height);
508563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CGContextScaleCTM(context, 1.0, -1.0);
509563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
510563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.get());
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
512563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    CGContextRestoreGState(context);
513563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
514563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
515dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid NetscapePluginInstanceProxy::snapshot(CGContextRef context, unsigned width, unsigned height)
516dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    uint32_t requestID = nextRequestID();
518dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    _WKPHPluginInstanceSnapshot(m_pluginHostProxy->port(), m_pluginID, requestID, width, height);
519dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    auto_ptr<NetscapePluginInstanceProxy::BooleanAndDataReply> reply = waitForReply<NetscapePluginInstanceProxy::BooleanAndDataReply>(requestID);
521dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!reply.get() || !reply->m_returnValue)
522dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return;
523dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
524dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RetainPtr<CGDataProvider> dataProvider(AdoptCF, CGDataProviderCreateWithCFData(reply->m_result.get()));
525dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RetainPtr<CGColorSpaceRef> colorSpace(AdoptCF, CGColorSpaceCreateDeviceRGB());
526dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RetainPtr<CGImageRef> image(AdoptCF, CGImageCreate(width, height, 8, 32, width * 4, colorSpace.get(), kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host, dataProvider.get(), 0, false, kCGRenderingIntentDefault));
527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
528dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.get());
529dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
530dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
5315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::stopTimers()
5325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
5335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    _WKPHPluginInstanceStopTimers(m_pluginHostProxy->port(), m_pluginID);
5345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::status(const char* message)
5375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
538692e5dbf12901edacf14812a6fae25462920af42Steve Block    RetainPtr<CFStringRef> status(AdoptCF, CFStringCreateWithCString(0, message ? message : "", kCFStringEncodingUTF8));
5395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!status)
5405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return;
541692e5dbf12901edacf14812a6fae25462920af42Steve Block
5425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    WebView *wv = [m_pluginView webView];
5435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    [[wv _UIDelegateForwarder] webView:wv setStatusText:(NSString *)status.get()];
5445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
5455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5465ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkNPError NetscapePluginInstanceProxy::loadURL(const char* url, const char* target, const char* postData, uint32_t postLen, LoadURLFlags flags, uint32_t& streamID)
5475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
5485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!url)
5495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPERR_INVALID_PARAM;
5505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSMutableURLRequest *request = [m_pluginView requestWithURLCString:url];
5525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (flags & IsPost) {
5545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSData *httpBody = nil;
5555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (flags & PostDataIsFile) {
5575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            // If we're posting a file, buf is either a file URL or a path to the file.
558692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (!postData)
559692e5dbf12901edacf14812a6fae25462920af42Steve Block                return NPERR_INVALID_PARAM;
5605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            RetainPtr<CFStringRef> bufString(AdoptCF, CFStringCreateWithCString(kCFAllocatorDefault, postData, kCFStringEncodingWindowsLatin1));
5615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if (!bufString)
5625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return NPERR_INVALID_PARAM;
5635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            NSURL *fileURL = [NSURL _web_URLWithDataAsString:(NSString *)bufString.get()];
5655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            NSString *path;
5665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if ([fileURL isFileURL])
5675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                path = [fileURL path];
5685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            else
5695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                path = (NSString *)bufString.get();
5705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            httpBody = [NSData dataWithContentsOfFile:[path _webkit_fixedCarbonPOSIXPath]];
5715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if (!httpBody)
5725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return NPERR_FILE_NOT_FOUND;
5735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        } else
5745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            httpBody = [NSData dataWithBytes:postData length:postLen];
5755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (![httpBody length])
5775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return NPERR_INVALID_PARAM;
5785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [request setHTTPMethod:@"POST"];
5805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (flags & AllowHeadersInPostData) {
5825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if ([httpBody _web_startsWithBlankLine])
5835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                httpBody = [httpBody subdataWithRange:NSMakeRange(1, [httpBody length] - 1)];
5845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            else {
5855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                NSInteger location = [httpBody _web_locationAfterFirstBlankLine];
5865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                if (location != NSNotFound) {
5875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    // If the blank line is somewhere in the middle of postData, everything before is the header.
5885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    NSData *headerData = [httpBody subdataWithRange:NSMakeRange(0, location)];
5895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    NSMutableDictionary *header = [headerData _webkit_parseRFC822HeaderFields];
5905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    unsigned dataLength = [httpBody length] - location;
5915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    // Sometimes plugins like to set Content-Length themselves when they post,
5935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    // but CFNetwork does not like that. So we will remove the header
5945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    // and instead truncate the data to the requested length.
5955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    NSString *contentLength = [header objectForKey:@"Content-Length"];
5965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
5975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    if (contentLength)
5985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                        dataLength = min(static_cast<unsigned>([contentLength intValue]), dataLength);
5995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    [header removeObjectForKey:@"Content-Length"];
6005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    if ([header count] > 0)
6025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                        [request setAllHTTPHeaderFields:header];
6035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    // Everything after the blank line is the actual content of the POST.
6055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                    httpBody = [httpBody subdataWithRange:NSMakeRange(location, dataLength)];
6065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                }
6075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            }
6085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
6095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (![httpBody length])
6115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return NPERR_INVALID_PARAM;
6125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // Plug-ins expect to receive uncached data when doing a POST (3347134).
6145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [request setCachePolicy:NSURLRequestReloadIgnoringCacheData];
6155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [request setHTTPBody:httpBody];
6165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
6175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return loadRequest(request, target, flags & AllowPopups, streamID);
6195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::performRequest(PluginRequest* pluginRequest)
6225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
623563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_pluginView);
624563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
6255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSURLRequest *request = pluginRequest->request();
6265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSString *frameName = pluginRequest->frameName();
6275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    WebFrame *frame = nil;
6285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSURL *URL = [request URL];
6305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSString *JSString = [URL _webkit_scriptIfJavaScriptURL];
6315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(frameName || JSString);
6335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (frameName) {
6345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // FIXME - need to get rid of this window creation which
6355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // bypasses normal targeted link handling
6365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        frame = kit(core([m_pluginView webFrame])->loader()->findFrameForNavigation(frameName));
6375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (!frame) {
6385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            WebView *currentWebView = [m_pluginView webView];
6395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            NSDictionary *features = [[NSDictionary alloc] init];
6405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            WebView *newWebView = [[currentWebView _UIDelegateForwarder] webView:currentWebView
6415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                        createWebViewWithRequest:nil
6425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                  windowFeatures:features];
6435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [features release];
6445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
645563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            if (!newWebView) {
646563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                _WKPHLoadURLNotify(m_pluginHostProxy->port(), m_pluginID, pluginRequest->requestID(), NPERR_GENERIC_ERROR);
6475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return;
648563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
6495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            frame = [newWebView mainFrame];
6515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            core(frame)->tree()->setName(frameName);
6525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [[newWebView _UIDelegateForwarder] webViewShow:newWebView];
6535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
6545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
6555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (JSString) {
6575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        ASSERT(!frame || [m_pluginView webFrame] == frame);
6585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        evaluateJavaScript(pluginRequest);
659d0825bca7fe65beaee391d30da42e937db621564Steve Block    } else {
6605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [frame loadRequest:request];
661d0825bca7fe65beaee391d30da42e937db621564Steve Block
662d0825bca7fe65beaee391d30da42e937db621564Steve Block        // Check if another plug-in view or even this view is waiting for the frame to load.
663d0825bca7fe65beaee391d30da42e937db621564Steve Block        // If it is, tell it that the load was cancelled because it will be anyway.
664d0825bca7fe65beaee391d30da42e937db621564Steve Block        WebHostedNetscapePluginView *view = [frame _internalLoadDelegate];
665d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (view != nil) {
666d0825bca7fe65beaee391d30da42e937db621564Steve Block            ASSERT([view isKindOfClass:[WebHostedNetscapePluginView class]]);
667d0825bca7fe65beaee391d30da42e937db621564Steve Block            [view webFrame:frame didFinishLoadWithReason:NPRES_USER_BREAK];
668d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
669d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_pendingFrameLoads.set(frame, pluginRequest);
670d0825bca7fe65beaee391d30da42e937db621564Steve Block        [frame _setInternalLoadDelegate:m_pluginView];
671d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
672d0825bca7fe65beaee391d30da42e937db621564Steve Block
673d0825bca7fe65beaee391d30da42e937db621564Steve Block}
674d0825bca7fe65beaee391d30da42e937db621564Steve Block
675d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid NetscapePluginInstanceProxy::webFrameDidFinishLoadWithReason(WebFrame* webFrame, NPReason reason)
676d0825bca7fe65beaee391d30da42e937db621564Steve Block{
677d0825bca7fe65beaee391d30da42e937db621564Steve Block    FrameLoadMap::iterator it = m_pendingFrameLoads.find(webFrame);
678d0825bca7fe65beaee391d30da42e937db621564Steve Block    ASSERT(it != m_pendingFrameLoads.end());
679d0825bca7fe65beaee391d30da42e937db621564Steve Block
680d0825bca7fe65beaee391d30da42e937db621564Steve Block    PluginRequest* pluginRequest = it->second.get();
681d0825bca7fe65beaee391d30da42e937db621564Steve Block    _WKPHLoadURLNotify(m_pluginHostProxy->port(), m_pluginID, pluginRequest->requestID(), reason);
682d0825bca7fe65beaee391d30da42e937db621564Steve Block
683d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_pendingFrameLoads.remove(it);
684d0825bca7fe65beaee391d30da42e937db621564Steve Block
685d0825bca7fe65beaee391d30da42e937db621564Steve Block    [webFrame _setInternalLoadDelegate:nil];
6865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
6875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::evaluateJavaScript(PluginRequest* pluginRequest)
6895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
6905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSURL *URL = [pluginRequest->request() URL];
6915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSString *JSString = [URL _webkit_scriptIfJavaScriptURL];
6925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(JSString);
6935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSString *result = [[m_pluginView webFrame] _stringByEvaluatingJavaScriptFromString:JSString forceUserGesture:pluginRequest->allowPopups()];
6955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
6965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Don't continue if stringByEvaluatingJavaScriptFromString caused the plug-in to stop.
6975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!m_pluginHostProxy)
6985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return;
6995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (pluginRequest->frameName() != nil)
7015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return;
7025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if ([result length] > 0) {
7045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // Don't call NPP_NewStream and other stream methods if there is no JS result to deliver. This is what Mozilla does.
7055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        NSData *JSData = [result dataUsingEncoding:NSUTF8StringEncoding];
7065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        RefPtr<HostedNetscapePluginStream> stream = HostedNetscapePluginStream::create(this, pluginRequest->requestID(), pluginRequest->request());
708bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        m_streams.add(stream->streamID(), stream);
7095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        RetainPtr<NSURLResponse> response(AdoptNS, [[NSURLResponse alloc] initWithURL:URL
7115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                             MIMEType:@"text/plain"
7125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                expectedContentLength:[JSData length]
7135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                     textEncodingName:nil]);
7145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        stream->startStreamWithResponse(response.get());
7155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        stream->didReceiveData(0, static_cast<const char*>([JSData bytes]), [JSData length]);
7165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        stream->didFinishLoading(0);
7175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkvoid NetscapePluginInstanceProxy::requestTimerFired(Timer<NetscapePluginInstanceProxy>*)
7215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
7225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(!m_pluginRequests.isEmpty());
723563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_pluginView);
7245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
725d0825bca7fe65beaee391d30da42e937db621564Steve Block    RefPtr<PluginRequest> request = m_pluginRequests.first();
7265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    m_pluginRequests.removeFirst();
7275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!m_pluginRequests.isEmpty())
7295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_requestTimer.startOneShot(0);
7305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
731d0825bca7fe65beaee391d30da42e937db621564Steve Block    performRequest(request.get());
7325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochNPError NetscapePluginInstanceProxy::loadRequest(NSURLRequest *request, const char* cTarget, bool allowPopups, uint32_t& requestID)
7355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
7365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSURL *URL = [request URL];
7375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!URL)
7395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPERR_INVALID_URL;
7405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // Don't allow requests to be loaded when the document loader is stopping all loaders.
742cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    DocumentLoader* documentLoader = [[m_pluginView dataSource] _documentLoader];
743cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (!documentLoader || documentLoader->isStopping())
7445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPERR_GENERIC_ERROR;
745cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
7465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSString *target = nil;
7475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (cTarget) {
7485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // Find the frame given the target string.
7495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        target = [NSString stringWithCString:cTarget encoding:NSISOLatin1StringEncoding];
7505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    WebFrame *frame = [m_pluginView webFrame];
7525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // don't let a plugin start any loads if it is no longer part of a document that is being
7545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // displayed unless the loads are in the same frame as the plugin.
755cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (documentLoader != core([m_pluginView webFrame])->loader()->activeDocumentLoader() &&
7565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        (!cTarget || [frame findFrameNamed:target] != frame)) {
7575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return NPERR_GENERIC_ERROR;
7585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSString *JSString = [URL _webkit_scriptIfJavaScriptURL];
7615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (JSString != nil) {
7625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (![[[m_pluginView webView] preferences] isJavaScriptEnabled]) {
7635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            // Return NPERR_GENERIC_ERROR if JS is disabled. This is what Mozilla does.
7645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return NPERR_GENERIC_ERROR;
7655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
7665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else {
76768513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!core([m_pluginView webFrame])->document()->securityOrigin()->canDisplay(URL))
7685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return NPERR_GENERIC_ERROR;
7695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    // FIXME: Handle wraparound
772563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    requestID = ++m_currentURLRequestID;
7735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (cTarget || JSString) {
7755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // Make when targetting a frame or evaluating a JS string, perform the request after a delay because we don't
7765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        // want to potentially kill the plug-in inside of its URL request.
7775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        if (JSString && target && [frame findFrameNamed:target] != frame) {
7795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            // For security reasons, only allow JS requests to be made on the frame that contains the plug-in.
7805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return NPERR_INVALID_PARAM;
7815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
7825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
783d0825bca7fe65beaee391d30da42e937db621564Steve Block        RefPtr<PluginRequest> pluginRequest = PluginRequest::create(requestID, request, target, allowPopups);
784d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_pluginRequests.append(pluginRequest.release());
7855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_requestTimer.startOneShot(0);
7865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else {
7875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        RefPtr<HostedNetscapePluginStream> stream = HostedNetscapePluginStream::create(this, requestID, request);
7885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7895e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block        ASSERT(!m_streams.contains(requestID));
7905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        m_streams.add(requestID, stream);
7915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        stream->start();
7925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
7935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
7945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return NPERR_NO_ERROR;
7955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
7965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
797563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkNetscapePluginInstanceProxy::Reply* NetscapePluginInstanceProxy::processRequestsAndWaitForReply(uint32_t requestID)
7985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
799563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Reply* reply = 0;
800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ASSERT(m_pluginHostProxy);
802563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    while (!(reply = m_replies.take(requestID))) {
803563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (!m_pluginHostProxy->processRequests())
804563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return 0;
805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // The host proxy can be destroyed while executing a nested processRequests() call, in which case it's normal
807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // to get a success result, but be unable to keep looping.
808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (!m_pluginHostProxy)
809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return 0;
8105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
811563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
812563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(reply);
813563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return reply;
8145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark// NPRuntime support
8175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::getWindowNPObject(uint32_t& objectID)
8185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
8195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
8205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
8215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
8225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!frame->script()->canExecuteScripts(NotAboutToExecuteScript))
8245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        objectID = 0;
8255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    else
82681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        objectID = m_localObjects.idForObject(*pluginWorld()->globalData(), frame->script()->windowShell(pluginWorld())->window());
8275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
8295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
830563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
831563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool NetscapePluginInstanceProxy::getPluginElementNPObject(uint32_t& objectID)
832563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
833563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Frame* frame = core([m_pluginView webFrame]);
834563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!frame)
835563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
8365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
837563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (JSObject* object = frame->script()->jsObjectForPluginElement([m_pluginView element]))
83881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        objectID = m_localObjects.idForObject(*pluginWorld()->globalData(), object);
839563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    else
840563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        objectID = 0;
841563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
842563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
843563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
844563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
845692e5dbf12901edacf14812a6fae25462920af42Steve Blockbool NetscapePluginInstanceProxy::forgetBrowserObjectID(uint32_t objectID)
8465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
847692e5dbf12901edacf14812a6fae25462920af42Steve Block    return m_localObjects.forget(objectID);
8485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::evaluate(uint32_t objectID, const String& script, data_t& resultData, mach_msg_type_number_t& resultLength, bool allowPopups)
8515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
8525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    resultData = 0;
8535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    resultLength = 0;
8545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
855ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_inDestroy)
856ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return false;
857ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
858dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!m_localObjects.contains(objectID)) {
859dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::evaluate: local object %u doesn't exist.", objectID);
8605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
861dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
8625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
8645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
8655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
866563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
8685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Strong<JSGlobalObject> globalObject(*pluginWorld()->globalData(), frame->script()->globalObject(pluginWorld()));
870563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ExecState* exec = globalObject->globalExec();
871563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
8720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    bool oldAllowPopups = frame->script()->allowPopupsFromPlugin();
8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    frame->script()->setAllowPopupsFromPlugin(allowPopups);
8740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
875e14391e94c850b8bd03680c23b38978db68687a8John Reck    globalObject->globalData().timeoutChecker.start();
876563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Completion completion = JSC::evaluate(exec, globalObject->globalScopeChain(), makeSource(script));
877e14391e94c850b8bd03680c23b38978db68687a8John Reck    globalObject->globalData().timeoutChecker.stop();
878563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ComplType type = completion.complType();
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    frame->script()->setAllowPopupsFromPlugin(oldAllowPopups);
8815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue result;
883563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (type == Normal)
884563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        result = completion.value();
885563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
886563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!result)
887563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        result = jsUndefined();
888563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
889563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    marshalValue(exec, result, resultData, resultLength);
8905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
8915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
8925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
8935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::invoke(uint32_t objectID, const Identifier& methodName, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength)
8955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
8965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    resultData = 0;
8975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    resultLength = 0;
8985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
8990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
9000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
9010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
902692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
903dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
904dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::invoke: local object %u doesn't exist.", objectID);
9055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
906dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
9075ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
9095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
9105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
912cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
9130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
9140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue function = object->get(exec, methodName);
9155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CallData callData;
916545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    CallType callType = getCallData(function, callData);
9175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (callType == CallTypeNone)
9185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MarkedArgumentBuffer argList;
9215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    demarshalValues(exec, argumentsData, argumentsLength, argList);
9225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
92381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<JSGlobalData> globalData = pluginWorld()->globalData();
92481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.start();
9250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = call(exec, function, callType, callData, object, argList);
92681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.stop();
9275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    marshalValue(exec, value, resultData, resultLength);
9295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
9305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
9315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
9325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::invokeDefault(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength)
9345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
9350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
9360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
9370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
938692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::invokeDefault: local object %u doesn't exist.", objectID);
9415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
9435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
9455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
9465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
948cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
9490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
9505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CallData callData;
9515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    CallType callType = object->getCallData(callData);
9525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (callType == CallTypeNone)
9535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MarkedArgumentBuffer argList;
9565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    demarshalValues(exec, argumentsData, argumentsLength, argList);
9575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
95881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<JSGlobalData> globalData = pluginWorld()->globalData();
95981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.start();
9600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = call(exec, object, callType, callData, object, argList);
96181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.stop();
9625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    marshalValue(exec, value, resultData, resultLength);
9645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
9655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
9665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
9675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::construct(uint32_t objectID, data_t argumentsData, mach_msg_type_number_t argumentsLength, data_t& resultData, mach_msg_type_number_t& resultLength)
9695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
9700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
9710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
9720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
973692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
974dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::construct: local object %u doesn't exist.", objectID);
9765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
977dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
9785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
9805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
9815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
983cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
9840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
9855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConstructData constructData;
9875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ConstructType constructType = object->getConstructData(constructData);
9885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (constructType == ConstructTypeNone)
9895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
9900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MarkedArgumentBuffer argList;
9925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    demarshalValues(exec, argumentsData, argumentsLength, argList);
9935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
99481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RefPtr<JSGlobalData> globalData = pluginWorld()->globalData();
99581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.start();
9960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = JSC::construct(exec, object, constructType, constructData, argList);
99781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    globalData->timeoutChecker.stop();
9985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
9995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    marshalValue(exec, value, resultData, resultLength);
10005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
10015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
10025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
10035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::getProperty(uint32_t objectID, const Identifier& propertyName, data_t& resultData, mach_msg_type_number_t& resultLength)
10055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
10060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
10070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
10080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1009692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1010dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1011dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::getProperty: local object %u doesn't exist.", objectID);
10125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1013dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
10145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
10165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
10175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
10185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1019cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
10200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
10210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = object->get(exec, propertyName);
10225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    marshalValue(exec, value, resultData, resultLength);
10245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
10255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
10265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
10275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::getProperty(uint32_t objectID, unsigned propertyName, data_t& resultData, mach_msg_type_number_t& resultLength)
10295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1030692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1031dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1032dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::getProperty: local object %u doesn't exist.", objectID);
10335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1034dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
10355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
10375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
10385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
10395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1040cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
10410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
10420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = object->get(exec, propertyName);
10435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    marshalValue(exec, value, resultData, resultLength);
10455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
10465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
10475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
10485ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::setProperty(uint32_t objectID, const Identifier& propertyName, data_t valueData, mach_msg_type_number_t valueLength)
10505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
10510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
10520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
10530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1054692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1055dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1056dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::setProperty: local object %u doesn't exist.", objectID);
10575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1058dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
10595ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
10615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
10625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
10635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1064cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
10650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
10665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = demarshalValue(exec, valueData, valueLength);
10685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    PutPropertySlot slot;
10695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    object->put(exec, propertyName, value, slot);
10705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
10725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
10735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
10745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::setProperty(uint32_t objectID, unsigned propertyName, data_t valueData, mach_msg_type_number_t valueLength)
10765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
10770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
10780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
10790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1080692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1081dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1082dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::setProperty: local object %u doesn't exist.", objectID);
10835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1084dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
10855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
10875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
10885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
10895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1090cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
10910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
10925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value = demarshalValue(exec, valueData, valueLength);
10945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    object->put(exec, propertyName, value);
10955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
10965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
10975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
10985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
10995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::removeProperty(uint32_t objectID, const Identifier& propertyName)
11015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
11020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
11030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
11040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1105692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::removeProperty: local object %u doesn't exist.", objectID);
11085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
11105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
11125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
11135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1115cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
11165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!object->hasProperty(exec, propertyName)) {
11175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        exec->clearException();
11185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
11205ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
11225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    object->deleteProperty(exec, propertyName);
11235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
11245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
11255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
11265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::removeProperty(uint32_t objectID, unsigned propertyName)
11285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
11290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
11300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
11310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1132692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::removeProperty: local object %u doesn't exist.", objectID);
11355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1136dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
11375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
11395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
11405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1142cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
11435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!object->hasProperty(exec, propertyName)) {
11445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        exec->clearException();
11455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
11475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
11495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    object->deleteProperty(exec, propertyName);
11505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
11515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return true;
11525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
11535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::hasProperty(uint32_t objectID, const Identifier& propertyName)
11555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
11560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
11570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
11580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1159692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1160dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::hasProperty: local object %u doesn't exist.", objectID);
11625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1163dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
11645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
11665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
11675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
11705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    bool result = object->hasProperty(exec, propertyName);
11715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
11725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return result;
11745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
11755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::hasProperty(uint32_t objectID, unsigned propertyName)
11775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
11780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
11790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
11800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1181692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::hasProperty: local object %u doesn't exist.", objectID);
11845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
11865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
11885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
11895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
11905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
11925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    bool result = object->hasProperty(exec, propertyName);
11935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
11945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return result;
11965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
11975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
11985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clarkbool NetscapePluginInstanceProxy::hasMethod(uint32_t objectID, const Identifier& methodName)
11995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
12000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
12010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
12020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1203692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::hasMethod: local object %u doesn't exist.", objectID);
12065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
1207dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
12085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    Frame* frame = core([m_pluginView webFrame]);
12105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!frame)
12115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
12125ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1213cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
12140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
12150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue func = object->get(exec, methodName);
12165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    exec->clearException();
12175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return !func.isUndefined();
12185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
12195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool NetscapePluginInstanceProxy::enumerate(uint32_t objectID, data_t& resultData, mach_msg_type_number_t& resultLength)
1221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
12220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (m_inDestroy)
12230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
12240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1225692e5dbf12901edacf14812a6fae25462920af42Steve Block    JSObject* object = m_localObjects.get(objectID);
1226dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!object) {
1227dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        LOG_ERROR("NetscapePluginInstanceProxy::enumerate: local object %u doesn't exist.", objectID);
1228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1229dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    Frame* frame = core([m_pluginView webFrame]);
1232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!frame)
1233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1234563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1235cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    ExecState* exec = frame->script()->globalObject(pluginWorld())->globalExec();
12360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
1237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    PropertyNameArray propertyNames(exec);
1239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    object->getPropertyNames(exec, propertyNames);
1240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    RetainPtr<NSMutableArray*> array(AdoptNS, [[NSMutableArray alloc] init]);
1242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (unsigned i = 0; i < propertyNames.size(); i++) {
1243f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        uint64_t methodName = reinterpret_cast<uint64_t>(_NPN_GetStringIdentifier(propertyNames[i].ustring().utf8().data()));
1244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        [array.get() addObject:[NSNumber numberWithLongLong:methodName]];
1246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    NSData *data = [NSPropertyListSerialization dataFromPropertyList:array.get() format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
1249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(data);
1250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    resultLength = [data length];
1252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    mig_allocate(reinterpret_cast<vm_address_t*>(&resultData), resultLength);
1253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1254563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    memcpy(resultData, [data bytes], resultLength);
1255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1256563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    exec->clearException();
1257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1258563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
1259563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1260563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
12610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::addValueToArray(NSMutableArray *array, ExecState* exec, JSValue value)
12625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
12630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
12645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (value.isString()) {
12665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithInt:StringValueType]];
1267dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        [array addObject:ustringToString(value.toString(exec))];
12685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else if (value.isNumber()) {
12695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithInt:DoubleValueType]];
12705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithDouble:value.toNumber(exec)]];
12715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else if (value.isBoolean()) {
12725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithInt:BoolValueType]];
12735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithBool:value.toBoolean(exec)]];
12745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else if (value.isNull())
12755ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithInt:NullValueType]];
12765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    else if (value.isObject()) {
12775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        JSObject* object = asObject(value);
1278dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (object->classInfo() == &ProxyRuntimeObject::s_info) {
1279dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            ProxyRuntimeObject* runtimeObject = static_cast<ProxyRuntimeObject*>(object);
1280dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (ProxyInstance* instance = runtimeObject->getInternalProxyInstance()) {
1281563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                [array addObject:[NSNumber numberWithInt:NPObjectValueType]];
1282563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark                [array addObject:[NSNumber numberWithInt:instance->objectID()]];
1283563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            }
12845ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        } else {
12855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            [array addObject:[NSNumber numberWithInt:JSObjectValueType]];
128681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            [array addObject:[NSNumber numberWithInt:m_localObjects.idForObject(exec->globalData(), object)]];
12875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
12885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    } else
12895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        [array addObject:[NSNumber numberWithInt:VoidValueType]];
12905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
12915ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::marshalValue(ExecState* exec, JSValue value, data_t& resultData, mach_msg_type_number_t& resultLength)
12935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
12945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSMutableArray*> array(AdoptNS, [[NSMutableArray alloc] init]);
12955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    addValueToArray(array.get(), exec, value);
12975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
12985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSData *> data = [NSPropertyListSerialization dataFromPropertyList:array.get() format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
12995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(data);
13005ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    resultLength = [data.get() length];
13025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    mig_allocate(reinterpret_cast<vm_address_t*>(&resultData), resultLength);
13035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    memcpy(resultData, [data.get() bytes], resultLength);
13055ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
13065ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13075ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkRetainPtr<NSData *> NetscapePluginInstanceProxy::marshalValues(ExecState* exec, const ArgList& args)
13085ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
13095ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSMutableArray*> array(AdoptNS, [[NSMutableArray alloc] init]);
13105ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13115ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    for (unsigned i = 0; i < args.size(); i++)
13120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        addValueToArray(array.get(), exec, args.at(i));
13135ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13145ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSData *> data = [NSPropertyListSerialization dataFromPropertyList:array.get() format:NSPropertyListBinaryFormat_v1_0 errorDescription:0];
13155ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT(data);
13165ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13175ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return data;
13185ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
13195ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::demarshalValueFromArray(ExecState* exec, NSArray *array, NSUInteger& index, JSValue& result)
13215ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
13225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (index == [array count])
13235ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return false;
13245ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13255ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    int type = [[array objectAtIndex:index++] intValue];
13265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    switch (type) {
13275ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case VoidValueType:
13285ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            result = jsUndefined();
13295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case NullValueType:
13315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            result = jsNull();
13325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case BoolValueType:
13345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            result = jsBoolean([[array objectAtIndex:index++] boolValue]);
13355ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case DoubleValueType:
1337e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = jsNumber([[array objectAtIndex:index++] doubleValue]);
13385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13395ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case StringValueType: {
13405ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            NSString *string = [array objectAtIndex:index++];
13415ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13425ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            result = jsString(exec, String(string));
13435ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13445ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
13455ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case JSObjectValueType: {
13465ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            uint32_t objectID = [[array objectAtIndex:index++] intValue];
13475ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1348692e5dbf12901edacf14812a6fae25462920af42Steve Block            result = m_localObjects.get(objectID);
13495ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            ASSERT(result);
13505ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13515ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
13525ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        case NPObjectValueType: {
13535ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            uint32_t objectID = [[array objectAtIndex:index++] intValue];
13545ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13555ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            Frame* frame = core([m_pluginView webFrame]);
13565ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if (!frame)
13575ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return false;
13585ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1359dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (!frame->script()->canExecuteScripts(NotAboutToExecuteScript))
13605ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return false;
13615ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13625ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            RefPtr<RootObject> rootObject = frame->script()->createRootObject(m_pluginView);
13635ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            if (!rootObject)
13645ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                return false;
13655ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13665ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            result = ProxyInstance::create(rootObject.release(), this, objectID)->createRuntimeObject(exec);
13675ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return true;
13685ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        }
13695ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        default:
13705ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            ASSERT_NOT_REACHED();
13715ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark            return false;
13725ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    }
13735ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
13745ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochJSValue NetscapePluginInstanceProxy::demarshalValue(ExecState* exec, const char* valueData, mach_msg_type_number_t valueLength)
13765ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
13775ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSData*> data(AdoptNS, [[NSData alloc] initWithBytesNoCopy:(void*)valueData length:valueLength freeWhenDone:NO]);
13785ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13795ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSArray*> array = [NSPropertyListSerialization propertyListFromData:data.get()
13805ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                 mutabilityOption:NSPropertyListImmutable
13815ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                           format:0
13825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                 errorDescription:0];
13835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSUInteger position = 0;
13840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value;
13855ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    bool result = demarshalValueFromArray(exec, array.get(), position, value);
13865ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    ASSERT_UNUSED(result, result);
13875ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13885ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return value;
13895ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
13905ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::demarshalValues(ExecState* exec, data_t valuesData, mach_msg_type_number_t valuesLength, MarkedArgumentBuffer& result)
13925ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
13935ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSData*> data(AdoptNS, [[NSData alloc] initWithBytesNoCopy:valuesData length:valuesLength freeWhenDone:NO]);
13945ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
13955ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    RetainPtr<NSArray*> array = [NSPropertyListSerialization propertyListFromData:data.get()
13965ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                 mutabilityOption:NSPropertyListImmutable
13975ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                           format:0
13985ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark                                                                 errorDescription:0];
13995ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    NSUInteger position = 0;
14000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue value;
14015ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    while (demarshalValueFromArray(exec, array.get(), position, value))
14025ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        result.append(value);
14035ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
14045ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1405692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid NetscapePluginInstanceProxy::retainLocalObject(JSC::JSValue value)
1406692e5dbf12901edacf14812a6fae25462920af42Steve Block{
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!value.isObject() || value.inherits(&ProxyRuntimeObject::s_info))
1408692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
1409692e5dbf12901edacf14812a6fae25462920af42Steve Block
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_localObjects.retain(asObject(value));
1411692e5dbf12901edacf14812a6fae25462920af42Steve Block}
1412692e5dbf12901edacf14812a6fae25462920af42Steve Block
1413692e5dbf12901edacf14812a6fae25462920af42Steve Blockvoid NetscapePluginInstanceProxy::releaseLocalObject(JSC::JSValue value)
1414692e5dbf12901edacf14812a6fae25462920af42Steve Block{
1415dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (!value.isObject() || value.inherits(&ProxyRuntimeObject::s_info))
1416692e5dbf12901edacf14812a6fae25462920af42Steve Block        return;
1417692e5dbf12901edacf14812a6fae25462920af42Steve Block
1418dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_localObjects.release(asObject(value));
1419692e5dbf12901edacf14812a6fae25462920af42Steve Block}
1420692e5dbf12901edacf14812a6fae25462920af42Steve Block
14215ec837f49e9c57d4394ce64b853fd86269c8b340Cary ClarkPassRefPtr<Instance> NetscapePluginInstanceProxy::createBindingsInstance(PassRefPtr<RootObject> rootObject)
14225ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark{
1423563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    uint32_t requestID = nextRequestID();
1424563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1425563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (_WKPHGetScriptableNPObject(m_pluginHostProxy->port(), m_pluginID, requestID) != KERN_SUCCESS)
14265ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return 0;
1427d0825bca7fe65beaee391d30da42e937db621564Steve Block
1428563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    auto_ptr<GetScriptableNPObjectReply> reply = waitForReply<GetScriptableNPObjectReply>(requestID);
14295ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!reply.get())
14305ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return 0;
14315ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
14325ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    if (!reply->m_objectID)
14335ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark        return 0;
14345ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1435dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Since the reply was non-null, "this" is still a valid pointer.
14365ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark    return ProxyInstance::create(rootObject, this, reply->m_objectID);
14375ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark}
14385ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1439563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::addInstance(ProxyInstance* instance)
1440563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1441563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!m_instances.contains(instance));
1442563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1443563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_instances.add(instance);
1444563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1445563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1446563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::removeInstance(ProxyInstance* instance)
1447563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1448563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_instances.contains(instance));
1449563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1450563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_instances.remove(instance);
1451563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1452563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1453563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::willCallPluginFunction()
1454563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1455563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_pluginFunctionCallDepth++;
1456563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1457563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
145828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid NetscapePluginInstanceProxy::didCallPluginFunction(bool& stopped)
1459563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1460563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_pluginFunctionCallDepth > 0);
1461563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    m_pluginFunctionCallDepth--;
1462563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1463563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // If -stop was called while we were calling into a plug-in function, and we're no longer
1464563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // inside a plug-in function, stop now.
1465563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!m_pluginFunctionCallDepth && m_shouldStopSoon) {
1466563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m_shouldStopSoon = false;
1467563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        [m_pluginView stop];
146828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu        stopped = true;
1469563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1470563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1471563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1472563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkbool NetscapePluginInstanceProxy::shouldStop()
1473563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1474563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (m_pluginFunctionCallDepth) {
1475563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        m_shouldStopSoon = true;
1476563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
1477563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1478563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1479563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
1480563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1481563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1482563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuint32_t NetscapePluginInstanceProxy::nextRequestID()
1483563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1484563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    uint32_t requestID = ++m_currentRequestID;
1485563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1486563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // We don't want to return the HashMap empty/deleted "special keys"
1487563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (requestID == 0 || requestID == static_cast<uint32_t>(-1))
1488563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return nextRequestID();
1489563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1490563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return requestID;
1491563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
1492563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1493563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkvoid NetscapePluginInstanceProxy::invalidateRect(double x, double y, double width, double height)
1494563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
1495563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(m_pluginView);
1496563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1497231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_pluginIsWaitingForDraw = true;
14980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [m_pluginView invalidatePluginContentRect:NSMakeRect(x, y, width, height)];
1499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
15000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1501231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid NetscapePluginInstanceProxy::didDraw()
1502231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
1503231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_pluginIsWaitingForDraw)
1504231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        return;
1505231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1506231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_pluginIsWaitingForDraw = false;
1507231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    _WKPHPluginInstanceDidDraw(m_pluginHostProxy->port(), m_pluginID);
1508231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
1509231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
15100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::getCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t& cookiesData, mach_msg_type_number_t& cookiesLength)
15110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
15120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_pluginView);
15130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSURL *url = [m_pluginView URLWithCString:urlData];
15150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!url)
15160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
15170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* frame = core([m_pluginView webFrame])) {
15190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        String cookieString = cookies(frame->document(), url);
1520dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        WTF::CString cookieStringUTF8 = cookieString.utf8();
15210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (cookieStringUTF8.isNull())
15220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
15230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        cookiesLength = cookieStringUTF8.length();
15250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        mig_allocate(reinterpret_cast<vm_address_t*>(&cookiesData), cookiesLength);
15260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        memcpy(cookiesData, cookieStringUTF8.data(), cookiesLength);
15270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
15290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
15300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;
15320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
15330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::setCookies(data_t urlData, mach_msg_type_number_t urlLength, data_t cookiesData, mach_msg_type_number_t cookiesLength)
15350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
15360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_pluginView);
15370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSURL *url = [m_pluginView URLWithCString:urlData];
15390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!url)
15400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
15410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (Frame* frame = core([m_pluginView webFrame])) {
15430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        String cookieString = String::fromUTF8(cookiesData, cookiesLength);
15440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!cookieString)
15450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return false;
15460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        WebCore::setCookies(frame->document(), url, cookieString);
15480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return true;
15490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
15500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return false;
15520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
15530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::getProxy(data_t urlData, mach_msg_type_number_t urlLength, data_t& proxyData, mach_msg_type_number_t& proxyLength)
15550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
15560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_pluginView);
1557563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
15580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSURL *url = [m_pluginView URLWithCString:urlData];
15590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!url)
15600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
15610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1562a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Vector<ProxyServer> proxyServers = proxyServersForURL(url, 0);
1563a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    WTF::CString proxyStringUTF8 = toString(proxyServers).utf8();
15640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    proxyLength = proxyStringUTF8.length();
15660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    mig_allocate(reinterpret_cast<vm_address_t*>(&proxyData), proxyLength);
15670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    memcpy(proxyData, proxyStringUTF8.data(), proxyLength);
15680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
15700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
15710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::getAuthenticationInfo(data_t protocolData, data_t hostData, uint32_t port, data_t schemeData, data_t realmData,
15730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                        data_t& usernameData, mach_msg_type_number_t& usernameLength, data_t& passwordData, mach_msg_type_number_t& passwordLength)
15740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1575dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WTF::CString username;
1576dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WTF::CString password;
15770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (!WebKit::getAuthenticationInfo(protocolData, hostData, port, schemeData, realmData, username, password))
15790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return false;
15800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    usernameLength = username.length();
15820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    mig_allocate(reinterpret_cast<vm_address_t*>(&usernameData), usernameLength);
15830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    memcpy(usernameData, username.data(), usernameLength);
15840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    passwordLength = password.length();
15860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    mig_allocate(reinterpret_cast<vm_address_t*>(&passwordData), passwordLength);
15870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    memcpy(passwordData, password.data(), passwordLength);
15880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
15900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
15910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool NetscapePluginInstanceProxy::convertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace,
15930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                               double& destX, double& destY, NPCoordinateSpace destSpace)
15940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
15950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_pluginView);
15960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
15970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [m_pluginView convertFromX:sourceX andY:sourceY space:sourceSpace toX:&destX andY:&destY space:destSpace];
15980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
15990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochuint32_t NetscapePluginInstanceProxy::checkIfAllowedToLoadURL(const char* url, const char* target)
16010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
16020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    uint32_t checkID;
16030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Assign a check ID
16050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    do {
16060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        checkID = ++m_urlCheckCounter;
16070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } while (m_urlChecks.contains(checkID) || !m_urlCheckCounter);
16080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSString *frameName = target ? [NSString stringWithCString:target encoding:NSISOLatin1StringEncoding] : nil;
16100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    NSNumber *contextInfo = [[NSNumber alloc] initWithUnsignedInt:checkID];
16120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebPluginContainerCheck *check = [WebPluginContainerCheck checkWithRequest:[m_pluginView requestWithURLCString:url]
16130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                                        target:frameName
16140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                                  resultObject:m_pluginView
16150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                                      selector:@selector(_containerCheckResult:contextInfo:)
16160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                                    controller:m_pluginView
16170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                                   contextInfo:contextInfo];
16180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [contextInfo release];
16200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_urlChecks.set(checkID, check);
16210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [check start];
16220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return checkID;
16240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
16250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::cancelCheckIfAllowedToLoadURL(uint32_t checkID)
16270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
16280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    URLCheckMap::iterator it = m_urlChecks.find(checkID);
16290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (it == m_urlChecks.end())
16300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return;
16310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    WebPluginContainerCheck *check = it->second.get();
16330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    [check cancel];
16340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_urlChecks.remove(it);
16350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
16360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::checkIfAllowedToLoadURLResult(uint32_t checkID, bool allowed)
16380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
16390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    _WKPHCheckIfAllowedToLoadURLResult(m_pluginHostProxy->port(), m_pluginID, checkID, allowed);
16400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
16410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid NetscapePluginInstanceProxy::resolveURL(const char* url, const char* target, data_t& resolvedURLData, mach_msg_type_number_t& resolvedURLLength)
16430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
16440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ASSERT(m_pluginView);
16450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    WTF::CString resolvedURL = [m_pluginView resolvedURLStringForURL:url target:target];
16470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
16480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    resolvedURLLength = resolvedURL.length();
16490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    mig_allocate(reinterpret_cast<vm_address_t*>(&resolvedURLData), resolvedURLLength);
16500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    memcpy(resolvedURLData, resolvedURL.data(), resolvedURLLength);
16510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1652563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1653cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid NetscapePluginInstanceProxy::privateBrowsingModeDidChange(bool isPrivateBrowsingEnabled)
1654cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
1655cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    _WKPHPluginInstancePrivateBrowsingModeDidChange(m_pluginHostProxy->port(), m_pluginID, isPrivateBrowsingEnabled);
1656cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
1657cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
16588a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockstatic String& globalExceptionString()
16598a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
16608a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    DEFINE_STATIC_LOCAL(String, exceptionString, ());
16618a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    return exceptionString;
16628a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
16638a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
16648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid NetscapePluginInstanceProxy::setGlobalException(const String& exception)
16658a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
16668a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    globalExceptionString() = exception;
16678a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
16688a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
16698a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Blockvoid NetscapePluginInstanceProxy::moveGlobalExceptionToExecState(ExecState* exec)
16708a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block{
16718a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    if (globalExceptionString().isNull())
16728a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        return;
16738a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
16748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    {
16758a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        JSLock lock(SilenceAssertionsOnly);
1676545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        throwError(exec, createError(exec, stringToUString(globalExceptionString())));
16778a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    }
16788a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
1679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    globalExceptionString() = String();
16808a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block}
16818a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block
16825ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark} // namespace WebKit
16835ec837f49e9c57d4394ce64b853fd86269c8b340Cary Clark
1684e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#endif // USE(PLUGIN_HOST_PROCESS) && ENABLE(NETSCAPE_PLUGIN_API)
1685