Title: [204019] trunk
Revision
204019
Author
[email protected]
Date
2016-08-02 00:20:23 -0700 (Tue, 02 Aug 2016)

Log Message

[Fetch API] Add support to ReferrerPolicy
https://bugs.webkit.org/show_bug.cgi?id=160404

Patch by Youenn Fablet <[email protected]> on 2016-08-02
Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

* web-platform-tests/fetch/api/basic/referrer-expected.txt: Added.
* web-platform-tests/fetch/api/basic/referrer-worker-expected.txt: Added.
* web-platform-tests/fetch/api/basic/referrer-worker.html: Added.
* web-platform-tests/fetch/api/basic/referrer.html: Added.
* web-platform-tests/fetch/api/basic/referrer.js: Added.
(runTest):
* web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt:
* web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt:
* web-platform-tests/fetch/api/cors/cors-preflight-referrer.js:
(corsPreflightReferrer): fix infrastructure bug in test and fix expected referrer policy in default case.
* web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt:

Source/WebCore:

Tests: imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html
       imported/w3c/web-platform-tests/fetch/api/basic/referrer.html

Refactored ThreadableLoader API to take more references.

Updated loading code in CachedResource to take into account referrer policy, that can be set by fetch API.
To enable correct handling of OriginWhenCrossOrigin policy, the computation of the cross-origin status of a request is
moved from ResourceLoader to CachedResource.

Referrer is passed to the loading code through HTTP headers.
This was triggering preflighting for Workers request as WorkerThreadableLoader was setting the referrer.
It is now done in DocumentThreadableLoader::loadRequest so that preflighting is done before setting the referrer.
Note that this referrer setting is only a way to pass a specific referrer value to the loading code.
CachedResource code will compute the actual referer value based on the referrer policy.
It might be good in the future to have a different way of conveying this information to CachedResource, maybe
through CachedResourceRequest.

* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::start): Refactoring of ThreadableLoader API.
* Modules/fetch/FetchRequest.cpp:
(WebCore::FetchRequest::internalRequest): Setting referrer if it has a specific value.
* fileapi/FileReaderLoader.cpp:
(WebCore::FileReaderLoader::start): Ractoring of ThreadableLoader API.
* loader/CrossOriginPreflightChecker.cpp:
(WebCore::CrossOriginPreflightChecker::startPreflight): Set referrer in the preflight request if any.
(WebCore::CrossOriginPreflightChecker::doPreflight): Ditto.
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::loadResourceSynchronously): Refactoring of ThreadableLoader API.
(WebCore::DocumentThreadableLoader::create): Ditto.
(WebCore::DocumentThreadableLoader::DocumentThreadableLoader): Ditto.
(WebCore::DocumentThreadableLoader::loadRequest): Ditto.
* loader/DocumentThreadableLoader.h:
(WebCore::DocumentThreadableLoader::referrer): Storing referrer in case one is defined.
* loader/SubresourceLoader.cpp:
(WebCore::SubresourceLoader::init): Removing of cross origin computation since it is done earlier in CachedResource.
* loader/ThreadableLoader.cpp:
(WebCore::ThreadableLoader::create): Refactoring of ThreadableLoader API.
(WebCore::ThreadableLoader::loadResourceSynchronously): Ditto.
* loader/ThreadableLoader.h:
* loader/ThreadableLoaderClientWrapper.h:
(WebCore::ThreadableLoaderClientWrapper::create): Ditto.
(WebCore::ThreadableLoaderClientWrapper::ThreadableLoaderClientWrapper): Ditto.
* loader/WorkerThreadableLoader.cpp:
(WebCore::WorkerThreadableLoader::WorkerThreadableLoader): Ditto.
(WebCore::WorkerThreadableLoader::loadResourceSynchronously): Removing setting of referrer in header and passing
it as a parameter.
(WebCore::WorkerThreadableLoader::MainThreadBridge::MainThreadBridge): Ditto.
* loader/WorkerThreadableLoader.h:
(WebCore::WorkerThreadableLoader::create): Refactoring of ThreadableLoader API.
* loader/cache/CachedResource.cpp:
(WebCore::addAdditionalRequestHeadersToRequest): Computation of referrer based on referrer policy.
(WebCore::CachedResource::addAdditionalRequestHeaders): Ditto.
(WebCore::CachedResource::load): Computation of cross origin status.
(WebCore::CachedResource::varyHeaderValuesMatch):
* loader/cache/CachedResource.h:
(WebCore::CachedResource::options):
* page/EventSource.cpp:
(WebCore::EventSource::connect): Refactoring of ThreadableLoader API.
* workers/WorkerScriptLoader.cpp:
(WebCore::WorkerScriptLoader::loadSynchronously): Ditto.
(WebCore::WorkerScriptLoader::loadAsynchronously): Ditto.
* xml/XMLHttpRequest.cpp:
(WebCore::XMLHttpRequest::createRequest): Ditto.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (204018 => 204019)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,3 +1,22 @@
+2016-08-02  Youenn Fablet  <[email protected]>
+
+        [Fetch API] Add support to ReferrerPolicy
+        https://bugs.webkit.org/show_bug.cgi?id=160404
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/fetch/api/basic/referrer-expected.txt: Added.
+        * web-platform-tests/fetch/api/basic/referrer-worker-expected.txt: Added.
+        * web-platform-tests/fetch/api/basic/referrer-worker.html: Added.
+        * web-platform-tests/fetch/api/basic/referrer.html: Added.
+        * web-platform-tests/fetch/api/basic/referrer.js: Added.
+        (runTest):
+        * web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt:
+        * web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt:
+        * web-platform-tests/fetch/api/cors/cors-preflight-referrer.js:
+        (corsPreflightReferrer): fix infrastructure bug in test and fix expected referrer policy in default case.
+        * web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt:
+
 2016-08-01  Youenn Fablet  <[email protected]>
 
         Make wpt server generate its certificates in layout test results folder

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-expected.txt (0 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-expected.txt	2016-08-02 07:20:23 UTC (rev 204019)
@@ -0,0 +1,4 @@
+
+PASS origin-when-cross-origin policy on a same-origin URL 
+PASS origin-when-cross-origin policy on a cross-origin URL 
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker-expected.txt (0 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker-expected.txt	2016-08-02 07:20:23 UTC (rev 204019)
@@ -0,0 +1,4 @@
+
+PASS origin-when-cross-origin policy on a same-origin URL 
+PASS origin-when-cross-origin policy on a cross-origin URL 
+

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html (0 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html	2016-08-02 07:20:23 UTC (rev 204019)
@@ -0,0 +1,17 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Fetch in worker: same-origin mode</title>
+    <meta name="help" href=""
+    <meta name="help" href=""
+    <meta name="author" title="Canon Research France" href=""
+    <script src=""
+    <script src=""
+  </head>
+  <body>
+    <script>
+      fetch_tests_from_worker(new Worker("referrer.js"));
+    </script>
+  </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.html (0 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.html	2016-08-02 07:20:23 UTC (rev 204019)
@@ -0,0 +1,17 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>Fetch: same-origin mode</title>
+    <meta name="help" href=""
+    <meta name="help" href=""
+    <meta name="author" title="Canon Research France" href=""
+    <script src=""
+    <script src=""
+  </head>
+  <body>
+    <script src=""
+    <script src=""
+    <script src=""
+  </body>
+</html>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.js (0 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.js	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.js	2016-08-02 07:20:23 UTC (rev 204019)
@@ -0,0 +1,25 @@
+if (this.document === undefined) {
+  importScripts("/resources/testharness.js");
+  importScripts("../resources/utils.js");
+  importScripts("../resources/get-host-info.sub.js")
+}
+
+function runTest(url, init, expectedReferrer, title) {
+    promise_test(function(test) {
+        return fetch(url , init).then(function(resp) {
+            assert_equals(resp.status, 200, "HTTP status is 200");
+            assert_equals(resp.headers.get("x-request-referer"), expectedReferrer, "Request's referrer is correct");
+        });
+  }, title);
+}
+
+var fetchedUrl = RESOURCES_DIR + "inspect-headers.py?headers=referer";
+var corsFetchedUrl = get_host_info().HTTP_REMOTE_ORIGIN  + dirname(location.pathname) + RESOURCES_DIR + "inspect-headers.py?headers=referer&cors";
+var redirectUrl = RESOURCES_DIR + "redirect.py?location=" ;
+var corsRedirectUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "redirect.py?location=";
+
+runTest(fetchedUrl, { referrerPolicy: "origin-when-cross-origin"}, location.toString(), "origin-when-cross-origin policy on a same-origin URL");
+runTest(corsFetchedUrl, { referrerPolicy: "origin-when-cross-origin"}, get_host_info().HTTP_ORIGIN + "/", "origin-when-cross-origin policy on a cross-origin URL");
+
+done();
+

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt (204018 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,7 +1,7 @@
 
-FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: "" promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object "TypeError: Type error"
+PASS Referrer policy: no-referrer 
+PASS Referrer policy: "" 
+PASS Referrer policy: origin 
+PASS Referrer policy: origin-when-cross-origin 
+PASS Referrer policy: unsafe-url 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt (204018 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,7 +1,7 @@
 
-FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: "" promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object "TypeError: Type error"
-FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object "TypeError: Type error"
+PASS Referrer policy: no-referrer 
+PASS Referrer policy: "" 
+PASS Referrer policy: origin 
+PASS Referrer policy: origin-when-cross-origin 
+PASS Referrer policy: unsafe-url 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js (204018 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,6 +1,7 @@
 if (this.document === undefined) {
   importScripts("/resources/testharness.js");
   importScripts("/common/utils.js");
+  importScripts("../resources/get-host-info.sub.js");
   importScripts("../resources/utils.js");
 }
 
@@ -21,17 +22,18 @@
         assert_equals(resp.status, 200, "Response's status is 200");
         assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made");
         assert_equals(resp.headers.get("x-preflight-referrer"), expectedReferrer, "Preflight's referrer is correct");
-        assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's refferer is correct");
+        assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's referrer is correct");
       });
     });
   }, desc);
 }
 
-var corsUrl = "http://{{host}}:{{ports[http][1]}}" + dirname(location.pathname) + RESOURCES_DIR + "preflight.py";
-var origin = "http://{{host}}:{{ports[http][0]}}";
+var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN  + dirname(location.pathname) + RESOURCES_DIR + "preflight.py";
+var origin = get_host_info().HTTP_ORIGIN + "/";
 
 corsPreflightReferrer("Referrer policy: no-referrer", corsUrl, "no-referrer", "");
-corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", "");
+corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", location.toString())
+
 corsPreflightReferrer("Referrer policy: origin", corsUrl, "origin", origin);
 corsPreflightReferrer("Referrer policy: origin-when-cross-origin", corsUrl, "origin-when-cross-origin", origin);
 corsPreflightReferrer("Referrer policy: unsafe-url", corsUrl, "unsafe-url", location.toString());

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt (204018 => 204019)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt	2016-08-02 07:20:23 UTC (rev 204019)
@@ -7,10 +7,10 @@
 PASS CORS [PATCH], server refuses 
 PASS CORS [NEW], server allows 
 PASS CORS [NEW], server refuses 
-FAIL CORS [GET] [x-test-header: allowed], server allows assert_equals: Access-Control-Allow-Headers value expected "x-test-header1" but got "referer,x-test-header1"
+PASS CORS [GET] [x-test-header: allowed], server allows 
 PASS CORS [GET] [x-test-header: refused], server refuses 
-FAIL CORS [GET] [several headers], server allows assert_equals: Access-Control-Allow-Headers value expected "content-type,x-test-header-a,x-test-header-b,x-test-header-c,x-test-header-d,x-test-header1,x-test-header2,x-test-header3" but got "content-type,referer,x-test-header-a,x-test-header-b,x-test-header-c,x-test-header-d,x-test-header1,x-test-header2,x-test-header3"
+PASS CORS [GET] [several headers], server allows 
 PASS CORS [GET] [several headers], server refuses 
-FAIL CORS [PUT] [several headers], server allows assert_equals: Access-Control-Allow-Headers value expected "content-type,x-test-header-a,x-test-header-b,x-test-header-c,x-test-header-d,x-test-header1,x-test-header2,x-test-header3" but got "content-type,referer,x-test-header-a,x-test-header-b,x-test-header-c,x-test-header-d,x-test-header1,x-test-header2,x-test-header3"
+PASS CORS [PUT] [several headers], server allows 
 PASS CORS [PUT] [several headers], server refuses 
 

Modified: trunk/Source/WebCore/ChangeLog (204018 => 204019)


--- trunk/Source/WebCore/ChangeLog	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/ChangeLog	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,3 +1,74 @@
+2016-08-02  Youenn Fablet  <[email protected]>
+
+        [Fetch API] Add support to ReferrerPolicy
+        https://bugs.webkit.org/show_bug.cgi?id=160404
+
+        Reviewed by Alex Christensen.
+
+        Tests: imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html
+               imported/w3c/web-platform-tests/fetch/api/basic/referrer.html
+
+        Refactored ThreadableLoader API to take more references.
+
+        Updated loading code in CachedResource to take into account referrer policy, that can be set by fetch API.
+        To enable correct handling of OriginWhenCrossOrigin policy, the computation of the cross-origin status of a request is
+        moved from ResourceLoader to CachedResource.
+
+        Referrer is passed to the loading code through HTTP headers.
+        This was triggering preflighting for Workers request as WorkerThreadableLoader was setting the referrer.
+        It is now done in DocumentThreadableLoader::loadRequest so that preflighting is done before setting the referrer.
+        Note that this referrer setting is only a way to pass a specific referrer value to the loading code.
+        CachedResource code will compute the actual referer value based on the referrer policy.
+        It might be good in the future to have a different way of conveying this information to CachedResource, maybe
+        through CachedResourceRequest.
+
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::start): Refactoring of ThreadableLoader API.
+        * Modules/fetch/FetchRequest.cpp:
+        (WebCore::FetchRequest::internalRequest): Setting referrer if it has a specific value.
+        * fileapi/FileReaderLoader.cpp:
+        (WebCore::FileReaderLoader::start): Ractoring of ThreadableLoader API.
+        * loader/CrossOriginPreflightChecker.cpp:
+        (WebCore::CrossOriginPreflightChecker::startPreflight): Set referrer in the preflight request if any.
+        (WebCore::CrossOriginPreflightChecker::doPreflight): Ditto.
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::loadResourceSynchronously): Refactoring of ThreadableLoader API.
+        (WebCore::DocumentThreadableLoader::create): Ditto.
+        (WebCore::DocumentThreadableLoader::DocumentThreadableLoader): Ditto.
+        (WebCore::DocumentThreadableLoader::loadRequest): Ditto.
+        * loader/DocumentThreadableLoader.h:
+        (WebCore::DocumentThreadableLoader::referrer): Storing referrer in case one is defined.
+        * loader/SubresourceLoader.cpp:
+        (WebCore::SubresourceLoader::init): Removing of cross origin computation since it is done earlier in CachedResource.
+        * loader/ThreadableLoader.cpp:
+        (WebCore::ThreadableLoader::create): Refactoring of ThreadableLoader API.
+        (WebCore::ThreadableLoader::loadResourceSynchronously): Ditto.
+        * loader/ThreadableLoader.h:
+        * loader/ThreadableLoaderClientWrapper.h:
+        (WebCore::ThreadableLoaderClientWrapper::create): Ditto.
+        (WebCore::ThreadableLoaderClientWrapper::ThreadableLoaderClientWrapper): Ditto.
+        * loader/WorkerThreadableLoader.cpp:
+        (WebCore::WorkerThreadableLoader::WorkerThreadableLoader): Ditto.
+        (WebCore::WorkerThreadableLoader::loadResourceSynchronously): Removing setting of referrer in header and passing
+        it as a parameter.
+        (WebCore::WorkerThreadableLoader::MainThreadBridge::MainThreadBridge): Ditto.
+        * loader/WorkerThreadableLoader.h:
+        (WebCore::WorkerThreadableLoader::create): Refactoring of ThreadableLoader API.
+        * loader/cache/CachedResource.cpp:
+        (WebCore::addAdditionalRequestHeadersToRequest): Computation of referrer based on referrer policy.
+        (WebCore::CachedResource::addAdditionalRequestHeaders): Ditto.
+        (WebCore::CachedResource::load): Computation of cross origin status.
+        (WebCore::CachedResource::varyHeaderValuesMatch):
+        * loader/cache/CachedResource.h:
+        (WebCore::CachedResource::options):
+        * page/EventSource.cpp:
+        (WebCore::EventSource::connect): Refactoring of ThreadableLoader API.
+        * workers/WorkerScriptLoader.cpp:
+        (WebCore::WorkerScriptLoader::loadSynchronously): Ditto.
+        (WebCore::WorkerScriptLoader::loadAsynchronously): Ditto.
+        * xml/XMLHttpRequest.cpp:
+        (WebCore::XMLHttpRequest::createRequest): Ditto.
+
 2016-08-02  Brady Eidson  <[email protected]>
 
         Refactor data passed along for a "GetRecord" request.

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -67,7 +67,7 @@
     options.mode = FetchOptions::Mode::SameOrigin;
     options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce;
 
-    m_loader = ThreadableLoader::create(&context, this, WTFMove(request), options);
+    m_loader = ThreadableLoader::create(context, *this, WTFMove(request), options);
     m_isStarted = m_loader;
 }
 
@@ -77,7 +77,7 @@
     options.sendLoadCallbacks = SendCallbacks;
     options.dataBufferingPolicy = DoNotBufferData;
 
-    m_loader = ThreadableLoader::create(&context, this, request.internalRequest(), options);
+    m_loader = ThreadableLoader::create(context, *this, request.internalRequest(), options);
     m_isStarted = m_loader;
 }
 

Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (204018 => 204019)


--- trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -294,6 +294,11 @@
     ResourceRequest request = m_internalRequest.request;
     request.setHTTPHeaderFields(m_headers->internalHeaders());
     request.setHTTPBody(body().bodyForInternalRequest());
+
+    // FIXME: Support no-referrer and client. Ensure this case-sensitive comparison is ok.
+    if (m_internalRequest.referrer != "no-referrer" && m_internalRequest.referrer != "client")
+        request.setHTTPReferrer(m_internalRequest.referrer);
+
     return request;
 }
 

Modified: trunk/Source/WebCore/fileapi/FileReaderLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/fileapi/FileReaderLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/fileapi/FileReaderLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -73,6 +73,8 @@
 
 void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, Blob& blob)
 {
+    ASSERT(scriptExecutionContext);
+
     // The blob is read by routing through the request handling layer given a temporary public url.
     m_urlForReading = BlobURL::createPublicURL(scriptExecutionContext->securityOrigin());
     if (m_urlForReading.isEmpty()) {
@@ -93,9 +95,9 @@
     options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce;
 
     if (m_client)
-        m_loader = ThreadableLoader::create(scriptExecutionContext, this, WTFMove(request), options);
+        m_loader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(request), options);
     else
-        ThreadableLoader::loadResourceSynchronously(scriptExecutionContext, WTFMove(request), *this, options);
+        ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext, WTFMove(request), *this, options);
 }
 
 void FileReaderLoader::cancel()

