Changeset 293409 in webkit
- Timestamp:
- Apr 25, 2022 9:07:01 PM (3 months ago)
- Location:
- trunk
- Files:
-
- 3 added
- 2 deleted
- 31 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/tests/inspector/network/intercept-request-with-error-expected.txt (added)
-
LayoutTests/http/tests/inspector/network/intercept-request-with-error.html (added)
-
LayoutTests/inspector/network/interceptRequestWithError-expected.txt (deleted)
-
LayoutTests/inspector/network/interceptRequestWithError.html (deleted)
-
LayoutTests/platform/mac-wk1/TestExpectations (modified) (2 diffs)
-
LayoutTests/platform/mac-wk2/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp (modified) (3 diffs)
-
Source/WebCore/inspector/agents/InspectorNetworkAgent.h (modified) (3 diffs)
-
Source/WebCore/inspector/agents/WebConsoleAgent.cpp (modified) (2 diffs)
-
Source/WebCore/inspector/agents/page/PageNetworkAgent.cpp (modified) (2 diffs)
-
Source/WebCore/inspector/agents/page/PageNetworkAgent.h (modified) (1 diff)
-
Source/WebCore/inspector/agents/worker/WorkerNetworkAgent.cpp (modified) (1 diff)
-
Source/WebCore/inspector/agents/worker/WorkerNetworkAgent.h (modified) (1 diff)
-
Source/WebCore/loader/DocumentThreadableLoader.cpp (modified) (2 diffs)
-
Source/WebCore/loader/SubresourceLoader.cpp (modified) (2 diffs)
-
Source/WebInspectorUI/ChangeLog (modified) (1 diff)
-
Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (modified) (8 diffs)
-
Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js (modified) (5 diffs)
-
Source/WebInspectorUI/UserInterface/Images/SkipNetwork.svg (added)
-
Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js (modified) (13 diffs)
-
Source/WebInspectorUI/UserInterface/Models/Resource.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/ContentView.js (modified) (2 diffs)
-
Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/FontResourceContentView.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideLabelView.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.css (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js (modified) (7 diffs)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideRequestContentView.css (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideRequestContentView.js (modified) (2 diffs)
-
Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideTreeElement.js (modified) (1 diff)
-
Source/WebInspectorUI/UserInterface/Views/ResourceContentView.js (modified) (3 diffs)
-
Source/WebInspectorUI/UserInterface/Views/ResourceIcons.css (modified) (2 diffs)
-
Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r293367 r293409 1 2022-04-25 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: add UI for blocking requests 4 https://bugs.webkit.org/show_bug.cgi?id=239674 5 6 Reviewed by Patrick Angle. 7 8 * http/tests/inspector/network/intercept-request-with-error.html: Added. 9 * http/tests/inspector/network/intercept-request-with-error-expected.txt: Added. 10 * inspector/network/interceptRequestWithError.html: Removed. 11 * inspector/network/interceptRequestWithError-expected.txt: Removed. 12 * platform/mac-wk1/TestExpectations: 13 * platform/mac-wk2/TestExpectations: 14 Reworked this test to use `WI.LocalResourceOverride` instead of the protocol. 15 1 16 2022-04-25 Devin Rousso <drousso@apple.com> 2 17 -
trunk/LayoutTests/platform/mac-wk1/TestExpectations
r293367 r293409 925 925 http/tests/inspector/network/intercept-request-subresource-with-response.html [ Skip ] 926 926 http/tests/inspector/network/intercept-request-subresource-with-response-error-status-code.html [ Skip ] 927 http/tests/inspector/network/intercept-request-with-error.html [ Skip ] 927 928 http/tests/inspector/network/intercept-request-with-response.html [ Skip ] 928 929 http/tests/inspector/network/local-resource-override-basic.html [ Skip ] … … 933 934 inspector/network/intercept-aborted-request.html [ Skip ] 934 935 inspector/network/interceptContinue.html [ Skip ] 935 inspector/network/interceptRequestWithError.html [ Skip ]936 936 937 937 webkit.org/b/164933 http/tests/misc/link-rel-icon-beforeload.html [ Failure ] -
trunk/LayoutTests/platform/mac-wk2/TestExpectations
r293223 r293409 1587 1587 webkit.org/b/230117 [ BigSur Debug ] http/tests/inspector/network/fetch-response-body.html [ Pass Failure ] 1588 1588 webkit.org/b/230117 [ BigSur Debug ] http/tests/inspector/network/intercept-request-properties.html [ Pass Failure ] 1589 webkit.org/b/230117 [ BigSur Debug ] http/tests/inspector/network/intercept-request-with-error.html [ Pass Failure ] 1589 1590 webkit.org/b/230117 [ BigSur Debug ] http/tests/inspector/network/intercept-request-with-response.html [ Pass Failure ] 1590 1591 webkit.org/b/230117 [ BigSur Debug ] http/tests/inspector/target/pause-on-inline-debugger-statement.html [ Pass Failure ] -
trunk/Source/WebCore/ChangeLog
r293368 r293409 1 2022-04-25 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: add UI for blocking requests 4 https://bugs.webkit.org/show_bug.cgi?id=239674 5 6 Reviewed by Patrick Angle. 7 8 Test: http/tests/inspector/network/intercept-request-with-error.html 9 10 * inspector/agents/InspectorNetworkAgent.h: 11 (WebCore::InspectorNetworkAgent::errorDomain): Added. 12 * inspector/agents/InspectorNetworkAgent.cpp: 13 (WebCore::InspectorNetworkAgent::toResourceErrorType): Added. 14 (WebCore::InspectorNetworkAgent::interceptRequestWithError): 15 Unify the resource error message for consistency. 16 Mark the resource error as coming from Web Inspector so that it can identified (see below). 17 18 * inspector/agents/WebConsoleAgent.cpp: 19 (WebCore::WebConsoleAgent::didFailLoading): 20 * loader/DocumentThreadableLoader.cpp: 21 (WebCore::DocumentThreadableLoader::logErrorAndFail): 22 * loader/SubresourceLoader.cpp: 23 (WebCore::SubresourceLoader::didFail): 24 Don't add console messages for requests that were blocked by Web Inspector. 25 26 * inspector/agents/page/PageNetworkAgent.h: 27 * inspector/agents/page/PageNetworkAgent.cpp: 28 (WebCore::PageNetworkAgent::addConsoleMessage): Added. 29 * inspector/agents/worker/WorkerNetworkAgent.h: 30 * inspector/agents/worker/WorkerNetworkAgent.cpp: 31 (WebCore::WorkerNetworkAgent::addConsoleMessage): Added. 32 Add a `virtual` method so that `InspectorNetworkAgent` can log to the console (`PageNetworkAgent` 33 uses the `Page`, `WorkerNetworkAgent` uses the `WorkerOrWorkletGlobalScope`, etc.). 34 1 35 2022-04-25 Devin Rousso <drousso@apple.com> 2 36 -
trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp
r293368 r293409 70 70 #include "TextResourceDecoder.h" 71 71 #include "ThreadableLoaderClient.h" 72 #include "WebConsoleAgent.h" 72 73 #include <wtf/URL.h> 73 74 #include "WebSocket.h" … … 1312 1313 } 1313 1314 1315 static ResourceError::Type toResourceErrorType(Protocol::Network::ResourceErrorType protocolResourceErrorType) 1316 { 1317 switch (protocolResourceErrorType) { 1318 case Protocol::Network::ResourceErrorType::General: 1319 return ResourceError::Type::General; 1320 1321 case Protocol::Network::ResourceErrorType::AccessControl: 1322 return ResourceError::Type::AccessControl; 1323 1324 case Protocol::Network::ResourceErrorType::Cancellation: 1325 return ResourceError::Type::Cancellation; 1326 1327 case Protocol::Network::ResourceErrorType::Timeout: 1328 return ResourceError::Type::Timeout; 1329 } 1330 1331 ASSERT_NOT_REACHED(); 1332 return ResourceError::Type::Null; 1333 } 1334 1314 1335 Protocol::ErrorStringOr<void> InspectorNetworkAgent::interceptRequestWithError(const Protocol::Network::RequestId& requestId, Protocol::Network::ResourceErrorType errorType) 1315 1336 { … … 1322 1343 return makeUnexpected("Unable to abort request, it has already been processed"_s); 1323 1344 1324 switch (errorType) { 1325 case Protocol::Network::ResourceErrorType::General: 1326 loader.didFail(ResourceError(errorDomainWebKitInternal, 0, loader.url(), "Request intercepted"_s, ResourceError::Type::General)); 1327 return { }; 1328 1329 case Protocol::Network::ResourceErrorType::AccessControl: 1330 loader.didFail(ResourceError(errorDomainWebKitInternal, 0, loader.url(), "Access denied"_s, ResourceError::Type::AccessControl)); 1331 return { }; 1332 1333 case Protocol::Network::ResourceErrorType::Cancellation: 1334 loader.didFail(ResourceError(errorDomainWebKitInternal, 0, loader.url(), "Request canceled"_s, ResourceError::Type::Cancellation)); 1335 return { }; 1336 1337 case Protocol::Network::ResourceErrorType::Timeout: 1338 loader.didFail(ResourceError(errorDomainWebKitInternal, 0, loader.url(), "Request timed out"_s, ResourceError::Type::Timeout)); 1339 return { }; 1340 } 1341 1342 ASSERT_NOT_REACHED(); 1345 addConsoleMessage(makeUnique<Inspector::ConsoleMessage>(MessageSource::Network, MessageType::Log, MessageLevel::Info, makeString("Web Inspector blocked ", loader.url().string(), " from loading"), loader.identifier().toUInt64())); 1346 1347 loader.didFail(ResourceError(InspectorNetworkAgent::errorDomain(), 0, loader.url(), "Blocked by Web Inspector"_s, toResourceErrorType(errorType))); 1343 1348 return { }; 1344 1349 } -
trunk/Source/WebCore/inspector/agents/InspectorNetworkAgent.h
r293368 r293409 44 44 45 45 namespace Inspector { 46 class ConsoleMessage; 46 47 class InjectedScriptManager; 47 48 } … … 69 70 public: 70 71 ~InspectorNetworkAgent() override; 72 73 static constexpr ASCIILiteral errorDomain() { return "InspectorNetworkAgent"_s; } 71 74 72 75 static bool shouldTreatAsText(const String& mimeType); … … 139 142 virtual void setResourceCachingDisabledInternal(bool) = 0; 140 143 virtual ScriptExecutionContext* scriptExecutionContext(Inspector::Protocol::ErrorString&, const Inspector::Protocol::Network::FrameId&) = 0; 144 virtual void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&) = 0; 141 145 virtual bool shouldForceBufferingNetworkResourceData() const = 0; 142 146 -
trunk/Source/WebCore/inspector/agents/WebConsoleAgent.cpp
r287486 r293409 30 30 #include "CommandLineAPIHost.h" 31 31 #include "DOMWindow.h" 32 #include "InspectorNetworkAgent.h" 32 33 #include "InspectorWebAgentBase.h" 33 34 #include "JSExecState.h" … … 71 72 void WebConsoleAgent::didFailLoading(ResourceLoaderIdentifier requestIdentifier, const ResourceError& error) 72 73 { 74 if (error.domain() == InspectorNetworkAgent::errorDomain()) 75 return; 76 73 77 // Report failures only. 74 78 if (error.isCancellation()) -
trunk/Source/WebCore/inspector/agents/page/PageNetworkAgent.cpp
r287327 r293409 32 32 #include "InstrumentingAgents.h" 33 33 #include "Page.h" 34 #include "PageConsoleClient.h" 34 35 #include "WebSocket.h" 35 36 #include "WebSocketChannel.h" … … 117 118 } 118 119 120 void PageNetworkAgent::addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&& message) 121 { 122 m_inspectedPage.console().addMessage(WTFMove(message)); 123 } 124 119 125 } // namespace WebCore -
trunk/Source/WebCore/inspector/agents/page/PageNetworkAgent.h
r277880 r293409 45 45 void setResourceCachingDisabledInternal(bool); 46 46 ScriptExecutionContext* scriptExecutionContext(Inspector::Protocol::ErrorString&, const Inspector::Protocol::Network::FrameId&); 47 void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&); 47 48 bool shouldForceBufferingNetworkResourceData() const { return false; } 48 49 -
trunk/Source/WebCore/inspector/agents/worker/WorkerNetworkAgent.cpp
r277880 r293409 72 72 } 73 73 74 void WorkerNetworkAgent::addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&& message) 75 { 76 m_globalScope.addConsoleMessage(WTFMove(message)); 77 } 78 74 79 } // namespace WebCore -
trunk/Source/WebCore/inspector/agents/worker/WorkerNetworkAgent.h
r277880 r293409 43 43 void setResourceCachingDisabledInternal(bool); 44 44 ScriptExecutionContext* scriptExecutionContext(Inspector::Protocol::ErrorString&, const Inspector::Protocol::Network::FrameId&); 45 void addConsoleMessage(std::unique_ptr<Inspector::ConsoleMessage>&&); 45 46 bool shouldForceBufferingNetworkResourceData() const { return true; } 46 47 -
trunk/Source/WebCore/loader/DocumentThreadableLoader.cpp
r292793 r293409 45 45 #include "FrameLoader.h" 46 46 #include "InspectorInstrumentation.h" 47 #include "InspectorNetworkAgent.h" 47 48 #include "LegacySchemeRegistry.h" 48 49 #include "LoaderStrategy.h" … … 755 756 { 756 757 if (m_shouldLogError == ShouldLogError::Yes) { 757 if (error.isAccessControl() && !error.localizedDescription().isEmpty())758 if (error.isAccessControl() && error.domain() != InspectorNetworkAgent::errorDomain() && !error.localizedDescription().isEmpty()) 758 759 m_document.addConsoleMessage(MessageSource::Security, MessageLevel::Error, error.localizedDescription()); 759 760 logError(m_document, error, m_options.initiator); -
trunk/Source/WebCore/loader/SubresourceLoader.cpp
r291992 r293409 40 40 #include "FrameLoader.h" 41 41 #include "HTTPParsers.h" 42 #include "InspectorNetworkAgent.h" 42 43 #include "LinkLoader.h" 43 44 #include "Logging.h" … … 767 768 LOG(ResourceLoading, "Failed to load '%s'.\n", m_resource->url().string().latin1().data()); 768 769 769 if (m_frame->document() && error.isAccessControl() && m_resource->type() != CachedResource::Type::Ping)770 if (m_frame->document() && error.isAccessControl() && error.domain() != InspectorNetworkAgent::errorDomain() && m_resource->type() != CachedResource::Type::Ping) 770 771 m_frame->document()->addConsoleMessage(MessageSource::Security, MessageLevel::Error, error.localizedDescription()); 771 772 -
trunk/Source/WebInspectorUI/ChangeLog
r293338 r293409 1 2022-04-25 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: add UI for blocking requests 4 https://bugs.webkit.org/show_bug.cgi?id=239674 5 6 Reviewed by Patrick Angle. 7 8 * UserInterface/Models/LocalResourceOverride.js: 9 (WI.LocalResourceOverride): 10 (WI.LocalResourceOverride.create): 11 (WI.LocalResourceOverride.displayNameForNetworkStageOfType): Added. 12 (WI.LocalResourceOverride.displayNameForType): 13 (WI.LocalResourceOverride.displayNameForResourceErrorType): Added. 14 (WI.LocalResourceOverride.fromJSON): 15 (WI.LocalResourceOverride.prototype.toJSON): 16 (WI.LocalResourceOverride.prototype.get resourceErrorType): Added. 17 (WI.LocalResourceOverride.prototype.set resourceErrorType): Added. 18 (WI.LocalResourceOverride.prototype.get canMapToFile): 19 Add `WI.LocalResourceOverride.ResourceErrorType` (and a corresponding member variable) that 20 is be used when blocking matching requests. 21 22 * UserInterface/Controllers/NetworkManager.js: 23 (WI.NetworkManager.supportsBlockingRequests): Added. 24 (WI.NetworkManager.prototype.async requestIntercepted): 25 (WI.NetworkManager.prototype._handleResourceOverrideResourceErrorTypeChanged): Added. 26 Make sure to save `WI.LocalResourceOverride.InterceptType.Block` whenever the 27 `WI.LocalResourceOverride.ResourceErrorType` changes. 28 29 * UserInterface/Views/ContextMenuUtilities.js: 30 (WI.appendContextMenuItemsForSourceCode): 31 * UserInterface/Views/ResourceContentView.js: 32 (WI.ResourceContentView): 33 (WI.ResourceContentView.prototype._populateCreateLocalResourceOverrideContextMenu): 34 (WI.ResourceContentView.prototype._handleCreateLocalResourceOverride): Deleted. 35 Add contextmenu items for "Block Request URL". 36 37 * UserInterface/Views/LocalResourceOverrideRequestContentView.js: 38 (WI.LocalResourceOverrideRequestContentView): 39 (WI.LocalResourceOverrideRequestContentView.prototype.initialLayout): 40 (WI.LocalResourceOverrideRequestContentView.prototype.initialLayout.addOption): Added. 41 * UserInterface/Views/LocalResourceOverrideRequestContentView.css: 42 (.content-view.text.local-resource-override-request > .message-text-view select): Added. 43 There will be no request or response content for `WI.LocalResourceOverride.InterceptType.Block` 44 so show a `<select>` for choosing the `WI.LocalResourceOverride.ResourceErrorType`. 45 46 * UserInterface/Views/LocalResourceOverridePopover.js: 47 (WI.LocalResourceOverridePopover.prototype.get serializedData): 48 (WI.LocalResourceOverridePopover.prototype.show): 49 * UserInterface/Views/LocalResourceOverridePopover.css: 50 (.popover .local-resource-override-popover-content:is(.response, .block) .editor.url): Renamed from `.popover .local-resource-override-popover-content.response .editor.url`. 51 Only show the URL editor for `WI.LocalResourceOverride.InterceptType.Block`. 52 53 * UserInterface/Models/Resource.js: 54 (WI.Resource.classNamesForResource): 55 * UserInterface/Views/ResourceTreeElement.js: 56 (WI.ResourceTreeElement.prototype._updateResource): 57 (WI.ResourceTreeElement.prototype._updateIcon): 58 (WI.ResourceTreeElement.prototype._loadingDidFail): Added. 59 * UserInterface/Views/ResourceIcons.css: 60 (.resource-icon.override.skip-network .icon): Added. 61 (body:not(.window-inactive, .window-docked-inactive) :is(.table, .data-grid):focus-within .selected .resource-icon.override.skip-network .icon, body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .selected.resource-icon.override.skip-network .icon): Added. 62 (@media (prefers-color-scheme: dark) .resource-icon.override.skip-network .icon): Added. 63 * UserInterface/Images/SkipNetwork.svg: Added. 64 Add a new icon for when requests do not involve any network activity. 65 66 * UserInterface/Views/ContentView.js: 67 (WI.ContentView.createFromRepresentedObject): 68 (WI.ContentView.resolvedRepresentedObjectForRepresentedObject): 69 * UserInterface/Views/FontResourceContentView.js: 70 (WI.FontResourceContentView.prototype.dropZoneShouldAppearForDragEvent): 71 * UserInterface/Views/ImageResourceContentView.js: 72 (WI.ImageResourceContentView.prototype.dropZoneShouldAppearForDragEvent): 73 * UserInterface/Views/LocalResourceOverrideTreeElement.js: 74 (WI.LocalResourceOverrideTreeElement.prototype.willDismissPopover): 75 Use positive checks for the desired `WI.LocalResourceOverride.InterceptType` instead of 76 a negative check for the one value meant to be exlucded in the expectation that no new 77 enum values would get added (which this patch proves to be false). 78 79 * UserInterface/Views/LocalResourceOverrideLabelView.js: 80 (WI.LocalResourceOverrideLabelView.prototype.initialLayout): 81 Use the new `WI.LocalResourceOverride.displayNameForNetworkStageOfType` instead of doing 82 that work here. 83 84 * Localizations/en.lproj/localizedStrings.js: 85 1 86 2022-04-25 Devin Rousso <drousso@apple.com> 2 87 -
trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js
r292084 r293409 106 106 localizedStrings["2D"] = "2D"; 107 107 localizedStrings["720p"] = "720p"; 108 /* Text indicating that the local override intercepts the request phase of network activity. */ 109 localizedStrings["Access Control @ Local Override Type"] = "Access Control"; 108 110 localizedStrings["Accessibility"] = "Accessibility"; 109 111 localizedStrings["Action"] = "Action"; … … 234 236 /* Part of the 'Blackboxed - %d call frames' label shown in the debugger call stack when paused instead of subsequent call frames that have been blackboxed. */ 235 237 localizedStrings["Blackboxed @ Debugger Call Stack"] = "Blackboxed"; 238 /* Text indicating that the local override will always block the network activity. */ 239 localizedStrings["Block @ Local Override Type"] = "Block"; 240 localizedStrings["Block Request URL"] = "Block Request URL"; 241 localizedStrings["Block URL with %s error"] = "Block URL with %s error"; 236 242 localizedStrings["Block Variables"] = "Block Variables"; 237 243 /* Input label for the blur radius of a CSS box shadow */ … … 275 281 /* Tooltip for a timestamp marker that represents when a CSS animation/transition is canceled */ 276 282 localizedStrings["Canceled"] = "Canceled"; 283 /* Text indicating that the local override will always block the network activity. */ 284 localizedStrings["Cancellation @ Local Override Type"] = "Cancellation"; 277 285 localizedStrings["Canvas"] = "Canvas"; 278 286 localizedStrings["Canvas %d"] = "Canvas %d"; … … 725 733 localizedStrings["Garbage Collection"] = "Garbage Collection"; 726 734 localizedStrings["General"] = "General"; 735 /* Text indicating that the local override intercepts the response phase of network activity. */ 736 localizedStrings["General @ Local Override Type"] = "General"; 727 737 localizedStrings["Getter"] = "Getter"; 728 738 localizedStrings["Global Code"] = "Global Code"; … … 1216 1226 localizedStrings["Request Data"] = "Request Data"; 1217 1227 localizedStrings["Request Headers"] = "Request Headers"; 1218 /* Label indicating that the shown content is from a request local override. */1219 localizedStrings["Request Override @ Local Override Content View"] = "Request Override";1228 /* Text indicating that the local override replaces the request of the network activity. */ 1229 localizedStrings["Request Override @ Local Override Network Stage"] = "Request Override"; 1220 1230 localizedStrings["Requesting: %s"] = "Requesting: %s"; 1221 1231 localizedStrings["Required"] = "Required"; … … 1244 1254 localizedStrings["Response Cookies"] = "Response Cookies"; 1245 1255 localizedStrings["Response Headers"] = "Response Headers"; 1246 /* Label indicating that the shown content is from a response local override. */1247 localizedStrings["Response Override @ Local Override Content View"] = "Response Override";1256 /* Text indicating that the local override replaces the response of the network activity. */ 1257 localizedStrings["Response Override @ Local Override Network Stage"] = "Response Override"; 1248 1258 localizedStrings["Response:"] = "Response:"; 1249 1259 localizedStrings["Restart (%s)"] = "Restart (%s)"; … … 1562 1572 localizedStrings["This object is referenced by internal objects"] = "This object is referenced by internal objects"; 1563 1573 localizedStrings["This resource came from a local override"] = "This resource came from a local override"; 1574 localizedStrings["This resource was blocked by a local override"] = "This resource was blocked by a local override"; 1564 1575 localizedStrings["This resource was loaded from a local override"] = "This resource was loaded from a local override"; 1565 1576 localizedStrings["This resource was loaded from a service worker"] = "This resource was loaded from a service worker"; … … 1576 1587 /* Name of Timelines Tab */ 1577 1588 localizedStrings["Timelines Tab Name"] = "Timelines"; 1589 /* Text indicating that the local override will skip all network activity and instead immediately serve the response. */ 1590 localizedStrings["Timeout @ Local Override Type"] = "Timeout"; 1578 1591 localizedStrings["Timer %d Fired"] = "Timer %d Fired"; 1579 1592 localizedStrings["Timer %d Installed"] = "Timer %d Installed"; -
trunk/Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js
r292084 r293409 62 62 WI.Resource.addEventListener(WI.Resource.Event.RequestDataDidChange, this._handleResourceContentChangedForLocalResourceOverride, this); 63 63 WI.LocalResourceOverride.addEventListener(WI.LocalResourceOverride.Event.DisabledChanged, this._handleResourceOverrideDisabledChanged, this); 64 WI.LocalResourceOverride.addEventListener(WI.LocalResourceOverride.Event.ResourceErrorTypeChanged, this._handleResourceOverrideResourceErrorTypeChanged, this); 64 65 65 66 WI.Target.registerInitializationPromise((async () => { … … 72 73 let supported = false; 73 74 switch (localResourceOverride.type) { 75 case WI.LocalResourceOverride.InterceptType.Block: 76 supported = WI.NetworkManager.supportsBlockingRequests(); 77 break; 78 74 79 case WI.LocalResourceOverride.InterceptType.Request: 75 80 supported = WI.NetworkManager.supportsOverridingRequests(); … … 114 119 return InspectorFrontendHost.supportsShowCertificate 115 120 && InspectorBackend.hasCommand("Network.getSerializedCertificate"); 121 } 122 123 static supportsBlockingRequests() 124 { 125 // COMPATIBILITY (iOS 13.4): Network.interceptRequestWithError did not exist yet. 126 return InspectorBackend.hasCommand("Network.interceptRequestWithError"); 116 127 } 117 128 … … 960 971 961 972 switch (localResourceOverride.type) { 973 case WI.LocalResourceOverride.InterceptType.Block: 974 target.NetworkAgent.interceptRequestWithError.invoke({ 975 requestId, 976 errorType: localResourceOverride.resourceErrorType, 977 }); 978 return; 979 962 980 case WI.LocalResourceOverride.InterceptType.Request: { 963 981 target.NetworkAgent.interceptWithRequest.invoke({ … … 1505 1523 } 1506 1524 1525 _handleResourceOverrideResourceErrorTypeChanged(event) 1526 { 1527 console.assert(WI.NetworkManager.supportsBlockingRequests()); 1528 1529 let localResourceOverride = event.target; 1530 WI.objectStores.localResourceOverrides.putObject(localResourceOverride); 1531 } 1532 1507 1533 _handleBootstrapScriptContentDidChange(event) 1508 1534 { -
trunk/Source/WebInspectorUI/UserInterface/Models/LocalResourceOverride.js
r292084 r293409 26 26 WI.LocalResourceOverride = class LocalResourceOverride extends WI.Object 27 27 { 28 constructor(url, type, localResource, { isCaseSensitive, isRegex, disabled} = {})28 constructor(url, type, localResource, {resourceErrorType, isCaseSensitive, isRegex, disabled} = {}) 29 29 { 30 30 console.assert(url && typeof url === "string", url); … … 32 32 console.assert(localResource instanceof WI.LocalResource, localResource); 33 33 console.assert(!localResource.localResourceOverride, localResource); 34 console.assert(!resourceErrorType || Object.values(WI.LocalResourceOverride.ResourceErrorType).includes(resourceErrorType), resourceErrorType); 34 35 console.assert(isCaseSensitive === undefined || typeof isCaseSensitive === "boolean", isCaseSensitive); 35 36 console.assert(isRegex === undefined || typeof isRegex === "boolean", isRegex); … … 42 43 this._type = type; 43 44 this._localResource = localResource; 45 this._resourceErrorType = resourceErrorType || WI.LocalResourceOverride.ResourceErrorType.General; 44 46 this._isCaseSensitive = isCaseSensitive !== undefined ? isCaseSensitive : true; 45 47 this._isRegex = isRegex !== undefined ? isRegex : false; … … 51 53 // Static 52 54 53 static create(url, type, {requestURL, requestMethod, requestHeaders, requestData, responseMIMEType, responseContent, responseBase64Encoded, responseStatusCode, responseStatusText, responseHeaders, isCaseSensitive, isRegex, disabled} = {})55 static create(url, type, {requestURL, requestMethod, requestHeaders, requestData, responseMIMEType, responseContent, responseBase64Encoded, responseStatusCode, responseStatusText, responseHeaders, resourceErrorType, isCaseSensitive, isRegex, disabled} = {}) 54 56 { 55 57 let localResource = new WI.LocalResource({ 56 58 request: { 57 url: requestURL || "",59 url: requestURL || url || "", 58 60 method: requestMethod, 59 61 headers: requestHeaders, … … 69 71 }, 70 72 }); 71 return new WI.LocalResourceOverride(url, type, localResource, {isCaseSensitive, isRegex, disabled}); 73 return new WI.LocalResourceOverride(url, type, localResource, {resourceErrorType, isCaseSensitive, isRegex, disabled}); 74 } 75 76 static displayNameForNetworkStageOfType(type) 77 { 78 switch (type) { 79 case WI.LocalResourceOverride.InterceptType.Block: 80 case WI.LocalResourceOverride.InterceptType.Request: 81 return WI.UIString("Request Override", "Request Override @ Local Override Network Stage", "Text indicating that the local override replaces the request of the network activity."); 82 83 case WI.LocalResourceOverride.InterceptType.Response: 84 case WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork: 85 return WI.UIString("Response Override", "Response Override @ Local Override Network Stage", "Text indicating that the local override replaces the response of the network activity."); 86 } 87 88 console.assert(false, "Unknown type: ", type); 89 return ""; 72 90 } 73 91 … … 75 93 { 76 94 switch (type) { 95 case WI.LocalResourceOverride.InterceptType.Block: 96 return WI.UIString("Block", "Block @ Local Override Type", "Text indicating that the local override will always block the network activity."); 97 77 98 case WI.LocalResourceOverride.InterceptType.Request: 78 99 return WI.UIString("Request", "Request @ Local Override Type", "Text indicating that the local override intercepts the request phase of network activity."); 100 79 101 case WI.LocalResourceOverride.InterceptType.Response: 80 102 return WI.UIString("Response", "Response @ Local Override Type", "Text indicating that the local override intercepts the response phase of network activity."); 103 81 104 case WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork: 82 105 return WI.UIString("Response (skip network)", "Response (skip network) @ Local Override Type", "Text indicating that the local override will skip all network activity and instead immediately serve the response."); … … 87 110 } 88 111 112 static displayNameForResourceErrorType(resourceErrorType) 113 { 114 switch (resourceErrorType) { 115 case WI.LocalResourceOverride.ResourceErrorType.AccessControl: 116 return WI.UIString("Access Control", "Access Control @ Local Override Type", "Text indicating that the local override will block the network activity with an access error."); 117 118 case WI.LocalResourceOverride.ResourceErrorType.Cancellation: 119 return WI.UIString("Cancellation", "Cancellation @ Local Override Type", "Text indicating that the local override will block the network activity with a cancellation error."); 120 121 case WI.LocalResourceOverride.ResourceErrorType.General: 122 return WI.UIString("General", "General @ Local Override Type", "Text indicating that the local override will block the network activity with a general error."); 123 124 case WI.LocalResourceOverride.ResourceErrorType.Timeout: 125 return WI.UIString("Timeout", "Timeout @ Local Override Type", "Text indicating that the local override will block the network activity with an timeout error."); 126 } 127 128 console.assert(false, "Unknown resource error type: ", resourceErrorType); 129 return ""; 130 } 131 89 132 // Import / Export 90 133 91 134 static fromJSON(json) 92 135 { 93 let {url, type, localResource: localResourceJSON, isCaseSensitive, isRegex, disabled} = json;136 let {url, type, localResource: localResourceJSON, resourceErrorType, isCaseSensitive, isRegex, disabled} = json; 94 137 95 138 let localResource = WI.LocalResource.fromJSON(localResourceJSON); … … 99 142 type ??= WI.LocalResourceOverride.InterceptType.Response; 100 143 101 return new WI.LocalResourceOverride(url, type, localResource, { isCaseSensitive, isRegex, disabled});144 return new WI.LocalResourceOverride(url, type, localResource, {resourceErrorType, isCaseSensitive, isRegex, disabled}); 102 145 } 103 146 … … 113 156 }; 114 157 158 if (this._resourceErrorType) 159 json.resourceErrorType = this._resourceErrorType; 160 115 161 if (key === WI.ObjectStore.toJSONSymbol) 116 162 json[WI.objectStores.localResourceOverrides.keyPath] = this._url; … … 134 180 } 135 181 182 get resourceErrorType() 183 { 184 return this._resourceErrorType; 185 } 186 187 set resourceErrorType(resourceErrorType) 188 { 189 console.assert(Object.values(WI.LocalResourceOverride.ResourceErrorType).includes(resourceErrorType), resourceErrorType); 190 191 if (this._resourceErrorType === resourceErrorType) 192 return; 193 194 this._resourceErrorType = resourceErrorType; 195 196 this.dispatchEventToListeners(WI.LocalResourceOverride.Event.ResourceErrorTypeChanged); 197 } 198 136 199 get disabled() 137 200 { … … 171 234 172 235 switch (this._type) { 236 case WI.LocalResourceOverride.InterceptType.Block: 173 237 case WI.LocalResourceOverride.InterceptType.Request: 174 238 return false; … … 220 284 221 285 WI.LocalResourceOverride.InterceptType = { 286 Block: "block", 222 287 Request: "request", 223 288 Response: "response", … … 225 290 }; 226 291 292 WI.LocalResourceOverride.ResourceErrorType = { 293 AccessControl: "AccessControl", 294 Cancellation: "Cancellation", 295 General: "General", 296 Timeout: "Timeout", 297 }; 298 227 299 WI.LocalResourceOverride.Event = { 228 300 DisabledChanged: "local-resource-override-disabled-state-did-change", 301 ResourceErrorTypeChanged: "local-resource-override-resource-error-type-changed", 229 302 }; -
trunk/Source/WebInspectorUI/UserInterface/Models/Resource.js
r292037 r293409 185 185 let classes = []; 186 186 187 let localResourceOverride = resource.localResourceOverride || WI.networkManager.localResourceOverridesForURL(resource.url).filter((localResourceOverride) => !localResourceOverride.disabled)[0]; 187 188 let isOverride = !!resource.localResourceOverride; 188 189 let wasOverridden = resource.responseSource === WI.Resource.ResponseSource.InspectorOverride; 189 let shouldBeOverridden = resource.isLoading() && WI.networkManager.localResourceOverridesForURL(resource.url).some((localResourceOverride) => !localResourceOverride.disabled); 190 if (isOverride || wasOverridden || shouldBeOverridden) 190 let shouldBeOverridden = resource.isLoading() && localResourceOverride; 191 let shouldBeBlocked = (resource.failed || isOverride) && localResourceOverride?.type === WI.LocalResourceOverride.InterceptType.Block; 192 if (isOverride || wasOverridden || shouldBeOverridden || shouldBeBlocked) { 191 193 classes.push("override"); 194 195 if (shouldBeBlocked || localResourceOverride?.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) 196 classes.push("skip-network"); 197 } 192 198 193 199 if (resource.type === WI.Resource.Type.Other) { -
trunk/Source/WebInspectorUI/UserInterface/Views/ContentView.js
r283859 r293409 109 109 110 110 if (representedObject instanceof WI.LocalResourceOverride) { 111 if (representedObject.type === WI.LocalResourceOverride.InterceptType. Request)111 if (representedObject.type === WI.LocalResourceOverride.InterceptType.Block || representedObject.type === WI.LocalResourceOverride.InterceptType.Request) 112 112 return new WI.LocalResourceOverrideRequestContentView(representedObject); 113 113 return WI.ContentView.createFromRepresentedObject(representedObject.localResource); … … 272 272 273 273 if (representedObject instanceof WI.LocalResourceOverride) { 274 if (representedObject.type !== WI.LocalResourceOverride.InterceptType.Request)274 if (representedObject.type === WI.LocalResourceOverride.InterceptType.Response || representedObject.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) 275 275 return representedObject.localResource; 276 276 return representedObject; -
trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js
r288029 r293409 96 96 }); 97 97 }); 98 99 if (WI.NetworkManager.supportsBlockingRequests()) { 100 contextMenu.appendItem(WI.UIString("Block Request URL"), async () => { 101 let localResourceOverride = await sourceCode.createLocalResourceOverride(WI.LocalResourceOverride.InterceptType.Block); 102 WI.networkManager.addLocalResourceOverride(localResourceOverride); 103 }); 104 } 98 105 } else { 99 106 let localResourceOverride = WI.networkManager.localResourceOverridesForURL(sourceCode.url)[0]; -
trunk/Source/WebInspectorUI/UserInterface/Views/FontResourceContentView.js
r270604 r293409 121 121 return false; 122 122 123 // Request overrides cannot be created/updated from a file as files don't have network info.124 123 let localResourceOverride = this.resource.localResourceOverride || existingOverrides[0]; 125 if (localResourceOverride ?.type === WI.LocalResourceOverride.InterceptType.Request)124 if (localResourceOverride && !localResourceOverride.canMapToFile) 126 125 return false; 127 126 -
trunk/Source/WebInspectorUI/UserInterface/Views/ImageResourceContentView.js
r277279 r293409 179 179 return false; 180 180 181 // Request overrides cannot be created/updated from a file as files don't have network info.182 181 let localResourceOverride = this.resource.localResourceOverride || existingOverrides[0]; 183 if (localResourceOverride ?.type === WI.LocalResourceOverride.InterceptType.Request)182 if (localResourceOverride && !localResourceOverride.canMapToFile) 184 183 return false; 185 184 -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideLabelView.js
r270604 r293409 43 43 let labelElement = document.createElement("span"); 44 44 labelElement.className = "label"; 45 if (this._localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Request) 46 labelElement.textContent = WI.UIString("Request Override", "Request Override @ Local Override Content View", "Label indicating that the shown content is from a request local override."); 47 else 48 labelElement.textContent = WI.UIString("Response Override", "Response Override @ Local Override Content View", "Label indicating that the shown content is from a response local override."); 45 labelElement.textContent = WI.LocalResourceOverride.displayNameForNetworkStageOfType(this._localResourceOverride.type); 49 46 50 47 let urlElement = document.createElement("span"); -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.css
r293334 r293409 70 70 } 71 71 72 .popover .local-resource-override-popover-content .response.editor.url {72 .popover .local-resource-override-popover-content:is(.response, .block) .editor.url { 73 73 width: 330px; 74 74 } -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverridePopover.js
r293178 r293409 77 77 if (!name || !value) 78 78 continue; 79 if (data.type !== WI.LocalResourceOverride.InterceptType.Request) {79 if (data.type === WI.LocalResourceOverride.InterceptType.Response || data.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) { 80 80 if (name.toLowerCase() === "content-type") 81 81 continue; … … 126 126 if (!data.responseMIMEType && data.requestURL) { 127 127 data.responseMIMEType = WI.mimeTypeForFileExtension(WI.fileExtensionForURL(data.requestURL)); 128 if (data.type !== WI.LocalResourceOverride.InterceptType.Request)128 if (data.type === WI.LocalResourceOverride.InterceptType.Response || data.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) 129 129 headers["Content-Type"] = data.responseMIMEType; 130 130 } … … 200 200 201 201 this._typeSelectElement = document.createElement("select"); 202 for (let type of [WI.LocalResourceOverride.InterceptType.Request, WI.LocalResourceOverride.InterceptType.Response ]) {202 for (let type of [WI.LocalResourceOverride.InterceptType.Request, WI.LocalResourceOverride.InterceptType.Response, WI.LocalResourceOverride.InterceptType.Block]) { 203 203 let optionElement = this._typeSelectElement.appendChild(document.createElement("option")); 204 204 optionElement.textContent = WI.LocalResourceOverride.displayNameForType(type); … … 502 502 503 503 let toggleInputsForType = (initializeHeaders) => { 504 let isBlock = this._typeSelectElement.value === WI.LocalResourceOverride.InterceptType.Block; 504 505 let isRequest = this._typeSelectElement.value === WI.LocalResourceOverride.InterceptType.Request; 506 let isResponse = this._typeSelectElement.value === WI.LocalResourceOverride.InterceptType.Response || this._typeSelectElement.value === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork; 507 508 popoverContentElement.classList.toggle("block", isBlock); 505 509 popoverContentElement.classList.toggle("request", isRequest); 506 popoverContentElement.classList.toggle("response", !isRequest); 507 510 popoverContentElement.classList.toggle("response", isResponse); 511 512 initializeHeaders &&= !isBlock; 508 513 if (initializeHeaders) { 509 514 let headers = isRequest ? requestHeaders : responseHeaders; … … 520 525 521 526 if (requestURLRow) 522 requestURLRow.element.hidden = !isRequest;527 requestURLRow.element.hidden = isResponse || isBlock; 523 528 if (methodRowElement) 524 methodRowElement.hidden = !isRequest;525 526 mimeTypeRow.element.hidden = isRequest;527 statusCodeRow.element.hidden = isRequest;529 methodRowElement.hidden = isResponse || isBlock; 530 mimeTypeRow.element.hidden = isRequest || isBlock; 531 statusCodeRow.element.hidden = isRequest || isBlock; 532 headersRow.hidden = isBlock; 528 533 if (optionsRowElement) 529 optionsRowElement.hidden = isRequest ;534 optionsRowElement.hidden = isRequest || isBlock; 530 535 531 536 if (isRequest) { … … 534 539 if (contentTypeDataGridNode.parent) 535 540 this._headersDataGrid.removeChild(contentTypeDataGridNode); 536 } else { 541 } 542 543 if (isResponse) { 537 544 this._mimeTypeCodeMirror.refresh(); 538 545 this._statusCodeCodeMirror.refresh(); … … 542 549 this._headersDataGrid.insertChild(contentTypeDataGridNode, 0); 543 550 } 551 544 552 toggleHeadersDataGridVisibility(); 545 553 }; -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideRequestContentView.css
r270604 r293409 38 38 top: var(--navigation-bar-height); 39 39 } 40 41 .content-view.text.local-resource-override-request > .message-text-view select { 42 font-size: inherit; 43 vertical-align: text-bottom; 44 } -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideRequestContentView.js
r270604 r293409 29 29 { 30 30 console.assert(localResourceOverride instanceof WI.LocalResourceOverride, localResourceOverride); 31 console.assert(localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Request, localResourceOverride); 32 console.assert(WI.NetworkManager.supportsOverridingRequests()); 31 console.assert(localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Block || localResourceOverride.type === WI.LocalResourceOverride.InterceptType.Request, localResourceOverride); 32 console.assert(localResourceOverride.type !== WI.LocalResourceOverride.InterceptType.Block || WI.NetworkManager.supportsBlockingRequests(), localResourceOverride); 33 console.assert(localResourceOverride.type !== WI.LocalResourceOverride.InterceptType.Request || WI.NetworkManager.supportsOverridingRequests(), localResourceOverride); 33 34 34 35 let localResource = localResourceOverride.localResource; … … 69 70 this.textEditor.addEventListener(WI.TextEditor.Event.ContentDidChange, this._handleTextEditorContentDidChange, this); 70 71 71 let requestMethod = this.representedObject.localResource.requestMethod; 72 if (!WI.HTTPUtilities.RequestMethodsWithBody.has(requestMethod)) { 73 let message = WI.createMessageTextView(WI.UIString("%s requests do not have a body").format(requestMethod)); 74 this.element.appendChild(message); 72 let message = null; 73 switch (this.representedObject.type) { 74 case WI.LocalResourceOverride.InterceptType.Block: { 75 let selectElement = document.createElement("select"); 76 77 function addOption(resourceErrorType) { 78 let optionElement = selectElement.appendChild(document.createElement("option")); 79 optionElement.textContent = WI.LocalResourceOverride.displayNameForResourceErrorType(resourceErrorType); 80 optionElement.value = resourceErrorType; 81 } 82 addOption(WI.LocalResourceOverride.ResourceErrorType.General); 83 addOption(WI.LocalResourceOverride.ResourceErrorType.Timeout); 84 addOption(WI.LocalResourceOverride.ResourceErrorType.Cancellation); 85 addOption(WI.LocalResourceOverride.ResourceErrorType.AccessControl); 86 87 selectElement.value = this.representedObject.resourceErrorType; 88 selectElement.addEventListener("change", (event) => { 89 this.representedObject.resourceErrorType = selectElement.value; 90 }); 91 92 message = document.createDocumentFragment(); 93 String.format(WI.UIString("Block URL with %s error"), [selectElement], String.standardFormatters, message, (a, b) => { 94 a.append(b); 95 return a; 96 }); 97 break; 75 98 } 99 100 case WI.LocalResourceOverride.InterceptType.Request: { 101 let requestMethod = this.representedObject.localResource.requestMethod; 102 if (!WI.HTTPUtilities.RequestMethodsWithBody.has(requestMethod)) 103 message = WI.UIString("%s requests do not have a body").format(requestMethod); 104 break; 105 } 106 } 107 if (message) 108 this.element.appendChild(WI.createMessageTextView(message)); 76 109 } 77 110 -
trunk/Source/WebInspectorUI/UserInterface/Views/LocalResourceOverrideTreeElement.js
r293338 r293409 133 133 let wasSelected = this.selected; 134 134 135 if (serializedData.type !== WI.LocalResourceOverride.InterceptType.Request) {135 if (serializedData.type === WI.LocalResourceOverride.InterceptType.Response || serializedData.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) { 136 136 let revision = this._localResourceOverride.localResource.currentRevision; 137 137 serializedData.responseContent = revision.content; -
trunk/Source/WebInspectorUI/UserInterface/Views/ResourceContentView.js
r292172 r293409 88 88 this._createLocalResourceOverrideButtonNavigationItem.enabled = false; // Enabled when the content is available. 89 89 this._createLocalResourceOverrideButtonNavigationItem.visibilityPriority = WI.NavigationItem.VisibilityPriority.Low; 90 if (WI.NetworkManager.supportsOverridingRequests() )90 if (WI.NetworkManager.supportsOverridingRequests() || WI.NetworkManager.supportsBlockingRequests()) 91 91 WI.addMouseDownContextMenuHandlers(this._createLocalResourceOverrideButtonNavigationItem.element, this._populateCreateLocalResourceOverrideContextMenu.bind(this)); 92 92 else … … 335 335 return; 336 336 337 contextMenu.appendItem(WI.UIString("Create Request Local Override"), () => { 338 // Request overrides cannot be created from a file as files don't have network info. 339 this._createAndShowLocalResourceOverride(WI.LocalResourceOverride.InterceptType.Request); 340 }); 337 if (WI.NetworkManager.supportsOverridingRequests()) { 338 contextMenu.appendItem(WI.UIString("Create Request Local Override"), () => { 339 // Request overrides cannot be created from a file as files don't have network info. 340 this._createAndShowLocalResourceOverride(WI.LocalResourceOverride.InterceptType.Request); 341 }); 342 } 341 343 342 344 contextMenu.appendItem(WI.UIString("Create Response Local Override"), () => { … … 345 347 }); 346 348 }); 349 350 if (WI.NetworkManager.supportsBlockingRequests()) { 351 contextMenu.appendItem(WI.UIString("Block Request URL"), async () => { 352 let localResourceOverride = await this._resource.createLocalResourceOverride(WI.LocalResourceOverride.InterceptType.Block); 353 WI.networkManager.addLocalResourceOverride(localResourceOverride); 354 }); 355 } 347 356 } 348 357 -
trunk/Source/WebInspectorUI/UserInterface/Views/ResourceIcons.css
r259329 r293409 109 109 } 110 110 111 .resource-icon.override.skip-network .icon { 112 content: url(../Images/SkipNetwork.svg#light); 113 } 114 115 body:not(.window-inactive, .window-docked-inactive) :is(.table, .data-grid):focus-within .selected .resource-icon.override.skip-network .icon, 116 body:not(.window-inactive, .window-docked-inactive) .tree-outline:focus-within .selected.resource-icon.override.skip-network .icon { 117 content: url(../Images/SkipNetwork.svg#dark); 118 } 119 111 120 @media (prefers-color-scheme: dark) { 112 121 .resource-icon .icon { … … 190 199 content: url(../Images/ClippingIcons.svg#range-dark); 191 200 } 192 } 201 202 .resource-icon.override.skip-network .icon { 203 content: url(../Images/SkipNetwork.svg#dark); 204 } 205 } -
trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js
r270604 r293409 140 140 this._resource.removeEventListener(WI.Resource.Event.TypeDidChange, this._typeDidChange, this); 141 141 this._resource.removeEventListener(WI.Resource.Event.LoadingDidFinish, this.updateStatus, this); 142 this._resource.removeEventListener(WI.Resource.Event.LoadingDidFail, this. updateStatus, this);142 this._resource.removeEventListener(WI.Resource.Event.LoadingDidFail, this._loadingDidFail, this); 143 143 this._resource.removeEventListener(WI.Resource.Event.ResponseReceived, this._responseReceived, this); 144 144 } … … 151 151 resource.addEventListener(WI.Resource.Event.TypeDidChange, this._typeDidChange, this); 152 152 resource.addEventListener(WI.Resource.Event.LoadingDidFinish, this.updateStatus, this); 153 resource.addEventListener(WI.Resource.Event.LoadingDidFail, this. updateStatus, this);153 resource.addEventListener(WI.Resource.Event.LoadingDidFail, this._loadingDidFail, this); 154 154 resource.addEventListener(WI.Resource.Event.ResponseReceived, this._responseReceived, this); 155 155 … … 261 261 _updateIcon() 262 262 { 263 let localResourceOverride = this._resource.localResourceOverride || WI.networkManager.localResourceOverridesForURL(this._resource.url).filter((localResourceOverride) => !localResourceOverride.disabled)[0]; 263 264 let isOverride = !!this._resource.localResourceOverride; 264 265 let wasOverridden = this._resource.responseSource === WI.Resource.ResponseSource.InspectorOverride; 265 if (isOverride || wasOverridden) 266 let shouldBeOverridden = this._resource.isLoading() && localResourceOverride; 267 let shouldBeBlocked = (this._resource.failed || isOverride) && localResourceOverride?.type === WI.LocalResourceOverride.InterceptType.Block; 268 if (isOverride || wasOverridden || shouldBeOverridden || shouldBeBlocked) { 266 269 this.addClassName("override"); 270 271 if (shouldBeBlocked || localResourceOverride?.type === WI.LocalResourceOverride.InterceptType.ResponseSkippingNetwork) 272 this.addClassName("skip-network"); 273 } else { 274 this.removeClassName("override"); 275 this.removeClassName("skip-network"); 276 } 277 278 if (wasOverridden) 279 this.iconElement.title = WI.UIString("This resource was loaded from a local override"); 280 else if (shouldBeBlocked) 281 this.iconElement.title = WI.UIString("This resource was blocked by a local override"); 267 282 else 268 this.removeClassName("override"); 269 270 this.iconElement.title = wasOverridden ? WI.UIString("This resource was loaded from a local override") : ""; 283 this.iconElement.title = ""; 271 284 } 272 285 … … 285 298 } 286 299 300 _loadingDidFail(event) 301 { 302 this.updateStatus(); 303 this._updateIcon(); 304 } 305 287 306 _responseReceived(event) 288 307 {
Note: See TracChangeset
for help on using the changeset viewer.