static v8::Handle<v8::Value> npObjectNamedSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) { HTMLPlugInElement* imp = C::toNative(info.Holder()); ScriptInstance scriptInstance = imp->getInstance(); if (!scriptInstance) return v8Undefined(); v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance()); if (instance.IsEmpty()) return v8Undefined(); return npObjectSetNamedProperty(instance, name, value, info); }
v8::Handle<v8::Value> npObjectIndexedGetter(uint32_t index, const v8::AccessorInfo& info) { HTMLPlugInElement* imp = C::toNative(info.Holder()); ScriptInstance scriptInstance = imp->getInstance(); if (!scriptInstance) return v8Undefined(); v8::Local<v8::Object> instance = v8::Local<v8::Object>::New(scriptInstance->instance()); if (instance.IsEmpty()) return v8Undefined(); return npObjectGetIndexedProperty(instance, index, info); }
// FIXME: need comments. // Params: holder could be HTMLEmbedElement or NPObject static v8::Handle<v8::Value> npObjectInvokeImpl(const v8::Arguments& args, InvokeFunctionType functionId) { NPObject* npObject; // These three types are subtypes of HTMLPlugInElement. if (V8HTMLAppletElement::HasInstance(args.Holder()) || V8HTMLEmbedElement::HasInstance(args.Holder()) || V8HTMLObjectElement::HasInstance(args.Holder())) { // The holder object is a subtype of HTMLPlugInElement. HTMLPlugInElement* element = V8DOMWrapper::convertDOMWrapperToNode<HTMLPlugInElement>(args.Holder()); ScriptInstance scriptInstance = element->getInstance(); if (scriptInstance) npObject = V8DOMWrapper::convertToNativeObject<NPObject>(V8ClassIndex::NPOBJECT, scriptInstance->instance()); else npObject = 0; } else { // The holder object is not a subtype of HTMLPlugInElement, it must be an NPObject which has three // internal fields. if (args.Holder()->InternalFieldCount() != V8Custom::kNPObjectInternalFieldCount) return throwError("NPMethod called on non-NPObject", V8Proxy::ReferenceError); npObject = V8DOMWrapper::convertToNativeObject<NPObject>(V8ClassIndex::NPOBJECT, args.Holder()); } // Verify that our wrapper wasn't using a NPObject which has already been deleted. if (!npObject || !_NPN_IsAlive(npObject)) return throwError("NPObject deleted", V8Proxy::ReferenceError); // Wrap up parameters. int numArgs = args.Length(); OwnArrayPtr<NPVariant> npArgs(new NPVariant[numArgs]); for (int i = 0; i < numArgs; i++) convertV8ObjectToNPVariant(args[i], npObject, &npArgs[i]); NPVariant result; VOID_TO_NPVARIANT(result); switch (functionId) { case InvokeMethod: if (npObject->_class->invoke) { v8::Handle<v8::String> functionName(v8::String::Cast(*args.Data())); NPIdentifier identifier = getStringIdentifier(functionName); npObject->_class->invoke(npObject, identifier, npArgs.get(), numArgs, &result); } break; case InvokeConstruct: if (npObject->_class->construct) npObject->_class->construct(npObject, npArgs.get(), numArgs, &result); break; case InvokeDefault: if (npObject->_class->invokeDefault) npObject->_class->invokeDefault(npObject, npArgs.get(), numArgs, &result); break; default: break; } for (int i=0; i < numArgs; i++) _NPN_ReleaseVariantValue(&npArgs[i]); // Unwrap return values. v8::Handle<v8::Value> returnValue = convertNPVariantToV8Object(&result, npObject); _NPN_ReleaseVariantValue(&result); return returnValue; }