Added new Sec-Metadata Web Platform Tests.

Added tests for:
- object, embed,
- font
- style
- redirect
- report
- xslt
- sharedworker
- worker
- serviceworker
- track
- audio, video tests are unstable and will be available in my GH repo (https://github.com/mtrzos/wpt/tree/sec-metadata-media/fetch/sec-metadata)

Bug: 860710, 860715
Change-Id: I177dfe39629fb704e4e66a90981c279f4d8d8eb1
Reviewed-on: https://chromium-review.googlesource.com/1129238
Reviewed-by: Mike West <mkwst@chromium.org>
Commit-Queue: Mike West <mkwst@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578341}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub-expected.txt
new file mode 100644
index 0000000..fca807a2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL Same-Origin embed assert_equals: cause expected (undefined) undefined but got (string) "forced"
+FAIL Same-Site embed assert_equals: cause expected (undefined) undefined but got (string) "forced"
+FAIL Cross-Site embed assert_equals: cause expected (undefined) undefined but got (string) "forced"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub.html
new file mode 100644
index 0000000..70accac
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/embed.tentative.https.sub.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+<script>
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-same-origin";
+
+      let e = document.createElement('embed');
+      e.src = "https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"embed", "target":"subresource", "site":"same-origin"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin embed");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-same-site";
+
+      let e = document.createElement('embed');
+      e.src = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"embed", "target":"subresource", "site":"same-site"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site embed");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "embed-cross-site";
+
+      let e = document.createElement('embed');
+      e.src = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"embed", "target":"subresource", "site":"cross-site"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site embed");
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/font.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/font.tentative.https.sub.html
new file mode 100644
index 0000000..679ff81
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/font.tentative.https.sub.html
@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <div id="test1">1</div>
+  <div id="test2">2</div>
+  <div id="test3">3</div>
+  <!-- Same-Origin request -->
+  <style>
+    @font-face {
+      font-family: myFirstFont;
+      src: url(https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=font-same-origin);
+    }
+    #test1 {
+      font-family: myFirstFont;
+    }
+  </style>
+
+  <!-- Same-Site request -->
+  <style>
+    @font-face {
+      font-family: mySecondFont;
+      src: url(https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=font-same-site);
+    }
+    #test2 {
+      font-family: mySecondFont;
+    }
+  </style>
+
+  <!-- Cross-Site request -->
+  <style>
+    @font-face {
+      font-family: myThirdFont;
+      src: url(https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=font-cross-site);
+    }
+    #test3 {
+      font-family: myThirdFont;
+    }
+  </style>
+</body>
+<script>
+  document.fonts.ready.then(function () {
+    test_same_origin();
+    test_same_site();
+    test_cross_site();
+  });
+
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Origin font");
+    same_origin_test.step(function () {
+        key = "font-same-origin";
+        expected_same_origin = {"destination":"font", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("PUT", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+
+  function test_same_site(){
+    var same_site_test = async_test("Same-Site font");
+    same_site_test.step(function () {
+        key = "font-same-site";
+        expected_same_site = {"destination":"font", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+
+  function test_cross_site(){
+    var cross_site_test = async_test("Cross-Site font");
+    cross_site_test.step(function () {
+        key = "font-cross-site";
+        expected_cross_site = {"destination":"font", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub-expected.txt
new file mode 100644
index 0000000..668a1fb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL Same-Origin object assert_equals: cause expected (undefined) undefined but got (string) "forced"
+FAIL Same-Site object assert_equals: cause expected (undefined) undefined but got (string) "forced"
+FAIL Cross-Site object assert_equals: cause expected (undefined) undefined but got (string) "forced"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub.html
new file mode 100644
index 0000000..7bd2504
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/object.tentative.https.sub.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+<script>
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-same-origin";
+
+      let e = document.createElement('object');
+      e.data = "https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"object", "target":"subresource", "site":"same-origin"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Origin object");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-same-site";
+
+      let e = document.createElement('object');
+      e.data = "https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"object", "target":"subresource", "site":"same-site"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Same-Site object");
+
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "object-cross-site";
+
+      let e = document.createElement('object');
+      e.data = "https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=" + key;
+      e.onload = e => {
+        let expected = {"destination":"object", "target":"subresource", "site":"cross-site"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+
+      document.body.appendChild(e);
+    })
+  }, "Cross-Site object");
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html
new file mode 100644
index 0000000..37b75f2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/cross-site.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <!-- redirect Cross-Site -> Cross-Site -->
+  <img onload="test_cross_site()" onerror="test_cross_site()" src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-cross-site-cross-site"></img>
+</body>
+
+<script>
+  function test_cross_site(){
+    var cross_site_test = async_test("Cross-Site -> Cross-Site redirect");
+    cross_site_test.step(function () {
+        filename = "redirect-cross-site-cross-site";
+        expected_cross_site = {"destination":"image", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html
new file mode 100644
index 0000000..2af262e7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-origin.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Cross-Site -> Same-Origin  -->
+  <img onload="test_same_origin()" onerror="test_same_origin()" src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-cross-site-same-origin"></img>
+</body>
+
+<script>
+  function test_same_origin(){
+    var same_origin_test = async_test("Cross-Site -> Same-Origin redirect");
+    same_origin_test.step(function () {
+        filename = "redirect-cross-site-same-origin";
+        expected_same_origin = {"destination":"image", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html
new file mode 100644
index 0000000..77054496
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/cross-site/same-site.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <!-- redirect Cross-Site -> Same-Site  -->
+  <img onload="test_same_site()" onerror="test_same_site()" src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-cross-site-same-site"></img>
+</body>
+
+<script>
+  function test_same_site(){
+    var same_site_test = async_test("Cross-Site -> Same-Site redirect");
+    same_site_test.step(function () {
+        filename = "redirect-cross-site-same-site";
+        expected_same_site = {"destination":"image", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html
new file mode 100644
index 0000000..5a76bc9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/cross-site.tentative.https.sub.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <!-- redirect Same-Origin -> Cross-Site -->
+  <img onload="test_cross_site()" onerror="test_cross_site()" src="https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-origin-cross-site"></img>
+</body>
+
+<script>
+  function test_cross_site(){
+    var cross_site_test = async_test("Same-Origin -> Cross-Site redirect");
+    cross_site_test.step(function () {
+        filename = "redirect-same-origin-cross-site";
+        expected_cross_site = {"destination":"image", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html
new file mode 100644
index 0000000..3735c5fc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-origin.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Same-Origin -> Same-Origin  -->
+  <img onload="test_same_origin()" onerror="test_same_origin()" src="https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-origin-same-origin"></img>
+</body>
+
+<script>
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Origin -> Same-Origin redirect");
+    same_origin_test.step(function () {
+        filename = "redirect-same-origin-same-origin";
+        expected_same_origin = {"destination":"image", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html
new file mode 100644
index 0000000..1e24752
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-origin/same-site.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Same-Origin -> Same-Site  -->
+  <img onload="test_same_site()" onerror="test_same_site()" src="https://{{host}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-origin-same-site"></img>
+</body>
+
+<script>
+  function test_same_site(){
+    var same_site_test = async_test("Same-Origin -> Same-Site redirect");
+    same_site_test.step(function () {
+        filename = "redirect-same-origin-same-site";
+        expected_same_site = {"destination":"image", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + filename);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html
new file mode 100644
index 0000000..986e3f3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/cross-site.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Same-Site -> Cross-Site -->
+  <img onload="test_cross_site()" onerror="test_cross_site()" src="https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-site-cross-site"></img>
+</body>
+
+<script>
+  function test_cross_site(){
+    var cross_site_test = async_test("Same-Site -> Cross-Site redirect");
+    cross_site_test.step(function () {
+        key = "redirect-same-site-cross-site";
+        expected_cross_site = {"destination":"image", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html
new file mode 100644
index 0000000..dbe3fea
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-origin.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Same-Site -> Same-Origin  -->
+  <img onload="test_same_origin()" onerror="test_same_origin()" src="https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-site-same-origin"></img>
+</body>
+
+<script>
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Site -> Same-Origin redirect");
+    same_origin_test.step(function () {
+        key = "redirect-same-site-same-origin";
+        expected_same_origin = {"destination":"image", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html
new file mode 100644
index 0000000..c6437f0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/redirect/same-site/same-site.tentative.https.sub.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+
+  <!-- redirect Same-Site -> Same-Site  -->
+  <img onload="test_same_site()" onerror="test_same_site()" src="https://{{hosts[][www]}}:{{ports[https][0]}}/xhr/resources/redirect.py?location=https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=redirect-same-site-same-site"></img>
+</body>
+
+<script>
+  function test_same_site(){
+    var same_site_test = async_test("Same-Site -> Same-Site redirect");
+    same_site_test.step(function () {
+        key = "redirect-same-site-same-site";
+        expected_same_site = {"destination":"image", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html
new file mode 100644
index 0000000..d82dab9
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<link id="style" href="https://foo.bar" rel="stylesheet">
+<body></body>
+<script>
+  let counter = 0;
+  document.addEventListener("securitypolicyviolation", (e) => {
+    counter++;
+    if (counter == 3) {
+      promise_test(t => {
+        expected = {"destination":"report", "target":"subresource", "site":"same-origin"};
+        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-same-origin")
+            .then(response => response.text())
+            .then(text => assert_header_equals(text, expected));
+      }, "Same-Origin report");
+
+      promise_test(t => {
+        expected = {"destination":"report", "target":"subresource", "site":"same-site"};
+        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-same-site")
+            .then(response => response.text())
+            .then(text => assert_header_equals(text, expected));
+      }, "Same-site report");
+
+      promise_test(t => {
+        expected = {"destination":"report", "target":"subresource", "site":"cross-site"};
+        return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=report-cross-site")
+            .then(response => response.text())
+            .then(text => assert_header_equals(text, expected));
+      }, "Cross-site report");
+    }
+  });
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html.sub.headers b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html.sub.headers
new file mode 100644
index 0000000..5c8bc58
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/report.tentative.https.sub.html.sub.headers
@@ -0,0 +1,3 @@
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri /fetch/sec-metadata/resources/record-header.py?file=report-same-origin
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=report-same-site
+Content-Security-Policy: style-src 'self' 'unsafe-inline'; report-uri https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=report-cross-site
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/dedicatedWorker.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/dedicatedWorker.js
new file mode 100644
index 0000000..18626d3d
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/dedicatedWorker.js
@@ -0,0 +1 @@
+self.postMessage("Loaded");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/helper.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/helper.js
index 03d2d2d..cbd96d06 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/helper.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/helper.js
@@ -9,9 +9,18 @@
 }
 
 function assert_header_equals(value, expected) {
+  // check that the returned value is an object, not a String
+  assert_not_equals(value, "", "Empty Sec-Metadata header.");
   let result = parse_metadata(value);
   assert_equals(result.cause, expected.cause, "cause");
   assert_equals(result.destination, expected.destination, "destination");
   assert_equals(result.target, expected.target, "target");
   assert_equals(result.site, expected.site, "site");
 }
+
+function verify_response(xhr, test, expected){
+  if (xhr.readyState === 4) {
+    assert_header_equals(xhr.responseText, expected);
+    test.done();
+  }
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/record-header.py b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/record-header.py
new file mode 100644
index 0000000..06157e4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/record-header.py
@@ -0,0 +1,114 @@
+import os
+import uuid
+import hashlib
+import time
+
+resourcePath = os.getcwd() + "/fetch/sec-metadata/resources/"
+
+def main(request, response):
+
+  ## Get the query parameter (key) from URL ##
+  ## Tests will record POST requests (CSP Report) and GET (rest) ##
+  if request.GET:
+    key = request.GET['file']
+  elif request.POST:
+    key = request.POST['file']
+
+  ## Convert the key from String to UUID valid String ##
+  testId = hashlib.md5(key).hexdigest()
+
+  ## Handle the header retrieval request ##
+  if 'retrieve' in request.GET:
+    response.writer.write_status(200)
+    response.writer.end_headers()
+    header_value = request.server.stash.take(testId)
+    if header_value != None:
+      response.writer.write(header_value)
+
+    response.close_connection = True
+
+  ## Record incoming Sec-Metadata header value
+  else:
+    ## Return empty string as a default value ##
+    header = request.headers.get("Sec-Metadata", "")
+    try:
+      request.server.stash.put(testId, header)
+    except KeyError:
+      ## The header is already recorded
+      pass
+
+    ## Prevent the browser from caching returned responses and allow CORS ##
+    response.headers.set("Access-Control-Allow-Origin", "*")
+    response.headers.set("Cache-Control", "no-cache, no-store, must-revalidate")
+    response.headers.set("Pragma", "no-cache")
+    response.headers.set("Expires", "0")
+
+    ## Add a valid ServiceWorker Content-Type ##
+    if key.startswith("serviceworker"):
+      response.headers.set("Content-Type", "application/javascript")
+
+    ## Return a valid .vtt content for the <track> tag ##
+    if key.startswith("track"):
+      return "WEBVTT"
+
+    ## Return a valid SharedWorker ##
+    if key.startswith("sharedworker"):
+      response.headers.set("Content-Type", "application/javascript")
+      file = open(resourcePath + "sharedWorker.js", "r")
+      shared_worker = file.read()
+      file.close()
+      return shared_worker
+
+    ## Return a valid font content and Content-Type ##
+    if key.startswith("font"):
+      file = open("fonts/Ahem.ttf", "r")
+      font = file.read()
+      file.close()
+      return font
+
+    ## Return a valid audio content and Content-Type ##
+    if key.startswith("audio"):
+      response.headers.set("Content-Type", "audio/mpeg")
+      file = open("media/sound_5.mp3", "r")
+      audio = file.read()
+      file.close()
+      return audio
+
+    ## Return a valid video content and Content-Type ##
+    if key.startswith("video"):
+      response.headers.set("Content-Type", "video/mp4")
+      file = open("media/A4.mp4", "r")
+      video = file.read()
+      file.close()
+      return video
+
+    ## Return a valid style content and Content-Type ##
+    if key.startswith("style") or key.startswith("embed") or key.startswith("object"):
+      response.headers.set("Content-Type", "text/html")
+      return "<html>EMBED!</html>"
+
+    ## Return a valid image content and Content-Type for redirect requests ##
+    if key.startswith("redirect"):
+      response.headers.set("Content-Type", "image/jpeg")
+      file = open("media/1x1-green.png", "r")
+      image = file.read()
+      file.close()
+      return image
+
+    ## Return a valid dedicated worker
+    if key.startswith("worker"):
+      response.headers.set("Content-Type", "application/javascript")
+      return "self.postMessage('loaded');"
+
+    ## Return a valid XSLT
+    if key.startswith("xslt"):
+      response.headers.set("Content-Type", "text/xsl")
+      return """<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>
+  </xsl:template>
+</xsl:stylesheet>"""
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/sharedWorker.js b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/sharedWorker.js
new file mode 100644
index 0000000..5eb89cb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/sharedWorker.js
@@ -0,0 +1,9 @@
+onconnect = function(e) {
+  var port = e.ports[0];
+
+  port.addEventListener('message', function(e) {
+    port.postMessage("Ready");
+  });
+
+  port.start();
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/xslt-test.sub.xml b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/xslt-test.sub.xml
new file mode 100644
index 0000000..4beb9af
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/resources/xslt-test.sub.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=xslt-same-origin" type="text/xsl" ?>
+<?xml-stylesheet href="https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=xslt-same-site" type="text/xsl" ?>
+<?xml-stylesheet href="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=xslt-cross-site" type="text/xsl" ?>
+
+<!-- postMessage parent back when the resources are loaded -->
+<script xmlns="http://www.w3.org/1999/xhtml"><![CDATA[
+  setTimeout(function(){
+    if (window.opener)
+        window.opener.postMessage("", "*");
+    if (window.top != window)
+        window.top.postMessage("", "*");}, 100);
+]]></script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/serviceworker.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/serviceworker.tentative.https.sub.html
new file mode 100644
index 0000000..25e8f67
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/serviceworker.tentative.https.sub.html
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<meta charset="utf-8"/>
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <script>
+      if ('serviceWorker' in navigator) {
+        window.addEventListener('load', function() {
+          navigator.serviceWorker.register('/fetch/sec-metadata/resources/record-header.py?file=serviceworker-same-origin').then(function(registration) {
+            test_same_origin();
+
+            // uninstall the serviceworker after the test
+            navigator.serviceWorker.getRegistrations().then(function(registrations) {
+              for(let registration of registrations) {
+                registration.unregister()
+              }
+            })
+          }, function(err) {
+            // registration failed
+          });
+        });
+      }
+      else {
+        test(function () {
+              done();
+            }, "Browser does not support serviceworker");
+      }
+  </script>
+</body>
+
+<script>
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Origin serviceworker");
+    same_origin_test.step(function () {
+        key = "serviceworker-same-origin";
+        expected_same_origin = {"destination":"serviceworker", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub.html
new file mode 100644
index 0000000..98cb601
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/sharedworker.tentative.https.sub.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<script>
+
+  // TESTS //
+  if (window.Worker) {
+
+      //  Same-Origin test
+      var sharedWorker = new SharedWorker('/fetch/sec-metadata/resources/record-header.py?file=sharedworker-same-origin');
+      sharedWorker.port.start();
+
+      sharedWorker.onerror = function(){
+        test_same_origin();
+      }
+      sharedWorker.port.onmessage = function(e) {
+        test_same_origin();
+      }
+      sharedWorker.port.postMessage("Ready");
+    }
+
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Origin sharedworker");
+    same_origin_test.step(function () {
+        key = "sharedworker-same-origin";
+        expected_same_origin = {"destination":"sharedworker", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+</script>
+<body></body>
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/style.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/style.tentative.https.sub.html
new file mode 100644
index 0000000..e832b91
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/style.tentative.https.sub.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<script>
+  function test_same_origin() {
+    var same_origin_test = async_test("Same-Origin style");
+    same_origin_test.step(function () {
+        key = "style-same-origin";
+        expected_same_origin = {"destination":"style", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+
+  function test_same_site() {
+    var same_site_test = async_test("Same-Site style");
+    same_site_test.step(function () {
+        key = "style-same-site";
+        expected_same_site = {"destination":"style", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+
+  function test_cross_site() {
+    var cross_site_test = async_test("Cross-Site style");
+    cross_site_test.step(function () {
+        key = "style-cross-site";
+        expected_cross_site = {"destination":"style", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
+<body>
+  <!-- Same-Origin request -->
+  <link href="https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=style-same-origin"
+  rel="stylesheet" onload="test_same_origin()" onerror="test_same_origin()">
+
+  <!-- Same-Site request -->
+  <link href="https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=style-same-site"
+  rel="stylesheet" onload="test_same_site()" onerror="test_same_site()">
+
+  <!-- Cross-Site request -->
+  <link href="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=style-cross-site"
+  rel="stylesheet" onload="test_cross_site()" onerror="test_cross_site()">
+</body>
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/track.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/track.tentative.https.sub.html
new file mode 100644
index 0000000..299b53b77
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/track.tentative.https.sub.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<body>
+  <!-- Same-Origin request -->
+  <video src="/media/movie_5.mp4" controls>
+    <track default kind="captions" src="https://{{host}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=track-same-origin"
+    srclang="en" onload="test_same_origin()">
+  </video>
+
+  <!-- Same-Site request -->
+  <video src="/media/movie_5.mp4" controls crossorigin>
+    <track default kind="captions" src="https://{{hosts[][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=track-same-site"
+    srclang="pl" onload="test_same_site()">
+  </video>
+
+  <!-- Cross-Site request -->
+  <video src="/media/movie_5.mp4" controls crossorigin>
+    <track default kind="captions" src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fetch/sec-metadata/resources/record-header.py?file=track-cross-site"
+    srclang="de" onload="test_cross_site()">
+  </video>
+</body>
+
+<script>
+  function test_same_origin(){
+    var same_origin_test = async_test("Same-Origin track");
+    same_origin_test.step(function () {
+        key = "track-same-origin";
+        expected_same_origin = {"destination":"track", "target":"subresource", "site":"same-origin"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_origin_xhr = new XMLHttpRequest();
+        same_origin_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_origin_xhr.onreadystatechange = same_origin_test.step_func(function () {
+          verify_response(same_origin_xhr, same_origin_test, expected_same_origin)
+        });
+        same_origin_xhr.send();
+    });
+  }
+
+  function test_same_site(){
+    var same_site_test = async_test("Same-Site track");
+    same_site_test.step(function () {
+        key = "track-same-site";
+        expected_same_site = {"destination":"track", "target":"subresource", "site":"same-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        same_site_xhr = new XMLHttpRequest();
+        same_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        same_site_xhr.onreadystatechange = same_site_test.step_func(function () {
+          verify_response(same_site_xhr, same_site_test, expected_same_site)
+        });
+        same_site_xhr.send();
+    });
+  }
+
+  function test_cross_site(){
+    var cross_site_test = async_test("Cross-Site track");
+    cross_site_test.step(function () {
+        key = "track-cross-site";
+        expected_cross_site = {"destination":"track", "target":"subresource", "site":"cross-site"};
+
+        //  Requests from the server the saved value of the Sec-Metadata header
+        cross_site_xhr = new XMLHttpRequest();
+        cross_site_xhr.open("GET", "/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key);
+
+        // Async test step triggered when the response is loaded
+        cross_site_xhr.onreadystatechange = cross_site_test.step_func(function () {
+          verify_response(cross_site_xhr, cross_site_test, expected_cross_site)
+        });
+        cross_site_xhr.send();
+    });
+  }
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/worker.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/worker.tentative.https.sub.html
new file mode 100644
index 0000000..ac809c6e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/worker.tentative.https.sub.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<script>
+  promise_test(t => {
+    return new Promise((resolve, reject) => {
+      let key = "worker-same-origin";
+      let w = new Worker("/fetch/sec-metadata/resources/record-header.py?file=" + key);
+      w.onmessage = e => {
+        let expected = {"destination":"worker", "target":"subresource", "site":"same-origin"};
+        fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=" + key)
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected))
+          .then(_ => resolve())
+          .catch(e => reject(e));
+      };
+    });
+  }, "Same-Origin worker");
+</script>
+<body></body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub-expected.txt
new file mode 100644
index 0000000..d6d6e51f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+PASS Same-Origin xslt
+FAIL Same-site xslt assert_not_equals: Empty Sec-Metadata header. got disallowed value ""
+FAIL Cross-site xslt assert_not_equals: Empty Sec-Metadata header. got disallowed value ""
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub.html
new file mode 100644
index 0000000..2fe8c91
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/sec-metadata/xslt.tentative.https.sub.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+
+<link rel="author" href="mtrzos@google.com" title="Maciek Trzos">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=/fetch/sec-metadata/resources/helper.js></script>
+<script>
+  // Open a window with XML document which loads resources via <?xml-stylesheet/> tag
+  let w = window.open("resources/xslt-test.sub.xml");
+  window.addEventListener('message', function(e) {
+    if (e.source != w)
+      return;
+
+    promise_test(t => {
+      let expected = {"destination":"xslt", "target":"subresource", "site":"same-origin"};
+      return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=xslt-same-origin")
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected));
+    }, "Same-Origin xslt");
+
+    promise_test(t => {
+      let expected = {"destination":"xslt", "target":"subresource", "site":"same-site"};
+      return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=xslt-same-site")
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected));
+    }, "Same-site xslt");
+
+    promise_test(t => {
+      let expected = {"destination":"xslt", "target":"subresource", "site":"cross-site"};
+      return fetch("/fetch/sec-metadata/resources/record-header.py?retrieve=true&file=xslt-cross-site")
+          .then(response => response.text())
+          .then(text => assert_header_equals(text, expected));
+    }, "Cross-site xslt");
+
+    w.close();
+  });
+
+</script>
diff --git a/third_party/blink/renderer/core/loader/base_fetch_context.cc b/third_party/blink/renderer/core/loader/base_fetch_context.cc
index 5caccb1..34146950 100644
--- a/third_party/blink/renderer/core/loader/base_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/base_fetch_context.cc
@@ -65,6 +65,8 @@
       return "object";
     case WebURLRequest::kRequestContextScript:
       return "script";
+    case WebURLRequest::kRequestContextServiceWorker:
+      return "serviceworker";
     case WebURLRequest::kRequestContextSharedWorker:
       return "sharedworker";
     case WebURLRequest::kRequestContextStyle:
@@ -80,7 +82,6 @@
     case WebURLRequest::kRequestContextImport:
     case WebURLRequest::kRequestContextInternal:
     case WebURLRequest::kRequestContextPlugin:
-    case WebURLRequest::kRequestContextServiceWorker:
       return "unknown";
   }
   NOTREACHED();