[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andersca at apple.com andersca at apple.com
Wed Dec 22 11:34:45 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 8f8a7d574675d6df3a6dc83757f740342fdb7e63
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Jul 29 19:31:06 2010 +0000

    Add JSNPObject::getConstructData
    https://bugs.webkit.org/show_bug.cgi?id=43165
    
    Reviewed by Sam Weinig.
    
    * WebProcess/Plugins/JSNPObject.cpp:
    (WebKit::JSNPObject::callMethod):
    Add a null check for m_npObject.
    
    (WebKit::JSNPObject::callConstructor):
    Call NPClass::construct.
    
    (WebKit::JSNPObject::getConstructData):
    Set up the construct data.
    
    (WebKit::JSNPObject::propertyGetter):
    convertNPVariantToJSValue now takes a JSGlobalObject as well.
    
    * WebProcess/Plugins/NPJSObject.cpp:
    (WebKit::NPJSObject::invoke):
    (WebKit::NPJSObject::invokeDefault):
    (WebKit::NPJSObject::construct):
    convertNPVariantToJSValue now takes a JSGlobalObject as well.
    
    * WebProcess/Plugins/NPJSObject.h:
    Make isNPJSObject and toNPJSObject public.
    
    * WebProcess/Plugins/NPRuntimeObjectMap.cpp:
    (WebKit::NPRuntimeObjectMap::convertNPVariantToJSValue):
    Convert NPObjects correctly.
    
    (WebKit::NPRuntimeObjectMap::globalObject):
    Get the globalObject from the frame.
    
    (WebKit::NPRuntimeObjectMap::globalExec):
    Call globalObject.
    
    * WebProcess/Plugins/NPRuntimeObjectMap.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64300 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 8f0c271..018453f 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -308,6 +308,47 @@
 
         Reviewed by Sam Weinig.
 
+        Add JSNPObject::getConstructData
+        https://bugs.webkit.org/show_bug.cgi?id=43165
+
+        * WebProcess/Plugins/JSNPObject.cpp:
+        (WebKit::JSNPObject::callMethod):
+        Add a null check for m_npObject.
+        
+        (WebKit::JSNPObject::callConstructor):
+        Call NPClass::construct.
+
+        (WebKit::JSNPObject::getConstructData):
+        Set up the construct data.
+
+        (WebKit::JSNPObject::propertyGetter):
+        convertNPVariantToJSValue now takes a JSGlobalObject as well.
+        
+        * WebProcess/Plugins/NPJSObject.cpp:
+        (WebKit::NPJSObject::invoke):
+        (WebKit::NPJSObject::invokeDefault):
+        (WebKit::NPJSObject::construct):
+        convertNPVariantToJSValue now takes a JSGlobalObject as well.
+        
+        * WebProcess/Plugins/NPJSObject.h:
+        Make isNPJSObject and toNPJSObject public.
+
+        * WebProcess/Plugins/NPRuntimeObjectMap.cpp:
+        (WebKit::NPRuntimeObjectMap::convertNPVariantToJSValue):
+        Convert NPObjects correctly.
+        
+        (WebKit::NPRuntimeObjectMap::globalObject):
+        Get the globalObject from the frame.
+
+        (WebKit::NPRuntimeObjectMap::globalExec):
+        Call globalObject.
+
+        * WebProcess/Plugins/NPRuntimeObjectMap.h:
+
+2010-07-28  Anders Carlsson  <andersca at apple.com>
+
+        Reviewed by Sam Weinig.
+
         Implement NPN_InvokeDefault and NPN_Construct
         https://bugs.webkit.org/show_bug.cgi?id=43160
 
diff --git a/WebKit2/WebProcess/Plugins/JSNPObject.cpp b/WebKit2/WebProcess/Plugins/JSNPObject.cpp
index 2296607..bafb54b 100644
--- a/WebKit2/WebProcess/Plugins/JSNPObject.cpp
+++ b/WebKit2/WebProcess/Plugins/JSNPObject.cpp
@@ -61,8 +61,8 @@ JSNPObject::~JSNPObject()
 
 JSValue JSNPObject::callMethod(ExecState* exec, NPIdentifier methodName)
 {
-    if (!m_npObject->_class->hasMethod(m_npObject, methodName))
-        return jsUndefined();
+    if (!m_npObject)
+        return throwInvalidAccessError(exec);
 
     size_t argumentCount = exec->argumentCount();
     Vector<NPVariant, 8> arguments(argumentCount);
@@ -90,11 +90,60 @@ JSValue JSNPObject::callMethod(ExecState* exec, NPIdentifier methodName)
     if (!returnValue)
         throwError(exec, createError(exec, "Error calling method on NPObject."));
 
-    JSValue propertyValue = m_objectMap->convertNPVariantToJSValue(exec, result);
+    JSValue propertyValue = m_objectMap->convertNPVariantToJSValue(exec, globalObject(), result);
     releaseNPVariantValue(&result);
     return propertyValue;
 }
 
+JSValue JSNPObject::callConstructor(ExecState* exec)
+{
+    if (!m_npObject)
+        return throwInvalidAccessError(exec);
+
+    size_t argumentCount = exec->argumentCount();
+    Vector<NPVariant, 8> arguments(argumentCount);
+
+    // Convert all arguments to NPVariants.
+    for (size_t i = 0; i < argumentCount; ++i)
+        m_objectMap->convertJSValueToNPVariant(exec, exec->argument(i), arguments[i]);
+
+    bool returnValue;
+    NPVariant result;
+    VOID_TO_NPVARIANT(result);
+    
+    {
+        JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
+        returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), argumentCount, &result);
+
+        // FIXME: Handle construct setting an exception.
+        // FIXME: Find out what happens if calling construct causes the plug-in to go away.
+    }
+
+    if (!returnValue)
+        throwError(exec, createError(exec, "Error calling method on NPObject."));
+    
+    JSValue value = m_objectMap->convertNPVariantToJSValue(exec, globalObject(), result);
+    releaseNPVariantValue(&result);
+    return value;
+}
+
+static EncodedJSValue JSC_HOST_CALL constructWithConstructor(ExecState* exec)
+{
+    JSObject* constructor = exec->callee();
+    ASSERT(constructor->inherits(&JSNPObject::s_info));
+
+    return JSValue::encode(static_cast<JSNPObject*>(constructor)->callConstructor(exec));
+}
+
+ConstructType JSNPObject::getConstructData(ConstructData& constructData)
+{
+    if (!m_npObject || !m_npObject->_class->construct)
+        return ConstructTypeNone;
+
+    constructData.native.function = constructWithConstructor;
+    return ConstructTypeHost;
+}
+
 bool JSNPObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
 {
     if (!m_npObject) {
@@ -204,7 +253,7 @@ JSValue JSNPObject::propertyGetter(ExecState* exec, JSValue slotBase, const Iden
     if (!returnValue)
         return jsUndefined();
 
-    JSValue propertyValue = thisObj->m_objectMap->convertNPVariantToJSValue(exec, result);
+    JSValue propertyValue = thisObj->m_objectMap->convertNPVariantToJSValue(exec, thisObj->globalObject(), result);
     releaseNPVariantValue(&result);
     return propertyValue;
 }
diff --git a/WebKit2/WebProcess/Plugins/JSNPObject.h b/WebKit2/WebProcess/Plugins/JSNPObject.h
index 1345abb..9c9dba0 100644
--- a/WebKit2/WebProcess/Plugins/JSNPObject.h
+++ b/WebKit2/WebProcess/Plugins/JSNPObject.h
@@ -43,6 +43,7 @@ public:
     ~JSNPObject();
 
     JSC::JSValue callMethod(JSC::ExecState*, NPIdentifier methodName);
+    JSC::JSValue callConstructor(JSC::ExecState*);
 
     static const JSC::ClassInfo s_info;
 
@@ -54,6 +55,8 @@ private:
         return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), AnonymousSlotCount);
     }
 
