Merge inbound to m-c. a=merge
authorRyan VanderMeulen <ryanvm@gmail.com>
Wed, 31 May 2017 14:32:55 -0400
changeset 409693 94906c37940c6b1c371dc7c22ed2098face96d8b
parent 409626 2645d067b1e3f4064f18a7d1241ec96b33402d07 (current diff)
parent 409692 5ca156581096a84c3313d5b4716c61ddc027b907 (diff)
child 409694 8709ce04de16a63c5ec10baf7447ffb588fe522b
child 409756 1f74e69ac16a1f2eb1ed3d108de16a926f49d7cf
push id7391
push usermtabara@mozilla.com
push dateMon, 12 Jun 2017 13:08:53 +0000
treeherdermozilla-beta@2191d7f87e2e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge inbound to m-c. a=merge CLOSED TREE
browser/base/content/tab-content.js
browser/base/content/tabbrowser.xml
testing/web-platform/harness/.gitignore
testing/web-platform/harness/.travis.yml
testing/web-platform/harness/MANIFEST.in
testing/web-platform/harness/README.rst
testing/web-platform/harness/docs/Makefile
testing/web-platform/harness/docs/architecture.svg
testing/web-platform/harness/docs/conf.py
testing/web-platform/harness/docs/design.rst
testing/web-platform/harness/docs/expectation.rst
testing/web-platform/harness/docs/index.rst
testing/web-platform/harness/docs/make.bat
testing/web-platform/harness/docs/usage.rst
testing/web-platform/harness/requirements.txt
testing/web-platform/harness/requirements_chrome.txt
testing/web-platform/harness/requirements_firefox.txt
testing/web-platform/harness/requirements_servo.txt
testing/web-platform/harness/setup.py
testing/web-platform/harness/test/metadata/reftest/reftest_and_fail.html.ini
testing/web-platform/harness/test/metadata/reftest/reftest_cycle_fail.html.ini
testing/web-platform/harness/test/metadata/reftest/reftest_match_fail.html.ini
testing/web-platform/harness/test/metadata/reftest/reftest_mismatch_fail.html.ini
testing/web-platform/harness/test/metadata/reftest/reftest_ref_timeout.html.ini
testing/web-platform/harness/test/metadata/reftest/reftest_timeout.html.ini
testing/web-platform/harness/test/metadata/testharness/firefox/__dir__.ini
testing/web-platform/harness/test/metadata/testharness/firefox/subdir/test_pref_reset.html.ini
testing/web-platform/harness/test/metadata/testharness/firefox/test_pref_set.html.ini
testing/web-platform/harness/test/metadata/testharness/subdir/__dir__.ini
testing/web-platform/harness/test/metadata/testharness/subdir/testharness_1.html.ini
testing/web-platform/harness/test/metadata/testharness/testharness_0.html.ini
testing/web-platform/harness/test/metadata/testharness/testharness_error.html.ini
testing/web-platform/harness/test/metadata/testharness/testharness_timeout.html.ini
testing/web-platform/harness/test/test.cfg.example
testing/web-platform/harness/test/test.py
testing/web-platform/harness/test/testdata/reftest/green-ref.html
testing/web-platform/harness/test/testdata/reftest/green.html
testing/web-platform/harness/test/testdata/reftest/red.html
testing/web-platform/harness/test/testdata/reftest/reftest.https.html
testing/web-platform/harness/test/testdata/reftest/reftest_and_fail.html
testing/web-platform/harness/test/testdata/reftest/reftest_and_fail_0-ref.html
testing/web-platform/harness/test/testdata/reftest/reftest_cycle.html
testing/web-platform/harness/test/testdata/reftest/reftest_cycle_0-ref.html
testing/web-platform/harness/test/testdata/reftest/reftest_cycle_1-ref.html
testing/web-platform/harness/test/testdata/reftest/reftest_cycle_fail.html
testing/web-platform/harness/test/testdata/reftest/reftest_cycle_fail_0-ref.html
testing/web-platform/harness/test/testdata/reftest/reftest_match.html
testing/web-platform/harness/test/testdata/reftest/reftest_match_fail.html
testing/web-platform/harness/test/testdata/reftest/reftest_mismatch.html
testing/web-platform/harness/test/testdata/reftest/reftest_mismatch_fail.html
testing/web-platform/harness/test/testdata/reftest/reftest_or_0.html
testing/web-platform/harness/test/testdata/reftest/reftest_ref_timeout-ref.html
testing/web-platform/harness/test/testdata/reftest/reftest_ref_timeout.html
testing/web-platform/harness/test/testdata/reftest/reftest_timeout.html
testing/web-platform/harness/test/testdata/reftest/reftest_wait_0.html
testing/web-platform/harness/test/testdata/testharness/firefox/subdir/test_pref_inherit.html
testing/web-platform/harness/test/testdata/testharness/firefox/subdir/test_pref_reset.html
testing/web-platform/harness/test/testdata/testharness/firefox/test_pref_dir.html
testing/web-platform/harness/test/testdata/testharness/firefox/test_pref_set.html
testing/web-platform/harness/test/testdata/testharness/subdir/testharness_1.html
testing/web-platform/harness/test/testdata/testharness/testharness.https.html
testing/web-platform/harness/test/testdata/testharness/testharness_0.html
testing/web-platform/harness/test/testdata/testharness/testharness_error.html
testing/web-platform/harness/test/testdata/testharness/testharness_long_timeout.html
testing/web-platform/harness/test/testdata/testharness/testharness_timeout.html
testing/web-platform/harness/tox.ini
testing/web-platform/harness/wptrunner.default.ini
testing/web-platform/harness/wptrunner/__init__.py
testing/web-platform/harness/wptrunner/browsers/__init__.py
testing/web-platform/harness/wptrunner/browsers/b2g_setup/certtest_app.zip
testing/web-platform/harness/wptrunner/browsers/base.py
testing/web-platform/harness/wptrunner/browsers/chrome.py
testing/web-platform/harness/wptrunner/browsers/edge.py
testing/web-platform/harness/wptrunner/browsers/firefox.py
testing/web-platform/harness/wptrunner/browsers/server-locations.txt
testing/web-platform/harness/wptrunner/browsers/servo.py
testing/web-platform/harness/wptrunner/browsers/servodriver.py
testing/web-platform/harness/wptrunner/config.json
testing/web-platform/harness/wptrunner/config.py
testing/web-platform/harness/wptrunner/environment.py
testing/web-platform/harness/wptrunner/executors/__init__.py
testing/web-platform/harness/wptrunner/executors/base.py
testing/web-platform/harness/wptrunner/executors/executormarionette.py
testing/web-platform/harness/wptrunner/executors/executorselenium.py
testing/web-platform/harness/wptrunner/executors/executorservo.py
testing/web-platform/harness/wptrunner/executors/executorservodriver.py
testing/web-platform/harness/wptrunner/executors/process.py
testing/web-platform/harness/wptrunner/executors/pytestrunner/__init__.py
testing/web-platform/harness/wptrunner/executors/pytestrunner/fixtures.py
testing/web-platform/harness/wptrunner/executors/pytestrunner/runner.py
testing/web-platform/harness/wptrunner/executors/reftest-wait.js
testing/web-platform/harness/wptrunner/executors/reftest-wait_servodriver.js
testing/web-platform/harness/wptrunner/executors/reftest-wait_webdriver.js
testing/web-platform/harness/wptrunner/executors/reftest.js
testing/web-platform/harness/wptrunner/executors/testharness_marionette.js
testing/web-platform/harness/wptrunner/executors/testharness_servodriver.js
testing/web-platform/harness/wptrunner/executors/testharness_webdriver.js
testing/web-platform/harness/wptrunner/expected.py
testing/web-platform/harness/wptrunner/hosts.py
testing/web-platform/harness/wptrunner/manifestexpected.py
testing/web-platform/harness/wptrunner/manifestinclude.py
testing/web-platform/harness/wptrunner/manifestupdate.py
testing/web-platform/harness/wptrunner/metadata.py
testing/web-platform/harness/wptrunner/products.py
testing/web-platform/harness/wptrunner/reduce.py
testing/web-platform/harness/wptrunner/testharness_runner.html
testing/web-platform/harness/wptrunner/testharnessreport-servo.js
testing/web-platform/harness/wptrunner/testharnessreport-servodriver.js
testing/web-platform/harness/wptrunner/testharnessreport.js
testing/web-platform/harness/wptrunner/testloader.py
testing/web-platform/harness/wptrunner/testrunner.py
testing/web-platform/harness/wptrunner/tests/__init__.py
testing/web-platform/harness/wptrunner/tests/test_chunker.py
testing/web-platform/harness/wptrunner/tests/test_hosts.py
testing/web-platform/harness/wptrunner/tests/test_testloader.py
testing/web-platform/harness/wptrunner/tests/test_update.py
testing/web-platform/harness/wptrunner/update/__init__.py
testing/web-platform/harness/wptrunner/update/base.py
testing/web-platform/harness/wptrunner/update/metadata.py
testing/web-platform/harness/wptrunner/update/state.py
testing/web-platform/harness/wptrunner/update/sync.py
testing/web-platform/harness/wptrunner/update/tree.py
testing/web-platform/harness/wptrunner/update/update.py
testing/web-platform/harness/wptrunner/vcs.py
testing/web-platform/harness/wptrunner/webdriver_server.py
testing/web-platform/harness/wptrunner/wptcommandline.py
testing/web-platform/harness/wptrunner/wptlogging.py
testing/web-platform/harness/wptrunner/wptmanifest/__init__.py
testing/web-platform/harness/wptrunner/wptmanifest/backends/__init__.py
testing/web-platform/harness/wptrunner/wptmanifest/backends/conditional.py
testing/web-platform/harness/wptrunner/wptmanifest/backends/static.py
testing/web-platform/harness/wptrunner/wptmanifest/node.py
testing/web-platform/harness/wptrunner/wptmanifest/parser.py
testing/web-platform/harness/wptrunner/wptmanifest/serializer.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/__init__.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/test_conditional.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/test_parser.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/test_serializer.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/test_static.py
testing/web-platform/harness/wptrunner/wptmanifest/tests/test_tokenizer.py
testing/web-platform/harness/wptrunner/wptrunner.py
testing/web-platform/harness/wptrunner/wpttest.py
--- a/.gitignore
+++ b/.gitignore
@@ -85,16 +85,19 @@ devtools/**/node_modules
 GTAGS
 GRTAGS
 GSYMS
 GPATH
 
 # Git clone directory for updating web-platform-tests
 testing/web-platform/sync/
 
+# Third party metadata for web-platform-tests
+testing/web-platform/products/
+
 # Android Gradle artifacts.
 mobile/android/gradle/.gradle
 
 # XCode project cruft
 embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/project.xcworkspace/xcuserdata
 embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/xcuserdata
 
 # Ignore mozharness execution files
--- a/.hgignore
+++ b/.hgignore
@@ -93,16 +93,19 @@
 GTAGS
 GRTAGS
 GSYMS
 GPATH
 
 # Git clone directory for updating web-platform-tests
 ^testing/web-platform/sync/
 
+# Third party metadata for web-platform-tests
+^testing/web-platform/products/
+
 # Android Gradle artifacts.
 ^mobile/android/gradle/.gradle
 
 # XCode project cruft
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/project.xcworkspace/xcuserdata
 ^embedding/ios/GeckoEmbed/GeckoEmbed.xcodeproj/xcuserdata
 
 # Ignore mozharness execution files
--- a/browser/components/extensions/test/browser/browser_ext_optionsPage_browser_style.js
+++ b/browser/components/extensions/test/browser/browser_ext_optionsPage_browser_style.js
@@ -1,12 +1,14 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+requestLongerTimeout(2);
+
 async function testOptionsBrowserStyle(optionsUI, assertMessage) {
   function optionsScript() {
     browser.test.onMessage.addListener((msgName, optionsUI, assertMessage) => {
       if (msgName !== "check-style") {
         browser.test.notifyFail("options-ui-browser_style");
       }
 
       let style = window.getComputedStyle(document.getElementById("button"));
@@ -47,19 +49,19 @@ async function testOptionsBrowserStyle(o
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
 
   await extension.startup();
   await extension.awaitMessage("options-ui-ready");
 
   extension.sendMessage("check-style", optionsUI, assertMessage);
   await extension.awaitFinish("options-ui-browser_style");
 
-  await extension.unload();
+  await BrowserTestUtils.removeTab(tab);
 
-  await BrowserTestUtils.removeTab(tab);
+  await extension.unload();
 }
 
 add_task(async function test_options_without_setting_browser_style() {
   await testOptionsBrowserStyle({
     "page": "options.html",
   }, "Expected correct style when browser_style is excluded");
 });
 
--- a/build/virtualenv_packages.txt
+++ b/build/virtualenv_packages.txt
@@ -37,17 +37,17 @@ mozilla.pth:testing/firefox-ui/harness
 mozilla.pth:testing/marionette/client
 mozilla.pth:testing/marionette/harness
 mozilla.pth:testing/marionette/harness/marionette_harness/runner/mixins/browsermob-proxy-py
 mozilla.pth:testing/marionette/puppeteer/firefox
 packages.txt:testing/mozbase/packages.txt
 mozilla.pth:testing/taskcluster
 mozilla.pth:testing/tools/autotry
 mozilla.pth:testing/web-platform
-mozilla.pth:testing/web-platform/harness
+mozilla.pth:testing/web-platform/tests/tools/wptrunner
 mozilla.pth:testing/web-platform/tests/tools/wptserve
 mozilla.pth:testing/web-platform/tests/tools/six
 mozilla.pth:testing/xpcshell
 mozilla.pth:python/mock-1.0.0
 mozilla.pth:xpcom/typelib/xpt/tools
 mozilla.pth:tools/docs
 mozilla.pth:media/webrtc/trunk/tools/gyp/pylib
 mozilla.pth:python/pyasn1
--- a/dom/base/SubtleCrypto.cpp
+++ b/dom/base/SubtleCrypto.cpp
@@ -4,49 +4,65 @@
  * 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/dom/SubtleCrypto.h"
 
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/SubtleCryptoBinding.h"
 #include "mozilla/dom/WebCryptoTask.h"
+#include "mozilla/Telemetry.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(SubtleCrypto, mParent)
 NS_IMPL_CYCLE_COLLECTING_ADDREF(SubtleCrypto)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(SubtleCrypto)
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SubtleCrypto)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
 
 
 SubtleCrypto::SubtleCrypto(nsIGlobalObject* aParent)
   : mParent(aParent)
+  , mRecordedTelemetry(false)
 {
 }
 
 JSObject*
 SubtleCrypto::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return SubtleCryptoBinding::Wrap(aCx, this, aGivenProto);
 }
 
+void
+SubtleCrypto::RecordTelemetryOnce() {
+  if (mRecordedTelemetry) {
+    return;
+  }
+
+  mRecordedTelemetry = true;
+  JSObject* global = mParent->GetGlobalJSObject();
+  bool isSecure = JS_GetIsSecureContext(js::GetObjectCompartment(global));
+  Telemetry::Accumulate(Telemetry::WEBCRYPTO_METHOD_SECURE, isSecure);
+}
+
 #define SUBTLECRYPTO_METHOD_BODY(Operation, aRv, ...)                   \
   MOZ_ASSERT(mParent);                                                  \
-  RefPtr<Promise> p = Promise::Create(mParent, aRv);                  \
+  RefPtr<Promise> p = Promise::Create(mParent, aRv);                    \
   if (aRv.Failed()) {                                                   \
     return nullptr;                                                     \
   }                                                                     \
-  RefPtr<WebCryptoTask> task = WebCryptoTask::Create ## Operation ## Task(__VA_ARGS__); \
-  task->DispatchWithPromise(p); \
+  RecordTelemetryOnce();                                                \
+  RefPtr<WebCryptoTask> task =                                          \
+    WebCryptoTask::Create ## Operation ## Task(__VA_ARGS__);            \
+  task->DispatchWithPromise(p);                                         \
   return p.forget();
 
 already_AddRefed<Promise>
 SubtleCrypto::Encrypt(JSContext* cx,
                       const ObjectOrString& algorithm,
                       CryptoKey& key,
                       const CryptoOperationData& data,
                       ErrorResult& aRv)
--- a/dom/base/SubtleCrypto.h
+++ b/dom/base/SubtleCrypto.h
@@ -114,15 +114,18 @@ public:
                                       CryptoKey& unwrappingKey,
                                       const ObjectOrString& unwrapAlgorithm,
                                       const ObjectOrString& unwrappedKeyAlgorithm,
                                       bool extractable,
                                       const Sequence<nsString>& keyUsages,
                                       ErrorResult& aRv);
 
 private:
+  void RecordTelemetryOnce();
+
   nsCOMPtr<nsIGlobalObject> mParent;
+  bool mRecordedTelemetry;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_SubtleCrypto_h
--- a/dom/fetch/Fetch.cpp
+++ b/dom/fetch/Fetch.cpp
@@ -54,16 +54,19 @@ namespace dom {
 using namespace workers;
 
 // This class helps the proxying of FetchSignal changes cross threads.
 class FetchSignalProxy final : public FetchSignal::Follower
 {
   // This is created and released on the main-thread.
   RefPtr<FetchSignal> mSignalMainThread;
 
+  // The main-thread event target for runnable dispatching.
+  nsCOMPtr<nsIEventTarget> mMainThreadEventTarget;
+
   // This value is used only for the creation of FetchSignal on the
   // main-thread. They are not updated.
   const bool mAborted;
 
   // This runnable propagates changes from the FetchSignal on workers to the
   // FetchSignal on main-thread.
   class FetchSignalProxyRunnable final : public Runnable
   {
@@ -82,28 +85,30 @@ class FetchSignalProxy final : public Fe
       signal->Abort();
       return NS_OK;
     }
   };
 
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FetchSignalProxy)
 
-  explicit FetchSignalProxy(FetchSignal* aSignal)
-    : mAborted(aSignal->Aborted())
+  FetchSignalProxy(FetchSignal* aSignal, nsIEventTarget* aMainThreadEventTarget)
+    : mMainThreadEventTarget(aMainThreadEventTarget)
+    , mAborted(aSignal->Aborted())
   {
+    MOZ_ASSERT(mMainThreadEventTarget);
     Follow(aSignal);
   }
 
   void
   Aborted() override
   {
     RefPtr<FetchSignalProxyRunnable> runnable =
       new FetchSignalProxyRunnable(this);
-    NS_DispatchToMainThread(runnable);
+    mMainThreadEventTarget->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
   }
 
   FetchSignal*
   GetOrCreateSignalForMainThread()
   {
     MOZ_ASSERT(NS_IsMainThread());
     if (!mSignalMainThread) {
       mSignalMainThread = new FetchSignal(mAborted);
@@ -115,17 +120,17 @@ public:
   Shutdown()
   {
     Unfollow();
   }
 
 private:
   ~FetchSignalProxy()
   {
-    NS_ReleaseOnMainThread(mSignalMainThread.forget());
+    NS_ProxyRelease(mMainThreadEventTarget, mSignalMainThread.forget());
   }
 };
 
 class WorkerFetchResolver final : public FetchDriverObserver
 {
   friend class MainThreadFetchRunnable;
   friend class WorkerDataAvailableRunnable;
   friend class WorkerFetchResponseEndBase;
@@ -147,17 +152,18 @@ public:
     RefPtr<PromiseWorkerProxy> proxy =
       PromiseWorkerProxy::Create(aWorkerPrivate, aPromise);
     if (!proxy) {
       return nullptr;
     }
 
     RefPtr<FetchSignalProxy> signalProxy;
     if (aSignal) {
-      signalProxy = new FetchSignalProxy(aSignal);
+      signalProxy =
+        new FetchSignalProxy(aSignal, aWorkerPrivate->MainThreadEventTarget());
     }
 
     RefPtr<WorkerFetchResolver> r =
       new WorkerFetchResolver(proxy, signalProxy, aObserver);
     return r.forget();
   }
 
   FetchSignal*
@@ -271,24 +277,26 @@ public:
     {
       // Acquire the proxy mutex while getting data from the WorkerPrivate...
       MutexAutoLock lock(proxy->Lock());
       if (proxy->CleanedUp()) {
         NS_WARNING("Aborting Fetch because worker already shut down");
         return NS_OK;
       }
 
-      nsCOMPtr<nsIPrincipal> principal = proxy->GetWorkerPrivate()->GetPrincipal();
+      WorkerPrivate* workerPrivate = proxy->GetWorkerPrivate();
+      MOZ_ASSERT(workerPrivate);
+      nsCOMPtr<nsIPrincipal> principal = workerPrivate->GetPrincipal();
       MOZ_ASSERT(principal);
-      nsCOMPtr<nsILoadGroup> loadGroup = proxy->GetWorkerPrivate()->GetLoadGroup();
+      nsCOMPtr<nsILoadGroup> loadGroup = workerPrivate->GetLoadGroup();
       MOZ_ASSERT(loadGroup);
-
       // We don't track if a worker is spawned from a tracking script for now,
       // so pass false as the last argument to FetchDriver().
-      fetch = new FetchDriver(mRequest, principal, loadGroup, false);
+      fetch = new FetchDriver(mRequest, principal, loadGroup,
+                              workerPrivate->MainThreadEventTarget(), false);
       nsAutoCString spec;
       if (proxy->GetWorkerPrivate()->GetBaseURI()) {
         proxy->GetWorkerPrivate()->GetBaseURI()->GetAsciiSpec(spec);
       }
       fetch->SetWorkerScript(spec);
     }
 
     RefPtr<FetchSignal> signal = mResolver->GetFetchSignal();
@@ -303,16 +311,18 @@ already_AddRefed<Promise>
 FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput,
              const RequestInit& aInit, CallerType aCallerType, ErrorResult& aRv)
 {
   RefPtr<Promise> p = Promise::Create(aGlobal, aRv);
   if (NS_WARN_IF(aRv.Failed())) {
     return nullptr;
   }
 
+  MOZ_ASSERT(aGlobal);
+
   // Double check that we have chrome privileges if the Request's content
   // policy type has been overridden.
   MOZ_ASSERT_IF(aInput.IsRequest() &&
                 aInput.GetAsRequest().IsContentPolicyTypeOverridden(),
                 aCallerType == CallerType::System);
 
   AutoJSAPI jsapi;
   if (!jsapi.Init(aGlobal)) {
@@ -375,17 +385,18 @@ FetchRequest(nsIGlobalObject* aGlobal, c
       }
     }
 
     Telemetry::Accumulate(Telemetry::FETCH_IS_MAINTHREAD, 1);
 
     RefPtr<MainThreadFetchResolver> resolver =
       new MainThreadFetchResolver(p, observer);
     RefPtr<FetchDriver> fetch =
-      new FetchDriver(r, principal, loadGroup, isTrackingFetch);
+      new FetchDriver(r, principal, loadGroup,
+                      aGlobal->EventTargetFor(TaskCategory::Other), isTrackingFetch);
     fetch->SetDocument(doc);
     resolver->SetLoadGroup(loadGroup);
     aRv = fetch->Fetch(signal, resolver);
     if (NS_WARN_IF(aRv.Failed())) {
       return nullptr;
     }
   } else {
     WorkerPrivate* worker = GetCurrentThreadWorkerPrivate();
@@ -1114,36 +1125,43 @@ public:
       mWasNotified = true;
       mBody->ContinueConsumeBody(NS_BINDING_ABORTED, 0, nullptr);
     }
     return true;
   }
 };
 
 template <class Derived>
-FetchBody<Derived>::FetchBody()
+FetchBody<Derived>::FetchBody(nsIGlobalObject* aOwner)
   : mWorkerHolder(nullptr)
+  , mOwner(aOwner)
   , mBodyUsed(false)
 #ifdef DEBUG
   , mReadDone(false)
 #endif
 {
+  MOZ_ASSERT(aOwner);
+
   if (!NS_IsMainThread()) {
     mWorkerPrivate = GetCurrentThreadWorkerPrivate();
     MOZ_ASSERT(mWorkerPrivate);
+    mMainThreadEventTarget = mWorkerPrivate->MainThreadEventTarget();
   } else {
     mWorkerPrivate = nullptr;
+    mMainThreadEventTarget = aOwner->EventTargetFor(TaskCategory::Other);
   }
+
+  MOZ_ASSERT(mMainThreadEventTarget);
 }
 
 template
-FetchBody<Request>::FetchBody();
+FetchBody<Request>::FetchBody(nsIGlobalObject* aOwner);
 
 template
-FetchBody<Response>::FetchBody();
+FetchBody<Response>::FetchBody(nsIGlobalObject* aOwner);
 
 template <class Derived>
 FetchBody<Derived>::~FetchBody()
 {
 }
 
 // Returns true if addref succeeded.
 // Always succeeds on main thread.
@@ -1230,21 +1248,17 @@ FetchBody<Derived>::BeginConsumeBody()
   // The FetchBody is not thread-safe refcounted. We addref it here and release
   // it once the stream read is finished.
   if (!AddRefObject()) {
     return NS_ERROR_FAILURE;
   }
 
   nsCOMPtr<nsIRunnable> r = new BeginConsumeBodyRunnable<Derived>(this);
   nsresult rv = NS_OK;
