NS_IMETHODIMP nsNPAPIPluginInstance::IsRemoteDrawingCoreAnimation(PRBool* aDrawing) { #ifdef XP_MACOSX if (!mPlugin) return NS_ERROR_FAILURE; PluginLibrary* library = mPlugin->GetLibrary(); if (!library) return NS_ERROR_FAILURE; return library->IsRemoteDrawingCoreAnimation(&mNPP, aDrawing); #else return NS_ERROR_FAILURE; #endif }
nsresult nsNPAPIPluginInstance::ContentsScaleFactorChanged(double aContentsScaleFactor) { #ifdef XP_MACOSX if (!mPlugin) return NS_ERROR_FAILURE; PluginLibrary* library = mPlugin->GetLibrary(); if (!library) return NS_ERROR_FAILURE; // We only need to call this if the plugin is running OOP. if (!library->IsOOP()) return NS_OK; return library->ContentsScaleFactorChanged(&mNPP, aContentsScaleFactor); #else return NS_ERROR_FAILURE; #endif }
nsresult nsNPAPIPluginInstance::InitializePlugin() { PluginDestructionGuard guard(this); PRUint16 count = 0; const char* const* names = nsnull; const char* const* values = nsnull; nsPluginTagType tagtype; nsresult rv = GetTagType(&tagtype); if (NS_SUCCEEDED(rv)) { // Note: If we failed to get the tag type, we may be a full page plugin, so no arguments rv = GetAttributes(count, names, values); NS_ENSURE_SUCCESS(rv, rv); // nsPluginTagType_Object or Applet may also have PARAM tags // Note: The arrays handed back by GetParameters() are // crafted specially to be directly behind the arrays from GetAttributes() // with a null entry as a separator. This is for 4.x backwards compatibility! // see bug 111008 for details if (tagtype != nsPluginTagType_Embed) { PRUint16 pcount = 0; const char* const* pnames = nsnull; const char* const* pvalues = nsnull; if (NS_SUCCEEDED(GetParameters(pcount, pnames, pvalues))) { NS_ASSERTION(!values[count], "attribute/parameter array not setup correctly for NPAPI plugins"); if (pcount) count += ++pcount; // if it's all setup correctly, then all we need is to // change the count (attrs + PARAM/blank + params) } } } PRInt32 mode; const char* mimetype; NPError error = NPERR_GENERIC_ERROR; GetMode(&mode); GetMIMEType(&mimetype); // Some older versions of Flash have a bug in them // that causes the stack to become currupt if we // pass swliveconnect=1 in the NPP_NewProc arrays. // See bug 149336 (UNIX), bug 186287 (Mac) // // The code below disables the attribute unless // the environment variable: // MOZILLA_PLUGIN_DISABLE_FLASH_SWLIVECONNECT_HACK // is set. // // It is okay to disable this attribute because // back in 4.x, scripting required liveconnect to // start Java which was slow. Scripting no longer // requires starting Java and is quick plus controled // from the browser, so Flash now ignores this attribute. // // This code can not be put at the time of creating // the array because we may need to examine the // stream header to determine we want Flash. static const char flashMimeType[] = "application/x-shockwave-flash"; static const char blockedParam[] = "swliveconnect"; if (count && !PL_strcasecmp(mimetype, flashMimeType)) { static int cachedDisableHack = 0; if (!cachedDisableHack) { if (PR_GetEnv("MOZILLA_PLUGIN_DISABLE_FLASH_SWLIVECONNECT_HACK")) cachedDisableHack = -1; else cachedDisableHack = 1; } if (cachedDisableHack > 0) { for (PRUint16 i=0; i<count; i++) { if (!PL_strcasecmp(names[i], blockedParam)) { // BIG FAT WARNIG: // I'm ugly casting |const char*| to |char*| and altering it // because I know we do malloc it values in // http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/layout/html/base/src/nsObjectFrame.cpp&rev=1.349&root=/cvsroot#3020 // and free it at line #2096, so it couldn't be a const ptr to string literal char *val = (char*) values[i]; if (val && *val) { // we cannot just *val=0, it won't be free properly in such case val[0] = '0'; val[1] = 0; } break; } } } } PRBool oldVal = mInPluginInitCall; mInPluginInitCall = PR_TRUE; // Need this on the stack before calling NPP_New otherwise some callbacks that // the plugin may make could fail (NPN_HasProperty, for example). NPPAutoPusher autopush(&mNPP); if (!mPlugin) return NS_ERROR_FAILURE; PluginLibrary* library = mPlugin->GetLibrary(); if (!library) return NS_ERROR_FAILURE; // Mark this instance as running before calling NPP_New because the plugin may // call other NPAPI functions, like NPN_GetURLNotify, that assume this is set // before returning. If the plugin returns failure, we'll clear it out below. mRunning = RUNNING; nsresult newResult = library->NPP_New((char*)mimetype, &mNPP, (PRUint16)mode, count, (char**)names, (char**)values, NULL, &error); mInPluginInitCall = oldVal; NPP_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPP New called: this=%p, npp=%p, mime=%s, mode=%d, argc=%d, return=%d\n", this, &mNPP, mimetype, mode, count, error)); if (NS_FAILED(newResult) || error != NPERR_NO_ERROR) { mRunning = DESTROYED; nsJSNPRuntime::OnPluginDestroy(&mNPP); return NS_ERROR_FAILURE; } return NS_OK; }
bool ComponentManager::loadLibrary(const std::string & filePath, bool reload) { // Check if library is already loaded and reload is not requested auto it = m_librariesByFilePath.find(filePath); if (it != m_librariesByFilePath.cend() && !reload) { return true; } // Load module information file, if present cpplocate::ModuleInfo modInfo; modInfo.load(filePath + ".modinfo"); // If library was already loaded, remember it in case reloading fails PluginLibrary * previous = nullptr; if (it != m_librariesByFilePath.cend()) { previous = it->second; } // Open plugin library PluginLibrary * library = new PluginLibrary(filePath); if (!library->isValid()) { // Loading failed. Destroy library object and return failure. cppassist::warning() << (previous ? "Reloading" : "Loading") << " plugin(s) from '" << filePath << "' failed."; delete library; return false; } // Library has been loaded. Unload previous incarnation. if (previous) { unloadLibrary(previous); } // Add library to list (in case of reload, this overwrites the previous) m_librariesByFilePath[filePath] = library; // Initialize plugin library library->initialize(); // Iterate over plugins const unsigned int numComponents = library->numComponents(); for (unsigned int i = 0; i < numComponents; ++i) { // Get component AbstractComponent * component = library->component(i); if (!component) continue; // Set module information if (!modInfo.empty()) { component->setModuleInfo(modInfo); } // Add component to list m_components.push_back(component); // Save component by name std::string name = component->name(); m_componentsByName[name] = component; } // Return success return true; }
nsresult nsNPAPIPluginInstance::Start() { if (mRunning == RUNNING) { return NS_OK; } if (!mOwner) { MOZ_ASSERT(false, "Should not be calling Start() on unowned plugin."); return NS_ERROR_FAILURE; } PluginDestructionGuard guard(this); nsTArray<MozPluginParameter> attributes; nsTArray<MozPluginParameter> params; nsPluginTagType tagtype; nsresult rv = GetTagType(&tagtype); if (NS_SUCCEEDED(rv)) { mOwner->GetAttributes(attributes); mOwner->GetParameters(params); } else { MOZ_ASSERT(false, "Failed to get tag type."); } mCachedParamLength = attributes.Length() + 1 + params.Length(); // We add an extra entry "PARAM" as a separator between the attribute // and param values, but we don't count it if there are no <param> entries. // Legacy behavior quirk. uint32_t quirkParamLength = params.Length() ? mCachedParamLength : attributes.Length(); mCachedParamNames = (char**)moz_xmalloc(sizeof(char*) * mCachedParamLength); mCachedParamValues = (char**)moz_xmalloc(sizeof(char*) * mCachedParamLength); for (uint32_t i = 0; i < attributes.Length(); i++) { mCachedParamNames[i] = ToNewUTF8String(attributes[i].mName); mCachedParamValues[i] = ToNewUTF8String(attributes[i].mValue); } // Android expects and empty string instead of null. mCachedParamNames[attributes.Length()] = ToNewUTF8String(NS_LITERAL_STRING("PARAM")); #ifdef MOZ_WIDGET_ANDROID mCachedParamValues[attributes.Length()] = ToNewUTF8String(NS_LITERAL_STRING("")); #else mCachedParamValues[attributes.Length()] = nullptr; #endif for (uint32_t i = 0, pos = attributes.Length() + 1; i < params.Length(); i ++) { mCachedParamNames[pos] = ToNewUTF8String(params[i].mName); mCachedParamValues[pos] = ToNewUTF8String(params[i].mValue); pos++; } int32_t mode; const char* mimetype; NPError error = NPERR_GENERIC_ERROR; GetMode(&mode); GetMIMEType(&mimetype); CheckJavaC2PJSObjectQuirk(quirkParamLength, mCachedParamNames, mCachedParamValues); bool oldVal = mInPluginInitCall; mInPluginInitCall = true; // Need this on the stack before calling NPP_New otherwise some callbacks that // the plugin may make could fail (NPN_HasProperty, for example). NPPAutoPusher autopush(&mNPP); if (!mPlugin) return NS_ERROR_FAILURE; PluginLibrary* library = mPlugin->GetLibrary(); if (!library) return NS_ERROR_FAILURE; // Mark this instance as running before calling NPP_New because the plugin may // call other NPAPI functions, like NPN_GetURLNotify, that assume this is set // before returning. If the plugin returns failure, we'll clear it out below. mRunning = RUNNING; nsresult newResult = library->NPP_New((char*)mimetype, &mNPP, (uint16_t)mode, quirkParamLength, mCachedParamNames, mCachedParamValues, nullptr, &error); mInPluginInitCall = oldVal; NPP_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPP New called: this=%p, npp=%p, mime=%s, mode=%d, argc=%d, return=%d\n", this, &mNPP, mimetype, mode, quirkParamLength, error)); if (NS_FAILED(newResult) || error != NPERR_NO_ERROR) { mRunning = DESTROYED; nsJSNPRuntime::OnPluginDestroy(&mNPP); return NS_ERROR_FAILURE; } return newResult; }