| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 // FIXME: need comments. | 56 // FIXME: need comments. |
| 57 // Params: holder could be HTMLEmbedElement or NPObject | 57 // Params: holder could be HTMLEmbedElement or NPObject |
| 58 static v8::Handle<v8::Value> npObjectInvokeImpl(const v8::Arguments& args, Invok
eFunctionType functionId) | 58 static v8::Handle<v8::Value> npObjectInvokeImpl(const v8::Arguments& args, Invok
eFunctionType functionId) |
| 59 { | 59 { |
| 60 NPObject* npObject; | 60 NPObject* npObject; |
| 61 | 61 |
| 62 // These three types are subtypes of HTMLPlugInElement. | 62 // These three types are subtypes of HTMLPlugInElement. |
| 63 if (V8HTMLAppletElement::HasInstance(args.Holder()) || V8HTMLEmbedElement::H
asInstance(args.Holder()) | 63 if (V8HTMLAppletElement::HasInstance(args.Holder()) || V8HTMLEmbedElement::H
asInstance(args.Holder()) |
| 64 || V8HTMLObjectElement::HasInstance(args.Holder())) { | 64 || V8HTMLObjectElement::HasInstance(args.Holder())) { |
| 65 // The holder object is a subtype of HTMLPlugInElement. | 65 // The holder object is a subtype of HTMLPlugInElement. |
| 66 HTMLPlugInElement* element = V8Proxy::DOMWrapperToNode<HTMLPlugInElement
>(args.Holder()); | 66 HTMLPlugInElement* element = V8Proxy::convertDOMWrapperToNode<HTMLPlugIn
Element>(args.Holder()); |
| 67 ScriptInstance scriptInstance = element->getInstance(); | 67 ScriptInstance scriptInstance = element->getInstance(); |
| 68 if (scriptInstance) | 68 if (scriptInstance) |
| 69 npObject = V8Proxy::ToNativeObject<NPObject>(V8ClassIndex::NPOBJECT,
scriptInstance->instance()); | 69 npObject = V8Proxy::convertToNativeObject<NPObject>(V8ClassIndex::NP
OBJECT, scriptInstance->instance()); |
| 70 else | 70 else |
| 71 npObject = 0; | 71 npObject = 0; |
| 72 } else { | 72 } else { |
| 73 // The holder object is not a subtype of HTMLPlugInElement, it | 73 // The holder object is not a subtype of HTMLPlugInElement, it |
| 74 // must be an NPObject which has three internal fields. | 74 // must be an NPObject which has three internal fields. |
| 75 if (args.Holder()->InternalFieldCount() != V8Custom::kNPObjectInternalFi
eldCount) | 75 if (args.Holder()->InternalFieldCount() != V8Custom::kNPObjectInternalFi
eldCount) |
| 76 return throwError("NPMethod called on non-NPObject", V8Proxy::REFERENC
E_ERROR); | 76 return throwError("NPMethod called on non-NPObject", V8Proxy::Referenc
eError); |
| 77 | 77 |
| 78 npObject = V8Proxy::ToNativeObject<NPObject>(V8ClassIndex::NPOBJECT, arg
s.Holder()); | 78 npObject = V8Proxy::convertToNativeObject<NPObject>(V8ClassIndex::NPOBJE
CT, args.Holder()); |
| 79 } | 79 } |
| 80 | 80 |
| 81 // Verify that our wrapper wasn't using a NPObject which | 81 // Verify that our wrapper wasn't using a NPObject which |
| 82 // has already been deleted. | 82 // has already been deleted. |
| 83 if (!npObject || !_NPN_IsAlive(npObject)) | 83 if (!npObject || !_NPN_IsAlive(npObject)) |
| 84 return throwError("NPObject deleted", V8Proxy::REFERENCE_ERROR); | 84 return throwError("NPObject deleted", V8Proxy::ReferenceError); |
| 85 | 85 |
| 86 // Wrap up parameters. | 86 // Wrap up parameters. |
| 87 int numArgs = args.Length(); | 87 int numArgs = args.Length(); |
| 88 OwnArrayPtr<NPVariant> npArgs(new NPVariant[numArgs]); | 88 OwnArrayPtr<NPVariant> npArgs(new NPVariant[numArgs]); |
| 89 | 89 |
| 90 for (int i = 0; i < numArgs; i++) | 90 for (int i = 0; i < numArgs; i++) |
| 91 convertV8ObjectToNPVariant(args[i], npObject, &npArgs[i]); | 91 convertV8ObjectToNPVariant(args[i], npObject, &npArgs[i]); |
| 92 | 92 |
| 93 NPVariant result; | 93 NPVariant result; |
| 94 VOID_TO_NPVARIANT(result); | 94 VOID_TO_NPVARIANT(result); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 ASSERT(staticTemplateMap.contains(identifier)); | 151 ASSERT(staticTemplateMap.contains(identifier)); |
| 152 | 152 |
| 153 staticTemplateMap.forget(identifier); | 153 staticTemplateMap.forget(identifier); |
| 154 } | 154 } |
| 155 | 155 |
| 156 | 156 |
| 157 static v8::Handle<v8::Value> npObjectGetProperty(v8::Local<v8::Object> self, | 157 static v8::Handle<v8::Value> npObjectGetProperty(v8::Local<v8::Object> self, |
| 158 NPIdentifier identifier, | 158 NPIdentifier identifier, |
| 159 v8::Local<v8::Value> key) | 159 v8::Local<v8::Value> key) |
| 160 { | 160 { |
| 161 NPObject* npObject = V8Proxy::ToNativeObject<NPObject>(V8ClassIndex::NPOBJEC
T, self); | 161 NPObject* npObject = V8Proxy::convertToNativeObject<NPObject>(V8ClassIndex::
NPOBJECT, self); |
| 162 | 162 |
| 163 // Verify that our wrapper wasn't using a NPObject which | 163 // Verify that our wrapper wasn't using a NPObject which |
| 164 // has already been deleted. | 164 // has already been deleted. |
| 165 if (!npObject || !_NPN_IsAlive(npObject)) | 165 if (!npObject || !_NPN_IsAlive(npObject)) |
| 166 return throwError("NPObject deleted", V8Proxy::REFERENCE_ERROR); | 166 return throwError("NPObject deleted", V8Proxy::ReferenceError); |
| 167 | 167 |
| 168 | 168 |
| 169 if (npObject->_class->hasProperty && npObject->_class->hasProperty(npObject,
identifier) | 169 if (npObject->_class->hasProperty && npObject->_class->hasProperty(npObject,
identifier) |
| 170 && npObject->_class->getProperty) { | 170 && npObject->_class->getProperty) { |
| 171 | 171 |
| 172 NPVariant result; | 172 NPVariant result; |
| 173 VOID_TO_NPVARIANT(result); | 173 VOID_TO_NPVARIANT(result); |
| 174 if (!npObject->_class->getProperty(npObject, identifier, &result)) | 174 if (!npObject->_class->getProperty(npObject, identifier, &result)) |
| 175 return v8::Handle<v8::Value>(); | 175 return v8::Handle<v8::Value>(); |
| 176 | 176 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 uint32_t index) | 224 uint32_t index) |
| 225 { | 225 { |
| 226 NPIdentifier identifier = NPN_GetIntIdentifier(index); | 226 NPIdentifier identifier = NPN_GetIntIdentifier(index); |
| 227 return npObjectGetProperty(self, identifier, v8::Number::New(index)); | 227 return npObjectGetProperty(self, identifier, v8::Number::New(index)); |
| 228 } | 228 } |
| 229 | 229 |
| 230 static v8::Handle<v8::Value> npObjectSetProperty(v8::Local<v8::Object> self, | 230 static v8::Handle<v8::Value> npObjectSetProperty(v8::Local<v8::Object> self, |
| 231 NPIdentifier identifier, | 231 NPIdentifier identifier, |
| 232 v8::Local<v8::Value> value) | 232 v8::Local<v8::Value> value) |
| 233 { | 233 { |
| 234 NPObject* npObject = V8Proxy::ToNativeObject<NPObject>(V8ClassIndex::NPOBJEC
T, self); | 234 NPObject* npObject = V8Proxy::convertToNativeObject<NPObject>(V8ClassIndex::
NPOBJECT, self); |
| 235 | 235 |
| 236 // Verify that our wrapper wasn't using a NPObject which | 236 // Verify that our wrapper wasn't using a NPObject which |
| 237 // has already been deleted. | 237 // has already been deleted. |
| 238 if (!npObject || !_NPN_IsAlive(npObject)) { | 238 if (!npObject || !_NPN_IsAlive(npObject)) { |
| 239 throwError("NPObject deleted", V8Proxy::REFERENCE_ERROR); | 239 throwError("NPObject deleted", V8Proxy::ReferenceError); |
| 240 return value; // Intercepted, but an exception was thrown. | 240 return value; // Intercepted, but an exception was thrown. |
| 241 } | 241 } |
| 242 | 242 |
| 243 if (npObject->_class->hasProperty && npObject->_class->hasProperty(npObject,
identifier) | 243 if (npObject->_class->hasProperty && npObject->_class->hasProperty(npObject,
identifier) |
| 244 && npObject->_class->setProperty) { | 244 && npObject->_class->setProperty) { |
| 245 | 245 |
| 246 NPVariant npValue; | 246 NPVariant npValue; |
| 247 VOID_TO_NPVARIANT(npValue); | 247 VOID_TO_NPVARIANT(npValue); |
| 248 convertV8ObjectToNPVariant(value, npObject, &npValue); | 248 convertV8ObjectToNPVariant(value, npObject, &npValue); |
| 249 bool success = npObject->_class->setProperty(npObject, identifier, &npVa
lue); | 249 bool success = npObject->_class->setProperty(npObject, identifier, &npVa
lue); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 // The same Wrapper type can be used by DOM bindings. | 332 // The same Wrapper type can be used by DOM bindings. |
| 333 if (npObjectDesc.IsEmpty()) { | 333 if (npObjectDesc.IsEmpty()) { |
| 334 npObjectDesc = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTem
plate::New()); | 334 npObjectDesc = v8::Persistent<v8::FunctionTemplate>::New(v8::FunctionTem
plate::New()); |
| 335 npObjectDesc->InstanceTemplate()->SetInternalFieldCount(V8Custom::kNPObj
ectInternalFieldCount); | 335 npObjectDesc->InstanceTemplate()->SetInternalFieldCount(V8Custom::kNPObj
ectInternalFieldCount); |
| 336 npObjectDesc->InstanceTemplate()->SetNamedPropertyHandler(npObjectNamedP
ropertyGetter, npObjectNamedPropertySetter); | 336 npObjectDesc->InstanceTemplate()->SetNamedPropertyHandler(npObjectNamedP
ropertyGetter, npObjectNamedPropertySetter); |
| 337 npObjectDesc->InstanceTemplate()->SetIndexedPropertyHandler(npObjectInde
xedPropertyGetter, npObjectIndexedPropertySetter); | 337 npObjectDesc->InstanceTemplate()->SetIndexedPropertyHandler(npObjectInde
xedPropertyGetter, npObjectIndexedPropertySetter); |
| 338 npObjectDesc->InstanceTemplate()->SetCallAsFunctionHandler(npObjectInvok
eDefaultHandler); | 338 npObjectDesc->InstanceTemplate()->SetCallAsFunctionHandler(npObjectInvok
eDefaultHandler); |
| 339 } | 339 } |
| 340 | 340 |
| 341 v8::Handle<v8::Function> v8Function = npObjectDesc->GetFunction(); | 341 v8::Handle<v8::Function> v8Function = npObjectDesc->GetFunction(); |
| 342 v8::Local<v8::Object> value = SafeAllocation::NewInstance(v8Function); | 342 v8::Local<v8::Object> value = SafeAllocation::newInstance(v8Function); |
| 343 | 343 |
| 344 // If we were unable to allocate the instance, we avoid wrapping | 344 // If we were unable to allocate the instance, we avoid wrapping |
| 345 // and registering the NP object. | 345 // and registering the NP object. |
| 346 if (value.IsEmpty()) | 346 if (value.IsEmpty()) |
| 347 return value; | 347 return value; |
| 348 | 348 |
| 349 wrapNPObject(value, object); | 349 wrapNPObject(value, object); |
| 350 | 350 |
| 351 // KJS retains the object as part of its wrapper (see Bindings::CInstance). | 351 // KJS retains the object as part of its wrapper (see Bindings::CInstance). |
| 352 NPN_RetainObject(object); | 352 NPN_RetainObject(object); |
| 353 | 353 |
| 354 _NPN_RegisterObject(object, root); | 354 _NPN_RegisterObject(object, root); |
| 355 | 355 |
| 356 // Maintain a weak pointer for v8 so we can cleanup the object. | 356 // Maintain a weak pointer for v8 so we can cleanup the object. |
| 357 v8::Persistent<v8::Object> weakRef = v8::Persistent<v8::Object>::New(value); | 357 v8::Persistent<v8::Object> weakRef = v8::Persistent<v8::Object>::New(value); |
| 358 staticNPObjectMap.set(object, weakRef); | 358 staticNPObjectMap.set(object, weakRef); |
| 359 | 359 |
| 360 return value; | 360 return value; |
| 361 } | 361 } |
| 362 | 362 |
| 363 void forgetV8ObjectForNPObject(NPObject* object) | 363 void forgetV8ObjectForNPObject(NPObject* object) |
| 364 { | 364 { |
| 365 if (staticNPObjectMap.contains(object)) { | 365 if (staticNPObjectMap.contains(object)) { |
| 366 v8::HandleScope scope; | 366 v8::HandleScope scope; |
| 367 v8::Persistent<v8::Object> handle(staticNPObjectMap.get(object)); | 367 v8::Persistent<v8::Object> handle(staticNPObjectMap.get(object)); |
| 368 WebCore::V8Proxy::SetDOMWrapper(handle, WebCore::V8ClassIndex::NPOBJECT,
0); | 368 WebCore::V8Proxy::setDOMWrapper(handle, WebCore::V8ClassIndex::NPOBJECT,
0); |
| 369 staticNPObjectMap.forget(object); | 369 staticNPObjectMap.forget(object); |
| 370 NPN_ReleaseObject(object); | 370 NPN_ReleaseObject(object); |
| 371 } | 371 } |
| 372 } | 372 } |
| OLD | NEW |