Modified: trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -108,6 +108,9 @@
     if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
         preflightRequest.setInitiator(m_loader.options().initiator);
 
+    if (!m_loader.referrer().isNull())
+        preflightRequest.mutableResourceRequest().setHTTPReferrer(m_loader.referrer());
+
     ASSERT(!m_resource);
     m_resource = m_loader.document().cachedResourceLoader().requestRawResource(preflightRequest);
     if (m_resource)
@@ -123,6 +126,10 @@
     ResourceError error;
     ResourceResponse response;
     RefPtr<SharedBuffer> data;
+
+    if (!loader.referrer().isNull())
+        preflightRequest.setHTTPReferrer(loader.referrer());
+
     unsigned identifier = loader.document().frame()->loader().loadResourceSynchronously(preflightRequest, DoNotAllowStoredCredentials, ClientCredentialPolicy::CannotAskClientForCredentials, error, response, data);
 
     // FIXME: Investigate why checking for response httpStatusCode here. In particular, can we have a not-null error and a 2XX response.

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -59,7 +59,7 @@
 void DocumentThreadableLoader::loadResourceSynchronously(Document& document, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy)
 {
     // The loader will be deleted as soon as this function exits.
-    RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy)));
+    Ref<DocumentThreadableLoader> loader = adoptRef(*new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), String()));
     ASSERT(loader->hasOneRef());
 }
 
