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