Title: [210279] trunk
Revision
210279
Author
[email protected]
Date
2017-01-04 11:20:51 -0800 (Wed, 04 Jan 2017)

Log Message

Web Inspector: Cross Origin importScripts() scripts lack source URL, causes issues with Inspector showing Resource
https://bugs.webkit.org/show_bug.cgi?id=165569
<rdar://problem/29607569>

Patch by Joseph Pecoraro <[email protected]> on 2017-01-04
Reviewed by Youenn Fablet.

Source/WebCore:

Test: http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html

* Modules/fetch/FetchLoader.cpp:
(WebCore::FetchLoader::start):
* loader/DocumentThreadableLoader.cpp:
(WebCore::DocumentThreadableLoader::didReceiveResponse):
* loader/ThreadableLoader.cpp:
(WebCore::ThreadableLoaderOptions::ThreadableLoaderOptions):
* loader/ThreadableLoader.h:
* loader/WorkerThreadableLoader.cpp:
(WebCore::LoaderTaskOptions::LoaderTaskOptions):
Add a new ThreadableLoader option to avoid filtering the response.

* workers/WorkerScriptLoader.cpp:
(WebCore::WorkerScriptLoader::loadSynchronously):
(WebCore::WorkerScriptLoader::loadAsynchronously):
Disable filtering of the response. This is an internal load, we
don't want to filter data that would be valuable later.

LayoutTests:

* http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts-expected.txt: Added.
* http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html: Added.
* http/tests/inspector/worker/resources/worker-blob-import-script.js: Added.
* http/tests/inspector/worker/resources/worker-blob-script.js: Added.
Ensure cross origin scripts imported by workers still get the correct Script URL.
Also this provides a test for worker started with a blob URL.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (210278 => 210279)


--- trunk/LayoutTests/ChangeLog	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/LayoutTests/ChangeLog	2017-01-04 19:20:51 UTC (rev 210279)
@@ -1,3 +1,18 @@
+2017-01-04  Joseph Pecoraro  <[email protected]>
+
+        Web Inspector: Cross Origin importScripts() scripts lack source URL, causes issues with Inspector showing Resource
+        https://bugs.webkit.org/show_bug.cgi?id=165569
+        <rdar://problem/29607569>
+
+        Reviewed by Youenn Fablet.
+
+        * http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts-expected.txt: Added.
+        * http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html: Added.
+        * http/tests/inspector/worker/resources/worker-blob-import-script.js: Added.
+        * http/tests/inspector/worker/resources/worker-blob-script.js: Added.
+        Ensure cross origin scripts imported by workers still get the correct Script URL.
+        Also this provides a test for worker started with a blob URL.
+
 2017-01-03  Ryosuke Niwa  <[email protected]>
 
         label element with tabindex >= 0 is not focusable

Added: trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts-expected.txt (0 => 210279)


--- trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts-expected.txt	2017-01-04 19:20:51 UTC (rev 210279)
@@ -0,0 +1,14 @@
+Test for Resources in a Worker started with a Blob URL that imports cross origin scripts.
+
+
+== Running test suite: Worker.Resources
+-- Running test case: Worker.Resource.Start
+PASS: Added Target should have Worker type.
+RESOURCES:
+http://localhost:8000/inspector/worker/resources/worker-blob-script.js
+http://localhost:8000/inspector/worker/resources/worker-blob-import-script.js
+SCRIPTS:
+blob:<sanitized>
+http://localhost:8000/inspector/worker/resources/worker-blob-script.js
+http://localhost:8000/inspector/worker/resources/worker-blob-import-script.js
+

Added: trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html (0 => 210279)


--- trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html	                        (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html	2017-01-04 19:20:51 UTC (rev 210279)
@@ -0,0 +1,91 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<script>
+let worker;
+
+function triggerWorkerStart() {
+    let blob = new Blob([`importScripts(["http://localhost:8000/inspector/worker/resources/worker-blob-script.js"]);`]);
+    let blobURL = URL.createObjectURL(blob);
+    worker = new Worker(blobURL);
+}
+
+function test()
+{
+    let workerTarget;
+    let mainTarget = WebInspector.mainTarget;
+
+    function sanitizeURL(url) {
+        if (!url)
+            return "<null>";
+        if (url.startsWith("blob:"))
+            return "blob:<sanitized>";
+        return url;
+    }
+
+    function dumpURLs(urls) {
+        if (!urls.length)
+            InspectorTest.log("-- None --");
+        else {
+            urls.sort((a, b) => a <= b)
+            for (let url of urls)
+                InspectorTest.log(url);
+        }
+    }
+
+    function dumpWorkerScripts() {
+        InspectorTest.log("SCRIPTS:");
+        let targetData = WebInspector.debuggerManager.dataForTarget(workerTarget);
+        let urls = [];
+        for (let script of targetData.scripts)
+            urls.push(sanitizeURL(script.url));
+        dumpURLs(urls);
+    }
+
+    function dumpWorkerResources() {
+        InspectorTest.log("RESOURCES:");
+        let urls = [];
+        for (let resource of workerTarget.resourceCollection.items)
+            urls.push(sanitizeURL(resource.url));
+        dumpURLs(urls);
+    }
+
+    let suite = InspectorTest.createAsyncSuite("Worker.Resources");
+
+    suite.addTestCase({
+        name: "Worker.Resource.Start",
+        description: "Start the worker and load multiple resources.",
+        test(resolve, reject) {
+            InspectorTest.evaluateInPage("triggerWorkerStart()");
+
+            WebInspector.targetManager.singleFireEventListener(WebInspector.TargetManager.Event.TargetAdded, (event) => {
+                workerTarget = event.data.target;
+                InspectorTest.assert(workerTarget instanceof WebInspector.Target);
+                InspectorTest.expectEqual(workerTarget.type, WebInspector.Target.Type.Worker, "Added Target should have Worker type.");
+            });
+
+            let seen = 0;
+            const expected = 3;
+            let listener = WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, (event) => {
+                if (event.data.script.target === workerTarget)
+                    seen++;
+                if (seen !== expected)
+                    return;
+
+                WebInspector.debuggerManager.removeEventListener(WebInspector.DebuggerManager.Event.ScriptAdded, listener);
+                dumpWorkerResources();
+                dumpWorkerScripts();
+                resolve();
+            });
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+</script>
+</head>
+<body _onload_="runTest()">
+<p>Test for Resources in a Worker started with a Blob URL that imports cross origin scripts.</p>
+</body>
+</html>

Added: trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-import-script.js (0 => 210279)


--- trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-import-script.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-import-script.js	2017-01-04 19:20:51 UTC (rev 210279)
@@ -0,0 +1,3 @@
+function workerBlobImportScript() {
+    console.trace("workerBlobImportScript");
+}

Added: trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-script.js (0 => 210279)


--- trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-script.js	                        (rev 0)
+++ trunk/LayoutTests/http/tests/inspector/worker/resources/worker-blob-script.js	2017-01-04 19:20:51 UTC (rev 210279)
@@ -0,0 +1 @@
+importScripts(["http://localhost:8000/inspector/worker/resources/worker-blob-import-script.js"]);

Modified: trunk/Source/WebCore/ChangeLog (210278 => 210279)


--- trunk/Source/WebCore/ChangeLog	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/ChangeLog	2017-01-04 19:20:51 UTC (rev 210279)
@@ -1,3 +1,30 @@
+2017-01-04  Joseph Pecoraro  <[email protected]>
+
+        Web Inspector: Cross Origin importScripts() scripts lack source URL, causes issues with Inspector showing Resource
+        https://bugs.webkit.org/show_bug.cgi?id=165569
+        <rdar://problem/29607569>
+
+        Reviewed by Youenn Fablet.
+
+        Test: http/tests/inspector/worker/blob-script-with-cross-domain-imported-scripts.html
+
+        * Modules/fetch/FetchLoader.cpp:
+        (WebCore::FetchLoader::start):
+        * loader/DocumentThreadableLoader.cpp:
+        (WebCore::DocumentThreadableLoader::didReceiveResponse):
+        * loader/ThreadableLoader.cpp:
+        (WebCore::ThreadableLoaderOptions::ThreadableLoaderOptions):
+        * loader/ThreadableLoader.h:
+        * loader/WorkerThreadableLoader.cpp:
+        (WebCore::LoaderTaskOptions::LoaderTaskOptions):
+        Add a new ThreadableLoader option to avoid filtering the response.
+
+        * workers/WorkerScriptLoader.cpp:
+        (WebCore::WorkerScriptLoader::loadSynchronously):
+        (WebCore::WorkerScriptLoader::loadAsynchronously):
+        Disable filtering of the response. This is an internal load, we
+        don't want to filter data that would be valuable later.
+
 2017-01-03  Sam Weinig  <[email protected]>
 
         Remove final custom binding from IDBRequest

Modified: trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp (210278 => 210279)


--- trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/Modules/fetch/FetchLoader.cpp	2017-01-04 19:20:51 UTC (rev 210279)
@@ -77,7 +77,7 @@
     ThreadableLoaderOptions options(request.fetchOptions(), ConsiderPreflight,
         context.shouldBypassMainWorldContentSecurityPolicy() ? ContentSecurityPolicyEnforcement::DoNotEnforce : ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective,
         String(cachedResourceRequestInitiators().fetch),
-        OpaqueResponseBodyPolicy::DoNotReceive);
+        OpaqueResponseBodyPolicy::DoNotReceive, ResponseFilteringPolicy::Enable);
     options.sendLoadCallbacks = SendCallbacks;
     options.dataBufferingPolicy = DoNotBufferData;
     options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;

Modified: trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp (210278 => 210279)


--- trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp	2017-01-04 19:20:51 UTC (rev 210279)
@@ -286,7 +286,7 @@
 
     ASSERT(response.type() != ResourceResponse::Type::Error);
     if (response.type() == ResourceResponse::Type::Default) {
-        m_client->didReceiveResponse(identifier, ResourceResponse::filterResponse(response, tainting));
+        m_client->didReceiveResponse(identifier, options().filteringPolicy == ResponseFilteringPolicy::Enable ? ResourceResponse::filterResponse(response, tainting) : response);
         if (tainting == ResourceResponse::Tainting::Opaque && options().opaqueResponse == OpaqueResponseBodyPolicy::DoNotReceive) {
             clearResource();
             if (m_client)

Modified: trunk/Source/WebCore/loader/ThreadableLoader.cpp (210278 => 210279)


--- trunk/Source/WebCore/loader/ThreadableLoader.cpp	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/loader/ThreadableLoader.cpp	2017-01-04 19:20:51 UTC (rev 210279)
@@ -52,12 +52,13 @@
 {
 }
 
-ThreadableLoaderOptions::ThreadableLoaderOptions(const ResourceLoaderOptions& baseOptions, PreflightPolicy preflightPolicy, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, String&& initiator, OpaqueResponseBodyPolicy opaqueResponse)
+ThreadableLoaderOptions::ThreadableLoaderOptions(const ResourceLoaderOptions& baseOptions, PreflightPolicy preflightPolicy, ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement, String&& initiator, OpaqueResponseBodyPolicy opaqueResponse, ResponseFilteringPolicy filteringPolicy)
     : ResourceLoaderOptions(baseOptions)
     , preflightPolicy(preflightPolicy)
     , contentSecurityPolicyEnforcement(contentSecurityPolicyEnforcement)
     , initiator(WTFMove(initiator))
     , opaqueResponse(opaqueResponse)
+    , filteringPolicy(filteringPolicy)
 {
 }
 

Modified: trunk/Source/WebCore/loader/ThreadableLoader.h (210278 => 210279)


--- trunk/Source/WebCore/loader/ThreadableLoader.h	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/loader/ThreadableLoader.h	2017-01-04 19:20:51 UTC (rev 210279)
@@ -62,9 +62,14 @@
         DoNotReceive
     };
 
+    enum class ResponseFilteringPolicy {
+        Enable,
+        Disable,
+    };
+
     struct ThreadableLoaderOptions : ResourceLoaderOptions {
         ThreadableLoaderOptions();
-        ThreadableLoaderOptions(const ResourceLoaderOptions&, PreflightPolicy, ContentSecurityPolicyEnforcement, String&& initiator, OpaqueResponseBodyPolicy);
+        ThreadableLoaderOptions(const ResourceLoaderOptions&, PreflightPolicy, ContentSecurityPolicyEnforcement, String&& initiator, OpaqueResponseBodyPolicy, ResponseFilteringPolicy);
         ~ThreadableLoaderOptions();
 
         PreflightPolicy preflightPolicy { ConsiderPreflight };
@@ -71,6 +76,7 @@
         ContentSecurityPolicyEnforcement contentSecurityPolicyEnforcement { ContentSecurityPolicyEnforcement::EnforceConnectSrcDirective };
         String initiator; // This cannot be an AtomicString, as isolatedCopy() wouldn't create an object that's safe for passing to another thread.
         OpaqueResponseBodyPolicy opaqueResponse { OpaqueResponseBodyPolicy::Receive };
+        ResponseFilteringPolicy filteringPolicy { ResponseFilteringPolicy::Enable };
     };
 
     // Useful for doing loader operations from any thread (not threadsafe,

Modified: trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp (210278 => 210279)


--- trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/loader/WorkerThreadableLoader.cpp	2017-01-04 19:20:51 UTC (rev 210279)
@@ -92,7 +92,7 @@
 };
 
 LoaderTaskOptions::LoaderTaskOptions(const ThreadableLoaderOptions& options, const String& referrer, Ref<SecurityOrigin>&& origin)
-    : options(options, options.preflightPolicy, options.contentSecurityPolicyEnforcement, options.initiator.isolatedCopy(), options.opaqueResponse)
+    : options(options, options.preflightPolicy, options.contentSecurityPolicyEnforcement, options.initiator.isolatedCopy(), options.opaqueResponse, options.filteringPolicy)
     , referrer(referrer.isolatedCopy())
     , origin(WTFMove(origin))
 {

Modified: trunk/Source/WebCore/workers/WorkerScriptLoader.cpp (210278 => 210279)


--- trunk/Source/WebCore/workers/WorkerScriptLoader.cpp	2017-01-04 19:14:58 UTC (rev 210278)
+++ trunk/Source/WebCore/workers/WorkerScriptLoader.cpp	2017-01-04 19:20:51 UTC (rev 210279)
@@ -66,6 +66,7 @@
     options.mode = mode;
     options.sendLoadCallbacks = SendCallbacks;
     options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
+    options.filteringPolicy = ResponseFilteringPolicy::Disable;
 
     WorkerThreadableLoader::loadResourceSynchronously(downcast<WorkerGlobalScope>(*scriptExecutionContext), WTFMove(*request), *this, options);
 }
@@ -91,6 +92,7 @@
     options.mode = mode;
     options.sendLoadCallbacks = SendCallbacks;
     options.contentSecurityPolicyEnforcement = contentSecurityPolicyEnforcement;
+    options.filteringPolicy = ResponseFilteringPolicy::Disable;
 
     // During create, callbacks may happen which remove the last reference to this object.
     Ref<WorkerScriptLoader> protectedThis(*this);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to