@@ -68,9 +68,9 @@
     loadResourceSynchronously(document, WTFMove(request), client, options, nullptr, nullptr);
 }
 
-RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy)
+RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy, String&& referrer)
 {
-    RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy)));
+    RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), WTFMove(referrer)));
     if (!loader->isLoading())
         loader = nullptr;
     return loader;
@@ -78,14 +78,15 @@
 
 RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options)
 {
-    return create(document, client, WTFMove(request), options, nullptr, nullptr);
+    return create(document, client, WTFMove(request), options, nullptr, nullptr, String());
 }
 
-DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient& client, BlockingBehavior blockingBehavior, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy)
+DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient& client, BlockingBehavior blockingBehavior, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy, String&& referrer)
     : m_client(&client)
     , m_document(document)
     , m_options(options)
     , m_origin(WTFMove(origin))
+    , m_referrer(WTFMove(referrer))
     , m_sameOriginRequest(securityOrigin().canRequest(request.url()))
     , m_simpleRequest(true)
     , m_async(blockingBehavior == LoadAsynchronously)
@@ -361,6 +362,9 @@
     ASSERT(m_sameOriginRequest || requestURL.user().isEmpty());
     ASSERT(m_sameOriginRequest || requestURL.pass().isEmpty());
 
+    if (!m_referrer.isNull())
+        request.setHTTPReferrer(m_referrer);
+
     if (m_async) {
         ThreadableLoaderOptions options = m_options;
         options.clientCredentialPolicy = m_sameOriginRequest ? ClientCredentialPolicy::MayAskClientForCredentials : ClientCredentialPolicy::CannotAskClientForCredentials;

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (204018 => 204019)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.h	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -28,8 +29,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef DocumentThreadableLoader_h
-#define DocumentThreadableLoader_h
+#pragma once
 
 #include "CrossOriginPreflightChecker.h"
 #include "ResourceResponse.h"
@@ -48,7 +48,7 @@
         static void loadResourceSynchronously(Document&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&);
         static void loadResourceSynchronously(Document&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);
 
-        static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&);
+        static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&, String&& referrer);
         static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&);
 
         virtual ~DocumentThreadableLoader();
@@ -71,7 +71,7 @@
             LoadAsynchronously
         };
 
-        DocumentThreadableLoader(Document&, ThreadableLoaderClient&, BlockingBehavior, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&);
+        DocumentThreadableLoader(Document&, ThreadableLoaderClient&, BlockingBehavior, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&, String&&);
 
         void clearResource();
 
@@ -103,6 +103,7 @@
 
         Document& document() { return m_document; }
         const ThreadableLoaderOptions& options() const { return m_options; }
+        const String& referrer() const { return m_referrer; }
         bool isLoading() { return m_resource || m_preflightChecker; }
 
         CachedResourceHandle<CachedRawResource> m_resource;
@@ -110,6 +111,7 @@
         Document& m_document;
         ThreadableLoaderOptions m_options;
         RefPtr<SecurityOrigin> m_origin;
+        String m_referrer;
         bool m_sameOriginRequest;
         bool m_simpleRequest;
         bool m_async;
@@ -118,5 +120,3 @@
     };
 
 } // namespace WebCore
-
-#endif // DocumentThreadableLoader_h

Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/SubresourceLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/SubresourceLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -152,9 +152,6 @@
     // SubresourceLoader could use the document origin as a default and set PotentiallyCrossOriginEnabled requests accordingly.
     // This would simplify resource loader users as they would only need to set fetch mode to Cors.
     m_origin = m_resource->origin();
-    // https://fetch.spec.whatwg.org/#main-fetch, step 11, data URL here is considered not cross origin.
-    if (!request.url().protocolIsData() && m_origin && !m_origin->canRequest(request.url()))
-        m_resource->setCrossOrigin();
 
     return true;
 }

