Title: [267723] trunk
Revision
267723
Author
[email protected]
Date
2020-09-28 20:49:32 -0700 (Mon, 28 Sep 2020)

Log Message

Web Inspector: add checkbox to local override popover to allow it to skip the network
https://bugs.webkit.org/show_bug.cgi?id=217031

Reviewed by Brian Burg.

Source/WebInspectorUI:

* UserInterface/Models/LocalResourceOverride.js:
(WI.LocalResourceOverride):
(WI.LocalResourceOverride.create):
(WI.LocalResourceOverride.fromJSON):
(WI.LocalResourceOverride.prototype.toJSON):
(WI.LocalResourceOverride.prototype.get type): Added.
(WI.LocalResourceOverride.prototype.saveIdentityToCookie):
Introduce a `WI.LocalResourceOverride.Type` that is used when handling request/response
interceptions to determined the `Network` command for continuing.

* UserInterface/Controllers/NetworkManager.js:
(WI.NetworkManager.supportsOverridingRequestsWithResponses): Added.
(WI.NetworkManager.supportsOverridingResponses): Added.
(WI.NetworkManager.prototype.initializeTarget):
(WI.NetworkManager.prototype.addLocalResourceOverride):
(WI.NetworkManager.prototype.removeLocalResourceOverride):
(WI.NetworkManager.prototype.requestIntercepted):
(WI.NetworkManager.prototype.responseIntercepted):
(WI.NetworkManager.prototype._commandArgumentsForInterception):
(WI.NetworkManager.prototype._addInterception): Added.
(WI.NetworkManager.prototype._removeInterception): Added.
(WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged):
(WI.NetworkManager.supportsLocalResourceOverrides): Deleted.
Add logic for `Network.interceptRequestWithResponse` in `Network.requestIntercepted`.
Drive-by: refactor common logic into member functions.

* UserInterface/Views/LocalResourceOverridePopover.js:
(WI.LocalResourceOverridePopover.prototype.get serializedData):
(WI.LocalResourceOverridePopover.prototype.show):
* UserInterface/Views/LocalResourceOverridePopover.css:
(.popover .local-resource-override-popover-content .add-header + .reference-page-link-container): Added.
(.popover .local-resource-override-popover-content .options td): Added.
(.popover .local-resource-override-popover-content .reference-page-link-container): Deleted.
Add an "Options" row containing a "[ ] Skip Network" checkbox for controlling whether
`Network.interceptWithResponse` or `Network.interceptRequestWithResponse` is used.

* UserInterface/Models/Resource.js:
(WI.Resource.prototype.async createLocalResourceOverride):
* UserInterface/Views/ContextMenuUtilities.js:
(WI.appendContextMenuItemsForSourceCode):
* UserInterface/Views/FontResourceContentView.js:
(WI.FontResourceContentView.prototype.contentAvailable):
* UserInterface/Views/ImageResourceContentView.js:
(WI.ImageResourceContentView.prototype.contentAvailable):
* UserInterface/Views/LocalResourceOverrideTreeElement.js:
(WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover):
* UserInterface/Views/OpenResourceDialog.js:
(WI.OpenResourceDialog.prototype._addLocalResourceOverrides):
* UserInterface/Views/ResourceContentView.js:
(WI.ResourceContentView):
(WI.ResourceContentView.prototype.closed):
* UserInterface/Views/SourcesNavigationSidebarPanel.js:
(WI.SourcesNavigationSidebarPanel):
(WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover):
(WI.SourcesNavigationSidebarPanel.prototype._addLocalOverride):
(WI.SourcesNavigationSidebarPanel.prototype._removeResourceOverride):
(WI.SourcesNavigationSidebarPanel.prototype._populateCreateResourceContextMenu):
Rename `supportsLocalResourceOverrides` to `supportsOverridingResponses` for clarity.

* Localizations/en.lproj/localizedStrings.js:

LayoutTests:

* http/tests/inspector/network/local-resource-override-basic.html:
* http/tests/inspector/network/local-resource-override-main-resource.html:
* http/tests/inspector/network/local-resource-override-script-tag.html:
* http/tests/inspector/network/resource-response-inspector-override.html:
Add expected parameter for `WI.LocalResourceOverride.create` calls.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (267722 => 267723)


--- trunk/LayoutTests/ChangeLog	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/LayoutTests/ChangeLog	2020-09-29 03:49:32 UTC (rev 267723)
@@ -1,3 +1,16 @@
+2020-09-28  Devin Rousso  <[email protected]>
+
+        Web Inspector: add checkbox to local override popover to allow it to skip the network
+        https://bugs.webkit.org/show_bug.cgi?id=217031
+
+        Reviewed by Brian Burg.
+
+        * http/tests/inspector/network/local-resource-override-basic.html:
+        * http/tests/inspector/network/local-resource-override-main-resource.html:
+        * http/tests/inspector/network/local-resource-override-script-tag.html:
+        * http/tests/inspector/network/resource-response-inspector-override.html:
+        Add expected parameter for `WI.LocalResourceOverride.create` calls.
+
 2020-09-28  Ryosuke Niwa  <[email protected]>
 
         Document.p.contains returns true for nodes in shadow tree