-  if (mWorkerPrivate) {
-    rv = mWorkerPrivate->DispatchToMainThread(r.forget());
-  } else {
-    rv = NS_DispatchToMainThread(r.forget());
-  }
+  mMainThreadEventTarget->Dispatch(r.forget(), NS_DISPATCH_NORMAL);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     ReleaseObject();
     return rv;
   }
   return NS_OK;
 }
 
 /*
@@ -1265,17 +1279,18 @@ FetchBody<Derived>::BeginConsumeBodyMain
     rv = NS_NewCStringInputStream(getter_AddRefs(stream), EmptyCString());
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return;
     }
   }
 
   nsCOMPtr<nsIInputStreamPump> pump;
   rv = NS_NewInputStreamPump(getter_AddRefs(pump),
-                             stream);
+                             stream, -1, -1, 0, 0, false,
+                             mMainThreadEventTarget);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return;
   }
 
   RefPtr<ConsumeBodyDoneObserver<Derived>> p = new ConsumeBodyDoneObserver<Derived>(this);
 
   nsCOMPtr<nsIStreamListener> listener;
   if (mConsumeType == CONSUME_BLOB) {
@@ -1288,17 +1303,18 @@ FetchBody<Derived>::BeginConsumeBodyMain
     // it's system or content not in private Browsing.
     if (principalInfo &&
         (principalInfo->type() == mozilla::ipc::PrincipalInfo::TSystemPrincipalInfo ||
          (principalInfo->type() == mozilla::ipc::PrincipalInfo::TContentPrincipalInfo &&
           principalInfo->get_ContentPrincipalInfo().attrs().mPrivateBrowsingId == 0))) {
       type = MutableBlobStorage::eCouldBeInTemporaryFile;
     }
 
-    listener = new MutableBlobStreamListener(type, nullptr, mMimeType, p);
+    listener = new MutableBlobStreamListener(type, nullptr, mMimeType, p,
+                                             mMainThreadEventTarget);
   } else {
     nsCOMPtr<nsIStreamLoader> loader;
     rv = NS_NewStreamLoader(getter_AddRefs(loader), p);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return;
     }
 
     listener = loader;
@@ -1306,17 +1322,18 @@ FetchBody<Derived>::BeginConsumeBodyMain
 
   rv = pump->AsyncRead(listener, nullptr);
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return;
   }
 
   // Now that everything succeeded, we can assign the pump to a pointer that
   // stays alive for the lifetime of the FetchBody.
-  mConsumeBodyPump = new nsMainThreadPtrHolder<nsIInputStreamPump>(pump);
+  mConsumeBodyPump =
+    new nsMainThreadPtrHolder<nsIInputStreamPump>(pump, mMainThreadEventTarget);
   // It is ok for retargeting to fail and reads to happen on the main thread.
   autoReject.DontFail();
 
   // Try to retarget, otherwise fall back to main thread.
   nsCOMPtr<nsIThreadRetargetableRequest> rr = do_QueryInterface(pump);
   if (rr) {
     nsCOMPtr<nsIEventTarget> sts = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
     rv = rr->RetargetDeliveryTo(sts);
--- a/dom/fetch/Fetch.h
+++ b/dom/fetch/Fetch.h
@@ -18,16 +18,17 @@
 
 #include "mozilla/DebugOnly.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/RequestBinding.h"
 #include "mozilla/dom/workers/bindings/WorkerHolder.h"
 
 class nsIGlobalObject;
+class nsIEventTarget;
 
 namespace mozilla {
 namespace dom {
 
 class BlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString;
 class BlobImpl;
 class InternalRequest;
 class OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString;
@@ -164,17 +165,19 @@ public:
   // Always set whenever the FetchBody is created on the worker thread.
   workers::WorkerPrivate* mWorkerPrivate;
 
   // Set when consuming the body is attempted on a worker.
   // Unset when consumption is done/aborted.
   nsAutoPtr<workers::WorkerHolder> mWorkerHolder;
 
 protected:
-  FetchBody();
+  nsCOMPtr<nsIGlobalObject> mOwner;
+
+  explicit FetchBody(nsIGlobalObject* aOwner);
 
   virtual ~FetchBody();
 
   void
   SetMimeType();
 private:
   enum ConsumeType
   {
@@ -228,14 +231,17 @@ private:
   // Only touched on target thread.
   ConsumeType mConsumeType;
   RefPtr<Promise> mConsumePromise;
 #ifdef DEBUG
   bool mReadDone;
 #endif
 
   nsMainThreadPtrHandle<nsIInputStreamPump> mConsumeBodyPump;
+
+  // The main-thread event target for runnable dispatching.
+  nsCOMPtr<nsIEventTarget> mMainThreadEventTarget;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_Fetch_h
--- a/dom/fetch/FetchDriver.cpp
+++ b/dom/fetch/FetchDriver.cpp
@@ -43,28 +43,31 @@
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_ISUPPORTS(FetchDriver,
                   nsIStreamListener, nsIChannelEventSink, nsIInterfaceRequestor,
                   nsIThreadRetargetableStreamListener)
 
 FetchDriver::FetchDriver(InternalRequest* aRequest, nsIPrincipal* aPrincipal,
-                         nsILoadGroup* aLoadGroup, bool aIsTrackingFetch)
+                         nsILoadGroup* aLoadGroup, nsIEventTarget* aMainThreadEventTarget,
+                         bool aIsTrackingFetch)
   : mPrincipal(aPrincipal)
   , mLoadGroup(aLoadGroup)
   , mRequest(aRequest)
+  , mMainThreadEventTarget(aMainThreadEventTarget)
   , mIsTrackingFetch(aIsTrackingFetch)
 #ifdef DEBUG
   , mResponseAvailableCalled(false)
   , mFetchCalled(false)
 #endif
 {
   MOZ_ASSERT(aRequest);
   MOZ_ASSERT(aPrincipal);
+  MOZ_ASSERT(aMainThreadEventTarget);
 }
 
 FetchDriver::~FetchDriver()
 {
   // We assert this since even on failures, we should call
   // FailWithNetworkError().
   MOZ_ASSERT(mResponseAvailableCalled);
 }
@@ -667,17 +670,18 @@ FetchDriver::OnDataAvailable(nsIRequest*
   // called between OnStartRequest and OnStopRequest, so we don't need to worry
   // about races.
 
   if (mObserver) {
     if (NS_IsMainThread()) {
       mObserver->OnDataAvailable();
     } else {
       RefPtr<Runnable> runnable = new DataAvailableRunnable(mObserver);
-      nsresult rv = NS_DispatchToMainThread(runnable);
+      nsresult rv =
+        mMainThreadEventTarget->Dispatch(runnable.forget(), NS_DISPATCH_NORMAL);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
     }
   }
 
   uint32_t aRead;
   MOZ_ASSERT(mResponse);
--- a/dom/fetch/FetchDriver.h
+++ b/dom/fetch/FetchDriver.h
@@ -16,16 +16,17 @@
 #include "mozilla/dom/SRIMetadata.h"
 #include "mozilla/RefPtr.h"
 
 #include "mozilla/DebugOnly.h"
 #include "mozilla/net/ReferrerPolicy.h"
 
 class nsIConsoleReportCollector;
 class nsIDocument;
+class nsIEventTarget;
 class nsIOutputStream;
 class nsILoadGroup;
 class nsIPrincipal;
 
 namespace mozilla {
 namespace dom {
 
 class InternalRequest;
@@ -92,16 +93,17 @@ public:
   NS_DECL_NSISTREAMLISTENER
   NS_DECL_NSICHANNELEVENTSINK
   NS_DECL_NSIINTERFACEREQUESTOR
   NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER
 
   FetchDriver(InternalRequest* aRequest,
               nsIPrincipal* aPrincipal,
               nsILoadGroup* aLoadGroup,
+              nsIEventTarget* aMainThreadEventTarget,
               bool aIsTrackingFetch);
 
   nsresult Fetch(FetchSignal* aSignal,
                  FetchDriverObserver* aObserver);
 
   void
   SetDocument(nsIDocument* aDocument);
 
@@ -122,16 +124,17 @@ private:
   nsCOMPtr<nsILoadGroup> mLoadGroup;
   RefPtr<InternalRequest> mRequest;
   RefPtr<InternalResponse> mResponse;
   nsCOMPtr<nsIOutputStream> mPipeOutputStream;
   RefPtr<FetchDriverObserver> mObserver;
   nsCOMPtr<nsIDocument> mDocument;
   nsCOMPtr<nsIChannel> mChannel;
   nsAutoPtr<SRICheckDataVerifier> mSRIDataVerifier;
+  nsCOMPtr<nsIEventTarget> mMainThreadEventTarget;
   SRIMetadata mSRIMetadata;
   nsCString mWorkerScript;
   bool mIsTrackingFetch;
 
 #ifdef DEBUG
   bool mResponseAvailableCalled;
   bool mFetchCalled;
 #endif
--- a/dom/fetch/Request.cpp
+++ b/dom/fetch/Request.cpp
@@ -28,18 +28,17 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(Request
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Request, mOwner, mHeaders)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Request)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
 Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest)
-  : FetchBody<Request>()
-  , mOwner(aOwner)
+  : FetchBody<Request>(aOwner)
   , mRequest(aRequest)
 {
   MOZ_ASSERT(aRequest->Headers()->Guard() == HeadersGuardEnum::Immutable ||
              aRequest->Headers()->Guard() == HeadersGuardEnum::Request ||
              aRequest->Headers()->Guard() == HeadersGuardEnum::Request_no_cors);
   SetMimeType();
 }
 
--- a/dom/fetch/Request.h
+++ b/dom/fetch/Request.h
@@ -151,17 +151,16 @@ public:
   GetPrincipalInfo() const
   {
     return mRequest->GetPrincipalInfo();
   }
 
 private:
   ~Request();
 
-  nsCOMPtr<nsIGlobalObject> mOwner;
   RefPtr<InternalRequest> mRequest;
   // Lazily created.
   RefPtr<Headers> mHeaders;
 };
 
 } // namespace dom
 } // namespace mozilla
 
--- a/dom/fetch/Response.cpp
+++ b/dom/fetch/Response.cpp
@@ -29,18 +29,17 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(Respons
 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Response, mOwner, mHeaders)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Response)
   NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
 Response::Response(nsIGlobalObject* aGlobal, InternalResponse* aInternalResponse)
-  : FetchBody<Response>()
-  , mOwner(aGlobal)
+  : FetchBody<Response>(aGlobal)
   , mInternalResponse(aInternalResponse)
 {
   MOZ_ASSERT(aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Immutable ||
              aInternalResponse->Headers()->Guard() == HeadersGuardEnum::Response);
   SetMimeType();
 }
 
 Response::~Response()
--- a/dom/fetch/Response.h
+++ b/dom/fetch/Response.h
@@ -132,17 +132,16 @@ public:
   SetBody(nsIInputStream* aBody, int64_t aBodySize);
 
   already_AddRefed<InternalResponse>
   GetInternalResponse() const;
 
 private:
   ~Response();
 
-  nsCOMPtr<nsIGlobalObject> mOwner;
   RefPtr<InternalResponse> mInternalResponse;
   // Lazily created
   RefPtr<Headers> mHeaders;
 };
 
 } // namespace dom
 } // namespace mozilla
 
--- a/dom/file/ipc/IPCBlobInputStreamChild.cpp
+++ b/dom/file/ipc/IPCBlobInputStreamChild.cpp
@@ -1,19 +1,21 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* 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 "IPCBlobInputStreamChild.h"
+#include "IPCBlobInputStreamThread.h"
 
 #include "mozilla/ipc/IPCStreamUtils.h"
+#include "WorkerHolder.h"
 #include "WorkerPrivate.h"
-#include "WorkerHolder.h"
+#include "WorkerRunnable.h"
 
 namespace mozilla {
 namespace dom {
 
 using namespace workers;
 
 namespace {
 
@@ -44,17 +46,19 @@ class StreamNeededRunnable final : publi
 public:
   explicit StreamNeededRunnable(IPCBlobInputStreamChild* aActor)
     : mActor(aActor)
   {}
 
   NS_IMETHOD
   Run() override
   {
-    if (mActor->IsAlive()) {
+    MOZ_ASSERT(mActor->State() != IPCBlobInputStreamChild::eActiveMigrating &&
+               mActor->State() != IPCBlobInputStreamChild::eInactiveMigrating);
+    if (mActor->State() == IPCBlobInputStreamChild::eActive) {
       mActor->SendStreamNeeded();
     }
     return NS_OK;
   }
 
 private:
   RefPtr<IPCBlobInputStreamChild> mActor;
 };
@@ -83,50 +87,64 @@ public:
 private:
   RefPtr<IPCBlobInputStream> mDestinationStream;
   nsCOMPtr<nsIInputStream> mCreatedStream;
 };
 
 class IPCBlobInputStreamWorkerHolder final : public WorkerHolder
 {
 public:
-  explicit IPCBlobInputStreamWorkerHolder(IPCBlobInputStreamChild* aActor)
-    : mActor(aActor)
-  {}
-
   bool Notify(Status aStatus) override
   {
-    if (aStatus > Running) {
-      mActor->Shutdown();
-      // After this the WorkerHolder is gone.
-    }
+    // We must keep the worker alive until the migration is completed.
     return true;
   }
+};
+
+class ReleaseWorkerHolderRunnable final : public CancelableRunnable
+{
+public:
+  explicit ReleaseWorkerHolderRunnable(UniquePtr<workers::WorkerHolder>&& aWorkerHolder)
+    : mWorkerHolder(Move(aWorkerHolder))
+  {}
+
+  NS_IMETHOD
+  Run() override
+  {
+    mWorkerHolder = nullptr;
+    return NS_OK;
+  }
+
+  nsresult
+  Cancel() override
+  {
+    return Run();
+  }
 
 private:
-  RefPtr<IPCBlobInputStreamChild> mActor;
+  UniquePtr<workers::WorkerHolder> mWorkerHolder;
 };
 
 } // anonymous
 
 IPCBlobInputStreamChild::IPCBlobInputStreamChild(const nsID& aID,
                                                  uint64_t aSize)
   : mMutex("IPCBlobInputStreamChild::mMutex")
   , mID(aID)
   , mSize(aSize)
-  , mActorAlive(true)
+  , mState(eActive)
   , mOwningThread(NS_GetCurrentThread())
 {
   // If we are running in a worker, we need to send a Close() to the parent side
   // before the thread is released.
   if (!NS_IsMainThread()) {
     WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
     if (workerPrivate) {
       UniquePtr<WorkerHolder> workerHolder(
-        new IPCBlobInputStreamWorkerHolder(this));
+        new IPCBlobInputStreamWorkerHolder());
       if (workerHolder->HoldWorker(workerPrivate, Canceling)) {
         mWorkerHolder.swap(workerHolder);
       }
     }
   }
 }
 
 IPCBlobInputStreamChild::~IPCBlobInputStreamChild()
@@ -137,67 +155,101 @@ IPCBlobInputStreamChild::Shutdown()
 {
   MutexAutoLock lock(mMutex);
 
   RefPtr<IPCBlobInputStreamChild> kungFuDeathGrip = this;
 
   mWorkerHolder = nullptr;
   mPendingOperations.Clear();
 
-  if (mActorAlive) {
+  if (mState == eActive) {
     SendClose();
-    mActorAlive = false;
+    mState = eInactive;
   }
 }
 
 void
 IPCBlobInputStreamChild::ActorDestroy(IProtocol::ActorDestroyReason aReason)
 {
+  bool migrating = false;
+
   {
     MutexAutoLock lock(mMutex);
-    mActorAlive = false;
+    migrating = mState == eActiveMigrating;
+    mState = migrating ? eInactiveMigrating : eInactive;
+  }
+
+  if (migrating) {
+    // We were waiting for this! Now we can migrate the actor in the correct
+    // thread.
+    RefPtr<IPCBlobInputStreamThread> thread =
+      IPCBlobInputStreamThread::GetOrCreate();
+    ResetManager();
+    thread->MigrateActor(this);
+    return;
   }
 
   // Let's cleanup the workerHolder and the pending operation queue.
   Shutdown();
 }
 
-bool
-IPCBlobInputStreamChild::IsAlive()
+IPCBlobInputStreamChild::ActorState
+IPCBlobInputStreamChild::State()
 {
   MutexAutoLock lock(mMutex);
-  return mActorAlive;
+  return mState;
 }
 
 already_AddRefed<nsIInputStream>
 IPCBlobInputStreamChild::CreateStream()
 {
-  MutexAutoLock lock(mMutex);
+  bool shouldMigrate = false;
+
+  RefPtr<IPCBlobInputStream> stream = new IPCBlobInputStream(this);
+
+  {
+    MutexAutoLock lock(mMutex);
+
+    if (mState == eInactive) {
+      return nullptr;
+    }
 
-  if (!mActorAlive) {
-    return nullptr;
+    // The stream is active but maybe it is not running in the DOM-File thread.
+    // We should migrate it there.
+    if (mState == eActive &&
+        !IPCBlobInputStreamThread::IsOnFileThread(mOwningThread)) {
+      MOZ_ASSERT(mStreams.IsEmpty());
+      shouldMigrate = true;
+      mState = eActiveMigrating;
+    }
+
+    mStreams.AppendElement(stream);
   }
 
-  RefPtr<IPCBlobInputStream> stream = new IPCBlobInputStream(this);
-  mStreams.AppendElement(stream);
+  // Send__delete__ will call ActorDestroy(). mMutex cannot be locked at this
+  // time.
+  if (shouldMigrate) {
+    Send__delete__(this);
+  }
+
   return stream.forget();
 }
 
 void
 IPCBlobInputStreamChild::ForgetStream(IPCBlobInputStream* aStream)
 {
   MOZ_ASSERT(aStream);
 
   RefPtr<IPCBlobInputStreamChild> kungFuDeathGrip = this;
 
   {
     MutexAutoLock lock(mMutex);
     mStreams.RemoveElement(aStream);
 
-    if (!mStreams.IsEmpty() || !mActorAlive) {
+    if (!mStreams.IsEmpty() || mState != eActive) {
       return;
     }
   }
 
   if (mOwningThread == NS_GetCurrentThread()) {
     Shutdown();
     return;
   }
@@ -207,26 +259,33 @@ IPCBlobInputStreamChild::ForgetStream(IP
 }
 
 void
 IPCBlobInputStreamChild::StreamNeeded(IPCBlobInputStream* aStream,
                                       nsIEventTarget* aEventTarget)
 {
   MutexAutoLock lock(mMutex);
 
-  if (!mActorAlive) {
+  if (mState == eInactive) {
     return;
   }
 
   MOZ_ASSERT(mStreams.Contains(aStream));
 
   PendingOperation* opt = mPendingOperations.AppendElement();
   opt->mStream = aStream;
   opt->mEventTarget = aEventTarget ? aEventTarget : NS_GetCurrentThread();
 
+  if (mState == eActiveMigrating || mState == eInactiveMigrating) {
+    // This operation will be continued when the migration is completed.
+    return;
+  }
+
+  MOZ_ASSERT(mState == eActive);
+
   if (mOwningThread == NS_GetCurrentThread()) {
     SendStreamNeeded();
     return;
   }
 
   RefPtr<StreamNeededRunnable> runnable = new StreamNeededRunnable(this);
   mOwningThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
 }
@@ -237,25 +296,56 @@ IPCBlobInputStreamChild::RecvStreamReady
   nsCOMPtr<nsIInputStream> stream = mozilla::ipc::DeserializeIPCStream(aStream);
 
   RefPtr<IPCBlobInputStream> pendingStream;
   nsCOMPtr<nsIEventTarget> eventTarget;
 
   {
     MutexAutoLock lock(mMutex);
     MOZ_ASSERT(!mPendingOperations.IsEmpty());
-    MOZ_ASSERT(mActorAlive);
+    MOZ_ASSERT(mState == eActive);
 
     pendingStream = mPendingOperations[0].mStream;
     eventTarget = mPendingOperations[0].mEventTarget;
 
     mPendingOperations.RemoveElementAt(0);
   }
 
   RefPtr<StreamReadyRunnable> runnable =
     new StreamReadyRunnable(pendingStream, stream);
   eventTarget->Dispatch(runnable, NS_DISPATCH_NORMAL);
 
   return IPC_OK();
 }
 
+void
+IPCBlobInputStreamChild::Migrated()
+{
+  MutexAutoLock lock(mMutex);
+  MOZ_ASSERT(mState == eInactiveMigrating);
+
+  if (mWorkerHolder) {
+    RefPtr<ReleaseWorkerHolderRunnable> runnable =
+      new ReleaseWorkerHolderRunnable(Move(mWorkerHolder));
+    mOwningThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
+  }
+
+  mOwningThread = NS_GetCurrentThread();
+  MOZ_ASSERT(IPCBlobInputStreamThread::IsOnFileThread(mOwningThread));
+
+  // Maybe we have no reasons to keep this actor alive.
+  if (mStreams.IsEmpty()) {
+    mState = eInactive;
+    SendClose();
+    return;
+  }
+
+  mState = eActive;
+
+  // Let's processing the pending operations. We need a stream for each pending
+  // operation.
+  for (uint32_t i = 0; i < mPendingOperations.Length(); ++i) {
+    SendStreamNeeded();
+  }
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/file/ipc/IPCBlobInputStreamChild.h
+++ b/dom/file/ipc/IPCBlobInputStreamChild.h
@@ -21,25 +21,42 @@ class WorkerHolder;
 }
 
 class IPCBlobInputStream;
 
 class IPCBlobInputStreamChild final
   : public mozilla::ipc::PIPCBlobInputStreamChild
 {
 public:
+  enum ActorState
+  {
+    // The actor is connected via IPDL to the parent.
+    eActive,
+
+    // The actor is disconnected.
+    eInactive,
+
+    // The actor is waiting to be disconnected. Once it has been disconnected,
+    // it will be reactivated on the DOM-File thread.
+    eActiveMigrating,
+
+    // The actor has been disconnected and it's waiting to be connected on the
+    // DOM-File thread.
+    eInactiveMigrating,
+  };
+
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(IPCBlobInputStreamChild)
 
   IPCBlobInputStreamChild(const nsID& aID, uint64_t aSize);
 
   void
   ActorDestroy(IProtocol::ActorDestroyReason aReason) override;
 
-  bool
-  IsAlive();
+  ActorState
+  State();
 
   already_AddRefed<nsIInputStream>
   CreateStream();
 
   void
   ForgetStream(IPCBlobInputStream* aStream);
 
   const nsID&
@@ -59,32 +76,34 @@ public:
                nsIEventTarget* aEventTarget);
 
   mozilla::ipc::IPCResult
   RecvStreamReady(const OptionalIPCStream& aStream) override;
 
   void
   Shutdown();
 
+  void
+  Migrated();
+
 private:
   ~IPCBlobInputStreamChild();
 
   // Raw pointers because these streams keep this actor alive. When the last
   // stream is unregister, the actor will be deleted. This list is protected by
   // mutex.
   nsTArray<IPCBlobInputStream*> mStreams;
 
   // This mutex protects mStreams because that can be touched in any thread.
   Mutex mMutex;
 
   const nsID mID;
   const uint64_t mSize;
 
-  // false when ActorDestroy() is called.
-  bool mActorAlive;
+  ActorState  mState;
 
   // This struct and the array are used for creating streams when needed.
   struct PendingOperation
   {
     RefPtr<IPCBlobInputStream> mStream;
     nsCOMPtr<nsIEventTarget> mEventTarget;
   };
   nsTArray<PendingOperation> mPendingOperations;
--- a/dom/file/ipc/IPCBlobInputStreamParent.cpp
+++ b/dom/file/ipc/IPCBlobInputStreamParent.cpp
@@ -10,63 +10,89 @@
 #include "nsContentUtils.h"
 
 namespace mozilla {
 namespace dom {
 
 template<typename M>
 /* static */ IPCBlobInputStreamParent*
 IPCBlobInputStreamParent::Create(nsIInputStream* aInputStream, uint64_t aSize,
-                                 nsresult* aRv, M* aManager)
+                                 uint64_t aChildID, nsresult* aRv, M* aManager)
 {
   MOZ_ASSERT(aInputStream);
   MOZ_ASSERT(aRv);
 
   nsID id;
   *aRv = nsContentUtils::GenerateUUIDInPlace(id);
   if (NS_WARN_IF(NS_FAILED(*aRv))) {
     return nullptr;
   }
 
-  IPCBlobInputStreamStorage::Get()->AddStream(aInputStream, id);
+  IPCBlobInputStreamStorage::Get()->AddStream(aInputStream, id, aChildID);
 
   return new IPCBlobInputStreamParent(id, aSize, aManager);
 }
 
+/* static */ IPCBlobInputStreamParent*
+IPCBlobInputStreamParent::Create(const nsID& aID, uint64_t aSize,
+                                 PBackgroundParent* aManager)
+{
+  IPCBlobInputStreamParent* actor =
+    new IPCBlobInputStreamParent(aID, aSize, aManager);
+
+  actor->mCallback = IPCBlobInputStreamStorage::Get()->TakeCallback(aID);
+
+  return actor;
+}
+
 IPCBlobInputStreamParent::IPCBlobInputStreamParent(const nsID& aID,
                                                    uint64_t aSize,
                                                    nsIContentParent* aManager)
   : mID(aID)
   , mSize(aSize)
   , mContentManager(aManager)
   , mPBackgroundManager(nullptr)
+  , mMigrating(false)
 {}
 
 IPCBlobInputStreamParent::IPCBlobInputStreamParent(const nsID& aID,
                                                    uint64_t aSize,
                                                    PBackgroundParent* aManager)
   : mID(aID)
   , mSize(aSize)
   , mContentManager(nullptr)
   , mPBackgroundManager(aManager)
+  , mMigrating(false)
 {}
 
 void
 IPCBlobInputStreamParent::ActorDestroy(IProtocol::ActorDestroyReason aReason)
 {
   MOZ_ASSERT(mContentManager || mPBackgroundManager);
 
   mContentManager = nullptr;
   mPBackgroundManager = nullptr;
 
-  IPCBlobInputStreamStorage::Get()->ForgetStream(mID);
-
   RefPtr<IPCBlobInputStreamParentCallback> callback;
   mCallback.swap(callback);
 
+  RefPtr<IPCBlobInputStreamStorage> storage = IPCBlobInputStreamStorage::Get();
+
+  if (mMigrating) {
+    if (callback && storage) {
+      // We need to assign this callback to the next parent.
+      IPCBlobInputStreamStorage::Get()->StoreCallback(mID, callback);
+    }
+    return;
+  }
+
+  if (storage) {
+    storage->ForgetStream(mID);
+  }
+
   if (callback) {
     callback->ActorDestroyed(mID);
   }
 }
 
 void
 IPCBlobInputStreamParent::SetCallback(
                                     IPCBlobInputStreamParentCallback* aCallback)
@@ -118,10 +144,26 @@ mozilla::ipc::IPCResult
 IPCBlobInputStreamParent::RecvClose()
 {
   MOZ_ASSERT(mContentManager || mPBackgroundManager);
 
   Unused << Send__delete__(this);
   return IPC_OK();
 }
 
