[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