Changeset View
Changeset View
Standalone View
Standalone View
www/firefox/files/patch-bug1477129
- This file was added.
| commit fa3b659a54dc | |||||
| Author: Kris Maglione <maglione.k@gmail.com> | |||||
| Date: Thu Jul 19 18:14:13 2018 -0700 | |||||
| Bug 1477129: Part 1 - Handle BlobImpls when move constructing StructuredCloneData. r?baku | |||||
| MozReview-Commit-ID: F1pm9qTpGCV | |||||
| --- | |||||
| dom/ipc/StructuredCloneData.cpp | 1 + | |||||
| 1 file changed, 1 insertion(+) | |||||
| diff --git dom/ipc/StructuredCloneData.cpp dom/ipc/StructuredCloneData.cpp | |||||
| index 7e15fc7d79cb9..5502659c08db7 100644 | |||||
| --- dom/ipc/StructuredCloneData.cpp | |||||
| +++ dom/ipc/StructuredCloneData.cpp | |||||
| @@ -58,6 +58,7 @@ StructuredCloneData::~StructuredCloneData() | |||||
| StructuredCloneData& | |||||
| StructuredCloneData::operator=(StructuredCloneData&& aOther) | |||||
| { | |||||
| + mBlobImplArray = std::move(aOther.mBlobImplArray); | |||||
| mExternalData = std::move(aOther.mExternalData); | |||||
| mSharedData = std::move(aOther.mSharedData); | |||||
| mIPCStreams = std::move(aOther.mIPCStreams); | |||||
| commit d5f75845a151 | |||||
| Author: Kris Maglione <maglione.k@gmail.com> | |||||
| Date: Fri Jul 20 14:44:00 2018 -0700 | |||||
| Bug 1477129: Part 2 - Fix SharedMap blob handling, and add tests. r?erahm | |||||
| We were previously failing to send blobs to new content processes, which was a | |||||
| problem for those processes. But we were also attempting to extract blobs for | |||||
| new entries that we were serializing after we'd extracted their structured | |||||
| clone data, and their blob array had been thrown away (which was a problem for | |||||
| all processes). | |||||
| This patch fixes both problems. | |||||
| MozReview-Commit-ID: 3qbAmUTA85g | |||||
| --- | |||||
| dom/ipc/ContentChild.cpp | 20 ++++----- | |||||
| dom/ipc/ContentChild.h | 4 +- | |||||
| dom/ipc/ContentParent.cpp | 8 ++-- | |||||
| dom/ipc/PContent.ipdl | 4 +- | |||||
| dom/ipc/SharedMap.cpp | 49 ++++++++++++--------- | |||||
| dom/ipc/SharedMap.h | 12 +++++- | |||||
| dom/ipc/tests/test_sharedMap.js | 92 +++++++++++++++++++++++++++++++++++++++- | |||||
| js/xpconnect/loader/AutoMemMap.h | 2 +- | |||||
| 8 files changed, 145 insertions(+), 46 deletions(-) | |||||
| diff --git dom/ipc/ContentChild.cpp dom/ipc/ContentChild.cpp | |||||
| index a13c2ba0156d7..b6f212d1c4018 100644 | |||||
| --- dom/ipc/ContentChild.cpp | |||||
| +++ dom/ipc/ContentChild.cpp | |||||
| @@ -593,9 +593,7 @@ mozilla::ipc::IPCResult | |||||
| ContentChild::RecvSetXPCOMProcessAttributes(const XPCOMInitData& aXPCOMInit, | |||||
| const StructuredCloneData& aInitialData, | |||||
| nsTArray<LookAndFeelInt>&& aLookAndFeelIntCache, | |||||
| - nsTArray<SystemFontListEntry>&& aFontList, | |||||
| - const FileDescriptor& aSharedDataMapFile, | |||||
| - const uint32_t& aSharedDataMapSize) | |||||
| + nsTArray<SystemFontListEntry>&& aFontList) | |||||
| { | |||||
| if (!sShutdownCanary) { | |||||
| return IPC_OK(); | |||||
| @@ -607,9 +605,6 @@ ContentChild::RecvSetXPCOMProcessAttributes(const XPCOMInitData& aXPCOMInit, | |||||
| InitXPCOM(aXPCOMInit, aInitialData); | |||||
| InitGraphicsDeviceData(aXPCOMInit.contentDeviceData()); | |||||
| - mSharedData = new SharedMap(ProcessGlobal::Get(), aSharedDataMapFile, | |||||
| - aSharedDataMapSize); | |||||
| - | |||||
| return IPC_OK(); | |||||
| } | |||||
| @@ -2573,15 +2568,18 @@ ContentChild::RecvUpdateSharedData(const FileDescriptor& aMapFile, | |||||
| nsTArray<IPCBlob>&& aBlobs, | |||||
| nsTArray<nsCString>&& aChangedKeys) | |||||
| { | |||||
| - if (mSharedData) { | |||||
| - nsTArray<RefPtr<BlobImpl>> blobImpls(aBlobs.Length()); | |||||
| - for (auto& ipcBlob : aBlobs) { | |||||
| - blobImpls.AppendElement(IPCBlobUtils::Deserialize(ipcBlob)); | |||||
| - } | |||||
| + nsTArray<RefPtr<BlobImpl>> blobImpls(aBlobs.Length()); | |||||
| + for (auto& ipcBlob : aBlobs) { | |||||
| + blobImpls.AppendElement(IPCBlobUtils::Deserialize(ipcBlob)); | |||||
| + } | |||||
| + if (mSharedData) { | |||||
| mSharedData->Update(aMapFile, aMapSize, | |||||
| std::move(blobImpls), | |||||
| std::move(aChangedKeys)); | |||||
| + } else { | |||||
| + mSharedData = new SharedMap(ProcessGlobal::Get(), aMapFile, | |||||
| + aMapSize, std::move(blobImpls)); | |||||
| } | |||||
| return IPC_OK(); | |||||
| diff --git dom/ipc/ContentChild.h dom/ipc/ContentChild.h | |||||
| index 0fe1b6069bd39..a775ee13c64b0 100644 | |||||
| --- dom/ipc/ContentChild.h | |||||
| +++ dom/ipc/ContentChild.h | |||||
| @@ -626,9 +626,7 @@ public: | |||||
| RecvSetXPCOMProcessAttributes(const XPCOMInitData& aXPCOMInit, | |||||
| const StructuredCloneData& aInitialData, | |||||
| nsTArray<LookAndFeelInt>&& aLookAndFeelIntCache, | |||||
| - nsTArray<SystemFontListEntry>&& aFontList, | |||||
| - const FileDescriptor& aSharedDataMapFile, | |||||
| - const uint32_t& aSharedDataMapSize) override; | |||||
| + nsTArray<SystemFontListEntry>&& aFontList) override; | |||||
| virtual mozilla::ipc::IPCResult | |||||
| RecvProvideAnonymousTemporaryFile(const uint64_t& aID, const FileDescOrError& aFD) override; | |||||
| diff --git dom/ipc/ContentParent.cpp dom/ipc/ContentParent.cpp | |||||
| index da362e1a40d99..56a668ed57edd 100644 | |||||
| --- dom/ipc/ContentParent.cpp | |||||
| +++ dom/ipc/ContentParent.cpp | |||||
| @@ -2339,12 +2339,12 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority) | |||||
| ScreenManager& screenManager = ScreenManager::GetSingleton(); | |||||
| screenManager.CopyScreensToRemote(this); | |||||
| + Unused << SendSetXPCOMProcessAttributes(xpcomInit, initialData, lnfCache, | |||||
| + fontList); | |||||
| + | |||||
| ipc::WritableSharedMap* sharedData = nsFrameMessageManager::sParentProcessManager->SharedData(); | |||||
| sharedData->Flush(); | |||||
| - | |||||
| - Unused << SendSetXPCOMProcessAttributes(xpcomInit, initialData, lnfCache, | |||||
| - fontList, sharedData->CloneMapFile(), | |||||
| - sharedData->MapSize()); | |||||
| + sharedData->SendTo(this); | |||||
| nsCOMPtr<nsIChromeRegistry> registrySvc = nsChromeRegistry::GetService(); | |||||
| nsChromeRegistryChrome* chromeRegistry = | |||||
| diff --git dom/ipc/PContent.ipdl dom/ipc/PContent.ipdl | |||||
| index 9e61cadbdb151..2013e8e64b055 100644 | |||||
| --- dom/ipc/PContent.ipdl | |||||
| +++ dom/ipc/PContent.ipdl | |||||
| @@ -517,9 +517,7 @@ child: | |||||
| StructuredCloneData initialData, | |||||
| LookAndFeelInt[] lookAndFeelIntCache, | |||||
| /* used on MacOSX and Linux only: */ | |||||
| - SystemFontListEntry[] systemFontList, | |||||
| - FileDescriptor sharedDataMapFile, | |||||
| - uint32_t sharedDataMapSize); | |||||
| + SystemFontListEntry[] systemFontList); | |||||
| // Notify child that last-pb-context-exited notification was observed | |||||
| async LastPrivateDocShellDestroyed(); | |||||
| diff --git dom/ipc/SharedMap.cpp dom/ipc/SharedMap.cpp | |||||
| index b028281315bdc..23e12185ebf58 100644 | |||||
| --- dom/ipc/SharedMap.cpp | |||||
| +++ dom/ipc/SharedMap.cpp | |||||
| @@ -43,8 +43,9 @@ SharedMap::SharedMap() | |||||
| {} | |||||
| SharedMap::SharedMap(nsIGlobalObject* aGlobal, const FileDescriptor& aMapFile, | |||||
| - size_t aMapSize) | |||||
| + size_t aMapSize, nsTArray<RefPtr<BlobImpl>>&& aBlobs) | |||||
| : DOMEventTargetHelper(aGlobal) | |||||
| + , mBlobImpls(std::move(aBlobs)) | |||||
| { | |||||
| mMapFile.reset(new FileDescriptor(aMapFile)); | |||||
| mMapSize = aMapSize; | |||||
| @@ -107,7 +108,7 @@ SharedMap::Entry::Read(JSContext* aCx, | |||||
| } | |||||
| FileDescriptor | |||||
| -SharedMap::CloneMapFile() | |||||
| +SharedMap::CloneMapFile() const | |||||
| { | |||||
| if (mMap.initialized()) { | |||||
| return mMap.cloneHandle(); | |||||
| @@ -283,8 +284,9 @@ SharedMap* | |||||
| WritableSharedMap::GetReadOnly() | |||||
| { | |||||
| if (!mReadOnly) { | |||||
| + nsTArray<RefPtr<BlobImpl>> blobs(mBlobImpls); | |||||
| mReadOnly = new SharedMap(ProcessGlobal::Get(), CloneMapFile(), | |||||
| - MapSize()); | |||||
| + MapSize(), std::move(blobs)); | |||||
| } | |||||
| return mReadOnly; | |||||
| } | |||||
| @@ -349,14 +351,15 @@ WritableSharedMap::Serialize() | |||||
| for (auto& entry : IterHash(mEntries)) { | |||||
| AlignTo(&offset, kStructuredCloneAlign); | |||||
| - entry->ExtractData(&ptr[offset], offset, blobImpls.Length()); | |||||
| + size_t blobOffset = blobImpls.Length(); | |||||
| + if (entry->BlobCount()) { | |||||
| + blobImpls.AppendElements(entry->Blobs()); | |||||
| + } | |||||
| + | |||||
| + entry->ExtractData(&ptr[offset], offset, blobOffset); | |||||
| entry->Code(header); | |||||
| offset += entry->Size(); | |||||
| - | |||||
| - if (entry->BlobCount()) { | |||||
| - mBlobImpls.AppendElements(entry->Blobs()); | |||||
| - } | |||||
| } | |||||
| mBlobImpls = std::move(blobImpls); | |||||
| @@ -374,6 +377,23 @@ WritableSharedMap::Serialize() | |||||
| return Ok(); | |||||
| } | |||||
| +void | |||||
| +WritableSharedMap::SendTo(ContentParent* aParent) const | |||||
| +{ | |||||
| + nsTArray<IPCBlob> blobs(mBlobImpls.Length()); | |||||
| + | |||||
| + for (auto& blobImpl : mBlobImpls) { | |||||
| + nsresult rv = IPCBlobUtils::Serialize(blobImpl, aParent, | |||||
| + *blobs.AppendElement()); | |||||
| + if (NS_WARN_IF(NS_FAILED(rv))) { | |||||
| + continue; | |||||
| + } | |||||
| + } | |||||
| + | |||||
| + Unused << aParent->SendUpdateSharedData(CloneMapFile(), mMap.size(), | |||||
| + blobs, mChangedKeys); | |||||
| +} | |||||
| + | |||||
| void | |||||
| WritableSharedMap::BroadcastChanges() | |||||
| { | |||||
| @@ -388,18 +408,7 @@ WritableSharedMap::BroadcastChanges() | |||||
| nsTArray<ContentParent*> parents; | |||||
| ContentParent::GetAll(parents); | |||||
| for (auto& parent : parents) { | |||||
| - nsTArray<IPCBlob> blobs(mBlobImpls.Length()); | |||||
| - | |||||
| - for (auto& blobImpl : mBlobImpls) { | |||||
| - nsresult rv = IPCBlobUtils::Serialize(blobImpl, parent, | |||||
| - *blobs.AppendElement()); | |||||
| - if (NS_WARN_IF(NS_FAILED(rv))) { | |||||
| - continue; | |||||
| - } | |||||
| - } | |||||
| - | |||||
| - Unused << parent->SendUpdateSharedData(CloneMapFile(), mMap.size(), | |||||
| - blobs, mChangedKeys); | |||||
| + SendTo(parent); | |||||
| } | |||||
| if (mReadOnly) { | |||||
| diff --git dom/ipc/SharedMap.h dom/ipc/SharedMap.h | |||||
| index c89c42de0a848..70971d7376809 100644 | |||||
| --- dom/ipc/SharedMap.h | |||||
| +++ dom/ipc/SharedMap.h | |||||
| @@ -22,6 +22,9 @@ class nsIGlobalObject; | |||||
| namespace mozilla { | |||||
| namespace dom { | |||||
| + | |||||
| +class ContentParent; | |||||
| + | |||||
| namespace ipc { | |||||
| /** | |||||
| @@ -58,7 +61,8 @@ public: | |||||
| SharedMap(); | |||||
| - SharedMap(nsIGlobalObject* aGlobal, const FileDescriptor&, size_t); | |||||
| + SharedMap(nsIGlobalObject* aGlobal, const FileDescriptor&, size_t, | |||||
| + nsTArray<RefPtr<BlobImpl>>&& aBlobs); | |||||
| // Returns true if the map contains the given (UTF-8) key. | |||||
| bool Has(const nsACString& name); | |||||
| @@ -105,7 +109,7 @@ public: | |||||
| * memory region for this map. The file descriptor may be passed between | |||||
| * processes, and used to update corresponding instances in child processes. | |||||
| */ | |||||
| - FileDescriptor CloneMapFile(); | |||||
| + FileDescriptor CloneMapFile() const; | |||||
| /** | |||||
| * Returns the size of the memory mapped region that backs this map. Must be | |||||
| @@ -346,6 +350,10 @@ public: | |||||
| void Flush(); | |||||
| + // Sends the current set of shared map data to the given content process. | |||||
| + void SendTo(ContentParent* aContentParent) const; | |||||
| + | |||||
| + | |||||
| /** | |||||
| * Returns the read-only SharedMap instance corresponding to this | |||||
| * WritableSharedMap for use in the parent process. | |||||
| diff --git dom/ipc/tests/test_sharedMap.js dom/ipc/tests/test_sharedMap.js | |||||
| index a53db5d0f8668..af7858be6e4b5 100644 | |||||
| --- dom/ipc/tests/test_sharedMap.js | |||||
| +++ dom/ipc/tests/test_sharedMap.js | |||||
| @@ -2,14 +2,30 @@ | |||||
| ChromeUtils.import("resource://gre/modules/AppConstants.jsm"); | |||||
| ChromeUtils.import("resource://gre/modules/Services.jsm"); | |||||
| +ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm"); | |||||
| ChromeUtils.import("resource://testing-common/ExtensionXPCShellUtils.jsm"); | |||||
| +const PROCESS_COUNT_PREF = "dom.ipc.processCount"; | |||||
| + | |||||
| const remote = AppConstants.platform !== "android"; | |||||
| ExtensionTestUtils.init(this); | |||||
| let contentPage; | |||||
| +Cu.importGlobalProperties(["Blob", "FileReader"]); | |||||
| + | |||||
| +async function readBlob(key, sharedData = Services.cpmm.sharedData) { | |||||
| + let reader = new FileReader(); | |||||
| + reader.readAsText(sharedData.get(key)); | |||||
| + await ExtensionUtils.promiseEvent(reader, "loadend"); | |||||
| + return reader.result; | |||||
| +} | |||||
| + | |||||
| +function getKey(key, sharedData = Services.cpmm.sharedData) { | |||||
| + return sharedData.get(key); | |||||
| +} | |||||
| + | |||||
| function getContents(sharedMap = Services.cpmm.sharedData) { | |||||
| return { | |||||
| keys: Array.from(sharedMap.keys()), | |||||
| @@ -60,9 +76,23 @@ async function checkContentMaps(expected, parentOnly = false) { | |||||
| } | |||||
| } | |||||
| +async function loadContentPage() { | |||||
| + let page = await ExtensionTestUtils.loadContentPage("about:blank", {remote}); | |||||
| + registerCleanupFunction(() => page.close()); | |||||
| + | |||||
| + page.addFrameScriptHelper(` | |||||
| + ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm"); | |||||
| + Cu.importGlobalProperties(["FileReader"]); | |||||
| + `); | |||||
| + return page; | |||||
| +} | |||||
| + | |||||
| add_task(async function setup() { | |||||
| - contentPage = await ExtensionTestUtils.loadContentPage("about:blank", {remote}); | |||||
| - registerCleanupFunction(() => contentPage.close()); | |||||
| + // Start with one content process so that we can increase the number | |||||
| + // later and test the behavior of a fresh content process. | |||||
| + Services.prefs.setIntPref(PROCESS_COUNT_PREF, 1); | |||||
| + | |||||
| + contentPage = await loadContentPage(); | |||||
| }); | |||||
| add_task(async function test_sharedMap() { | |||||
| @@ -160,3 +190,61 @@ add_task(async function test_sharedMap() { | |||||
| checkParentMap(expected); | |||||
| await checkContentMaps(expected); | |||||
| }); | |||||
| + | |||||
| +add_task(async function test_blobs() { | |||||
| + let {sharedData} = Services.ppmm; | |||||
| + | |||||
| + let text = [ | |||||
| + "The quick brown fox jumps over the lazy dog", | |||||
| + "Lorem ipsum dolor sit amet, consectetur adipiscing elit", | |||||
| + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", | |||||
| + ]; | |||||
| + let blobs = text.map(str => new Blob([str])); | |||||
| + | |||||
| + let data = {foo: {bar: "baz"}}; | |||||
| + | |||||
| + sharedData.set("blob0", blobs[0]); | |||||
| + sharedData.set("blob1", blobs[1]); | |||||
| + sharedData.set("data", data); | |||||
| + | |||||
| + equal(await readBlob("blob0", sharedData), text[0], "Expected text for blob0 in parent ppmm"); | |||||
| + | |||||
| + sharedData.flush(); | |||||
| + | |||||
| + equal(await readBlob("blob0", sharedData), text[0], "Expected text for blob0 in parent ppmm"); | |||||
| + equal(await readBlob("blob1", sharedData), text[1], "Expected text for blob1 in parent ppmm"); | |||||
| + | |||||
| + equal(await readBlob("blob0"), text[0], "Expected text for blob0 in parent cpmm"); | |||||
| + equal(await readBlob("blob1"), text[1], "Expected text for blob1 in parent cpmm"); | |||||
| + | |||||
| + equal(await contentPage.spawn("blob0", readBlob), text[0], "Expected text for blob0 in child 1 cpmm"); | |||||
| + equal(await contentPage.spawn("blob1", readBlob), text[1], "Expected text for blob1 in child 1 cpmm"); | |||||
| + | |||||
| + // Start a second child process | |||||
| + Services.prefs.setIntPref(PROCESS_COUNT_PREF, 2); | |||||
| + | |||||
| + let page2 = await loadContentPage(); | |||||
| + | |||||
| + equal(await page2.spawn("blob0", readBlob), text[0], "Expected text for blob0 in child 2 cpmm"); | |||||
| + equal(await page2.spawn("blob1", readBlob), text[1], "Expected text for blob1 in child 2 cpmm"); | |||||
| + | |||||
| + sharedData.set("blob0", blobs[2]); | |||||
| + | |||||
| + equal(await readBlob("blob0", sharedData), text[2], "Expected text for blob0 in parent ppmm"); | |||||
| + | |||||
| + sharedData.flush(); | |||||
| + | |||||
| + equal(await readBlob("blob0", sharedData), text[2], "Expected text for blob0 in parent ppmm"); | |||||
| + equal(await readBlob("blob1", sharedData), text[1], "Expected text for blob1 in parent ppmm"); | |||||
| + | |||||
| + equal(await readBlob("blob0"), text[2], "Expected text for blob0 in parent cpmm"); | |||||
| + equal(await readBlob("blob1"), text[1], "Expected text for blob1 in parent cpmm"); | |||||
| + | |||||
| + equal(await contentPage.spawn("blob0", readBlob), text[2], "Expected text for blob0 in child 1 cpmm"); | |||||
| + equal(await contentPage.spawn("blob1", readBlob), text[1], "Expected text for blob1 in child 1 cpmm"); | |||||
| + | |||||
| + equal(await page2.spawn("blob0", readBlob), text[2], "Expected text for blob0 in child 2 cpmm"); | |||||
| + equal(await page2.spawn("blob1", readBlob), text[1], "Expected text for blob1 in child 2 cpmm"); | |||||
| + | |||||
| + deepEqual(await page2.spawn("data", getKey), data, "Expected data for data key in child 2 cpmm"); | |||||
| +}); | |||||
| diff --git js/xpconnect/loader/AutoMemMap.h js/xpconnect/loader/AutoMemMap.h | |||||
| index e1b0bf6d75c4f..9d1f02255ac24 100644 | |||||
| --- js/xpconnect/loader/AutoMemMap.h | |||||
| +++ js/xpconnect/loader/AutoMemMap.h | |||||
| @@ -51,7 +51,7 @@ class AutoMemMap | |||||
| void reset(); | |||||
| - bool initialized() { return addr; } | |||||
| + bool initialized() const { return addr; } | |||||
| uint32_t size() const { return size_; } | |||||
| commit e8827d892d6f | |||||
| Author: Kris Maglione <maglione.k@gmail.com> | |||||
| Date: Thu Jul 19 18:18:27 2018 -0700 | |||||
| Bug 1477129: Part 3 - Re-enable e10s on FreeBSD. r?froydnj | |||||
| Backed out changeset 197fcba26a38 | |||||
| MozReview-Commit-ID: 4OOmP91hKXQ | |||||
| --- | |||||
| toolkit/content/aboutSupport.js | 5 ++++- | |||||
| toolkit/locales/en-US/chrome/global/aboutSupport.properties | 2 +- | |||||
| toolkit/xre/nsAppRunner.cpp | 8 +------- | |||||
| 3 files changed, 6 insertions(+), 9 deletions(-) | |||||
| diff --git toolkit/content/aboutSupport.js toolkit/content/aboutSupport.js | |||||
| index 3c44097d20295..35a40f0344bd9 100644 | |||||
| --- toolkit/content/aboutSupport.js | |||||
| +++ toolkit/content/aboutSupport.js | |||||
| @@ -60,9 +60,12 @@ var snapshotFormatters = { | |||||
| case 6: | |||||
| case 7: | |||||
| case 8: | |||||
| - case 10: | |||||
| statusText = strings.GetStringFromName("multiProcessStatus." + data.autoStartStatus); | |||||
| break; | |||||
| + | |||||
| + case 10: | |||||
| + statusText = (Services.appinfo.OS == "Darwin" ? "OS X 10.6 - 10.8" : "Windows XP"); | |||||
| + break; | |||||
| } | |||||
| $("multiprocess-box").textContent = strings.formatStringFromName("multiProcessWindows", | |||||
| diff --git toolkit/locales/en-US/chrome/global/aboutSupport.properties toolkit/locales/en-US/chrome/global/aboutSupport.properties | |||||
| index c04743a3e3394..96b8f9660ca8f 100644 | |||||
| --- toolkit/locales/en-US/chrome/global/aboutSupport.properties | |||||
| +++ toolkit/locales/en-US/chrome/global/aboutSupport.properties | |||||
| @@ -138,8 +138,8 @@ multiProcessStatus.5 = Disabled by lack of graphics hardware acceleration on Mac | |||||
| multiProcessStatus.6 = Disabled by unsupported text input | |||||
| multiProcessStatus.7 = Disabled by add-ons | |||||
| multiProcessStatus.8 = Disabled forcibly | |||||
| +# No longer in use (bug 1296353) but we might bring this back. | |||||
| multiProcessStatus.9 = Disabled by graphics hardware acceleration on Windows XP | |||||
| -multiProcessStatus.10 = Disabled by operating system bug | |||||
| multiProcessStatus.unknown = Unknown status | |||||
| asyncPanZoom = Asynchronous Pan/Zoom | |||||
| diff --git toolkit/xre/nsAppRunner.cpp toolkit/xre/nsAppRunner.cpp | |||||
| index 2d0aa2ba804d9..5df9d811d3f20 100644 | |||||
| --- toolkit/xre/nsAppRunner.cpp | |||||
| +++ toolkit/xre/nsAppRunner.cpp | |||||
| @@ -5155,7 +5155,7 @@ enum { | |||||
| // kE10sDisabledForAddons = 7, removed in bug 1406212 | |||||
| kE10sForceDisabled = 8, | |||||
| // kE10sDisabledForXPAcceleration = 9, removed in bug 1296353 | |||||
| - kE10sDisabledForOperatingSystem = 10, | |||||
| + // kE10sDisabledForOperatingSystem = 10, removed due to xp-eol | |||||
| }; | |||||
| const char* kForceEnableE10sPref = "browser.tabs.remote.force-enable"; | |||||
| @@ -5186,12 +5186,6 @@ BrowserTabsRemoteAutostart() | |||||
| status = kE10sDisabledByUser; | |||||
| } | |||||
| -#if defined(__FreeBSD__) | |||||
| - // sendmsg() packet loss gotten worse, see bug 1475970 | |||||
| - gBrowserTabsRemoteAutostart = false; | |||||
| - status = kE10sDisabledForOperatingSystem; | |||||
| -#endif | |||||
| - | |||||
| // Uber override pref for manual testing purposes | |||||
| if (Preferences::GetBool(kForceEnableE10sPref, false)) { | |||||
| gBrowserTabsRemoteAutostart = true; | |||||