summaryrefslogtreecommitdiffstats
path: root/webkit/port
diff options
context:
space:
mode:
authorfqian@google.com <fqian@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 03:21:02 +0000
committerfqian@google.com <fqian@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-01 03:21:02 +0000
commiteeb77d682957b5a5eb23366d916d51f04cb132d8 (patch)
tree9a9218e9c9703a38bc788a9dc73c2951c48b6406 /webkit/port
parentc4eac73e104ccd5156a15a3602cb45343853d48d (diff)
downloadchromium_src-eeb77d682957b5a5eb23366d916d51f04cb132d8.zip
chromium_src-eeb77d682957b5a5eb23366d916d51f04cb132d8.tar.gz
chromium_src-eeb77d682957b5a5eb23366d916d51f04cb132d8.tar.bz2
Second part of fix of issue http://code.google.com/p/chromium/issues/detail?id=3285.
A NPObject can be called as a construct if it implements NPN_Construct, and NOT implements NPN_InvokeDefault. Otherwise, NPN_InvokeDefault is called even when the object is called as a constructor. Review URL: http://codereview.chromium.org/56167 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15029 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/port')
-rw-r--r--webkit/port/bindings/v8/V8NPObject.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/webkit/port/bindings/v8/V8NPObject.cpp b/webkit/port/bindings/v8/V8NPObject.cpp
index 60e66a9..eec8417 100644
--- a/webkit/port/bindings/v8/V8NPObject.cpp
+++ b/webkit/port/bindings/v8/V8NPObject.cpp
@@ -104,6 +104,13 @@ static v8::Handle<v8::Value> NPObjectInvokeImpl(const v8::Arguments& args, Invok
case INVOKE_DEFAULT:
if (npobject->_class->invokeDefault)
npobject->_class->invokeDefault(npobject, npArgs, argc, &result);
+ // The call might be a construct call on an NPObject.
+ // See http://code.google.com/p/chromium/issues/detail?id=3285
+ //
+ // TODO: when V8 passes in the correct flag args.is_construct_call_,
+ // make a separate NPN_Construct case.
+ else if (npobject->_class->construct)
+ npobject->_class->construct(npobject, npArgs, argc, &result);
break;
default:
break;
@@ -174,7 +181,11 @@ static v8::Handle<v8::Value> NPObjectGetProperty(v8::Local<v8::Object> self,
v8::Handle<v8::Value> rv = convertNPVariantToV8Object(&result, npobject);
NPN_ReleaseVariantValue(&result);
return rv;
- } else if (key->IsString() && npobject->_class->hasMethod && npobject->_class->hasMethod(npobject, ident)) {
+
+ } else if (key->IsString() &&
+ npobject->_class->hasMethod &&
+ npobject->_class->hasMethod(npobject, ident)) {
+
PrivateIdentifier* id = static_cast<PrivateIdentifier*>(ident);
v8::Persistent<v8::FunctionTemplate> desc = static_template_map.get(id);
// Cache templates using identifier as the key.