+mozilla::ipc::IPCResult
+IPCBlobInputStreamParent::Recv__delete__()
+{
+  MOZ_ASSERT(mContentManager || mPBackgroundManager);
+  mMigrating = true;
+  return IPC_OK();
+}
+
+bool
+IPCBlobInputStreamParent::HasValidStream() const
+{
+  nsCOMPtr<nsIInputStream> stream;
+  IPCBlobInputStreamStorage::Get()->GetStream(mID, getter_AddRefs(stream));
+  return !!stream;
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/file/ipc/IPCBlobInputStreamParent.h
+++ b/dom/file/ipc/IPCBlobInputStreamParent.h
@@ -31,18 +31,22 @@ class IPCBlobInputStreamParent final
   : public mozilla::ipc::PIPCBlobInputStreamParent
 {
 public:
   // The size of the inputStream must be passed as argument in order to avoid
   // the use of nsIInputStream::Available() which could open a fileDescriptor in
   // case the stream is a nsFileStream.
   template<typename M>
   static IPCBlobInputStreamParent*
-  Create(nsIInputStream* aInputStream, uint64_t aSize, nsresult* aRv,
-         M* aManager);
+  Create(nsIInputStream* aInputStream, uint64_t aSize,
+         uint64_t aChildID, nsresult* aRv, M* aManager);
+
+  static IPCBlobInputStreamParent*
+  Create(const nsID& aID, uint64_t aSize,
+         mozilla::ipc::PBackgroundParent* aManager);
 
   void
   ActorDestroy(IProtocol::ActorDestroyReason aReason) override;
 
   const nsID&
   ID() const
   {
     return mID;
@@ -58,30 +62,38 @@ public:
   SetCallback(IPCBlobInputStreamParentCallback* aCallback);
 
   mozilla::ipc::IPCResult
   RecvStreamNeeded() override;
 
   mozilla::ipc::IPCResult
   RecvClose() override;
 
+  mozilla::ipc::IPCResult
+  Recv__delete__() override;
+
+  bool
+  HasValidStream() const;
+
 private:
   IPCBlobInputStreamParent(const nsID& aID, uint64_t aSize,
                            nsIContentParent* aManager);
 
   IPCBlobInputStreamParent(const nsID& aID, uint64_t aSize,
                            mozilla::ipc::PBackgroundParent* aManager);
 
   const nsID mID;
   const uint64_t mSize;
 
   // Only 1 of these 2 is set. Raw pointer because these 2 managers are keeping
   // the parent actor alive. The pointers will be nullified in ActorDestroyed.
   nsIContentParent* mContentManager;
   mozilla::ipc::PBackgroundParent* mPBackgroundManager;
 
   RefPtr<IPCBlobInputStreamParentCallback> mCallback;
+
+  bool mMigrating;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_ipc_IPCBlobInputStreamParent_h
--- a/dom/file/ipc/IPCBlobInputStreamStorage.cpp
+++ b/dom/file/ipc/IPCBlobInputStreamStorage.cpp
@@ -1,89 +1,181 @@
 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* 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 "IPCBlobInputStreamStorage.h"
 
-#include "mozilla/ClearOnShutdown.h"
+#include "mozilla/dom/ContentParent.h"
 #include "mozilla/StaticMutex.h"
 #include "mozilla/StaticPtr.h"
+#include "nsIPropertyBag2.h"
 #include "nsStreamUtils.h"
 
 namespace mozilla {
+
+using namespace hal;
+
 namespace dom {
 
 namespace {
 StaticMutex gMutex;
 StaticRefPtr<IPCBlobInputStreamStorage> gStorage;
 }
 
+NS_INTERFACE_MAP_BEGIN(IPCBlobInputStreamStorage)
+  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIObserver)
+  NS_INTERFACE_MAP_ENTRY(nsIObserver)
+NS_INTERFACE_MAP_END
+
+NS_IMPL_ADDREF(IPCBlobInputStreamStorage)
+NS_IMPL_RELEASE(IPCBlobInputStreamStorage)
+
+IPCBlobInputStreamStorage::IPCBlobInputStreamStorage()
+{}
+
 IPCBlobInputStreamStorage::~IPCBlobInputStreamStorage()
 {}
 
 /* static */ IPCBlobInputStreamStorage*
 IPCBlobInputStreamStorage::Get()
 {
   return gStorage;
 }
 
 /* static */ void
 IPCBlobInputStreamStorage::Initialize()
 {
   MOZ_ASSERT(!gStorage);
 
   gStorage = new IPCBlobInputStreamStorage();
-  ClearOnShutdown(&gStorage);
+
+  nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+  if (obs) {
+    obs->AddObserver(gStorage, "xpcom-shutdown", false);
+    obs->AddObserver(gStorage, "ipc:content-shutdown", false);
+  }
+}
+
+NS_IMETHODIMP
+IPCBlobInputStreamStorage::Observe(nsISupports* aSubject, const char* aTopic,
+                                   const char16_t* aData)
+{
+  if (!strcmp(aTopic, "xpcom-shutdown")) {
+    nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+    if (obs) {
+      obs->RemoveObserver(this, "xpcom-shutdown");
+      obs->RemoveObserver(this, "ipc:content-shutdown");
+    }
+
+    gStorage = nullptr;
+    return NS_OK;
+  }
+
+  MOZ_ASSERT(!strcmp(aTopic, "ipc:content-shutdown"));
+
+  nsCOMPtr<nsIPropertyBag2> props = do_QueryInterface(aSubject);
+  if (NS_WARN_IF(!props)) {
+    return NS_ERROR_FAILURE;
+  }
+
+  uint64_t childID = CONTENT_PROCESS_ID_UNKNOWN;
+  props->GetPropertyAsUint64(NS_LITERAL_STRING("childID"), &childID);
+  if (NS_WARN_IF(childID == CONTENT_PROCESS_ID_UNKNOWN)) {
+    return NS_ERROR_FAILURE;
+  }
+
+  mozilla::StaticMutexAutoLock lock(gMutex);
+
+  for (auto iter = mStorage.Iter(); !iter.Done(); iter.Next()) {
+    if (iter.Data()->mChildID == childID) {
+      iter.Remove();
+    }
+  }
+
+  return NS_OK;
 }
 
 void
 IPCBlobInputStreamStorage::AddStream(nsIInputStream* aInputStream,
-                                     const nsID& aID)
+                                     const nsID& aID,
+                                     uint64_t aChildID)
 {
   MOZ_ASSERT(aInputStream);
 
+  StreamData* data = new StreamData();
+  data->mInputStream = aInputStream;
+  data->mChildID = aChildID;
+
   mozilla::StaticMutexAutoLock lock(gMutex);
-  mStorage.Put(aID, aInputStream);
+  mStorage.Put(aID, data);
 }
 
 void
 IPCBlobInputStreamStorage::ForgetStream(const nsID& aID)
 {
   mozilla::StaticMutexAutoLock lock(gMutex);
   mStorage.Remove(aID);
 }
 
 void
 IPCBlobInputStreamStorage::GetStream(const nsID& aID,
                                      nsIInputStream** aInputStream)
 {
   mozilla::StaticMutexAutoLock lock(gMutex);
-  nsCOMPtr<nsIInputStream> stream = mStorage.Get(aID);
-  if (!stream) {
+  StreamData* data = mStorage.Get(aID);
+  if (!data) {
     *aInputStream = nullptr;
     return;
   }
 
   // We cannot return always the same inputStream because not all of them are
   // able to be reused. Better to clone them.
 
   nsCOMPtr<nsIInputStream> clonedStream;
   nsCOMPtr<nsIInputStream> replacementStream;
 
   nsresult rv =
-    NS_CloneInputStream(stream, getter_AddRefs(clonedStream),
+    NS_CloneInputStream(data->mInputStream, getter_AddRefs(clonedStream),
                         getter_AddRefs(replacementStream));
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return;
   }
 
   if (replacementStream) {
-    mStorage.Put(aID, replacementStream);
+    data->mInputStream = replacementStream;
   }
 
   clonedStream.forget(aInputStream);
 }
 
+void
+IPCBlobInputStreamStorage::StoreCallback(const nsID& aID,
+                                         IPCBlobInputStreamParentCallback* aCallback)
+{
+  MOZ_ASSERT(aCallback);
+
+  mozilla::StaticMutexAutoLock lock(gMutex);
+  StreamData* data = mStorage.Get(aID);
+  if (data) {
+    MOZ_ASSERT(!data->mCallback);
+    data->mCallback = aCallback;
+  }
+}
+
+already_AddRefed<IPCBlobInputStreamParentCallback>
+IPCBlobInputStreamStorage::TakeCallback(const nsID& aID)
+{
+  mozilla::StaticMutexAutoLock lock(gMutex);
+  StreamData* data = mStorage.Get(aID);
+  if (!data) {
+    return nullptr;
+  }
+
+  RefPtr<IPCBlobInputStreamParentCallback> callback;
+  data->mCallback.swap(callback);
+  return callback.forget();
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/file/ipc/IPCBlobInputStreamStorage.h
+++ b/dom/file/ipc/IPCBlobInputStreamStorage.h
@@ -3,48 +3,68 @@
 /* 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/. */
 
 #ifndef mozilla_dom_ipc_IPCBlobInputStreamStorage_h
 #define mozilla_dom_ipc_IPCBlobInputStreamStorage_h
 
 #include "mozilla/RefPtr.h"
-#include "nsInterfaceHashtable.h"
-#include "nsISupportsImpl.h"
+#include "nsClassHashtable.h"
+#include "nsIObserver.h"
 
 class nsIInputStream;
 struct nsID;
 
 namespace mozilla {
 namespace dom {
 
-class IPCBlobInputStreamStorage final
+class IPCBlobInputStreamParentCallback;
+
+class IPCBlobInputStreamStorage final : public nsIObserver
 {
 public:
-  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(IPCBlobInputStreamStorage);
+  NS_DECL_THREADSAFE_ISUPPORTS
+  NS_DECL_NSIOBSERVER
 
   // This initializes the singleton and it must be called on the main-thread.
   static void
   Initialize();
 
   static IPCBlobInputStreamStorage*
   Get();
 
   void
-  AddStream(nsIInputStream* aInputStream, const nsID& aID);
+  AddStream(nsIInputStream* aInputStream, const nsID& aID, uint64_t aChildID);
 
   void
   ForgetStream(const nsID& aID);
 
   void
   GetStream(const nsID& aID, nsIInputStream** aInputStream);
 
+  void
+  StoreCallback(const nsID& aID, IPCBlobInputStreamParentCallback* aCallback);
+
+  already_AddRefed<IPCBlobInputStreamParentCallback>
+  TakeCallback(const nsID& aID);
+
 private:
+  IPCBlobInputStreamStorage();
   ~IPCBlobInputStreamStorage();
 
-  nsInterfaceHashtable<nsIDHashKey, nsIInputStream> mStorage;
+  struct StreamData
+  {
+    nsCOMPtr<nsIInputStream> mInputStream;
+    RefPtr<IPCBlobInputStreamParentCallback> mCallback;
+
+    // This is the Process ID connected with this inputStream. We need to store
+    // this information in order to delete it if the child crashes/shutdowns.
+    uint64_t mChildID;
+  };
+
+  nsClassHashtable<nsIDHashKey, StreamData> mStorage;
 };
 
 } // namespace dom
 } // namespace mozilla
 
 #endif // mozilla_dom_ipc_IPCBlobInputStreamStorage_h
new file mode 100644
--- /dev/null
+++ b/dom/file/ipc/IPCBlobInputStreamThread.cpp
@@ -0,0 +1,203 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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 "IPCBlobInputStreamThread.h"
+
+#include "mozilla/StaticMutex.h"
+#include "mozilla/ipc/BackgroundChild.h"
+#include "mozilla/ipc/PBackgroundChild.h"
+#include "nsIIPCBackgroundChildCreateCallback.h"
+#include "nsXPCOMPrivate.h"
+
+namespace mozilla {
+
+using namespace ipc;
+
+namespace dom {
+
+namespace {
+
+StaticMutex gIPCBlobThreadMutex;
+StaticRefPtr<IPCBlobInputStreamThread> gIPCBlobThread;
+bool gShutdownHasStarted = false;
+
+class ThreadInitializeRunnable final : public Runnable
+{
+public:
+  NS_IMETHOD
+  Run() override
+  {
+     mozilla::StaticMutexAutoLock lock(gIPCBlobThreadMutex);
+     MOZ_ASSERT(gIPCBlobThread);
+     gIPCBlobThread->Initialize();
+     return NS_OK;
+  }
+};
+
+class MigrateActorRunnable final : public Runnable
+                                 , public nsIIPCBackgroundChildCreateCallback
+{
+public:
+  NS_DECL_ISUPPORTS_INHERITED
+
+  explicit MigrateActorRunnable(IPCBlobInputStreamChild* aActor)
+    : mActor(aActor)
+  {
+    MOZ_ASSERT(mActor);
+  }
+
+  NS_IMETHOD
+  Run() override
+  {
+    BackgroundChild::GetOrCreateForCurrentThread(this);
+    return NS_OK;
+  }
+
+  void
+  ActorFailed() override
+  {
+    // We cannot continue. We are probably shutting down.
+  }
+
+  void
+  ActorCreated(mozilla::ipc::PBackgroundChild* aActor) override
+  {
+    MOZ_ASSERT(mActor->State() == IPCBlobInputStreamChild::eInactiveMigrating);
+
+    if (aActor->SendPIPCBlobInputStreamConstructor(mActor, mActor->ID(),
+                                                   mActor->Size())) {
+      // We need manually to increase the reference for this actor because the
+      // IPC allocator method is not triggered. The Release() is called by IPDL
+      // when the actor is deleted.
+      mActor.get()->AddRef();
+      mActor->Migrated();
+    }
+  }
+
+private:
+  ~MigrateActorRunnable() = default;
+
+  RefPtr<IPCBlobInputStreamChild> mActor;
+};
+
+NS_IMPL_ISUPPORTS_INHERITED(MigrateActorRunnable, Runnable,
+                  nsIIPCBackgroundChildCreateCallback)
+
+} // anonymous
+
+NS_IMPL_ISUPPORTS(IPCBlobInputStreamThread, nsIObserver)
+
+/* static */ bool
+IPCBlobInputStreamThread::IsOnFileThread(nsIThread* aThread)
+{
+  MOZ_ASSERT(aThread);
+
+  mozilla::StaticMutexAutoLock lock(gIPCBlobThreadMutex);
+  return gIPCBlobThread && aThread == gIPCBlobThread->mThread;
+}
+
+/* static */ IPCBlobInputStreamThread*
+IPCBlobInputStreamThread::GetOrCreate()
+{
+  mozilla::StaticMutexAutoLock lock(gIPCBlobThreadMutex);
+
+  if (gShutdownHasStarted) {
+    return nullptr;
+  }
+
+  if (!gIPCBlobThread) {
+    gIPCBlobThread = new IPCBlobInputStreamThread();
+    gIPCBlobThread->Initialize();
+  }
+
+  return gIPCBlobThread;
+}
+
+void
+IPCBlobInputStreamThread::Initialize()
+{
+  if (!NS_IsMainThread()) {
+    NS_DispatchToMainThread(new ThreadInitializeRunnable());
+    return;
+  }
+
+  nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
+  if (NS_WARN_IF(!obs)) {
+    return;
+  }
+
+  nsresult rv =
+    obs->AddObserver(this, NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID, false);
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return;
+  }
+
+  nsCOMPtr<nsIThread> thread;
+  rv = NS_NewNamedThread("DOM File", getter_AddRefs(thread));
+  if (NS_WARN_IF(NS_FAILED(rv))) {
+    return;
+  }
+
+  mThread = thread;
+
+  if (!mPendingActors.IsEmpty()) {
+    for (uint32_t i = 0; i < mPendingActors.Length(); ++i) {
+      MigrateActorInternal(mPendingActors[i]);
+    }
+
+    mPendingActors.Clear();
+  }
+}
+
+NS_IMETHODIMP
+IPCBlobInputStreamThread::Observe(nsISupports* aSubject,
+                                  const char* aTopic,
+                                  const char16_t* aData)
+{
+  MOZ_ASSERT(!strcmp(aTopic, NS_XPCOM_SHUTDOWN_THREADS_OBSERVER_ID));
+
+  mozilla::StaticMutexAutoLock lock(gIPCBlobThreadMutex);
+
+  if (mThread) {
+    mThread->Shutdown();
+    mThread = nullptr;
+  }
+
+  gShutdownHasStarted = true;
+  gIPCBlobThread = nullptr;
+
+  return NS_OK;
+}
+
+void
+IPCBlobInputStreamThread::MigrateActor(IPCBlobInputStreamChild* aActor)
+{
+  MOZ_ASSERT(aActor->State() == IPCBlobInputStreamChild::eInactiveMigrating);
+
+  mozilla::StaticMutexAutoLock lock(gIPCBlobThreadMutex);
+
+  if (gShutdownHasStarted) {
+    return;
+  }
+
+  if (!mThread) {
+    // The thread is not initialized yet.
+    mPendingActors.AppendElement(aActor);
+    return;
+  }
+
+  MigrateActorInternal(aActor);
+}
+
+void
+IPCBlobInputStreamThread::MigrateActorInternal(IPCBlobInputStreamChild* aActor)
+{
+  RefPtr<Runnable> runnable = new MigrateActorRunnable(aActor);
+  mThread->Dispatch(runnable, NS_DISPATCH_NORMAL);
+}
+
+} // dom namespace
+} // mozilla namespace
new file mode 100644
--- /dev/null
+++ b/dom/file/ipc/IPCBlobInputStreamThread.h
@@ -0,0 +1,53 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#ifndef mozilla_dom_IPCBlobInputStreamThread_h
+#define mozilla_dom_IPCBlobInputStreamThread_h
+
+#include "nsIObserverService.h"
+
+class nsIThread;
+
+namespace mozilla {
+namespace dom {
+
+class IPCBlobInputStreamChild;
+
+class IPCBlobInputStreamThread final : public nsIObserver
+{
+public:
+  NS_DECL_THREADSAFE_ISUPPORTS
+  NS_DECL_NSIOBSERVER
+
+  static bool
+  IsOnFileThread(nsIThread* aThread);
+
+  static IPCBlobInputStreamThread*
+  GetOrCreate();
+
+  void
+  MigrateActor(IPCBlobInputStreamChild* aActor);
+
+  void
+  Initialize();
+
+private:
+  ~IPCBlobInputStreamThread() = default;
+
+  void
+  MigrateActorInternal(IPCBlobInputStreamChild* aActor);
+
+  nsCOMPtr<nsIThread> mThread;
+
+  // This is populated if MigrateActor() is called before the initialization of
+  // the thread.
+  nsTArray<RefPtr<IPCBlobInputStreamChild>> mPendingActors;
+};
+
+} // dom namespace
+} // mozilla namespace
+
+#endif // mozilla_dom_IPCBlobInputStreamThread_h
--- a/dom/file/ipc/IPCBlobUtils.cpp
+++ b/dom/file/ipc/IPCBlobUtils.cpp
@@ -6,16 +6,17 @@
 
 #include "IPCBlobUtils.h"
 #include "IPCBlobInputStream.h"
 #include "IPCBlobInputStreamChild.h"
 #include "IPCBlobInputStreamParent.h"
 #include "IPCBlobInputStreamStorage.h"
 #include "mozilla/dom/IPCBlob.h"
 #include "mozilla/dom/nsIContentParent.h"
+#include "mozilla/ipc/BackgroundParent.h"
 #include "mozilla/ipc/IPCStreamUtils.h"
 #include "StreamBlobImpl.h"
 #include "prtime.h"
 
 namespace mozilla {
 
 using namespace ipc;
 
@@ -74,24 +75,25 @@ Deserialize(const IPCBlob& aIPCBlob)
   blobImpl->SetFileId(aIPCBlob.fileId());
 
   return blobImpl.forget();
 }
 
 template<typename M>
 nsresult
 SerializeInputStreamParent(nsIInputStream* aInputStream, uint64_t aSize,
-                           IPCBlob& aIPCBlob, M* aManager)
+                           uint64_t aChildID, IPCBlob& aIPCBlob, M* aManager)
 {
   // Parent to Child we always send a IPCBlobInputStream.
   MOZ_ASSERT(XRE_IsParentProcess());
 
   nsresult rv;
   IPCBlobInputStreamParent* parentActor =
-    IPCBlobInputStreamParent::Create(aInputStream, aSize, &rv, aManager);
+    IPCBlobInputStreamParent::Create(aInputStream, aSize, aChildID, &rv,
+                                     aManager);
   if (!parentActor) {
     return rv;
   }
 
   if (!aManager->SendPIPCBlobInputStreamConstructor(parentActor,
                                                     parentActor->ID(),
                                                     parentActor->Size())) {
     return NS_ERROR_FAILURE;
@@ -112,42 +114,72 @@ SerializeInputStreamChild(nsIInputStream
   }
 
   aIPCBlob.inputStream() = ipcStream.TakeValue();
   return NS_OK;
 }
 
 nsresult
 SerializeInputStream(nsIInputStream* aInputStream, uint64_t aSize,
-                     IPCBlob& aIPCBlob, nsIContentParent* aManager)
+                     uint64_t aChildID, IPCBlob& aIPCBlob,
+                     nsIContentParent* aManager)
 {
-  return SerializeInputStreamParent(aInputStream, aSize, aIPCBlob, aManager);
+  return SerializeInputStreamParent(aInputStream, aSize, aChildID, aIPCBlob,
+                                    aManager);
 }
 
 nsresult
 SerializeInputStream(nsIInputStream* aInputStream, uint64_t aSize,
-                     IPCBlob& aIPCBlob, PBackgroundParent* aManager)
+                     uint64_t aChildID, IPCBlob& aIPCBlob,
+                     PBackgroundParent* aManager)
 {
-  return SerializeInputStreamParent(aInputStream, aSize, aIPCBlob, aManager);
+  return SerializeInputStreamParent(aInputStream, aSize, aChildID, aIPCBlob,
+                                    aManager);
 }
 
 nsresult
 SerializeInputStream(nsIInputStream* aInputStream, uint64_t aSize,
-                     IPCBlob& aIPCBlob, nsIContentChild* aManager)
+                     uint64_t aChildID, IPCBlob& aIPCBlob,
+                     nsIContentChild* aManager)
 {
   return SerializeInputStreamChild(aInputStream, aIPCBlob, aManager);
 }
 
 nsresult
 SerializeInputStream(nsIInputStream* aInputStream, uint64_t aSize,
-                     IPCBlob& aIPCBlob, PBackgroundChild* aManager)
+                     uint64_t aChildID, IPCBlob& aIPCBlob,
+                     PBackgroundChild* aManager)
 {
   return SerializeInputStreamChild(aInputStream, aIPCBlob, aManager);
 }
 
