зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1147911 Part 8: Create separate content process for file:// URIs. r=gabor, r=gijs, r=smaug
This commit is contained in:
Родитель
ce1bc7d820
Коммит
52529cb9a9
|
@ -26,13 +26,20 @@ 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
|
||||
|
@ -55,6 +62,11 @@ this.E10SUtils = {
|
|||
return 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") {
|
||||
|
@ -115,7 +127,7 @@ this.E10SUtils = {
|
|||
aMultiProcess, aPreferredRemoteType);
|
||||
}
|
||||
|
||||
return WEB_REMOTE_TYPE;
|
||||
return validatedWebRemoteType(aPreferredRemoteType);
|
||||
},
|
||||
|
||||
shouldLoadURIInThisProcess: function(aURI) {
|
||||
|
|
|
@ -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", "file");
|
||||
let { browser } = yield loadTab("about:blank", E10SUtils.FILE_REMOTE_TYPE);
|
||||
|
||||
hud = yield openConsole();
|
||||
hud.jsterm.clearOutput();
|
||||
|
|
|
@ -494,8 +494,7 @@ ContentParentsMemoryReporter::CollectReports(
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
nsTArray<ContentParent*>* ContentParent::sBrowserContentParents;
|
||||
nsTArray<ContentParent*>* ContentParent::sLargeAllocationContentParents;
|
||||
nsClassHashtable<nsStringHashKey, nsTArray<ContentParent*>>* ContentParent::sBrowserContentParents;
|
||||
nsTArray<ContentParent*>* ContentParent::sPrivateContent;
|
||||
StaticAutoPtr<LinkedList<ContentParent> > ContentParent::sContentParents;
|
||||
#if defined(XP_LINUX) && defined(MOZ_CONTENT_SANDBOX)
|
||||
|
@ -648,24 +647,22 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType,
|
|||
ContentParent* aOpener,
|
||||
bool aLargeAllocationProcess)
|
||||
{
|
||||
nsTArray<ContentParent*>* contentParents;
|
||||
int32_t maxContentParents;
|
||||
if (!sBrowserContentParents) {
|
||||
sBrowserContentParents =
|
||||
new nsClassHashtable<nsStringHashKey, nsTArray<ContentParent*>>;
|
||||
}
|
||||
|
||||
// Decide which pool of content parents we are going to be pulling from based
|
||||
// on the aLargeAllocationProcess flag.
|
||||
if (aLargeAllocationProcess) {
|
||||
if (!sLargeAllocationContentParents) {
|
||||
sLargeAllocationContentParents = new nsTArray<ContentParent*>();
|
||||
}
|
||||
contentParents = sLargeAllocationContentParents;
|
||||
|
||||
maxContentParents = Preferences::GetInt("dom.ipc.dedicatedProcessCount", 2);
|
||||
} else {
|
||||
if (!sBrowserContentParents) {
|
||||
sBrowserContentParents = new nsTArray<ContentParent*>();
|
||||
}
|
||||
contentParents = sBrowserContentParents;
|
||||
// on the aRemoteType and aLargeAllocationProcess flag.
|
||||
nsAutoString contentProcessType(aLargeAllocationProcess
|
||||
? LARGE_ALLOCATION_REMOTE_TYPE : aRemoteType);
|
||||
nsTArray<ContentParent*>* contentParents =
|
||||
sBrowserContentParents->LookupOrAdd(contentProcessType);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -688,7 +685,7 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType,
|
|||
} while (currIdx != startIdx);
|
||||
}
|
||||
|
||||
RefPtr<ContentParent> p = new ContentParent(aOpener, aRemoteType);
|
||||
RefPtr<ContentParent> p = new ContentParent(aOpener, contentProcessType);
|
||||
|
||||
if (!p->LaunchSubprocess(aPriority)) {
|
||||
return nullptr;
|
||||
|
@ -696,8 +693,6 @@ ContentParent::GetNewOrUsedBrowserProcess(const nsAString& aRemoteType,
|
|||
|
||||
p->Init();
|
||||
|
||||
p->mLargeAllocationProcess = aLargeAllocationProcess;
|
||||
|
||||
p->ForwardKnownInfo();
|
||||
|
||||
contentParents->AppendElement(p);
|
||||
|
@ -1308,18 +1303,17 @@ void
|
|||
ContentParent::MarkAsDead()
|
||||
{
|
||||
if (sBrowserContentParents) {
|
||||
sBrowserContentParents->RemoveElement(this);
|
||||
if (!sBrowserContentParents->Length()) {
|
||||
delete sBrowserContentParents;
|
||||
sBrowserContentParents = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
if (sLargeAllocationContentParents) {
|
||||
sLargeAllocationContentParents->RemoveElement(this);
|
||||
if (!sLargeAllocationContentParents->Length()) {
|
||||
delete sLargeAllocationContentParents;
|
||||
sLargeAllocationContentParents = nullptr;
|
||||
nsTArray<ContentParent*>* contentParents =
|
||||
sBrowserContentParents->Get(mRemoteType);
|
||||
if (contentParents) {
|
||||
contentParents->RemoveElement(this);
|
||||
if (contentParents->IsEmpty()) {
|
||||
sBrowserContentParents->Remove(mRemoteType);
|
||||
if (sBrowserContentParents->IsEmpty()) {
|
||||
delete sBrowserContentParents;
|
||||
sBrowserContentParents = nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1648,10 +1642,13 @@ ContentParent::NotifyTabDestroying(const TabId& aTabId,
|
|||
return;
|
||||
}
|
||||
|
||||
uint32_t numberOfParents = sBrowserContentParents ? sBrowserContentParents->Length() : 0;
|
||||
int32_t processesToKeepAlive = Preferences::GetInt("dom.ipc.keepProcessesAlive", 0);
|
||||
if (!cp->mLargeAllocationProcess && static_cast<int32_t>(numberOfParents) <= processesToKeepAlive) {
|
||||
return;
|
||||
if (sBrowserContentParents && cp->mRemoteType.Equals(DEFAULT_REMOTE_TYPE)) {
|
||||
auto contentParents = sBrowserContentParents->Get(cp->mRemoteType);
|
||||
int32_t numberOfParents = contentParents ? contentParents->Length() : 0;
|
||||
int32_t processesToKeepAlive = Preferences::GetInt("dom.ipc.keepProcessesAlive", 0);
|
||||
if (numberOfParents <= processesToKeepAlive) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// We're dying now, so prevent this content process from being
|
||||
|
@ -1705,10 +1702,13 @@ ContentParent::NotifyTabDestroyed(const TabId& aTabId,
|
|||
|
||||
// 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<int32_t>(numberOfParents) <= processesToKeepAlive;
|
||||
bool shouldKeepAliveThis = false;
|
||||
if (sBrowserContentParents && mRemoteType.Equals(DEFAULT_REMOTE_TYPE)) {
|
||||
auto contentParents = sBrowserContentParents->Get(mRemoteType);
|
||||
int32_t numberOfParents = contentParents ? contentParents->Length() : 0;
|
||||
int32_t processesToKeepAlive = Preferences::GetInt("dom.ipc.keepProcessesAlive", 0);
|
||||
shouldKeepAliveThis = numberOfParents <= processesToKeepAlive;
|
||||
}
|
||||
|
||||
if (tabIds.Length() == 1 && !shouldKeepAliveThis) {
|
||||
// In the case of normal shutdown, send a shutdown message to child to
|
||||
|
@ -1800,7 +1800,6 @@ ContentParent::ContentParent(ContentParent* aOpener,
|
|||
, mOpener(aOpener)
|
||||
, mRemoteType(aRemoteType)
|
||||
, mIsForBrowser(!mRemoteType.IsEmpty())
|
||||
, mLargeAllocationProcess(false)
|
||||
{
|
||||
InitializeMembers(); // Perform common initialization.
|
||||
|
||||
|
@ -1838,10 +1837,9 @@ ContentParent::~ContentParent()
|
|||
|
||||
// We should be removed from all these lists in ActorDestroy.
|
||||
MOZ_ASSERT(!sPrivateContent || !sPrivateContent->Contains(this));
|
||||
MOZ_ASSERT((!sBrowserContentParents ||
|
||||
!sBrowserContentParents->Contains(this)) &&
|
||||
(!sLargeAllocationContentParents ||
|
||||
!sLargeAllocationContentParents->Contains(this)));
|
||||
MOZ_ASSERT(!sBrowserContentParents ||
|
||||
!sBrowserContentParents->Contains(mRemoteType) ||
|
||||
!sBrowserContentParents->Get(mRemoteType)->Contains(this));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -87,6 +87,9 @@ 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
|
||||
|
@ -554,8 +557,7 @@ protected:
|
|||
void OnCompositorUnexpectedShutdown() override;
|
||||
|
||||
private:
|
||||
static nsTArray<ContentParent*>* sBrowserContentParents;
|
||||
static nsTArray<ContentParent*>* sLargeAllocationContentParents;
|
||||
static nsClassHashtable<nsStringHashKey, nsTArray<ContentParent*>>* sBrowserContentParents;
|
||||
static nsTArray<ContentParent*>* sPrivateContent;
|
||||
static StaticAutoPtr<LinkedList<ContentParent> > sContentParents;
|
||||
|
||||
|
@ -1152,7 +1154,6 @@ private:
|
|||
nsRefPtrHashtable<nsIDHashKey, GetFilesHelper> mGetFilesPendingRequests;
|
||||
|
||||
nsTArray<nsCString> mBlobURLs;
|
||||
bool mLargeAllocationProcess;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
|
|
@ -2866,6 +2866,17 @@ 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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче