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());
}