void NPObjectMessageReceiver::construct(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) { if (!NP_CLASS_STRUCT_VERSION_HAS_CTOR(m_npObject->_class) || !m_npObject->_class->construct) { returnValue = false; return; } Vector<NPVariant> arguments; for (size_t i = 0; i < argumentsData.size(); ++i) arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); NPVariant result; VOID_TO_NPVARIANT(result); returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), arguments.size(), &result); if (returnValue) { // Convert the NPVariant to an NPVariantData. resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); } // Release all arguments. for (size_t i = 0; i < argumentsData.size(); ++i) releaseNPVariantValue(&arguments[i]); // And release the result. releaseNPVariantValue(&result); }
void NPObjectMessageReceiver::invoke(const NPIdentifierData& methodNameData, const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) { if (!m_npObject->_class->invoke) { returnValue = false; return; } Vector<NPVariant> arguments; for (size_t i = 0; i < argumentsData.size(); ++i) arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); NPVariant result; VOID_TO_NPVARIANT(result); returnValue = m_npObject->_class->invoke(m_npObject, methodNameData.createNPIdentifier(), arguments.data(), arguments.size(), &result); if (returnValue) { // Convert the NPVariant to an NPVariantData. resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); } // Release all arguments. for (size_t i = 0; i < argumentsData.size(); ++i) releaseNPVariantValue(&arguments[i]); // And release the result. releaseNPVariantValue(&result); }
void NPObjectMessageReceiver::invokeDefault(const Vector<NPVariantData>& argumentsData, bool& returnValue, NPVariantData& resultData) { if (!m_npObject->_class->invokeDefault) { returnValue = false; return; } Vector<NPVariant> arguments; for (size_t i = 0; i < argumentsData.size(); ++i) arguments.append(m_npRemoteObjectMap->npVariantDataToNPVariant(argumentsData[i], m_plugin)); NPVariant result; VOID_TO_NPVARIANT(result); PluginController::PluginDestructionProtector protector(m_plugin->controller()); returnValue = m_npObject->_class->invokeDefault(m_npObject, arguments.data(), arguments.size(), &result); if (returnValue) { // Convert the NPVariant to an NPVariantData. resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); } // Release all arguments. for (size_t i = 0; i < argumentsData.size(); ++i) releaseNPVariantValue(&arguments[i]); // And release the result. releaseNPVariantValue(&result); }
JSValue JSNPObject::propertyGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSNPObject* thisObj = static_cast<JSNPObject*>(asObject(slotBase)); ASSERT_GC_OBJECT_INHERITS(thisObj, &s_info); if (!thisObj->m_npObject) return throwInvalidAccessError(exec); if (!thisObj->m_npObject->_class->getProperty) return jsUndefined(); NPVariant result; VOID_TO_NPVARIANT(result); // Calling NPClass::getProperty will call into plug-in code, and there's no telling what the plug-in can do. // (including destroying the plug-in). Because of this, we make sure to keep the plug-in alive until // the call has finished. NPRuntimeObjectMap::PluginProtector protector(thisObj->m_objectMap); bool returnValue; { JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly); NPIdentifier npIdentifier = npIdentifierFromIdentifier(propertyName); returnValue = thisObj->m_npObject->_class->getProperty(thisObj->m_npObject, npIdentifier, &result); NPRuntimeObjectMap::moveGlobalExceptionToExecState(exec); } if (!returnValue) return jsUndefined(); JSValue propertyValue = thisObj->m_objectMap->convertNPVariantToJSValue(exec, thisObj->globalObject(), result); releaseNPVariantValue(&result); return propertyValue; }
JSValue JSNPObject::callConstructor(ExecState* exec) { ASSERT_GC_OBJECT_INHERITS(this, &s_info); if (!m_npObject) return throwInvalidAccessError(exec); size_t argumentCount = exec->argumentCount(); Vector<NPVariant, 8> arguments(argumentCount); // Convert all arguments to NPVariants. for (size_t i = 0; i < argumentCount; ++i) m_objectMap->convertJSValueToNPVariant(exec, exec->argument(i), arguments[i]); // Calling NPClass::construct will call into plug-in code, and there's no telling what the plug-in can do. // (including destroying the plug-in). Because of this, we make sure to keep the plug-in alive until // the call has finished. NPRuntimeObjectMap::PluginProtector protector(m_objectMap); bool returnValue; NPVariant result; VOID_TO_NPVARIANT(result); { JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly); returnValue = m_npObject->_class->construct(m_npObject, arguments.data(), argumentCount, &result); NPRuntimeObjectMap::moveGlobalExceptionToExecState(exec); } if (!returnValue) throwError(exec, createError(exec, "Error calling method on NPObject.")); JSValue value = m_objectMap->convertNPVariantToJSValue(exec, globalObject(), result); releaseNPVariantValue(&result); return value; }
JSValue JSNPObject::callMethod(ExecState* exec, NPIdentifier methodName) { ASSERT_GC_OBJECT_INHERITS(this, info()); if (!m_npObject) return throwInvalidAccessError(exec); size_t argumentCount = exec->argumentCount(); Vector<NPVariant, 8> arguments(argumentCount); // Convert all arguments to NPVariants. for (size_t i = 0; i < argumentCount; ++i) m_objectMap->convertJSValueToNPVariant(exec, exec->uncheckedArgument(i), arguments[i]); // Calling NPClass::invoke will call into plug-in code, and there's no telling what the plug-in can do. // (including destroying the plug-in). Because of this, we make sure to keep the plug-in alive until // the call has finished. NPRuntimeObjectMap::PluginProtector protector(m_objectMap); bool returnValue; NPVariant result; VOID_TO_NPVARIANT(result); { JSLock::DropAllLocks dropAllLocks(JSDOMWindowBase::commonVM()); returnValue = m_npObject->_class->invoke(m_npObject, methodName, arguments.data(), argumentCount, &result); NPRuntimeObjectMap::moveGlobalExceptionToExecState(exec); } // Release all arguments; for (size_t i = 0; i < argumentCount; ++i) releaseNPVariantValue(&arguments[i]); if (!returnValue) exec->vm().throwException(exec, createError(exec, "Error calling method on NPObject.")); JSValue propertyValue = m_objectMap->convertNPVariantToJSValue(exec, globalObject(), result); releaseNPVariantValue(&result); return propertyValue; }
void PluginProxy::evaluate(const NPVariantData& npObjectAsVariantData, const String& scriptString, bool allowPopups, bool& returnValue, NPVariantData& resultData) { PluginController::PluginDestructionProtector protector(controller()); NPVariant npObjectAsVariant = m_connection->npRemoteObjectMap()->npVariantDataToNPVariant(npObjectAsVariantData, this); if (!NPVARIANT_IS_OBJECT(npObjectAsVariant) || !(NPVARIANT_TO_OBJECT(npObjectAsVariant))) { returnValue = false; return; } NPVariant result; returnValue = controller()->evaluate(NPVARIANT_TO_OBJECT(npObjectAsVariant), scriptString, &result, allowPopups); if (!returnValue) return; // Convert the NPVariant to an NPVariantData. resultData = m_connection->npRemoteObjectMap()->npVariantToNPVariantData(result, this); // And release the result. releaseNPVariantValue(&result); releaseNPVariantValue(&npObjectAsVariant); }
void NPObjectMessageReceiver::setProperty(const NPIdentifierData& propertyNameData, const NPVariantData& propertyValueData, bool& returnValue) { if (!m_npObject->_class->setProperty) { returnValue = false; return; } NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData, m_plugin); // Set the property. returnValue = m_npObject->_class->setProperty(m_npObject, propertyNameData.createNPIdentifier(), &propertyValue); // And release the value. releaseNPVariantValue(&propertyValue); }
void NPObjectMessageReceiver::setProperty(const NPIdentifierData& propertyNameData, const NPVariantData& propertyValueData, bool& returnValue) { if (!m_npObject->_class->setProperty) { returnValue = false; return; } NPVariant propertyValue = m_npRemoteObjectMap->npVariantDataToNPVariant(propertyValueData, m_plugin); PluginController::PluginDestructionProtector protector(m_plugin->controller()); returnValue = m_npObject->_class->setProperty(m_npObject, propertyNameData.createNPIdentifier(), &propertyValue); releaseNPVariantValue(&propertyValue); }
void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& resultData) { if (!m_npObject->_class->getProperty) { returnValue = false; return; } NPVariant result; VOID_TO_NPVARIANT(result); returnValue = m_npObject->_class->getProperty(m_npObject, propertyNameData.createNPIdentifier(), &result); if (!returnValue) return; // Convert the NPVariant to an NPVariantData. resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); // And release the result. releaseNPVariantValue(&result); }
void NPObjectMessageReceiver::getProperty(const NPIdentifierData& propertyNameData, bool& returnValue, NPVariantData& resultData) { if (!m_npObject->_class->getProperty) { returnValue = false; return; } NPVariant result; VOID_TO_NPVARIANT(result); PluginController::PluginDestructionProtector protector(m_plugin->controller()); returnValue = m_npObject->_class->getProperty(m_npObject, propertyNameData.createNPIdentifier(), &result); if (!returnValue) return; resultData = m_npRemoteObjectMap->npVariantToNPVariantData(result, m_plugin); releaseNPVariantValue(&result); }
void JSNPObject::put(JSCell* cell, ExecState* exec, PropertyName propertyName, JSValue value, PutPropertySlot&) { JSNPObject* thisObject = JSC::jsCast<JSNPObject*>(cell); ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); if (!thisObject->m_npObject) { throwInvalidAccessError(exec); return; } NPIdentifier npIdentifier = npIdentifierFromIdentifier(propertyName); if (!thisObject->m_npObject->_class->hasProperty || !thisObject->m_npObject->_class->hasProperty(thisObject->m_npObject, npIdentifier)) { // FIXME: Should we throw an exception here? return; } if (!thisObject->m_npObject->_class->setProperty) return; NPVariant variant; thisObject->m_objectMap->convertJSValueToNPVariant(exec, value, variant); // Calling NPClass::setProperty will call into plug-in code, and there's no telling what the plug-in can do. // (including destroying the plug-in). Because of this, we make sure to keep the plug-in alive until // the call has finished. NPRuntimeObjectMap::PluginProtector protector(thisObject->m_objectMap); { JSLock::DropAllLocks dropAllLocks(SilenceAssertionsOnly); thisObject->m_npObject->_class->setProperty(thisObject->m_npObject, npIdentifier, &variant); NPRuntimeObjectMap::moveGlobalExceptionToExecState(exec); // FIXME: Should we throw an exception if setProperty returns false? } releaseNPVariantValue(&variant); }
static void NPN_ReleaseVariantValue(NPVariant* variant) { releaseNPVariantValue(variant); }