From 3a7a9e1a4458ad5b66ef8a540568892268928ebf Mon Sep 17 00:00:00 2001 From: "dtownsend%oxymoronical.com" Date: Tue, 18 Mar 2008 10:38:16 +0000 Subject: [PATCH] Bug 419582: Unblocklisted plugin should be set to enable on startup. r+sr=jst git-svn-id: svn://10.0.0.236/trunk@248060 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/dom/src/base/nsGlobalWindow.cpp | 8 --- mozilla/modules/oji/src/nsJVMManager.cpp | 56 ++++++++++++------- .../plugin/base/src/nsPluginHostImpl.cpp | 32 +++++------ .../plugin/base/src/nsPluginHostImpl.h | 23 +++++--- .../mozapps/extensions/content/extensions.js | 8 ++- 5 files changed, 68 insertions(+), 59 deletions(-) diff --git a/mozilla/dom/src/base/nsGlobalWindow.cpp b/mozilla/dom/src/base/nsGlobalWindow.cpp index 0475c4ee2e0..ade1aae051f 100644 --- a/mozilla/dom/src/base/nsGlobalWindow.cpp +++ b/mozilla/dom/src/base/nsGlobalWindow.cpp @@ -9225,14 +9225,6 @@ nsNavigator::JavaEnabled(PRBool *aReturn) *aReturn = PR_FALSE; #ifdef OJI - // determine whether user has enabled java. - // if pref doesn't exist, map result to false. - *aReturn = nsContentUtils::GetBoolPref("security.enable_java"); - - // if Java is not enabled, result is false and return reight away - if (!*aReturn) - return NS_OK; - // Ask the nsIJVMManager if Java is enabled nsCOMPtr jvmService = do_GetService(kJVMServiceCID); if (jvmService) { diff --git a/mozilla/modules/oji/src/nsJVMManager.cpp b/mozilla/modules/oji/src/nsJVMManager.cpp index eb950cca436..c426ae44ae9 100644 --- a/mozilla/modules/oji/src/nsJVMManager.cpp +++ b/mozilla/modules/oji/src/nsJVMManager.cpp @@ -83,9 +83,7 @@ #include "nsIStringBundle.h" #include "nsIObserver.h" -#include "nsIPrefBranch.h" -#include "nsIPrefBranch2.h" -#include "nsIPrefService.h" +#include "nsIObserverService.h" #include "lcglue.h" #include "nspr.h" @@ -94,6 +92,7 @@ #include "nsIPrincipal.h" #include "nsIScriptSecurityManager.h" #include "nsISignatureVerifier.h" +#include "nsSupportsPrimitives.h" extern "C" int XP_PROGRESS_STARTING_JAVA; @@ -384,26 +383,37 @@ nsJVMManager::PostEvent(PRThread* prthread, nsIRunnable* runnable, PRBool async) } nsJVMManager::nsJVMManager(nsISupports* outer) - : fJVM(NULL), fStatus(nsJVMStatus_Enabled), + : fJVM(NULL), fStatus(nsJVMStatus_Disabled), fDebugManager(NULL), fJSJavaVM(NULL), fClassPathAdditions(new nsVoidArray()), fClassPathAdditionsString(NULL), fStartupMessagePosted(PR_FALSE) { NS_INIT_AGGREGATED(outer); - nsCOMPtr branch = do_GetService(NS_PREFSERVICE_CONTRACTID); - if (branch) { - branch->AddObserver("security.enable_java", this, PR_FALSE); - PRBool prefBool = PR_TRUE; - nsresult rv = branch->GetBoolPref("security.enable_java", &prefBool); - if (NS_SUCCEEDED(rv)) { - SetJVMEnabled(prefBool); + nsCOMPtr host = do_GetService(kPluginManagerCID); + if (host) { + if (NS_SUCCEEDED(host->IsPluginEnabledForType(NS_JVM_MIME_TYPE))) { + SetJVMEnabled(PR_TRUE); } } + + nsCOMPtr + obsService(do_GetService("@mozilla.org/observer-service;1")); + if (obsService) { + obsService->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID, PR_FALSE); + obsService->AddObserver(this, NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID, PR_FALSE); + } } nsJVMManager::~nsJVMManager() { + nsCOMPtr + obsService(do_GetService("@mozilla.org/observer-service;1")); + if (obsService) { + obsService->RemoveObserver(this, NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID); + obsService->RemoveObserver(this, NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID); + } + int count = fClassPathAdditions->Count(); for (int i = 0; i < count; i++) { PR_Free((*fClassPathAdditions)[i]); @@ -844,17 +854,21 @@ nsJVMManager::Observe(nsISupports* subject, const char* topic, const PRUnichar* data_unicode) { - nsresult rv; - nsCOMPtr branch = do_QueryInterface(subject, &rv); - if (NS_FAILED(rv)) return rv; - - PRBool prefBool = PR_TRUE; - rv = branch->GetBoolPref("security.enable_java", &prefBool); - if (NS_SUCCEEDED(rv)) { - SetJVMEnabled(prefBool); + if (nsDependentString(data_unicode).Equals(NS_LITERAL_STRING("Gecko-Content-Viewers"))) { + nsCString mimeType; + nsCOMPtr type = do_QueryInterface(subject); + nsresult rv = type->GetData(mimeType); + NS_ENSURE_SUCCESS(rv, rv); + if (mimeType.Equals(NS_JVM_MIME_TYPE)) { + if (strcmp(topic, NS_XPCOM_CATEGORY_ENTRY_ADDED_OBSERVER_ID) == 0) { + SetJVMEnabled(PR_TRUE); + } + else if (strcmp(topic, NS_XPCOM_CATEGORY_ENTRY_REMOVED_OBSERVER_ID) == 0) { + SetJVMEnabled(PR_FALSE); + } + } } - - return rv; + return NS_OK; } nsJVMStatus diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp index bb18bec014d..dc0ec8cb501 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.cpp @@ -1075,11 +1075,9 @@ nsPluginTag::SetBlocklisted(PRBool aBlocklisted) if (HasFlag(NS_PLUGIN_FLAG_BLOCKLISTED) == aBlocklisted) return NS_OK; - if (aBlocklisted) { + if (aBlocklisted) Mark(NS_PLUGIN_FLAG_BLOCKLISTED); - if (HasFlag(NS_PLUGIN_FLAG_ENABLED)) - UnMark(NS_PLUGIN_FLAG_ENABLED); - } else + else UnMark(NS_PLUGIN_FLAG_BLOCKLISTED); mPluginHost->UpdatePluginInfo(nsnull); @@ -3531,7 +3529,7 @@ NS_IMETHODIMP nsPluginHostImpl::InstantiateEmbeddedPlugin(const char *aMimeType, // disabled, we don't want to go on and end up in SetUpDefaultPluginInstance. nsPluginTag* pluginTag = FindPluginForType(aMimeType, PR_FALSE); if (pluginTag) { - if (!pluginTag->HasFlag(NS_PLUGIN_FLAG_ENABLED)) { + if (!pluginTag->IsEnabled()) { return NS_ERROR_NOT_AVAILABLE; } } else if (!mJavaEnabled && IsJavaMIMEType(aMimeType)) { @@ -4217,13 +4215,7 @@ nsPluginHostImpl::IsPluginEnabledForType(const char* aMimeType) return NS_ERROR_FAILURE; } - if (!mJavaEnabled && IsJavaMIMEType(aMimeType)) { - // Return DISABLED whether we have a java plugin or not -- if it's - // disabled, it's disabled. - return NS_ERROR_PLUGIN_DISABLED; - } - - if (!plugin->HasFlag(NS_PLUGIN_FLAG_ENABLED)) { + if (!plugin->IsEnabled()) { if (plugin->HasFlag(NS_PLUGIN_FLAG_BLOCKLISTED)) return NS_ERROR_PLUGIN_BLOCKLISTED; else @@ -4431,7 +4423,7 @@ nsPluginHostImpl::GetPluginCount(PRUint32* aPluginCount) nsPluginTag* plugin = mPlugins; while (plugin != nsnull) { - if (plugin->HasFlag(NS_PLUGIN_FLAG_ENABLED)) { + if (plugin->IsEnabled()) { ++count; } plugin = plugin->mNext; @@ -4451,7 +4443,7 @@ nsPluginHostImpl::GetPlugins(PRUint32 aPluginCount, nsIDOMPlugin** aPluginArray) nsPluginTag* plugin = mPlugins; for (PRUint32 i = 0; i < aPluginCount && plugin; plugin = plugin->mNext) { - if (plugin->HasFlag(NS_PLUGIN_FLAG_ENABLED)) { + if (plugin->IsEnabled()) { nsIDOMPlugin* domPlugin = new DOMPluginImpl(plugin); NS_IF_ADDREF(domPlugin); aPluginArray[i++] = domPlugin; @@ -4511,7 +4503,7 @@ nsPluginHostImpl::FindPluginForType(const char* aMimeType, variants = plugins->mVariants; for (cnt = 0; cnt < variants; cnt++) { - if ((!aCheckEnabled || plugins->HasFlag(NS_PLUGIN_FLAG_ENABLED)) && + if ((!aCheckEnabled || plugins->IsEnabled()) && plugins->mMimeTypeArray[cnt] && (0 == PL_strcasecmp(plugins->mMimeTypeArray[cnt], aMimeType))) { return plugins; @@ -4550,7 +4542,7 @@ nsPluginHostImpl::FindPluginEnabledForExtension(const char* aExtension, { // mExtensionsArray[cnt] is a list of extensions separated // by commas - if (plugins->HasFlag(NS_PLUGIN_FLAG_ENABLED) && + if (plugins->IsEnabled() && 0 == CompareExtensions(plugins->mExtensionsArray[cnt], aExtension)) { aMimeType = plugins->mMimeTypeArray[cnt]; @@ -5258,7 +5250,8 @@ nsresult nsPluginHostImpl::ScanPluginsDirectory(nsIFile * pluginsDir, pluginTag->mNext = mPlugins; mPlugins = pluginTag; - pluginTag->RegisterWithCategoryManager(mOverrideInternalTypes); + if (pluginTag->IsEnabled()) + pluginTag->RegisterWithCategoryManager(mOverrideInternalTypes); } else if (!pluginTag->HasFlag(NS_PLUGIN_FLAG_UNWANTED)) { // we don't need it, delete it; @@ -5552,7 +5545,7 @@ nsPluginHostImpl::UpdatePluginInfo(nsPluginTag* aPluginTag) WritePluginInfo(); mCachedPlugins = nsnull; - if (!aPluginTag || aPluginTag->HasFlag(NS_PLUGIN_FLAG_ENABLED)) + if (!aPluginTag || aPluginTag->IsEnabled()) return NS_OK; nsCOMPtr instsToReload; @@ -6997,7 +6990,8 @@ nsPluginHostImpl::ScanForRealInComponentsFolder(nsIComponentManager * aCompManag mPlugins = pluginTag; // last thing we need is to register this plugin with layout so it can be used in full-page mode - pluginTag->RegisterWithCategoryManager(mOverrideInternalTypes); + if (pluginTag->IsEnabled()) + pluginTag->RegisterWithCategoryManager(mOverrideInternalTypes); } } diff --git a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h index 16091ba110a..03fb8d82e05 100644 --- a/mozilla/modules/plugin/base/src/nsPluginHostImpl.h +++ b/mozilla/modules/plugin/base/src/nsPluginHostImpl.h @@ -117,24 +117,31 @@ public: void SetHost(nsPluginHostImpl * aHost); void TryUnloadPlugin(PRBool aForceShutdown = PR_FALSE); void Mark(PRUint32 mask) { + PRBool wasEnabled = IsEnabled(); mFlags |= mask; - // Add mime types to the category manager only if we were made - // 'active' by setting the host - if ((mask & NS_PLUGIN_FLAG_ENABLED) && mPluginHost) { - RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginRegister); + // Update entries in the category manager if necessary. + if (mPluginHost && wasEnabled != IsEnabled()) { + if (wasEnabled) + RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginUnregister); + else + RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginRegister); } } void UnMark(PRUint32 mask) { + PRBool wasEnabled = IsEnabled(); mFlags &= ~mask; - // Remove mime types added to the category manager only if we were - // made 'active' by setting the host - if ((mask & NS_PLUGIN_FLAG_ENABLED) && mPluginHost) { - RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginUnregister); + // Update entries in the category manager if necessary. + if (mPluginHost && wasEnabled != IsEnabled()) { + if (wasEnabled) + RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginUnregister); + else + RegisterWithCategoryManager(PR_FALSE, nsPluginTag::ePluginRegister); } } PRBool HasFlag(PRUint32 flag) { return (mFlags & flag) != 0; } PRUint32 Flags() { return mFlags; } PRBool Equals(nsPluginTag* aPluginTag); + PRBool IsEnabled() { return HasFlag(NS_PLUGIN_FLAG_ENABLED) && !HasFlag(NS_PLUGIN_FLAG_BLOCKLISTED); } enum nsRegisterType { ePluginRegister, diff --git a/mozilla/toolkit/mozapps/extensions/content/extensions.js b/mozilla/toolkit/mozapps/extensions/content/extensions.js index e3a41b7fa4e..421f4165a32 100644 --- a/mozilla/toolkit/mozapps/extensions/content/extensions.js +++ b/mozilla/toolkit/mozapps/extensions/content/extensions.js @@ -951,7 +951,8 @@ function rebuildPluginsDS() true); gPluginsDS.Assert(pluginNode, gRDF.GetResource(PREFIX_NS_EM + "isDisabled"), - gRDF.GetLiteral(plugin.disabled ? "true" : "false"), + gRDF.GetLiteral((plugin.disabled || + plugin.blocklisted) ? "true" : "false"), true); gPluginsDS.Assert(pluginNode, gRDF.GetResource(PREFIX_NS_EM + "blocklisted"), @@ -977,10 +978,11 @@ function togglePluginDisabled(aName, aDesc) plugin.disabled = !plugin.disabled; for (var i = 0; i < plugin.plugins.length; ++i) plugin.plugins[i].disabled = plugin.disabled; + var isDisabled = plugin.disabled || plugin.blocklisted; gPluginsDS.Change(gRDF.GetResource(PREFIX_ITEM_URI + plugin.filename), gRDF.GetResource(PREFIX_NS_EM + "isDisabled"), - gRDF.GetLiteral(plugin.disabled ? "false" : "true"), - gRDF.GetLiteral(plugin.disabled ? "true" : "false")); + gRDF.GetLiteral(isDisabled ? "false" : "true"), + gRDF.GetLiteral(isDisabled ? "true" : "false")); gExtensionsViewController.onCommandUpdate(); gExtensionsView.selectedItem.focus(); }