haikuwebkit/Source/WebCore/inspector/InspectorInstrumentationWeb...

86 lines
3.7 KiB
C
Raw Permalink Normal View History

Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
/*
* Copyright (C) 2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "InspectorInstrumentationPublic.h"
#include "ResourceLoader.h"
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
#include <wtf/CompletionHandler.h>
2020-06-16 22:23:50 +00:00
#include <wtf/Function.h>
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
namespace WebCore {
class Frame;
class ResourceLoader;
class ResourceRequest;
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
class ResourceResponse;
class SharedBuffer;
class WEBCORE_EXPORT InspectorInstrumentationWebKit {
public:
Web Inspector: introduce request interception https://bugs.webkit.org/show_bug.cgi?id=207446 Patch by Pavel Feldman <pavel.feldman@gmail.com> on 2020-06-15 Reviewed by Devin Rousso. Source/JavaScriptCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * inspector/protocol/Network.json: Source/WebCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. Tests: http/tests/inspector/network/intercept-aborted-request.html http/tests/inspector/network/intercept-request-continue.html http/tests/inspector/network/intercept-request-fragment.html http/tests/inspector/network/intercept-request-main-resource-with-response.html http/tests/inspector/network/intercept-request-main-resource.html http/tests/inspector/network/intercept-request-properties.html http/tests/inspector/network/intercept-request-subresource-with-error.html http/tests/inspector/network/intercept-request-subresource-with-response.html http/tests/inspector/network/intercept-request-subresource.html http/tests/inspector/network/intercept-request-with-response.html * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptImpl): (WebCore::InspectorInstrumentation::shouldInterceptRequestImpl): (WebCore::InspectorInstrumentation::interceptRequestImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willIntercept): (WebCore::InspectorInstrumentation::shouldInterceptRequest): (WebCore::InspectorInstrumentation::interceptRequest): * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequestInternal): (WebCore::InspectorInstrumentationWebKit::interceptRequestInternal): * inspector/InspectorInstrumentationWebKit.h: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequest): (WebCore::InspectorInstrumentationWebKit::interceptRequest): * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::shouldIntercept): (WebCore::InspectorNetworkAgent::continuePendingRequests): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willIntercept): (WebCore::InspectorNetworkAgent::shouldInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptRequest): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithRequest): (WebCore::InspectorNetworkAgent::interceptRequestWithResponse): (WebCore::InspectorNetworkAgent::interceptRequestWithError): * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptRequest::PendingInterceptRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithOriginalRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithRequest): (WebCore::InspectorNetworkAgent::Intercept::operator== const): * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Source/WebInspectorUI: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.requestIntercepted): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged): * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.requestIntercepted): Source/WebKit: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::scheduleLoad): LayoutTests: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * http/tests/inspector/network/intercept-aborted-request-expected.txt: Added. * http/tests/inspector/network/intercept-aborted-request.html: Added. * http/tests/inspector/network/intercept-request-continue-expected.txt: Added. * http/tests/inspector/network/intercept-request-continue.html: Added. * http/tests/inspector/network/intercept-request-fragment-expected.txt: Added. * http/tests/inspector/network/intercept-request-fragment.html: Added. * http/tests/inspector/network/intercept-request-main-resource-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response.html: Added. * http/tests/inspector/network/intercept-request-main-resource.html: Added. * http/tests/inspector/network/intercept-request-properties-expected.txt: Added. * http/tests/inspector/network/intercept-request-properties.html: Added. * http/tests/inspector/network/intercept-request-subresource-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error.html: Added. * http/tests/inspector/network/intercept-request-subresource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-response.html: Added. * http/tests/inspector/network/intercept-request-subresource.html: Added. * http/tests/inspector/network/intercept-request-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-with-response.html: Added. * http/tests/inspector/network/resources/intercept-echo.php: Added. * http/tests/inspector/network/resources/intercept-request-overriden-page.html: Added. * http/tests/inspector/network/resources/intercept-request-overriden-script.js: Added. * http/tests/inspector/resources/protocol-test.js: * inspector/network/local-resource-override-continue-response.html: * inspector/network/resources/data-intercepted.json: Added. * platform/mac-wk1/TestExpectations: Canonical link: https://commits.webkit.org/226009@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263072 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-16 01:46:12 +00:00
static bool shouldInterceptRequest(const Frame*, const ResourceRequest&);
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
static bool shouldInterceptResponse(const Frame*, const ResourceResponse&);
2020-06-16 22:23:50 +00:00
static void interceptRequest(ResourceLoader&, Function<void(const ResourceRequest&)>&&);
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
static void interceptResponse(const Frame*, const ResourceResponse&, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&&);
private:
Web Inspector: introduce request interception https://bugs.webkit.org/show_bug.cgi?id=207446 Patch by Pavel Feldman <pavel.feldman@gmail.com> on 2020-06-15 Reviewed by Devin Rousso. Source/JavaScriptCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * inspector/protocol/Network.json: Source/WebCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. Tests: http/tests/inspector/network/intercept-aborted-request.html http/tests/inspector/network/intercept-request-continue.html http/tests/inspector/network/intercept-request-fragment.html http/tests/inspector/network/intercept-request-main-resource-with-response.html http/tests/inspector/network/intercept-request-main-resource.html http/tests/inspector/network/intercept-request-properties.html http/tests/inspector/network/intercept-request-subresource-with-error.html http/tests/inspector/network/intercept-request-subresource-with-response.html http/tests/inspector/network/intercept-request-subresource.html http/tests/inspector/network/intercept-request-with-response.html * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptImpl): (WebCore::InspectorInstrumentation::shouldInterceptRequestImpl): (WebCore::InspectorInstrumentation::interceptRequestImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willIntercept): (WebCore::InspectorInstrumentation::shouldInterceptRequest): (WebCore::InspectorInstrumentation::interceptRequest): * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequestInternal): (WebCore::InspectorInstrumentationWebKit::interceptRequestInternal): * inspector/InspectorInstrumentationWebKit.h: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequest): (WebCore::InspectorInstrumentationWebKit::interceptRequest): * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::shouldIntercept): (WebCore::InspectorNetworkAgent::continuePendingRequests): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willIntercept): (WebCore::InspectorNetworkAgent::shouldInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptRequest): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithRequest): (WebCore::InspectorNetworkAgent::interceptRequestWithResponse): (WebCore::InspectorNetworkAgent::interceptRequestWithError): * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptRequest::PendingInterceptRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithOriginalRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithRequest): (WebCore::InspectorNetworkAgent::Intercept::operator== const): * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Source/WebInspectorUI: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.requestIntercepted): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged): * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.requestIntercepted): Source/WebKit: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::scheduleLoad): LayoutTests: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * http/tests/inspector/network/intercept-aborted-request-expected.txt: Added. * http/tests/inspector/network/intercept-aborted-request.html: Added. * http/tests/inspector/network/intercept-request-continue-expected.txt: Added. * http/tests/inspector/network/intercept-request-continue.html: Added. * http/tests/inspector/network/intercept-request-fragment-expected.txt: Added. * http/tests/inspector/network/intercept-request-fragment.html: Added. * http/tests/inspector/network/intercept-request-main-resource-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response.html: Added. * http/tests/inspector/network/intercept-request-main-resource.html: Added. * http/tests/inspector/network/intercept-request-properties-expected.txt: Added. * http/tests/inspector/network/intercept-request-properties.html: Added. * http/tests/inspector/network/intercept-request-subresource-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error.html: Added. * http/tests/inspector/network/intercept-request-subresource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-response.html: Added. * http/tests/inspector/network/intercept-request-subresource.html: Added. * http/tests/inspector/network/intercept-request-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-with-response.html: Added. * http/tests/inspector/network/resources/intercept-echo.php: Added. * http/tests/inspector/network/resources/intercept-request-overriden-page.html: Added. * http/tests/inspector/network/resources/intercept-request-overriden-script.js: Added. * http/tests/inspector/resources/protocol-test.js: * inspector/network/local-resource-override-continue-response.html: * inspector/network/resources/data-intercepted.json: Added. * platform/mac-wk1/TestExpectations: Canonical link: https://commits.webkit.org/226009@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263072 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-16 01:46:12 +00:00
static bool shouldInterceptRequestInternal(const Frame&, const ResourceRequest&);
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
static bool shouldInterceptResponseInternal(const Frame&, const ResourceResponse&);
2020-06-16 22:23:50 +00:00
static void interceptRequestInternal(ResourceLoader&, Function<void(const ResourceRequest&)>&&);
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
static void interceptResponseInternal(const Frame&, const ResourceResponse&, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&&);
};
Web Inspector: introduce request interception https://bugs.webkit.org/show_bug.cgi?id=207446 Patch by Pavel Feldman <pavel.feldman@gmail.com> on 2020-06-15 Reviewed by Devin Rousso. Source/JavaScriptCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * inspector/protocol/Network.json: Source/WebCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. Tests: http/tests/inspector/network/intercept-aborted-request.html http/tests/inspector/network/intercept-request-continue.html http/tests/inspector/network/intercept-request-fragment.html http/tests/inspector/network/intercept-request-main-resource-with-response.html http/tests/inspector/network/intercept-request-main-resource.html http/tests/inspector/network/intercept-request-properties.html http/tests/inspector/network/intercept-request-subresource-with-error.html http/tests/inspector/network/intercept-request-subresource-with-response.html http/tests/inspector/network/intercept-request-subresource.html http/tests/inspector/network/intercept-request-with-response.html * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptImpl): (WebCore::InspectorInstrumentation::shouldInterceptRequestImpl): (WebCore::InspectorInstrumentation::interceptRequestImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willIntercept): (WebCore::InspectorInstrumentation::shouldInterceptRequest): (WebCore::InspectorInstrumentation::interceptRequest): * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequestInternal): (WebCore::InspectorInstrumentationWebKit::interceptRequestInternal): * inspector/InspectorInstrumentationWebKit.h: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequest): (WebCore::InspectorInstrumentationWebKit::interceptRequest): * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::shouldIntercept): (WebCore::InspectorNetworkAgent::continuePendingRequests): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willIntercept): (WebCore::InspectorNetworkAgent::shouldInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptRequest): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithRequest): (WebCore::InspectorNetworkAgent::interceptRequestWithResponse): (WebCore::InspectorNetworkAgent::interceptRequestWithError): * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptRequest::PendingInterceptRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithOriginalRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithRequest): (WebCore::InspectorNetworkAgent::Intercept::operator== const): * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Source/WebInspectorUI: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.requestIntercepted): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged): * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.requestIntercepted): Source/WebKit: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::scheduleLoad): LayoutTests: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * http/tests/inspector/network/intercept-aborted-request-expected.txt: Added. * http/tests/inspector/network/intercept-aborted-request.html: Added. * http/tests/inspector/network/intercept-request-continue-expected.txt: Added. * http/tests/inspector/network/intercept-request-continue.html: Added. * http/tests/inspector/network/intercept-request-fragment-expected.txt: Added. * http/tests/inspector/network/intercept-request-fragment.html: Added. * http/tests/inspector/network/intercept-request-main-resource-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response.html: Added. * http/tests/inspector/network/intercept-request-main-resource.html: Added. * http/tests/inspector/network/intercept-request-properties-expected.txt: Added. * http/tests/inspector/network/intercept-request-properties.html: Added. * http/tests/inspector/network/intercept-request-subresource-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error.html: Added. * http/tests/inspector/network/intercept-request-subresource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-response.html: Added. * http/tests/inspector/network/intercept-request-subresource.html: Added. * http/tests/inspector/network/intercept-request-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-with-response.html: Added. * http/tests/inspector/network/resources/intercept-echo.php: Added. * http/tests/inspector/network/resources/intercept-request-overriden-page.html: Added. * http/tests/inspector/network/resources/intercept-request-overriden-script.js: Added. * http/tests/inspector/resources/protocol-test.js: * inspector/network/local-resource-override-continue-response.html: * inspector/network/resources/data-intercepted.json: Added. * platform/mac-wk1/TestExpectations: Canonical link: https://commits.webkit.org/226009@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263072 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-16 01:46:12 +00:00
inline bool InspectorInstrumentationWebKit::shouldInterceptRequest(const Frame* frame, const ResourceRequest& request)
{
FAST_RETURN_IF_NO_FRONTENDS(false);
if (!frame)
return false;
return shouldInterceptRequestInternal(*frame, request);
}
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
inline bool InspectorInstrumentationWebKit::shouldInterceptResponse(const Frame* frame, const ResourceResponse& response)
{
FAST_RETURN_IF_NO_FRONTENDS(false);
if (!frame)
return false;
return shouldInterceptResponseInternal(*frame, response);
}
2020-06-16 22:23:50 +00:00
inline void InspectorInstrumentationWebKit::interceptRequest(ResourceLoader& loader, Function<void(const ResourceRequest&)>&& handler)
Web Inspector: introduce request interception https://bugs.webkit.org/show_bug.cgi?id=207446 Patch by Pavel Feldman <pavel.feldman@gmail.com> on 2020-06-15 Reviewed by Devin Rousso. Source/JavaScriptCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * inspector/protocol/Network.json: Source/WebCore: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. Tests: http/tests/inspector/network/intercept-aborted-request.html http/tests/inspector/network/intercept-request-continue.html http/tests/inspector/network/intercept-request-fragment.html http/tests/inspector/network/intercept-request-main-resource-with-response.html http/tests/inspector/network/intercept-request-main-resource.html http/tests/inspector/network/intercept-request-properties.html http/tests/inspector/network/intercept-request-subresource-with-error.html http/tests/inspector/network/intercept-request-subresource-with-response.html http/tests/inspector/network/intercept-request-subresource.html http/tests/inspector/network/intercept-request-with-response.html * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptImpl): (WebCore::InspectorInstrumentation::shouldInterceptRequestImpl): (WebCore::InspectorInstrumentation::interceptRequestImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::willIntercept): (WebCore::InspectorInstrumentation::shouldInterceptRequest): (WebCore::InspectorInstrumentation::interceptRequest): * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequestInternal): (WebCore::InspectorInstrumentationWebKit::interceptRequestInternal): * inspector/InspectorInstrumentationWebKit.h: (WebCore::InspectorInstrumentationWebKit::shouldInterceptRequest): (WebCore::InspectorInstrumentationWebKit::interceptRequest): * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::shouldIntercept): (WebCore::InspectorNetworkAgent::continuePendingRequests): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willIntercept): (WebCore::InspectorNetworkAgent::shouldInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptRequest): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithRequest): (WebCore::InspectorNetworkAgent::interceptRequestWithResponse): (WebCore::InspectorNetworkAgent::interceptRequestWithError): * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptRequest::PendingInterceptRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithOriginalRequest): (WebCore::InspectorNetworkAgent::PendingInterceptRequest::continueWithRequest): (WebCore::InspectorNetworkAgent::Intercept::operator== const): * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Source/WebInspectorUI: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.requestIntercepted): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceOverrideDisabledChanged): * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.requestIntercepted): Source/WebKit: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::scheduleLoad): LayoutTests: This change introduces network request interception to the Network protocol domain. It adds Network.interceptWithRequest notification that can be continued, modified or fulfilled. NetworkStage enum can now have 'request' and 'response' values. * http/tests/inspector/network/intercept-aborted-request-expected.txt: Added. * http/tests/inspector/network/intercept-aborted-request.html: Added. * http/tests/inspector/network/intercept-request-continue-expected.txt: Added. * http/tests/inspector/network/intercept-request-continue.html: Added. * http/tests/inspector/network/intercept-request-fragment-expected.txt: Added. * http/tests/inspector/network/intercept-request-fragment.html: Added. * http/tests/inspector/network/intercept-request-main-resource-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-main-resource-with-response.html: Added. * http/tests/inspector/network/intercept-request-main-resource.html: Added. * http/tests/inspector/network/intercept-request-properties-expected.txt: Added. * http/tests/inspector/network/intercept-request-properties.html: Added. * http/tests/inspector/network/intercept-request-subresource-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-error.html: Added. * http/tests/inspector/network/intercept-request-subresource-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-subresource-with-response.html: Added. * http/tests/inspector/network/intercept-request-subresource.html: Added. * http/tests/inspector/network/intercept-request-with-response-expected.txt: Added. * http/tests/inspector/network/intercept-request-with-response.html: Added. * http/tests/inspector/network/resources/intercept-echo.php: Added. * http/tests/inspector/network/resources/intercept-request-overriden-page.html: Added. * http/tests/inspector/network/resources/intercept-request-overriden-script.js: Added. * http/tests/inspector/resources/protocol-test.js: * inspector/network/local-resource-override-continue-response.html: * inspector/network/resources/data-intercepted.json: Added. * platform/mac-wk1/TestExpectations: Canonical link: https://commits.webkit.org/226009@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263072 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-16 01:46:12 +00:00
{
ASSERT(InspectorInstrumentationWebKit::shouldInterceptRequest(loader.frame(), loader.request()));
interceptRequestInternal(loader, WTFMove(handler));
}
Web Inspector: Local Overrides - Provide substitution content for resource loads (URL based) https://bugs.webkit.org/show_bug.cgi?id=201262 <rdar://problem/13108764> Reviewed by Devin Rousso. Source/JavaScriptCore: When interception is enabled, Network requests that match any of the configured interception patterns will be paused on the backend and allowed to be modified by the frontend. Currently the only time a network request can be intercepted is during the HTTP response. However, this intercepting interface is mean to extend to HTTP requests as well. When a response is to be intercepted a new event is sent to the frontend: `Network.responseIntercepted` event With a `requestId` to identify that network request. The frontend must respond with one of the following commands to continue: `Network.interceptContinue` - proceed with the response unmodified `Network.interceptWithResponse` - provide a response The response is paused in the meantime. * inspector/protocol/Network.json: New interfaces for intercepting network responses and suppling override content. * Scripts/generate-combined-inspector-json.py: * inspector/scripts/generate-inspector-protocol-bindings.py: (generate_from_specification.load_specification): Complete allowing comments in JSON protocol files. * inspector/scripts/codegen/generate_objc_backend_dispatcher_implementation.py: (ObjCBackendDispatcherImplementationGenerator._generate_invocation_for_command): * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result: Allow optional enums in ObjC interfaces. Source/WebCore: Tests: 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 * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * Headers.cmake: New files. * inspector/InspectorInstrumentation.cpp: (WebCore::InspectorInstrumentation::willInterceptRequestImpl): (WebCore::InspectorInstrumentation::shouldInterceptResponseImpl): (WebCore::InspectorInstrumentation::interceptResponseImpl): * inspector/InspectorInstrumentation.h: (WebCore::InspectorInstrumentation::hasFrontends): (WebCore::InspectorInstrumentation::willInterceptRequest): (WebCore::InspectorInstrumentation::shouldInterceptResponse): (WebCore::InspectorInstrumentation::interceptResponse): (WebCore::InspectorInstrumentation::frontendCreated): (WebCore::InspectorInstrumentation::frontendDeleted): * inspector/InspectorInstrumentationPublic.cpp: * inspector/InspectorInstrumentationPublic.h: * inspector/InspectorInstrumentationWebKit.cpp: (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponseInternal): (WebCore::InspectorInstrumentationWebKit::interceptResponseInternal): * inspector/InspectorInstrumentationWebKit.h: Added. (WebCore::InspectorInstrumentationWebKit::shouldInterceptResponse): (WebCore::InspectorInstrumentationWebKit::interceptResponse): Provide a slim InspectorInstrumentation API that can be used in the WebKit layer without a ton of includes. * inspector/agents/InspectorNetworkAgent.cpp: (WebCore::responseSource): (WebCore::InspectorNetworkAgent::disable): (WebCore::InspectorNetworkAgent::continuePendingResponses): (WebCore::InspectorNetworkAgent::setInterceptionEnabled): (WebCore::InspectorNetworkAgent::addInterception): (WebCore::InspectorNetworkAgent::removeInterception): (WebCore::InspectorNetworkAgent::willInterceptRequest): (WebCore::InspectorNetworkAgent::shouldInterceptResponse): (WebCore::InspectorNetworkAgent::interceptResponse): (WebCore::InspectorNetworkAgent::interceptContinue): (WebCore::InspectorNetworkAgent::interceptWithResponse): Manage a list of URLs that will be intercepted and send intercepts to an active frontend for response content. * inspector/agents/InspectorNetworkAgent.h: (WebCore::InspectorNetworkAgent::PendingInterceptResponse::PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::~PendingInterceptResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::originalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respondWithOriginalResponse): (WebCore::InspectorNetworkAgent::PendingInterceptResponse::respond): Callback for an eventual intercept response. * platform/network/ResourceResponseBase.h: New ResponseSource - Inspector Override. * loader/DocumentLoader.cpp: (WebCore::logResourceResponseSource): * testing/Internals.cpp: (WebCore::responseSourceToString): Handle new response sources. * loader/cache/CachedResourceLoader.cpp: (WebCore::CachedResourceLoader::requestResource): (WebCore::CachedResourceLoader::preload): Avoid preloading or using the cache for URLs that would be intercepted by an active Inspector frontend. * loader/cache/MemoryCache.cpp: (WebCore::MemoryCache::remove): Assertion to help detect if we ever get override content into the MemoryCache. * loader/ResourceLoader.h: (WebCore::DocumentLoader::responseReceived): * loader/ResourceLoader.cpp: Fix typos. Source/WebInspectorUI: This adds a new "Local Overrides" section to the Sources tab sidebar which will allow users to provide their own resource content for text resources. Users can clone a resource, and provide their own content (by editing in Web Inspector) and new requests for those particular URLs will get the substitute content. Overrides are based on a particular URL (ignoring fragment). They can override: status code, status text, response headers, content, and MIME Type (Content-Type). * Tools/CodeMirrorModes/index.html: Added. * Tools/CodeMirrorModes/styles.css: Added. Debug tool for CodeMirror editors and our custom CodeMirror modes. * UserInterface/Main.html: * UserInterface/Test.html: * Localizations/en.lproj/localizedStrings.js: New files and strings. * UserInterface/Base/HTTPUtilities.js: Added. (WI.httpStatusTextForStatusCode): Translate between typical status codes and status text. * UserInterface/Base/ObjectStore.js: (WI.ObjectStore._open): New persistent store for local resource overrides. * UserInterface/Base/Main.js: (WI.showLocalResourceOverride): Convenience for showing an override file. * UserInterface/Base/URLUtilities.js: (parseURL): Avoid uncaught exceptions with the URL constructor for common WebKit internal sourceURL strings. (WI.urlWithoutFragment): Strip a fragment from a URL. * UserInterface/Controllers/HARBuilder.js: (WI.HARBuilder.fetchType): (WI.HARBuilder.responseSourceFromHARFetchType): Handle new custom response types. * UserInterface/Protocol/NetworkObserver.js: (WI.NetworkObserver.prototype.responseIntercepted): (WI.NetworkObserver): New events. * UserInterface/Controllers/NetworkManager.js: (WI.NetworkManager): (WI.NetworkManager.supportsLocalResourceOverrides): (WI.NetworkManager.prototype.initializeTarget): (WI.NetworkManager.prototype.get localResourceOverrides): (WI.NetworkManager.prototype.get interceptionEnabled): (WI.NetworkManager.prototype.set interceptionEnabled): (WI.NetworkManager.prototype.addLocalResourceOverride): (WI.NetworkManager.prototype.removeLocalResourceOverride): (WI.NetworkManager.prototype.localResourceOverrideForURL): (WI.NetworkManager.prototype.canBeOverridden): (WI.NetworkManager.prototype.responseIntercepted): (WI.NetworkManager.prototype._handleResourceContentDidChange): (WI.NetworkManager.prototype._persistLocalResourceOverrideSoonAfterContentChange): (WI.NetworkManager.prototype._saveLocalResourceOverrides): (WI.NetworkManager.prototype._extraDomainsActivated): (WI.NetworkManager.prototype.localResourceForURL): Deleted. Handle saving and restoring local resource overrides. Handle responding to a `responseIntercepted` Network protocol event. * UserInterface/Models/LocalResource.js: (WI.LocalResource.fromJSON): (WI.LocalResource.prototype.toJSON): (WI.LocalResource.prototype.get localContent): (WI.LocalResource.prototype.get localContentIsBase64Encoded): (WI.LocalResource.prototype.isLocalResourceOverride): (WI.LocalResource.prototype.updateOverrideContent): Allow a LocalResource to identify itself as an "override". * UserInterface/Models/LocalResourceOverride.js: Added. (WI.LocalResourceOverride.prototype.create): (WI.LocalResourceOverride.fromJSON): (WI.LocalResourceOverride.prototype.toJSON): (WI.LocalResourceOverride.prototype.get url): (WI.LocalResourceOverride.prototype.get localResource): (WI.LocalResourceOverride.prototype.get disabled): (WI.LocalResourceOverride.prototype.set disabled): (WI.LocalResourceOverride.prototype.saveIdentityToCookie): (WI.LocalResourceOverride): Model object for a LocalResourceOverride. This has LocalResource content and an enabled/disabled state. * UserInterface/Models/Resource.js: (WI.Resource.classNamesForResource): (WI.Resource.responseSourceFromPayload): (WI.Resource.prototype.isLocalResourceOverride): (WI.Resource.prototype.async.createLocalResourceOverride): (WI.Resource.classNameForResource): Deleted. Convenience functions and icon updates. * UserInterface/Views/SourcesTabContentView.js: (WI.SourcesTabContentView.prototype.canShowRepresentedObject): * UserInterface/Views/ContentView.js: (WI.ContentView.createFromRepresentedObject): (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): (WI.ContentView.isViewable): Handle new represented object type. * UserInterface/Views/SourcesNavigationSidebarPanel.js: (WI.SourcesNavigationSidebarPanel): (WI.SourcesNavigationSidebarPanel.prototype.createContentTreeOutline): (WI.SourcesNavigationSidebarPanel.prototype.willDismissPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissLocalOverridePopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissEventBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._willDismissURLBreakpointPopover): (WI.SourcesNavigationSidebarPanel.prototype._addLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._removeLocalResourceOverride): (WI.SourcesNavigationSidebarPanel.prototype._handleTreeSelectionDidChange): (WI.SourcesNavigationSidebarPanel.prototype._populateCreateBreakpointContextMenu): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideAdded): (WI.SourcesNavigationSidebarPanel.prototype._handleLocalResourceOverrideRemoved): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. Hide and show Local Overrides section. * UserInterface/Views/LocalResourceOverrideTreeElement.css: (.item.resource.override .status > div): * UserInterface/Views/LocalResourceOverrideTreeElement.js: Added. (WI.LocalResourceOverrideTreeElement): (WI.LocalResourceOverrideTreeElement.prototype.canSelectOnMouseDown): (WI.LocalResourceOverrideTreeElement.prototype.populateContextMenu): (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): TreeElement for a Local Resource Override. * UserInterface/Views/CodeMirrorLocalOverrideURLMode.css: (.cm-s-default .cm-local-override-url-bad-scheme): (.cm-s-default .cm-local-override-url-fragment): * UserInterface/Views/CodeMirrorLocalOverrideURLMode.js: Added. (tokenBase): (return.startState): (return.token): * UserInterface/Views/ContentBrowserTabContentView.js: (WI.ContentBrowserTabContentView.prototype._revealAndSelectRepresentedObject): * UserInterface/Views/ContextMenu.js: (WI.ContextMenu.prototype._itemSelected): (WI.ContextMenu): Better debugging for exceptions in context menu handlers. * UserInterface/Views/ContextMenuUtilities.js: (WI.appendContextMenuItemsForSourceCode): (WI.appendContextMenuItemsForURL): Context menu items for Local Resource Overrides. * UserInterface/Views/DataGrid.js: (WI.DataGrid.prototype.startEditingNode): (WI.DataGrid.prototype._startEditingNodeAtColumnIndex): (WI.DataGrid.prototype._startEditing): (WI.DataGrid.prototype._contextMenuInDataTable): * UserInterface/Views/DataGridNode.js: (WI.DataGridNode): (WI.DataGridNode.prototype.get editable): (WI.DataGridNode.prototype.set editable): Improve DataGrid editing functionality. Allow a node to not be editable. Allow adding a new node and starting to edit in one action. * UserInterface/Views/DebuggerSidebarPanel.js: (WI.DebuggerSidebarPanel.prototype.treeElementForRepresentedObject): Do not provide overrides in the Debugger tab. * UserInterface/Views/LocalResourceOverrideLabelView.css: (.local-resource-override-label-view): (.local-resource-override-label-view > div): (.local-resource-override-label-view > div > .label): (.local-resource-override-label-view > div > .url): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideLabelView.js: (WI.LocalResourceOverrideLabelView): (WI.LocalResourceOverrideLabelView.prototype.initialLayout): * UserInterface/Views/LocalResourceOverridePopover.css: Added. (.popover .local-resource-override-popover-content): (.popover .local-resource-override-popover-content > label.toggle): (.popover .local-resource-override-popover-content > table): (.popover .local-resource-override-popover-content > table > tr > th): (.popover .local-resource-override-popover-content > table > tr > td): (.popover .local-resource-override-popover-content .editor): (.popover .local-resource-override-popover-content .editor > .CodeMirror): (.popover .local-resource-override-popover-content .editor.url): (.popover .local-resource-override-popover-content .editor.mime): (.popover .local-resource-override-popover-content .editor.status): (.popover .local-resource-override-popover-content .editor.status-text): (.popover .local-resource-override-popover-content .add-header): (@media (prefers-color-scheme: dark)): New banner view for a local resource override itself. Shows the URL being overriden. * UserInterface/Views/LocalResourceOverrideWarningView.css: (.local-resource-override-warning-view): (.local-resource-override-warning-view[hidden]): (.local-resource-override-warning-view > div): (.local-resource-override-warning-view > div > button): (@media (prefers-color-scheme: dark)): * UserInterface/Views/LocalResourceOverrideWarningView.js: Added. (WI.LocalResourceOverrideWarningView): (WI.LocalResourceOverrideWarningView.prototype.attached): (WI.LocalResourceOverrideWarningView.prototype.detached): (WI.LocalResourceOverrideWarningView.prototype._updateContent): (WI.LocalResourceOverrideWarningView.prototype._handleLocalResourceOverrideChanged): * UserInterface/Views/NavigationSidebarPanel.js: (WI.NavigationSidebarPanel.prototype.pruneStaleResourceTreeElements): New banner view for a resource that has been overridden. Allows jumping to the override itself. * UserInterface/Views/LocalResourceOverridePopover.js: Added. (WI.LocalResourceOverridePopover): (WI.LocalResourceOverridePopover.prototype.get serializedData): (WI.LocalResourceOverridePopover.prototype.show.addDataGridNodeForHeader): (WI.LocalResourceOverridePopover.prototype.show): (WI.LocalResourceOverridePopover.prototype._createEditor): (WI.LocalResourceOverridePopover.prototype._defaultURL): (WI.LocalResourceOverridePopover.prototype._presentOverTargetElement): New popover for creating or editing a Local Resource Override. * UserInterface/Views/SearchSidebarPanel.js: (WI.SearchSidebarPanel.prototype.performSearch): Consider searching overrides. * UserInterface/Views/Variables.css: (:root): * UserInterface/Views/SearchSidebarPanel.css: (.sidebar > .panel.navigation.search.changed > .banner): * UserInterface/Views/DebuggerSidebarPanel.css: (.sidebar > .panel.navigation.debugger .warning-banner): * UserInterface/Views/ConsoleMessageView.css: (.console-warning-level): Use a new variable for a common warning color. * UserInterface/Images/NavigationItemNetworkOverride.svg: Added. * UserInterface/Views/SourceCodeTextEditor.js: (WI.SourceCodeTextEditor.prototype.canBeFormatted): (WI.SourceCodeTextEditor.prototype.get _supportsDebugging): * UserInterface/Views/SourcesNavigationSidebarPanel.css: (.sidebar > .panel.navigation.sources > .content > .warning-banner): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container, .local-overrides)): (.sidebar > .panel.navigation.sources > .content > .local-overrides): (.sidebar > .panel.navigation.sources > .content > :matches(.pause-reason-container, .call-stack-container, .breakpoints-container)): Deleted. * UserInterface/Views/TextEditor.css: (.text-editor): * UserInterface/Views/TextResourceContentView.css: (.content-view.resource.text): (.content-view.resource.text > .text-editor): * UserInterface/Views/TextResourceContentView.js: (WI.TextResourceContentView): (WI.TextResourceContentView.prototype.get navigationItems): (WI.TextResourceContentView.prototype.closed): (WI.TextResourceContentView.prototype._contentWillPopulate): (WI.TextResourceContentView.prototype._contentDidPopulate): (WI.TextResourceContentView.prototype.async._handleCreateLocalResourceOverride): (WI.TextResourceContentView.prototype._handleRemoveLocalResourceOverride): (WI.TextResourceContentView.prototype._handleLocalResourceOverrideChanged): (WI.TextResourceContentView.prototype._textEditorContentDidChange): (WI.TextResourceContentView.prototype._shouldBeEditable): Allow Text resources to create a local resource override. Support for Image resources will come separately. * UserInterface/Views/ResourceHeadersContentView.js: (WI.ResourceHeadersContentView.prototype._responseSourceDisplayString): Handle new response type. * UserInterface/Controllers/CSSManager.js: Avoid extra handling for Local Resource Overrides. * UserInterface/Views/ResourceIcons.css: (.resource-icon.override .icon): * UserInterface/Views/ResourceSizesContentView.js: (WI.ResourceSizesContentView.prototype.initialLayout): * UserInterface/Views/ResourceTimelineDataGridNode.js: (WI.ResourceTimelineDataGridNode.prototype.iconClassNames): * UserInterface/Views/ResourceTreeElement.js: (WI.ResourceTreeElement.prototype._updateResource): (WI.ResourceTreeElement.prototype._updateIcon): (WI.ResourceTreeElement.prototype._responseReceived): (WI.ResourceTreeElement): * UserInterface/Views/TimelineDataGridNode.js: (WI.TimelineDataGridNode.prototype.createCellContent): * UserInterface/Views/NetworkTableContentView.js: (WI.NetworkTableContentView.prototype._populateNameCell): (WI.NetworkTableContentView.prototype._populateTransferSizeCell): (WI.NetworkTableContentView.prototype._generateSortComparator): Better Resource icons all over for overrides. * UserInterface/Views/URLBreakpointPopover.js: (WI.URLBreakpointPopover.prototype._createEditor): Code cleanup. Source/WebKit: * Sources.txt: * WebKit.xcodeproj/project.pbxproj: New sources. * WebProcess/Network/WebResourceLoader.h: * WebProcess/Network/WebResourceLoader.cpp: (WebKit::WebResourceLoader::didReceiveResponse): (WebKit::WebResourceLoader::didReceiveData): (WebKit::WebResourceLoader::didFinishResourceLoad): (WebKit::WebResourceLoader::didFailResourceLoad): On receiving a response, check with the inspector if an active frontend will override the response content. * WebProcess/Network/WebResourceInterceptController.h: * WebProcess/Network/WebResourceInterceptController.cpp: (WebKit::WebResourceInterceptController::isIntercepting const): (WebKit::WebResourceInterceptController::beginInterceptingResponse): (WebKit::WebResourceInterceptController::continueResponse): (WebKit::WebResourceInterceptController::interceptedResponse): (WebKit::WebResourceInterceptController::defer): Buffer networking callbacks for an ongoing intercept. * WebProcess/Network/WebLoaderStrategy.cpp: (WebKit::WebLoaderStrategy::havePerformedSecurityChecks const): Handle new response source. LayoutTests: * http/tests/inspector/network/local-resource-override-basic-expected.txt: Added. * http/tests/inspector/network/local-resource-override-basic.html: Added. * http/tests/inspector/network/local-resource-override-main-resource-expected.txt: Added. * http/tests/inspector/network/local-resource-override-main-resource.html: Added. * http/tests/inspector/network/local-resource-override-script-tag-expected.txt: Added. * http/tests/inspector/network/local-resource-override-script-tag.html: Added. * http/tests/inspector/network/resource-response-inspector-override-expected.txt: Added. * http/tests/inspector/network/resource-response-inspector-override.html: Added. * http/tests/inspector/network/resources/override.js: Added. * http/tests/inspector/network/resources/override.txt: Added. * inspector/network/local-resource-override-continue-response-expected.txt: Added. * inspector/network/local-resource-override-continue-response.html: Added. Tests for overrides. * inspector/unit-tests/url-utilities-expected.txt: * inspector/unit-tests/url-utilities.html: Test WI.urlWithoutFragment. * platform/mac-wk1/TestExpectations: WebKitLegacy does not support overrides. Canonical link: https://commits.webkit.org/215111@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@249504 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-09-04 23:35:03 +00:00
inline void InspectorInstrumentationWebKit::interceptResponse(const Frame* frame, const ResourceResponse& response, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&& handler)
{
ASSERT(InspectorInstrumentationWebKit::shouldInterceptResponse(frame, response));
interceptResponseInternal(*frame, response, identifier, WTFMove(handler));
}
}