Bug 1246574 - Store sandbox level to nsPluginTag for e10s. r?jimm
When turned on e10s, plugin process creates from chrome process. So content
process doesn't know current sandbox level. To rewrite wmode attribute on
contnet process by sandbox level >= 2, we should store sandbox level to
nsPluginTag.
MozReview-Commit-ID: DCQ5g7uCbJF
--- a/dom/plugins/base/nsPluginHost.cpp
+++ b/dom/plugins/base/nsPluginHost.cpp
@@ -2455,17 +2455,18 @@ nsPluginHost::FindPluginsInContent(bool
tag.version().get(),
nsTArray<nsCString>(tag.mimeTypes()),
nsTArray<nsCString>(tag.mimeDescriptions()),
nsTArray<nsCString>(tag.extensions()),
tag.isJavaPlugin(),
tag.isFlashPlugin(),
tag.supportsAsyncInit(),
tag.lastModifiedTime(),
- tag.isFromExtension());
+ tag.isFromExtension(),
+ tag.sandboxLevel());
AddPluginTag(pluginTag);
}
}
mPluginsLoaded = true;
return NS_OK;
}
@@ -2696,17 +2697,18 @@ nsPluginHost::FindPluginsForContent(uint
tag->MimeDescriptions(),
tag->Extensions(),
tag->mIsJavaPlugin,
tag->mIsFlashPlugin,
tag->mSupportsAsyncInit,
tag->FileName(),
tag->Version(),
tag->mLastModifiedTime,
- tag->IsFromExtension()));
+ tag->IsFromExtension(),
+ tag->mSandboxLevel));
}
return NS_OK;
}
void
nsPluginHost::UpdateInMemoryPluginInfo(nsPluginTag* aPluginTag)
{
NS_ITERATIVE_UNREF_LIST(RefPtr<nsPluginTag>, mCachedPlugins, mNext);
--- a/dom/plugins/base/nsPluginTags.cpp
+++ b/dom/plugins/base/nsPluginTags.cpp
@@ -233,16 +233,17 @@ nsPluginTag::nsPluginTag(nsPluginInfo* a
mContentProcessRunningCount(0),
mHadLocalInstance(false),
mLibrary(nullptr),
mIsJavaPlugin(false),
mIsFlashPlugin(false),
mSupportsAsyncInit(false),
mFullPath(aPluginInfo->fFullPath),
mLastModifiedTime(aLastModifiedTime),
+ mSandboxLevel(0),
mCachedBlocklistState(nsIBlocklistService::STATE_NOT_BLOCKED),
mCachedBlocklistStateValid(false),
mIsFromExtension(fromExtension)
{
InitMime(aPluginInfo->fMimeTypeArray,
aPluginInfo->fMimeDescriptionArray,
aPluginInfo->fExtensionArray,
aPluginInfo->fVariantCount);
@@ -266,22 +267,24 @@ nsPluginTag::nsPluginTag(const char* aNa
mId(sNextId++),
mContentProcessRunningCount(0),
mLibrary(nullptr),
mIsJavaPlugin(false),
mIsFlashPlugin(false),
mSupportsAsyncInit(false),
mFullPath(aFullPath),
mLastModifiedTime(aLastModifiedTime),
+ mSandboxLevel(0),
mCachedBlocklistState(nsIBlocklistService::STATE_NOT_BLOCKED),
mCachedBlocklistStateValid(false),
mIsFromExtension(fromExtension)
{
InitMime(aMimeTypes, aMimeDescriptions, aExtensions,
static_cast<uint32_t>(aVariants));
+ InitSandboxLevel();
if (!aArgsAreUTF8)
EnsureMembersAreUTF8();
FixupVersion();
}
nsPluginTag::nsPluginTag(uint32_t aId,
const char* aName,
const char* aDescription,
@@ -290,26 +293,28 @@ nsPluginTag::nsPluginTag(uint32_t aId,
const char* aVersion,
nsTArray<nsCString> aMimeTypes,
nsTArray<nsCString> aMimeDescriptions,
nsTArray<nsCString> aExtensions,
bool aIsJavaPlugin,
bool aIsFlashPlugin,
bool aSupportsAsyncInit,
int64_t aLastModifiedTime,
- bool aFromExtension)
+ bool aFromExtension,
+ int32_t aSandboxLevel)
: nsIInternalPluginTag(aName, aDescription, aFileName, aVersion, aMimeTypes,
aMimeDescriptions, aExtensions),
mId(aId),
mContentProcessRunningCount(0),
mLibrary(nullptr),
mIsJavaPlugin(aIsJavaPlugin),
mIsFlashPlugin(aIsFlashPlugin),
mSupportsAsyncInit(aSupportsAsyncInit),
mLastModifiedTime(aLastModifiedTime),
+ mSandboxLevel(aSandboxLevel),
mNiceFileName(),
mCachedBlocklistState(nsIBlocklistService::STATE_NOT_BLOCKED),
mCachedBlocklistStateValid(false),
mIsFromExtension(aFromExtension)
{
}
nsPluginTag::~nsPluginTag()
@@ -404,16 +409,39 @@ void nsPluginTag::InitMime(const char* c
if (aExtensions && aExtensions[i]) {
mExtensions.AppendElement(nsCString(aExtensions[i]));
} else {
mExtensions.AppendElement(nsCString());
}
}
}
+void
+nsPluginTag::InitSandboxLevel()
+{
+#if defined(XP_WIN) && defined(MOZ_SANDBOX)
+ nsAutoCString sandboxPref("dom.ipc.plugins.sandbox-level.");
+ sandboxPref.Append(GetNiceFileName());
+ if (NS_FAILED(Preferences::GetInt(sandboxPref.get(), &mSandboxLevel))) {
+ mSandboxLevel = Preferences::GetInt("dom.ipc.plugins.sandbox-level.default"
+);
+ }
+
+#if defined(_AMD64_)
+ // As level 2 is now the default NPAPI sandbox level for 64-bit flash, we
+ // don't want to allow a lower setting unless this environment variable is
+ // set. This should be changed if the firefox.js pref file is changed.
+ if (mIsFlashPlugin &&
+ !PR_GetEnv("MOZ_ALLOW_WEAKER_SANDBOX") && mSandboxLevel < 2) {
+ mSandboxLevel = 2;
+ }
+#endif
+#endif
+}
+
#if !defined(XP_WIN) && !defined(XP_MACOSX)
static nsresult ConvertToUTF8(nsIUnicodeDecoder *aUnicodeDecoder,
nsAFlatCString& aString)
{
int32_t numberOfBytes = aString.Length();
int32_t outUnicodeLen;
nsAutoString buffer;
nsresult rv = aUnicodeDecoder->GetMaxLength(aString.get(), numberOfBytes,
--- a/dom/plugins/base/nsPluginTags.h
+++ b/dom/plugins/base/nsPluginTags.h
@@ -125,17 +125,18 @@ public:
const char* aVersion,
nsTArray<nsCString> aMimeTypes,
nsTArray<nsCString> aMimeDescriptions,
nsTArray<nsCString> aExtensions,
bool aIsJavaPlugin,
bool aIsFlashPlugin,
bool aSupportsAsyncInit,
int64_t aLastModifiedTime,
- bool aFromExtension);
+ bool aFromExtension,
+ int32_t aSandboxLevel);
void TryUnloadPlugin(bool inShutdown);
// plugin is enabled and not blocklisted
bool IsActive();
bool IsEnabled() override;
void SetEnabled(bool enabled);
@@ -165,31 +166,33 @@ public:
PRLibrary *mLibrary;
RefPtr<nsNPAPIPlugin> mPlugin;
bool mIsJavaPlugin;
bool mIsFlashPlugin;
bool mSupportsAsyncInit;
nsCString mFullPath; // UTF-8
int64_t mLastModifiedTime;
nsCOMPtr<nsITimer> mUnloadTimer;
+ int32_t mSandboxLevel;
void InvalidateBlocklistState();
private:
virtual ~nsPluginTag();
nsCString mNiceFileName; // UTF-8
uint16_t mCachedBlocklistState;
bool mCachedBlocklistStateValid;
bool mIsFromExtension;
void InitMime(const char* const* aMimeTypes,
const char* const* aMimeDescriptions,
const char* const* aExtensions,
uint32_t aVariantCount);
+ void InitSandboxLevel();
nsresult EnsureMembersAreUTF8();
void FixupVersion();
static uint32_t sNextId;
};
// A class representing "fake" plugin tags; that is plugin tags not
// corresponding to actual NPAPI plugins. In practice these are all
--- a/dom/plugins/ipc/PluginModuleParent.cpp
+++ b/dom/plugins/ipc/PluginModuleParent.cpp
@@ -486,43 +486,25 @@ PluginModuleChromeParent::SendAssociateP
// static
PluginLibrary*
PluginModuleChromeParent::LoadModule(const char* aFilePath, uint32_t aPluginId,
nsPluginTag* aPluginTag)
{
PLUGIN_LOG_DEBUG_FUNCTION;
- int32_t sandboxLevel = 0;
-#if defined(XP_WIN) && defined(MOZ_SANDBOX)
- nsAutoCString sandboxPref("dom.ipc.plugins.sandbox-level.");
- sandboxPref.Append(aPluginTag->GetNiceFileName());
- if (NS_FAILED(Preferences::GetInt(sandboxPref.get(), &sandboxLevel))) {
- sandboxLevel = Preferences::GetInt("dom.ipc.plugins.sandbox-level.default");
- }
-
-#if defined(_AMD64_)
- // As level 2 is now the default NPAPI sandbox level for 64-bit flash, we
- // don't want to allow a lower setting unless this environment variable is
- // set. This should be changed if the firefox.js pref file is changed.
- if (aPluginTag->mIsFlashPlugin &&
- !PR_GetEnv("MOZ_ALLOW_WEAKER_SANDBOX") && sandboxLevel < 2) {
- sandboxLevel = 2;
- }
-#endif
-#endif
-
nsAutoPtr<PluginModuleChromeParent> parent(
- new PluginModuleChromeParent(aFilePath, aPluginId, sandboxLevel,
+ new PluginModuleChromeParent(aFilePath, aPluginId,
+ aPluginTag->mSandboxLevel,
aPluginTag->mSupportsAsyncInit));
UniquePtr<LaunchCompleteTask> onLaunchedRunnable(new LaunchedTask(parent));
parent->mSubprocess->SetCallRunnableImmediately(!parent->mIsStartingAsync);
TimeStamp launchStart = TimeStamp::Now();
bool launched = parent->mSubprocess->Launch(Move(onLaunchedRunnable),
- sandboxLevel);
+ aPluginTag->mSandboxLevel);
if (!launched) {
// We never reached open
parent->mShutdown = true;
return nullptr;
}
parent->mIsFlashPlugin = aPluginTag->mIsFlashPlugin;
uint32_t blocklistState;
nsresult rv = aPluginTag->GetBlocklistState(&blocklistState);
@@ -1388,16 +1370,17 @@ PluginModuleParent::GetPluginDetails()
nsPluginTag* pluginTag = host->TagForPlugin(mPlugin);
if (!pluginTag) {
return false;
}
mPluginName = pluginTag->Name();
mPluginVersion = pluginTag->Version();
mPluginFilename = pluginTag->FileName();
mIsFlashPlugin = pluginTag->mIsFlashPlugin;
+ mSandboxLevel = pluginTag->mSandboxLevel;
return true;
}
void
PluginModuleParent::InitQuirksModes(const nsCString& aMimeType)
{
if (mQuirks != QUIRKS_NOT_INITIALIZED) {
return;
--- a/dom/plugins/ipc/PluginTypes.ipdlh
+++ b/dom/plugins/ipc/PluginTypes.ipdlh
@@ -16,16 +16,17 @@ struct PluginTag
nsCString[] extensions;
bool isJavaPlugin;
bool isFlashPlugin;
bool supportsAsyncInit;
nsCString filename;
nsCString version;
int64_t lastModifiedTime;
bool isFromExtension;
+ int32_t sandboxLevel;
};
union PluginIdentifier
{
nsCString;
int32_t;
};