Modified: trunk/Source/WebCore/loader/ThreadableLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/ThreadableLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/ThreadableLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -58,26 +58,21 @@
 {
 }
 
-RefPtr<ThreadableLoader> ThreadableLoader::create(ScriptExecutionContext* context, ThreadableLoaderClient* client, ResourceRequest&& request, const ThreadableLoaderOptions& options)
+RefPtr<ThreadableLoader> ThreadableLoader::create(ScriptExecutionContext& context, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options)
 {
-    ASSERT(client);
-    ASSERT(context);
-
-    if (is<WorkerGlobalScope>(*context))
+    if (is<WorkerGlobalScope>(context))
         return WorkerThreadableLoader::create(downcast<WorkerGlobalScope>(context), client, WorkerRunLoop::defaultMode(), WTFMove(request), options);
 
-    return DocumentThreadableLoader::create(downcast<Document>(*context), *client, WTFMove(request), options);
+    return DocumentThreadableLoader::create(downcast<Document>(context), client, WTFMove(request), options);
 }
 
-void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext* context, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
+void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext& context, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
 {
-    ASSERT(context);
-
-    if (is<WorkerGlobalScope>(*context))
+    if (is<WorkerGlobalScope>(context))
         WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(context), WTFMove(request), client, options);
     else
-        DocumentThreadableLoader::loadResourceSynchronously(downcast<Document>(*context), WTFMove(request), client, options);
-    context->didLoadResourceSynchronously();
+        DocumentThreadableLoader::loadResourceSynchronously(downcast<Document>(context), WTFMove(request), client, options);
+    context.didLoadResourceSynchronously();
 }
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/ThreadableLoader.h (204018 => 204019)


--- trunk/Source/WebCore/loader/ThreadableLoader.h	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/ThreadableLoader.h	2016-08-02 07:20:23 UTC (rev 204019)
@@ -74,8 +74,8 @@
     class ThreadableLoader {
         WTF_MAKE_NONCOPYABLE(ThreadableLoader);
     public:
-        static void loadResourceSynchronously(ScriptExecutionContext*, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);
-        static RefPtr<ThreadableLoader> create(ScriptExecutionContext*, ThreadableLoaderClient*, ResourceRequest&&, const ThreadableLoaderOptions&);
+        static void loadResourceSynchronously(ScriptExecutionContext&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);
+        static RefPtr<ThreadableLoader> create(ScriptExecutionContext&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&);
 
         virtual void cancel() = 0;
         void ref() { refThreadableLoader(); }

Modified: trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h (204018 => 204019)


--- trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h	2016-08-02 07:20:23 UTC (rev 204019)
@@ -40,7 +40,7 @@
 
 class ThreadableLoaderClientWrapper : public ThreadSafeRefCounted<ThreadableLoaderClientWrapper> {
 public:
-    static Ref<ThreadableLoaderClientWrapper> create(ThreadableLoaderClient* client)
+    static Ref<ThreadableLoaderClientWrapper> create(ThreadableLoaderClient& client)
     {
         return adoptRef(*new ThreadableLoaderClientWrapper(client));
     }
@@ -95,14 +95,10 @@
     }
 
 protected:
-    explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient* client)
-        : m_client(client)
-        , m_done(false)
-    {
-    }
+    explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient& client) : m_client(&client) { }
 
     ThreadableLoaderClient* m_client;
-    bool m_done;
+    bool m_done { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
+ * Copyright (C) 2016 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -49,10 +50,10 @@
 
 static const char loadResourceSynchronouslyMode[] = "loadResourceSynchronouslyMode";
 
-WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope* workerGlobalScope, ThreadableLoaderClient* client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)
+WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient& client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)
     : m_workerGlobalScope(workerGlobalScope)
     , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client))
-    , m_bridge(*new MainThreadBridge(*m_workerClientWrapper, workerGlobalScope->thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope->url().strippedForUseAsReferrer(), workerGlobalScope->securityOrigin(), workerGlobalScope->contentSecurityPolicy()))
+    , m_bridge(*new MainThreadBridge(m_workerClientWrapper.get(), workerGlobalScope.thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope.url().strippedForUseAsReferrer(), workerGlobalScope.securityOrigin(), workerGlobalScope.contentSecurityPolicy()))
 {
 }
 
@@ -61,18 +62,18 @@
     m_bridge.destroy();
 }
 
-void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope* workerGlobalScope, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
+void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& workerGlobalScope, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)
 {
-    WorkerRunLoop& runLoop = workerGlobalScope->thread().runLoop();
+    WorkerRunLoop& runLoop = workerGlobalScope.thread().runLoop();
 
     // Create a unique mode just for this synchronous resource load.
     String mode = loadResourceSynchronouslyMode;
     mode.append(String::number(runLoop.createUniqueId()));
 
-    RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, &client, mode, WTFMove(request), options);
+    RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, client, mode, WTFMove(request), options);
     MessageQueueWaitResult result = MessageQueueMessageReceived;
     while (!loader->done() && result != MessageQueueTerminated)