+    virtual JSC::ConstructType getConstructData(JSC::ConstructData&);
+
     virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&);
     virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
     virtual void put(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&);
diff --git a/WebKit2/WebProcess/Plugins/NPJSObject.cpp b/WebKit2/WebProcess/Plugins/NPJSObject.cpp
index 46aeb79..2eadfbc 100644
--- a/WebKit2/WebProcess/Plugins/NPJSObject.cpp
+++ b/WebKit2/WebProcess/Plugins/NPJSObject.cpp
@@ -116,7 +116,7 @@ bool NPJSObject::invoke(NPIdentifier methodName, const NPVariant* arguments, uin
     JSLock lock(SilenceAssertionsOnly);
 
     JSValue function = m_jsObject->get(exec, identifierFromIdentifierRep(exec, identifierRep));
-    return invoke(exec, function, arguments, argumentCount, result);
+    return invoke(exec, m_objectMap->globalObject(), function, arguments, argumentCount, result);
 }
 
 bool NPJSObject::invokeDefault(const NPVariant *arguments, uint32_t argumentCount, NPVariant *result)
@@ -128,7 +128,7 @@ bool NPJSObject::invokeDefault(const NPVariant *arguments, uint32_t argumentCoun
     JSLock lock(SilenceAssertionsOnly);
 
     JSValue function = m_jsObject;
-    return invoke(exec, function, arguments, argumentCount, result);
+    return invoke(exec, m_objectMap->globalObject(), function, arguments, argumentCount, result);
 }
 
 bool NPJSObject::hasProperty(NPIdentifier identifier)
