Changeset 204019 in webkit
- Timestamp:
- Aug 2, 2016 12:20:23 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r203987 r204019 1 2016-08-02 Youenn Fablet <youenn@apple.com> 2 3 [Fetch API] Add support to ReferrerPolicy 4 https://bugs.webkit.org/show_bug.cgi?id=160404 5 6 Reviewed by Alex Christensen. 7 8 * web-platform-tests/fetch/api/basic/referrer-expected.txt: Added. 9 * web-platform-tests/fetch/api/basic/referrer-worker-expected.txt: Added. 10 * web-platform-tests/fetch/api/basic/referrer-worker.html: Added. 11 * web-platform-tests/fetch/api/basic/referrer.html: Added. 12 * web-platform-tests/fetch/api/basic/referrer.js: Added. 13 (runTest): 14 * web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt: 15 * web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt: 16 * web-platform-tests/fetch/api/cors/cors-preflight-referrer.js: 17 (corsPreflightReferrer): fix infrastructure bug in test and fix expected referrer policy in default case. 18 * web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt: 19 1 20 2016-08-01 Youenn Fablet <youenn@apple.com> 2 21 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-expected.txt
r203638 r204019 1 1 2 FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object "TypeError: Type error" 3 FAIL Referrer policy: "" promise_test: Unhandled rejection with value: object "TypeError: Type error" 4 FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object "TypeError: Type error" 5 FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object "TypeError: Type error" 6 FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object "TypeError: Type error" 2 PASS Referrer policy: no-referrer 3 PASS Referrer policy: "" 4 PASS Referrer policy: origin 5 PASS Referrer policy: origin-when-cross-origin 6 PASS Referrer policy: unsafe-url 7 7 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer-worker-expected.txt
r203732 r204019 1 1 2 FAIL Referrer policy: no-referrer promise_test: Unhandled rejection with value: object "TypeError: Type error" 3 FAIL Referrer policy: "" promise_test: Unhandled rejection with value: object "TypeError: Type error" 4 FAIL Referrer policy: origin promise_test: Unhandled rejection with value: object "TypeError: Type error" 5 FAIL Referrer policy: origin-when-cross-origin promise_test: Unhandled rejection with value: object "TypeError: Type error" 6 FAIL Referrer policy: unsafe-url promise_test: Unhandled rejection with value: object "TypeError: Type error" 2 PASS Referrer policy: no-referrer 3 PASS Referrer policy: "" 4 PASS Referrer policy: origin 5 PASS Referrer policy: origin-when-cross-origin 6 PASS Referrer policy: unsafe-url 7 7 -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-referrer.js
r203408 r204019 2 2 importScripts("/resources/testharness.js"); 3 3 importScripts("/common/utils.js"); 4 importScripts("../resources/get-host-info.sub.js"); 4 5 importScripts("../resources/utils.js"); 5 6 } … … 22 23 assert_equals(resp.headers.get("x-did-preflight"), "1", "Preflight request has been made"); 23 24 assert_equals(resp.headers.get("x-preflight-referrer"), expectedReferrer, "Preflight's referrer is correct"); 24 assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's ref ferer is correct");25 assert_equals(resp.headers.get("x-referrer"), expectedReferrer, "Request's referrer is correct"); 25 26 }); 26 27 }); … … 28 29 } 29 30 30 var corsUrl = "http://{{host}}:{{ports[http][1]}}"+ dirname(location.pathname) + RESOURCES_DIR + "preflight.py";31 var origin = "http://{{host}}:{{ports[http][0]}}";31 var corsUrl = get_host_info().HTTP_REMOTE_ORIGIN + dirname(location.pathname) + RESOURCES_DIR + "preflight.py"; 32 var origin = get_host_info().HTTP_ORIGIN + "/"; 32 33 33 34 corsPreflightReferrer("Referrer policy: no-referrer", corsUrl, "no-referrer", ""); 34 corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", ""); 35 corsPreflightReferrer("Referrer policy: \"\"", corsUrl, "", location.toString()) 36 35 37 corsPreflightReferrer("Referrer policy: origin", corsUrl, "origin", origin); 36 38 corsPreflightReferrer("Referrer policy: origin-when-cross-origin", corsUrl, "origin-when-cross-origin", origin); -
trunk/LayoutTests/imported/w3c/web-platform-tests/fetch/api/cors/cors-preflight-worker-expected.txt
r203899 r204019 8 8 PASS CORS [NEW], server allows 9 9 PASS CORS [NEW], server refuses 10 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" 10 PASS CORS [GET] [x-test-header: allowed], server allows 11 11 PASS CORS [GET] [x-test-header: refused], server refuses 12 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" 12 PASS CORS [GET] [several headers], server allows 13 13 PASS CORS [GET] [several headers], server refuses 14 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" 14 PASS CORS [PUT] [several headers], server allows 15 15 PASS CORS [PUT] [several headers], server refuses 16 16 -
trunk/Source/WebCore/ChangeLog
r204018 r204019 1 2016-08-02 Youenn Fablet <youenn@apple.com> 2 3 [Fetch API] Add support to ReferrerPolicy 4 https://bugs.webkit.org/show_bug.cgi?id=160404 5 6 Reviewed by Alex Christensen. 7 8 Tests: imported/w3c/web-platform-tests/fetch/api/basic/referrer-worker.html 9 imported/w3c/web-platform-tests/fetch/api/basic/referrer.html 10 11 Refactored ThreadableLoader API to take more references. 12 13 Updated loading code in CachedResource to take into account referrer policy, that can be set by fetch API. 14 To enable correct handling of OriginWhenCrossOrigin policy, the computation of the cross-origin status of a request is 15 moved from ResourceLoader to CachedResource. 16 17 Referrer is passed to the loading code through HTTP headers. 18 This was triggering preflighting for Workers request as WorkerThreadableLoader was setting the referrer. 19 It is now done in DocumentThreadableLoader::loadRequest so that preflighting is done before setting the referrer. 20 Note that this referrer setting is only a way to pass a specific referrer value to the loading code. 21 CachedResource code will compute the actual referer value based on the referrer policy. 22 It might be good in the future to have a different way of conveying this information to CachedResource, maybe 23 through CachedResourceRequest. 24 25 * Modules/fetch/FetchLoader.cpp: 26 (WebCore::FetchLoader::start): Refactoring of ThreadableLoader API. 27 * Modules/fetch/FetchRequest.cpp: 28 (WebCore::FetchRequest::internalRequest): Setting referrer if it has a specific value. 29 * fileapi/FileReaderLoader.cpp: 30 (WebCore::FileReaderLoader::start): Ractoring of ThreadableLoader API. 31 * loader/CrossOriginPreflightChecker.cpp: 32 (WebCore::CrossOriginPreflightChecker::startPreflight): Set referrer in the preflight request if any. 33 (WebCore::CrossOriginPreflightChecker::doPreflight): Ditto. 34 * loader/DocumentThreadableLoader.cpp: 35 (WebCore::DocumentThreadableLoader::loadResourceSynchronously): Refactoring of ThreadableLoader API. 36 (WebCore::DocumentThreadableLoader::create): Ditto. 37 (WebCore::DocumentThreadableLoader::DocumentThreadableLoader): Ditto. 38 (WebCore::DocumentThreadableLoader::loadRequest): Ditto. 39 * loader/DocumentThreadableLoader.h: 40 (WebCore::DocumentThreadableLoader::referrer): Storing referrer in case one is defined. 41 * loader/SubresourceLoader.cpp: 42 (WebCore::SubresourceLoader::init): Removing of cross origin computation since it is done earlier in CachedResource. 43 * loader/ThreadableLoader.cpp: 44 (WebCore::ThreadableLoader::create): Refactoring of ThreadableLoader API. 45 (WebCore::ThreadableLoader::loadResourceSynchronously): Ditto. 46 * loader/ThreadableLoader.h: 47 * loader/ThreadableLoaderClientWrapper.h: 48 (WebCore::ThreadableLoaderClientWrapper::create): Ditto. 49 (WebCore::ThreadableLoaderClientWrapper::ThreadableLoaderClientWrapper): Ditto. 50 * loader/WorkerThreadableLoader.cpp: 51 (WebCore::WorkerThreadableLoader::WorkerThreadableLoader): Ditto. 52 (WebCore::WorkerThreadableLoader::loadResourceSynchronously): Removing setting of referrer in header and passing 53 it as a parameter. 54 (WebCore::WorkerThreadableLoader::MainThreadBridge::MainThreadBridge): Ditto. 55 * loader/WorkerThreadableLoader.h: 56 (WebCore::WorkerThreadableLoader::create): Refactoring of ThreadableLoader API. 57 * loader/cache/CachedResource.cpp: 58 (WebCore::addAdditionalRequestHeadersToRequest): Computation of referrer based on referrer policy. 59 (WebCore::CachedResource::addAdditionalRequestHeaders): Ditto. 60 (WebCore::CachedResource::load): Computation of cross origin status. 61 (WebCore::CachedResource::varyHeaderValuesMatch): 62 * loader/cache/CachedResource.h: 63 (WebCore::CachedResource::options): 64 * page/EventSource.cpp: 65 (WebCore::EventSource::connect): Refactoring of ThreadableLoader API. 66 * workers/WorkerScriptLoader.cpp: 67 (WebCore::WorkerScriptLoader::loadSynchronously): Ditto. 68 (WebCore::WorkerScriptLoader::loadAsynchronously): Ditto. 69 * xml/XMLHttpRequest.cpp: 70 (WebCore::XMLHttpRequest::createRequest): Ditto. 71 1 72 2016-08-02 Brady Eidson <beidson@apple.com> 2 73 -
trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp
r204014 r204019 68 68 options.contentSecurityPolicyEnforcement = ContentSecurityPolicyEnforcement::DoNotEnforce; 69 69 70 m_loader = ThreadableLoader::create( &context,this, WTFMove(request), options);70 m_loader = ThreadableLoader::create(context, *this, WTFMove(request), options); 71 71 m_isStarted = m_loader; 72 72 } … … 78 78 options.dataBufferingPolicy = DoNotBufferData; 79 79 80 m_loader = ThreadableLoader::create( &context,this, request.internalRequest(), options);80 m_loader = ThreadableLoader::create(context, *this, request.internalRequest(), options); 81 81 m_isStarted = m_loader; 82 82 } -
trunk/Source/WebCore/Modules/fetch/FetchRequest.cpp
r203675 r204019 295 295 request.setHTTPHeaderFields(m_headers->internalHeaders()); 296 296 request.setHTTPBody(body().bodyForInternalRequest()); 297 298 // FIXME: Support no-referrer and client. Ensure this case-sensitive comparison is ok. 299 if (m_internalRequest.referrer != "no-referrer" && m_internalRequest.referrer != "client") 300 request.setHTTPReferrer(m_internalRequest.referrer); 301 297 302 return request; 298 303 } -
trunk/Source/WebCore/fileapi/FileReaderLoader.cpp
r204014 r204019 74 74 void FileReaderLoader::start(ScriptExecutionContext* scriptExecutionContext, Blob& blob) 75 75 { 76 ASSERT(scriptExecutionContext); 77 76 78 // The blob is read by routing through the request handling layer given a temporary public url. 77 79 m_urlForReading = BlobURL::createPublicURL(scriptExecutionContext->securityOrigin()); … … 94 96 95 97 if (m_client) 96 m_loader = ThreadableLoader::create( scriptExecutionContext,this, WTFMove(request), options);98 m_loader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(request), options); 97 99 else 98 ThreadableLoader::loadResourceSynchronously( scriptExecutionContext, WTFMove(request), *this, options);100 ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext, WTFMove(request), *this, options); 99 101 } 100 102 -
trunk/Source/WebCore/loader/CrossOriginPreflightChecker.cpp
r204014 r204019 109 109 preflightRequest.setInitiator(m_loader.options().initiator); 110 110 111 if (!m_loader.referrer().isNull()) 112 preflightRequest.mutableResourceRequest().setHTTPReferrer(m_loader.referrer()); 113 111 114 ASSERT(!m_resource); 112 115 m_resource = m_loader.document().cachedResourceLoader().requestRawResource(preflightRequest); … … 124 127 ResourceResponse response; 125 128 RefPtr<SharedBuffer> data; 129 130 if (!loader.referrer().isNull()) 131 preflightRequest.setHTTPReferrer(loader.referrer()); 132 126 133 unsigned identifier = loader.document().frame()->loader().loadResourceSynchronously(preflightRequest, DoNotAllowStoredCredentials, ClientCredentialPolicy::CannotAskClientForCredentials, error, response, data); 127 134 -
trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp
r204014 r204019 60 60 { 61 61 // The loader will be deleted as soon as this function exits. 62 Ref Ptr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy)));62 Ref<DocumentThreadableLoader> loader = adoptRef(*new DocumentThreadableLoader(document, client, LoadSynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), String())); 63 63 ASSERT(loader->hasOneRef()); 64 64 } … … 69 69 } 70 70 71 RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy )72 { 73 RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy) ));71 RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy, String&& referrer) 72 { 73 RefPtr<DocumentThreadableLoader> loader = adoptRef(new DocumentThreadableLoader(document, client, LoadAsynchronously, WTFMove(request), options, WTFMove(origin), WTFMove(contentSecurityPolicy), WTFMove(referrer))); 74 74 if (!loader->isLoading()) 75 75 loader = nullptr; … … 79 79 RefPtr<DocumentThreadableLoader> DocumentThreadableLoader::create(Document& document, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options) 80 80 { 81 return create(document, client, WTFMove(request), options, nullptr, nullptr );82 } 83 84 DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient& client, BlockingBehavior blockingBehavior, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy )81 return create(document, client, WTFMove(request), options, nullptr, nullptr, String()); 82 } 83 84 DocumentThreadableLoader::DocumentThreadableLoader(Document& document, ThreadableLoaderClient& client, BlockingBehavior blockingBehavior, ResourceRequest&& request, const ThreadableLoaderOptions& options, RefPtr<SecurityOrigin>&& origin, std::unique_ptr<ContentSecurityPolicy>&& contentSecurityPolicy, String&& referrer) 85 85 : m_client(&client) 86 86 , m_document(document) 87 87 , m_options(options) 88 88 , m_origin(WTFMove(origin)) 89 , m_referrer(WTFMove(referrer)) 89 90 , m_sameOriginRequest(securityOrigin().canRequest(request.url())) 90 91 , m_simpleRequest(true) … … 362 363 ASSERT(m_sameOriginRequest || requestURL.pass().isEmpty()); 363 364 365 if (!m_referrer.isNull()) 366 request.setHTTPReferrer(m_referrer); 367 364 368 if (m_async) { 365 369 ThreadableLoaderOptions options = m_options; -
trunk/Source/WebCore/loader/DocumentThreadableLoader.h
r203971 r204019 1 1 /* 2 2 * Copyright (C) 2009, 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 29 30 */ 30 31 31 #ifndef DocumentThreadableLoader_h 32 #define DocumentThreadableLoader_h 32 #pragma once 33 33 34 34 #include "CrossOriginPreflightChecker.h" … … 49 49 static void loadResourceSynchronously(Document&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&); 50 50 51 static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&& );51 static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&, String&& referrer); 52 52 static RefPtr<DocumentThreadableLoader> create(Document&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&); 53 53 … … 72 72 }; 73 73 74 DocumentThreadableLoader(Document&, ThreadableLoaderClient&, BlockingBehavior, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&& );74 DocumentThreadableLoader(Document&, ThreadableLoaderClient&, BlockingBehavior, ResourceRequest&&, const ThreadableLoaderOptions&, RefPtr<SecurityOrigin>&&, std::unique_ptr<ContentSecurityPolicy>&&, String&&); 75 75 76 76 void clearResource(); … … 104 104 Document& document() { return m_document; } 105 105 const ThreadableLoaderOptions& options() const { return m_options; } 106 const String& referrer() const { return m_referrer; } 106 107 bool isLoading() { return m_resource || m_preflightChecker; } 107 108 … … 111 112 ThreadableLoaderOptions m_options; 112 113 RefPtr<SecurityOrigin> m_origin; 114 String m_referrer; 113 115 bool m_sameOriginRequest; 114 116 bool m_simpleRequest; … … 119 121 120 122 } // namespace WebCore 121 122 #endif // DocumentThreadableLoader_h -
trunk/Source/WebCore/loader/SubresourceLoader.cpp
r204014 r204019 153 153 // This would simplify resource loader users as they would only need to set fetch mode to Cors. 154 154 m_origin = m_resource->origin(); 155 // https://fetch.spec.whatwg.org/#main-fetch, step 11, data URL here is considered not cross origin.156 if (!request.url().protocolIsData() && m_origin && !m_origin->canRequest(request.url()))157 m_resource->setCrossOrigin();158 155 159 156 return true; -
trunk/Source/WebCore/loader/ThreadableLoader.cpp
r203971 r204019 59 59 } 60 60 61 RefPtr<ThreadableLoader> ThreadableLoader::create(ScriptExecutionContext * context, ThreadableLoaderClient*client, ResourceRequest&& request, const ThreadableLoaderOptions& options)61 RefPtr<ThreadableLoader> ThreadableLoader::create(ScriptExecutionContext& context, ThreadableLoaderClient& client, ResourceRequest&& request, const ThreadableLoaderOptions& options) 62 62 { 63 ASSERT(client); 64 ASSERT(context); 65 66 if (is<WorkerGlobalScope>(*context)) 63 if (is<WorkerGlobalScope>(context)) 67 64 return WorkerThreadableLoader::create(downcast<WorkerGlobalScope>(context), client, WorkerRunLoop::defaultMode(), WTFMove(request), options); 68 65 69 return DocumentThreadableLoader::create(downcast<Document>( *context), *client, WTFMove(request), options);66 return DocumentThreadableLoader::create(downcast<Document>(context), client, WTFMove(request), options); 70 67 } 71 68 72 void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext *context, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)69 void ThreadableLoader::loadResourceSynchronously(ScriptExecutionContext& context, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options) 73 70 { 74 ASSERT(context); 75 76 if (is<WorkerGlobalScope>(*context)) 71 if (is<WorkerGlobalScope>(context)) 77 72 WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(context), WTFMove(request), client, options); 78 73 else 79 DocumentThreadableLoader::loadResourceSynchronously(downcast<Document>( *context), WTFMove(request), client, options);80 context ->didLoadResourceSynchronously();74 DocumentThreadableLoader::loadResourceSynchronously(downcast<Document>(context), WTFMove(request), client, options); 75 context.didLoadResourceSynchronously(); 81 76 } 82 77 -
trunk/Source/WebCore/loader/ThreadableLoader.h
r203971 r204019 75 75 WTF_MAKE_NONCOPYABLE(ThreadableLoader); 76 76 public: 77 static void loadResourceSynchronously(ScriptExecutionContext *, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);78 static RefPtr<ThreadableLoader> create(ScriptExecutionContext *, ThreadableLoaderClient*, ResourceRequest&&, const ThreadableLoaderOptions&);77 static void loadResourceSynchronously(ScriptExecutionContext&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&); 78 static RefPtr<ThreadableLoader> create(ScriptExecutionContext&, ThreadableLoaderClient&, ResourceRequest&&, const ThreadableLoaderOptions&); 79 79 80 80 virtual void cancel() = 0; -
trunk/Source/WebCore/loader/ThreadableLoaderClientWrapper.h
r202542 r204019 41 41 class ThreadableLoaderClientWrapper : public ThreadSafeRefCounted<ThreadableLoaderClientWrapper> { 42 42 public: 43 static Ref<ThreadableLoaderClientWrapper> create(ThreadableLoaderClient *client)43 static Ref<ThreadableLoaderClientWrapper> create(ThreadableLoaderClient& client) 44 44 { 45 45 return adoptRef(*new ThreadableLoaderClientWrapper(client)); … … 96 96 97 97 protected: 98 explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient* client) 99 : m_client(client) 100 , m_done(false) 101 { 102 } 98 explicit ThreadableLoaderClientWrapper(ThreadableLoaderClient& client) : m_client(&client) { } 103 99 104 100 ThreadableLoaderClient* m_client; 105 bool m_done ;101 bool m_done { false }; 106 102 }; 107 103 -
trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp
r203971 r204019 1 1 /* 2 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. 3 * Copyright (C) 2016 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary forms, with or without … … 50 51 static const char loadResourceSynchronouslyMode[] = "loadResourceSynchronouslyMode"; 51 52 52 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope * workerGlobalScope, ThreadableLoaderClient*client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)53 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient& client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options) 53 54 : m_workerGlobalScope(workerGlobalScope) 54 55 , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) 55 , m_bridge(*new MainThreadBridge( *m_workerClientWrapper, workerGlobalScope->thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope->url().strippedForUseAsReferrer(), workerGlobalScope->securityOrigin(), workerGlobalScope->contentSecurityPolicy()))56 , m_bridge(*new MainThreadBridge(m_workerClientWrapper.get(), workerGlobalScope.thread().workerLoaderProxy(), taskMode, WTFMove(request), options, workerGlobalScope.url().strippedForUseAsReferrer(), workerGlobalScope.securityOrigin(), workerGlobalScope.contentSecurityPolicy())) 56 57 { 57 58 } … … 62 63 } 63 64 64 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope *workerGlobalScope, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options)65 { 66 WorkerRunLoop& runLoop = workerGlobalScope ->thread().runLoop();65 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& workerGlobalScope, ResourceRequest&& request, ThreadableLoaderClient& client, const ThreadableLoaderOptions& options) 66 { 67 WorkerRunLoop& runLoop = workerGlobalScope.thread().runLoop(); 67 68 68 69 // Create a unique mode just for this synchronous resource load. … … 70 71 mode.append(String::number(runLoop.createUniqueId())); 71 72 72 RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, &client, mode, WTFMove(request), options);73 RefPtr<WorkerThreadableLoader> loader = WorkerThreadableLoader::create(workerGlobalScope, client, mode, WTFMove(request), options); 73 74 MessageQueueWaitResult result = MessageQueueMessageReceived; 74 75 while (!loader->done() && result != MessageQueueTerminated) 75 result = runLoop.runInMode( workerGlobalScope, mode);76 result = runLoop.runInMode(&workerGlobalScope, mode); 76 77 77 78 if (!loader->done() && result == MessageQueueTerminated) … … 118 119 Document& document = downcast<Document>(context); 119 120 120 request.setHTTPReferrer(options->referrer);121 122 121 // 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. 123 122 // Either this should return 0 or the other code path should call a failure callback. 124 m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options->options, WTFMove(options->origin), WTFMove(contentSecurityPolicyCopy) );123 m_mainThreadLoader = DocumentThreadableLoader::create(document, *this, WTFMove(request), options->options, WTFMove(options->origin), WTFMove(contentSecurityPolicyCopy), WTFMove(options->referrer)); 125 124 ASSERT(m_mainThreadLoader || m_loadingFinished); 126 125 }); -
trunk/Source/WebCore/loader/WorkerThreadableLoader.h
r203971 r204019 50 50 WTF_MAKE_FAST_ALLOCATED; 51 51 public: 52 static void loadResourceSynchronously(WorkerGlobalScope *, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&);53 static Ref<WorkerThreadableLoader> create(WorkerGlobalScope * workerGlobalScope, ThreadableLoaderClient*client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options)52 static void loadResourceSynchronously(WorkerGlobalScope&, ResourceRequest&&, ThreadableLoaderClient&, const ThreadableLoaderOptions&); 53 static Ref<WorkerThreadableLoader> create(WorkerGlobalScope& workerGlobalScope, ThreadableLoaderClient& client, const String& taskMode, ResourceRequest&& request, const ThreadableLoaderOptions& options) 54 54 { 55 55 return adoptRef(*new WorkerThreadableLoader(workerGlobalScope, client, taskMode, WTFMove(request), options)); … … 86 86 // The ThreadableLoaderClientWrapper has the underlying client cleared, so no more calls 87 87 // go through it. All tasks posted from the worker object's thread to the worker context's 88 // thread contain the RefPtr<ThreadableLoaderClientWrapper> object, so the 88 // thread contain the RefPtr<ThreadableLoaderClientWrapper> object, so the 89 89 // ThreadableLoaderClientWrapper instance is there until all tasks are executed. 90 90 class MainThreadBridge : public ThreadableLoaderClient { … … 121 121 }; 122 122 123 WorkerThreadableLoader(WorkerGlobalScope *, ThreadableLoaderClient*, const String& taskMode, ResourceRequest&&, const ThreadableLoaderOptions&);123 WorkerThreadableLoader(WorkerGlobalScope&, ThreadableLoaderClient&, const String& taskMode, ResourceRequest&&, const ThreadableLoaderOptions&); 124 124 125 Ref Ptr<WorkerGlobalScope> m_workerGlobalScope;126 Ref Ptr<ThreadableLoaderClientWrapper> m_workerClientWrapper;125 Ref<WorkerGlobalScope> m_workerGlobalScope; 126 Ref<ThreadableLoaderClientWrapper> m_workerClientWrapper; 127 127 MainThreadBridge& m_bridge; 128 128 }; -
trunk/Source/WebCore/loader/cache/CachedResource.cpp
r204014 r204019 184 184 } 185 185 186 static void addAdditionalRequestHeadersToRequest(ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader, CachedResource ::Type type)187 { 188 if ( type== CachedResource::MainResource)186 static void addAdditionalRequestHeadersToRequest(ResourceRequest& request, const CachedResourceLoader& cachedResourceLoader, CachedResource& resource) 187 { 188 if (resource.type() == CachedResource::MainResource) 189 189 return; 190 190 // In some cases we may try to load resources in frameless documents. Such loads always fail. … … 207 207 } 208 208 209 auto referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()->referrerPolicy() : ReferrerPolicy::Default; 210 outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer); 209 // FIXME: Refactor SecurityPolicy::generateReferrerHeader to align with new terminology used in https://w3c.github.io/webappsec-referrer-policy. 210 switch (resource.options().referrerPolicy) { 211 case FetchOptions::ReferrerPolicy::EmptyString: { 212 ReferrerPolicy referrerPolicy = cachedResourceLoader.document() ? cachedResourceLoader.document()->referrerPolicy() : ReferrerPolicy::Default; 213 outgoingReferrer = SecurityPolicy::generateReferrerHeader(referrerPolicy, request.url(), outgoingReferrer); 214 break; } 215 case FetchOptions::ReferrerPolicy::NoReferrerWhenDowngrade: 216 outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Default, request.url(), outgoingReferrer); 217 break; 218 case FetchOptions::ReferrerPolicy::NoReferrer: 219 outgoingReferrer = String(); 220 break; 221 case FetchOptions::ReferrerPolicy::Origin: 222 outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Origin, request.url(), outgoingReferrer); 223 break; 224 case FetchOptions::ReferrerPolicy::OriginWhenCrossOrigin: 225 if (resource.isCrossOrigin()) 226 outgoingReferrer = SecurityPolicy::generateReferrerHeader(ReferrerPolicy::Origin, request.url(), outgoingReferrer); 227 break; 228 case FetchOptions::ReferrerPolicy::UnsafeUrl: 229 break; 230 }; 231 211 232 if (outgoingReferrer.isEmpty()) 212 233 request.clearHTTPReferrer(); … … 220 241 void CachedResource::addAdditionalRequestHeaders(CachedResourceLoader& cachedResourceLoader) 221 242 { 222 addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, type());243 addAdditionalRequestHeadersToRequest(m_resourceRequest, cachedResourceLoader, *this); 223 244 } 224 245 … … 288 309 m_origin = cachedResourceLoader.document()->securityOrigin(); 289 310 ASSERT(m_origin); 311 312 if (!m_resourceRequest.url().protocolIsData() && m_origin && !m_origin->canRequest(m_resourceRequest.url())) 313 setCrossOrigin(); 314 290 315 addAdditionalRequestHeaders(cachedResourceLoader); 291 316 } … … 810 835 811 836 ResourceRequest requestWithFullHeaders(request); 812 addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, type());837 addAdditionalRequestHeadersToRequest(requestWithFullHeaders, cachedResourceLoader, *this); 813 838 814 839 return verifyVaryingRequestHeaders(m_varyingHeaderValues, requestWithFullHeaders, m_sessionID); -
trunk/Source/WebCore/loader/cache/CachedResource.h
r204014 r204019 231 231 232 232 bool allowsCaching() const { return m_options.cachingPolicy == CachingPolicy::AllowCaching; } 233 const FetchOptions& options() const { return m_options; } 233 234 234 235 virtual void destroyDecodedData() { } -
trunk/Source/WebCore/page/EventSource.cpp
r204014 r204019 112 112 options.contentSecurityPolicyEnforcement = scriptExecutionContext()->shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective; 113 113 114 m_loader = ThreadableLoader::create(scriptExecutionContext(), this, WTFMove(request), options); 114 ASSERT(scriptExecutionContext()); 115 m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options); 115 116 116 117 // 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? -
trunk/Source/WebCore/workers/WorkerScriptLoader.cpp
r204014 r204019 57 57 void WorkerScriptLoader::loadSynchronously(ScriptExecutionContext* scriptExecutionContext, const URL& url, FetchOptions::Mode mode, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement) 58 58 { 59 ASSERT(scriptExecutionContext); 60 59 61 m_url = url; 60 62 … … 74 76 options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement; 75 77 76 WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>( scriptExecutionContext), WTFMove(*request), *this, options);78 WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(*scriptExecutionContext), WTFMove(*request), *this, options); 77 79 } 78 80 … … 80 82 { 81 83 ASSERT(client); 84 ASSERT(scriptExecutionContext); 85 82 86 m_client = client; 83 87 m_url = url; … … 99 103 // During create, callbacks may happen which remove the last reference to this object. 100 104 Ref<WorkerScriptLoader> protectedThis(*this); 101 m_threadableLoader = ThreadableLoader::create( scriptExecutionContext,this, WTFMove(*request), options);105 m_threadableLoader = ThreadableLoader::create(*scriptExecutionContext, *this, WTFMove(*request), options); 102 106 } 103 107 -
trunk/Source/WebCore/xml/XMLHttpRequest.cpp
r204014 r204019 714 714 // This is true while running onunload handlers. 715 715 // FIXME: Maybe we need to be able to send XMLHttpRequests from onunload, <http://bugs.webkit.org/show_bug.cgi?id=10904>. 716 m_loader = ThreadableLoader::create( scriptExecutionContext(),this, WTFMove(request), options);716 m_loader = ThreadableLoader::create(*scriptExecutionContext(), *this, WTFMove(request), options); 717 717 718 718 // Neither this object nor the JavaScript wrapper should be deleted while … … 727 727 } else { 728 728 InspectorInstrumentation::willLoadXHRSynchronously(scriptExecutionContext()); 729 ThreadableLoader::loadResourceSynchronously( scriptExecutionContext(), WTFMove(request), *this, options);729 ThreadableLoader::loadResourceSynchronously(*scriptExecutionContext(), WTFMove(request), *this, options); 730 730 InspectorInstrumentation::didLoadXHRSynchronously(scriptExecutionContext()); 731 731 }
Note: See TracChangeset
for help on using the changeset viewer.