Modified: trunk/LayoutTests/http/tests/inspector/network/local-resource-override-basic.html (267722 => 267723)


--- trunk/LayoutTests/http/tests/inspector/network/local-resource-override-basic.html	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/LayoutTests/http/tests/inspector/network/local-resource-override-basic.html	2020-09-29 03:49:32 UTC (rev 267723)
@@ -45,7 +45,7 @@
                 let localResourceOverrides = [];
                 for (let override of overrides) {
                     InspectorTest.log("Creating Local Resource Override for: " + override.url);
-                    let localResourceOverride = WI.LocalResourceOverride.create(override);
+                    let localResourceOverride = WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, override);
                     WI.networkManager.addLocalResourceOverride(localResourceOverride);
                     localResourceOverrides.push(localResourceOverride);
                 }
@@ -282,7 +282,7 @@
         name: "LocalResourceOverride.URL.Fragment",
         description: "LocalResourceOverride creation strips a fragment",
         async test() {
-            let localResourceOverride = WI.LocalResourceOverride.create({
+            let localResourceOverride = WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, {
                 url: "http://127.0.0.1:8000/inspector/network/resources/override.txt#test",
                 mimeType: "text/plain",
                 content: "OVERRIDDEN TEXT",

Modified: trunk/LayoutTests/http/tests/inspector/network/local-resource-override-main-resource.html (267722 => 267723)


--- trunk/LayoutTests/http/tests/inspector/network/local-resource-override-main-resource.html	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/LayoutTests/http/tests/inspector/network/local-resource-override-main-resource.html	2020-09-29 03:49:32 UTC (rev 267723)
@@ -12,7 +12,7 @@
         name: "LocalResourceOverride.MainResource",
         description: "Main resource uses override content on next page load",
         async test() {
-            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create({
+            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, {
                 url: "http://127.0.0.1:8000/inspector/network/local-resource-override-main-resource.html",
                 mimeType: "text/html",
                 content: `<!DOCTYPE html><html><head><script src="" page content</p><script>alert("REPLACED HTML CONTENT"); TestPage.completeTest();</`+`script></body></html>`,

Modified: trunk/LayoutTests/http/tests/inspector/network/local-resource-override-script-tag.html (267722 => 267723)


--- trunk/LayoutTests/http/tests/inspector/network/local-resource-override-script-tag.html	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/LayoutTests/http/tests/inspector/network/local-resource-override-script-tag.html	2020-09-29 03:49:32 UTC (rev 267723)
@@ -12,7 +12,7 @@
         name: "LocalResourceOverride.Script.Tag",
         description: "<script> load uses override content on next page load",
         async test() {
-            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create({
+            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, {
                 url: "http://127.0.0.1:8000/inspector/network/resources/override.js",
                 mimeType: "text/_javascript_",
                 content: `alert("OVERRIDDEN override.js TEXT"); TestPage.dispatchEventToFrontend("OverrideContentDidLoad");`,

Modified: trunk/LayoutTests/http/tests/inspector/network/resource-response-inspector-override.html (267722 => 267723)


--- trunk/LayoutTests/http/tests/inspector/network/resource-response-inspector-override.html	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/LayoutTests/http/tests/inspector/network/resource-response-inspector-override.html	2020-09-29 03:49:32 UTC (rev 267723)
@@ -42,7 +42,7 @@
         responseSource: WI.Resource.ResponseSource.InspectorOverride,
         statusCode: 987,
         async setup() {
-            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create({
+            WI.networkManager.addLocalResourceOverride(WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, {
                 url: "http://127.0.0.1:8000/inspector/network/resources/override.txt",
                 mimeType: "text/plain",
                 content: "Overridden Text",

Modified: trunk/Source/WebInspectorUI/ChangeLog (267722 => 267723)


--- trunk/Source/WebInspectorUI/ChangeLog	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/ChangeLog	2020-09-29 03:49:32 UTC (rev 267723)
@@ -1,3 +1,71 @@
+2020-09-28  Devin Rousso  <[email protected]>
+
+        Web Inspector: add checkbox to local override popover to allow it to skip the network
+        https://bugs.webkit.org/show_bug.cgi?id=217031
+
+        Reviewed by Brian Burg.
+
+        * UserInterface/Models/LocalResourceOverride.js:
+        (WI.LocalResourceOverride):
+        (WI.LocalResourceOverride.create):
+        (WI.LocalResourceOverride.fromJSON):
+        (WI.LocalResourceOverride.prototype.toJSON):
+        (WI.LocalResourceOverride.prototype.get type): Added.
+        (WI.LocalResourceOverride.prototype.saveIdentityToCookie):
+        Introduce a `WI.LocalResourceOverride.Type` that is used when handling request/response
+        interceptions to determined the `Network` command for continuing.
+
+        * UserInterface/Controllers/NetworkManager.js:
+        (WI.NetworkManager.supportsOverridingRequestsWithResponses): Added.
+        (WI.NetworkManager.supportsOverridingResponses): Added.
+        (WI.NetworkManager.prototype.initializeTarget):
+        (WI.NetworkManager.prototype.addLocalResourceOverride):
+        (WI.NetworkManager.prototype.removeLocalResourceOverride):
+        (WI.NetworkManager.prototype.requestIntercepted):
+        (WI.NetworkManager.prototype.responseIntercepted):
+        (WI.NetworkManager.prototype._commandArgumentsForInterception):
+        (WI.NetworkManager.prototype._addInterception): Added.
+        (WI.NetworkManager.prototype._removeInterception): Added.
+        (WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged):
+        (WI.NetworkManager.supportsLocalResourceOverrides): Deleted.
+        Add logic for `Network.interceptRequestWithResponse` in `Network.requestIntercepted`.
+        Drive-by: refactor common logic into member functions.
+
+        * UserInterface/Views/LocalResourceOverridePopover.js:
+        (WI.LocalResourceOverridePopover.prototype.get serializedData):
+        (WI.LocalResourceOverridePopover.prototype.show):
+        * UserInterface/Views/LocalResourceOverridePopover.css:
+        (.popover .local-resource-override-popover-content .add-header + .reference-page-link-container): Added.
+        (.popover .local-resource-override-popover-content .options td): Added.
+        (.popover .local-resource-override-popover-content .reference-page-link-container): Deleted.
+        Add an "Options" row containing a "[ ] Skip Network" checkbox for controlling whether
+        `Network.interceptWithResponse` or `Network.interceptRequestWithResponse` is used.
+
+        * UserInterface/Models/Resource.js:
+        (WI.Resource.prototype.async createLocalResourceOverride):
+        * UserInterface/Views/ContextMenuUtilities.js:
+        (WI.appendContextMenuItemsForSourceCode):
+        * UserInterface/Views/FontResourceContentView.js:
+        (WI.FontResourceContentView.prototype.contentAvailable):
+        * UserInterface/Views/ImageResourceContentView.js:
+        (WI.ImageResourceContentView.prototype.contentAvailable):
+        * UserInterface/Views/LocalResourceOverrideTreeElement.js:
+        (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover):
+        * UserInterface/Views/OpenResourceDialog.js:
+        (WI.OpenResourceDialog.prototype._addLocalResourceOverrides):
+        * UserInterface/Views/ResourceContentView.js:
+        (WI.ResourceContentView):
+        (WI.ResourceContentView.prototype.closed):
+        * UserInterface/Views/SourcesNavigationSidebarPanel.js:
+        (WI.SourcesNavigationSidebarPanel):
+        (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover):
+        (WI.SourcesNavigationSidebarPanel.prototype._addLocalOverride):
+        (WI.SourcesNavigationSidebarPanel.prototype._removeResourceOverride):
+        (WI.SourcesNavigationSidebarPanel.prototype._populateCreateResourceContextMenu):
+        Rename `supportsLocalResourceOverrides` to `supportsOverridingResponses` for clarity.
+
+        * Localizations/en.lproj/localizedStrings.js:
+
 2020-09-25  Nikita Vasilyev  <[email protected]>
 
         Uncaught Exception: TypeError: null is not an object (evaluating 'this.listItemElement.classList')

Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -1206,6 +1206,8 @@
 localizedStrings["Size"] = "Size";
 localizedStrings["Size of current object plus all objects it keeps alive"] = "Size of current object plus all objects it keeps alive";
 localizedStrings["Sizes"] = "Sizes";
+/* Label for checkbox that controls whether the local override will actually perform a network request or skip it to immediately serve the response. */
+localizedStrings["Skip Network @ Local Override Popover Options"] = "Skip Network";
 localizedStrings["Snapshot %d"] = "Snapshot %d";
 localizedStrings["Snapshot %d \u2014 %s"] = "Snapshot %d \u2014 %s";
 localizedStrings["Snapshot Comparison (%d and %d)"] = "Snapshot Comparison (%d and %d)";

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -57,7 +57,7 @@
 
         WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._handleFrameMainResourceDidChange, this);
 
-        if (NetworkManager.supportsLocalResourceOverrides()) {
+        if (NetworkManager.supportsOverridingResponses()) {
             WI.Resource.addEventListener(WI.SourceCode.Event.ContentDidChange, this._handleResourceContentDidChange, this);
             WI.LocalResourceOverride.addEventListener(WI.LocalResourceOverride.Event.DisabledChanged, this._handleResourceOverrideDisabledChanged, this);
 
@@ -68,6 +68,19 @@
                 for (let serializedLocalResourceOverride of serializedLocalResourceOverrides) {
                     let localResourceOverride = WI.LocalResourceOverride.fromJSON(serializedLocalResourceOverride);
 
+                    let supported = false;
+                    switch (localResourceOverride.type) {
+                    case WI.LocalResourceOverride.InterceptType.Response:
+                        supported = WI.NetworkManager.supportsOverridingResponses();
+                        break;
+
+                    case WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork:
+                        supported = WI.NetworkManager.supportsOverridingRequestsWithResponses();
+                        break;
+                    }
+                    if (!supported)
+                        continue;
+
                     const key = null;
                     WI.objectStores.localResourceOverrides.associateObject(localResourceOverride, key, serializedLocalResourceOverride);
 
@@ -97,11 +110,18 @@
             && InspectorBackend.hasCommand("Network.getSerializedCertificate");
     }
 
-    static supportsLocalResourceOverrides()
+    static supportsOverridingRequestsWithResponses()
     {
-        return InspectorBackend.hasCommand("Network.setInterceptionEnabled");
+        // COMPATIBILITY (iOS 13.4): Network.interceptRequestWithResponse did not exist yet.
+        return InspectorBackend.hasCommand("Network.interceptRequestWithResponse");
     }
 
+    static supportsOverridingResponses()
+    {
+        // COMPATIBILITY (iOS 13.0): Network.interceptWithResponse did not exist yet.
+        return InspectorBackend.hasCommand("Network.interceptWithResponse");
+    }
+
     static supportsBootstrapScript()
     {
         return InspectorBackend.hasCommand("Page.setBootstrapScript");
@@ -161,14 +181,8 @@
                     target.NetworkAgent.setInterceptionEnabled(this._interceptionEnabled);
 
                 for (let localResourceOverride of this._localResourceOverrides) {
-                    if (!localResourceOverride.disabled) {
-                        target.NetworkAgent.addInterception.invoke({
-                            url: localResourceOverride.url,
-                            stage: InspectorBackend.Enum.Network.NetworkStage.Response,
-                            caseSensitive: localResourceOverride.isCaseSensitive,
-                            isRegex: localResourceOverride.isRegex,
-                        });
-                    }
+                    if (!localResourceOverride.disabled)
+                        this._addInterception(localResourceOverride, target);
                 }
             }
         }
@@ -364,21 +378,9 @@
         if (!this._restoringLocalResourceOverrides)
             WI.objectStores.localResourceOverrides.putObject(localResourceOverride);
 
-        if (!localResourceOverride.disabled) {
-            let commandArguments = {
-                url: localResourceOverride.url,
-                caseSensitive: localResourceOverride.isCaseSensitive,
-                isRegex: localResourceOverride.isRegex,
-                stage: InspectorBackend.Enum.Network.NetworkStage.Response,
-            };
+        if (!localResourceOverride.disabled)
+            this._addInterception(localResourceOverride);
 
-            // COMPATIBILITY (iOS 13.0): Network.addInterception did not exist.
-            for (let target of WI.targets) {
-                if (target.hasCommand("Network.addInterception"))
-                    target.NetworkAgent.addInterception.invoke(commandArguments);
-            }
-        }
-
         this.dispatchEventToListeners(WI.NetworkManager.Event.LocalResourceOverrideAdded, {localResourceOverride});
     }
 
@@ -397,21 +399,9 @@
         if (!this._restoringLocalResourceOverrides)
             WI.objectStores.localResourceOverrides.deleteObject(localResourceOverride);
 
-        if (!localResourceOverride.disabled) {
-            let commandArguments = {
-                url: localResourceOverride.url,
-                caseSensitive: localResourceOverride.isCaseSensitive,
-                isRegex: localResourceOverride.isRegex,
-                stage: InspectorBackend.Enum.Network.NetworkStage.Response,
-            };
+        if (!localResourceOverride.disabled)
+            this._removeInterception(localResourceOverride);
 
-            // COMPATIBILITY (iOS 13.0): Network.removeInterception did not exist.
-            for (let target of WI.targets) {
-                if (target.hasCommand("Network.removeInterception"))
-                    target.NetworkAgent.removeInterception.invoke(commandArguments);
-            }
-        }
-
         this.dispatchEventToListeners(WI.NetworkManager.Event.LocalResourceOverrideRemoved, {localResourceOverride});
     }
 
@@ -942,8 +932,38 @@
 
     requestIntercepted(target, requestId, request)
     {
-        // FIXME: add request interception support to the frontend.
-        this.dispatchEventToListeners(WI.NetworkManager.Event.RequestIntercepted, {target, requestId, request});
+        if (window.InspectorTest) {
+            // FIXME: <https://webkit.org/b/217032> Web Inspector: add UI for request interception
+            this.dispatchEventToListeners(WI.NetworkManager.Event.RequestIntercepted, {target, requestId, request});
+            return;
+        }
+
+        let url = ""
+        let localResourceOverride = this.localResourceOverrideForURL(url);
+        if (!localResourceOverride || localResourceOverride.disabled) {
+            target.NetworkAgent.interceptContinue.invoke({
+                requestId,
+                stage: InspectorBackend.Enum.Network.NetworkStage.Request,
+            });
+            return;
+        }
+
+        console.assert(localResourceOverride.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork, localResourceOverride);
+
+        let localResource = localResourceOverride.localResource;
+        let revision = localResource.currentRevision;
+
+        console.assert(revision.mimeType === localResource.mimeType);
+
+        target.NetworkAgent.interceptRequestWithResponse.invoke({
+            requestId,
+            content: revision.content,
+            base64Encoded: !!revision.base64Encoded,
+            mimeType: revision.mimeType,
+            status: !isNaN(localResource.statusCode) ? localResource.statusCode : 200,
+            statusText: localResource.statusText ?? WI.HTTPUtilities.statusTextForStatusCode(200),
+            headers: localResource.responseHeaders ?? {},
+        });
     }
 
     responseIntercepted(target, requestId, response)
@@ -958,6 +978,8 @@
             return;
         }
 
+        console.assert(localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Response, localResourceOverride);
+
         let localResource = localResourceOverride.localResource;
         let revision = localResource.currentRevision;
 
@@ -1280,6 +1302,47 @@
         resources.push(resource);
     }
 
+    _commandArgumentsForInterception(localResourceOverride)
+    {
+        console.assert(localResourceOverride instanceof WI.LocalResourceOverride, localResourceOverride);
+
+        return {
+            url: localResourceOverride.url,
+            stage: localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Response ? InspectorBackend.Enum.Network.NetworkStage.Response : InspectorBackend.Enum.Network.NetworkStage.Request,
+            caseSensitive: localResourceOverride.isCaseSensitive,
+            isRegex: localResourceOverride.isRegex,
+        };
+    }
+
+    _addInterception(localResourceOverride, specificTarget)
+    {
+        console.assert(localResourceOverride instanceof WI.LocalResourceOverride, localResourceOverride);
+        console.assert(!localResourceOverride.disabled, localResourceOverride);
+
+        let targets = specificTarget ? [specificTarget] : WI.targets;
+        for (let target of targets) {
+            // COMPATIBILITY (iOS 13.0): Network.addInterception did not exist yet.
+            if (!target.hasCommand("Network.addInterception"))
+                continue;
+
+            target.NetworkAgent.addInterception.invoke(this._commandArgumentsForInterception(localResourceOverride));
+        }
+    }
+
+    _removeInterception(localResourceOverride, specificTarget)
+    {
+        console.assert(localResourceOverride instanceof WI.LocalResourceOverride, localResourceOverride);
+
+        let targets = specificTarget ? [specificTarget] : WI.targets;
+        for (let target of targets) {
+            // COMPATIBILITY (iOS 13.0): Network.removeInterception did not exist yet.
+            if (!target.hasCommand("Network.removeInterception"))
+                continue;
+
+            target.NetworkAgent.removeInterception.invoke(this._commandArgumentsForInterception(localResourceOverride));
+        }
+    }
+
     _dispatchFrameWasAddedEvent(frame)
     {
         this.dispatchEventToListeners(WI.NetworkManager.Event.FrameWasAdded, {frame});
@@ -1408,27 +1471,15 @@
 
     _handleResourceOverrideDisabledChanged(event)
     {
-        console.assert(WI.NetworkManager.supportsLocalResourceOverrides());
+        console.assert(WI.NetworkManager.supportsOverridingResponses());
 
         let localResourceOverride = event.target;
         WI.objectStores.localResourceOverrides.putObject(localResourceOverride);
 
-        let commandArguments = {
-            url: localResourceOverride.url,
-            caseSensitive: localResourceOverride.isCaseSensitive,
-            isRegex: localResourceOverride.isRegex,
-            stage: InspectorBackend.Enum.Network.NetworkStage.Response,
-        };
-
-        // COMPATIBILITY (iOS 13.0): Network.addInterception / Network.removeInterception did not exist.
-        for (let target of WI.targets) {
-            if (target.hasDomain("Network")) {
-                if (localResourceOverride.disabled)
-                    target.NetworkAgent.removeInterception.invoke(commandArguments);
-                else
-                    target.NetworkAgent.addInterception.invoke(commandArguments);
-            }
-        }
+        if (localResourceOverride.disabled)
+            this._removeInterception(localResourceOverride);
+        else
+            this._addInterception(localResourceOverride);
     }
 
     _handleBootstrapScriptContentDidChange(event)

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -25,17 +25,19 @@
 
 WI.LocalResourceOverride = class LocalResourceOverride extends WI.Object
 {
-    constructor(localResource, {isCaseSensitive, isRegex, disabled} = {})
+    constructor(type, localResource, {isCaseSensitive, isRegex, disabled} = {})
     {
-        console.assert(localResource instanceof WI.LocalResource);
-        console.assert(localResource.isLocalResourceOverride);
-        console.assert(localResource.url);
-        console.assert(isCaseSensitive === undefined || typeof isCaseSensitive === "boolean");
-        console.assert(isRegex === undefined || typeof isRegex === "boolean");
-        console.assert(disabled === undefined || typeof disabled === "boolean");
+        console.assert(Object.values(WI.LocalResourceOverride.InterceptType).includes(type), type);
+        console.assert(localResource instanceof WI.LocalResource, localResource);
+        console.assert(localResource.isLocalResourceOverride, localResource);
+        console.assert(localResource.url, localResource);
+        console.assert(isCaseSensitive === undefined || typeof isCaseSensitive === "boolean", isCaseSensitive);
+        console.assert(isRegex === undefined || typeof isRegex === "boolean", isRegex);
+        console.assert(disabled === undefined || typeof disabled === "boolean", disabled);
 
         super();
 
+        this._type = type;
         this._localResource = localResource;
         this._isCaseSensitive = isCaseSensitive !== undefined ? isCaseSensitive : true;
         this._isRegex = isRegex !== undefined ? isRegex : false;
@@ -44,7 +46,7 @@
 
     // Static
 
-    static create({url, mimeType, content, base64Encoded, statusCode, statusText, headers, isCaseSensitive, isRegex, disabled})
+    static create(type, {url, mimeType, content, base64Encoded, statusCode, statusText, headers, isCaseSensitive, isRegex, disabled})
     {
         let localResource = new WI.LocalResource({
             request: {
@@ -61,7 +63,7 @@
             isLocalResourceOverride: true,
         });
 
-        return new WI.LocalResourceOverride(localResource, {isCaseSensitive, isRegex, disabled});
+        return new WI.LocalResourceOverride(type, localResource, {isCaseSensitive, isRegex, disabled});
     }
 
     // Import / Export
@@ -68,13 +70,18 @@
 
     static fromJSON(json)
     {
-        let {localResource, isCaseSensitive, isRegex, disabled} = json;
-        return new WI.LocalResourceOverride(WI.LocalResource.fromJSON(localResource), {isCaseSensitive, isRegex, disabled});
+        let {type, localResource, isCaseSensitive, isRegex, disabled} = json;
+
+        // COMPATIBILITY (iOS 13.4): Network.interceptWithRequest/Network.interceptRequestWithResponse did not exist yet.
+        type ??= WI.LocalResourceOverride.InterceptType.Response;
+
+        return new WI.LocalResourceOverride(type, WI.LocalResource.fromJSON(localResource), {isCaseSensitive, isRegex, disabled});
     }
 
     toJSON(key)
     {
         let json = {
+            type: this._type,
             localResource: this._localResource.toJSON(key),
             isCaseSensitive: this._isCaseSensitive,
             isRegex: this._isRegex,
@@ -89,6 +96,7 @@
 
     // Public
 
+    get type() { return this._type; }
     get url() { return this._localResource.url; }
     get localResource() { return this._localResource; }
     get isCaseSensitive() { return this._isCaseSensitive; }
@@ -126,6 +134,7 @@
 
     saveIdentityToCookie(cookie)
     {
+        cookie["local-resource-override-type"] = this._type;
         cookie["local-resource-override-url"] = this._localResource.url;
         cookie["local-resource-override-is-case-sensitive"] = this._isCaseSensitive;
         cookie["local-resource-override-is-regex"] = this._isRegex;
@@ -135,6 +144,11 @@
 
 WI.LocalResourceOverride.TypeIdentifier = "local-resource-override";
 
+WI.LocalResourceOverride.InterceptType = {
+    Response: "response",
+    ResponseSkippingNetwork: "response-skipping-network",
+};
+
 WI.LocalResourceOverride.Event = {
     DisabledChanged: "local-resource-override-disabled-state-did-change",
 };

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -1065,11 +1065,11 @@
     async createLocalResourceOverride({initialMIMEType, initialBase64Encoded, initialContent} = {})
     {
         console.assert(!this.isLocalResourceOverride);
-        console.assert(WI.NetworkManager.supportsLocalResourceOverrides());
+        console.assert(WI.NetworkManager.supportsOverridingResponses());
 
         let {rawContent, rawBase64Encoded} = await this.requestContent();
 
-        return WI.LocalResourceOverride.create({
+        return WI.LocalResourceOverride.create(WI.LocalResourceOverride.InterceptType.Response, {
             url: this.url,
             mimeType: initialMIMEType !== undefined ? initialMIMEType : this.mimeType,
             content: initialContent !== undefined ? initialContent : rawContent,

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -73,7 +73,7 @@
     if (contextMenu.__domBreakpointItemsAdded)
         return;
 
-    if (!contextMenu.__localOverrideItemsAdded && WI.NetworkManager.supportsLocalResourceOverrides()) {
+    if (!contextMenu.__localOverrideItemsAdded && WI.NetworkManager.supportsOverridingResponses()) {
         contextMenu.__localOverrideItemsAdded = true;
 
         if (WI.networkManager.canBeOverridden(sourceCode)) {

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FontResourceContentView.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/FontResourceContentView.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FontResourceContentView.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -65,7 +65,7 @@
 
         this._updatePreviewElement();
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides()) {
+        if (WI.NetworkManager.supportsOverridingResponses()) {
             let dropZoneView = new WI.DropZoneView(this);
             dropZoneView.targetElement = this._previewContainer;
             this.addSubview(dropZoneView);

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -87,7 +87,7 @@
             this._draggingInternalImageElement = false;
         });
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides() && !this._disableDropZone) {
+        if (WI.NetworkManager.supportsOverridingResponses() && !this._disableDropZone) {
             let dropZoneView = new WI.DropZoneView(this);
             dropZoneView.targetElement = imageContainer;
             this.addSubview(dropZoneView);

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.css (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.css	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.css	2020-09-29 03:49:32 UTC (rev 267723)
@@ -98,10 +98,14 @@
     margin-top: 8px;
 }
 
-.popover .local-resource-override-popover-content .reference-page-link-container {
+.popover .local-resource-override-popover-content .add-header + .reference-page-link-container {
     margin-top: 6px;
 }
 
+.popover .local-resource-override-popover-content .options td {
+    vertical-align: bottom;
+}
+
 body[dir=ltr] .popover .local-resource-override-popover-content .reference-page-link-container {
     float: right;
 }

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -91,6 +91,7 @@
         }
 
         let data = {
+            type: this._skipNetworkCheckbox?.checked ? WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork : WI.LocalResourceOverride.InterceptType.Response,
             url,
             mimeType,
             statusCode,
@@ -291,8 +292,30 @@
             this._headersDataGrid.startEditingNode(newNode);
         });
 
-        headersData.appendChild(WI.createReferencePageLink("local-overrides", "configuring-local-overrides"));
+        if (WI.NetworkManager.supportsOverridingRequestsWithResponses()) {
+            let optionsRow = table.appendChild(document.createElement("tr"));
+            optionsRow.className = "options";
 
+            let optionsHeader = optionsRow.appendChild(document.createElement("th"));
+
+            let optionsLabel = optionsHeader.appendChild(document.createElement("label"));
+            optionsLabel.textContent = WI.UIString("Options");
+
+            let optionsData = optionsRow.appendChild(document.createElement("td"));
+
+            let skipNetworkLabel = optionsData.appendChild(document.createElement("label"));
+            skipNetworkLabel.className = "skip-network";
+
+            this._skipNetworkCheckbox = skipNetworkLabel.appendChild(document.createElement("input"));
+            this._skipNetworkCheckbox.type = "checkbox";
+            this._skipNetworkCheckbox.checked = localResourceOverride?.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork;
+
+            skipNetworkLabel.appendChild(document.createTextNode(WI.UIString("Skip Network", "Skip Network @ Local Override Popover Options", "Label for checkbox that controls whether the local override will actually perform a network request or skip it to immediately serve the response.")));
+
+            optionsData.appendChild(WI.createReferencePageLink("local-overrides", "configuring-local-overrides"));
+        } else
+            headersData.appendChild(WI.createReferencePageLink("local-overrides", "configuring-local-overrides"));
+
         let incrementStatusCode = () => {
             let x = parseInt(this._statusCodeCodeMirror.getValue());
             if (isNaN(x))

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideTreeElement.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideTreeElement.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideTreeElement.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -131,7 +131,7 @@
         if (!serializedData)
             return;
 
-        let {url, isCaseSensitive, isRegex, mimeType, statusCode, statusText, headers} = serializedData;
+        let {type, url, isCaseSensitive, isRegex, mimeType, statusCode, statusText, headers} = serializedData;
 
         // Do not conflict with an existing override unless we are modifying ourselves.
         let existingOverride = WI.networkManager.localResourceOverrideForURL(url);
@@ -143,7 +143,7 @@
         let wasSelected = this.selected;
 
         let revision = this._localResourceOverride.localResource.currentRevision;
-        let newLocalResourceOverride = WI.LocalResourceOverride.create({
+        let newLocalResourceOverride = WI.LocalResourceOverride.create(type, {
             url,
             isCaseSensitive,
             isRegex,

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/OpenResourceDialog.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -390,7 +390,7 @@
 
     _addLocalResourceOverrides()
     {
-        if (!WI.NetworkManager.supportsLocalResourceOverrides())
+        if (!WI.NetworkManager.supportsOverridingResponses())
             return;
 
         const suppressFilterUpdate = true;

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceContentView.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceContentView.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceContentView.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -60,7 +60,7 @@
 
         this._showingLocalResourceOverride = false;
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides()) {
+        if (WI.NetworkManager.supportsOverridingResponses()) {
             if (resource.isLocalResourceOverride) {
                 this._showingLocalResourceOverride = true;
 
@@ -191,7 +191,7 @@
     {
         super.closed();
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides())
+        if (WI.NetworkManager.supportsOverridingResponses())
             WI.networkManager.removeEventListener(null, null, this);
 
         if (!this.managesOwnIssues)

Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js (267722 => 267723)


--- trunk/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js	2020-09-29 00:38:18 UTC (rev 267722)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourcesNavigationSidebarPanel.js	2020-09-29 03:49:32 UTC (rev 267723)
@@ -260,7 +260,7 @@
         this._resourcesTreeOutline.includeSourceMapResourceChildren = true;
         resourcesContainer.appendChild(this._resourcesTreeOutline.element);
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides() || WI.NetworkManager.supportsBootstrapScript() || WI.CSSManager.supportsInspectorStyleSheet()) {
+        if (WI.NetworkManager.supportsOverridingResponses() || WI.NetworkManager.supportsBootstrapScript() || WI.CSSManager.supportsInspectorStyleSheet()) {
             let createResourceNavigationBar = new WI.NavigationBar;
 
             let createResourceButtonNavigationItem = new WI.ButtonNavigationItem("create-resource", WI.UIString("Create Resource"), "Images/Plus15.svg", 15, 15);
@@ -300,7 +300,7 @@
             WI.networkManager.addEventListener(WI.NetworkManager.Event.BootstrapScriptDestroyed, this._handleBootstrapScriptDestroyed, this);
         }
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides()) {
+        if (WI.NetworkManager.supportsOverridingResponses()) {
             WI.networkManager.addEventListener(WI.NetworkManager.Event.LocalResourceOverrideAdded, this._handleLocalResourceOverrideAdded, this);
             WI.networkManager.addEventListener(WI.NetworkManager.Event.LocalResourceOverrideRemoved, this._handleLocalResourceOverrideRemoved, this);
         }
@@ -383,7 +383,7 @@
                 this._addLocalOverride(bootstrapScript);
         }
 
-        if (WI.NetworkManager.supportsLocalResourceOverrides()) {
+        if (WI.NetworkManager.supportsOverridingResponses()) {
             for (let localResourceOverride of WI.networkManager.localResourceOverrides)
                 this._addLocalOverride(localResourceOverride);
         }
@@ -798,7 +798,7 @@
             return;
         }
 
-        let {url, isCaseSensitive, isRegex, mimeType, statusCode, statusText, headers} = serializedData;
+        let {type, url, isCaseSensitive, isRegex, mimeType, statusCode, statusText, headers} = serializedData;
 
         // Do not conflict with an existing override.
         let existingOverride = WI.networkManager.localResourceOverrideForURL(url);
@@ -807,7 +807,7 @@
             return;
         }
 
-        let localResourceOverride = WI.LocalResourceOverride.create({
+        let localResourceOverride = WI.LocalResourceOverride.create(type, {
             url,
             isCaseSensitive,
             isRegex,
@@ -1422,7 +1422,7 @@
 
     _addLocalOverride(localOverride)
     {
-        console.assert(WI.NetworkManager.supportsBootstrapScript() || WI.NetworkManager.supportsLocalResourceOverrides());
+        console.assert(WI.NetworkManager.supportsBootstrapScript() || WI.NetworkManager.supportsOverridingResponses());
 
         if (this._localOverridesTreeOutline.findTreeElement(localOverride))
             return;
@@ -1446,7 +1446,7 @@
 
     _removeResourceOverride(localOverride)
     {
-        console.assert(WI.NetworkManager.supportsBootstrapScript() || WI.NetworkManager.supportsLocalResourceOverrides());
+        console.assert(WI.NetworkManager.supportsBootstrapScript() || WI.NetworkManager.supportsOverridingResponses());
 
         let resourceTreeElement = this._localOverridesTreeOutline.findTreeElement(localOverride);
         if (!resourceTreeElement)
@@ -2033,7 +2033,7 @@
 
     _populateCreateResourceContextMenu(contextMenu)
     {
-        if (WI.NetworkManager.supportsLocalResourceOverrides()) {
+        if (WI.NetworkManager.supportsOverridingResponses()) {
             contextMenu.appendItem(WI.UIString("Local Override\u2026"), () => {
                 if (!this._localOverridesTreeOutline.children.length)
                     this._localOverridesRow.showEmptyMessage();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to