15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 33197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8NPObject.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/NPV8Object.h" 36197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8Binding.h" 37f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "bindings/core/v8/V8HTMLAppletElement.h" 38f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "bindings/core/v8/V8HTMLEmbedElement.h" 39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "bindings/core/v8/V8HTMLObjectElement.h" 40197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8NPUtils.h" 41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8ObjectConstructor.h" 42197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/V8PersistentValueMap.h" 43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/npruntime_impl.h" 44197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/npruntime_priv.h" 4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLPlugInElement.h" 466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "v8-util.h" 471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "wtf/OwnPtr.h" 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum InvokeFunctionType { 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvokeMethod = 1, 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvokeConstruct = 2, 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InvokeDefault = 3 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)struct IdentifierRep { 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int number() const { return m_isString ? 0 : m_value.m_number; } 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char* string() const { return m_isString ? m_value.m_string : 0; } 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) union { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char* m_string; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_number; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } m_value; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_isString; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: need comments. 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Params: holder could be HTMLEmbedElement or NPObject 7019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void npObjectInvokeImpl(const v8::FunctionCallbackInfo<v8::Value>& info, InvokeFunctionType functionId) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject; 73d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) v8::Isolate* isolate = info.GetIsolate(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // These three types are subtypes of HTMLPlugInElement. 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HTMLPlugInElement* element = V8HTMLAppletElement::toImplWithTypeCheck(isolate, info.Holder()); 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!element) { 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci element = V8HTMLEmbedElement::toImplWithTypeCheck(isolate, info.Holder()); 79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!element) { 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci element = V8HTMLObjectElement::toImplWithTypeCheck(isolate, info.Holder()); 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (element) { 841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (RefPtr<SharedPersistent<v8::Object> > wrapper = element->pluginWrapper()) { 8593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) v8::HandleScope handleScope(isolate); 861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) npObject = v8ObjectToNPObject(wrapper->newLocal(isolate)); 87197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } else { 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) npObject = 0; 89197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The holder object is not a subtype of HTMLPlugInElement, it must be an NPObject which has three 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // internal fields. 9319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.Holder()->InternalFieldCount() != npObjectInternalFieldCount) { 94c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) V8ThrowException::throwReferenceError("NPMethod called on non-NPObject", info.GetIsolate()); 955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) npObject = v8ObjectToNPObject(info.Holder()); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Verify that our wrapper wasn't using a NPObject which has already been deleted. 1025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!npObject || !_NPN_IsAlive(npObject)) { 103c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) V8ThrowException::throwReferenceError("NPObject deleted", isolate); 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Wrap up parameters. 10819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) int numArgs = info.Length(); 1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) OwnPtr<NPVariant[]> npArgs = adoptArrayPtr(new NPVariant[numArgs]); 110e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < numArgs; i++) 112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) convertV8ObjectToNPVariant(info[i], npObject, &npArgs[i], isolate); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant result; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VOID_TO_NPVARIANT(result); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool retval = true; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (functionId) { 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case InvokeMethod: 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->invoke) { 12119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8::Handle<v8::String> functionName = v8::Handle<v8::String>::Cast(info.Data()); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(functionName); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retval = npObject->_class->invoke(npObject, identifier, npArgs.get(), numArgs, &result); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case InvokeConstruct: 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->construct) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retval = npObject->_class->construct(npObject, npArgs.get(), numArgs, &result); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case InvokeDefault: 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->invokeDefault) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) retval = npObject->_class->invokeDefault(npObject, npArgs.get(), numArgs, &result); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!retval) 139c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) V8ThrowException::throwGeneralError("Error calling method on NPObject.", isolate); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < numArgs; i++) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseVariantValue(&npArgs[i]); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unwrap return values. 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Value> returnValue; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (_NPN_IsAlive(npObject)) 147d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) returnValue = convertNPVariantToV8Object(&result, npObject, isolate); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseVariantValue(&result); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) v8SetReturnValue(info, returnValue); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void npObjectMethodHandler(const v8::FunctionCallbackInfo<v8::Value>& info) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) return npObjectInvokeImpl(info, InvokeMethod); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void npObjectInvokeDefaultHandler(const v8::FunctionCallbackInfo<v8::Value>& info) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) if (info.IsConstructCall()) { 16319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) npObjectInvokeImpl(info, InvokeConstruct); 1645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return; 1655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) npObjectInvokeImpl(info, InvokeDefault); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1706f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochclass V8TemplateMapTraits : public V8PersistentValueMapTraits<PrivateIdentifier*, v8::FunctionTemplate, true> { 1716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochpublic: 1726f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef v8::PersistentValueMap<PrivateIdentifier*, v8::FunctionTemplate, V8TemplateMapTraits> MapType; 1736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef PrivateIdentifier WeakCallbackDataType; 1746f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static WeakCallbackDataType* WeakCallbackParameter(MapType* map, PrivateIdentifier* key, const v8::Local<v8::FunctionTemplate>& value) 1766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 1776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return key; 1786f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 1796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static void DisposeCallbackData(WeakCallbackDataType* callbackData) { } 1816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1826f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static MapType* MapFromWeakCallbackData( 1836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch const v8::WeakCallbackData<v8::FunctionTemplate, WeakCallbackDataType>&); 1846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static PrivateIdentifier* KeyFromWeakCallbackData( 1866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch const v8::WeakCallbackData<v8::FunctionTemplate, WeakCallbackDataType>& data) 1876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch { 1886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return data.GetParameter(); 1896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch } 1906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // Dispose traits: 1926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch static void Dispose(v8::Isolate* isolate, v8::UniquePersistent<v8::FunctionTemplate> value, PrivateIdentifier* key) { } 1936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}; 1946f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1956f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 19653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class V8NPTemplateMap { 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NPIdentifier is PrivateIdentifier*. 1996f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch typedef v8::PersistentValueMap<PrivateIdentifier*, v8::FunctionTemplate, V8TemplateMapTraits> MapType; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch v8::Local<v8::FunctionTemplate> get(PrivateIdentifier* key) 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2036f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return m_map.Get(key); 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) void set(PrivateIdentifier* key, v8::Handle<v8::FunctionTemplate> handle) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ASSERT(!m_map.Contains(key)); 2096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch m_map.Set(key, handle); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) static V8NPTemplateMap& sharedInstance(v8::Isolate* isolate) 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) DEFINE_STATIC_LOCAL(V8NPTemplateMap, map, (isolate)); 2156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch ASSERT(isolate == map.m_map.GetIsolate()); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return map; 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2196f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch friend class V8TemplateMapTraits; 2206f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit V8NPTemplateMap(v8::Isolate* isolate) 2236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch : m_map(isolate) 22493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) { 22593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) } 22693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) MapType m_map; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2306f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochV8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackData(const v8::WeakCallbackData<v8::FunctionTemplate, WeakCallbackDataType>& data) 2316f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 2326f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch return &V8NPTemplateMap::sharedInstance(data.GetIsolate()).m_map; 2336f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch} 2346f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 2356f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static v8::Handle<v8::Value> npObjectGetProperty(v8::Local<v8::Object> self, NPIdentifier identifier, v8::Local<v8::Value> key, v8::Isolate* isolate) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject = v8ObjectToNPObject(self); 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Verify that our wrapper wasn't using a NPObject which 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has already been deleted. 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!npObject || !_NPN_IsAlive(npObject)) 243c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return V8ThrowException::throwReferenceError("NPObject deleted", isolate); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->hasProperty && npObject->_class->getProperty && npObject->_class->hasProperty(npObject, identifier)) { 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!_NPN_IsAlive(npObject)) 248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return V8ThrowException::throwReferenceError("NPObject deleted", isolate); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant result; 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VOID_TO_NPVARIANT(result); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!npObject->_class->getProperty(npObject, identifier, &result)) 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return v8Undefined(); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8::Handle<v8::Value> returnValue; 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (_NPN_IsAlive(npObject)) 257e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch returnValue = convertNPVariantToV8Object(&result, npObject, isolate); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseVariantValue(&result); 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return returnValue; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!_NPN_IsAlive(npObject)) 264c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return V8ThrowException::throwReferenceError("NPObject deleted", isolate); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (key->IsString() && npObject->_class->hasMethod && npObject->_class->hasMethod(npObject, identifier)) { 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!_NPN_IsAlive(npObject)) 268c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return V8ThrowException::throwReferenceError("NPObject deleted", isolate); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PrivateIdentifier* id = static_cast<PrivateIdentifier*>(identifier); 2716f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch v8::Local<v8::FunctionTemplate> functionTemplate = V8NPTemplateMap::sharedInstance(isolate).get(id); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Cache templates using identifier as the key. 2736f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch if (functionTemplate.IsEmpty()) { 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create a new template. 2756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch functionTemplate = v8::FunctionTemplate::New(isolate); 2766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch functionTemplate->SetCallHandler(npObjectMethodHandler, key); 2776f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch V8NPTemplateMap::sharedInstance(isolate).set(id, functionTemplate); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch v8::Local<v8::Function> v8Function = functionTemplate->GetFunction(); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) v8Function->SetName(v8::Handle<v8::String>::Cast(key)); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return v8Function; 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return v8Undefined(); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 287521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectNamedPropertyGetter(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(name); 290521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate())); 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 293521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectIndexedPropertyGetter(uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = _NPN_GetIntIdentifier(index); 2968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v8SetReturnValue(info, npObjectGetProperty(info.Holder(), identifier, v8::Number::New(info.GetIsolate(), index), info.GetIsolate())); 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 299521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectGetNamedProperty(v8::Local<v8::Object> self, v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Value>& info) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(name); 302521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectGetProperty(self, identifier, name, info.GetIsolate())); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectGetIndexedProperty(v8::Local<v8::Object> self, uint32_t index, const v8::PropertyCallbackInfo<v8::Value>& info) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = _NPN_GetIntIdentifier(index); 3088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v8SetReturnValue(info, npObjectGetProperty(self, identifier, v8::Number::New(info.GetIsolate(), index), info.GetIsolate())); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 311521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectQueryProperty(v8::Local<v8::String> name, const v8::PropertyCallbackInfo<v8::Integer>& info) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(name); 314521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) if (npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate()).IsEmpty()) 315521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 316521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValueInt(info, 0); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static v8::Handle<v8::Value> npObjectSetProperty(v8::Local<v8::Object> self, NPIdentifier identifier, v8::Local<v8::Value> value, v8::Isolate* isolate) 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject = v8ObjectToNPObject(self); 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Verify that our wrapper wasn't using a NPObject which has already been deleted. 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!npObject || !_NPN_IsAlive(npObject)) { 325c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) V8ThrowException::throwReferenceError("NPObject deleted", isolate); 326197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return value; // Intercepted, but an exception was thrown. 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->hasProperty && npObject->_class->setProperty && npObject->_class->hasProperty(npObject, identifier)) { 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!_NPN_IsAlive(npObject)) 331c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return V8ThrowException::throwReferenceError("NPObject deleted", isolate); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPVariant npValue; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) VOID_TO_NPVARIANT(npValue); 3359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) convertV8ObjectToNPVariant(value, npObject, &npValue, isolate); 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool success = npObject->_class->setProperty(npObject, identifier, &npValue); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseVariantValue(&npValue); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (success) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; // Intercept the call. 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return v8Undefined(); 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectNamedPropertySetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(name); 348521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectSetProperty(info.Holder(), identifier, value, info.GetIsolate())); 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 352521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectIndexedPropertySetter(uint32_t index, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = _NPN_GetIntIdentifier(index); 355521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectSetProperty(info.Holder(), identifier, value, info.GetIsolate())); 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 358521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectSetNamedProperty(v8::Local<v8::Object> self, v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = getStringIdentifier(name); 361521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectSetProperty(self, identifier, value, info.GetIsolate())); 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 364521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectSetIndexedProperty(v8::Local<v8::Object> self, uint32_t index, v8::Local<v8::Value> value, const v8::PropertyCallbackInfo<v8::Value>& info) 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier identifier = _NPN_GetIntIdentifier(index); 367521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, npObjectSetProperty(self, identifier, value, info.GetIsolate())); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 370521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info, bool namedProperty) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPObject* npObject = v8ObjectToNPObject(info.Holder()); 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Verify that our wrapper wasn't using a NPObject which 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has already been deleted. 376e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!npObject || !_NPN_IsAlive(npObject)) { 377c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) V8ThrowException::throwReferenceError("NPObject deleted", info.GetIsolate()); 378e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return; 379e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class->enumerate) { 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t count; 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NPIdentifier* identifiers; 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObject->_class->enumerate(npObject, &identifiers, &count)) { 38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) uint32_t propertiesCount = 0; 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (uint32_t i = 0; i < count; ++i) { 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IdentifierRep* identifier = static_cast<IdentifierRep*>(identifiers[i]); 38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (namedProperty == identifier->m_isString) 38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ++propertiesCount; 39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) v8::Handle<v8::Array> properties = v8::Array::New(info.GetIsolate(), propertiesCount); 39209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (uint32_t i = 0, propertyIndex = 0; i < count; ++i) { 39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) IdentifierRep* identifier = static_cast<IdentifierRep*>(identifiers[i]); 39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (namedProperty == identifier->m_isString) { 39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(propertyIndex < propertiesCount); 39609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (namedProperty) 39709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) properties->Set(v8::Integer::New(info.GetIsolate(), propertyIndex++), v8AtomicString(info.GetIsolate(), identifier->string())); 39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) else 39909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) properties->Set(v8::Integer::New(info.GetIsolate(), propertyIndex++), v8::Integer::New(info.GetIsolate(), identifier->number())); 40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 403521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) v8SetReturnValue(info, properties); 404521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return; 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 409521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectNamedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 411521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) npObjectPropertyEnumerator(info, true); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 414521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void npObjectIndexedPropertyEnumerator(const v8::PropertyCallbackInfo<v8::Array>& info) 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 416521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) npObjectPropertyEnumerator(info, false); 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static DOMWrapperMap<NPObject>& staticNPObjectMap() 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) DEFINE_STATIC_LOCAL(DOMWrapperMap<NPObject>, npObjectMap, (v8::Isolate::GetCurrent())); 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return npObjectMap; 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochtemplate <> 426a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochinline void DOMWrapperMap<NPObject>::PersistentValueMapTraits::Dispose( 427a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch v8::Isolate* isolate, 428a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch v8::UniquePersistent<v8::Object> value, 429a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch NPObject* npObject) 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(npObject); 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (_NPN_IsAlive(npObject)) 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseObject(npObject); 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)v8::Local<v8::Object> createV8ObjectForNPObject(NPObject* object, NPObject* root, v8::Isolate* isolate) 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) static v8::Eternal<v8::FunctionTemplate> npObjectDesc; 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 440a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ASSERT(isolate->InContext()); 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If this is a v8 object, just return it. 443591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch V8NPObject* v8NPObject = npObjectToV8NPObject(object); 444591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (v8NPObject) 4455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return v8::Local<v8::Object>::New(isolate, v8NPObject->v8Object); 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we've already wrapped this object, just return it. 448e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::Handle<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolate); 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!wrapper.IsEmpty()) 450e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return wrapper; 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: we should create a Wrapper type as a subclass of JSObject. It has two internal fields, field 0 is the wrapped 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // pointer, and field 1 is the type. There should be an api function that returns unused type id. The same Wrapper type 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // can be used by DOM bindings. 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (npObjectDesc.IsEmpty()) { 456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 4575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) templ->InstanceTemplate()->SetInternalFieldCount(npObjectInternalFieldCount); 4585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) templ->InstanceTemplate()->SetNamedPropertyHandler(npObjectNamedPropertyGetter, npObjectNamedPropertySetter, npObjectQueryProperty, 0, npObjectNamedPropertyEnumerator); 4595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) templ->InstanceTemplate()->SetIndexedPropertyHandler(npObjectIndexedPropertyGetter, npObjectIndexedPropertySetter, 0, 0, npObjectIndexedPropertyEnumerator); 4605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) templ->InstanceTemplate()->SetCallAsFunctionHandler(npObjectInvokeDefaultHandler); 4618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) npObjectDesc.Set(isolate, templ); 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // FIXME: Move staticNPObjectMap() to DOMDataStore. 465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Use V8DOMWrapper::createWrapper() and 466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // V8DOMWrapper::associateObjectWithWrapper() 467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // to create a wrapper object. 4688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) v8::Handle<v8::Function> v8Function = npObjectDesc.Get(isolate)->GetFunction(); 469a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch v8::Local<v8::Object> value = V8ObjectConstructor::newInstance(isolate, v8Function); 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (value.IsEmpty()) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci V8DOMWrapper::setNativeInfo(value, npObjectTypeInfo(), npObjectToScriptWrappableBase(object)); 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // KJS retains the object as part of its wrapper (see Bindings::CInstance). 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_RetainObject(object); 477e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch _NPN_RegisterObject(object, root); 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci staticNPObjectMap().set(object, value, npObjectTypeInfo()); 48009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT(V8DOMWrapper::isDOMWrapper(value)); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return value; 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void forgetV8ObjectForNPObject(NPObject* object) 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 48693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) v8::Isolate* isolate = v8::Isolate::GetCurrent(); 48793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) v8::HandleScope scope(isolate); 488e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) v8::Handle<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolate); 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!wrapper.IsEmpty()) { 490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) V8DOMWrapper::clearNativeInfo(wrapper, npObjectTypeInfo()); 49193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) staticNPObjectMap().removeAndDispose(object); 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _NPN_ReleaseObject(object); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 496c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 497