bool PluginScriptableObjectParent::AnswerRemoveProperty(PPluginIdentifierParent* aId, bool* aSuccess) { if (!mObject) { NS_WARNING("Calling AnswerRemoveProperty with an invalidated object!"); *aSuccess = false; return true; } NS_ASSERTION(mObject->_class != GetClass(), "Bad object type!"); NS_ASSERTION(mType == LocalObject, "Bad type!"); PluginInstanceParent* instance = GetInstance(); if (!instance) { NS_ERROR("No instance?!"); *aSuccess = false; return true; } const NPNetscapeFuncs* npn = GetNetscapeFuncs(instance); if (!npn) { NS_ERROR("No netscape funcs?!"); *aSuccess = false; return true; } PluginIdentifierParent* id = static_cast<PluginIdentifierParent*>(aId); *aSuccess = npn->removeproperty(instance->GetNPP(), mObject, id->ToNPIdentifier()); return true; }
// static bool PluginScriptableObjectParent::ScriptableEnumerate(NPObject* aObject, NPIdentifier** aIdentifiers, uint32_t* aCount) { if (aObject->_class != GetClass()) { NS_ERROR("Don't know what kind of object this is!"); return false; } ParentNPObject* object = reinterpret_cast<ParentNPObject*>(aObject); if (object->invalidated) { NS_WARNING("Calling method on an invalidated object!"); return false; } ProtectedActor<PluginScriptableObjectParent> actor(object->parent); if (!actor) { return false; } NS_ASSERTION(actor->Type() == Proxy, "Bad type!"); const NPNetscapeFuncs* npn = GetNetscapeFuncs(aObject); if (!npn) { NS_ERROR("No netscape funcs!"); return false; } AutoInfallibleTArray<PPluginIdentifierParent*, 10> identifiers; bool success; if (!actor->CallEnumerate(&identifiers, &success)) { NS_WARNING("Failed to send message!"); return false; } if (!success) { return false; } *aCount = identifiers.Length(); if (!*aCount) { *aIdentifiers = nullptr; return true; } *aIdentifiers = (NPIdentifier*)npn->memalloc(*aCount * sizeof(NPIdentifier)); if (!*aIdentifiers) { NS_ERROR("Out of memory!"); return false; } for (uint32_t index = 0; index < *aCount; index++) { PluginIdentifierParent* id = static_cast<PluginIdentifierParent*>(identifiers[index]); (*aIdentifiers)[index] = id->ToNPIdentifier(); } return true; }
bool PluginScriptableObjectParent::AnswerEnumerate(InfallibleTArray<PPluginIdentifierParent*>* aProperties, bool* aSuccess) { if (!mObject) { NS_WARNING("Calling AnswerEnumerate with an invalidated object!"); *aSuccess = false; return true; } NS_ASSERTION(mObject->_class != GetClass(), "Bad object type!"); NS_ASSERTION(mType == LocalObject, "Bad type!"); PluginInstanceParent* instance = GetInstance(); if (!instance) { NS_ERROR("No instance?!"); *aSuccess = false; return true; } const NPNetscapeFuncs* npn = GetNetscapeFuncs(instance); if (!npn) { NS_WARNING("No netscape funcs?!"); *aSuccess = false; return true; } NPIdentifier* ids; uint32_t idCount; if (!npn->enumerate(instance->GetNPP(), mObject, &ids, &idCount)) { *aSuccess = false; return true; } aProperties->SetCapacity(idCount); mozilla::AutoSafeJSContext cx; for (uint32_t index = 0; index < idCount; index++) { // Because of GC hazards, all identifiers returned from enumerate // must be made permanent. if (_identifierisstring(ids[index])) { JSString* str = NPIdentifierToString(ids[index]); if (!JS_StringHasBeenInterned(cx, str)) { DebugOnly<JSString*> str2 = JS_InternJSString(cx, str); NS_ASSERTION(str2 == str, "Interning a JS string which is currently an ID should return itself."); } } PluginIdentifierParent* id = instance->Module()->GetIdentifierForNPIdentifier(instance->GetNPP(), ids[index]); aProperties->AppendElement(id); NS_ASSERTION(!id->IsTemporary(), "Should only have permanent identifiers!"); } npn->memfree(ids); *aSuccess = true; return true; }
bool PluginScriptableObjectParent::AnswerGetParentProperty( PPluginIdentifierParent* aId, Variant* aResult, bool* aSuccess) { if (!mObject) { NS_WARNING("Calling AnswerGetProperty with an invalidated object!"); *aResult = void_t(); *aSuccess = false; return true; } NS_ASSERTION(mObject->_class != GetClass(), "Bad object type!"); NS_ASSERTION(mType == LocalObject, "Bad type!"); PluginInstanceParent* instance = GetInstance(); if (!instance) { NS_ERROR("No instance?!"); *aResult = void_t(); *aSuccess = false; return true; } const NPNetscapeFuncs* npn = GetNetscapeFuncs(instance); if (!npn) { NS_ERROR("No netscape funcs?!"); *aResult = void_t(); *aSuccess = false; return true; } PluginIdentifierParent* id = static_cast<PluginIdentifierParent*>(aId); NPVariant result; if (!npn->getproperty(instance->GetNPP(), mObject, id->ToNPIdentifier(), &result)) { *aResult = void_t(); *aSuccess = false; return true; } Variant converted; if ((*aSuccess = ConvertToRemoteVariant(result, converted, instance))) { DeferNPVariantLastRelease(npn, &result); *aResult = converted; } else { *aResult = void_t(); } return true; }
bool PluginScriptableObjectParent::AnswerSetProperty(PPluginIdentifierParent* aId, const Variant& aValue, bool* aSuccess) { if (!mObject) { NS_WARNING("Calling AnswerSetProperty with an invalidated object!"); *aSuccess = false; return true; } NS_ASSERTION(mObject->_class != GetClass(), "Bad object type!"); NS_ASSERTION(mType == LocalObject, "Bad type!"); PluginInstanceParent* instance = GetInstance(); if (!instance) { NS_ERROR("No instance?!"); *aSuccess = false; return true; } const NPNetscapeFuncs* npn = GetNetscapeFuncs(instance); if (!npn) { NS_ERROR("No netscape funcs?!"); *aSuccess = false; return true; } NPVariant converted; if (!ConvertToVariant(aValue, converted, instance)) { *aSuccess = false; return true; } PluginIdentifierParent* id = static_cast<PluginIdentifierParent*>(aId); if ((*aSuccess = npn->setproperty(instance->GetNPP(), mObject, id->ToNPIdentifier(), &converted))) { ReleaseVariant(converted, instance); } return true; }
PluginIdentifierParent* PluginModuleParent::GetIdentifierForNPIdentifier(NPP npp, NPIdentifier aIdentifier) { PluginIdentifierParent* ident; if (mIdentifiers.Get(aIdentifier, &ident)) { if (ident->IsTemporary()) { ident->AddTemporaryRef(); } return ident; } nsCString string; int32_t intval = -1; bool temporary = false; if (mozilla::plugins::parent::_identifierisstring(aIdentifier)) { NPUTF8* chars = mozilla::plugins::parent::_utf8fromidentifier(aIdentifier); if (!chars) { return nsnull; } string.Adopt(chars); temporary = !NPStringIdentifierIsPermanent(npp, aIdentifier); } else { intval = mozilla::plugins::parent::_intfromidentifier(aIdentifier); string.SetIsVoid(PR_TRUE); } ident = new PluginIdentifierParent(aIdentifier, temporary); if (!SendPPluginIdentifierConstructor(ident, string, intval, temporary)) return nsnull; if (!temporary) { mIdentifiers.Put(aIdentifier, ident); } return ident; }
bool PluginScriptableObjectParent::AnswerInvoke(PPluginIdentifierParent* aId, const InfallibleTArray<Variant>& aArgs, Variant* aResult, bool* aSuccess) { if (!mObject) { NS_WARNING("Calling AnswerInvoke with an invalidated object!"); *aResult = void_t(); *aSuccess = false; return true; } NS_ASSERTION(mObject->_class != GetClass(), "Bad object type!"); NS_ASSERTION(mType == LocalObject, "Bad type!"); PluginInstanceParent* instance = GetInstance(); if (!instance) { NS_ERROR("No instance?!"); *aResult = void_t(); *aSuccess = false; return true; } const NPNetscapeFuncs* npn = GetNetscapeFuncs(instance); if (!npn) { NS_ERROR("No netscape funcs?!"); *aResult = void_t(); *aSuccess = false; return true; } nsAutoTArray<NPVariant, 10> convertedArgs; uint32_t argCount = aArgs.Length(); if (!convertedArgs.SetLength(argCount)) { *aResult = void_t(); *aSuccess = false; return true; } for (uint32_t index = 0; index < argCount; index++) { if (!ConvertToVariant(aArgs[index], convertedArgs[index], instance)) { // Don't leak things we've already converted! while (index-- > 0) { ReleaseVariant(convertedArgs[index], instance); } *aResult = void_t(); *aSuccess = false; return true; } } PluginIdentifierParent* id = static_cast<PluginIdentifierParent*>(aId); NPVariant result; bool success = npn->invoke(instance->GetNPP(), mObject, id->ToNPIdentifier(), convertedArgs.Elements(), argCount, &result); for (uint32_t index = 0; index < argCount; index++) { ReleaseVariant(convertedArgs[index], instance); } if (!success) { *aResult = void_t(); *aSuccess = false; return true; } Variant convertedResult; success = ConvertToRemoteVariant(result, convertedResult, GetInstance()); DeferNPVariantLastRelease(npn, &result); if (!success) { *aResult = void_t(); *aSuccess = false; return true; } *aResult = convertedResult; *aSuccess = true; return true; }