+uint64_t
+ChildIDFromManager(nsIContentParent* aManager)
+{
+  return aManager->ChildID();
+}
+
+uint64_t
+ChildIDFromManager(PBackgroundParent* aManager)
+{
+  return BackgroundParent::GetChildID(aManager);
+}
+
+uint64_t
+ChildIDFromManager(nsIContentChild* aManager)
+{
+  return 0;
+}
+
+uint64_t
+ChildIDFromManager(PBackgroundChild* aManager)
+{
+  return 0;
+}
+
 template<typename M>
 nsresult
 SerializeInternal(BlobImpl* aBlobImpl, M* aManager, IPCBlob& aIPCBlob)
 {
   MOZ_ASSERT(aBlobImpl);
 
   nsAutoString value;
   aBlobImpl->GetType(value);
@@ -189,17 +221,18 @@ SerializeInternal(BlobImpl* aBlobImpl, M
   aIPCBlob.fileId() = aBlobImpl->GetFileId();
 
   nsCOMPtr<nsIInputStream> inputStream;
   aBlobImpl->GetInternalStream(getter_AddRefs(inputStream), rv);
   if (NS_WARN_IF(rv.Failed())) {
     return rv.StealNSResult();
   }
 
-  rv = SerializeInputStream(inputStream, aIPCBlob.size(), aIPCBlob, aManager);
+  rv = SerializeInputStream(inputStream, aIPCBlob.size(),
+                            ChildIDFromManager(aManager), aIPCBlob, aManager);
   if (NS_WARN_IF(rv.Failed())) {
     return rv.StealNSResult();
   }
 
   return NS_OK;
 }
 
 nsresult
--- a/dom/file/ipc/IPCBlobUtils.h
+++ b/dom/file/ipc/IPCBlobUtils.h
@@ -124,16 +124,65 @@
  * parent retrieves the 'real' stream from IPCBlobInputStreamStorage using the
  * UUID, it will serialize the 'real' stream, and it will send it to the child
  * side.
  * 
  * When the 'real' stream is received (RecvStreamReady()), the asyncWait
  * callback will be executed and, from that moment, any IPCBlobInputStream
  * method will be forwarded to the 'real' stream ones. This means that the
  * reading will be available.
+ *
+ * DOM-File Thread
+ * ~~~~~~~~~~~~~~~
+ *
+ * IPCBlobInputStreamChild actor can be created in any thread (sort of) and
+ * their top-level IPDL protocol is PBackground. These actors are wrapped by 1
+ * or more IPCBlobInputStream objects in order to expose nsIInputStream
+ * interface and be thread-safe.
+ *
+ * But IPDL actors are not thread-safe and any SendFoo() method must be executed
+ * on the owning thread. This means that this thread must be kept alive for the
+ * life-time of the IPCBlobInputStream.
+ *
+ * In doing this, there are 2 main issues:
+ * a. if a remote Blob is created on a worker (because of a
+ *    BroadcastChannel/MessagePort for instance) and it sent to the main-thread
+ *    via PostMessage(), we have to keep that worker alive.
+ * b. if the remote Blob is created on the main-thread, any SendFoo() has to be
+ *    executed on the main-thread. This is true also when the inputStream is
+ *    used on another thread (note that nsIInputStream could do I/O and usually
+ *    they are used on special I/O threads).
+ *
+ * In order to avoid this, IPCBlobInputStreamChild are 'migrated' to a DOM-File
+ * thread. This is done in this way:
+ *
+ * 1. If IPCBlobInputStreamChild actor is not already owned by DOM-File thread,
+ *    it calls Send__delete__ in order to inform the parent side that we don't
+ *    need this IPC channel on the current thread.
+ * 3. IPCBlobInputStreamParent::Recv__delete__ is called on the parent side and
+ *    the parent actor is deleted. Doing this we don't remove the UUID from
+ *    IPCBlobInputStreamStorage.
+ * 4. When IPCBlobInputStreamChild::ActorDestroy() is called, we are sure that
+ *    the IPC channel is completely released. IPCBlobInputStreamThread is be
+ *    used to assign IPCBlobInputStreamChild actor to the DOM-File thread.
+ *    IPCBlobInputStreamThread::GetOrCreate() creates the DOM-File thread if it
+ *    doesn't exist yet and it initializes PBackground on it if needed.
+ * 5. IPCBlobInputStreamChild is reused on the DOM-File thread for the creation
+ *    of a new IPCBlobInputStreamParent actor on the parent side. Doing this,
+ *    IPCBlobInputStreamChild will now be owned by the DOM-File thread.
+ * 6. When the new IPCBlobInputStreamParent actor is created, it will receive
+ *    the same UUID of the previous parent actor. The nsIInputStream will be
+ *    retrieved from IPCBlobInputStreamStorage.
+ * 7. In order to avoid leaks, IPCBlobInputStreamStorage will monitor child
+ *    processes and in case one of them dies, it will release the
+ *    nsIInputStream objects belonging to that process.
+ *
+ * If any API wants to retrieve a 'real inputStream when the migration is in
+ * progress, that operation is stored in a pending queue and processed at the
+ * end of the migration.
  */ 
 
 namespace mozilla {
 
 namespace ipc {
 class PBackgroundChild;
 class PBackgroundParent;
 }
--- a/dom/file/ipc/PIPCBlobInputStream.ipdl
+++ b/dom/file/ipc/PIPCBlobInputStream.ipdl
@@ -15,18 +15,31 @@ namespace mozilla {
 namespace ipc {
 
 protocol PIPCBlobInputStream
 {
   manager PBackground or PContent or PContentBridge;
 
 parent:
   async StreamNeeded();
+
+  // When this is called, the parent releases the inputStream and sends a
+  // __delete__.
   async Close();
 
 child:
   async StreamReady(OptionalIPCStream aStream);
+
+both:
+  // __delete__ can be called by parent and by child for 2 reasons:
+  // - parent->child: This happens after a Close(). The child wants to inform
+  //                  the parent that no other messages will be dispatched and
+  //                  that the channel can be interrupted.
+  // - child->parent: before any operation, the child could start a migration
+  //                  from the current thread to a dedicated DOM-File one. The
+  //                  reason why a __delete__ is sent from child to parent is
+  //                  because it doesn't require any additional runnables.
   async __delete__();
 };
 
 } // namespace dom
 } // namespace mozilla
 
--- a/dom/file/ipc/moz.build
+++ b/dom/file/ipc/moz.build
@@ -17,32 +17,34 @@ EXPORTS.mozilla.dom += [
     'IPCBlobUtils.h',
 ]
 
 UNIFIED_SOURCES += [
     'IPCBlobInputStream.cpp',
     'IPCBlobInputStreamChild.cpp',
     'IPCBlobInputStreamParent.cpp',
     'IPCBlobInputStreamStorage.cpp',
+    'IPCBlobInputStreamThread.cpp',
     'IPCBlobUtils.cpp',
     'PendingIPCBlobChild.cpp',
     'PendingIPCBlobParent.cpp',
 ]
 
 IPDL_SOURCES += [
     'BlobTypes.ipdlh',
     'IPCBlob.ipdlh',
     'PIPCBlobInputStream.ipdl',
     'PPendingIPCBlob.ipdl',
 ]
 
 LOCAL_INCLUDES += [
     '/dom/file',
     '/dom/ipc',
     '/dom/workers',
+    '/xpcom/build',
 ]
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
 FINAL_LIBRARY = 'xul'
 
 CXXFLAGS += CONFIG['TK_CFLAGS']
 
--- a/dom/file/ipc/tests/test_ipcBlob_workers.html
+++ b/dom/file/ipc/tests/test_ipcBlob_workers.html
@@ -4,39 +4,118 @@
   <title>Test IPCBlob and Workers</title>
   <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 <script type="text/javascript">
 
-function workerScript() {
-  onmessage = e => {
-    e.ports[0].onmessage = event => {
-      let reader = new FileReader();
-      reader.readAsText(event.data);
-      reader.onloadend = () => {
-        let status = reader.result == 'hello world';
-        postMessage(status);
+function test_workerOwner() {
+  info("test_workerOwner");
+
+  function workerScript() {
+    onmessage = e => {
+      e.ports[0].onmessage = event => {
+        let reader = new FileReader();
+        reader.readAsText(event.data);
+        reader.onloadend = () => {
+          let status = reader.result == 'hello world';
+          postMessage(status);
+        }
       }
     }
   }
+
+  let mc = new MessageChannel();
+  mc.port1.postMessage(new Blob(['hello world']));
+
+  let workerUrl = URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"]));
+  let worker = new Worker(workerUrl);
+
+  worker.postMessage("", [mc.port2]);
+  worker.onmessage = event => {
+    ok(event.data, "All is done!");
+    next();
+  }
+}
+
+function test_workerToMainThread() {
+  info("test_workerToMainThread");
+  function workerScript() {
+    onmessage = e => {
+      e.ports[0].onmessage = event => {
+        postMessage(event.data);
+      }
+    }
+  }
+
+  let mc = new MessageChannel();
+  mc.port1.postMessage(new Blob(['hello world']));
+
+  let workerUrl = URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"]));
+  let worker = new Worker(workerUrl);
+
+  worker.postMessage("", [mc.port2]);
+  worker.onmessage = event => {
+    info("Blob received back, terminate the worker and force GC");
+    worker.terminate();
+    worker = null;
+    SpecialPowers.forceGC();
+
+    var fr = new FileReader();
+    fr.readAsText(event.data);
+    fr.onloadend = () => {
+      is(fr.result, "hello world", "Data matches");
+      next();
+    }
+  }
 }
 
-let mc = new MessageChannel();
-mc.port1.postMessage(new Blob(['hello world']));
+function test_workerOwnerPlusFileReaderSync() {
+  info("test_workerOwnerPlusFileReaderSync");
+
+  function workerScript() {
+    onmessage = e => {
+      e.ports[0].onmessage = event => {
+        let reader = new FileReaderSync();
+        let status = reader.readAsText(event.data) == 'hello world';
+         postMessage(status);
+      }
+    }
+  }
+
+  let mc = new MessageChannel();
+  mc.port1.postMessage(new Blob(['hello world']));
+
+  let workerUrl = URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"]));
+  let worker = new Worker(workerUrl);
 
-let workerUrl = URL.createObjectURL(new Blob(["(", workerScript.toSource(), ")()"]));
-let worker = new Worker(workerUrl);
+  worker.postMessage("", [mc.port2]);
+  worker.onmessage = event => {
+    ok(event.data, "All is done!");
+    next();
+  }
+}
 
-worker.postMessage("", [mc.port2]);
-worker.onmessage = event => {
-  ok(event.data, "All is done!");
-  SimpleTest.finish();
+var tests = [
+  test_workerOwner,
+  test_workerToMainThread,
+  test_workerOwnerPlusFileReaderSync,
+];
+
+function next() {
+  if (!tests.length) {
+    SimpleTest.finish();
+    return;
+  }
+
+  var test = tests.shift();
+  test();
 }
 
 SimpleTest.waitForExplicitFinish();
+next();
 
 </script>
 </pre>
 </body>
 </html>
--- a/gfx/layers/d3d11/TextureD3D11.cpp
+++ b/gfx/layers/d3d11/TextureD3D11.cpp
@@ -762,16 +762,24 @@ DXGITextureHostD3D11::SetTextureSourcePr
 {
   if (!aProvider || !aProvider->GetD3D11Device()) {
     mDevice = nullptr;
     mProvider = nullptr;
     mTextureSource = nullptr;
     return;
   }
 
+  if (mDevice && (aProvider->GetD3D11Device() != mDevice)) {
+    if (mTextureSource) {
+      mTextureSource->Reset();
+    }
+    mTextureSource = nullptr;
+    return;
+  }
+
   mProvider = aProvider;
   mDevice = aProvider->GetD3D11Device();
 
   if (mTextureSource) {
     mTextureSource->SetTextureSourceProvider(aProvider);
   }
 }
 
@@ -1176,33 +1184,16 @@ DataTextureSourceD3D11::GetTileRect(uint
 
 IntRect
 DataTextureSourceD3D11::GetTileRect()
 {
   IntRect rect = GetTileRect(mCurrentTile);
   return IntRect(rect.x, rect.y, rect.width, rect.height);
 }
 
-void
-DataTextureSourceD3D11::SetTextureSourceProvider(TextureSourceProvider* aProvider)
-{
-  ID3D11Device* newDevice = aProvider ? aProvider->GetD3D11Device() : nullptr;
-  if (!mDevice) {
-    mDevice = newDevice;
-  } else if (mDevice != newDevice) {
-    // We do not support switching devices.
-    Reset();
-    mDevice = nullptr;
-  }
-
-  if (mNextSibling) {
-    mNextSibling->SetTextureSourceProvider(aProvider);
-  }
-}
-
 CompositingRenderTargetD3D11::CompositingRenderTargetD3D11(ID3D11Texture2D* aTexture,
                                                            const gfx::IntPoint& aOrigin,
                                                            DXGI_FORMAT aFormatOverride)
   : CompositingRenderTarget(aOrigin)
 {
   MOZ_ASSERT(aTexture);
 
   mTexture = aTexture;
--- a/gfx/layers/d3d11/TextureD3D11.h
+++ b/gfx/layers/d3d11/TextureD3D11.h
@@ -241,18 +241,16 @@ public:
   virtual DataTextureSource* AsDataTextureSource() override { return mAllowTextureUploads ? this : false; }
 
   virtual void DeallocateDeviceData() override { mTexture = nullptr; }
 
   virtual gfx::IntSize GetSize() const  override { return mSize; }
 
   virtual gfx::SurfaceFormat GetFormat() const override { return mFormat; }
 
-  virtual void SetTextureSourceProvider(TextureSourceProvider* aProvider) override;
-
   // BigImageIterator
 
   virtual BigImageIterator* AsBigImageIterator() override { return mIsTiled ? this : nullptr; }
 
   virtual size_t GetTileCount() override { return mTileTextures.size(); }
 
   virtual bool NextTile() override { return (++mCurrentTile < mTileTextures.size()); }
 
@@ -261,21 +259,20 @@ public:
   virtual void EndBigImageIteration() override { mIterating = false; }
 
   virtual void BeginBigImageIteration() override
   {
     mIterating = true;
     mCurrentTile = 0;
   }
 
+  void Reset();
 protected:
   gfx::IntRect GetTileRect(uint32_t aIndex) const;
 
-  void Reset();
-
   std::vector< RefPtr<ID3D11Texture2D> > mTileTextures;
   std::vector< RefPtr<ID3D11ShaderResourceView> > mTileSRVs;
   RefPtr<ID3D11Device> mDevice;
   gfx::SurfaceFormat mFormat;
   TextureFlags mFlags;
   uint32_t mCurrentTile;
   bool mIsTiled;
   bool mIterating;
--- a/ipc/glue/BackgroundImpl.cpp
+++ b/ipc/glue/BackgroundImpl.cpp
@@ -208,16 +208,20 @@ private:
   static already_AddRefed<ContentParent>
   GetContentParent(PBackgroundParent* aBackgroundActor);
 
   // Forwarded from BackgroundParent.
   static intptr_t
   GetRawContentParentForComparison(PBackgroundParent* aBackgroundActor);
 
   // Forwarded from BackgroundParent.
+  static uint64_t
+  GetChildID(PBackgroundParent* aBackgroundActor);
+
+  // Forwarded from BackgroundParent.
   static bool
   Alloc(ContentParent* aContent,
         Endpoint<PBackgroundParent>&& aEndpoint);
 
   static bool
   CreateBackgroundThread();
 
   static void
@@ -812,16 +816,23 @@ BackgroundParent::GetContentParent(PBack
 intptr_t
 BackgroundParent::GetRawContentParentForComparison(
                                             PBackgroundParent* aBackgroundActor)
 {
   return ParentImpl::GetRawContentParentForComparison(aBackgroundActor);
 }
 
 // static
+uint64_t
+BackgroundParent::GetChildID(PBackgroundParent* aBackgroundActor)
+{
+  return ParentImpl::GetChildID(aBackgroundActor);
+}
+
+// static
 bool
 BackgroundParent::Alloc(ContentParent* aContent,
                         Endpoint<PBackgroundParent>&& aEndpoint)
 {
   return ParentImpl::Alloc(aContent, Move(aEndpoint));
 }
 
 // -----------------------------------------------------------------------------
@@ -964,16 +975,36 @@ ParentImpl::GetRawContentParentForCompar
                "called!");
     return intptr_t(-1);
   }
 
   return intptr_t(static_cast<nsIContentParent*>(actor->mContent.get()));
 }
 
 // static
+uint64_t
+ParentImpl::GetChildID(PBackgroundParent* aBackgroundActor)
+{
+  AssertIsOnBackgroundThread();
+  MOZ_ASSERT(aBackgroundActor);
+
+  auto actor = static_cast<ParentImpl*>(aBackgroundActor);
+  if (actor->mActorDestroyed) {
+    MOZ_ASSERT(false, "GetContentParent called after ActorDestroy was called!");
+    return 0;
+  }
+
+  if (actor->mContent) {
+    return actor->mContent->ChildID();
+  }
+
+  return 0;
+}
+
+// static
 bool
 ParentImpl::Alloc(ContentParent* aContent,
                   Endpoint<PBackgroundParent>&& aEndpoint)
 {
   AssertIsInMainProcess();
   AssertIsOnMainThread();
   MOZ_ASSERT(aEndpoint.IsValid());
 
--- a/ipc/glue/BackgroundParent.h
+++ b/ipc/glue/BackgroundParent.h
@@ -59,16 +59,19 @@ public:
 
   // Get a value that represents the ContentParent associated with the parent
   // actor for comparison. The value is not guaranteed to uniquely identify the
   // ContentParent after the ContentParent has died. This function may only be
   // called on the background thread.
   static intptr_t
   GetRawContentParentForComparison(PBackgroundParent* aBackgroundActor);
 
+  static uint64_t
+  GetChildID(PBackgroundParent* aBackgroundActor);
+
 private:
   // Only called by ContentParent for cross-process actors.
   static bool
   Alloc(ContentParent* aContent,
         Endpoint<PBackgroundParent>&& aEndpoint);
 };
 
 // Implemented in BackgroundImpl.cpp.
--- a/ipc/glue/BackgroundParentImpl.cpp
+++ b/ipc/glue/BackgroundParentImpl.cpp
@@ -257,17 +257,32 @@ BackgroundParentImpl::DeallocPPendingIPC
   delete aActor;
   return true;
 }
 
 PIPCBlobInputStreamParent*
 BackgroundParentImpl::AllocPIPCBlobInputStreamParent(const nsID& aID,
                                                      const uint64_t& aSize)
 {
-  MOZ_CRASH("PIPCBlobInputStreamParent actors should be manually constructed!");
+  AssertIsInMainProcess();
+  AssertIsOnBackgroundThread();
+
+  return mozilla::dom::IPCBlobInputStreamParent::Create(aID, aSize, this);
+}
+
+mozilla::ipc::IPCResult
+BackgroundParentImpl::RecvPIPCBlobInputStreamConstructor(PIPCBlobInputStreamParent* aActor,
+                                                         const nsID& aID,
+                                                         const uint64_t& aSize)
+{
+  if (!static_cast<mozilla::dom::IPCBlobInputStreamParent*>(aActor)->HasValidStream()) {
+    return IPC_FAIL_NO_REASON(this);
+  }
+
+  return IPC_OK();
 }
 
 bool
 BackgroundParentImpl::DeallocPIPCBlobInputStreamParent(PIPCBlobInputStreamParent* aActor)
 {
   AssertIsInMainProcess();
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(aActor);
--- a/ipc/glue/BackgroundParentImpl.h
+++ b/ipc/glue/BackgroundParentImpl.h
@@ -68,16 +68,21 @@ protected:
 
   virtual bool
   DeallocPPendingIPCBlobParent(PPendingIPCBlobParent* aActor) override;
 
   virtual PIPCBlobInputStreamParent*
   AllocPIPCBlobInputStreamParent(const nsID& aID,
                                  const uint64_t& aSize) override;
 
+  virtual mozilla::ipc::IPCResult
+  RecvPIPCBlobInputStreamConstructor(PIPCBlobInputStreamParent* aActor,
+                                     const nsID& aID,
+                                     const uint64_t& aSize) override;
+
   virtual bool
   DeallocPIPCBlobInputStreamParent(PIPCBlobInputStreamParent* aActor) override;
 
   virtual PFileDescriptorSetParent*
   AllocPFileDescriptorSetParent(const FileDescriptor& aFileDescriptor)
                                 override;
 
   virtual bool
--- a/ipc/glue/PBackground.ipdl
+++ b/ipc/glue/PBackground.ipdl
@@ -118,18 +118,20 @@ parent:
   async PWebAuthnTransaction();
 
 child:
   async PCache();
   async PCacheStreamControl();
 
   async PParentToChildStream();
 
-  async PIPCBlobInputStream(nsID aID, uint64_t aSize);
-
   async PPendingIPCBlob(IPCBlob blob);
 
 both:
+  // PIPCBlobInputStream is created on the parent side only if the child starts
+  // a migration.
+  async PIPCBlobInputStream(nsID aID, uint64_t aSize);
+
   async PFileDescriptorSet(FileDescriptor fd);
 };
 
 } // namespace ipc
 } // namespace mozilla
--- a/ipc/glue/ProtocolUtils.h
+++ b/ipc/glue/ProtocolUtils.h
@@ -199,16 +199,17 @@ public:
 
     // Returns the event target set by SetEventTargetForActor() if available.
     virtual nsIEventTarget* GetActorEventTarget();
 
 protected:
     friend class IToplevelProtocol;
 
     void SetId(int32_t aId) { mId = aId; }
+    void ResetManager() { mManager = nullptr; }
     void SetManager(IProtocol* aManager);
     void SetIPCChannel(MessageChannel* aChannel) { mChannel = aChannel; }
 
     virtual void SetEventTargetForActorInternal(IProtocol* aActor, nsIEventTarget* aEventTarget);
     virtual void ReplaceEventTargetForActorInternal(
       IProtocol* aActor,
       nsIEventTarget* aEventTarget);
 
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -272,71 +272,68 @@ DoTypeUpdateFallback(JSContext* cx, Base
                      HandleValue value)
 {
     // This can get called from optimized stubs. Therefore it is not allowed to gc.
     JS::AutoCheckCannotGC nogc;
 
     FallbackICSpew(cx, stub->getChainFallback(), "TypeUpdate(%s)",
                    ICStub::KindString(stub->kind()));
 
+    MOZ_ASSERT(stub->isCacheIR_Updated());
+
     RootedScript script(cx, frame->script());
     RootedObject obj(cx, &objval.toObject());
-    RootedId id(cx);
-
-    switch (stub->kind()) {
-      case ICStub::CacheIR_Updated: {
-        id = stub->toCacheIR_Updated()->updateStubId();
-        MOZ_ASSERT(id != JSID_EMPTY);
-
-        // The group should match the object's group, except when the object is
-        // an unboxed expando object: in that case, the group is the group of
-        // the unboxed object.
-        RootedObjectGroup group(cx, stub->toCacheIR_Updated()->updateStubGroup());
+
+    RootedId id(cx, stub->toCacheIR_Updated()->updateStubId());
+    MOZ_ASSERT(id != JSID_EMPTY);
+
+    // The group should match the object's group, except when the object is
+    // an unboxed expando object: in that case, the group is the group of
+    // the unboxed object.
+    RootedObjectGroup group(cx, stub->toCacheIR_Updated()->updateStubGroup());
 #ifdef DEBUG
-        if (obj->is<UnboxedExpandoObject>())
-            MOZ_ASSERT(group->clasp() == &UnboxedPlainObject::class_);
-        else
-            MOZ_ASSERT(obj->group() == group);
+    if (obj->is<UnboxedExpandoObject>())
+        MOZ_ASSERT(group->clasp() == &UnboxedPlainObject::class_);
+    else
+        MOZ_ASSERT(obj->group() == group);
 #endif
 
-        // If we're storing null/undefined to a typed object property, check if
-        // we want to include it in this property's type information.
-        if (MOZ_UNLIKELY(obj->is<TypedObject>()) && value.isNullOrUndefined()) {
-            StructTypeDescr* structDescr = &obj->as<TypedObject>().typeDescr().as<StructTypeDescr>();
-            size_t fieldIndex;
-            MOZ_ALWAYS_TRUE(structDescr->fieldIndex(id, &fieldIndex));
-
-            TypeDescr* fieldDescr = &structDescr->fieldDescr(fieldIndex);
-            ReferenceTypeDescr::Type type = fieldDescr->as<ReferenceTypeDescr>().type();
-            if (type == ReferenceTypeDescr::TYPE_ANY) {
-                // Ignore undefined values, which are included implicitly in type
-                // information for this property.
-                if (value.isUndefined())
-                    break;
-            } else {
-                MOZ_ASSERT(type == ReferenceTypeDescr::TYPE_OBJECT);
-
-                // Ignore null values being written here. Null is included
-                // implicitly in type information for this property. Note that
-                // non-object, non-null values are not possible here, these
-                // should have been filtered out by the IR emitter.
-                if (value.isNull())
-                    break;
-            }
+    // If we're storing null/undefined to a typed object property, check if
+    // we want to include it in this property's type information.
+    bool addType = true;
+    if (MOZ_UNLIKELY(obj->is<TypedObject>()) && value.isNullOrUndefined()) {
+        StructTypeDescr* structDescr = &obj->as<TypedObject>().typeDescr().as<StructTypeDescr>();
+        size_t fieldIndex;
+        MOZ_ALWAYS_TRUE(structDescr->fieldIndex(id, &fieldIndex));
+
+        TypeDescr* fieldDescr = &structDescr->fieldDescr(fieldIndex);
+        ReferenceTypeDescr::Type type = fieldDescr->as<ReferenceTypeDescr>().type();
+        if (type == ReferenceTypeDescr::TYPE_ANY) {
+            // Ignore undefined values, which are included implicitly in type
+            // information for this property.
+            if (value.isUndefined())
+                addType = false;
+        } else {
+            MOZ_ASSERT(type == ReferenceTypeDescr::TYPE_OBJECT);
+
+            // Ignore null values being written here. Null is included
+            // implicitly in type information for this property. Note that
+            // non-object, non-null values are not possible here, these
+            // should have been filtered out by the IR emitter.
+            if (value.isNull())
+                addType = false;
         }
-
+    }
+
+    if (MOZ_LIKELY(addType)) {
         JSObject* maybeSingleton = obj->isSingleton() ? obj.get() : nullptr;
         AddTypePropertyId(cx, group, maybeSingleton, id, value);
-        break;
-      }
-      default:
-        MOZ_CRASH("Invalid stub");
     }
 
-    if (!stub->addUpdateStubForValue(cx, script /* = outerScript */, obj, id, value)) {
+    if (MOZ_UNLIKELY(!stub->addUpdateStubForValue(cx, script, obj, id, value))) {
         // The calling JIT code assumes this function is infallible (for
         // instance we may reallocate dynamic slots before calling this),
         // so ignore OOMs if we failed to attach a stub.
         cx->recoverFromOutOfMemory();
     }
 
     return true;
 }
@@ -376,26 +373,18 @@ ICTypeUpdate_PrimitiveSet::Compiler::gen
         masm.branchTestBoolean(Assembler::Equal, R0, &success);
 
     if (flags_ & TypeToFlag(JSVAL_TYPE_STRING))
         masm.branchTestString(Assembler::Equal, R0, &success);
 
     if (flags_ & TypeToFlag(JSVAL_TYPE_SYMBOL))
         masm.branchTestSymbol(Assembler::Equal, R0, &success);
 
-    // Currently, we will never generate primitive stub checks for object.  However,
-    // when we do get to the point where we want to collapse our monitor chains of
-    // objects and singletons down (when they get too long) to a generic "any object"
-    // in coordination with the typeset doing the same thing, this will need to
-    // be re-enabled.
-    /*
     if (flags_ & TypeToFlag(JSVAL_TYPE_OBJECT))
         masm.branchTestObject(Assembler::Equal, R0, &success);
-    */
-    MOZ_ASSERT(!(flags_ & TypeToFlag(JSVAL_TYPE_OBJECT)));
 
     if (flags_ & TypeToFlag(JSVAL_TYPE_NULL))
         masm.branchTestNull(Assembler::Equal, R0, &success);
 
     EmitStubGuardFailure(masm);
 
     // Type matches, load true into R1.scratchReg() and return.
     masm.bind(&success);
@@ -446,16 +435,25 @@ ICTypeUpdate_ObjectGroup::Compiler::gene
     masm.mov(ImmWord(1), R1.scratchReg());
     EmitReturnFromIC(masm);
 
     masm.bind(&failure);
     EmitStubGuardFailure(masm);
     return true;
 }
 
+bool
+ICTypeUpdate_AnyValue::Compiler::generateStubCode(MacroAssembler& masm)
+{
+    // AnyValue always matches so return true.
+    masm.mov(ImmWord(1), R1.scratchReg());
+    EmitReturnFromIC(masm);
+    return true;
+}
+
 //
 // ToBool_Fallback
 //
 
 static bool
 DoToBoolFallback(JSContext* cx, BaselineFrame* frame, ICToBool_Fallback* stub, HandleValue arg,
                  MutableHandleValue ret)
 {
--- a/js/src/jit/BaselineIC.h
+++ b/js/src/jit/BaselineIC.h
@@ -186,16 +186,40 @@ class ICTypeUpdate_ObjectGroup : public 
         { }
 
         ICTypeUpdate_ObjectGroup* getStub(ICStubSpace* space) {
             return newStub<ICTypeUpdate_ObjectGroup>(space, getStubCode(), group_);
         }
     };
 };
 
+class ICTypeUpdate_AnyValue : public ICStub
+{
+    friend class ICStubSpace;
+
+    explicit ICTypeUpdate_AnyValue(JitCode* stubCode)
+      : ICStub(TypeUpdate_AnyValue, stubCode)
+    {}
+
+  public:
+    class Compiler : public ICStubCompiler {
+      protected:
+        MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm);
+
+      public:
+        explicit Compiler(JSContext* cx)
+          : ICStubCompiler(cx, TypeUpdate_AnyValue, Engine::Baseline)
+        {}
+
+        ICTypeUpdate_AnyValue* getStub(ICStubSpace* space) {
+            return newStub<ICTypeUpdate_AnyValue>(space, getStubCode());
+        }
+    };
+};
+
 // ToBool
 //      JSOP_IFNE
 
 class ICToBool_Fallback : public ICFallbackStub
 {
     friend class ICStubSpace;
 
     explicit ICToBool_Fallback(JitCode* stubCode)
--- a/js/src/jit/BaselineICList.h
+++ b/js/src/jit/BaselineICList.h
@@ -19,16 +19,17 @@ namespace jit {
     _(TypeMonitor_ObjectGroup)                   \
     _(TypeMonitor_PrimitiveSet)                  \
     _(TypeMonitor_AnyValue)                      \
                                                  \
     _(TypeUpdate_Fallback)                       \
     _(TypeUpdate_SingleObject)                   \
     _(TypeUpdate_ObjectGroup)                    \
     _(TypeUpdate_PrimitiveSet)                   \
+    _(TypeUpdate_AnyValue)                       \
                                                  \
     _(NewArray_Fallback)                         \
     _(NewObject_Fallback)                        \
     _(NewObject_WithTemplate)                    \
                                                  \
     _(ToBool_Fallback)                           \
     _(ToBool_Int32)                              \
     _(ToBool_String)                             \
--- a/js/src/jit/SharedIC.cpp
+++ b/js/src/jit/SharedIC.cpp
@@ -423,16 +423,32 @@ ICTypeMonitor_Fallback::resetMonitorStub
             iter->toMonitoredStub()->resetFirstMonitorStub(this);
         }
     } else {
         icEntry_->setFirstStub(this);
         lastMonitorStubPtrAddr_ = icEntry_->addressOfFirstStub();
     }
 }
 
+void
+ICUpdatedStub::resetUpdateStubChain(Zone* zone)
+{
+    while (!firstUpdateStub_->isTypeUpdate_Fallback()) {
+        if (zone->needsIncrementalBarrier()) {
+            // We are removing edges from update stubs to gcthings (JitCode).
+            // Perform one final trace of all update stubs for incremental GC,
+            // as it must know about those edges.
+            firstUpdateStub_->trace(zone->barrierTracer());
+        }
+        firstUpdateStub_ = firstUpdateStub_->next();
+    }
+
+    numOptimizedStubs_ = 0;
+}
+
 ICMonitoredStub::ICMonitoredStub(Kind kind, JitCode* stubCode, ICStub* firstMonitorStub)
   : ICStub(kind, ICStub::Monitored, stubCode),
     firstMonitorStub_(firstMonitorStub)
 {
     // In order to silence Coverity - null pointer dereference checker
     MOZ_ASSERT(firstMonitorStub_);
     // If the first monitored stub is a ICTypeMonitor_Fallback stub, then
     // double check that _its_ firstMonitorStub is the same as this one.
@@ -2526,87 +2542,116 @@ ICTypeMonitor_AnyValue::Compiler::genera
     EmitReturnFromIC(masm);
     return true;
 }
 
 bool
 ICUpdatedStub::addUpdateStubForValue(JSContext* cx, HandleScript outerScript, HandleObject obj,
                                      HandleId id, HandleValue val)
 {
-    if (numOptimizedStubs_ >= MAX_OPTIMIZED_STUBS) {
-        // TODO: if the TypeSet becomes unknown or has the AnyObject type,
-        // replace stubs with a single stub to handle these.
-        return true;
-    }
-
     EnsureTrackPropertyTypes(cx, obj, id);
 
     // Make sure that undefined values are explicitly included in the property
     // types for an object if generating a stub to write an undefined value.
     if (val.isUndefined() && CanHaveEmptyPropertyTypesForOwnProperty(obj))
         AddTypePropertyId(cx, obj, id, val);
 
-    if (val.isPrimitive()) {
+    HeapTypeSet* types = nullptr;
+    if (!obj->group()->unknownProperties()) {
+        types = obj->group()->maybeGetProperty(id);
+        MOZ_ASSERT(types);
+    }
+
+    // Don't attach too many SingleObject/ObjectGroup stubs unless we can
+    // replace them with a single PrimitiveSet or AnyValue stub.
+    if (numOptimizedStubs_ >= MAX_OPTIMIZED_STUBS &&
+        val.isObject() &&
+        (types && !types->unknownObject()))
+    {
+        return true;
+    }
+
+    if (!types || types->unknown()) {
+        // Attach a stub that always succeeds. We should not have a
+        // TypeUpdate_AnyValue stub yet.
+        MOZ_ASSERT(!hasTypeUpdateStub(TypeUpdate_AnyValue));
+
+        // Discard existing stubs.
+        resetUpdateStubChain(cx->zone());
+
+        ICTypeUpdate_AnyValue::Compiler compiler(cx);
+        ICStub* stub = compiler.getStub(compiler.getStubSpace(outerScript));
+        if (!stub)
+            return false;
+
+        JitSpew(JitSpew_BaselineIC, "  Added TypeUpdate stub %p for any value", stub);
+        addOptimizedUpdateStub(stub);
+
+    } else if (val.isPrimitive() || types->unknownObject()) {
         JSValueType type = val.isDouble() ? JSVAL_TYPE_DOUBLE : val.extractNonDoubleType();
 
         // Check for existing TypeUpdate stub.
         ICTypeUpdate_PrimitiveSet* existingStub = nullptr;
         for (ICStubConstIterator iter(firstUpdateStub_); !iter.atEnd(); iter++) {
             if (iter->isTypeUpdate_PrimitiveSet()) {
                 existingStub = iter->toTypeUpdate_PrimitiveSet();
-                if (existingStub->containsType(type))
-                    return true;
+                MOZ_ASSERT(!existingStub->containsType(type));
             }
         }
 
+        if (val.isObject()) {
+            // Discard existing ObjectGroup/SingleObject stubs.
+            resetUpdateStubChain(cx->zone());
+            if (existingStub)
+                addOptimizedUpdateStub(existingStub);
+        }
+
         ICTypeUpdate_PrimitiveSet::Compiler compiler(cx, existingStub, type);
         ICStub* stub = existingStub ? compiler.updateStub()
                                     : compiler.getStub(compiler.getStubSpace(outerScript));
         if (!stub)
             return false;
         if (!existingStub) {
             MOZ_ASSERT(!hasTypeUpdateStub(TypeUpdate_PrimitiveSet));
             addOptimizedUpdateStub(stub);
         }
 
         JitSpew(JitSpew_BaselineIC, "  %s TypeUpdate stub %p for primitive type %d",
                 existingStub ? "Modified existing" : "Created new", stub, type);
 
     } else if (val.toObject().isSingleton()) {
         RootedObject obj(cx, &val.toObject());
 
-        // Check for existing TypeUpdate stub.
+#ifdef DEBUG
+        // We should not have a stub for this object.
         for (ICStubConstIterator iter(firstUpdateStub_); !iter.atEnd(); iter++) {
-            if (iter->isTypeUpdate_SingleObject() &&
-                iter->toTypeUpdate_SingleObject()->object() == obj)
-            {
-                return true;
-            }
+            MOZ_ASSERT_IF(iter->isTypeUpdate_SingleObject(),
+                          iter->toTypeUpdate_SingleObject()->object() != obj);
         }
+#endif
 
         ICTypeUpdate_SingleObject::Compiler compiler(cx, obj);
         ICStub* stub = compiler.getStub(compiler.getStubSpace(outerScript));
         if (!stub)
             return false;
 
         JitSpew(JitSpew_BaselineIC, "  Added TypeUpdate stub %p for singleton %p", stub, obj.get());
 
         addOptimizedUpdateStub(stub);
 
     } else {
         RootedObjectGroup group(cx, val.toObject().group());
 
-        // Check for existing TypeUpdate stub.
+#ifdef DEBUG
+        // We should not have a stub for this group.
         for (ICStubConstIterator iter(firstUpdateStub_); !iter.atEnd(); iter++) {
-            if (iter->isTypeUpdate_ObjectGroup() &&
-                iter->toTypeUpdate_ObjectGroup()->group() == group)
-            {
-                return true;
-            }
+            MOZ_ASSERT_IF(iter->isTypeUpdate_ObjectGroup(),
+                          iter->toTypeUpdate_ObjectGroup()->group() != group);
         }
+#endif
 
         ICTypeUpdate_ObjectGroup::Compiler compiler(cx, group);
         ICStub* stub = compiler.getStub(compiler.getStubSpace(outerScript));
         if (!stub)
             return false;
 
         JitSpew(JitSpew_BaselineIC, "  Added TypeUpdate stub %p for ObjectGroup %p",
                 stub, group.get());
--- a/js/src/jit/SharedIC.h
+++ b/js/src/jit/SharedIC.h
@@ -957,16 +957,18 @@ class ICUpdatedStub : public ICStub
 
         numOptimizedStubs_++;
     }
 
     inline ICStub* firstUpdateStub() const {
         return firstUpdateStub_;
     }
 
+    void resetUpdateStubChain(Zone* zone);
+
     bool hasTypeUpdateStub(ICStub::Kind kind) {
         ICStub* stub = firstUpdateStub_;
         do {
             if (stub->kind() == kind)
                 return true;
 
             stub = stub->next();
         } while (stub);
--- a/js/src/jit/mips-shared/Assembler-mips-shared.cpp
+++ b/js/src/jit/mips-shared/Assembler-mips-shared.cpp
@@ -1615,16 +1615,18 @@ AssemblerMIPSShared::as_break(uint32_t c
     MOZ_ASSERT(code <= MAX_BREAK_CODE);
     writeInst(op_special | code << FunctionBits | ff_break);
 }
 
 void
 AssemblerMIPSShared::as_sync(uint32_t stype)
 {
     MOZ_ASSERT(stype <= 31);
+    if (isLoongson())
+        stype = 0;
     writeInst(InstReg(op_special, zero, zero, zero, stype, ff_sync).encode());
 }
 
 // This just stomps over memory with 32 bits of raw data. Its purpose is to
 // overwrite the call of JITed code with 32 bits worth of an offset. This will
 // is only meant to function on code that has been invalidated, so it should
 // be totally safe. Since that instruction will never be executed again, a
 // ICache flush should not be necessary
--- a/js/src/jsapi-tests/testGCHeapPostBarriers.cpp
+++ b/js/src/jsapi-tests/testGCHeapPostBarriers.cpp
@@ -178,16 +178,20 @@ TestHeapPostBarrierInitFailure()
 
     return true;
 }
 
 END_TEST(testGCHeapPostBarriers)
 
 BEGIN_TEST(testUnbarrieredEquality)
 {
+#ifdef JS_GC_ZEAL
+    AutoLeaveZeal nozeal(cx);
+#endif /* JS_GC_ZEAL */
+
     // Use ArrayBuffers because they have finalizers, which allows using them
     // in ObjectPtr without awkward conversations about nursery allocatability.
     JS::RootedObject robj(cx, JS_NewArrayBuffer(cx, 20));
     JS::RootedObject robj2(cx, JS_NewArrayBuffer(cx, 30));
     cx->runtime()->gc.evictNursery(); // Need tenured objects
 
     // Need some bare pointers to compare against.
     JSObject* obj = robj;
--- a/js/xpconnect/tests/unit/test_nuke_webextension_wrappers.js
+++ b/js/xpconnect/tests/unit/test_nuke_webextension_wrappers.js
@@ -1,21 +1,16 @@
 // See https://bugzilla.mozilla.org/show_bug.cgi?id=1273251
 
 const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 Cu.import("resource://gre/modules/Timer.jsm");
-
-function promiseEvent(target, event) {
-  return new Promise(resolve => {
-    target.addEventListener(event, resolve, {capture: true, once: true});
-  });
-}
+Cu.import("resource://testing-common/TestUtils.jsm");
 
 let aps = Cc["@mozilla.org/addons/policy-service;1"].getService(Ci.nsIAddonPolicyService).wrappedJSObject;
 
 let oldAddonIdCallback = aps.setExtensionURIToAddonIdCallback(uri => uri.host);
 do_register_cleanup(() => {
   aps.setExtensionURIToAddonIdCallback(oldAddonIdCallback);
 });
 
@@ -58,18 +53,18 @@ add_task(function*() {
     }
   }));
 
   // Check that the object can be accessed normally before windowB is closed.
   equal(getThing(), "bar");
 
   webnavB.close();
 
-  // Wrappers are nuked asynchronously, so wait a tick.
-  yield new Promise(resolve => setTimeout(resolve, 0));
+  // Wrappers are destroyed asynchronously, so wait for that to happen.
+  yield TestUtils.topicObserved("inner-window-destroyed");
 
   // Check that it can't be accessed after he window has been closed.
   let result = getThing();
   ok(/dead object/.test(result),
      `Result should show a dead wrapper error: ${result}`);
 
   webnavA.close();
 });
--- a/layout/painting/FrameLayerBuilder.cpp
+++ b/layout/painting/FrameLayerBuilder.cpp
@@ -3915,26 +3915,28 @@ ContainerState::SetupMaskLayerForCSSMask
     NS_WARNING("Could not create DrawTarget for mask layer.");
     return;
   }
 
   RefPtr<gfxContext> maskCtx = gfxContext::CreateOrNull(dt);
   maskCtx->SetMatrix(gfxMatrix::Translation(-itemRect.TopLeft()));
   maskCtx->Multiply(gfxMatrix::Scaling(mParameters.mXScale, mParameters.mYScale));
 
-  aMaskItem->PaintMask(mBuilder, maskCtx);
+  bool isPaintFinished = aMaskItem->PaintMask(mBuilder, maskCtx);
 
   RefPtr<ImageContainer> imgContainer =
     imageData.CreateImageAndImageContainer();
   if (!imgContainer) {
     return;
   }
   maskLayer->SetContainer(imgContainer);
 
-  *oldUserData = Move(newUserData);
+  if (isPaintFinished) {
+    *oldUserData = Move(newUserData);
+  }
   aLayer->SetMaskLayer(maskLayer);
 }
 
 /*
  * Iterate through the non-clip items in aList and its descendants.
  * For each item we compute the effective clip rect. Each item is assigned
  * to a layer. We invalidate the areas in PaintedLayers where an item
  * has moved from one PaintedLayer to another. Also,
--- a/layout/painting/nsCSSRendering.cpp
+++ b/layout/painting/nsCSSRendering.cpp
@@ -1964,33 +1964,42 @@ nsCSSRendering::CanBuildWebRenderDisplay
     nsITheme *theme = aPresCtx.GetTheme();
     if (theme && theme->ThemeSupportsWidget(&aPresCtx,
                                             aFrame,
                                             displayData->mAppearance)) {
       return false;
     }
   }
 
+  // We only support painting gradients and image for a single style image layer
   const nsStyleImage* styleImage = &aBackgroundStyle->mImage.mLayers[aLayer].mImage;
-
-  // We only support image with image container.
-  if (!styleImage->IsEmpty() && styleImage->GetType() == eStyleImageType_Image) {
+  if (styleImage->GetType() == eStyleImageType_Image) {
+    if (styleImage->GetCropRect()) {
+      return false;
+    }
+
     imgRequestProxy* requestProxy = styleImage->GetImageData();
-    if (requestProxy) {
-      nsCOMPtr<imgIContainer> srcImage;
-      requestProxy->GetImage(getter_AddRefs(srcImage));
-      if (srcImage && !srcImage->IsImageContainerAvailable(aManager, imgIContainer::FLAG_NONE)) {
-        return false;
-      }
+    if (!requestProxy) {
+      return false;
+    }
+
+    nsCOMPtr<imgIContainer> srcImage;
+    requestProxy->GetImage(getter_AddRefs(srcImage));
+    if (!srcImage || !srcImage->IsImageContainerAvailable(aManager, imgIContainer::FLAG_NONE)) {
+      return false;
     }
+
+    return true;
   }
 
-  // We only support painting gradients and image for a single style image layer
-  return styleImage->GetType() == eStyleImageType_Gradient ||
-         styleImage->GetType() == eStyleImageType_Image;
+  if (styleImage->GetType() == eStyleImageType_Gradient) {
+    return true;
+  }
+
+  return false;
 }
 
 DrawResult
 nsCSSRendering::BuildWebRenderDisplayItemsForStyleImageLayer(const PaintBGParams& aParams,
                                                              mozilla::wr::DisplayListBuilder& aBuilder,
                                                              const mozilla::layers::StackingContextHelper& aSc,
                                                              nsTArray<WebRenderParentCommand>& aParentCommands,
                                                              mozilla::layers::WebRenderDisplayItemLayer* aLayer)
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -3983,18 +3983,18 @@ nsDisplayImageContainer::ConfigureLayer(
   // asynchronously, this is not enough. Bug 1183378 will provide a more
   // complete fix, but this solution is safe in more cases than simply relying
   // on the intrinsic size.
   IntSize containerSize = aLayer->GetContainer()
                         ? aLayer->GetContainer()->GetCurrentSize()
                         : IntSize(imageWidth, imageHeight);
 
   const int32_t factor = mFrame->PresContext()->AppUnitsPerDevPixel();
-  const LayoutDeviceRect destRect =
-    LayoutDeviceRect::FromAppUnits(GetDestRect(), factor);
+  const LayoutDeviceRect destRect(
+    LayoutDeviceIntRect::FromAppUnitsToNearest(GetDestRect(), factor));
 
   const LayoutDevicePoint p = destRect.TopLeft();
   Matrix transform = Matrix::Translation(p.x, p.y);
   transform.PreScale(destRect.width / containerSize.width,
                      destRect.height / containerSize.height);
   aLayer->SetBaseTransform(gfx::Matrix4x4::From2D(transform));
 }
 
@@ -4040,18 +4040,18 @@ nsDisplayImageContainer::CanOptimizeToIm
   image->GetHeight(&imageHeight);
 
   if (imageWidth == 0 || imageHeight == 0) {
     NS_ASSERTION(false, "invalid image size");
     return false;
   }
 
   const int32_t factor = mFrame->PresContext()->AppUnitsPerDevPixel();
-  const LayoutDeviceRect destRect =
-    LayoutDeviceRect::FromAppUnits(GetDestRect(), factor);
+  const LayoutDeviceRect destRect(
+    LayoutDeviceIntRect::FromAppUnitsToNearest(GetDestRect(), factor));
 
   // Calculate the scaling factor for the frame.
   const gfxSize scale = gfxSize(destRect.width / imageWidth,
                                 destRect.height / imageHeight);
 
   if (scale.width < 0.34 || scale.height < 0.34) {
     // This would look awful as long as we can't use high-quality downscaling
     // for image layers (bug 803703), so don't turn this into an image layer.
@@ -8385,17 +8385,17 @@ nsDisplayMask::BuildLayer(nsDisplayListB
 
   RefPtr<ContainerLayer> container = aManager->GetLayerBuilder()->
     BuildContainerLayerFor(aBuilder, aManager, mFrame, this, &mList,
                            aContainerParameters, nullptr);
 
   return container.forget();
 }
 
-void
+bool
 nsDisplayMask::PaintMask(nsDisplayListBuilder* aBuilder,
                          gfxContext* aMaskContext)
 {
   MOZ_ASSERT(aMaskContext->GetDrawTarget()->GetFormat() == SurfaceFormat::A8);
 
   imgDrawingParams imgParmas(aBuilder->ShouldSyncDecodeImages()
                              ? imgIContainer::FLAG_SYNC_DECODE
                              : imgIContainer::FLAG_SYNC_DECODE_IF_FAST);
@@ -8404,16 +8404,18 @@ nsDisplayMask::PaintMask(nsDisplayListBu
                                                   mFrame,  mVisibleRect,
                                                   borderArea, aBuilder,
                                                   nullptr,
                                                   mHandleOpacity, imgParmas);
   ComputeMaskGeometry(params);
   nsSVGIntegrationUtils::PaintMask(params);
 
   nsDisplayMaskGeometry::UpdateDrawResult(this, imgParmas.result);
+
+  return imgParmas.result == mozilla::image::DrawResult::SUCCESS;
 }
 
 LayerState
 nsDisplayMask::GetLayerState(nsDisplayListBuilder* aBuilder,
                              LayerManager* aManager,
                              const ContainerLayerParameters& aParameters)
 {
   if (ShouldPaintOnMaskLayer(aManager)) {
--- a/layout/painting/nsDisplayList.h
+++ b/layout/painting/nsDisplayList.h
@@ -4430,19 +4430,20 @@ public:
   void PrintEffects(nsACString& aTo);
 #endif
 
   void PaintAsLayer(nsDisplayListBuilder* aBuilder,
                     nsRenderingContext* aCtx,
                     LayerManager* aManager);
 
   /*
-   * Paint mask onto aMaskContext in mFrame's coordinate space.
+   * Paint mask onto aMaskContext in mFrame's coordinate space and
+   * return whether the mask layer was painted successfully.
    */
