diff --git a/browser/modules/E10SUtils.jsm b/browser/modules/E10SUtils.jsm index d14be93a4d9d..381907f9afa1 100644 --- a/browser/modules/E10SUtils.jsm +++ b/browser/modules/E10SUtils.jsm @@ -30,20 +30,13 @@ function getAboutModule(aURL) { const NOT_REMOTE = null; const WEB_REMOTE_TYPE = "web"; -const FILE_REMOTE_TYPE = "file"; // This must match the one in ContentParent.h. const DEFAULT_REMOTE_TYPE = WEB_REMOTE_TYPE; -function validatedWebRemoteType(aPreferredRemoteType) { - return aPreferredRemoteType && aPreferredRemoteType.startsWith(WEB_REMOTE_TYPE) - ? aPreferredRemoteType : WEB_REMOTE_TYPE; -} - this.E10SUtils = { DEFAULT_REMOTE_TYPE, NOT_REMOTE, WEB_REMOTE_TYPE, - FILE_REMOTE_TYPE, canLoadURIInProcess: function(aURL, aProcess) { let remoteType = aProcess == Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT @@ -74,11 +67,6 @@ this.E10SUtils = { : aPreferredRemoteType; } - if (aURL.startsWith("file:")) { - return Services.prefs.getBoolPref("browser.tabs.remote.separateFileUriProcess") - ? FILE_REMOTE_TYPE : DEFAULT_REMOTE_TYPE; - } - if (aURL.startsWith("about:")) { // We need to special case about:blank because it needs to load in any. if (aURL == "about:blank") { @@ -139,7 +127,7 @@ this.E10SUtils = { aMultiProcess, aPreferredRemoteType); } - return validatedWebRemoteType(aPreferredRemoteType); + return WEB_REMOTE_TYPE; }, shouldLoadURIInThisProcess: function(aURI) { diff --git a/devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js b/devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js index 1ce2e13a53e2..20aafba730c1 100644 --- a/devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js +++ b/devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js @@ -23,7 +23,7 @@ add_task(function* () { // We need a file remote type to make sure we don't switch processes when we // load the file:// URI. - let { browser } = yield loadTab("about:blank", E10SUtils.FILE_REMOTE_TYPE); + let { browser } = yield loadTab("about:blank", "file"); hud = yield openConsole(); hud.jsterm.clearOutput(); diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 9df080addfd0..d88cc1f43fe5 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -498,7 +498,8 @@ ContentParentsMemoryReporter::CollectReports( return NS_OK; } -nsClassHashtable>* ContentParent::sBrowserContentParents; +nsTArray* ContentParent::sBrowserContentParents; +nsTArray* ContentParent::sLargeAllocationContentParents; nsTArray* ContentParent::sPrivateContent; StaticAutoPtr > ContentParent::sContentParents; #if defined(XP_LINUX) && defined(MOZ_CONTENT_SANDBOX) @@ -647,22 +648,24 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType, ContentParent* aOpener, bool aLargeAllocationProcess) { - if (!sBrowserContentParents) { - sBrowserContentParents = - new nsClassHashtable>; - } + nsTArray* contentParents; + int32_t maxContentParents; // Decide which pool of content parents we are going to be pulling from based - // on the aRemoteType and aLargeAllocationProcess flag. - nsAutoString contentProcessType(aLargeAllocationProcess - ? LARGE_ALLOCATION_REMOTE_TYPE : aRemoteType); - nsTArray* contentParents = - sBrowserContentParents->LookupOrAdd(contentProcessType); + // on the aLargeAllocationProcess flag. + if (aLargeAllocationProcess) { + if (!sLargeAllocationContentParents) { + sLargeAllocationContentParents = new nsTArray(); + } + contentParents = sLargeAllocationContentParents; + + maxContentParents = Preferences::GetInt("dom.ipc.dedicatedProcessCount", 2); + } else { + if (!sBrowserContentParents) { + sBrowserContentParents = new nsTArray(); + } + contentParents = sBrowserContentParents; - int32_t maxContentParents; - nsAutoCString processCountPref("dom.ipc.processCount."); - processCountPref.Append(NS_ConvertUTF16toUTF8(contentProcessType)); - if (NS_FAILED(Preferences::GetInt(processCountPref.get(), &maxContentParents))) { maxContentParents = Preferences::GetInt("dom.ipc.processCount", 1); } @@ -685,7 +688,7 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType, } while (currIdx != startIdx); } - RefPtr p = new ContentParent(aOpener, contentProcessType); + RefPtr p = new ContentParent(aOpener, aRemoteType); if (!p->LaunchSubprocess(aPriority)) { return nullptr; @@ -693,6 +696,8 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType, p->Init(); + p->mLargeAllocationProcess = aLargeAllocationProcess; + contentParents->AppendElement(p); return p.forget(); } @@ -1283,17 +1288,18 @@ void ContentParent::MarkAsDead() { if (sBrowserContentParents) { - nsTArray* contentParents = - sBrowserContentParents->Get(mRemoteType); - if (contentParents) { - contentParents->RemoveElement(this); - if (contentParents->IsEmpty()) { - sBrowserContentParents->Remove(mRemoteType); - if (sBrowserContentParents->IsEmpty()) { - delete sBrowserContentParents; - sBrowserContentParents = nullptr; - } - } + sBrowserContentParents->RemoveElement(this); + if (!sBrowserContentParents->Length()) { + delete sBrowserContentParents; + sBrowserContentParents = nullptr; + } + } + + if (sLargeAllocationContentParents) { + sLargeAllocationContentParents->RemoveElement(this); + if (!sLargeAllocationContentParents->Length()) { + delete sLargeAllocationContentParents; + sLargeAllocationContentParents = nullptr; } } @@ -1601,38 +1607,6 @@ ContentParent::ActorDestroy(ActorDestroyReason why) #endif } -bool -ContentParent::ShouldKeepProcessAlive() const -{ - if (!sBrowserContentParents) { - return false; - } - - // If we have already been marked as dead, don't prevent shutdown. - if (!IsAlive()) { - return false; - } - - // Only keep processes for the default remote type alive. - if (!mRemoteType.Equals(DEFAULT_REMOTE_TYPE)) { - return false; - } - - auto contentParents = sBrowserContentParents->Get(mRemoteType); - if (!contentParents) { - return false; - } - - // We might want to keep alive some content processes for testing, because of - // performance reasons. - // We don't want to alter behavior if the pref is not set, so default to 0. - int32_t processesToKeepAlive = - Preferences::GetInt("dom.ipc.keepProcessesAlive", 0); - int32_t numberOfAliveProcesses = contentParents->Length(); - - return numberOfAliveProcesses <= processesToKeepAlive; -} - void ContentParent::NotifyTabDestroying(const TabId& aTabId, const ContentParentId& aCpId) @@ -1654,7 +1628,9 @@ ContentParent::NotifyTabDestroying(const TabId& aTabId, return; } - if (cp->ShouldKeepProcessAlive()) { + uint32_t numberOfParents = sBrowserContentParents ? sBrowserContentParents->Length() : 0; + int32_t processesToKeepAlive = Preferences::GetInt("dom.ipc.keepProcessesAlive", 0); + if (!cp->mLargeAllocationProcess && static_cast(numberOfParents) <= processesToKeepAlive) { return; } @@ -1707,7 +1683,14 @@ ContentParent::NotifyTabDestroyed(const TabId& aTabId, ContentProcessManager* cpm = ContentProcessManager::GetSingleton(); nsTArray tabIds = cpm->GetTabParentsByProcessId(this->ChildID()); - if (tabIds.Length() == 1 && !ShouldKeepProcessAlive()) { + // We might want to keep alive some content processes for testing, because of performance + // reasons, but we don't want to alter behavior if the pref is not set. + uint32_t numberOfParents = sBrowserContentParents ? sBrowserContentParents->Length() : 0; + int32_t processesToKeepAlive = Preferences::GetInt("dom.ipc.keepProcessesAlive", 0); + bool shouldKeepAliveAny = !mLargeAllocationProcess && processesToKeepAlive > 0; + bool shouldKeepAliveThis = shouldKeepAliveAny && static_cast(numberOfParents) <= processesToKeepAlive; + + if (tabIds.Length() == 1 && !shouldKeepAliveThis) { // In the case of normal shutdown, send a shutdown message to child to // allow it to perform shutdown tasks. MessageLoop::current()->PostTask(NewRunnableMethod @@ -1796,6 +1779,7 @@ ContentParent::ContentParent(ContentParent* aOpener, , mOpener(aOpener) , mRemoteType(aRemoteType) , mIsForBrowser(!mRemoteType.IsEmpty()) + , mLargeAllocationProcess(false) { InitializeMembers(); // Perform common initialization. @@ -1831,9 +1815,10 @@ ContentParent::~ContentParent() // We should be removed from all these lists in ActorDestroy. MOZ_ASSERT(!sPrivateContent || !sPrivateContent->Contains(this)); - MOZ_ASSERT(!sBrowserContentParents || - !sBrowserContentParents->Contains(mRemoteType) || - !sBrowserContentParents->Get(mRemoteType)->Contains(this)); + MOZ_ASSERT((!sBrowserContentParents || + !sBrowserContentParents->Contains(this)) && + (!sLargeAllocationContentParents || + !sLargeAllocationContentParents->Contains(this))); } void diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index e163d0269a48..462fc328ff5f 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -87,9 +87,6 @@ class GetFilesHelper; // This must match the one in E10SUtils.jsm. static NS_NAMED_LITERAL_STRING(DEFAULT_REMOTE_TYPE, "web"); -// This must start with the DEFAULT_REMOTE_TYPE above. -static NS_NAMED_LITERAL_STRING(LARGE_ALLOCATION_REMOTE_TYPE, - "webLargeAllocation"); static NS_NAMED_LITERAL_STRING(NO_REMOTE_TYPE, ""); class ContentParent final : public PContentParent @@ -574,7 +571,8 @@ protected: void OnCompositorUnexpectedShutdown() override; private: - static nsClassHashtable>* sBrowserContentParents; + static nsTArray* sBrowserContentParents; + static nsTArray* sLargeAllocationContentParents; static nsTArray* sPrivateContent; static StaticAutoPtr > sContentParents; @@ -647,12 +645,6 @@ private: // unlikely that the process will be killed after this point. bool SetPriorityAndCheckIsAlive(hal::ProcessPriority aPriority); - /** - * Decide whether the process should be kept alive even when it would normally - * be shut down, for example when all its tabs are closed. - */ - bool ShouldKeepProcessAlive() const; - /** * Mark this ContentParent as dead for the purposes of Get*(). * This method is idempotent. @@ -1166,6 +1158,7 @@ private: nsRefPtrHashtable mGetFilesPendingRequests; nsTArray mBlobURLs; + bool mLargeAllocationProcess; }; } // namespace dom diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index a77297424063..ec0f57b3024b 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -2866,17 +2866,6 @@ pref("dom.ipc.plugins.asyncdrawing.enabled", true); pref("dom.ipc.processCount", 1); -// Override default dom.ipc.processCount for some remote content process types. -pref("dom.ipc.processCount.webLargeAllocation", 2); - -// Pref to control whether we use separate content processes for top-level load -// of file:// URIs. -#if defined(NIGHTLY_BUILD) -pref("browser.tabs.remote.separateFileUriProcess", true); -#else -pref("browser.tabs.remote.separateFileUriProcess", false); -#endif - // Enable caching of Moz2D Path objects for SVG geometry elements pref("svg.path-caching.enabled", true);