Backed out changeset f4953072c20f (bug 1068412) for mochitest-e10s crashes.
authorRyan VanderMeulen <ryanvm@gmail.com>
Mon, 06 Oct 2014 17:00:27 -0400
changeset 209069 b1b103778f93ebea31c13d725232775d48c76418
parent 209068 5578b160f514fcbfb782c980fee483fa6e410c95
child 209070 a4a109579ef265390b0179d6a7c0703faeb39764
push idunknown
push userunknown
push dateunknown
bugs1068412
milestone35.0a1
backs outf4953072c20f75a7257538f990a232abfadc4354
Backed out changeset f4953072c20f (bug 1068412) for mochitest-e10s crashes.
chrome/RegistryMessageUtils.h
chrome/nsChromeRegistryChrome.cpp
dom/ipc/ContentChild.cpp
dom/ipc/PContent.ipdl
netwerk/protocol/res/nsResProtocolHandler.cpp
netwerk/test/browser/browser.ini
netwerk/test/browser/browser_child_resource.js
netwerk/test/browser/dummy.html
--- a/chrome/RegistryMessageUtils.h
+++ b/chrome/RegistryMessageUtils.h
@@ -38,22 +38,16 @@ struct ChromePackage
            flags == rhs.flags;
   }
 };
 
 struct ResourceMapping
 {
   nsCString resource;
   SerializedURI resolvedURI;
-
-  bool operator ==(const ResourceMapping& rhs) const
-  {
-    return resource.Equals(rhs.resource) &&
-           resolvedURI == rhs.resolvedURI;
-  }
 };
 
 struct OverrideMapping
 {
   SerializedURI originalURI;
   SerializedURI overrideURI;
 
   bool operator==(const OverrideMapping& rhs) const
--- a/chrome/nsChromeRegistryChrome.cpp
+++ b/chrome/nsChromeRegistryChrome.cpp
@@ -448,31 +448,27 @@ nsChromeRegistryChrome::SendRegisteredCh
   InfallibleTArray<ResourceMapping> resources;
   InfallibleTArray<OverrideMapping> overrides;
 
   EnumerationArgs args = {
     packages, mSelectedLocale, mSelectedSkin
   };
   mPackagesHash.EnumerateRead(CollectPackages, &args);
 
-  // If we were passed a parent then a new child process has been created and
-  // has requested all of the chrome so send it the resources too. Otherwise
-  // resource mappings are sent by the resource protocol handler dynamically.
-  if (aParent) {
-    nsCOMPtr<nsIIOService> io (do_GetIOService());
-    NS_ENSURE_TRUE_VOID(io);
+  nsCOMPtr<nsIIOService> io (do_GetIOService());
+  NS_ENSURE_TRUE_VOID(io);
 
-    nsCOMPtr<nsIProtocolHandler> ph;
-    nsresult rv = io->GetProtocolHandler("resource", getter_AddRefs(ph));
-    NS_ENSURE_SUCCESS_VOID(rv);
+  nsCOMPtr<nsIProtocolHandler> ph;
+  nsresult rv = io->GetProtocolHandler("resource", getter_AddRefs(ph));
+  NS_ENSURE_SUCCESS_VOID(rv);
 
-    nsCOMPtr<nsIResProtocolHandler> irph (do_QueryInterface(ph));
-    nsResProtocolHandler* rph = static_cast<nsResProtocolHandler*>(irph.get());
-    rph->CollectSubstitutions(resources);
-  }
+  //FIXME: Some substitutions are set up lazily and might not exist yet
+  nsCOMPtr<nsIResProtocolHandler> irph (do_QueryInterface(ph));
+  nsResProtocolHandler* rph = static_cast<nsResProtocolHandler*>(irph.get());
+  rph->CollectSubstitutions(resources);
 
   mOverrideTable.EnumerateRead(&EnumerateOverride, &overrides);
 
   if (aParent) {
     bool success = aParent->SendRegisterChrome(packages, resources, overrides,
                                                mSelectedLocale, false);
     NS_ENSURE_TRUE_VOID(success);
   } else {
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1569,20 +1569,16 @@ ContentChild::RecvRegisterChromeItem(con
         case ChromeRegistryItem::TChromePackage:
             chromeRegistry->RegisterPackage(item.get_ChromePackage());
             break;
 
         case ChromeRegistryItem::TOverrideMapping:
             chromeRegistry->RegisterOverride(item.get_OverrideMapping());
             break;
 
-        case ChromeRegistryItem::TResourceMapping:
-            chromeRegistry->RegisterResource(item.get_ResourceMapping());
-            break;
-
         default:
             MOZ_ASSERT(false, "bad chrome item");
             return false;
     }
 
     return true;
 }
 
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -66,17 +66,16 @@ using mozilla::dom::NativeThreadId from 
 using mozilla::dom::quota::PersistenceType from "mozilla/dom/quota/PersistenceType.h";
 using mozilla::hal::ProcessPriority from "mozilla/HalTypes.h";
 using gfxIntSize from "nsSize.h";
 
 union ChromeRegistryItem
 {
     ChromePackage;
     OverrideMapping;
-    ResourceMapping;
 };
 
 namespace mozilla {
 namespace dom {
 
 struct FontListEntry {
     nsString  familyName;
     nsString  faceName;
--- a/netwerk/protocol/res/nsResProtocolHandler.cpp
+++ b/netwerk/protocol/res/nsResProtocolHandler.cpp
@@ -1,29 +1,24 @@
 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "mozilla/chrome/RegistryMessageUtils.h"
-#include "mozilla/dom/ContentParent.h"
-#include "mozilla/unused.h"
 
 #include "nsResProtocolHandler.h"
 #include "nsIIOService.h"
 #include "nsIFile.h"
 #include "nsNetUtil.h"
 #include "nsURLHelper.h"
 #include "nsEscape.h"
 
 #include "mozilla/Omnijar.h"
 
-using mozilla::dom::ContentParent;
-using mozilla::unused;
-
 static NS_DEFINE_CID(kResURLCID, NS_RESURL_CID);
 
 static nsResProtocolHandler *gResHandler = nullptr;
 
 #if defined(PR_LOGGING)
 //
 // Log module for Resource Protocol logging...
 //
@@ -304,72 +299,44 @@ nsResProtocolHandler::AllowPort(int32_t 
     *_retval = false;
     return NS_OK;
 }
 
 //----------------------------------------------------------------------------
 // nsResProtocolHandler::nsIResProtocolHandler
 //----------------------------------------------------------------------------
 
-static void
-SendResourceSubstitution(const nsACString& root, nsIURI* baseURI)
-{
-    if (GeckoProcessType_Content == XRE_GetProcessType()) {
-        return;
-    }
-
-    ResourceMapping resourceMapping;
-    resourceMapping.resource = root;
-    if (baseURI) {
-        baseURI->GetSpec(resourceMapping.resolvedURI.spec);
-        baseURI->GetOriginCharset(resourceMapping.resolvedURI.charset);
-    }
-
-    nsTArray<ContentParent*> parents;
-    ContentParent::GetAll(parents);
-    if (!parents.Length()) {
-        return;
-    }
-
-    for (uint32_t i = 0; i < parents.Length(); i++) {
-        unused << parents[i]->SendRegisterChromeItem(resourceMapping);
-    }
-}
-
 NS_IMETHODIMP
 nsResProtocolHandler::SetSubstitution(const nsACString& root, nsIURI *baseURI)
 {
     if (!baseURI) {
         mSubstitutions.Remove(root);
-        SendResourceSubstitution(root, baseURI);
         return NS_OK;
     }
 
     // If baseURI isn't a resource URI, we can set the substitution immediately.
     nsAutoCString scheme;
     nsresult rv = baseURI->GetScheme(scheme);
     NS_ENSURE_SUCCESS(rv, rv);
     if (!scheme.EqualsLiteral("resource")) {
         mSubstitutions.Put(root, baseURI);
-        SendResourceSubstitution(root, baseURI);
         return NS_OK;
     }
 
     // baseURI is a resource URI, let's resolve it first.
     nsAutoCString newBase;
     rv = ResolveURI(baseURI, newBase);
     NS_ENSURE_SUCCESS(rv, rv);
 
     nsCOMPtr<nsIURI> newBaseURI;
     rv = mIOService->NewURI(newBase, nullptr, nullptr,
                             getter_AddRefs(newBaseURI));
     NS_ENSURE_SUCCESS(rv, rv);
 
     mSubstitutions.Put(root, newBaseURI);
-    SendResourceSubstitution(root, newBaseURI);
     return NS_OK;
 }
 
 NS_IMETHODIMP
 nsResProtocolHandler::GetSubstitution(const nsACString& root, nsIURI **result)
 {
     NS_ENSURE_ARG_POINTER(result);
 
--- a/netwerk/test/browser/browser.ini
+++ b/netwerk/test/browser/browser.ini
@@ -1,6 +1,3 @@
 [DEFAULT]
-support-files =
-  dummy.html
 
 [browser_NetUtil.js]
-[browser_child_resource.js]
deleted file mode 100644
--- a/netwerk/test/browser/browser_child_resource.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
-Any copyright is dedicated to the Public Domain.
-http://creativecommons.org/publicdomain/zero/1.0/
-*/
-
-// This must be loaded in the remote process for this test to be useful
-const TEST_URL = "http://example.com/browser/netwerk/test/browser/dummy.html";
-
-const expectedRemote = gMultiProcessBrowser ? "true" : "";
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-const resProtocol = Cc["@mozilla.org/network/protocol;1?name=resource"]
-                        .getService(Ci.nsIResProtocolHandler);
-
-function frameScript() {
-  Components.utils.import("resource://gre/modules/Services.jsm");
-  let resProtocol = Components.classes["@mozilla.org/network/protocol;1?name=resource"]
-                              .getService(Components.interfaces.nsIResProtocolHandler);
-
-  addMessageListener("Test:ResolveURI", function({ data: uri }) {
-    uri = Services.io.newURI(uri, null, null);
-    try {
-      let resolved = resProtocol.resolveURI(uri);
-      sendAsyncMessage("Test:ResolvedURI", resolved);
-    }
-    catch (e) {
-      sendAsyncMessage("Test:ResolvedURI", null);
-    }
-  });
-
-  addMessageListener("Test:Crash", function() {
-    dump("Crashing\n");
-    privateNoteIntentionalCrash();
-    Components.utils.import("resource://gre/modules/ctypes.jsm");
-    let zero = new ctypes.intptr_t(8);
-    let badptr = ctypes.cast(zero, ctypes.PointerType(ctypes.int32_t));
-    badptr.contents
-  });
-}
-
-function waitForEvent(obj, name, capturing, chromeEvent) {
-  info("Waiting for " + name);
-  return new Promise((resolve) => {
-    function listener(event) {
-      info("Saw " + name);
-      obj.removeEventListener(name, listener, capturing, chromeEvent);
-      resolve(event);
-    }
-
-    obj.addEventListener(name, listener, capturing, chromeEvent);
-  });
-}
-
-function resolveURI(uri) {
-  uri = Services.io.newURI(uri, null, null);
-  try {
-    return resProtocol.resolveURI(uri);
-  }
-  catch (e) {
-    return null;
-  }
-}
-
-function remoteResolveURI(uri) {
-  return new Promise((resolve) => {
-    let manager = gBrowser.selectedBrowser.messageManager;
-
-    function listener({ data: resolved }) {
-      manager.removeMessageListener("Test:ResolvedURI", listener);
-      resolve(resolved);
-    }
-
-    manager.addMessageListener("Test:ResolvedURI", listener);
-    manager.sendAsyncMessage("Test:ResolveURI", uri);
-  });
-}
-
-let loadTestTab = Task.async(function*() {
-  gBrowser.selectedTab = gBrowser.addTab(TEST_URL);
-  let browser = gBrowser.selectedBrowser;
-  yield waitForEvent(browser, "load", true);
-  browser.messageManager.loadFrameScript("data:,(" + frameScript.toString() + ")();", true);
-  return browser;
-});
-
-// Restarts the child process by crashing it then reloading the tab
-let restart = Task.async(function*() {
-  let browser = gBrowser.selectedBrowser;
-  // If the tab isn't remote this would crash the main process so skip it
-  if (browser.getAttribute("remote") != "true")
-    return browser;
-
-  browser.messageManager.sendAsyncMessage("Test:Crash");
-  yield waitForEvent(browser, "AboutTabCrashedLoad", false, true);
-
-  browser.reload();
-
-  yield waitForEvent(browser, "load", true);
-  is(browser.getAttribute("remote"), expectedRemote, "Browser should be in the right process");
-  browser.messageManager.loadFrameScript("data:,(" + frameScript.toString() + ")();", true);
-  return browser;
-});
-
-// Sanity check that this test is going to be useful
-add_task(function*() {
-  let browser = yield loadTestTab();
-
-  // This must be loaded in the remote process for this test to be useful
-  is(browser.getAttribute("remote"), expectedRemote, "Browser should be in the right process");
-
-  let local = resolveURI("resource://gre/modules/Services.jsm");
-  let remote = yield remoteResolveURI("resource://gre/modules/Services.jsm");
-  is(local, remote, "Services.jsm should resolve in both processes");
-
-  gBrowser.removeCurrentTab();
-});
-
-// Add a mapping, update it then remove it
-add_task(function*() {
-  let browser = yield loadTestTab();
-
-  info("Set");
-  resProtocol.setSubstitution("testing", Services.io.newURI("chrome://global/content", null, null));
-  let local = resolveURI("resource://testing/test.js");
-  let remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, "chrome://global/content/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/content/test.js", "Should resolve in child process");
-
-  info("Change");
-  resProtocol.setSubstitution("testing", Services.io.newURI("chrome://global/skin", null, null));
-  local = resolveURI("resource://testing/test.js");
-  remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, "chrome://global/skin/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/skin/test.js", "Should resolve in child process");
-
-  info("Clear");
-  resProtocol.setSubstitution("testing", null);
-  local = resolveURI("resource://testing/test.js");
-  remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, null, "Shouldn't resolve in main process");
-  is(remote, null, "Shouldn't resolve in child process");
-
-  gBrowser.removeCurrentTab();
-});
-
-// Add a mapping, restart the child process then check it is still there
-add_task(function*() {
-  let browser = yield loadTestTab();
-
-  info("Set");
-  resProtocol.setSubstitution("testing", Services.io.newURI("chrome://global/content", null, null));
-  let local = resolveURI("resource://testing/test.js");
-  let remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, "chrome://global/content/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/content/test.js", "Should resolve in child process");
-
-  yield restart();
-
-  local = resolveURI("resource://testing/test.js");
-  remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, "chrome://global/content/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/content/test.js", "Should resolve in child process");
-
-  info("Change");
-  resProtocol.setSubstitution("testing", Services.io.newURI("chrome://global/skin", null, null));
-
-  yield restart();
-
-  local = resolveURI("resource://testing/test.js");
-  remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, "chrome://global/skin/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/skin/test.js", "Should resolve in child process");
-
-  info("Clear");
-  resProtocol.setSubstitution("testing", null);
-
-  yield restart();
-
-  local = resolveURI("resource://testing/test.js");
-  remote = yield remoteResolveURI("resource://testing/test.js");
-  is(local, null, "Shouldn't resolve in main process");
-  is(remote, null, "Shouldn't resolve in child process");
-
-  gBrowser.removeCurrentTab();
-});
-
-// Adding a mapping to a resource URI should work
-add_task(function*() {
-  let browser = yield loadTestTab();
-
-  info("Set");
-  resProtocol.setSubstitution("testing", Services.io.newURI("chrome://global/content", null, null));
-  resProtocol.setSubstitution("testing2", Services.io.newURI("resource://testing", null, null));
-  let local = resolveURI("resource://testing2/test.js");
-  let remote = yield remoteResolveURI("resource://testing2/test.js");
-  is(local, "chrome://global/content/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/content/test.js", "Should resolve in child process");
-
-  info("Clear");
-  resProtocol.setSubstitution("testing", null);
-  local = resolveURI("resource://testing2/test.js");
-  remote = yield remoteResolveURI("resource://testing2/test.js");
-  is(local, "chrome://global/content/test.js", "Should resolve in main process");
-  is(remote, "chrome://global/content/test.js", "Should resolve in child process");
-
-  resProtocol.setSubstitution("testing2", null);
-  local = resolveURI("resource://testing2/test.js");
-  remote = yield remoteResolveURI("resource://testing2/test.js");
-  is(local, null, "Shouldn't resolve in main process");
-  is(remote, null, "Shouldn't resolve in child process");
-
-  gBrowser.removeCurrentTab();
-});
deleted file mode 100644
--- a/netwerk/test/browser/dummy.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-<body>
-  <p>Dummy Page</p>
-</body>
-</html>