-        result = runLoop.runInMode(workerGlobalScope, mode);
+        result = runLoop.runInMode(&workerGlobalScope, mode);
 
     if (!loader->done() && result == MessageQueueTerminated)
         loader->cancel();
@@ -117,11 +118,9 @@
         ASSERT(isMainThread());
         Document& document = downcast<Document>(context);
 
-        request.setHTTPReferrer(options->referrer);
-
         // FIXME: If the site requests a local resource, then this will return a non-zero value but the sync path will return a 0 value.
         // Either this should return 0 or the other code path should call a failure callback.
-        m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options->options, WTFMove(options->origin), WTFMove(contentSecurityPolicyCopy));
+        m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options->options, WTFMove(options->origin), WTFMove(contentSecurityPolicyCopy), WTFMove(options->referrer));
         ASSERT(m_mainThreadLoader || m_loadingFinished);
     });
 }

Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.h (204018 => 204019)


--- trunk/Source/WebCore/loader/WorkerThreadableLoader.h	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/WorkerThreadableLoader.h	2016-08-02 07:20:23 UTC (rev 204019)
@@ -49,8 +49,8 @@
     class WorkerThreadableLoader : public RefCounted<WorkerThreadableLoader>, public ThreadableLoader {
         WTF_MAKE_FAST_ALLOCATED;
     public:
-        static void loadResourceSynchronously(WorkerGlobalScope*, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);
-        static Ref<WorkerThreadableLoader> create(WorkerGlobalScope* workerGlobalScope, ThreadableLoaderClient* client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)
+        static void loadResourceSynchronously(WorkerGlobalScope&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);
+        static Ref<WorkerThreadableLoader> create(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient& client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)
         {
             return adoptRef(*new WorkerThreadableLoader(workerGlobalScope, client, taskMode, WTFMove(request), options));
         }
@@ -85,7 +85,7 @@
         // case 2. xhr gets aborted and the worker context continues running.
         //    The ThreadableLoaderClientWrapper has the underlying client cleared, so no more calls
         //    go through it.  All tasks posted from the worker object's thread to the worker context's
-        //    thread contain the RefPtr<ThreadableLoaderClientWrapper> object, so the 
+        //    thread contain the RefPtr<ThreadableLoaderClientWrapper> object, so the
         //    ThreadableLoaderClientWrapper instance is there until all tasks are executed.
         class MainThreadBridge : public ThreadableLoaderClient {
         public:
@@ -120,10 +120,10 @@
             String m_taskMode;
         };
 
-        WorkerThreadableLoader(WorkerGlobalScope*, ThreadableLoaderClient*, const String& taskMode, ResourceRequest&&, const ThreadableLoaderOptions&);
+        WorkerThreadableLoader(WorkerGlobalScope&, ThreadableLoaderClient&, const String& taskMode, ResourceRequest&&, const ThreadableLoaderOptions&);
 
-        RefPtr<WorkerGlobalScope> m_workerGlobalScope;
-        RefPtr<ThreadableLoaderClientWrapper> m_workerClientWrapper;
+        Ref<WorkerGlobalScope> m_workerGlobalScope;
+        Ref<ThreadableLoaderClientWrapper> m_workerClientWrapper;
         MainThreadBridge& m_bridge;
     };
 

Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (204018 => 204019)


--- trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/cache/CachedResource.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -183,9 +183,9 @@
     error(CachedResource::LoadError);
 }
 
-static void addAdditionalRequestHeadersToRequest(ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader, CachedResource::Type type)
+static void addAdditionalRequestHeadersToRequest(ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader, CachedResource& resource)
 {
-    if (type == CachedResource::MainResource)
+    if (resource.type() == CachedResource::MainResource)
         return;
     // In some cases we may try to load resources in frameless documents. Such loads always fail.
     // FIXME: We shouldn't get this far.
@@ -206,8 +206,29 @@
         outgoingOrigin = SecurityOrigin::createFromString(outgoingReferrer)->toString();
     }
 
-    auto referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()->referrerPolicy() : ReferrerPolicy::Default;
-    outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer);
+    // FIXME: Refactor SecurityPolicy::generateReferrerHeader to align with new terminology used in https://w3c.github.io/webappsec-referrer-policy.
+    switch (resource.options().referrerPolicy) {
+    case FetchOptions::ReferrerPolicy::EmptyString: {
+        ReferrerPolicy referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()->referrerPolicy() : ReferrerPolicy::Default;
+        outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer);
+        break; }
+    case FetchOptions::ReferrerPolicy::NoReferrerWhenDowngrade:
+        outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Default, request.url(), outgoingReferrer);
+        break;
+    case FetchOptions::ReferrerPolicy::NoReferrer:
+        outgoingReferrer = String();
+        break;
+    case FetchOptions::ReferrerPolicy::Origin:
+        outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Origin, request.url(), outgoingReferrer);
+        break;
+    case FetchOptions::ReferrerPolicy::OriginWhenCrossOrigin:
+        if (resource.isCrossOrigin())
+            outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Origin, request.url(), outgoingReferrer);
+        break;
+    case FetchOptions::ReferrerPolicy::UnsafeUrl:
+        break;
+    };
+
     if (outgoingReferrer.isEmpty())
         request.clearHTTPReferrer();
     else