@@ -187,7 +187,7 @@ bool NPJSObject::construct(const NPVariant *arguments, uint32_t argumentCount, N
     // Convert the passed in arguments.
     MarkedArgumentBuffer argumentList;
     for (uint32_t i = 0; i < argumentCount; ++i)
-        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, arguments[i]));
+        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, m_objectMap->globalObject(), arguments[i]));
 
     exec->globalData().timeoutChecker.start();
     JSValue value = JSC::construct(exec, m_jsObject, constructType, constructData, argumentList);
@@ -200,7 +200,7 @@ bool NPJSObject::construct(const NPVariant *arguments, uint32_t argumentCount, N
     return true;
 }
 
-bool NPJSObject::invoke(ExecState* exec, JSValue function, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
+bool NPJSObject::invoke(ExecState* exec, JSGlobalObject* globalObject, JSValue function, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
 {
     CallData callData;
     CallType callType = getCallData(function, callData);
@@ -210,7 +210,7 @@ bool NPJSObject::invoke(ExecState* exec, JSValue function, const NPVariant* argu
     // Convert the passed in arguments.
     MarkedArgumentBuffer argumentList;
     for (uint32_t i = 0; i < argumentCount; ++i)
-        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, arguments[i]));
+        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, globalObject, arguments[i]));
 
     exec->globalData().timeoutChecker.start();
     JSValue value = JSC::call(exec, function, callType, callData, m_jsObject, argumentList);
diff --git a/WebKit2/WebProcess/Plugins/NPJSObject.h b/WebKit2/WebProcess/Plugins/NPJSObject.h
index c9843c7..554f94a 100644
--- a/WebKit2/WebProcess/Plugins/NPJSObject.h
+++ b/WebKit2/WebProcess/Plugins/NPJSObject.h
@@ -31,6 +31,7 @@
 #include <wtf/Noncopyable.h>
 
 namespace JSC {
+    class JSGlobalObject;
     class JSObject;
 }
 
@@ -45,10 +46,6 @@ public:
 
     JSC::JSObject* jsObject() const { return m_jsObject.get(); }
 
-private:
-    NPJSObject();
-    ~NPJSObject();
-
     static bool isNPJSObject(NPObject*);
 
     static NPJSObject* toNPJSObject(NPObject* npObject)
@@ -57,6 +54,10 @@ private:
         return static_cast<NPJSObject*>(npObject);
     }
 