-  void PaintMask(nsDisplayListBuilder* aBuilder, gfxContext* aMaskContext);
+  bool PaintMask(nsDisplayListBuilder* aBuilder, gfxContext* aMaskContext);
 
   const nsTArray<nsRect>& GetDestRects()
   {
     return mDestRects;
   }
 private:
   // According to mask property and the capability of aManager, determine
   // whether paint mask onto a dedicate mask layer.
--- a/layout/style/CSSStyleSheet.cpp
+++ b/layout/style/CSSStyleSheet.cpp
@@ -356,16 +356,25 @@ CSSStyleSheet::CSSStyleSheet(const CSSSt
                              nsIDocument* aDocumentToUse,
                              nsINode* aOwningNodeToUse)
   : StyleSheet(aCopy, aOwnerRuleToUse, aDocumentToUse, aOwningNodeToUse),
     mInRuleProcessorCache(false),
     mScopeElement(nullptr),
     mRuleProcessors(nullptr)
 {
   mParent = aParentToUse;
+
+  if (mDirty) { // CSSOM's been there, force full copy now
+    NS_ASSERTION(mInner->mComplete, "Why have rules been accessed on an incomplete sheet?");
+    // FIXME: handle failure?
+    //
+    // NOTE: It's important to call this from the subclass, since it could
+    // access uninitialized members otherwise.
+    EnsureUniqueInner();
+  }
 }
 
 CSSStyleSheet::~CSSStyleSheet()
 {
   UnparentChildren();
 
   DropRuleCollection();
   // XXX The document reference is not reference counted and should
--- a/layout/style/ServoStyleSheet.cpp
+++ b/layout/style/ServoStyleSheet.cpp
@@ -82,16 +82,25 @@ ServoStyleSheet::ServoStyleSheet(css::Sh
 ServoStyleSheet::ServoStyleSheet(const ServoStyleSheet& aCopy,
                                  ServoStyleSheet* aParentToUse,
                                  dom::CSSImportRule* aOwnerRuleToUse,
                                  nsIDocument* aDocumentToUse,
                                  nsINode* aOwningNodeToUse)
   : StyleSheet(aCopy, aOwnerRuleToUse, aDocumentToUse, aOwningNodeToUse)
 {
   mParent = aParentToUse;
+
+  if (mDirty) { // CSSOM's been there, force full copy now
+    NS_ASSERTION(mInner->mComplete, "Why have rules been accessed on an incomplete sheet?");
+    // FIXME: handle failure?
+    //
+    // NOTE: It's important to call this from the subclass, since this could
+    // access uninitialized members otherwise.
+    EnsureUniqueInner();
+  }
 }
 
 ServoStyleSheet::~ServoStyleSheet()
 {
   UnparentChildren();
 
   DropRuleList();
 }
--- a/layout/style/StyleSheet.cpp
+++ b/layout/style/StyleSheet.cpp
@@ -49,22 +49,16 @@ StyleSheet::StyleSheet(const StyleSheet&
     // responsibility to notify us if we end up being owned by a document.
   , mDocumentAssociationMode(NotOwnedByDocument)
   , mInner(aCopy.mInner) // Shallow copy, but concrete subclasses will fix up.
   , mDirty(aCopy.mDirty)
 {
   MOZ_ASSERT(mInner, "Should only copy StyleSheets with an mInner.");
   mInner->AddSheet(this);
 
-  if (mDirty) { // CSSOM's been there, force full copy now
-    NS_ASSERTION(mInner->mComplete, "Why have rules been accessed on an incomplete sheet?");
-    // FIXME: handle failure?
-    EnsureUniqueInner();
-  }
-
   if (aCopy.mMedia) {
     // XXX This is wrong; we should be keeping @import rules and
     // sheets in sync!
     mMedia = aCopy.mMedia->Clone();
   }
 }
 
 StyleSheet::~StyleSheet()
--- a/media/libcubeb/README_MOZILLA
+++ b/media/libcubeb/README_MOZILLA
@@ -1,8 +1,8 @@
 The source from this directory was copied from the cubeb 
 git repository using the update.sh script.  The only changes
 made were those applied by update.sh and the addition of
 Makefile.in build files for the Mozilla build system.
 
 The cubeb git repository is: git://github.com/kinetiknz/cubeb.git
 
-The git commit ID used was 087dc942a9a3bb5cbb88e3763cde7fe709db99e9 (2017-05-29 15:51:19 +1200)
+The git commit ID used was 3428c2b08d2668a026469f2e71a6f6aa95614aeb (2017-05-31 16:26:45 +1200)
--- a/media/libcubeb/src/cubeb_audiounit.cpp
+++ b/media/libcubeb/src/cubeb_audiounit.cpp
@@ -109,16 +109,17 @@ to_string(io_side side)
 
 struct cubeb_stream {
   explicit cubeb_stream(cubeb * context);
 
   cubeb * context;
   cubeb_data_callback data_callback = nullptr;
   cubeb_state_callback state_callback = nullptr;
   cubeb_device_changed_callback device_changed_callback = nullptr;
+  owned_critical_section device_changed_callback_lock;
   /* Stream creation parameters */
   cubeb_stream_params input_stream_params = { CUBEB_SAMPLE_FLOAT32NE, 0, 0, CUBEB_LAYOUT_UNDEFINED };
   cubeb_stream_params output_stream_params = { CUBEB_SAMPLE_FLOAT32NE, 0, 0, CUBEB_LAYOUT_UNDEFINED };
   bool is_default_input;
   AudioDeviceID input_device = 0;
   AudioDeviceID output_device = 0;
   /* User pointer of data_callback */
   void * user_ptr = nullptr;
@@ -699,17 +700,17 @@ audiounit_property_listener_callback(Aud
 
   for (UInt32 i = 0; i < address_count; i++) {
     switch(addresses[i].mSelector) {
     case kAudioHardwarePropertyDefaultOutputDevice:
     case kAudioHardwarePropertyDefaultInputDevice:
     case kAudioDevicePropertyDeviceIsAlive:
       /* fall through */
     case kAudioDevicePropertyDataSource: {
-        auto_lock lock(stm->mutex);
+        auto_lock dev_cb_lock(stm->device_changed_callback_lock);
         if (stm->device_changed_callback) {
           stm->device_changed_callback(stm->user_ptr);
         }
         break;
       }
     }
   }
 
@@ -2635,18 +2636,17 @@ audiounit_stream_stop(cubeb_stream * stm
 
   LOG("Cubeb stream (%p) stopped successfully.", stm);
   return CUBEB_OK;
 }
 
 static int
 audiounit_stream_get_position(cubeb_stream * stm, uint64_t * position)
 {
-  auto_lock lock(stm->mutex);
-
+  assert(stm);
   *position = stm->frames_played;
   return CUBEB_OK;
 }
 
 int
 audiounit_stream_get_latency(cubeb_stream * stm, uint32_t * latency)
 {
 #if TARGET_OS_IPHONE
@@ -2866,24 +2866,21 @@ int audiounit_stream_device_destroy(cube
   delete [] device->input_name;
   delete device;
   return CUBEB_OK;
 }
 
 int audiounit_stream_register_device_changed_callback(cubeb_stream * stream,
                                                       cubeb_device_changed_callback device_changed_callback)
 {
+  auto_lock dev_cb_lock(stream->device_changed_callback_lock);
   /* Note: second register without unregister first causes 'nope' error.
    * Current implementation requires unregister before register a new cb. */
   assert(!stream->device_changed_callback);
-
-  auto_lock lock(stream->mutex);
-
   stream->device_changed_callback = device_changed_callback;
-
   return CUBEB_OK;
 }
 
 static OSStatus
 audiounit_get_devices(std::vector<AudioObjectID> & devices)
 {
   OSStatus ret;
   UInt32 size = 0;
--- a/media/libyuv/moz.build
+++ b/media/libyuv/moz.build
@@ -4,26 +4,35 @@
 # 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/.
 
 with Files("**"):
     BUG_COMPONENT = ("Core", "Graphics")
 
 include('/build/gyp.mozbuild')
 
+# Set gyp vars that libyuv needs when building under various analysis tools.
+gyp_vars_copy = gyp_vars.copy()
+if CONFIG['MOZ_VALGRIND']:
+    gyp_vars_copy.update(build_for_tool="memcheck")
+elif CONFIG['MOZ_ASAN']:
+    gyp_vars_copy.update(build_for_tool="asan")
+elif CONFIG['MOZ_TSAN']:
+    gyp_vars_copy.update(build_for_tool="tsan")
+
 libyuv_non_unified_sources = [
     'libyuv/source/convert.cc',
     'libyuv/source/convert_from.cc',
     'libyuv/source/mjpeg_decoder.cc',
     'libyuv/source/rotate_argb.cc',
     'libyuv/source/row_common.cc',
     'libyuv/source/scale.cc',
     'libyuv/source/scale_common.cc',
 ]
 
 GYP_DIRS += ['libyuv']
 GYP_DIRS['libyuv'].input = 'libyuv/libyuv.gyp'
-GYP_DIRS['libyuv'].variables = gyp_vars
+GYP_DIRS['libyuv'].variables = gyp_vars_copy
 GYP_DIRS['libyuv'].sandbox_vars['FINAL_LIBRARY'] = 'xul'
 GYP_DIRS['libyuv'].non_unified_sources += libyuv_non_unified_sources
 
 # We allow warnings for third-party code that can be updated from upstream.
 GYP_DIRS['libyuv'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
--- a/media/mtransport/third_party/moz.build
+++ b/media/mtransport/third_party/moz.build
@@ -6,16 +6,26 @@
 
 include('/build/gyp.mozbuild')
 
 GYP_DIRS += [
     'nICEr',
     'nrappkit',
 ]
 
+# Set gyp vars that webrtc needs when building under various analysis tools.
+# Primarily this prevents webrtc from setting NVALGRIND and breaking builds.
+gyp_vars_copy = gyp_vars.copy()
+if CONFIG['MOZ_VALGRIND']:
+    gyp_vars_copy.update(build_for_tool="memcheck")
+elif CONFIG['MOZ_ASAN']:
+    gyp_vars_copy.update(build_for_tool="asan")
+elif CONFIG['MOZ_TSAN']:
+    gyp_vars_copy.update(build_for_tool="tsan")
+
 # These files cannot be built in unified mode because of name clashes on RCSSTRING
 nICEr_non_unified_sources = [
     'nICEr/src/crypto/nr_crypto.c',
     'nICEr/src/ice/ice_candidate.c',
     'nICEr/src/ice/ice_candidate_pair.c',
     'nICEr/src/ice/ice_component.c',
     'nICEr/src/ice/ice_ctx.c',
     'nICEr/src/ice/ice_media_stream.c',
@@ -57,20 +67,20 @@ nrappkit_non_unified_sources = [
     'nrappkit/src/util/libekr/r_memory.c',
     'nrappkit/src/util/libekr/r_replace.c',
     'nrappkit/src/util/libekr/r_time.c',
     'nrappkit/src/util/p_buf.c',
     'nrappkit/src/util/util.c',
 ]
 
 GYP_DIRS['nICEr'].input = 'nICEr/nicer.gyp'
-GYP_DIRS['nICEr'].variables = gyp_vars
+GYP_DIRS['nICEr'].variables = gyp_vars_copy
 # We allow warnings for third-party code that can be updated from upstream.
 GYP_DIRS['nICEr'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
 GYP_DIRS['nICEr'].sandbox_vars['FINAL_LIBRARY'] = 'xul'
 GYP_DIRS['nICEr'].non_unified_sources += nICEr_non_unified_sources
 
 GYP_DIRS['nrappkit'].input = 'nrappkit/nrappkit.gyp'
-GYP_DIRS['nrappkit'].variables = gyp_vars
+GYP_DIRS['nrappkit'].variables = gyp_vars_copy
 # We allow warnings for third-party code that can be updated from upstream.
 GYP_DIRS['nrappkit'].sandbox_vars['ALLOW_COMPILER_WARNINGS'] = True
 GYP_DIRS['nrappkit'].sandbox_vars['FINAL_LIBRARY'] = 'xul'
 GYP_DIRS['nrappkit'].non_unified_sources += nrappkit_non_unified_sources
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2914,21 +2914,17 @@ pref("layout.css.control-characters.visi
 #else
 pref("layout.css.control-characters.visible", true);
 #endif
 
 // Is support for column-span enabled?
 pref("layout.css.column-span.enabled", false);
 
 // Is effect of xml:base disabled for style attribute?
-#ifdef RELEASE_OR_BETA
-pref("layout.css.style-attr-with-xml-base.disabled", false);
-#else
 pref("layout.css.style-attr-with-xml-base.disabled", true);
-#endif
 
 // pref for which side vertical scrollbars should be on
 // 0 = end-side in UI direction
 // 1 = end-side in document/content direction
 // 2 = right
 // 3 = left
 pref("layout.scrollbar.side", 0);
 
index 3447c9324caa0380e82f46bd12981cddc4cee013..3b3fdba380d79279a0a5b63fbfbdb10d194c86c2
GIT binary patch
literal 238592
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
S(gsKMG+3;+@m&5_$G-vK&l)5E
--- a/testing/awsy/awsy/test_memory_usage.py
+++ b/testing/awsy/awsy/test_memory_usage.py
@@ -167,19 +167,23 @@ class TestMemoryUsage(MarionetteTestCase
         Returns the checkpoint or None on error.
 
         :param checkpointName: The name of the checkpoint.
         """
         self.logger.info("starting checkpoint %s..." % checkpointName)
 
         checkpoint_file = "memory-report-%s-%d.json.gz" % (checkpointName, iteration)
         checkpoint_path = os.path.join(self._resultsDir, checkpoint_file)
-        # Escape the Windows directory separator \ to prevent it from
-        # being interpreted as an escape character.
-        checkpoint_path = checkpoint_path.replace('\\', '\\\\')
+        # On Windows, replace / with the Windows directory
+        # separator \ and escape it to prevent it from being
+        # interpreted as an escape character.
+        if sys.platform.startswith('win'):
+            checkpoint_path = (checkpoint_path.
+                               replace('\\', '\\\\').
+                               replace('/', '\\\\'))
 
         checkpoint_script = r"""
             const Cc = Components.classes;
             const Ci = Components.interfaces;
 
             let dumper = Cc["@mozilla.org/memory-info-dumper;1"].getService(Ci.nsIMemoryInfoDumper);
             dumper.dumpMemoryReportsToNamedFile(
                 "%s",
--- a/testing/web-platform/README.md
+++ b/testing/web-platform/README.md
@@ -230,50 +230,19 @@ In order to update the manifest it is re
 web-platform-tests --manifest-update`. This rescans the test directory
 looking for new, removed, or altered tests.
 
 Running Tests In Other Browsers
 -------------------------------
 
 web-platform-tests is cross browser, and the runner is compatible with
 multiple browsers. Therefore it's possible to check the behaviour of
-tests in other browsers. This is somewhat more involved than running
-them in Firefox since extra dependencies may be required. For example
-to test in Chrome:
-
-1. Download the chromedriver binary and place it somewhere sensible
-   e.g. `~/bin`
+tests in other browsers. By default Chrome, Edge and Servo are
+supported. In order to run the tests in these browsers use the
+`--product` argument to wptrunner:
 
-2. In your gecko source tree activate the virtualenv created by mach,
-   since this has most dependencies already installed. This is typically
-   in objdir/_virtualenv and is activated via e.g.
-
-        source objdir/_virtualenv/bin/activate
-
-3. Install the extra requirements:
-
-        cd testing/web-platform/harness
-        pip install -r requirements_chrome.txt
-
-4. Edit the config file `testing/web-platform/wptrunner.ini` so that
-   Chrome support is enabled by changing the section that reads:
+    mach wpt --product chrome dom/historical.html
 
-        [products]
-        firefox =
-
-   to read
-
-        [products]
-        firefox =
-        chrome =
-
-   (alternatively create a new config file elsewhere and use the
-   `--config` option to `runtests.py` to point wptrunner at this config
-   file).
-
-5. Run `runtests.py` using the location of chromedriver as
-   the binary:
-
-        cd testing/web-platform
-        python runtests.py --product=chrome --binary=~/bin/chromedriver --log-mach=-
-
-By default this will use the same test checkout and metadata as are in
-the Gecko tree, so it's easy to compare behaviour relative to Firefox.
+By default these browsers run without expectation metadata, but it can
+be added in the `testing/web-platform/products/<product>`
+directory. To run with the same metadata as for Firefox (so that
+differences are reported as unexpected results), pass `--meta
+testing/web-platform/meta` to the mach command.
deleted file mode 100644
--- a/testing/web-platform/harness/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.py[co]
-*~
-*#
-\#*
-_virtualenv
-test/test.cfg
-test/metadata/MANIFEST.json
deleted file mode 100644
--- a/testing/web-platform/harness/.travis.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-language: python
-python: 2.7
-
-sudo: false
-
-cache:
-  directories:
-    - $HOME/.cache/pip
-
-env:
-  - TOXENV="{py27,pypy}-base"
-  - TOXENV="{py27,pypy}-chrome"
-  - TOXENV="{py27,pypy}-firefox"
-  - TOXENV="{py27,pypy}-servo"
-
-install:
-  - pip install -U tox
-
-script:
-  - tox
deleted file mode 100644
--- a/testing/web-platform/harness/MANIFEST.in
+++ /dev/null
@@ -1,17 +0,0 @@
-exclude MANIFEST.in
-include requirements.txt
-include wptrunner/browsers/b2g_setup/*
-include wptrunner.default.ini
-include wptrunner/testharness_runner.html
-include wptrunner/testharnessreport.js
-include wptrunner/testharnessreport-servo.js
-include wptrunner/testharnessreport-servodriver.js
-include wptrunner/executors/testharness_marionette.js
-include wptrunner/executors/testharness_servodriver.js
-include wptrunner/executors/testharness_webdriver.js
-include wptrunner/executors/reftest.js
-include wptrunner/executors/reftest-wait.js
-include wptrunner/executors/reftest-wait_servodriver.js
-include wptrunner/executors/reftest-wait_webdriver.js
-include wptrunner/config.json
-include wptrunner/browsers/server-locations.txt
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/README.rst
+++ /dev/null
@@ -1,242 +0,0 @@
-wptrunner: A web-platform-tests harness
-=======================================
-
-wptrunner is a harness for running the W3C `web-platform-tests testsuite`_.
-
-.. contents::
-
-Installation
-~~~~~~~~~~~~
-
-wptrunner is expected to be installed into a virtualenv using pip. For
-development, it can be installed using the `-e` option::
-
-  pip install -e ./
-
-Running the Tests
-~~~~~~~~~~~~~~~~~
-
-After installation, the command ``wptrunner`` should be available to run
-the tests.
-
-The ``wptrunner`` command  takes multiple options, of which the
-following are most significant:
-
-``--product`` (defaults to `firefox`)
-  The product to test against: `b2g`, `chrome`, `firefox`, or `servo`.
-
-``--binary`` (required if product is `firefox` or `servo`)
-  The path to a binary file for the product (browser) to test against.
-
-``--webdriver-binary`` (required if product is `chrome`)
-  The path to a `driver` binary; e.g., a `chromedriver` binary.
-
-``--certutil-binary`` (required if product is `firefox` [#]_)
-  The path to a `certutil` binary (for tests that must be run over https).
-
-``--metadata`` (required)
-  The path to a directory containing test metadata. [#]_
-
-``--tests`` (required)
-  The path to a directory containing a web-platform-tests checkout.
-
-``--prefs-root`` (required only when testing a Firefox binary)
-  The path to a directory containing Firefox test-harness preferences. [#]_
-
-``--config`` (should default to `wptrunner.default.ini`)
-  The path to the config (ini) file.
-
-.. [#] The ``--certutil-binary`` option is required when the product is
-   ``firefox`` unless ``--ssl-type=none`` is specified.
-
-.. [#] The ``--metadata`` path is to a directory that contains:
-
-  * a ``MANIFEST.json`` file (instructions on generating this file are
-    available in the `detailed documentation
-    <http://wptrunner.readthedocs.org/en/latest/usage.html#installing-wptrunner>`_);
-    and
-  * (optionally) any expectation files (see below)
-
-.. [#] Example ``--prefs-root`` value: ``~/mozilla-central/testing/profiles``.
-
-There are also a variety of other options available; use ``--help`` to
-list them.
-
--------------------------------
-Example: How to start wptrunner
--------------------------------
-
-To test a Firefox Nightly build in an OS X environment, you might start
-wptrunner using something similar to the following example::
-
-  wptrunner --metadata=~/web-platform-tests/ --tests=~/web-platform-tests/ \
-    --binary=~/mozilla-central/obj-x86_64-apple-darwin14.3.0/dist/Nightly.app/Contents/MacOS/firefox \
-    --certutil-binary=~/mozilla-central/obj-x86_64-apple-darwin14.3.0/security/nss/cmd/certutil/certutil \
-    --prefs-root=~/mozilla-central/testing/profiles
-
-And to test a Chromium build in an OS X environment, you might start
-wptrunner using something similar to the following example::
-
-  wptrunner --metadata=~/web-platform-tests/ --tests=~/web-platform-tests/ \
-    --binary=~/chromium/src/out/Release/Chromium.app/Contents/MacOS/Chromium \
-    --webdriver-binary=/usr/local/bin/chromedriver --product=chrome
-
--------------------------------------
-Example: How to run a subset of tests
--------------------------------------
-
-To restrict a test run just to tests in a particular web-platform-tests
-subdirectory, specify the directory name in the positional arguments after
-the options; for example, run just the tests in the `dom` subdirectory::
-
-  wptrunner --metadata=~/web-platform-tests/ --tests=~/web-platform-tests/ \
-    --binary=/path/to/firefox --certutil-binary=/path/to/certutil \
-    --prefs-root=/path/to/testing/profiles \
-    dom
-
-Output
-~~~~~~
-
-By default wptrunner just dumps its entire output as raw JSON messages
-to stdout. This is convenient for piping into other tools, but not ideal
-for humans reading the output.
-
-As an alternative, you can use the ``--log-mach`` option, which provides
-output in a reasonable format for humans. The option requires a value:
-either the path for a file to write the `mach`-formatted output to, or
-"`-`" (a hyphen) to write the `mach`-formatted output to stdout.
-
-When using ``--log-mach``, output of the full raw JSON log is still
-available, from the ``--log-raw`` option. So to output the full raw JSON
-log to a file and a human-readable summary to stdout, you might start
-wptrunner using something similar to the following example::
-
-  wptrunner --metadata=~/web-platform-tests/ --tests=~/web-platform-tests/ \
-    --binary=/path/to/firefox --certutil-binary=/path/to/certutil \
-    --prefs-root=/path/to/testing/profiles \
-    --log-raw=output.log --log-mach=-
-
-Expectation Data
-~~~~~~~~~~~~~~~~
-
-wptrunner is designed to be used in an environment where it is not
-just necessary to know which tests passed, but to compare the results
-between runs. For this reason it is possible to store the results of a
-previous run in a set of ini-like "expectation files". This format is
-documented below. To generate the expectation files use `wptrunner` with
-the `--log-raw=/path/to/log/file` option. This can then be used as
-input to the `wptupdate` tool.
-
-Expectation File Format
-~~~~~~~~~~~~~~~~~~~~~~~
-
-Metadata about tests, notably including their expected results, is
-stored in a modified ini-like format that is designed to be human
-editable, but also to be machine updatable.
-
-Each test file that requires metadata to be specified (because it has
-a non-default expectation or because it is disabled, for example) has
-a corresponding expectation file in the `metadata` directory. For
-example a test file `html/test1.html` containing a failing test would
-have an expectation file called `html/test1.html.ini` in the
-`metadata` directory.
-
-An example of an expectation file is::
-
-  example_default_key: example_value
-
-  [filename.html]
-    type: testharness
-
-    [subtest1]
-      expected: FAIL
-
-    [subtest2]
-      expected:
-        if platform == 'win': TIMEOUT
-        if platform == 'osx': ERROR
-        FAIL
-
-  [filename.html?query=something]
-    type: testharness
-    disabled: bug12345
-
-The file consists of two elements, key-value pairs and
-sections.
-
-Sections are delimited by headings enclosed in square brackets. Any
-closing square bracket in the heading itself my be escaped with a
-backslash. Each section may then contain any number of key-value pairs
-followed by any number of subsections. So that it is clear which data
-belongs to each section without the use of end-section markers, the
-data for each section (i.e. the key-value pairs and subsections) must
-be indented using spaces. Indentation need only be consistent, but
-using two spaces per level is recommended.
-
-In a test expectation file, each resource provided by the file has a
-single section, with the section heading being the part after the last
-`/` in the test url. Tests that have subsections may have subsections
-for those subtests in which the heading is the name of the subtest.
-
-Simple key-value pairs are of the form::
-
-  key: value
-
-Note that unlike ini files, only `:` is a valid seperator; `=` will
-not work as expected. Key-value pairs may also have conditional
-values of the form::
-
-  key:
-    if condition1: value1
-    if condition2: value2
-    default
-
-In this case each conditional is evaluated in turn and the value is
-that on the right hand side of the first matching conditional. In the
-case that no condition matches, the unconditional default is used. If
-no condition matches and no default is provided it is equivalent to
-the key not being present. Conditionals use a simple python-like expression
-language e.g.::
-
-  if debug and (platform == "linux" or platform == "osx"): FAIL
-
-For test expectations the avaliable variables are those in the
-`run_info` which for desktop are `version`, `os`, `bits`, `processor`,
-`debug` and `product`.
-
-Key-value pairs specified at the top level of the file before any
-sections are special as they provide defaults for the rest of the file
-e.g.::
-
-  key1: value1
-
-  [section 1]
-    key2: value2
-
-  [section 2]
-    key1: value3
-
-In this case, inside section 1, `key1` would have the value `value1`
-and `key2` the value `value2` whereas in section 2 `key1` would have
-the value `value3` and `key2` would be undefined.
-
-The web-platform-test harness knows about several keys:
-
-`expected`
-  Must evaluate to a possible test status indicating the expected
-  result of the test. The implicit default is PASS or OK when the
-  field isn't present.
-
-`disabled`
-  Any value indicates that the test is disabled.
-
-`type`
-  The test type e.g. `testharness`, `reftest`, or `wdspec`.
-
-`reftype`
-  The type of comparison for reftests; either `==` or `!=`.
-
-`refurl`
-  The reference url for reftests.
-
-.. _`web-platform-tests testsuite`: https://github.com/w3c/web-platform-tests
deleted file mode 100644
--- a/testing/web-platform/harness/docs/Makefile
+++ /dev/null
@@ -1,177 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS    =
-SPHINXBUILD   = sphinx-build
-PAPER         =
-BUILDDIR      = _build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4     = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
-
-help:
-	@echo "Please use \`make <target>' where <target> is one of"
-	@echo "  html       to make standalone HTML files"
-	@echo "  dirhtml    to make HTML files named index.html in directories"
-	@echo "  singlehtml to make a single large HTML file"
-	@echo "  pickle     to make pickle files"
-	@echo "  json       to make JSON files"
-	@echo "  htmlhelp   to make HTML files and a HTML help project"
-	@echo "  qthelp     to make HTML files and a qthelp project"
-	@echo "  devhelp    to make HTML files and a Devhelp project"
-	@echo "  epub       to make an epub"
-	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
-	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
-	@echo "  latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
-	@echo "  text       to make text files"
-	@echo "  man        to make manual pages"
-	@echo "  texinfo    to make Texinfo files"
-	@echo "  info       to make Texinfo files and run them through makeinfo"
-	@echo "  gettext    to make PO message catalogs"
-	@echo "  changes    to make an overview of all changed/added/deprecated items"
-	@echo "  xml        to make Docutils-native XML files"
-	@echo "  pseudoxml  to make pseudoxml-XML files for display purposes"
-	@echo "  linkcheck  to check all external links for integrity"
-	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"
-
-clean:
-	rm -rf $(BUILDDIR)/*
-
-html:
-	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
-	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
-	@echo
-	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
-	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
-	@echo
-	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
-	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
-	@echo
-	@echo "Build finished; now you can process the pickle files."
-
-json:
-	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
-	@echo
-	@echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
-	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
-	@echo
-	@echo "Build finished; now you can run HTML Help Workshop with the" \
-	      ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
-	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
-	@echo
-	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
-	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
-	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/wptrunner.qhcp"
-	@echo "To view the help file:"
-	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/wptrunner.qhc"
-
-devhelp:
-	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
-	@echo
-	@echo "Build finished."
-	@echo "To view the help file:"
-	@echo "# mkdir -p $$HOME/.local/share/devhelp/wptrunner"
-	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/wptrunner"
-	@echo "# devhelp"
-
-epub:
-	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
-	@echo
-	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo
-	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
-	@echo "Run \`make' in that directory to run these through (pdf)latex" \
-	      "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through pdflatex..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
-	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
-	@echo "Running LaTeX files through platex and dvipdfmx..."
-	$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
-	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
-	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
-	@echo
-	@echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
-	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
-	@echo
-	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo
-	@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
-	@echo "Run \`make' in that directory to run these through makeinfo" \
-	      "(use \`make info' here to do that automatically)."
-
-info:
-	$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
-	@echo "Running Texinfo files through makeinfo..."
-	make -C $(BUILDDIR)/texinfo info
-	@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
-	$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
-	@echo
-	@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
-	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
-	@echo
-	@echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
-	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
-	@echo
-	@echo "Link check complete; look for any errors in the above output " \
-	      "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
-	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
-	@echo "Testing of doctests in the sources finished, look at the " \
-	      "results in $(BUILDDIR)/doctest/output.txt."
-
-xml:
-	$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
-	@echo
-	@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
-	$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
-	@echo
-	@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
deleted file mode 100644
--- a/testing/web-platform/harness/docs/architecture.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="780px" height="1087px" version="1.1"><defs><linearGradient x1="0%" y1="0%" x2="0%" y2="100%" id="mx-gradient-a9c4eb-1-a9c4eb-1-s-0"><stop offset="0%" style="stop-color:#A9C4EB"/><stop offset="100%" style="stop-color:#A9C4EB"/></linearGradient></defs><g transform="translate(0.5,0.5)"><rect x="498" y="498" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(500,521)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestRunner</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="338" y="778" width="120" height="60" fill="#f19c99" stroke="#000000" pointer-events="none"/><g transform="translate(340,801)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">Product under test</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="338" y="388" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(340,411)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestRunnerManager</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="338" y="228" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(340,251)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">ManagerGroup</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="658" y="608" width="120" height="60" fill="#ffce9f" stroke="#000000" pointer-events="none"/><g transform="translate(660,631)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">Executor</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="338" y="498" width="120" height="60" fill="url(#mx-gradient-a9c4eb-1-a9c4eb-1-s-0)" stroke="#000000" pointer-events="none"/><g transform="translate(340,521)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">Browser</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 398 288 L 398 382" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 387 L 395 380 L 398 382 L 402 380 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 448 L 398 492" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 497 L 395 490 L 398 492 L 402 490 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 618 528 L 684 603" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 687 607 L 680 604 L 684 603 L 685 600 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="498" y="608" width="120" height="60" fill="#a9c4eb" stroke="#000000" pointer-events="none"/><g transform="translate(500,631)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">ExecutorBrowser</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 624 638 L 658 638" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 619 638 L 626 635 L 624 638 L 626 642 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 428 448 L 552 496" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 557 498 L 549 498 L 552 496 L 552 492 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 558 L 398 772" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 398 777 L 395 770 L 398 772 L 402 770 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="338" y="48" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(340,71)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">run_tests</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 458 78 L 652 78" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 657 78 L 650 82 L 652 78 L 650 75 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="658" y="48" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(660,71)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestLoader</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="71" y="48" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(73,71)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestEnvironment</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="151" y="618" width="120" height="60" fill="#b9e0a5" stroke="#000000" pointer-events="none"/><g transform="translate(153,641)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">wptserve</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="1" y="618" width="120" height="60" fill="#b9e0a5" stroke="#000000" pointer-events="none"/><g transform="translate(3,641)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">pywebsocket</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 338 78 L 197 78" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 192 78 L 199 75 L 197 78 L 199 82 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 101 308 L 62 612" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 61 617 L 59 610 L 62 612 L 66 610 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 161 308 L 204 612" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 204 617 L 200 610 L 204 612 L 207 609 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 338 823 L 61 678" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 211 678 L 338 793" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 398 108 L 398 222" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 227 L 395 220 L 398 222 L 402 220 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 706 288 L 618 513" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><rect x="658" y="388" width="70" height="40" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="693" y="412">Queue.get</text></g><path d="M 458 808 L 718 668" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><rect x="71" y="248" width="120" height="60" fill="#b9e0a5" stroke="#000000" pointer-events="none"/><g transform="translate(73,271)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">serve.py</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 131 108 L 131 242" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 131 247 L 128 240 L 131 242 L 135 240 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 88 973 L 132 973" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 137 973 L 130 977 L 132 973 L 130 970 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="138" y="1018" width="180" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="228" y="1037">Communication (cross process)</text></g><path d="M 88 1002 L 132 1002" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 137 1002 L 130 1006 L 132 1002 L 130 999 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="138" y="958" width="180" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="228" y="977">Ownership (same process)</text></g><path d="M 88 1033 L 138 1033" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><rect x="143" y="988" width="180" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="233" y="1007">Ownership (cross process)</text></g><rect x="428" y="966" width="50" height="15" fill="#e6d0de" stroke="#000000" pointer-events="none"/><rect x="428" y="990" width="50" height="15" fill="#a9c4eb" stroke="#000000" pointer-events="none"/><rect x="428" y="1015" width="50" height="15" fill="#ffce9f" stroke="#000000" pointer-events="none"/><rect x="428" y="1063" width="50" height="15" fill="#f19c99" stroke="#000000" pointer-events="none"/><rect x="428" y="1038" width="50" height="15" fill="#b9e0a5" stroke="#000000" pointer-events="none"/><rect x="485" y="958" width="90" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="530" y="977">wptrunner class</text></g><rect x="486" y="983" width="150" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="561" y="1002">Per-product wptrunner class</text></g><rect x="486" y="1008" width="150" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="561" y="1027">Per-protocol wptrunner class</text></g><rect x="491" y="1031" width="150" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="566" y="1050">Web-platform-tests component</text></g><rect x="486" y="1055" width="90" height="30" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="531" y="1074">Browser process</text></g><path d="M 398 8 L 398 42" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 398 47 L 395 40 L 398 42 L 402 40 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="478" y="388" width="120" height="60" fill-opacity="0.5" fill="#e6d0de" stroke="#000000" stroke-opacity="0.5" pointer-events="none"/><g transform="translate(480,411)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestRunnerManager</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 398 288 L 533 384" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 537 387 L 529 386 L 533 384 L 533 380 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="198" y="388" width="120" height="60" fill-opacity="0.5" fill="#e6d0de" stroke="#000000" stroke-opacity="0.5" pointer-events="none"/><g transform="translate(200,411)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">TestRunnerManager</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 398 288 L 263 384" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 259 387 L 263 380 L 263 384 L 267 386 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="575" y="748" width="110" height="40" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="630" y="758">Browser control</text><text x="630" y="772">protocol</text><text x="630" y="786">(e.g. WebDriver)</text></g><rect x="258" y="708" width="80" height="40" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="298" y="732">HTTP</text></g><rect x="111" y="728" width="80" height="40" fill="none" stroke="none" pointer-events="none"/><g fill="#000000" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="151" y="752">websockets</text></g><rect x="658" y="228" width="120" height="60" fill="#e6d0de" stroke="#000000" pointer-events="none"/><g transform="translate(660,251)"><switch><foreignObject pointer-events="all" width="116" height="15" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.26; vertical-align: top; width: 116px; white-space: normal; text-align: center;">Tests Queue</div></foreignObject><text x="58" y="14" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 718 108 L 718 222" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 718 227 L 715 220 L 718 222 L 722 220 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 428 970 L 428 970" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/></g></svg>
deleted file mode 100644
--- a/testing/web-platform/harness/docs/conf.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# wptrunner documentation build configuration file, created by
-# sphinx-quickstart on Mon May 19 18:14:20 2014.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.insert(0, os.path.abspath('.'))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-#needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
-    'sphinx.ext.autodoc',
-    'sphinx.ext.intersphinx',
-    'sphinx.ext.viewcode',
-]
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix of source filenames.
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'wptrunner'
-copyright = u''
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '0.3'
-# The full version, including alpha/beta/rc tags.
-release = '0.3'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-#default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages.  See the documentation for
-# a list of builtin themes.
-html_theme = 'default'
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further.  For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents.  If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar.  Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it.  The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'wptrunnerdoc'
-
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
-# The paper size ('letterpaper' or 'a4paper').
-#'papersize': 'letterpaper',
-
-# The font size ('10pt', '11pt' or '12pt').
-#'pointsize': '10pt',
-
-# Additional stuff for the LaTeX preamble.
-#'preamble': '',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-#  author, documentclass [howto, manual, or own class]).
-latex_documents = [
-  ('index', 'wptrunner.tex', u'wptrunner Documentation',
-   u'James Graham', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
-    ('index', 'wptrunner', u'wptrunner Documentation',
-     [u'James Graham'], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-#  dir menu entry, description, category)
-texinfo_documents = [
-  ('index', 'wptrunner', u'wptrunner Documentation',
-   u'James Graham', 'wptrunner', 'One line description of project.',
-   'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
-
-
-# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {'python': ('http://docs.python.org/', None),
-                       'mozlog': ('http://mozbase.readthedocs.org/en/latest/', None)}
deleted file mode 100644
--- a/testing/web-platform/harness/docs/design.rst
+++ /dev/null
@@ -1,106 +0,0 @@
-wptrunner Design
-================
-
-The design of wptrunner is intended to meet the following
-requirements:
-
- * Possible to run tests from W3C web-platform-tests.
-
- * Tests should be run as fast as possible. In particular it should
-   not be necessary to restart the browser between tests, or similar.
-
- * As far as possible, the tests should run in a "normal" browser and
-   browsing context. In particular many tests assume that they are
-   running in a top-level browsing context, so we must avoid the use
-   of an ``iframe`` test container.
-
- * It must be possible to deal with all kinds of behaviour of the
-   browser runder test, for example, crashing, hanging, etc.
-
- * It should be possible to add support for new platforms and browsers
-   with minimal code changes.
-
- * It must be possible to run tests in parallel to further improve
-   performance.
-
- * Test output must be in a machine readable form.
-
-Architecture
-------------
-
-In order to meet the above requirements, wptrunner is designed to
-push as much of the test scheduling as possible into the harness. This
-allows the harness to monitor the state of the browser and perform
-appropriate action if it gets into an unwanted state e.g. kill the
-browser if it appears to be hung.
-
-The harness will typically communicate with the browser via some remote
-control protocol such as WebDriver. However for browsers where no such
-protocol is supported, other implementation strategies are possible,
-typically at the expense of speed.
-
-The overall architecture of wptrunner is shown in the diagram below:
-
-.. image:: architecture.svg
-
-The main entry point to the code is :py:func:`run_tests` in
-``wptrunner.py``. This is responsible for setting up the test
-environment, loading the list of tests to be executed, and invoking
-the remainder of the code to actually execute some tests.
-
-The test environment is encapsulated in the
-:py:class:`TestEnvironment` class. This defers to code in
-``web-platform-tests`` which actually starts the required servers to
-run the tests.
-
-The set of tests to run is defined by the
-:py:class:`TestLoader`. This is constructed with a
-:py:class:`TestFilter` (not shown), which takes any filter arguments
-from the command line to restrict the set of tests that will be
-run. The :py:class:`TestLoader` reads both the ``web-platform-tests``
-JSON manifest and the expectation data stored in ini files and
-produces a :py:class:`multiprocessing.Queue` of tests to run, and
-their expected results.
-
-Actually running the tests happens through the
-:py:class:`ManagerGroup` object. This takes the :py:class:`Queue` of
-tests to be run and starts a :py:class:`testrunner.TestRunnerManager` for each
-instance of the browser under test that will be started. These
-:py:class:`TestRunnerManager` instances are each started in their own
-thread.
-
-A :py:class:`TestRunnerManager` coordinates starting the product under
-test, and outputting results from the test. In the case that the test
-has timed out or the browser has crashed, it has to restart the
-browser to ensure the test run can continue. The functionality for
-initialising the browser under test, and probing its state
-(e.g. whether the process is still alive) is implemented through a
-:py:class:`Browser` object. An implementation of this class must be
-provided for each product that is supported.
-
-The functionality for actually running the tests is provided by a
-:py:class:`TestRunner` object. :py:class:`TestRunner` instances are
-run in their own child process created with the
-:py:mod:`multiprocessing` module. This allows them to run concurrently
-and to be killed and restarted as required. Communication between the
-:py:class:`TestRunnerManager` and the :py:class:`TestRunner` is
-provided by a pair of queues, one for sending messages in each
-direction. In particular test results are sent from the
-:py:class:`TestRunner` to the :py:class:`TestRunnerManager` using one
-of these queues.
-
-The :py:class:`TestRunner` object is generic in that the same
-:py:class:`TestRunner` is used regardless of the product under
-test. However the details of how to run the test may vary greatly with
-the product since different products support different remote control
-protocols (or none at all). These protocol-specific parts are placed
-in the :py:class:`Executor` object. There is typically a different
-:py:class:`Executor` class for each combination of control protocol
-and test type. The :py:class:`TestRunner` is responsible for pulling
-each test off the :py:class:`Queue` of tests and passing it down to
-the :py:class:`Executor`.
-
-The executor often requires access to details of the particular
-browser instance that it is testing so that it knows e.g. which port
-to connect to to send commands to the browser. These details are
-encapsulated in the :py:class:`ExecutorBrowser` class.
deleted file mode 100644
--- a/testing/web-platform/harness/docs/expectation.rst
+++ /dev/null
@@ -1,248 +0,0 @@
-Expectation Data
-================
-
-Introduction
-------------
-
-For use in continuous integration systems, and other scenarios where
-regression tracking is required, wptrunner supports storing and
-loading the expected result of each test in a test run. Typically
-these expected results will initially be generated by running the
-testsuite in a baseline build. They may then be edited by humans as
-new features are added to the product that change the expected
-results. The expected results may also vary for a single product
-depending on the platform on which it is run. Therefore, the raw
-structured log data is not a suitable format for storing these
-files. Instead something is required that is:
-
- * Human readable
-
- * Human editable
-
- * Machine readable / writable
-
- * Capable of storing test id / result pairs
-
- * Suitable for storing in a version control system (i.e. text-based)
-
-The need for different results per platform means either having
-multiple expectation files for each platform, or having a way to
-express conditional values within a certain file. The former would be
-rather cumbersome for humans updating the expectation files, so the
-latter approach has been adopted, leading to the requirement:
-
- * Capable of storing result values that are conditional on the platform.
-
-There are few extant formats that meet these requirements, so
-wptrunner uses a bespoke ``expectation manifest`` format, which is
-closely based on the standard ``ini`` format.
-
-Directory Layout
-----------------
-
-Expectation manifest files must be stored under the ``metadata``
-directory passed to the test runner. The directory layout follows that
-of web-platform-tests with each test path having a corresponding
-manifest file. Tests that differ only by query string, or reftests
-with the same test path but different ref paths share the same
-reference file. The file name is taken from the last /-separated part
-of the path, suffixed with ``.ini``.
-
-As an optimisation, files which produce only default results
-(i.e. ``PASS`` or ``OK``) don't require a corresponding manifest file.
-
-For example a test with url::
-
-  /spec/section/file.html?query=param
-
-would have an expectation file ::
-
-  metadata/spec/section/file.html.ini
-
-
-.. _wptupdate-label:
-
-Generating Expectation Files
-----------------------------
-
-wptrunner provides the tool ``wptupdate`` to generate expectation
-files from the results of a set of baseline test runs. The basic
-syntax for this is::
-
-  wptupdate [options] [logfile]...
-
-Each ``logfile`` is a structured log file from a previous run. These
-can be generated from wptrunner using the ``--log-raw`` option
-e.g. ``--log-raw=structured.log``. The default behaviour is to update
-all the test data for the particular combination of hardware and OS
-used in the run corresponding to the log data, whilst leaving any
-other expectations untouched.
-
-wptupdate takes several useful options:
-
-``--sync``
-  Pull the latest version of web-platform-tests from the
-  upstream specified in the config file. If this is specified in
-  combination with logfiles, it is assumed that the results in the log
-  files apply to the post-update tests.
-
-``--no-check-clean``
-  Don't attempt to check if the working directory is clean before
-  doing the update (assuming that the working directory is a git or
-  mercurial tree).
-
-``--patch``
-  Create a a git commit, or a mq patch, with the changes made by wptupdate.
-
-``--ignore-existing``
-  Overwrite all the expectation data for any tests that have a result
-  in the passed log files, not just data for the same platform.
-
-Examples
-~~~~~~~~
-
-Update the local copy of web-platform-tests without changing the
-expectation data and commit (or create a mq patch for) the result::
-
-  wptupdate --patch --sync
-
-Update all the expectations from a set of cross-platform test runs::
-
-  wptupdate --no-check-clean --patch osx.log linux.log windows.log
-
-Add expectation data for some new tests that are expected to be
-platform-independent::
-
-  wptupdate --no-check-clean --patch --ignore-existing tests.log
-
-Manifest Format
----------------
-The format of the manifest files is based on the ini format. Files are
-divided into sections, each (apart from the root section) having a
-heading enclosed in square braces. Within each section are key-value
-pairs. There are several notable differences from standard .ini files,
-however:
-
- * Sections may be hierarchically nested, with significant whitespace
-   indicating nesting depth.
-
- * Only ``:`` is valid as a key/value separator
-
-A simple example of a manifest file is::
-
-  root_key: root_value
-
-  [section]
-    section_key: section_value
-
-    [subsection]
-       subsection_key: subsection_value
-
-  [another_section]
-    another_key: another_value
-
-Conditional Values
-~~~~~~~~~~~~~~~~~~
-
-In order to support values that depend on some external data, the
-right hand side of a key/value pair can take a set of conditionals
-rather than a plain value. These values are placed on a new line
-following the key, with significant indentation. Conditional values
-are prefixed with ``if`` and terminated with a colon, for example::
-
-  key:
-    if cond1: value1
-    if cond2: value2
-    value3
-
-In this example, the value associated with ``key`` is determined by
-first evaluating ``cond1`` against external data. If that is true,
-``key`` is assigned the value ``value1``, otherwise ``cond2`` is
-evaluated in the same way. If both ``cond1`` and ``cond2`` are false,
-the unconditional ``value3`` is used.
-
-Conditions themselves use a Python-like expression syntax. Operands
-can either be variables, corresponding to data passed in, numbers
-(integer or floating point; exponential notation is not supported) or
-quote-delimited strings. Equality is tested using ``==`` and
-inequality by ``!=``. The operators ``and``, ``or`` and ``not`` are
-used in the expected way. Parentheses can also be used for
-grouping. For example::
-
-  key:
-    if (a == 2 or a == 3) and b == "abc": value1
-    if a == 1 or b != "abc": value2
-    value3
-
-Here ``a`` and ``b`` are variables, the value of which will be
-supplied when the manifest is used.
-
-Expectation Manifests
----------------------
-
-When used for expectation data, manifests have the following format:
-
- * A section per test URL described by the manifest, with the section
-   heading being the part of the test URL following the last ``/`` in
-   the path (this allows multiple tests in a single manifest file with
-   the same path part of the URL, but different query parts).
-
- * A subsection per subtest, with the heading being the title of the
-   subtest.
-
- * A key ``type`` indicating the test type. This takes the values
-   ``testharness`` and ``reftest``.
-
- * For reftests, keys ``reftype`` indicating the reference type
-   (``==`` or ``!=``) and ``refurl`` indicating the URL of the
-   reference.
-
- * A key ``expected`` giving the expectation value of each (sub)test.
-
- * A key ``disabled`` which can be set to any value to indicate that
-   the (sub)test is disabled and should either not be run (for tests)
-   or that its results should be ignored (subtests).
-
- * A key ``restart-after`` which can be set to any value to indicate that
-   the runner should restart the browser after running this test (e.g. to
-   clear out unwanted state).
-
- * Variables ``debug``, ``os``, ``version``, ``processor`` and
-   ``bits`` that describe the configuration of the browser under
-   test. ``debug`` is a boolean indicating whether a build is a debug
-   build. ``os`` is a string indicating the operating system, and
-   ``version`` a string indicating the particular version of that
-   operating system. ``processor`` is a string indicating the
-   processor architecture and ``bits`` an integer indicating the
-   number of bits. This information is typically provided by
-   :py:mod:`mozinfo`.
-
- * Top level keys are taken as defaults for the whole file. So, for
-   example, a top level key with ``expected: FAIL`` would indicate
-   that all tests and subtests in the file are expected to fail,
-   unless they have an ``expected`` key of their own.
-
-An simple example manifest might look like::
-
-  [test.html?variant=basic]
-    type: testharness
-
-    [Test something unsupported]
-       expected: FAIL
-
-  [test.html?variant=broken]
-    expected: ERROR
-
-  [test.html?variant=unstable]
-    disabled: http://test.bugs.example.org/bugs/12345
-
-A more complex manifest with conditional properties might be::
-
-  [canvas_test.html]
-    expected:
-      if os == "osx": FAIL
-      if os == "windows" and version == "XP": FAIL
-      PASS
-
-Note that ``PASS`` in the above works, but is unnecessary; ``PASS``
-(or ``OK``) is always the default expectation for (sub)tests.
deleted file mode 100644
--- a/testing/web-platform/harness/docs/index.rst
+++ /dev/null
@@ -1,24 +0,0 @@
-.. wptrunner documentation master file, created by
-   sphinx-quickstart on Mon May 19 18:14:20 2014.
-   You can adapt this file completely to your liking, but it should at least
-   contain the root `toctree` directive.
-
-Welcome to wptrunner's documentation!
-=====================================
-
-Contents:
-
-.. toctree::
-   :maxdepth: 2
-
-   usage
-   expectation
-   design
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
deleted file mode 100644
--- a/testing/web-platform/harness/docs/make.bat
+++ /dev/null
@@ -1,242 +0,0 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
-	set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=_build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
-set I18NSPHINXOPTS=%SPHINXOPTS% .
-if NOT "%PAPER%" == "" (
-	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
-	set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
-	:help
-	echo.Please use `make ^<target^>` where ^<target^> is one of
-	echo.  html       to make standalone HTML files
-	echo.  dirhtml    to make HTML files named index.html in directories
-	echo.  singlehtml to make a single large HTML file
-	echo.  pickle     to make pickle files
-	echo.  json       to make JSON files
-	echo.  htmlhelp   to make HTML files and a HTML help project
-	echo.  qthelp     to make HTML files and a qthelp project
-	echo.  devhelp    to make HTML files and a Devhelp project
-	echo.  epub       to make an epub
-	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
-	echo.  text       to make text files
-	echo.  man        to make manual pages
-	echo.  texinfo    to make Texinfo files
-	echo.  gettext    to make PO message catalogs
-	echo.  changes    to make an overview over all changed/added/deprecated items
-	echo.  xml        to make Docutils-native XML files
-	echo.  pseudoxml  to make pseudoxml-XML files for display purposes
-	echo.  linkcheck  to check all external links for integrity
-	echo.  doctest    to run all doctests embedded in the documentation if enabled
-	goto end
-)
-
-if "%1" == "clean" (
-	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
-	del /q /s %BUILDDIR%\*
-	goto end
-)
-
-
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 (
-	echo.
-	echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
-	echo.installed, then set the SPHINXBUILD environment variable to point
-	echo.to the full path of the 'sphinx-build' executable. Alternatively you
-	echo.may add the Sphinx directory to PATH.
-	echo.
-	echo.If you don't have Sphinx installed, grab it from
-	echo.http://sphinx-doc.org/
-	exit /b 1
-)
-
-if "%1" == "html" (
-	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
-	goto end
-)
-
-if "%1" == "dirhtml" (
-	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
-	goto end
-)
-
-if "%1" == "singlehtml" (
-	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
-	goto end
-)
-
-if "%1" == "pickle" (
-	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the pickle files.
-	goto end
-)
-
-if "%1" == "json" (
-	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can process the JSON files.
-	goto end
-)
-
-if "%1" == "htmlhelp" (
-	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
-	goto end
-)
-
-if "%1" == "qthelp" (
-	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
-	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\wptrunner.qhcp
-	echo.To view the help file:
-	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\wptrunner.ghc
-	goto end
-)
-
-if "%1" == "devhelp" (
-	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished.
-	goto end
-)
-
-if "%1" == "epub" (
-	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The epub file is in %BUILDDIR%/epub.
-	goto end
-)
-
-if "%1" == "latex" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdf" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf
-	cd %BUILDDIR%/..
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "latexpdfja" (
-	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
-	cd %BUILDDIR%/latex
-	make all-pdf-ja
-	cd %BUILDDIR%/..
-	echo.
-	echo.Build finished; the PDF files are in %BUILDDIR%/latex.
-	goto end
-)
-
-if "%1" == "text" (
-	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The text files are in %BUILDDIR%/text.
-	goto end
-)
-
-if "%1" == "man" (
-	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The manual pages are in %BUILDDIR%/man.
-	goto end
-)
-
-if "%1" == "texinfo" (
-	%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
-	goto end
-)
-
-if "%1" == "gettext" (
-	%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
-	goto end
-)
-
-if "%1" == "changes" (
-	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.The overview file is in %BUILDDIR%/changes.
-	goto end
-)
-
-if "%1" == "linkcheck" (
-	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
-	goto end
-)
-
-if "%1" == "doctest" (
-	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
-	goto end
-)
-
-if "%1" == "xml" (
-	%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The XML files are in %BUILDDIR%/xml.
-	goto end
-)
-
-if "%1" == "pseudoxml" (
-	%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
-	if errorlevel 1 exit /b 1
-	echo.
-	echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
-	goto end
-)
-
-:end
deleted file mode 100644
--- a/testing/web-platform/harness/docs/usage.rst
+++ /dev/null
@@ -1,238 +0,0 @@
-Getting Started
-===============
-
-Installing wptrunner
---------------------
-
-The easiest way to install wptrunner is into a virtualenv, using pip::
-
-  virtualenv wptrunner
-  cd wptrunner
-  source bin/activate
-  pip install wptrunner
-
-This will install the base dependencies for wptrunner, but not any
-extra dependencies required to test against specific browsers. In
-order to do this you must use use the extra requirements files in
-``$VIRTUAL_ENV/requirements/requirements_browser.txt``. For example,
-in order to test against Firefox you would have to run::
-
-  pip install -r requirements/requirements_firefox.txt
-
-If you intend to work on the code, the ``-e`` option to pip should be
-used in combination with a source checkout i.e. inside a virtual
-environment created as above::
-
-  git clone https://github.com/w3c/wptrunner.git
-  cd wptrunner
-  pip install -e ./
-
-In addition to the dependencies installed by pip, wptrunner requires
-a copy of the web-platform-tests repository. This can be located
-anywhere on the filesystem, but the easiest option is to put it
-under the same parent directory as the wptrunner checkout::
-
-  git clone https://github.com/w3c/web-platform-tests.git
-
-It is also necessary to generate a web-platform-tests ``MANIFEST.json``
-file. It's recommended to also put that under the same parent directory as
-the wptrunner checkout, in a directory named ``meta``::
-
-  mkdir meta
-  cd web-platform-tests
-  python manifest --path ../meta/MANIFEST.json
-
-The ``MANIFEST.json`` file needs to be regenerated each time the
-web-platform-tests checkout is updated. To aid with the update process
-there is a tool called ``wptupdate``, which is described in
-:ref:`wptupdate-label`.
-
-Running the Tests
------------------
-
-A test run is started using the ``wptrunner`` command.  The command
-takes multiple options, of which the following are most significant:
-
-``--product`` (defaults to `firefox`)
-  The product to test against: `b2g`, `chrome`, `firefox`, or `servo`.
-
-``--binary`` (required if product is `firefox` or `servo`)
-  The path to a binary file for the product (browser) to test against.
-
-``--webdriver-binary`` (required if product is `chrome`)
-  The path to a `*driver` binary; e.g., a `chromedriver` binary.
-
-``--certutil-binary`` (required if product is `firefox` [#]_)
-  The path to a `certutil` binary (for tests that must be run over https).
-
-``--metadata`` (required only when not `using default paths`_)
-  The path to a directory containing test metadata. [#]_
-
-``--tests`` (required only when not `using default paths`_)
-  The path to a directory containing a web-platform-tests checkout.
-
-``--prefs-root`` (required only when testing a Firefox binary)
-  The path to a directory containing Firefox test-harness preferences. [#]_
-
-``--config`` (should default to `wptrunner.default.ini`)
-  The path to the config (ini) file.
-
-.. [#] The ``--certutil-binary`` option is required when the product is
-   ``firefox`` unless ``--ssl-type=none`` is specified.
-
-.. [#] The ``--metadata`` path is to a directory that contains:
-
-  * a ``MANIFEST.json`` file (the web-platform-tests documentation has
-    instructions on generating this file)
-  * (optionally) any expectation files (see :ref:`wptupdate-label`)
-
-.. [#] Example ``--prefs-root`` value: ``~/mozilla-central/testing/profiles``.
-
-There are also a variety of other command-line options available; use
-``--help`` to list them.
-
-The following examples show how to start wptrunner with various options.
-
-------------------
-Starting wptrunner
-------------------
-
-The examples below assume the following directory layout,
-though no specific folder structure is required::
-
-  ~/testtwf/wptrunner          # wptrunner checkout
-  ~/testtwf/web-platform-tests # web-platform-tests checkout
-  ~/testtwf/meta               # metadata
-
-To test a Firefox Nightly build in an OS X environment, you might start
-wptrunner using something similar to the following example::
-
-  wptrunner --metadata=~/testtwf/meta/ --tests=~/testtwf/web-platform-tests/ \
-    --binary=~/mozilla-central/obj-x86_64-apple-darwin14.3.0/dist/Nightly.app/Contents/MacOS/firefox \
-    --certutil-binary=~/mozilla-central/obj-x86_64-apple-darwin14.3.0/security/nss/cmd/certutil/certutil \
-    --prefs-root=~/mozilla-central/testing/profiles
-
-
-And to test a Chromium build in an OS X environment, you might start
-wptrunner using something similar to the following example::
-
-  wptrunner --metadata=~/testtwf/meta/ --tests=~/testtwf/web-platform-tests/ \
-    --binary=~/chromium/src/out/Release/Chromium.app/Contents/MacOS/Chromium \
-    --webdriver-binary=/usr/local/bin/chromedriver --product=chrome
-
---------------------
-Running test subsets
---------------------
-
-To restrict a test run just to tests in a particular web-platform-tests
-subdirectory, specify the directory name in the positional arguments after
-the options; for example, run just the tests in the `dom` subdirectory::
-
-  wptrunner --metadata=~/testtwf/meta --tests=~/testtwf/web-platform-tests/ \
-    --binary=/path/to/firefox --certutil-binary=/path/to/certutil \
-    --prefs-root=/path/to/testing/profiles \
-    dom
-
--------------------
-Running in parallel
--------------------
-
-To speed up the testing process, use the ``--processes`` option to have
-wptrunner run multiple browser instances in parallel. For example, to
-have wptrunner attempt to run tests against with six browser instances
-in parallel, specify ``--processes=6``. But note that behaviour in this
-mode is necessarily less deterministic than with ``--processes=1`` (the
-default), so there may be more noise in the test results.
-
--------------------
-Using default paths
--------------------
-
-The (otherwise-required) ``--tests`` and ``--metadata`` command-line
-options/flags be omitted if any configuration file is found that
-contains a section specifying the ``tests`` and ``metadata`` keys.
-
-See the `Configuration File`_ section for more information about
-configuration files, including information about their expected
-locations.
-
-The content of the ``wptrunner.default.ini`` default configuration file
-makes wptrunner look for tests (that is, a web-platform-tests checkout)
-as a subdirectory of the current directory named ``tests``, and for
-metadata files in a subdirectory of the current directory named ``meta``.
-
-Output
-------
-
-wptrunner uses the :py:mod:`mozlog` package for output. This
-structures events such as test results or log messages as JSON objects
-that can then be fed to other tools for interpretation. More details
-about the message format are given in the
-:py:mod:`mozlog` documentation.
-
-By default the raw JSON messages are dumped to stdout. This is
-convenient for piping into other tools, but not ideal for humans
-reading the output. :py:mod:`mozlog` comes with several other
-formatters, which are accessible through command line options. The
-general format of these options is ``--log-name=dest``, where ``name``
-is the name of the format and ``dest`` is a path to a destination
-file, or ``-`` for stdout. The raw JSON data is written by the ``raw``
-formatter so, the default setup corresponds to ``--log-raw=-``.
-
-A reasonable output format for humans is provided as ``mach``. So in
-order to output the full raw log to a file and a human-readable
-summary to stdout, one might pass the options::
-
-  --log-raw=output.log --log-mach=-
-
-Configuration File
-------------------
-
-wptrunner uses a ``.ini`` file to control some configuration
-sections. The file has three sections; ``[products]``,
-``[manifest:default]`` and ``[web-platform-tests]``.
-
-``[products]`` is used to
-define the set of available products. By default this section is empty
-which means that all the products distributed with wptrunner are
-enabled (although their dependencies may not be installed). The set
-of enabled products can be set by using the product name as the
-key. For built in products the value is empty. It is also possible to
-provide the path to a script implementing the browser functionality
-e.g.::
-
-  [products]
-  chrome =
-  netscape4 = path/to/netscape.py
-
-``[manifest:default]`` specifies the default paths for the tests and metadata,
-relative to the config file. For example::
-
-  [manifest:default]
-  tests = ~/testtwf/web-platform-tests
-  metadata = ~/testtwf/meta
-
-
-``[web-platform-tests]`` is used to set the properties of the upstream
-repository when updating the paths. ``remote_url`` specifies the git
-url to pull from; ``branch`` the branch to sync against and
-``sync_path`` the local path, relative to the configuration file, to
-use when checking out the tests e.g.::
-
-  [web-platform-tests]
-  remote_url = https://github.com/w3c/web-platform-tests.git
-  branch = master
-  sync_path = sync
-
-A configuration file must contain all the above fields; falling back
-to the default values for unspecified fields is not yet supported.
-
-The ``wptrunner`` and ``wptupdate`` commands will use configuration
-files in the following order:
-
- * Any path supplied with a ``--config`` flag to the command.
-
- * A file called ``wptrunner.ini`` in the current directory
-
- * The default configuration file (``wptrunner.default.ini`` in the
-   source directory)
deleted file mode 100644
--- a/testing/web-platform/harness/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-html5lib >= 0.99
-mozinfo >= 0.7
-mozlog >= 3.3
-mozdebug >= 0.1
deleted file mode 100644
--- a/testing/web-platform/harness/requirements_chrome.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-mozprocess >= 0.19
-selenium >= 2.41.0
deleted file mode 100644
--- a/testing/web-platform/harness/requirements_firefox.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-marionette_driver >= 0.4
-mozprofile >= 0.21
-mozprocess >= 0.19
-mozcrash >= 0.13
-mozrunner >= 6.7
-mozleak >= 0.1
deleted file mode 100644
--- a/testing/web-platform/harness/requirements_servo.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-mozprocess >= 0.19
deleted file mode 100644
--- a/testing/web-platform/harness/setup.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# 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/.
-
-import glob
-import os
-import sys
-import textwrap
-
-from setuptools import setup, find_packages
-
-here = os.path.split(__file__)[0]
-
-PACKAGE_NAME = 'wptrunner'
-PACKAGE_VERSION = '1.14'
-
-# Dependencies
-with open(os.path.join(here, "requirements.txt")) as f:
-    deps = f.read().splitlines()
-
-# Browser-specific requirements
-requirements_files = glob.glob("requirements_*.txt")
-
-profile_dest = None
-dest_exists = False
-
-setup(name=PACKAGE_NAME,
-      version=PACKAGE_VERSION,
-      description="Harness for running the W3C web-platform-tests against various products",
-      author='Mozilla Automation and Testing Team',
-      author_email='tools@lists.mozilla.org',
-      license='MPL 2.0',
-      packages=find_packages(exclude=["tests", "metadata", "prefs"]),
-      entry_points={
-          'console_scripts': [
-              'wptrunner = wptrunner.wptrunner:main',
-              'wptupdate = wptrunner.update:main',
-          ]
-      },
-      zip_safe=False,
-      platforms=['Any'],
-      classifiers=['Development Status :: 4 - Beta',
-                   'Environment :: Console',
-                   'Intended Audience :: Developers',
-                   'License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)',
-                   'Operating System :: OS Independent'],
-      package_data={"wptrunner": ["executors/testharness_marionette.js",
-                                  "executors/testharness_webdriver.js",
-                                  "executors/reftest.js",
-                                  "executors/reftest-wait.js",
-                                  "testharnessreport.js",
-                                  "testharness_runner.html",
-                                  "config.json",
-                                  "wptrunner.default.ini",
-                                  "browsers/server-locations.txt",
-                                  "browsers/b2g_setup/*",
-                                  "prefs/*"]},
-      include_package_data=True,
-      data_files=[("requirements", requirements_files)],
-      install_requires=deps
-     )
-
-if "install" in sys.argv:
-    path = os.path.relpath(os.path.join(sys.prefix, "requirements"), os.curdir)
-    print textwrap.fill("""In order to use with one of the built-in browser
-products, you will need to install the extra dependencies. These are provided
-as requirements_[name].txt in the %s directory and can be installed using
-e.g.""" % path, 80)
-
-    print """
-
-pip install -r %s/requirements_firefox.txt
-""" % path
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_and_fail.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_and_fail.html]
-  type: reftest
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_cycle_fail.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_cycle_fail.html]
-  type: reftest
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_match_fail.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_match_fail.html]
-  type: reftest
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_mismatch_fail.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_mismatch_fail.html]
-  type: reftest
-  expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_ref_timeout.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_ref_timeout.html]
-  type: reftest
-  expected: TIMEOUT
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/reftest/reftest_timeout.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[reftest_timeout.html]
-  type: reftest
-  expected: TIMEOUT
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/firefox/__dir__.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-prefs: ["browser.display.foreground_color:#FF0000",
-        "browser.display.background_color:#000000"]
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/firefox/subdir/test_pref_reset.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[test_pref_reset.html]
-  prefs: [@Reset]
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/firefox/test_pref_set.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[test_pref_set.html]
-  prefs: ["browser.display.foreground_color:#00FF00",
-          "browser.display.background_color:#000000"]
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/subdir/__dir__.ini
+++ /dev/null
@@ -1,1 +0,0 @@
-disabled: true
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/subdir/testharness_1.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[testharness_1.html]
-  disabled: @False
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/testharness_0.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[testharness_0.html]
-  type: testharness
-  [Test that should fail]
-    expected: FAIL
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/testharness_error.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[testharness_error.html]
-  type: testharness
-  expected: ERROR
deleted file mode 100644
--- a/testing/web-platform/harness/test/metadata/testharness/testharness_timeout.html.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[testharness_timeout.html]
-  type: testharness
-  expected: TIMEOUT
deleted file mode 100644
--- a/testing/web-platform/harness/test/test.cfg.example
+++ /dev/null
@@ -1,20 +0,0 @@
-[general]
-tests=/path/to/web-platform-tests/
-metadata=/path/to/web-platform-tests/
-ssl-type=none
-
-# [firefox]
-# binary=/path/to/firefox
-# prefs-root=/path/to/gecko-src/testing/profiles/
-
-# [servo]
-# binary=/path/to/servo-src/target/release/servo
-# exclude=testharness # Because it needs a special testharness.js
-
-# [servodriver]
-# binary=/path/to/servo-src/target/release/servo
-# exclude=testharness # Because it needs a special testharness.js
-
-# [chrome]
-# binary=/path/to/chrome
-# webdriver-binary=/path/to/chromedriver
deleted file mode 100644
--- a/testing/web-platform/harness/test/test.py
+++ /dev/null
@@ -1,166 +0,0 @@
-import ConfigParser
-import argparse
-import json
-import os
-import sys
-import tempfile
-import threading
-import time
-from StringIO import StringIO
-
-from mozlog import structuredlog, reader
-from mozlog.handlers import BaseHandler, StreamHandler, StatusHandler
-from mozlog.formatters import MachFormatter
-from wptrunner import wptcommandline, wptrunner
-
-here = os.path.abspath(os.path.dirname(__file__))
-
-def setup_wptrunner_logging(logger):
-    structuredlog.set_default_logger(logger)
-    wptrunner.logger = logger
-    wptrunner.wptlogging.setup_stdlib_logger()
-
-class ResultHandler(BaseHandler):
-    def __init__(self, verbose=False, logger=None):
-        self.inner = StreamHandler(sys.stdout, MachFormatter())
-        BaseHandler.__init__(self, self.inner)
-        self.product = None
-        self.verbose = verbose
-        self.logger = logger
-
-        self.register_message_handlers("wptrunner-test", {"set-product": self.set_product})
-
-    def set_product(self, product):
-        self.product = product
-
-    def __call__(self, data):
-        if self.product is not None and data["action"] in ["suite_start", "suite_end"]:
-            # Hack: mozlog sets some internal state to prevent multiple suite_start or
-            # suite_end messages. We actually want that here (one from the metaharness
-            # and one from the individual test type harness), so override that internal
-            # state (a better solution might be to not share loggers, but this works well
-            # enough)
-            self.logger._state.suite_started = True
-            return
-
-        if (not self.verbose and
-            (data["action"] == "process_output" or
-             data["action"] == "log" and data["level"] not in ["error", "critical"])):
-            return
-
-        if "test" in data:
-            data = data.copy()
-            data["test"] = "%s: %s" % (self.product, data["test"])
-
-        return self.inner(data)
-
-def test_settings():
-    return {
-        "include": "_test",
-        "manifest-update": "",
-        "no-capture-stdio": ""
-    }
-
-def read_config():
-    parser = ConfigParser.ConfigParser()
-    parser.read("test.cfg")
-
-    rv = {"general":{},
-          "products":{}}
-
-    rv["general"].update(dict(parser.items("general")))
-
-    # This only allows one product per whatever for now
-    for product in parser.sections():
-        if product != "general":
-            dest = rv["products"][product] = {}
-            for key, value in parser.items(product):
-                rv["products"][product][key] = value
-
-    return rv
-
-def run_tests(product, kwargs):
-    kwargs["test_paths"]["/_test/"] = {"tests_path": os.path.join(here, "testdata"),
-                                       "metadata_path": os.path.join(here, "metadata")}
-
-    wptrunner.run_tests(**kwargs)
-
-def settings_to_argv(settings):
-    rv = []
-    for name, value in settings.iteritems():
-        key = "--%s" % name
-        if not value:
-            rv.append(key)
-        elif isinstance(value, list):
-            for item in value:
-                rv.extend([key, item])
-        else:
-            rv.extend([key, value])
-    return rv
-
-def set_from_args(settings, args):
-    if args.test:
-        settings["include"] = args.test
-    if args.tags:
-        settings["tags"] = args.tags
-
-def run(config, args):
-    logger = structuredlog.StructuredLogger("web-platform-tests")
-    logger.add_handler(ResultHandler(logger=logger, verbose=args.verbose))
-    setup_wptrunner_logging(logger)
-
-    parser = wptcommandline.create_parser()
-
-    logger.suite_start(tests=[])
-
-    for product, product_settings in config["products"].iteritems():
-        if args.product and product not in args.product:
-            continue
-
-        settings = test_settings()
-        settings.update(config["general"])
-        settings.update(product_settings)
-        settings["product"] = product
-        set_from_args(settings, args)
-
-        kwargs = vars(parser.parse_args(settings_to_argv(settings)))
-        wptcommandline.check_args(kwargs)
-
-        logger.send_message("wptrunner-test", "set-product", product)
-
-        run_tests(product, kwargs)
-
-    logger.send_message("wptrunner-test", "set-product", None)
-    logger.suite_end()
-
-def get_parser():
-    parser = argparse.ArgumentParser()
-    parser.add_argument("-v", "--verbose", action="store_true", default=False,
-                        help="verbose log output")
-    parser.add_argument("--product", action="append",
-                        help="Specific product to include in test run")
-    parser.add_argument("--pdb", action="store_true",
-                        help="Invoke pdb on uncaught exception")
-    parser.add_argument("--tag", action="append", dest="tags",
-                        help="tags to select tests")
-    parser.add_argument("test", nargs="*",
-                        help="Specific tests to include in test run")
-    return parser
-
-def main():
-    config = read_config()
-
-    args = get_parser().parse_args()
-
-    try:
-        run(config, args)
-    except Exception:
-        if args.pdb:
-            import pdb, traceback
-            print traceback.format_exc()
-            pdb.post_mortem()
-        else:
-            raise
-
-if __name__ == "__main__":
-    main()
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/green-ref.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<link rel=match href=green.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/green.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/red.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<style>
-:root {background-color:red}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest.https.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<link rel=match href=green.html>
-<style>
-:root {background-color:red}
-</style>
-<script>
-if (window.location.protocol === "https:") {
-   document.documentElement.style.backgroundColor = "green";
-}
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_and_fail.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest chain that should fail</title>
-<link rel=match href=reftest_and_fail_0-ref.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_and_fail_0-ref.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest chain that should fail</title>
-<link rel=match href=red.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_cycle.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest with cycle, all match</title>
-<link rel=match href=reftest_cycle_0-ref.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_cycle_0-ref.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>OR match that should pass</title>
-<link rel=match href=reftest_cycle_1-ref.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_cycle_1-ref.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest with cycle, all match</title>
-<link rel=match href=reftest_cycle.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_cycle_fail.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest with cycle, fails</title>
-<link rel=match href=reftest_cycle_fail_0-ref.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_cycle_fail_0-ref.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>Reftest with cycle, fails</title>
-<link rel=mismatch href=reftest_cycle_fail.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_match.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>rel=match that should pass</title>
-<link rel=match href=green.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_match_fail.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>rel=match that should fail</title>
-<link rel=match href=red.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_mismatch.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>rel=mismatch that should pass</title>
-<link rel=mismatch href=red.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_mismatch_fail.html
+++ /dev/null
@@ -1,5 +0,0 @@
-<title>rel=mismatch that should fail</title>
-<link rel=mismatch href=green.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_or_0.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<title>OR match that should pass</title>
-<link rel=match href=red.html>
-<link rel=match href=green.html>
-<style>
-:root {background-color:green}
-</style>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_ref_timeout-ref.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html class="reftest-wait">
-<title>rel=match that should time out in the ref</title>
-<link rel=match href=reftest_ref_timeout-ref.html>
-<style>
-:root {background-color:green}
-</style>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_ref_timeout.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html>
-<title>rel=match that should time out in the ref</title>
-<link rel=match href=reftest_ref_timeout-ref.html>
-<style>
-:root {background-color:green}
-</style>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_timeout.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<html class="reftest-wait">
-<title>rel=match that should timeout</title>
-<link rel=match href=green.html>
-<style>
-:root {background-color:green}
-</style>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/reftest/reftest_wait_0.html
+++ /dev/null
@@ -1,13 +0,0 @@
-<html class="reftest-wait">
-<title>rel=match that should fail</title>
-<link rel=match href=red.html>
-<style>
-:root {background-color:red}
-</style>
-<script>
-setTimeout(function() {
-  document.documentElement.style.backgroundColor = "green";
-  document.documentElement.className = "";
-}, 2000);
-</script>
-</html>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/firefox/subdir/test_pref_inherit.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<title>Example pref test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>Test requires the pref browser.display.foreground_color to be set to #00FF00</p>
-<script>
-test(function() {
-  assert_equals(getComputedStyle(document.body).color, "rgb(255, 0, 0)");
-}, "Test that pref was set");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/firefox/subdir/test_pref_reset.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<title>Example pref test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>Test requires the pref browser.display.foreground_color to be set to #00FF00</p>
-<script>
-test(function() {
-  assert_equals(getComputedStyle(document.body).color, "rgb(0, 0, 0)");
-}, "Test that pref was reset");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/firefox/test_pref_dir.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<title>Example pref test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>Test requires the pref browser.display.foreground_color to be set to #FF0000</p>
-<script>
-test(function() {
-  assert_equals(getComputedStyle(document.body).color, "rgb(255, 0, 0)");
-}, "Test that pref was set");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/firefox/test_pref_set.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<title>Example pref test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<p>Test requires the pref browser.display.foreground_color to be set to #00FF00</p>
-<script>
-test(function() {
-  assert_equals(getComputedStyle(document.body).color, "rgb(0, 255, 0)");
-}, "Test that pref was set");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/subdir/testharness_1.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype html>
-<title>Test should be enabled</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-test(function() {
-  assert_true(true);
-}, "Test that should pass");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/testharness.https.html
+++ /dev/null
@@ -1,10 +0,0 @@
-<!doctype html>
-<title>Example https test</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-test(function() {
-  assert_equals(window.location.protocol, "https:");
-}, "Test that file was loaded with the correct protocol");
-
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/testharness_0.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype html>
-<title>Test should be disabled</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-test(function() {
-  assert_true(false);
-}, "Test that should fail");
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/testharness_error.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!doctype html>
-<title>testharness.js test that should error</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-undefined_function()
-</script>
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/testharness_long_timeout.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype html>
-<title>testharness.js test with long timeout</title>
-<meta name=timeout content=long>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script>
-var t = async_test("Long timeout test");
-setTimeout(t.step_func_done(function() {assert_true(true)}), 15*1000);
-</script>
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/test/testdata/testharness/testharness_timeout.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<!doctype html>
-<title>Simple testharness.js usage</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-// This file should time out, obviously
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/tox.ini
+++ /dev/null
@@ -1,15 +0,0 @@
-[pytest]
-xfail_strict=true
-
-[tox]
-envlist = {py27,pypy}-{base,b2g,chrome,firefox,servo}
-
-[testenv]
-deps =
-     pytest>=2.9
-     -r{toxinidir}/requirements.txt
-     chrome: -r{toxinidir}/requirements_chrome.txt
-     firefox: -r{toxinidir}/requirements_firefox.txt
-     servo: -r{toxinidir}/requirements_servo.txt
-
-commands = py.test []
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner.default.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[products]
-
-[web-platform-tests]
-remote_url = https://github.com/w3c/web-platform-tests.git
-branch = master
-sync_path = %(pwd)s/sync
-
-[manifest:default]
-tests = %(pwd)s/tests
-metadata = %(pwd)s/meta
-url_base = /
\ No newline at end of file
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# 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/.
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# 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/.
-
-"""Subpackage where each product is defined. Each product is created by adding a
-a .py file containing a __wptrunner__ variable in the global scope. This must be
-a dictionary with the fields
-
-"product": Name of the product, assumed to be unique.
-"browser": String indicating the Browser implementation used to launch that
-           product.
-"executor": Dictionary with keys as supported test types and values as the name
-            of the Executor implemantation that will be used to run that test
-            type.
-"browser_kwargs": String naming function that takes product, binary,
-                  prefs_root and the wptrunner.run_tests kwargs dict as arguments
-                  and returns a dictionary of kwargs to use when creating the
-                  Browser class.
-"executor_kwargs": String naming a function that takes http server url and
-                   timeout multiplier and returns kwargs to use when creating
-                   the executor class.
-"env_options": String naming a funtion of no arguments that returns the
-               arguments passed to the TestEnvironment.
-
-All classes and functions named in the above dict must be imported into the
-module global scope.
-"""
-
-product_list = ["chrome",
-                "edge",
-                "firefox",
-                "servo",
-                "servodriver"]
deleted file mode 100644
index f9cbd5300ad650f8369ab02a4adc8866a5f0dea1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/base.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# 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/.
-
-import os
-import platform
-import socket
-from abc import ABCMeta, abstractmethod
-
-from ..wptcommandline import require_arg
-
-here = os.path.split(__file__)[0]
-
-
-def cmd_arg(name, value=None):
-    prefix = "-" if platform.system() == "Windows" else "--"
-    rv = prefix + name
-    if value is not None:
-        rv += "=" + value
-    return rv
-
-
-def get_free_port(start_port, exclude=None):
-    """Get the first port number after start_port (inclusive) that is
-    not currently bound.
-
-    :param start_port: Integer port number at which to start testing.
-    :param exclude: Set of port numbers to skip"""
-    port = start_port
-    while True:
-        if exclude and port in exclude:
-            port += 1
-            continue
-        s = socket.socket()
-        try:
-            s.bind(("127.0.0.1", port))
-        except socket.error:
-            port += 1
-        else:
-            return port
-        finally:
-            s.close()
-
-def browser_command(binary, args, debug_info):
-    if debug_info:
-        if debug_info.requiresEscapedArgs:
-            args = [item.replace("&", "\\&") for item in args]
-        debug_args = [debug_info.path] + debug_info.args
-    else:
-        debug_args = []
-
-    command = [binary] + args
-
-    return debug_args, command
-
-
-class BrowserError(Exception):
-    pass
-
-
-class Browser(object):
-    __metaclass__ = ABCMeta
-
-    process_cls = None
-    init_timeout = 30
-
-    def __init__(self, logger):
-        """Abstract class serving as the basis for Browser implementations.
-
-        The Browser is used in the TestRunnerManager to start and stop the browser
-        process, and to check the state of that process. This class also acts as a
-        context manager, enabling it to do browser-specific setup at the start of
-        the testrun and cleanup after the run is complete.
-
-        :param logger: Structured logger to use for output.
-        """
-        self.logger = logger
-
-    def __enter__(self):
-        self.setup()
-        return self
-
-    def __exit__(self, *args, **kwargs):
-        self.cleanup()
-
-    def setup(self):
-        """Used for browser-specific setup that happens at the start of a test run"""
-        pass
-
-    def settings(self, test):
-        return {}
-
-    @abstractmethod
-    def start(self, **kwargs):
-        """Launch the browser object and get it into a state where is is ready to run tests"""
-        pass
-
-    @abstractmethod
-    def stop(self, force=False):
-        """Stop the running browser process."""
-        pass
-
-    @abstractmethod
-    def pid(self):
-        """pid of the browser process or None if there is no pid"""
-        pass
-
-    @abstractmethod
-    def is_alive(self):
-        """Boolean indicating whether the browser process is still running"""
-        pass
-
-    def setup_ssl(self, hosts):
-        """Return a certificate to use for tests requiring ssl that will be trusted by the browser"""
-        raise NotImplementedError("ssl testing not supported")
-
-    def cleanup(self):
-        """Browser-specific cleanup that is run after the testrun is finished"""
-        pass
-
-    def executor_browser(self):
-        """Returns the ExecutorBrowser subclass for this Browser subclass and the keyword arguments
-        with which it should be instantiated"""
-        return ExecutorBrowser, {}
-
-    def log_crash(self, process, test):
-        """Return a list of dictionaries containing information about crashes that happend
-        in the browser, or an empty list if no crashes occurred"""
-        self.logger.crash(process, test)
-
-
-class NullBrowser(Browser):
-    def __init__(self, logger, **kwargs):
-        super(NullBrowser, self).__init__(logger)
-
-    def start(self, **kwargs):
-        """No-op browser to use in scenarios where the TestRunnerManager shouldn't
-        actually own the browser process (e.g. Servo where we start one browser
-        per test)"""
-        pass
-
-    def stop(self, force=False):
-        pass
-
-    def pid(self):
-        return None
-
-    def is_alive(self):
-        return True
-
-    def on_output(self, line):
-        raise NotImplementedError
-
-
-class ExecutorBrowser(object):
-    def __init__(self, **kwargs):
-        """View of the Browser used by the Executor object.
-        This is needed because the Executor runs in a child process and
-        we can't ship Browser instances between processes on Windows.
-
-        Typically this will have a few product-specific properties set,
-        but in some cases it may have more elaborate methods for setting
-        up the browser from the runner process.
-        """
-        for k, v in kwargs.iteritems():
-            setattr(self, k, v)
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/chrome.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# 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/.
-
-from .base import Browser, ExecutorBrowser, require_arg
-from ..webdriver_server import ChromeDriverServer
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorselenium import (SeleniumTestharnessExecutor,
-                                          SeleniumRefTestExecutor)
-
-
-__wptrunner__ = {"product": "chrome",
-                 "check_args": "check_args",
-                 "browser": "ChromeBrowser",
-                 "executor": {"testharness": "SeleniumTestharnessExecutor",
-                              "reftest": "SeleniumRefTestExecutor"},
-                 "browser_kwargs": "browser_kwargs",
-                 "executor_kwargs": "executor_kwargs",
-                 "env_options": "env_options"}
-
-
-def check_args(**kwargs):
-    require_arg(kwargs, "webdriver_binary")
-
-
-def browser_kwargs(test_type, run_info_data, **kwargs):
-    return {"binary": kwargs["binary"],
-            "webdriver_binary": kwargs["webdriver_binary"]}
-
-
-def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
-                    **kwargs):
-    from selenium.webdriver import DesiredCapabilities
-
-    executor_kwargs = base_executor_kwargs(test_type, server_config,
-                                           cache_manager, **kwargs)
-    executor_kwargs["close_after_done"] = True
-    capabilities = dict(DesiredCapabilities.CHROME.items())
-    capabilities.setdefault("chromeOptions", {})["prefs"] = {
-        "profile": {
-            "default_content_setting_values": {
-                "popups": 1
-            }
-        }
-    }
-    for (kwarg, capability) in [("binary", "binary"), ("binary_args", "args")]:
-        if kwargs[kwarg] is not None:
-            capabilities["chromeOptions"][capability] = kwargs[kwarg]
-    executor_kwargs["capabilities"] = capabilities
-    return executor_kwargs
-
-
-def env_options():
-    return {"host": "web-platform.test",
-            "bind_hostname": "true"}
-
-
-class ChromeBrowser(Browser):
-    """Chrome is backed by chromedriver, which is supplied through
-    ``wptrunner.webdriver.ChromeDriverServer``.
-    """
-
-    def __init__(self, logger, binary, webdriver_binary="chromedriver"):
-        """Creates a new representation of Chrome.  The `binary` argument gives
-        the browser binary to use for testing."""
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.server = ChromeDriverServer(self.logger, binary=webdriver_binary)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=Force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/edge.py
+++ /dev/null
@@ -1,71 +0,0 @@
-# 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/.
-
-from .base import Browser, ExecutorBrowser, require_arg
-from ..webdriver_server import EdgeDriverServer
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorselenium import (SeleniumTestharnessExecutor,
-                                          SeleniumRefTestExecutor)
-
-__wptrunner__ = {"product": "edge",
-                 "check_args": "check_args",
-                 "browser": "EdgeBrowser",
-                 "executor": {"testharness": "SeleniumTestharnessExecutor",
-                              "reftest": "SeleniumRefTestExecutor"},
-                 "browser_kwargs": "browser_kwargs",
-                 "executor_kwargs": "executor_kwargs",
-                 "env_options": "env_options"}
-
-
-def check_args(**kwargs):
-    require_arg(kwargs, "webdriver_binary")
-
-def browser_kwargs(test_type, run_info_data, **kwargs):
-    return {"webdriver_binary": kwargs["webdriver_binary"]}
-
-def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
-                    **kwargs):
-    from selenium.webdriver import DesiredCapabilities
-
-    executor_kwargs = base_executor_kwargs(test_type, server_config,
-                                           cache_manager, **kwargs)
-    executor_kwargs["close_after_done"] = True
-    executor_kwargs["capabilities"] = dict(DesiredCapabilities.EDGE.items())
-    return executor_kwargs
-
-def env_options():
-    return {"host": "web-platform.test",
-            "bind_hostname": "true",
-            "supports_debugger": False}
-
-class EdgeBrowser(Browser):
-    used_ports = set()
-
-    def __init__(self, logger, webdriver_binary):
-        Browser.__init__(self, logger)
-        self.server = EdgeDriverServer(self.logger, binary=webdriver_binary)
-        self.webdriver_host = "localhost"
-        self.webdriver_port = self.server.port
-
-    def start(self, **kwargs):
-        print self.server.url
-        self.server.start()
-
-    def stop(self):
-        self.server.stop()
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the server is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/firefox.py
+++ /dev/null
@@ -1,354 +0,0 @@
-# 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/.
-
-import os
-import platform
-import signal
-import subprocess
-import sys
-
-import mozinfo
-import mozleak
-from mozprocess import ProcessHandler
-from mozprofile import FirefoxProfile, Preferences
-from mozprofile.permissions import ServerLocations
-from mozrunner import FirefoxRunner
-from mozrunner.utils import get_stack_fixer_function
-from mozcrash import mozcrash
-
-from .base import (get_free_port,
-                   Browser,
-                   ExecutorBrowser,
-                   require_arg,
-                   cmd_arg,
-                   browser_command)
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executormarionette import (MarionetteTestharnessExecutor,
-                                            MarionetteRefTestExecutor,
-                                            MarionetteWdspecExecutor)
-from ..environment import hostnames
-
-
-here = os.path.join(os.path.split(__file__)[0])
-
-__wptrunner__ = {"product": "firefox",
-                 "check_args": "check_args",
-                 "browser": "FirefoxBrowser",
-                 "executor": {"testharness": "MarionetteTestharnessExecutor",
-                              "reftest": "MarionetteRefTestExecutor",
-                              "wdspec": "MarionetteWdspecExecutor"},
-                 "browser_kwargs": "browser_kwargs",
-                 "executor_kwargs": "executor_kwargs",
-                 "env_options": "env_options",
-                 "run_info_extras": "run_info_extras",
-                 "update_properties": "update_properties"}
-
-
-def get_timeout_multiplier(test_type, run_info_data, **kwargs):
-    if kwargs["timeout_multiplier"] is not None:
-        return kwargs["timeout_multiplier"]
-    if test_type == "reftest":
-        if run_info_data["debug"] or run_info_data.get("asan"):
-            return 4
-        else:
-            return 2
-    elif run_info_data["debug"] or run_info_data.get("asan"):
-        return 3
-    return 1
-
-
-def check_args(**kwargs):
-    require_arg(kwargs, "binary")
-    if kwargs["ssl_type"] != "none":
-        require_arg(kwargs, "certutil_binary")
-
-
-def browser_kwargs(test_type, run_info_data, **kwargs):
-    return {"binary": kwargs["binary"],
-            "prefs_root": kwargs["prefs_root"],
-            "extra_prefs": kwargs["extra_prefs"],
-            "debug_info": kwargs["debug_info"],
-            "symbols_path": kwargs["symbols_path"],
-            "stackwalk_binary": kwargs["stackwalk_binary"],
-            "certutil_binary": kwargs["certutil_binary"],
-            "ca_certificate_path": kwargs["ssl_env"].ca_cert_path(),
-            "e10s": kwargs["gecko_e10s"],
-            "stackfix_dir": kwargs["stackfix_dir"],
-            "binary_args": kwargs["binary_args"],
-            "timeout_multiplier": get_timeout_multiplier(test_type,
-                                                         run_info_data,
-                                                         **kwargs),
-            "leak_check": kwargs["leak_check"]}
-
-
-def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
-                    **kwargs):
-    executor_kwargs = base_executor_kwargs(test_type, server_config,
-                                           cache_manager, **kwargs)
-    executor_kwargs["close_after_done"] = test_type != "reftest"
-    executor_kwargs["timeout_multiplier"] = get_timeout_multiplier(test_type,
-                                                                   run_info_data,
-                                                                   **kwargs)
-    if test_type == "wdspec":
-        executor_kwargs["webdriver_binary"] = kwargs.get("webdriver_binary")
-        fxOptions = {}
-        if kwargs["binary"]:
-            fxOptions["binary"] = kwargs["binary"]
-        if kwargs["binary_args"]:
-            fxOptions["args"] = kwargs["binary_args"]
-        fxOptions["prefs"] = {
-            "network.dns.localDomains": ",".join(hostnames)
-        }
-        capabilities = {"moz:firefoxOptions": fxOptions}
-        executor_kwargs["capabilities"] = capabilities
-    return executor_kwargs
-
-
-def env_options():
-    return {"host": "127.0.0.1",
-            "external_host": "web-platform.test",
-            "bind_hostname": "false",
-            "certificate_domain": "web-platform.test",
-            "supports_debugger": True}
-
-
-def run_info_extras(**kwargs):
-    return {"e10s": kwargs["gecko_e10s"]}
-
-
-def update_properties():
-    return ["debug", "e10s", "os", "version", "processor", "bits"], {"debug", "e10s"}
-
-
-class FirefoxBrowser(Browser):
-    used_ports = set()
-    init_timeout = 60
-    shutdown_timeout = 60
-
-    def __init__(self, logger, binary, prefs_root, extra_prefs=None, debug_info=None,
-                 symbols_path=None, stackwalk_binary=None, certutil_binary=None,
-                 ca_certificate_path=None, e10s=False, stackfix_dir=None,
-                 binary_args=None, timeout_multiplier=None, leak_check=False):
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.prefs_root = prefs_root
-        self.extra_prefs = extra_prefs
-        self.marionette_port = None
-        self.runner = None
-        self.debug_info = debug_info
-        self.profile = None
-        self.symbols_path = symbols_path
-        self.stackwalk_binary = stackwalk_binary
-        self.ca_certificate_path = ca_certificate_path
-        self.certutil_binary = certutil_binary
-        self.e10s = e10s
-        self.binary_args = binary_args
-        if self.symbols_path and stackfix_dir:
-            self.stack_fixer = get_stack_fixer_function(stackfix_dir,
-                                                        self.symbols_path)
-        else:
-            self.stack_fixer = None
-
-        if timeout_multiplier:
-            self.init_timeout = self.init_timeout * timeout_multiplier
-
-        self.leak_report_file = None
-        self.leak_check = leak_check
-
-    def settings(self, test):
-        return {"check_leaks": self.leak_check and not test.leaks}
-
-    def start(self, **kwargs):
-        if self.marionette_port is None:
-            self.marionette_port = get_free_port(2828, exclude=self.used_ports)
-            self.used_ports.add(self.marionette_port)
-
-        env = os.environ.copy()
-        env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
-
-        locations = ServerLocations(filename=os.path.join(here, "server-locations.txt"))
-
-        preferences = self.load_prefs()
-
-        self.profile = FirefoxProfile(locations=locations,
-                                      preferences=preferences)
-        self.profile.set_preferences({"marionette.port": self.marionette_port,
-                                      "dom.disable_open_during_load": False,
-                                      "network.dns.localDomains": ",".join(hostnames),
-                                      "network.proxy.type": 0,
-                                      "places.history.enabled": False})
-        if self.e10s:
-            self.profile.set_preferences({"browser.tabs.remote.autostart": True})
-
-        if self.leak_check and kwargs.get("check_leaks", True):
-            self.leak_report_file = os.path.join(self.profile.profile, "runtests_leaks.log")
-            if os.path.exists(self.leak_report_file):
-                os.remove(self.leak_report_file)
-            env["XPCOM_MEM_BLOAT_LOG"] = self.leak_report_file
-        else:
-            self.leak_report_file = None
-
-        # Bug 1262954: winxp + e10s, disable hwaccel
-        if (self.e10s and platform.system() in ("Windows", "Microsoft") and
-            '5.1' in platform.version()):
-            self.profile.set_preferences({"layers.acceleration.disabled": True})
-
-        if self.ca_certificate_path is not None:
-            self.setup_ssl()
-
-        debug_args, cmd = browser_command(self.binary,
-                                          self.binary_args if self.binary_args else [] +
-                                          [cmd_arg("marionette"), "about:blank"],
-                                          self.debug_info)
-
-        self.runner = FirefoxRunner(profile=self.profile,
-                                    binary=cmd[0],
-                                    cmdargs=cmd[1:],
-                                    env=env,
-                                    process_class=ProcessHandler,
-                                    process_args={"processOutputLine": [self.on_output]})
-
-        self.logger.debug("Starting Firefox")
-
-        self.runner.start(debug_args=debug_args, interactive=self.debug_info and self.debug_info.interactive)
-        self.logger.debug("Firefox Started")
-
-    def load_prefs(self):
-        prefs = Preferences()
-
-        prefs_path = os.path.join(self.prefs_root, "prefs_general.js")
-        if os.path.exists(prefs_path):
-            prefs.add(Preferences.read_prefs(prefs_path))
-        else:
-            self.logger.warning("Failed to find base prefs file in %s" % prefs_path)
-
-        # Add any custom preferences
-        prefs.add(self.extra_prefs, cast=True)
-
-        return prefs()
-
-    def stop(self, force=False):
-        if self.runner is not None and self.runner.is_running():
-            try:
-                # For Firefox we assume that stopping the runner prompts the
-                # browser to shut down. This allows the leak log to be written
-                for clean, stop_f in [(True, lambda: self.runner.wait(self.shutdown_timeout)),
-                                      (False, lambda: self.runner.stop(signal.SIGTERM)),
-                                      (False, lambda: self.runner.stop(signal.SIGKILL))]:
-                    if not force or not clean:
-                        retcode = stop_f()
-                        if retcode is not None:
-                            self.logger.info("Browser exited with return code %s" % retcode)
-                            break
-            except OSError:
-                # This can happen on Windows if the process is already dead
-                pass
-        self.logger.debug("stopped")
-
-    def process_leaks(self):
-        self.logger.debug("PROCESS LEAKS %s" % self.leak_report_file)
-        if self.leak_report_file is None:
-            return
-        mozleak.process_leak_log(
-            self.leak_report_file,
-            leak_thresholds={
-                "default": 0,
-                "tab": 10000,  # See dependencies of bug 1051230.
-                # GMP rarely gets a log, but when it does, it leaks a little.
-                "geckomediaplugin": 20000,
-            },
-            ignore_missing_leaks=["geckomediaplugin"],
-            log=self.logger,
-            stack_fixer=self.stack_fixer
-        )
-
-    def pid(self):
-        if self.runner.process_handler is None:
-            return None
-
-        try:
-            return self.runner.process_handler.pid
-        except AttributeError:
-            return None
-
-    def on_output(self, line):
-        """Write a line of output from the firefox process to the log"""
-        data = line.decode("utf8", "replace")
-        if self.stack_fixer:
-            data = self.stack_fixer(data)
-        self.logger.process_output(self.pid(),
-                                   data,
-                                   command=" ".join(self.runner.command))
-
-    def is_alive(self):
-        if self.runner:
-            return self.runner.is_running()
-        return False
-
-    def cleanup(self):
-        self.stop()
-        self.process_leaks()
-
-    def executor_browser(self):
-        assert self.marionette_port is not None
-        return ExecutorBrowser, {"marionette_port": self.marionette_port}
-
-    def log_crash(self, process, test):
-        dump_dir = os.path.join(self.profile.profile, "minidumps")
-
-        mozcrash.log_crashes(self.logger,
-                             dump_dir,
-                             symbols_path=self.symbols_path,
-                             stackwalk_binary=self.stackwalk_binary,
-                             process=process,
-                             test=test)
-
-    def setup_ssl(self):
-        """Create a certificate database to use in the test profile. This is configured
-        to trust the CA Certificate that has signed the web-platform.test server
-        certificate."""
-
-        self.logger.info("Setting up ssl")
-
-        # Make sure the certutil libraries from the source tree are loaded when using a
-        # local copy of certutil
-        # TODO: Maybe only set this if certutil won't launch?
-        env = os.environ.copy()
-        certutil_dir = os.path.dirname(self.binary)
-        if mozinfo.isMac:
-            env_var = "DYLD_LIBRARY_PATH"
-        elif mozinfo.isUnix:
-            env_var = "LD_LIBRARY_PATH"
-        else:
-            env_var = "PATH"
-
-
-        env[env_var] = (os.path.pathsep.join([certutil_dir, env[env_var]])
-                        if env_var in env else certutil_dir).encode(
-                                sys.getfilesystemencoding() or 'utf-8', 'replace')
-
-        def certutil(*args):
-            cmd = [self.certutil_binary] + list(args)
-            self.logger.process_output("certutil",
-                                       subprocess.check_output(cmd,
-                                                               env=env,
-                                                               stderr=subprocess.STDOUT),
-                                       " ".join(cmd))
-
-        pw_path = os.path.join(self.profile.profile, ".crtdbpw")
-        with open(pw_path, "w") as f:
-            # Use empty password for certificate db
-            f.write("\n")
-
-        cert_db_path = self.profile.profile
-
-        # Create a new certificate db
-        certutil("-N", "-d", cert_db_path, "-f", pw_path)
-
-        # Add the CA certificate to the database and mark as trusted to issue server certs
-        certutil("-A", "-d", cert_db_path, "-f", pw_path, "-t", "CT,,",
-                 "-n", "web-platform-tests", "-i", self.ca_certificate_path)
-
-        # List all certs in the database
-        certutil("-L", "-d", cert_db_path)
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/server-locations.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-# 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/.
-
-# See /build/pgo/server-locations.txt for documentation on the format
-
-http://localhost:8000    primary
-
-http://web-platform.test:8000
-http://www.web-platform.test:8000
-http://www1.web-platform.test:8000
-http://www2.web-platform.test:8000
-http://xn--n8j6ds53lwwkrqhv28a.web-platform.test:8000
-http://xn--lve-6lad.web-platform.test:8000
-
-http://web-platform.test:8001
-http://www.web-platform.test:8001
-http://www1.web-platform.test:8001
-http://www2.web-platform.test:8001
-http://xn--n8j6ds53lwwkrqhv28a.web-platform.test:8001
-http://xn--lve-6lad.web-platform.test:8001
-
-https://web-platform.test:8443
-https://www.web-platform.test:8443
-https://www1.web-platform.test:8443
-https://www2.web-platform.test:8443
-https://xn--n8j6ds53lwwkrqhv28a.web-platform.test:8443
-https://xn--lve-6lad.web-platform.test:8443
-
-# These are actually ws servers, but until mozprofile is
-# fixed we have to pretend that they are http servers
-http://web-platform.test:8888
-http://www.web-platform.test:8888
-http://www1.web-platform.test:8888
-http://www2.web-platform.test:8888
-http://xn--n8j6ds53lwwkrqhv28a.web-platform.test:8888
-http://xn--lve-6lad.web-platform.test:8888
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/servo.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# 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/.
-
-import os
-
-from .base import NullBrowser, ExecutorBrowser, require_arg
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorservo import ServoTestharnessExecutor, ServoRefTestExecutor, ServoWdspecExecutor
-
-here = os.path.join(os.path.split(__file__)[0])
-
-__wptrunner__ = {
-    "product": "servo",
-    "check_args": "check_args",
-    "browser": "ServoBrowser",
-    "executor": {
-        "testharness": "ServoTestharnessExecutor",
-        "reftest": "ServoRefTestExecutor",
-        "wdspec": "ServoWdspecExecutor",
-    },
-    "browser_kwargs": "browser_kwargs",
-    "executor_kwargs": "executor_kwargs",
-    "env_options": "env_options",
-    "update_properties": "update_properties",
-}
-
-
-def check_args(**kwargs):
-    require_arg(kwargs, "binary")
-
-
-def browser_kwargs(test_type, run_info_data, **kwargs):
-    return {
-        "binary": kwargs["binary"],
-        "debug_info": kwargs["debug_info"],
-        "binary_args": kwargs["binary_args"],
-        "user_stylesheets": kwargs.get("user_stylesheets"),
-    }
-
-
-def executor_kwargs(test_type, server_config, cache_manager, run_info_data,
-                    **kwargs):
-    rv = base_executor_kwargs(test_type, server_config,
-                              cache_manager, **kwargs)
-    rv["pause_after_test"] = kwargs["pause_after_test"]
-    return rv
-
-
-def env_options():
-    return {"host": "127.0.0.1",
-            "external_host": "web-platform.test",
-            "bind_hostname": "true",
-            "testharnessreport": "testharnessreport-servo.js",
-            "supports_debugger": True}
-
-
-def update_properties():
-    return ["debug", "os", "version", "processor", "bits"], None
-
-
-class ServoBrowser(NullBrowser):
-    def __init__(self, logger, binary, debug_info=None, binary_args=None,
-                 user_stylesheets=None):
-        NullBrowser.__init__(self, logger)
-        self.binary = binary
-        self.debug_info = debug_info
-        self.binary_args = binary_args or []
-        self.user_stylesheets = user_stylesheets or []
-
-    def executor_browser(self):
-        return ExecutorBrowser, {
-            "binary": self.binary,
-            "debug_info": self.debug_info,
-            "binary_args": self.binary_args,
-            "user_stylesheets": self.user_stylesheets,
-        }
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/browsers/servodriver.py
+++ /dev/null
@@ -1,164 +0,0 @@
-# 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/.
-
-import os
-import subprocess
-import tempfile
-
-from mozprocess import ProcessHandler
-
-from .base import Browser, require_arg, get_free_port, browser_command, ExecutorBrowser
-from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorservodriver import (ServoWebDriverTestharnessExecutor,
-                                             ServoWebDriverRefTestExecutor)
-
-here = os.path.join(os.path.split(__file__)[0])
-
-__wptrunner__ = {
-    "product": "servodriver",
-    "check_args": "check_args",
-    "browser": "ServoWebDriverBrowser",
-    "executor": {
-        "testharness": "ServoWebDriverTestharnessExecutor",
-        "reftest": "ServoWebDriverRefTestExecutor",
-    },
-    "browser_kwargs": "browser_kwargs",
-    "executor_kwargs": "executor_kwargs",
-    "env_options": "env_options",
-    "update_properties": "update_properties",
-}
-
-hosts_text = """127.0.0.1 web-platform.test
-127.0.0.1 www.web-platform.test
-127.0.0.1 www1.web-platform.test
-127.0.0.1 www2.web-platform.test
-127.0.0.1 xn--n8j6ds53lwwkrqhv28a.web-platform.test
-127.0.0.1 xn--lve-6lad.web-platform.test
-"""
-
-
-def check_args(**kwargs):
-    require_arg(kwargs, "binary")
-
-
-def browser_kwargs(test_type, run_info_data, **kwargs):
-    return {
-        "binary": kwargs["binary"],
-        "debug_info": kwargs["debug_info"],
-        "user_stylesheets": kwargs.get("user_stylesheets"),
-    }
-
-
-def executor_kwargs(test_type, server_config, cache_manager, run_info_data, **kwargs):
-    rv = base_executor_kwargs(test_type, server_config,
-                              cache_manager, **kwargs)
-    return rv
-
-
-def env_options():
-    return {"host": "127.0.0.1",
-            "external_host": "web-platform.test",
-            "bind_hostname": "true",
-            "testharnessreport": "testharnessreport-servodriver.js",
-            "supports_debugger": True}
-
-
-def update_properties():
-    return ["debug", "os", "version", "processor", "bits"], None
-
-
-def make_hosts_file():
-    hosts_fd, hosts_path = tempfile.mkstemp()
-    with os.fdopen(hosts_fd, "w") as f:
-        f.write(hosts_text)
-    return hosts_path
-
-
-class ServoWebDriverBrowser(Browser):
-    used_ports = set()
-
-    def __init__(self, logger, binary, debug_info=None, webdriver_host="127.0.0.1",
-                 user_stylesheets=None):
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.webdriver_host = webdriver_host
-        self.webdriver_port = None
-        self.proc = None
-        self.debug_info = debug_info
-        self.hosts_path = make_hosts_file()
-        self.command = None
-        self.user_stylesheets = user_stylesheets if user_stylesheets else []
-
-    def start(self, **kwargs):
-        self.webdriver_port = get_free_port(4444, exclude=self.used_ports)
-        self.used_ports.add(self.webdriver_port)
-
-        env = os.environ.copy()
-        env["HOST_FILE"] = self.hosts_path
-        env["RUST_BACKTRACE"] = "1"
-
-        debug_args, command = browser_command(
-            self.binary,
-            [
-                "--hard-fail",
-                "--webdriver", str(self.webdriver_port),
-                "about:blank",
-            ],
-            self.debug_info
-        )
-
-        for stylesheet in self.user_stylesheets:
-            command += ["--user-stylesheet", stylesheet]
-
-        self.command = command
-
-        self.command = debug_args + self.command
-
-        if not self.debug_info or not self.debug_info.interactive:
-            self.proc = ProcessHandler(self.command,
-                                       processOutputLine=[self.on_output],
-                                       env=env,
-                                       storeOutput=False)
-            self.proc.run()
-        else:
-            self.proc = subprocess.Popen(self.command, env=env)
-
-        self.logger.debug("Servo Started")
-
-    def stop(self, force=False):
-        self.logger.debug("Stopping browser")
-        if self.proc is not None:
-            try:
-                self.proc.kill()
-            except OSError:
-                # This can happen on Windows if the process is already dead
-                pass
-
-    def pid(self):
-        if self.proc is None:
-            return None
-
-        try:
-            return self.proc.pid
-        except AttributeError:
-            return None
-
-    def on_output(self, line):
-        """Write a line of output from the process to the log"""
-        self.logger.process_output(self.pid(),
-                                   line.decode("utf8", "replace"),
-                                   command=" ".join(self.command))
-
-    def is_alive(self):
-        if self.runner:
-            return self.runner.is_running()
-        return False
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        assert self.webdriver_port is not None
-        return ExecutorBrowser, {"webdriver_host": self.webdriver_host,
-                                 "webdriver_port": self.webdriver_port}
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/config.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# 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/.
-
-import ConfigParser
-import os
-import sys
-from collections import OrderedDict
-
-here = os.path.split(__file__)[0]
-
-class ConfigDict(dict):
-    def __init__(self, base_path, *args, **kwargs):
-        self.base_path = base_path
-        dict.__init__(self, *args, **kwargs)
-
-    def get_path(self, key, default=None):
-        if key not in self:
-            return default
-        path = self[key]
-        os.path.expanduser(path)
-        return os.path.abspath(os.path.join(self.base_path, path))
-
-def read(config_path):
-    config_path = os.path.abspath(config_path)
-    config_root = os.path.split(config_path)[0]
-    parser = ConfigParser.SafeConfigParser()
-    success = parser.read(config_path)
-    assert config_path in success, success
-
-    subns = {"pwd": os.path.abspath(os.path.curdir)}
-
-    rv = OrderedDict()
-    for section in parser.sections():
-        rv[section] = ConfigDict(config_root)
-        for key in parser.options(section):
-            rv[section][key] = parser.get(section, key, False, subns)
-
-    return rv
-
-def path(argv=None):
-    if argv is None:
-        argv = []
-    path = None
-
-    for i, arg in enumerate(argv):
-        if arg == "--config":
-            if i + 1 < len(argv):
-                path = argv[i + 1]
-        elif arg.startswith("--config="):
-            path = arg.split("=", 1)[1]
-        if path is not None:
-            break
-
-    if path is None:
-        if os.path.exists("wptrunner.ini"):
-            path = os.path.abspath("wptrunner.ini")
-        else:
-            path = os.path.join(here, "..", "wptrunner.default.ini")
-
-    return os.path.abspath(path)
-
-def load():
-    return read(path(sys.argv))
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/environment.py
+++ /dev/null
@@ -1,214 +0,0 @@
-# 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/.
-
-import json
-import os
-import multiprocessing
-import signal
-import socket
-import sys
-import time
-
-from mozlog import get_default_logger, handlers
-
-from wptlogging import LogLevelRewriter
-
-here = os.path.split(__file__)[0]
-
-serve = None
-sslutils = None
-
-
-hostnames = ["web-platform.test",
-             "www.web-platform.test",
-             "www1.web-platform.test",
-             "www2.web-platform.test",
-             "xn--n8j6ds53lwwkrqhv28a.web-platform.test",
-             "xn--lve-6lad.web-platform.test"]
-
-
-def do_delayed_imports(logger, test_paths):
-    global serve, sslutils
-
-    serve_root = serve_path(test_paths)
-    sys.path.insert(0, serve_root)
-
-    failed = []
-
-    try:
-        from tools.serve import serve
-    except ImportError:
-        from wpt_tools.serve import serve
-    except ImportError:
-        failed.append("serve")
-
-    try:
-        import sslutils
-    except ImportError:
-        failed.append("sslutils")
-
-    if failed:
-        logger.critical(
-            "Failed to import %s. Ensure that tests path %s contains web-platform-tests" %
-            (", ".join(failed), serve_root))
-        sys.exit(1)
-
-
-def serve_path(test_paths):
-    return test_paths["/"]["tests_path"]
-
-
-def get_ssl_kwargs(**kwargs):
-    if kwargs["ssl_type"] == "openssl":
-        args = {"openssl_binary": kwargs["openssl_binary"]}
-    elif kwargs["ssl_type"] == "pregenerated":
-        args = {"host_key_path": kwargs["host_key_path"],
-                "host_cert_path": kwargs["host_cert_path"],
-                 "ca_cert_path": kwargs["ca_cert_path"]}
-    else:
-        args = {}
-    return args
-
-
-def ssl_env(logger, **kwargs):
-    ssl_env_cls = sslutils.environments[kwargs["ssl_type"]]
-    return ssl_env_cls(logger, **get_ssl_kwargs(**kwargs))
-
-
-class TestEnvironmentError(Exception):
-    pass
-
-
-class TestEnvironment(object):
-    def __init__(self, test_paths, ssl_env, pause_after_test, debug_info, options):
-        """Context manager that owns the test environment i.e. the http and
-        websockets servers"""
-        self.test_paths = test_paths
-        self.ssl_env = ssl_env
-        self.server = None
-        self.config = None
-        self.external_config = None
-        self.pause_after_test = pause_after_test
-        self.test_server_port = options.pop("test_server_port", True)
-        self.debug_info = debug_info
-        self.options = options if options is not None else {}
-
-        self.cache_manager = multiprocessing.Manager()
-        self.stash = serve.stash.StashServer()
-
-
-    def __enter__(self):
-        self.stash.__enter__()
-        self.ssl_env.__enter__()
-        self.cache_manager.__enter__()
-        self.setup_server_logging()
-        self.config = self.load_config()
-        serve.set_computed_defaults(self.config)
-        self.external_config, self.servers = serve.start(self.config, self.ssl_env,
-                                                         self.get_routes())
-        if self.options.get("supports_debugger") and self.debug_info and self.debug_info.interactive:
-            self.ignore_interrupts()
-        return self
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-        self.process_interrupts()
-        for scheme, servers in self.servers.iteritems():
-            for port, server in servers:
-                server.kill()
-        self.cache_manager.__exit__(exc_type, exc_val, exc_tb)
-        self.ssl_env.__exit__(exc_type, exc_val, exc_tb)
-        self.stash.__exit__()
-
-    def ignore_interrupts(self):
-        signal.signal(signal.SIGINT, signal.SIG_IGN)
-
-    def process_interrupts(self):
-        signal.signal(signal.SIGINT, signal.SIG_DFL)
-
-    def load_config(self):
-        default_config_path = os.path.join(serve_path(self.test_paths), "config.default.json")
-        local_config_path = os.path.join(here, "config.json")
-
-        with open(default_config_path) as f:
-            default_config = json.load(f)
-
-        with open(local_config_path) as f:
-            data = f.read()
-            local_config = json.loads(data % self.options)
-
-        #TODO: allow non-default configuration for ssl
-
-        local_config["external_host"] = self.options.get("external_host", None)
-        local_config["ssl"]["encrypt_after_connect"] = self.options.get("encrypt_after_connect", False)
-
-        config = serve.merge_json(default_config, local_config)
-        config["doc_root"] = serve_path(self.test_paths)
-
-        if not self.ssl_env.ssl_enabled:
-            config["ports"]["https"] = [None]
-
-        host = self.options.get("certificate_domain", config["host"])
-        hosts = [host]
-        hosts.extend("%s.%s" % (item[0], host) for item in serve.get_subdomains(host).values())
-        key_file, certificate = self.ssl_env.host_cert_path(hosts)
-
-        config["key_file"] = key_file
-        config["certificate"] = certificate
-
-        return config
-
-    def setup_server_logging(self):
-        server_logger = get_default_logger(component="wptserve")
-        assert server_logger is not None
-        log_filter = handlers.LogLevelFilter(lambda x:x, "info")
-        # Downgrade errors to warnings for the server
-        log_filter = LogLevelRewriter(log_filter, ["error"], "warning")
-        server_logger.component_filter = log_filter
-
-        try:
-            #Set as the default logger for wptserve
-            serve.set_logger(server_logger)
-            serve.logger = server_logger
-        except Exception:
-            # This happens if logging has already been set up for wptserve
-            pass
-
-    def get_routes(self):
-        route_builder = serve.RoutesBuilder()
-
-        for path, format_args, content_type, route in [
-                ("testharness_runner.html", {}, "text/html", "/testharness_runner.html"),
-                (self.options.get("testharnessreport", "testharnessreport.js"),
-                 {"output": self.pause_after_test}, "text/javascript",
-                 "/resources/testharnessreport.js")]:
-            path = os.path.normpath(os.path.join(here, path))
-            route_builder.add_static(path, format_args, content_type, route)
-
-        for url_base, paths in self.test_paths.iteritems():
-            if url_base == "/":
-                continue
-            route_builder.add_mount_point(url_base, paths["tests_path"])
-
-        if "/" not in self.test_paths:
-            del route_builder.mountpoint_routes["/"]
-
-        return route_builder.get_routes()
-
-    def ensure_started(self):
-        # Pause for a while to ensure that the server has a chance to start
-        time.sleep(2)
-        for scheme, servers in self.servers.iteritems():
-            for port, server in servers:
-                if self.test_server_port:
-                    s = socket.socket()
-                    try:
-                        s.connect((self.config["host"], port))
-                    except socket.error:
-                        raise EnvironmentError(
-                            "%s server on port %d failed to start" % (scheme, port))
-                    finally:
-                        s.close()
-
-                if not server.is_alive():
-                    raise EnvironmentError("%s server on port %d failed to start" % (scheme, port))
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/executors/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# 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/.
-
-from base import (executor_kwargs,
-                  testharness_result_converter,
-                  reftest_result_converter,
-                  TestExecutor)
deleted file mode 100644
--- a/testing/web-platform/harness/wptrunner/executors/base.py
+++ /dev/null
@@ -1,329 +0,0 @@
-# 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/.
-
-import hashlib
-import json
-import os
-import traceback
-import urlparse
-from abc import ABCMeta, abstractmethod
-
-from ..testrunner import Stop
-
-here = os.path.split(__file__)[0]
-
-
-def executor_kwargs(test_type, server_config, cache_manager, **kwargs):
-    timeout_multiplier = kwargs["timeout_multiplier"]
-    if timeout_multiplier is None:
-        timeout_multiplier = 1
-
-    executor_kwargs = {"server_config": server_config,
-                       "timeout_multiplier": timeout_multiplier,
-                       "debug_info": kwargs["debug_info"]}
-
-    if test_type == "reftest":
-        executor_kwargs["screenshot_cache"] = cache_manager.dict()
-
-    return executor_kwargs
-
-
-def strip_server(url):
-    """Remove the scheme and netloc from a url, leaving only the path and any query
-    or fragment.
-
-    url - the url to strip
-
-    e.g. http://example.org:8000/tests?id=1#2 becomes /tests?id=1#2"""
-
-    url_parts = list(urlparse.urlsplit(url))
-    url_parts[0] = ""
-    url_parts[1] = ""
-    return urlparse.urlunsplit(url_parts)
-
-
-class TestharnessResultConverter(object):
-    harness_codes = {0: "OK",
-                     1: "ERROR",
-                     2: "TIMEOUT"}
-
-    test_codes = {0: "PASS",
-                  1: "FAIL",
-                  2: "TIMEOUT",
-                  3: "NOTRUN"}
-
-    def __call__(self, test, result):
-        """Convert a JSON result into a (TestResult, [SubtestResult]) tuple"""
-        result_url, status, message, stack, subtest_results = result
-        assert result_url == test.url, ("Got results from %s, expected %s" %
-                                      (result_url, test.url))
-        harness_result = test.result_cls(self.harness_codes[status], message)
-        return (harness_result,
-                [test.subtest_result_cls(name, self.test_codes[status], message, stack)
-                 for name, status, message, stack in subtest_results])
-
-
-testharness_result_converter = TestharnessResultConverter()
-
-
-def reftest_result_converter(self, test, result):
-    return (test.result_cls(result["status"], result["message"],
-                            extra=result.get("extra")), [])
-
-
-def pytest_result_converter(self, test, data):
-    harness_data, subtest_data = data
-
-    if subtest_data is None:
-        subtest_data = []
-
-    harness_result = test.result_cls(*harness_data)
-    subtest_results = [test.subtest_result_cls(*item) for item in subtest_data]
-
-    return (harness_result, subtest_results)
-
-
-class ExecutorException(Exception):
-    def __init__(self, status, message):
-        self.status = status
-        self.message = message
-
-
-class TestExecutor(object):
-    __metaclass__ = ABCMeta
-
-    test_type = None
-    convert_result = None
-
-    def __init__(self, browser, server_config, timeout_multiplier=1,
-                 debug_info=None):
-        """Abstract Base class for object that actually executes the tests in a
-        specific browser. Typically there will be a different TestExecutor
-        subclass for each test type and method of executing tests.
-
-        :param browser: ExecutorBrowser instance providing properties of the
-                        browser that will be tested.
-        :param server_config: Dictionary of wptserve server configuration of the
-                              form stored in TestEnvironment.external_config
-        :param timeout_multiplier: Multiplier relative to base timeout to use
-                                   when setting test timeout.
-        """
-        self.runner = None
-        self.browser = browser
-        self.server_config = server_config
-        self.timeout_multiplier = timeout_multiplier
-        self.debug_info = debug_info
-        self.last_environment = {"protocol": "http",
-                                 "prefs": {}}
-        self.protocol = None # This must be set in subclasses
-
-    @property
-    def logger(self):
-        """StructuredLogger for this executor"""
-        if self.runner is not None:
-            return self.runner.logger
-
-    def setup(self, runner):
-        ""