diff --git a/.gitignore b/.gitignore
index 5cbae5037da5124630eb42cfceabf872f259e029..1ffa1209dd3c3b326515d2e4c8187e182274a3cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -90,6 +90,9 @@ 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
 
diff --git a/.hgignore b/.hgignore
index 9948907586c2ebaa7b5b8b28aceb49477af4ff4a..a79e9f56435d6ef11d350a8d83c497153d06090d 100644
--- a/.hgignore
+++ b/.hgignore
@@ -98,6 +98,9 @@ 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
 
diff --git a/testing/web-platform/README.md b/testing/web-platform/README.md
index b8e353dcf5aefc8838a84344b080a326b5ac9227..4ed178870ec445ab23d03ef4c22ec2a2201933a5 100644
--- a/testing/web-platform/README.md
+++ b/testing/web-platform/README.md
@@ -235,45 +235,14 @@ 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:
+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:
 
-1. Download the chromedriver binary and place it somewhere sensible
-   e.g. `~/bin`
+    mach wpt --product chrome dom/historical.html
 
-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:
-
-        [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.
diff --git a/testing/web-platform/mach_commands.py b/testing/web-platform/mach_commands.py
index 0f85d1eb7b9fb9c6d7678218f2b956ad824d6d4d..3826b2494e3dc74fe1b67e0c4ec63aa385f4321c 100644
--- a/testing/web-platform/mach_commands.py
+++ b/testing/web-platform/mach_commands.py
@@ -28,7 +28,7 @@ class InvalidTestPathError(Exception):
 class WebPlatformTestsRunner(MozbuildObject):
     """Run web platform tests."""
 
-    def setup_kwargs(self, kwargs):
+    def setup_kwargs_firefox(self, kwargs):
         from wptrunner import wptcommandline
 
         build_path = os.path.join(self.topobjdir, 'build')
@@ -67,10 +67,50 @@ class WebPlatformTestsRunner(MozbuildObject):
 
         kwargs = wptcommandline.check_args(kwargs)
 
+    def setup_kwargs_wptrun(self, kwargs):
+        from wptrunner import wptcommandline
+        here = os.path.join(self.topsrcdir, 'testing', 'web-platform')
+
+        sys.path.insert(0, os.path.join(here, "tests", "tools"))
+
+        import wptrun
+
+        setup_func = {
+            "chrome": wptrun.setup_chrome,
+            "edge": wptrun.setup_edge,
+            "servo": wptrun.setup_servo,
+        }[kwargs["product"]]
+
+        setup_func(wptrun.virtualenv.Virtualenv(self.virtualenv_manager.virtualenv_root),
+                   kwargs,
+                   True)
+
+        kwargs["tests_root"] = os.path.join(here, "tests")
+
+        if kwargs["metadata_root"] is None:
+            metadir = os.path.join(here, "products", kwargs["product"])
+            if not os.path.exists(metadir):
+                os.makedirs(metadir)
+            kwargs["metadata_root"] = metadir
+
+        src_manifest = os.path.join(here, "meta", "MANIFEST.json")
+        dest_manifest = os.path.join(kwargs["metadata_root"], "MANIFEST.json")
+
+        if not os.path.exists(dest_manifest) and os.path.exists(src_manifest):
+            with open(src_manifest) as src, open(dest_manifest, "w") as dest:
+                dest.write(src.read())
+
+        kwargs = wptcommandline.check_args(kwargs)
+
     def run_tests(self, **kwargs):
         from wptrunner import wptrunner
 
-        self.setup_kwargs(kwargs)
+        if kwargs["product"] in ["firefox", None]:
+            self.setup_kwargs_firefox(kwargs)
+        elif kwargs["product"] in ("chrome", "edge", "servo"):
+            self.setup_kwargs_wptrun(kwargs)
+        else:
+            raise ValueError("Unknown product %s" % kwargs["product"])
 
         logger = wptrunner.setup_logging(kwargs, {"mach": sys.stdout})
         result = wptrunner.run_tests(**kwargs)
@@ -258,7 +298,7 @@ class WPTManifestUpdater(MozbuildObject):
 
 def create_parser_wpt():
     from wptrunner import wptcommandline
-    return wptcommandline.create_parser(["firefox"])
+    return wptcommandline.create_parser(["firefox", "chrome", "edge", "servo"])
 
 def create_parser_update():
     from update import updatecommandline
diff --git a/testing/web-platform/products/README b/testing/web-platform/products/README
new file mode 100644
index 0000000000000000000000000000000000000000..81a111472e7313478ad6ca11f664b8d8baa2cb1d
--- /dev/null
+++ b/testing/web-platform/products/README
@@ -0,0 +1,3 @@
+This directory is for storing metadata files when running
+web-platform-tests with non-firefox browsers. By default all
+subdirectories here are ignored in VCS.
\ No newline at end of file
diff --git a/testing/web-platform/tests/tools/wptrunner/requirements_firefox.txt b/testing/web-platform/tests/tools/wptrunner/requirements_firefox.txt
index 379e522acc458db2804d72ec86b436ad15aa3b25..d8d268f127bd13ff203eca329531c8a0ea81bdd1 100644
--- a/testing/web-platform/tests/tools/wptrunner/requirements_firefox.txt
+++ b/testing/web-platform/tests/tools/wptrunner/requirements_firefox.txt
@@ -3,3 +3,4 @@ mozprofile >= 0.21
 mozprocess >= 0.19
 mozcrash >= 0.13
 mozrunner >= 6.7
+mozleak >= 0.1
diff --git a/testing/web-platform/wptrunner.ini b/testing/web-platform/wptrunner.ini
index 08c0d551c854a980822e6eaa59a69c5849c9d0fd..2d403ccebbe24cac7597e7fcc592b639ed8b2d16 100644
--- a/testing/web-platform/wptrunner.ini
+++ b/testing/web-platform/wptrunner.ini
@@ -1,5 +1,8 @@
 [products]
 firefox =
+chrome =
+edge =
+servo =
 
 [web-platform-tests]
 remote_url = https://github.com/w3c/web-platform-tests.git