diff options
author | fqian@google.com <fqian@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-01 03:21:02 +0000 |
---|---|---|
committer | fqian@google.com <fqian@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-01 03:21:02 +0000 |
commit | eeb77d682957b5a5eb23366d916d51f04cb132d8 (patch) | |
tree | 9a9218e9c9703a38bc788a9dc73c2951c48b6406 /webkit/port | |
parent | c4eac73e104ccd5156a15a3602cb45343853d48d (diff) | |
download | chromium_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.cpp | 13 |
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. |