[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:35:03 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit 022916bd4b0fa8ee55e4fdb55148978802360736
Author: andersca at apple.com <andersca at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Jul 29 22:21:43 2010 +0000
Implement NPN_Enumerate
https://bugs.webkit.org/show_bug.cgi?id=43215
Reviewed by Sam Weinig.
* WebProcess/Plugins/JSNPObject.cpp:
(WebKit::npIdentifierFromIdentifier):
Get the UTF-8 string representation instead of the lossy ASCII representation.
(WebKit::JSNPObject::getOwnPropertyNames):
Implement by calling the NPClass::enumerate function.
* WebProcess/Plugins/JSNPObject.h:
* WebProcess/Plugins/NPJSObject.cpp:
(WebKit::NPJSObject::enumerate):
Implement by calling JSObject::getPropertyNames.
(WebKit::NPJSObject::npClass):
(WebKit::NPJSObject::NP_Enumerate):
Call NPJSObject::enumerate.
* WebProcess/Plugins/NPJSObject.h:
* WebProcess/Plugins/NPRuntimeUtilities.cpp:
(WebKit::createNPObject):
Fix a comment.
* WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
(WebKit::NPN_Enumerate):
Call the NPClass::enumerate function.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@64312 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebKit2/ChangeLog b/WebKit2/ChangeLog
index 1f5d579..63c2795 100644
--- a/WebKit2/ChangeLog
+++ b/WebKit2/ChangeLog
@@ -1,3 +1,35 @@
+2010-07-29 Anders Carlsson <andersca at apple.com>
+
+ Reviewed by Sam Weinig.
+
+ Implement NPN_Enumerate
+ https://bugs.webkit.org/show_bug.cgi?id=43215
+
+ * WebProcess/Plugins/JSNPObject.cpp:
+ (WebKit::npIdentifierFromIdentifier):
+ Get the UTF-8 string representation instead of the lossy ASCII representation.
+
+ (WebKit::JSNPObject::getOwnPropertyNames):
+ Implement by calling the NPClass::enumerate function.
+
+ * WebProcess/Plugins/JSNPObject.h:
+ * WebProcess/Plugins/NPJSObject.cpp:
+ (WebKit::NPJSObject::enumerate):
+ Implement by calling JSObject::getPropertyNames.
+
+ (WebKit::NPJSObject::npClass):
+ (WebKit::NPJSObject::NP_Enumerate):
+ Call NPJSObject::enumerate.
+
+ * WebProcess/Plugins/NPJSObject.h:
+ * WebProcess/Plugins/NPRuntimeUtilities.cpp:
+ (WebKit::createNPObject):
+ Fix a comment.
+
+ * WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp:
+ (WebKit::NPN_Enumerate):
+ Call the NPClass::enumerate function.
+
2010-07-29 John Sullivan <sullivan at apple.com>
<https://bugs.webkit.org/show_bug.cgi?id=43203>
diff --git a/WebKit2/WebProcess/Plugins/JSNPObject.cpp b/WebKit2/WebProcess/Plugins/JSNPObject.cpp
index bafb54b..28c0821 100644
--- a/WebKit2/WebProcess/Plugins/JSNPObject.cpp
+++ b/WebKit2/WebProcess/Plugins/JSNPObject.cpp
@@ -33,6 +33,7 @@
#include <JavaScriptCore/ObjectPrototype.h>
#include <JavaScriptCore/JSLock.h>
#include <WebCore/IdentifierRep.h>
+#include <WebCore/PlatformString.h>
using namespace WebCore;
using namespace JSC;
@@ -41,7 +42,7 @@ namespace WebKit {
static NPIdentifier npIdentifierFromIdentifier(const Identifier& identifier)
{
- return static_cast<NPIdentifier>(IdentifierRep::get(identifier.ascii()));
+ return static_cast<NPIdentifier>(IdentifierRep::get(identifier.ustring().UTF8String().data()));
}
const ClassInfo JSNPObject::s_info = { "NPObject", 0, 0, 0 };
@@ -227,6 +228,48 @@ void JSNPObject::put(ExecState* exec, const Identifier& propertyName, JSValue va
releaseNPVariantValue(&variant);
}
+void JSNPObject::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNameArray, EnumerationMode mode)
+{
+ if (!m_npObject) {
+ throwInvalidAccessError(exec);
+ return;
+ }
+
+ if (!NP_CLASS_STRUCT_VERSION_HAS_ENUM(m_npObject->_class) || !m_npObject->_class->enumerate)
+ return;
+
+ NPIdentifier* identifiers = 0;
+ uint32_t identifierCount = 0;
+
+ {
+ JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly);
+
+ // FIXME: Handle enumerate setting an exception.
+ // FIXME: Find out what happens if calling enumerate causes the plug-in to go away.
+ // FIXME: Should we throw an exception if enumerate returns false?
+ if (!m_npObject->_class->enumerate(m_npObject, &identifiers, &identifierCount))
+ return;
+ }
+
+ for (uint32_t i = 0; i < identifierCount; ++i) {
+ IdentifierRep* identifierRep = static_cast<IdentifierRep*>(identifiers[i]);
+
+ Identifier identifier;
+ if (identifierRep->isString()) {
+ const char* string = identifierRep->string();
+ int length = strlen(string);
+
+ identifier = Identifier(exec, String::fromUTF8WithLatin1Fallback(string, length).impl());
+ } else
+ identifier = Identifier::from(exec, identifierRep->number());
+
+ propertyNameArray.add(identifier);
+ }
+
+ // This should use NPN_MemFree, but we know that it uses free under the hood.
+ free(identifiers);
+}
+
JSValue JSNPObject::propertyGetter(ExecState* exec, JSValue slotBase, const Identifier& propertyName)
{
JSNPObject* thisObj = static_cast<JSNPObject*>(asObject(slotBase));
diff --git a/WebKit2/WebProcess/Plugins/JSNPObject.h b/WebKit2/WebProcess/Plugins/JSNPObject.h
index 9c9dba0..9685a59 100644
--- a/WebKit2/WebProcess/Plugins/JSNPObject.h
+++ b/WebKit2/WebProcess/Plugins/JSNPObject.h
@@ -61,6 +61,8 @@ private:
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertyDescriptor&);
virtual void put(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&);
+ virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties);
+
static JSC::JSValue propertyGetter(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
static JSC::JSValue methodGetter(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&);
static JSC::JSObject* throwInvalidAccessError(JSC::ExecState*);
diff --git a/WebKit2/WebProcess/Plugins/NPJSObject.cpp b/WebKit2/WebProcess/Plugins/NPJSObject.cpp
index 2eadfbc..002257e 100644
--- a/WebKit2/WebProcess/Plugins/NPJSObject.cpp
+++ b/WebKit2/WebProcess/Plugins/NPJSObject.cpp
@@ -171,6 +171,29 @@ bool NPJSObject::getProperty(NPIdentifier propertyName, NPVariant* result)
return true;
}
+bool NPJSObject::enumerate(NPIdentifier** identifiers, uint32_t* identifierCount)
+{
+ ExecState* exec = m_objectMap->globalExec();
+ if (!exec)
+ return false;
+
+ JSLock lock(SilenceAssertionsOnly);
+
+ PropertyNameArray propertyNames(exec);
+ m_jsObject->getPropertyNames(exec, propertyNames);
+
+ // This should use NPN_MemAlloc, but we know that it uses malloc under the hood.
+ NPIdentifier* nameIdentifiers = static_cast<NPIdentifier*>(malloc(sizeof(NPIdentifier) * propertyNames.size()));
+
+ for (size_t i = 0; i < propertyNames.size(); ++i)
+ nameIdentifiers[i] = static_cast<NPIdentifier>(IdentifierRep::get(propertyNames[i].ustring().UTF8String().data()));
+
+ *identifiers = nameIdentifiers;
+ *identifierCount = propertyNames.size();
+
+ return true;
+}
+
bool NPJSObject::construct(const NPVariant *arguments, uint32_t argumentCount, NPVariant *result)
{
ExecState* exec = m_objectMap->globalExec();
@@ -237,7 +260,7 @@ NPClass* NPJSObject::npClass()
NP_GetProperty,
NP_SetProperty,
0,
- 0,
+ NP_Enumerate,
NP_Construct
};
@@ -288,6 +311,11 @@ bool NPJSObject::NP_SetProperty(NPObject*, NPIdentifier propertyName, const NPVa
return false;
}
+bool NPJSObject::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
+{
+ return toNPJSObject(npObject)->enumerate(identifiers, identifierCount);
+}
+
bool NPJSObject::NP_Construct(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
{
return toNPJSObject(npObject)->construct(arguments, argumentCount, result);
diff --git a/WebKit2/WebProcess/Plugins/NPJSObject.h b/WebKit2/WebProcess/Plugins/NPJSObject.h
index 554f94a..281b2c0 100644
--- a/WebKit2/WebProcess/Plugins/NPJSObject.h
+++ b/WebKit2/WebProcess/Plugins/NPJSObject.h
@@ -65,6 +65,7 @@ private:
bool invokeDefault(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
bool hasProperty(NPIdentifier propertyName);
bool getProperty(NPIdentifier propertyName, NPVariant* result);
+ bool enumerate(NPIdentifier** identifiers, uint32_t* identifierCount);
bool construct(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);
@@ -78,6 +79,7 @@ private:
static bool NP_HasProperty(NPObject*, NPIdentifier propertyName);
static bool NP_GetProperty(NPObject*, NPIdentifier propertyName, NPVariant* result);
static bool NP_SetProperty(NPObject*, NPIdentifier propertyName, const NPVariant* value);
+ static bool NP_Enumerate(NPObject*, NPIdentifier** identifiers, uint32_t* identifierCount);
static bool NP_Construct(NPObject*, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result);
NPRuntimeObjectMap* m_objectMap;
diff --git a/WebKit2/WebProcess/Plugins/NPRuntimeUtilities.cpp b/WebKit2/WebProcess/Plugins/NPRuntimeUtilities.cpp
index 3b3ecec..1c7270f 100644
--- a/WebKit2/WebProcess/Plugins/NPRuntimeUtilities.cpp
+++ b/WebKit2/WebProcess/Plugins/NPRuntimeUtilities.cpp
@@ -35,8 +35,7 @@ NPObject* createNPObject(NPP npp, NPClass* npClass)
if (npClass->allocate)
npObject = npClass->allocate(npp, npClass);
else {
- // This should really call NPN_MemAlloc, but we know that it uses malloc
- // under the hood so it's fine.
+ // This should use NPN_MemAlloc, but we know that it uses malloc under the hood.
npObject = static_cast<NPObject*>(malloc(sizeof(NPObject)));
}
diff --git a/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp b/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
index ea6b18a..ad65717 100644
--- a/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
+++ b/WebKit2/WebProcess/Plugins/Netscape/NetscapeBrowserFuncs.cpp
@@ -631,9 +631,11 @@ static void NPN_PopPopupsEnabledState(NPP instance)
notImplemented();
}
-static bool NPN_Enumerate(NPP npp, NPObject* npobj, NPIdentifier** identifier, uint32_t* count)
+static bool NPN_Enumerate(NPP, NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
{
- notImplemented();
+ if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class->enumerate)
+ return npObject->_class->enumerate(npObject, identifiers, identifierCount);
+
return false;
}
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list