@@ -219,7 +240,7 @@
 
 void CachedResource::addAdditionalRequestHeaders(CachedResourceLoader& cachedResourceLoader)
 {
-    addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, type());
+    addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, *this);
 }
 
 void CachedResource::load(CachedResourceLoader& cachedResourceLoader, const ResourceLoaderOptions& options)
@@ -287,6 +308,10 @@
         else
             m_origin = cachedResourceLoader.document()->securityOrigin();
         ASSERT(m_origin);
+
+        if (!m_resourceRequest.url().protocolIsData() && m_origin && !m_origin->canRequest(m_resourceRequest.url()))
+            setCrossOrigin();
+
         addAdditionalRequestHeaders(cachedResourceLoader);
     }
 
@@ -809,7 +834,7 @@
         return true;
 
     ResourceRequest requestWithFullHeaders(request);
-    addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, type());
+    addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, *this);
 
     return verifyVaryingRequestHeaders(m_varyingHeaderValues, requestWithFullHeaders, m_sessionID);
 }

Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (204018 => 204019)


--- trunk/Source/WebCore/loader/cache/CachedResource.h	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h	2016-08-02 07:20:23 UTC (rev 204019)
@@ -230,6 +230,7 @@
     DataBufferingPolicy dataBufferingPolicy() const { return m_options.dataBufferingPolicy; }
 
     bool allowsCaching() const { return m_options.cachingPolicy == CachingPolicy::AllowCaching; }
+    const FetchOptions& options() const { return m_options; }
 
     virtual void destroyDecodedData() { }
 

Modified: trunk/Source/WebCore/page/EventSource.cpp (204018 => 204019)


--- trunk/Source/WebCore/page/EventSource.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/page/EventSource.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -111,7 +111,8 @@
     options.dataBufferingPolicy = DoNotBufferData;
     options.contentSecurityPolicyEnforcement = scriptExecutionContext()->shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective;
 
-    m_loader = ThreadableLoader::create(scriptExecutionContext(), this, WTFMove(request), options);
+    ASSERT(scriptExecutionContext());
+    m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options);
 
     // FIXME: Can we just use m_loader for this, null it out when it's no longer in flight, and eliminate the m_requestInFlight member?
     if (m_loader)

Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.cpp (204018 => 204019)


--- trunk/Source/WebCore/workers/WorkerScriptLoader.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -56,6 +56,8 @@
 
 void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement)
 {
+    ASSERT(scriptExecutionContext);
+
     m_url = url;
 
     std::unique_ptr<ResourceRequest> request(createResourceRequest());
@@ -73,12 +75,14 @@
     options.sendLoadCallbacks = SendCallbacks;
     options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
 
-    WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(scriptExecutionContext), WTFMove(*request), *this, options);
+    WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(*scriptExecutionContext), WTFMove(*request), *this, options);
 }
 
 void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, WorkerScriptLoaderClient* client)
 {
     ASSERT(client);
+    ASSERT(scriptExecutionContext);
+
     m_client = client;
     m_url = url;
 
@@ -98,7 +102,7 @@
 
     // During create, callbacks may happen which remove the last reference to this object.
     Ref<WorkerScriptLoader> protectedThis(*this);
-    m_threadableLoader = ThreadableLoader::create(scriptExecutionContext, this, WTFMove(*request), options);
+    m_threadableLoader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(*request), options);
 }
 
 const URL& WorkerScriptLoader::responseURL() const

Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (204018 => 204019)


--- trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2016-08-02 07:19:58 UTC (rev 204018)
+++ trunk/Source/WebCore/xml/XMLHttpRequest.cpp	2016-08-02 07:20:23 UTC (rev 204019)
@@ -713,7 +713,7 @@
         // ThreadableLoader::create can return null here, for example if we're no longer attached to a page or if a content blocker blocks the load.
         // This is true while running onunload handlers.
         // FIXME: Maybe we need to be able to send XMLHttpRequests from onunload, <http://bugs.webkit.org/show_bug.cgi?id=10904>.
-        m_loader = ThreadableLoader::create(scriptExecutionContext(), this, WTFMove(request), options);
+        m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options);
 
         // Neither this object nor the _javascript_ wrapper should be deleted while
         // a request is in progress because we need to keep the listeners alive,
@@ -726,7 +726,7 @@
         }
     } else {
         InspectorInstrumentation::willLoadXHRSynchronously(scriptExecutionContext());
-        ThreadableLoader::loadResourceSynchronously(scriptExecutionContext(), WTFMove(request), *this, options);
+        ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext(), WTFMove(request), *this, options);
         InspectorInstrumentation::didLoadXHRSynchronously(scriptExecutionContext());
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to