+private:
+    NPJSObject();
+    ~NPJSObject();
+
     void initialize(NPRuntimeObjectMap*, JSC::JSObject* jsObject);
 
     bool hasMethod(NPIdentifier methodName);
@@ -66,7 +67,7 @@ private:
     bool getProperty(NPIdentifier propertyName, NPVariant* result);
     bool construct(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
 
-    bool invoke(JSC::ExecState*, JSC::JSValue function, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
+    bool invoke(JSC::ExecState*, JSC::JSGlobalObject*, JSC::JSValue function, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
 
     static NPClass* npClass();
     static NPObject* NP_Allocate(NPP, NPClass*);
diff --git a/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.cpp b/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.cpp
index b5f93e9..d8815af 100644
--- a/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.cpp
+++ b/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.cpp
@@ -77,7 +77,7 @@ void NPRuntimeObjectMap::jsNPObjectDestroyed(JSNPObject* jsNPObject)
     // FIXME: Implement.
 }
 
-JSValue NPRuntimeObjectMap::convertNPVariantToJSValue(JSC::ExecState* exec, const NPVariant& variant)
+JSValue NPRuntimeObjectMap::convertNPVariantToJSValue(JSC::ExecState* exec, JSC::JSGlobalObject* globalObject, const NPVariant& variant)
 {
     switch (variant.type) {
     case NPVariantType_Void:
@@ -98,12 +98,20 @@ JSValue NPRuntimeObjectMap::convertNPVariantToJSValue(JSC::ExecState* exec, cons
     case NPVariantType_String:
         return jsString(exec, String::fromUTF8WithLatin1Fallback(variant.value.stringValue.UTF8Characters, 
                                                                  variant.value.stringValue.UTF8Length));
-    case NPVariantType_Object:
-    default:
-        notImplemented();
-        break;
+    case NPVariantType_Object: {
+        NPObject* npObject = variant.value.objectValue;
+
+        // Just get the object from the NPJSObject.
+        if (NPJSObject::isNPJSObject(npObject))
+            return NPJSObject::toNPJSObject(npObject)->jsObject();
+
+        ASSERT(globalObject);
+
+        return getOrCreateJSObject(exec, globalObject, npObject);
     }
-    
+    }
+
+    ASSERT_NOT_REACHED();
     return jsUndefined();
 }
 
@@ -173,13 +181,22 @@ void NPRuntimeObjectMap::invalidate()
     ASSERT(m_objects.isEmpty());
 }
 
-ExecState* NPRuntimeObjectMap::globalExec() const
+JSGlobalObject* NPRuntimeObjectMap::globalObject() const
 {
     Frame* frame = m_pluginView->frame();
     if (!frame)
         return 0;
+
+    return frame->script()->globalObject(pluginWorld());
+}
+
+ExecState* NPRuntimeObjectMap::globalExec() const
+{
+    JSGlobalObject* globalObject = this->globalObject();
+    if (!globalObject)
+        return 0;
     
-    return frame->script()->globalObject(pluginWorld())->globalExec();
+    return globalObject->globalExec();
 }
 
 } // namespace WebKit
diff --git a/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.h b/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.h
index c4e2a9b..6f3263c 100644
--- a/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.h
+++ b/WebKit2/WebProcess/Plugins/NPRuntimeObjectMap.h
@@ -61,11 +61,12 @@ public:
     void jsNPObjectDestroyed(JSNPObject*);
 
     void convertJSValueToNPVariant(JSC::ExecState*, JSC::JSValue, NPVariant&);
-    JSC::JSValue convertNPVariantToJSValue(JSC::ExecState*, const NPVariant&);
+    JSC::JSValue convertNPVariantToJSValue(JSC::ExecState*, JSC::JSGlobalObject*, const NPVariant&);
 
     // Called when the plug-in is destroyed. Will invalidate all the NPObjects.
     void invalidate();
 
+    JSC::JSGlobalObject* globalObject() const;
     JSC::ExecState* globalExec() const;
 
 private:

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list