<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[204019] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/204019">204019</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-08-02 00:20:23 -0700 (Tue, 02 Aug 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Fetch API] Add support to ReferrerPolicy
https://bugs.webkit.org/show_bug.cgi?id=160404

Patch by Youenn Fablet &lt;youenn@apple.com&gt; 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.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerjs">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchLoadercpp">trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesfetchFetchRequestcpp">trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp</a></li>
<li><a href="#trunkSourceWebCorefileapiFileReaderLoadercpp">trunk/Source/WebCore/fileapi/FileReaderLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderCrossOriginPreflightCheckercpp">trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentThreadableLoadercpp">trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderDocumentThreadableLoaderh">trunk/Source/WebCore/loader/DocumentThreadableLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderSubresourceLoadercpp">trunk/Source/WebCore/loader/SubresourceLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderThreadableLoadercpp">trunk/Source/WebCore/loader/ThreadableLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderThreadableLoaderh">trunk/Source/WebCore/loader/ThreadableLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloaderThreadableLoaderClientWrapperh">trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h</a></li>
<li><a href="#trunkSourceWebCoreloaderWorkerThreadableLoadercpp">trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreloaderWorkerThreadableLoaderh">trunk/Source/WebCore/loader/WorkerThreadableLoader.h</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourcecpp">trunk/Source/WebCore/loader/cache/CachedResource.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceh">trunk/Source/WebCore/loader/cache/CachedResource.h</a></li>
<li><a href="#trunkSourceWebCorepageEventSourcecpp">trunk/Source/WebCore/page/EventSource.cpp</a></li>
<li><a href="#trunkSourceWebCoreworkersWorkerScriptLoadercpp">trunk/Source/WebCore/workers/WorkerScriptLoader.cpp</a></li>
<li><a href="#trunkSourceWebCorexmlXMLHttpRequestcpp">trunk/Source/WebCore/xml/XMLHttpRequest.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerworkerexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerworkerhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerhtml">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.html</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerjs">trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-08-02  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        [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:
+
</ins><span class="cx"> 2016-08-01  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Make wpt server generate its certificates in layout test results folder
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-expected.txt (0 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+
+PASS origin-when-cross-origin policy on a same-origin URL 
+PASS origin-when-cross-origin policy on a cross-origin URL 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerworkerexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker-expected.txt (0 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+
+PASS origin-when-cross-origin policy on a same-origin URL 
+PASS origin-when-cross-origin policy on a cross-origin URL 
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerworkerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html (0 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot;&gt;
+    &lt;title&gt;Fetch in worker: same-origin mode&lt;/title&gt;
+    &lt;meta name=&quot;help&quot; href=&quot;https://fetch.spec.whatwg.org/#main-fetch&quot;&gt;
+    &lt;meta name=&quot;help&quot; href=&quot;https://fetch.spec.whatwg.org/#basic-fetch&quot;&gt;
+    &lt;meta name=&quot;author&quot; title=&quot;Canon Research France&quot; href=&quot;https://www.crf.canon.fr&quot;&gt;
+    &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;script&gt;
+      fetch_tests_from_worker(new Worker(&quot;referrer.js&quot;));
+    &lt;/script&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.html (0 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+  &lt;head&gt;
+    &lt;meta charset=&quot;utf-8&quot;&gt;
+    &lt;title&gt;Fetch: same-origin mode&lt;/title&gt;
+    &lt;meta name=&quot;help&quot; href=&quot;https://fetch.spec.whatwg.org/#main-fetch&quot;&gt;
+    &lt;meta name=&quot;help&quot; href=&quot;https://fetch.spec.whatwg.org/#basic-fetch&quot;&gt;
+    &lt;meta name=&quot;author&quot; title=&quot;Canon Research France&quot; href=&quot;https://www.crf.canon.fr&quot;&gt;
+    &lt;script src=&quot;/resources/testharness.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;/resources/testharnessreport.js&quot;&gt;&lt;/script&gt;
+  &lt;/head&gt;
+  &lt;body&gt;
+    &lt;script src=&quot;../resources/utils.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;../resources/get-host-info.sub.js&quot;&gt;&lt;/script&gt;
+    &lt;script src=&quot;referrer.js&quot;&gt;&lt;/script&gt;
+  &lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapibasicreferrerjs"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/basic/referrer.js (0 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -0,0 +1,25 @@
</span><ins>+if (this.document === undefined) {
+  importScripts(&quot;/resources/testharness.js&quot;);
+  importScripts(&quot;../resources/utils.js&quot;);
+  importScripts(&quot;../resources/get-host-info.sub.js&quot;)
+}
+
+function runTest(url, init, expectedReferrer, title) {
+    promise_test(function(test) {
+        return fetch(url , init).then(function(resp) {
+            assert_equals(resp.status, 200, &quot;HTTP status is 200&quot;);
+            assert_equals(resp.headers.get(&quot;x-request-referer&quot;), expectedReferrer, &quot;Request's referrer is correct&quot;);
+        });
+  }, title);
+}
+
+var fetchedUrl = RESOURCES_DIR + &quot;inspect-headers.py?headers=referer&quot;;
+var corsFetchedUrl = get_host_info().HTTP_REMOTE_ORIGIN  + dirname(location.pathname) + RESOURCES_DIR + &quot;inspect-headers.py?headers=referer&amp;cors&quot;;
+var redirectUrl = RESOURCES_DIR + &quot;redirect.py?location=&quot; ;
+var corsRedirectUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + &quot;redirect.py?location=&quot;;
+
+runTest(fetchedUrl, { referrerPolicy: &quot;origin-when-cross-origin&quot;}, location.toString(), &quot;origin-when-cross-origin policy on a same-origin URL&quot;);
+runTest(corsFetchedUrl, { referrerPolicy: &quot;origin-when-cross-origin&quot;}, get_host_info().HTTP_ORIGIN + &quot;/&quot;, &quot;origin-when-cross-origin policy on a cross-origin URL&quot;);
+
+done();
+
</ins></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> 
</span><del>-FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: &quot;&quot; promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
</del><ins>+PASS Referrer policy: no-referrer 
+PASS Referrer policy: &quot;&quot; 
+PASS Referrer policy: origin 
+PASS Referrer policy: origin-when-cross-origin 
+PASS Referrer policy: unsafe-url 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> 
</span><del>-FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: &quot;&quot; promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
-FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object &quot;TypeError: Type error&quot;
</del><ins>+PASS Referrer policy: no-referrer 
+PASS Referrer policy: &quot;&quot; 
+PASS Referrer policy: origin 
+PASS Referrer policy: origin-when-cross-origin 
+PASS Referrer policy: unsafe-url 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightreferrerjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> if (this.document === undefined) {
</span><span class="cx">   importScripts(&quot;/resources/testharness.js&quot;);
</span><span class="cx">   importScripts(&quot;/common/utils.js&quot;);
</span><ins>+  importScripts(&quot;../resources/get-host-info.sub.js&quot;);
</ins><span class="cx">   importScripts(&quot;../resources/utils.js&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -21,17 +22,18 @@
</span><span class="cx">         assert_equals(resp.status, 200, &quot;Response's status is 200&quot;);
</span><span class="cx">         assert_equals(resp.headers.get(&quot;x-did-preflight&quot;), &quot;1&quot;, &quot;Preflight request has been made&quot;);
</span><span class="cx">         assert_equals(resp.headers.get(&quot;x-preflight-referrer&quot;), expectedReferrer, &quot;Preflight's referrer is correct&quot;);
</span><del>-        assert_equals(resp.headers.get(&quot;x-referrer&quot;), expectedReferrer, &quot;Request's refferer is correct&quot;);
</del><ins>+        assert_equals(resp.headers.get(&quot;x-referrer&quot;), expectedReferrer, &quot;Request's referrer is correct&quot;);
</ins><span class="cx">       });
</span><span class="cx">     });
</span><span class="cx">   }, desc);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-var corsUrl = &quot;http://{{host}}:{{ports[http][1]}}&quot; + dirname(location.pathname) + RESOURCES_DIR + &quot;preflight.py&quot;;
-var origin = &quot;http://{{host}}:{{ports[http][0]}}&quot;;
</del><ins>+var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN  + dirname(location.pathname) + RESOURCES_DIR + &quot;preflight.py&quot;;
+var origin = get_host_info().HTTP_ORIGIN + &quot;/&quot;;
</ins><span class="cx"> 
</span><span class="cx"> corsPreflightReferrer(&quot;Referrer policy: no-referrer&quot;, corsUrl, &quot;no-referrer&quot;, &quot;&quot;);
</span><del>-corsPreflightReferrer(&quot;Referrer policy: \&quot;\&quot;&quot;, corsUrl, &quot;&quot;, &quot;&quot;);
</del><ins>+corsPreflightReferrer(&quot;Referrer policy: \&quot;\&quot;&quot;, corsUrl, &quot;&quot;, location.toString())
+
</ins><span class="cx"> corsPreflightReferrer(&quot;Referrer policy: origin&quot;, corsUrl, &quot;origin&quot;, origin);
</span><span class="cx"> corsPreflightReferrer(&quot;Referrer policy: origin-when-cross-origin&quot;, corsUrl, &quot;origin-when-cross-origin&quot;, origin);
</span><span class="cx"> corsPreflightReferrer(&quot;Referrer policy: unsafe-url&quot;, corsUrl, &quot;unsafe-url&quot;, location.toString());
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsfetchapicorscorspreflightworkerexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -7,10 +7,10 @@
</span><span class="cx"> PASS CORS [PATCH], server refuses 
</span><span class="cx"> PASS CORS [NEW], server allows 
</span><span class="cx"> PASS CORS [NEW], server refuses 
</span><del>-FAIL CORS [GET] [x-test-header: allowed], server allows assert_equals: Access-Control-Allow-Headers value expected &quot;x-test-header1&quot; but got &quot;referer,x-test-header1&quot;
</del><ins>+PASS CORS [GET] [x-test-header: allowed], server allows 
</ins><span class="cx"> PASS CORS [GET] [x-test-header: refused], server refuses 
</span><del>-FAIL CORS [GET] [several headers], server allows assert_equals: Access-Control-Allow-Headers value expected &quot;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&quot; but got &quot;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&quot;
</del><ins>+PASS CORS [GET] [several headers], server allows 
</ins><span class="cx"> PASS CORS [GET] [several headers], server refuses 
</span><del>-FAIL CORS [PUT] [several headers], server allows assert_equals: Access-Control-Allow-Headers value expected &quot;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&quot; but got &quot;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&quot;
</del><ins>+PASS CORS [PUT] [several headers], server allows 
</ins><span class="cx"> PASS CORS [PUT] [several headers], server refuses 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,3 +1,74 @@
</span><ins>+2016-08-02  Youenn Fablet  &lt;youenn@apple.com&gt;
+
+        [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.
+
</ins><span class="cx"> 2016-08-02  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor data passed along for a &quot;GetRecord&quot; request.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     options.mode = FetchOptions::Mode::SameOrigin;
</span><span class="cx">     options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce;
</span><span class="cx"> 
</span><del>-    m_loader = ThreadableLoader::create(&amp;context, this, WTFMove(request), options);
</del><ins>+    m_loader = ThreadableLoader::create(context, *this, WTFMove(request), options);
</ins><span class="cx">     m_isStarted = m_loader;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx">     options.sendLoadCallbacks = SendCallbacks;
</span><span class="cx">     options.dataBufferingPolicy = DoNotBufferData;
</span><span class="cx"> 
</span><del>-    m_loader = ThreadableLoader::create(&amp;context, this, request.internalRequest(), options);
</del><ins>+    m_loader = ThreadableLoader::create(context, *this, request.internalRequest(), options);
</ins><span class="cx">     m_isStarted = m_loader;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesfetchFetchRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -294,6 +294,11 @@
</span><span class="cx">     ResourceRequest request = m_internalRequest.request;
</span><span class="cx">     request.setHTTPHeaderFields(m_headers-&gt;internalHeaders());
</span><span class="cx">     request.setHTTPBody(body().bodyForInternalRequest());
</span><ins>+
+    // FIXME: Support no-referrer and client. Ensure this case-sensitive comparison is ok.
+    if (m_internalRequest.referrer != &quot;no-referrer&quot; &amp;&amp; m_internalRequest.referrer != &quot;client&quot;)
+        request.setHTTPReferrer(m_internalRequest.referrer);
+
</ins><span class="cx">     return request;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorefileapiFileReaderLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/fileapi/FileReaderLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -73,6 +73,8 @@
</span><span class="cx"> 
</span><span class="cx"> void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, Blob&amp; blob)
</span><span class="cx"> {
</span><ins>+    ASSERT(scriptExecutionContext);
+
</ins><span class="cx">     // The blob is read by routing through the request handling layer given a temporary public url.
</span><span class="cx">     m_urlForReading = BlobURL::createPublicURL(scriptExecutionContext-&gt;securityOrigin());
</span><span class="cx">     if (m_urlForReading.isEmpty()) {
</span><span class="lines">@@ -93,9 +95,9 @@
</span><span class="cx">     options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce;
</span><span class="cx"> 
</span><span class="cx">     if (m_client)
</span><del>-        m_loader = ThreadableLoader::create(scriptExecutionContext, this, WTFMove(request), options);
</del><ins>+        m_loader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(request), options);
</ins><span class="cx">     else
</span><del>-        ThreadableLoader::loadResourceSynchronously(scriptExecutionContext, WTFMove(request), *this, options);
</del><ins>+        ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext, WTFMove(request), *this, options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void FileReaderLoader::cancel()
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderCrossOriginPreflightCheckercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -108,6 +108,9 @@
</span><span class="cx">     if (RuntimeEnabledFeatures::sharedFeatures().resourceTimingEnabled())
</span><span class="cx">         preflightRequest.setInitiator(m_loader.options().initiator);
</span><span class="cx"> 
</span><ins>+    if (!m_loader.referrer().isNull())
+        preflightRequest.mutableResourceRequest().setHTTPReferrer(m_loader.referrer());
+
</ins><span class="cx">     ASSERT(!m_resource);
</span><span class="cx">     m_resource = m_loader.document().cachedResourceLoader().requestRawResource(preflightRequest);
</span><span class="cx">     if (m_resource)
</span><span class="lines">@@ -123,6 +126,10 @@
</span><span class="cx">     ResourceError error;
</span><span class="cx">     ResourceResponse response;
</span><span class="cx">     RefPtr&lt;SharedBuffer&gt; data;
</span><ins>+
+    if (!loader.referrer().isNull())
+        preflightRequest.setHTTPReferrer(loader.referrer());
+
</ins><span class="cx">     unsigned identifier = loader.document().frame()-&gt;loader().loadResourceSynchronously(preflightRequest, DoNotAllowStoredCredentials, ClientCredentialPolicy::CannotAskClientForCredentials, error, response, data);
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Investigate why checking for response httpStatusCode here. In particular, can we have a not-null error and a 2XX response.
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentThreadableLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> void DocumentThreadableLoader::loadResourceSynchronously(Document&amp; document, ResourceRequest&amp;&amp; request, ThreadableLoaderClient&amp; client, const ThreadableLoaderOptions&amp; options, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; origin, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp; contentSecurityPolicy)
</span><span class="cx"> {
</span><span class="cx">     // The loader will be deleted as soon as this function exits.
</span><del>-    RefPtr&lt;DocumentThreadableLoader&gt; loader = adoptRef(new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy)));
</del><ins>+    Ref&lt;DocumentThreadableLoader&gt; loader = adoptRef(*new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), String()));
</ins><span class="cx">     ASSERT(loader-&gt;hasOneRef());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -68,9 +68,9 @@
</span><span class="cx">     loadResourceSynchronously(document, WTFMove(request), client, options, nullptr, nullptr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;DocumentThreadableLoader&gt; DocumentThreadableLoader::create(Document&amp; document, ThreadableLoaderClient&amp; client, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; origin, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp; contentSecurityPolicy)
</del><ins>+RefPtr&lt;DocumentThreadableLoader&gt; DocumentThreadableLoader::create(Document&amp; document, ThreadableLoaderClient&amp; client, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; origin, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp; contentSecurityPolicy, String&amp;&amp; referrer)
</ins><span class="cx"> {
</span><del>-    RefPtr&lt;DocumentThreadableLoader&gt; loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy)));
</del><ins>+    RefPtr&lt;DocumentThreadableLoader&gt; loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), WTFMove(referrer)));
</ins><span class="cx">     if (!loader-&gt;isLoading())
</span><span class="cx">         loader = nullptr;
</span><span class="cx">     return loader;
</span><span class="lines">@@ -78,14 +78,15 @@
</span><span class="cx"> 
</span><span class="cx"> RefPtr&lt;DocumentThreadableLoader&gt; DocumentThreadableLoader::create(Document&amp; document, ThreadableLoaderClient&amp; client, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</span><span class="cx"> {
</span><del>-    return create(document, client, WTFMove(request), options, nullptr, nullptr);
</del><ins>+    return create(document, client, WTFMove(request), options, nullptr, nullptr, String());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-DocumentThreadableLoader::DocumentThreadableLoader(Document&amp; document, ThreadableLoaderClient&amp; client, BlockingBehavior blockingBehavior, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; origin, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp; contentSecurityPolicy)
</del><ins>+DocumentThreadableLoader::DocumentThreadableLoader(Document&amp; document, ThreadableLoaderClient&amp; client, BlockingBehavior blockingBehavior, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options, RefPtr&lt;SecurityOrigin&gt;&amp;&amp; origin, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp; contentSecurityPolicy, String&amp;&amp; referrer)
</ins><span class="cx">     : m_client(&amp;client)
</span><span class="cx">     , m_document(document)
</span><span class="cx">     , m_options(options)
</span><span class="cx">     , m_origin(WTFMove(origin))
</span><ins>+    , m_referrer(WTFMove(referrer))
</ins><span class="cx">     , m_sameOriginRequest(securityOrigin().canRequest(request.url()))
</span><span class="cx">     , m_simpleRequest(true)
</span><span class="cx">     , m_async(blockingBehavior == LoadAsynchronously)
</span><span class="lines">@@ -361,6 +362,9 @@
</span><span class="cx">     ASSERT(m_sameOriginRequest || requestURL.user().isEmpty());
</span><span class="cx">     ASSERT(m_sameOriginRequest || requestURL.pass().isEmpty());
</span><span class="cx"> 
</span><ins>+    if (!m_referrer.isNull())
+        request.setHTTPReferrer(m_referrer);
+
</ins><span class="cx">     if (m_async) {
</span><span class="cx">         ThreadableLoaderOptions options = m_options;
</span><span class="cx">         options.clientCredentialPolicy = m_sameOriginRequest ? ClientCredentialPolicy::MayAskClientForCredentials : ClientCredentialPolicy::CannotAskClientForCredentials;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderDocumentThreadableLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.h (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
</span><ins>+ * Copyright (C) 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -28,8 +29,7 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-#ifndef DocumentThreadableLoader_h
-#define DocumentThreadableLoader_h
</del><ins>+#pragma once
</ins><span class="cx"> 
</span><span class="cx"> #include &quot;CrossOriginPreflightChecker.h&quot;
</span><span class="cx"> #include &quot;ResourceResponse.h&quot;
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">         static void loadResourceSynchronously(Document&amp;, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp;);
</span><span class="cx">         static void loadResourceSynchronously(Document&amp;, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;);
</span><span class="cx"> 
</span><del>-        static RefPtr&lt;DocumentThreadableLoader&gt; create(Document&amp;, ThreadableLoaderClient&amp;, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp;);
</del><ins>+        static RefPtr&lt;DocumentThreadableLoader&gt; create(Document&amp;, ThreadableLoaderClient&amp;, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp;, String&amp;&amp; referrer);
</ins><span class="cx">         static RefPtr&lt;DocumentThreadableLoader&gt; create(Document&amp;, ThreadableLoaderClient&amp;, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;);
</span><span class="cx"> 
</span><span class="cx">         virtual ~DocumentThreadableLoader();
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">             LoadAsynchronously
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        DocumentThreadableLoader(Document&amp;, ThreadableLoaderClient&amp;, BlockingBehavior, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp;);
</del><ins>+        DocumentThreadableLoader(Document&amp;, ThreadableLoaderClient&amp;, BlockingBehavior, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;, RefPtr&lt;SecurityOrigin&gt;&amp;&amp;, std::unique_ptr&lt;ContentSecurityPolicy&gt;&amp;&amp;, String&amp;&amp;);
</ins><span class="cx"> 
</span><span class="cx">         void clearResource();
</span><span class="cx"> 
</span><span class="lines">@@ -103,6 +103,7 @@
</span><span class="cx"> 
</span><span class="cx">         Document&amp; document() { return m_document; }
</span><span class="cx">         const ThreadableLoaderOptions&amp; options() const { return m_options; }
</span><ins>+        const String&amp; referrer() const { return m_referrer; }
</ins><span class="cx">         bool isLoading() { return m_resource || m_preflightChecker; }
</span><span class="cx"> 
</span><span class="cx">         CachedResourceHandle&lt;CachedRawResource&gt; m_resource;
</span><span class="lines">@@ -110,6 +111,7 @@
</span><span class="cx">         Document&amp; m_document;
</span><span class="cx">         ThreadableLoaderOptions m_options;
</span><span class="cx">         RefPtr&lt;SecurityOrigin&gt; m_origin;
</span><ins>+        String m_referrer;
</ins><span class="cx">         bool m_sameOriginRequest;
</span><span class="cx">         bool m_simpleRequest;
</span><span class="cx">         bool m_async;
</span><span class="lines">@@ -118,5 +120,3 @@
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span><del>-
-#endif // DocumentThreadableLoader_h
</del></span></pre></div>
<a id="trunkSourceWebCoreloaderSubresourceLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/SubresourceLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -152,9 +152,6 @@
</span><span class="cx">     // SubresourceLoader could use the document origin as a default and set PotentiallyCrossOriginEnabled requests accordingly.
</span><span class="cx">     // This would simplify resource loader users as they would only need to set fetch mode to Cors.
</span><span class="cx">     m_origin = m_resource-&gt;origin();
</span><del>-    // https://fetch.spec.whatwg.org/#main-fetch, step 11, data URL here is considered not cross origin.
-    if (!request.url().protocolIsData() &amp;&amp; m_origin &amp;&amp; !m_origin-&gt;canRequest(request.url()))
-        m_resource-&gt;setCrossOrigin();
</del><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderThreadableLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ThreadableLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -58,26 +58,21 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RefPtr&lt;ThreadableLoader&gt; ThreadableLoader::create(ScriptExecutionContext* context, ThreadableLoaderClient* client, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</del><ins>+RefPtr&lt;ThreadableLoader&gt; ThreadableLoader::create(ScriptExecutionContext&amp; context, ThreadableLoaderClient&amp; client, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    ASSERT(client);
-    ASSERT(context);
-
-    if (is&lt;WorkerGlobalScope&gt;(*context))
</del><ins>+    if (is&lt;WorkerGlobalScope&gt;(context))
</ins><span class="cx">         return WorkerThreadableLoader::create(downcast&lt;WorkerGlobalScope&gt;(context), client, WorkerRunLoop::defaultMode(), WTFMove(request), options);
</span><span class="cx"> 
</span><del>-    return DocumentThreadableLoader::create(downcast&lt;Document&gt;(*context), *client, WTFMove(request), options);
</del><ins>+    return DocumentThreadableLoader::create(downcast&lt;Document&gt;(context), client, WTFMove(request), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext* context, ResourceRequest&amp;&amp; request, ThreadableLoaderClient&amp; client, const ThreadableLoaderOptions&amp; options)
</del><ins>+void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext&amp; context, ResourceRequest&amp;&amp; request, ThreadableLoaderClient&amp; client, const ThreadableLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    ASSERT(context);
-
-    if (is&lt;WorkerGlobalScope&gt;(*context))
</del><ins>+    if (is&lt;WorkerGlobalScope&gt;(context))
</ins><span class="cx">         WorkerThreadableLoader::loadResourceSynchronously(downcast&lt;WorkerGlobalScope&gt;(context), WTFMove(request), client, options);
</span><span class="cx">     else
</span><del>-        DocumentThreadableLoader::loadResourceSynchronously(downcast&lt;Document&gt;(*context), WTFMove(request), client, options);
-    context-&gt;didLoadResourceSynchronously();
</del><ins>+        DocumentThreadableLoader::loadResourceSynchronously(downcast&lt;Document&gt;(context), WTFMove(request), client, options);
+    context.didLoadResourceSynchronously();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderThreadableLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ThreadableLoader.h (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -74,8 +74,8 @@
</span><span class="cx">     class ThreadableLoader {
</span><span class="cx">         WTF_MAKE_NONCOPYABLE(ThreadableLoader);
</span><span class="cx">     public:
</span><del>-        static void loadResourceSynchronously(ScriptExecutionContext*, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;);
-        static RefPtr&lt;ThreadableLoader&gt; create(ScriptExecutionContext*, ThreadableLoaderClient*, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;);
</del><ins>+        static void loadResourceSynchronously(ScriptExecutionContext&amp;, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;);
+        static RefPtr&lt;ThreadableLoader&gt; create(ScriptExecutionContext&amp;, ThreadableLoaderClient&amp;, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;);
</ins><span class="cx"> 
</span><span class="cx">         virtual void cancel() = 0;
</span><span class="cx">         void ref() { refThreadableLoader(); }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderThreadableLoaderClientWrapperh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ThreadableLoaderClientWrapper : public ThreadSafeRefCounted&lt;ThreadableLoaderClientWrapper&gt; {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;ThreadableLoaderClientWrapper&gt; create(ThreadableLoaderClient* client)
</del><ins>+    static Ref&lt;ThreadableLoaderClientWrapper&gt; create(ThreadableLoaderClient&amp; client)
</ins><span class="cx">     {
</span><span class="cx">         return adoptRef(*new ThreadableLoaderClientWrapper(client));
</span><span class="cx">     }
</span><span class="lines">@@ -95,14 +95,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient* client)
-        : m_client(client)
-        , m_done(false)
-    {
-    }
</del><ins>+    explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient&amp; client) : m_client(&amp;client) { }
</ins><span class="cx"> 
</span><span class="cx">     ThreadableLoaderClient* m_client;
</span><del>-    bool m_done;
</del><ins>+    bool m_done { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderWorkerThreadableLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
</span><ins>+ * Copyright (C) 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -49,10 +50,10 @@
</span><span class="cx"> 
</span><span class="cx"> static const char loadResourceSynchronouslyMode[] = &quot;loadResourceSynchronouslyMode&quot;;
</span><span class="cx"> 
</span><del>-WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope* workerGlobalScope, ThreadableLoaderClient* client, const String&amp; taskMode, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</del><ins>+WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope&amp; workerGlobalScope, ThreadableLoaderClient&amp; client, const String&amp; taskMode, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</ins><span class="cx">     : m_workerGlobalScope(workerGlobalScope)
</span><span class="cx">     , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client))
</span><del>-    , m_bridge(*new MainThreadBridge(*m_workerClientWrapper, workerGlobalScope-&gt;thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope-&gt;url().strippedForUseAsReferrer(), workerGlobalScope-&gt;securityOrigin(), workerGlobalScope-&gt;contentSecurityPolicy()))
</del><ins>+    , m_bridge(*new MainThreadBridge(m_workerClientWrapper.get(), workerGlobalScope.thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope.url().strippedForUseAsReferrer(), workerGlobalScope.securityOrigin(), workerGlobalScope.contentSecurityPolicy()))
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -61,18 +62,18 @@
</span><span class="cx">     m_bridge.destroy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope* workerGlobalScope, ResourceRequest&amp;&amp; request, ThreadableLoaderClient&amp; client, const ThreadableLoaderOptions&amp; options)
</del><ins>+void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope&amp; workerGlobalScope, ResourceRequest&amp;&amp; request, ThreadableLoaderClient&amp; client, const ThreadableLoaderOptions&amp; options)
</ins><span class="cx"> {
</span><del>-    WorkerRunLoop&amp; runLoop = workerGlobalScope-&gt;thread().runLoop();
</del><ins>+    WorkerRunLoop&amp; runLoop = workerGlobalScope.thread().runLoop();
</ins><span class="cx"> 
</span><span class="cx">     // Create a unique mode just for this synchronous resource load.
</span><span class="cx">     String mode = loadResourceSynchronouslyMode;
</span><span class="cx">     mode.append(String::number(runLoop.createUniqueId()));
</span><span class="cx"> 
</span><del>-    RefPtr&lt;WorkerThreadableLoader&gt; loader = WorkerThreadableLoader::create(workerGlobalScope, &amp;client, mode, WTFMove(request), options);
</del><ins>+    RefPtr&lt;WorkerThreadableLoader&gt; loader = WorkerThreadableLoader::create(workerGlobalScope, client, mode, WTFMove(request), options);
</ins><span class="cx">     MessageQueueWaitResult result = MessageQueueMessageReceived;
</span><span class="cx">     while (!loader-&gt;done() &amp;&amp; result != MessageQueueTerminated)
</span><del>-        result = runLoop.runInMode(workerGlobalScope, mode);
</del><ins>+        result = runLoop.runInMode(&amp;workerGlobalScope, mode);
</ins><span class="cx"> 
</span><span class="cx">     if (!loader-&gt;done() &amp;&amp; result == MessageQueueTerminated)
</span><span class="cx">         loader-&gt;cancel();
</span><span class="lines">@@ -117,11 +118,9 @@
</span><span class="cx">         ASSERT(isMainThread());
</span><span class="cx">         Document&amp; document = downcast&lt;Document&gt;(context);
</span><span class="cx"> 
</span><del>-        request.setHTTPReferrer(options-&gt;referrer);
-
</del><span class="cx">         // 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.
</span><span class="cx">         // Either this should return 0 or the other code path should call a failure callback.
</span><del>-        m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options-&gt;options, WTFMove(options-&gt;origin), WTFMove(contentSecurityPolicyCopy));
</del><ins>+        m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options-&gt;options, WTFMove(options-&gt;origin), WTFMove(contentSecurityPolicyCopy), WTFMove(options-&gt;referrer));
</ins><span class="cx">         ASSERT(m_mainThreadLoader || m_loadingFinished);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderWorkerThreadableLoaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.h (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -49,8 +49,8 @@
</span><span class="cx">     class WorkerThreadableLoader : public RefCounted&lt;WorkerThreadableLoader&gt;, public ThreadableLoader {
</span><span class="cx">         WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx">     public:
</span><del>-        static void loadResourceSynchronously(WorkerGlobalScope*, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;);
-        static Ref&lt;WorkerThreadableLoader&gt; create(WorkerGlobalScope* workerGlobalScope, ThreadableLoaderClient* client, const String&amp; taskMode, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</del><ins>+        static void loadResourceSynchronously(WorkerGlobalScope&amp;, ResourceRequest&amp;&amp;, ThreadableLoaderClient&amp;, const ThreadableLoaderOptions&amp;);
+        static Ref&lt;WorkerThreadableLoader&gt; create(WorkerGlobalScope&amp; workerGlobalScope, ThreadableLoaderClient&amp; client, const String&amp; taskMode, ResourceRequest&amp;&amp; request, const ThreadableLoaderOptions&amp; options)
</ins><span class="cx">         {
</span><span class="cx">             return adoptRef(*new WorkerThreadableLoader(workerGlobalScope, client, taskMode, WTFMove(request), options));
</span><span class="cx">         }
</span><span class="lines">@@ -85,7 +85,7 @@
</span><span class="cx">         // case 2. xhr gets aborted and the worker context continues running.
</span><span class="cx">         //    The ThreadableLoaderClientWrapper has the underlying client cleared, so no more calls
</span><span class="cx">         //    go through it.  All tasks posted from the worker object's thread to the worker context's
</span><del>-        //    thread contain the RefPtr&lt;ThreadableLoaderClientWrapper&gt; object, so the 
</del><ins>+        //    thread contain the RefPtr&lt;ThreadableLoaderClientWrapper&gt; object, so the
</ins><span class="cx">         //    ThreadableLoaderClientWrapper instance is there until all tasks are executed.
</span><span class="cx">         class MainThreadBridge : public ThreadableLoaderClient {
</span><span class="cx">         public:
</span><span class="lines">@@ -120,10 +120,10 @@
</span><span class="cx">             String m_taskMode;
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        WorkerThreadableLoader(WorkerGlobalScope*, ThreadableLoaderClient*, const String&amp; taskMode, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;);
</del><ins>+        WorkerThreadableLoader(WorkerGlobalScope&amp;, ThreadableLoaderClient&amp;, const String&amp; taskMode, ResourceRequest&amp;&amp;, const ThreadableLoaderOptions&amp;);
</ins><span class="cx"> 
</span><del>-        RefPtr&lt;WorkerGlobalScope&gt; m_workerGlobalScope;
-        RefPtr&lt;ThreadableLoaderClientWrapper&gt; m_workerClientWrapper;
</del><ins>+        Ref&lt;WorkerGlobalScope&gt; m_workerGlobalScope;
+        Ref&lt;ThreadableLoaderClientWrapper&gt; m_workerClientWrapper;
</ins><span class="cx">         MainThreadBridge&amp; m_bridge;
</span><span class="cx">     };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResource.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -183,9 +183,9 @@
</span><span class="cx">     error(CachedResource::LoadError);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void addAdditionalRequestHeadersToRequest(ResourceRequest&amp; request, const CachedResourceLoader&amp; cachedResourceLoader, CachedResource::Type type)
</del><ins>+static void addAdditionalRequestHeadersToRequest(ResourceRequest&amp; request, const CachedResourceLoader&amp; cachedResourceLoader, CachedResource&amp; resource)
</ins><span class="cx"> {
</span><del>-    if (type == CachedResource::MainResource)
</del><ins>+    if (resource.type() == CachedResource::MainResource)
</ins><span class="cx">         return;
</span><span class="cx">     // In some cases we may try to load resources in frameless documents. Such loads always fail.
</span><span class="cx">     // FIXME: We shouldn't get this far.
</span><span class="lines">@@ -206,8 +206,29 @@
</span><span class="cx">         outgoingOrigin = SecurityOrigin::createFromString(outgoingReferrer)-&gt;toString();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    auto referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()-&gt;referrerPolicy() : ReferrerPolicy::Default;
-    outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer);
</del><ins>+    // 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()-&gt;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;
+    };
+
</ins><span class="cx">     if (outgoingReferrer.isEmpty())
</span><span class="cx">         request.clearHTTPReferrer();
</span><span class="cx">     else
</span><span class="lines">@@ -219,7 +240,7 @@
</span><span class="cx"> 
</span><span class="cx"> void CachedResource::addAdditionalRequestHeaders(CachedResourceLoader&amp; cachedResourceLoader)
</span><span class="cx"> {
</span><del>-    addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, type());
</del><ins>+    addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, *this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CachedResource::load(CachedResourceLoader&amp; cachedResourceLoader, const ResourceLoaderOptions&amp; options)
</span><span class="lines">@@ -287,6 +308,10 @@
</span><span class="cx">         else
</span><span class="cx">             m_origin = cachedResourceLoader.document()-&gt;securityOrigin();
</span><span class="cx">         ASSERT(m_origin);
</span><ins>+
+        if (!m_resourceRequest.url().protocolIsData() &amp;&amp; m_origin &amp;&amp; !m_origin-&gt;canRequest(m_resourceRequest.url()))
+            setCrossOrigin();
+
</ins><span class="cx">         addAdditionalRequestHeaders(cachedResourceLoader);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -809,7 +834,7 @@
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     ResourceRequest requestWithFullHeaders(request);
</span><del>-    addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, type());
</del><ins>+    addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, *this);
</ins><span class="cx"> 
</span><span class="cx">     return verifyVaryingRequestHeaders(m_varyingHeaderValues, requestWithFullHeaders, m_sessionID);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -230,6 +230,7 @@
</span><span class="cx">     DataBufferingPolicy dataBufferingPolicy() const { return m_options.dataBufferingPolicy; }
</span><span class="cx"> 
</span><span class="cx">     bool allowsCaching() const { return m_options.cachingPolicy == CachingPolicy::AllowCaching; }
</span><ins>+    const FetchOptions&amp; options() const { return m_options; }
</ins><span class="cx"> 
</span><span class="cx">     virtual void destroyDecodedData() { }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventSourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventSource.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -111,7 +111,8 @@
</span><span class="cx">     options.dataBufferingPolicy = DoNotBufferData;
</span><span class="cx">     options.contentSecurityPolicyEnforcement = scriptExecutionContext()-&gt;shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective;
</span><span class="cx"> 
</span><del>-    m_loader = ThreadableLoader::create(scriptExecutionContext(), this, WTFMove(request), options);
</del><ins>+    ASSERT(scriptExecutionContext());
+    m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options);
</ins><span class="cx"> 
</span><span class="cx">     // 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?
</span><span class="cx">     if (m_loader)
</span></span></pre></div>
<a id="trunkSourceWebCoreworkersWorkerScriptLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -56,6 +56,8 @@
</span><span class="cx"> 
</span><span class="cx"> void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement)
</span><span class="cx"> {
</span><ins>+    ASSERT(scriptExecutionContext);
+
</ins><span class="cx">     m_url = url;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;ResourceRequest&gt; request(createResourceRequest());
</span><span class="lines">@@ -73,12 +75,14 @@
</span><span class="cx">     options.sendLoadCallbacks = SendCallbacks;
</span><span class="cx">     options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
</span><span class="cx"> 
</span><del>-    WorkerThreadableLoader::loadResourceSynchronously(downcast&lt;WorkerGlobalScope&gt;(scriptExecutionContext), WTFMove(*request), *this, options);
</del><ins>+    WorkerThreadableLoader::loadResourceSynchronously(downcast&lt;WorkerGlobalScope&gt;(*scriptExecutionContext), WTFMove(*request), *this, options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WorkerScriptLoader::loadAsynchronously(ScriptExecutionContext* scriptExecutionContext, const URL&amp; url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, WorkerScriptLoaderClient* client)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(client);
</span><ins>+    ASSERT(scriptExecutionContext);
+
</ins><span class="cx">     m_client = client;
</span><span class="cx">     m_url = url;
</span><span class="cx"> 
</span><span class="lines">@@ -98,7 +102,7 @@
</span><span class="cx"> 
</span><span class="cx">     // During create, callbacks may happen which remove the last reference to this object.
</span><span class="cx">     Ref&lt;WorkerScriptLoader&gt; protectedThis(*this);
</span><del>-    m_threadableLoader = ThreadableLoader::create(scriptExecutionContext, this, WTFMove(*request), options);
</del><ins>+    m_threadableLoader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(*request), options);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> const URL&amp; WorkerScriptLoader::responseURL() const
</span></span></pre></div>
<a id="trunkSourceWebCorexmlXMLHttpRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/xml/XMLHttpRequest.cpp (204018 => 204019)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -713,7 +713,7 @@
</span><span class="cx">         // 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.
</span><span class="cx">         // This is true while running onunload handlers.
</span><span class="cx">         // FIXME: Maybe we need to be able to send XMLHttpRequests from onunload, &lt;http://bugs.webkit.org/show_bug.cgi?id=10904&gt;.
</span><del>-        m_loader = ThreadableLoader::create(scriptExecutionContext(), this, WTFMove(request), options);
</del><ins>+        m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options);
</ins><span class="cx"> 
</span><span class="cx">         // Neither this object nor the JavaScript wrapper should be deleted while
</span><span class="cx">         // a request is in progress because we need to keep the listeners alive,
</span><span class="lines">@@ -726,7 +726,7 @@
</span><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         InspectorInstrumentation::willLoadXHRSynchronously(scriptExecutionContext());
</span><del>-        ThreadableLoader::loadResourceSynchronously(scriptExecutionContext(), WTFMove(request), *this, options);
</del><ins>+        ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext(), WTFMove(request), *this, options);
</ins><span class="cx">         InspectorInstrumentation::didLoadXHRSynchronously(scriptExecutionContext());
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>