mirror of
https://github.com/microsoft/playwright.git
synced 2024-12-14 13:45:36 +03:00
feat(webkit): request interception implemented (#341)
This commit is contained in:
parent
c749b7151b
commit
9e8196c998
@ -1 +1 @@
|
||||
1052
|
||||
1053
|
||||
|
@ -771,6 +771,54 @@ index 0000000000000000000000000000000000000000..34909cce9f6d8d7c74be4c96e40f80ca
|
||||
+ }
|
||||
+ ]
|
||||
+}
|
||||
diff --git a/Source/JavaScriptCore/inspector/protocol/Network.json b/Source/JavaScriptCore/inspector/protocol/Network.json
|
||||
index 658f14f8af68073b99a01dd7332628223b67fcd7..20303ab38deb601cb7b8120803d896863dfbfbd4 100644
|
||||
--- a/Source/JavaScriptCore/inspector/protocol/Network.json
|
||||
+++ b/Source/JavaScriptCore/inspector/protocol/Network.json
|
||||
@@ -258,7 +258,16 @@
|
||||
"name": "interceptContinue",
|
||||
"description": "Continue an interception with no modifications.",
|
||||
"parameters": [
|
||||
- { "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network request or response to continue." }
|
||||
+ { "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network request or response to continue." },
|
||||
+ { "name": "headers", "$ref": "Headers", "optional": true, "description": "HTTP response headers. Pass through original values if unmodified." }
|
||||
+ ]
|
||||
+ },
|
||||
+ {
|
||||
+ "name": "interceptAsError",
|
||||
+ "description": "Abort the intercepted request with given reason.",
|
||||
+ "parameters": [
|
||||
+ { "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network request." },
|
||||
+ { "name": "reason", "type": "string", "description": "Deliver error reason for the request." }
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -266,8 +275,8 @@
|
||||
"description": "Provide response content for an intercepted response.",
|
||||
"parameters": [
|
||||
{ "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network response to modify." },
|
||||
- { "name": "content", "type": "string" },
|
||||
- { "name": "base64Encoded", "type": "boolean", "description": "True, if content was sent as base64." },
|
||||
+ { "name": "content", "type": "string", "optional": true },
|
||||
+ { "name": "base64Encoded", "type": "boolean", "optional": true, "description": "True, if content was sent as base64." },
|
||||
{ "name": "mimeType", "type": "string", "optional": true, "description": "MIME Type for the data." },
|
||||
{ "name": "status", "type": "integer", "optional": true, "description": "HTTP response status code. Pass through original values if unmodified." },
|
||||
{ "name": "statusText", "type": "string", "optional": true, "description": "HTTP response status text. Pass through original values if unmodified." },
|
||||
@@ -356,6 +365,14 @@
|
||||
{ "name": "response", "$ref": "Response", "description": "Original response content that would proceed if this is continued." }
|
||||
]
|
||||
},
|
||||
+ {
|
||||
+ "name": "requestIntercepted",
|
||||
+ "description": "Fired when HTTP request has been intercepted. The frontend must response with <code>Network.interceptContinue</code> or <code>Network.interceptWithRespons</code>` to continue this response.",
|
||||
+ "parameters": [
|
||||
+ { "name": "requestId", "$ref": "RequestId", "description": "Identifier for this intercepted network. Corresponds with an earlier <code>Network.requestWillBeSent</code>." },
|
||||
+ { "name": "request", "$ref": "Request", "description": "Original request content that would proceed if this is continued." }
|
||||
+ ]
|
||||
+ },
|
||||
{
|
||||
"name": "webSocketWillSendHandshakeRequest",
|
||||
"description": "Fired when WebSocket is about to initiate handshake.",
|
||||
diff --git a/Source/JavaScriptCore/inspector/protocol/Page.json b/Source/JavaScriptCore/inspector/protocol/Page.json
|
||||
index a8fc5332ac92424b00a3dec62152fd3c5f28544e..653498e9033b1e55f04ec1a0126500c4530e2412 100644
|
||||
--- a/Source/JavaScriptCore/inspector/protocol/Page.json
|
||||
@ -1176,7 +1224,7 @@ index 4e41fd3f807e8f34bfef3f63f0ba6119a619821e..1f7be602cb2134f8867bf95afe0c9337
|
||||
return;
|
||||
|
||||
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.cpp b/Source/WebCore/inspector/InspectorInstrumentation.cpp
|
||||
index 4f18b58c6cd01e0b69a8953ad09a739c3520496a..a63f5e7dd61a6b15753f9c4de900f6043b6a3c50 100644
|
||||
index 4f18b58c6cd01e0b69a8953ad09a739c3520496a..49982ebf5c3b6f0a898e7f1757eb9c1df5d4afe4 100644
|
||||
--- a/Source/WebCore/inspector/InspectorInstrumentation.cpp
|
||||
+++ b/Source/WebCore/inspector/InspectorInstrumentation.cpp
|
||||
@@ -121,7 +121,7 @@ static Frame* frameForScriptExecutionContext(ScriptExecutionContext& context)
|
||||
@ -1238,7 +1286,7 @@ index 4f18b58c6cd01e0b69a8953ad09a739c3520496a..a63f5e7dd61a6b15753f9c4de900f604
|
||||
void InspectorInstrumentation::defaultAppearanceDidChangeImpl(InstrumentingAgents& instrumentingAgents, bool useDarkAppearance)
|
||||
{
|
||||
if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
|
||||
@@ -1266,6 +1275,24 @@ void InspectorInstrumentation::renderLayerDestroyedImpl(InstrumentingAgents& ins
|
||||
@@ -1266,6 +1275,31 @@ void InspectorInstrumentation::renderLayerDestroyedImpl(InstrumentingAgents& ins
|
||||
layerTreeAgent->renderLayerDestroyed(renderLayer);
|
||||
}
|
||||
|
||||
@ -1259,15 +1307,30 @@ index 4f18b58c6cd01e0b69a8953ad09a739c3520496a..a63f5e7dd61a6b15753f9c4de900f604
|
||||
+ return pageAgent->shouldBypassCSP();
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+bool InspectorInstrumentation::interceptRequestImpl(InstrumentingAgents& instrumentingAgents, ResourceLoader& loader, CompletionHandler<void(bool handled)>&& handler)
|
||||
+{
|
||||
+ if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
|
||||
+ return networkAgent->interceptRequest(loader, WTFMove(handler));
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
InstrumentingAgents& InspectorInstrumentation::instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope& workerGlobalScope)
|
||||
{
|
||||
return workerGlobalScope.inspectorController().m_instrumentingAgents;
|
||||
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.h b/Source/WebCore/inspector/InspectorInstrumentation.h
|
||||
index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f77e54d7c 100644
|
||||
index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..c76c5f752684da94720b798591784323cd15f080 100644
|
||||
--- a/Source/WebCore/inspector/InspectorInstrumentation.h
|
||||
+++ b/Source/WebCore/inspector/InspectorInstrumentation.h
|
||||
@@ -77,6 +77,7 @@ class DOMWrapperWorld;
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "HitTestResult.h"
|
||||
#include "InspectorInstrumentationPublic.h"
|
||||
#include "Page.h"
|
||||
+#include "ResourceLoader.h"
|
||||
#include "StorageArea.h"
|
||||
#include "WebAnimation.h"
|
||||
#include <JavaScriptCore/ConsoleMessage.h>
|
||||
@@ -77,6 +78,7 @@ class DOMWrapperWorld;
|
||||
class Document;
|
||||
class DocumentLoader;
|
||||
class EventListener;
|
||||
@ -1275,7 +1338,7 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
class HTTPHeaderMap;
|
||||
class InspectorTimelineAgent;
|
||||
class InstrumentingAgents;
|
||||
@@ -197,6 +198,7 @@ public:
|
||||
@@ -197,6 +199,7 @@ public:
|
||||
static void didReceiveData(Frame*, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
|
||||
static void didFinishLoading(Frame*, DocumentLoader*, unsigned long identifier, const NetworkLoadMetrics&, ResourceLoader*);
|
||||
static void didFailLoading(Frame*, DocumentLoader*, unsigned long identifier, const ResourceError&);
|
||||
@ -1283,7 +1346,7 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
|
||||
static void willSendRequest(WorkerGlobalScope&, unsigned long identifier, ResourceRequest&);
|
||||
static void didReceiveResourceResponse(WorkerGlobalScope&, unsigned long identifier, const ResourceResponse&);
|
||||
@@ -228,6 +230,7 @@ public:
|
||||
@@ -228,6 +231,7 @@ public:
|
||||
static void frameStoppedLoading(Frame&);
|
||||
static void frameScheduledNavigation(Frame&, Seconds delay);
|
||||
static void frameClearedScheduledNavigation(Frame&);
|
||||
@ -1291,18 +1354,19 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
static void defaultAppearanceDidChange(Page&, bool useDarkAppearance);
|
||||
static void willDestroyCachedResource(CachedResource&);
|
||||
|
||||
@@ -314,6 +317,10 @@ public:
|
||||
@@ -314,6 +318,11 @@ public:
|
||||
static void layerTreeDidChange(Page*);
|
||||
static void renderLayerDestroyed(Page*, const RenderLayer&);
|
||||
|
||||
+ static void runOpenPanel(Frame*, HTMLInputElement*, bool*);
|
||||
+ static void frameAttached(Frame*);
|
||||
+ static bool shouldBypassCSP(ScriptExecutionContext*);
|
||||
+ static bool interceptRequest(ResourceLoader&, CompletionHandler<void(bool handled)>&&);
|
||||
+
|
||||
static void frontendCreated();
|
||||
static void frontendDeleted();
|
||||
static bool hasFrontends() { return InspectorInstrumentationPublic::hasFrontends(); }
|
||||
@@ -414,6 +421,7 @@ private:
|
||||
@@ -414,6 +423,7 @@ private:
|
||||
static void didReceiveDataImpl(InstrumentingAgents&, unsigned long identifier, const char* data, int dataLength, int encodedDataLength);
|
||||
static void didFinishLoadingImpl(InstrumentingAgents&, unsigned long identifier, DocumentLoader*, const NetworkLoadMetrics&, ResourceLoader*);
|
||||
static void didFailLoadingImpl(InstrumentingAgents&, unsigned long identifier, DocumentLoader*, const ResourceError&);
|
||||
@ -1310,7 +1374,7 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
static void willLoadXHRSynchronouslyImpl(InstrumentingAgents&);
|
||||
static void didLoadXHRSynchronouslyImpl(InstrumentingAgents&);
|
||||
static void scriptImportedImpl(InstrumentingAgents&, unsigned long identifier, const String& sourceString);
|
||||
@@ -429,6 +437,7 @@ private:
|
||||
@@ -429,6 +439,7 @@ private:
|
||||
static void frameStoppedLoadingImpl(InstrumentingAgents&, Frame&);
|
||||
static void frameScheduledNavigationImpl(InstrumentingAgents&, Frame&, Seconds delay);
|
||||
static void frameClearedScheduledNavigationImpl(InstrumentingAgents&, Frame&);
|
||||
@ -1318,18 +1382,19 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
static void defaultAppearanceDidChangeImpl(InstrumentingAgents&, bool useDarkAppearance);
|
||||
static void willDestroyCachedResourceImpl(CachedResource&);
|
||||
|
||||
@@ -511,6 +520,10 @@ private:
|
||||
@@ -511,6 +522,11 @@ private:
|
||||
static void layerTreeDidChangeImpl(InstrumentingAgents&);
|
||||
static void renderLayerDestroyedImpl(InstrumentingAgents&, const RenderLayer&);
|
||||
|
||||
+ static void runOpenPanelImpl(InstrumentingAgents&, HTMLInputElement*, bool*);
|
||||
+ static void frameAttachedImpl(InstrumentingAgents&, Frame&);
|
||||
+ static bool shouldBypassCSPImpl(InstrumentingAgents&);
|
||||
+ static bool interceptRequestImpl(InstrumentingAgents&, ResourceLoader&, CompletionHandler<void(bool handled)>&&);
|
||||
+
|
||||
static InstrumentingAgents& instrumentingAgentsForPage(Page&);
|
||||
static InstrumentingAgents& instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope&);
|
||||
|
||||
@@ -1091,6 +1104,13 @@ inline void InspectorInstrumentation::didFailLoading(Frame* frame, DocumentLoade
|
||||
@@ -1091,6 +1107,13 @@ inline void InspectorInstrumentation::didFailLoading(Frame* frame, DocumentLoade
|
||||
didFailLoadingImpl(*instrumentingAgents, identifier, loader, error);
|
||||
}
|
||||
|
||||
@ -1343,7 +1408,7 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
inline void InspectorInstrumentation::didFailLoading(WorkerGlobalScope& workerGlobalScope, unsigned long identifier, const ResourceError& error)
|
||||
{
|
||||
didFailLoadingImpl(instrumentingAgentsForWorkerGlobalScope(workerGlobalScope), identifier, nullptr, error);
|
||||
@@ -1221,6 +1241,13 @@ inline void InspectorInstrumentation::frameClearedScheduledNavigation(Frame& fra
|
||||
@@ -1221,6 +1244,13 @@ inline void InspectorInstrumentation::frameClearedScheduledNavigation(Frame& fra
|
||||
frameClearedScheduledNavigationImpl(*instrumentingAgents, frame);
|
||||
}
|
||||
|
||||
@ -1357,7 +1422,7 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
inline void InspectorInstrumentation::defaultAppearanceDidChange(Page& page, bool useDarkAppearance)
|
||||
{
|
||||
FAST_RETURN_IF_NO_FRONTENDS(void());
|
||||
@@ -1650,6 +1677,28 @@ inline void InspectorInstrumentation::renderLayerDestroyed(Page* page, const Ren
|
||||
@@ -1650,6 +1680,36 @@ inline void InspectorInstrumentation::renderLayerDestroyed(Page* page, const Ren
|
||||
renderLayerDestroyedImpl(*instrumentingAgents, renderLayer);
|
||||
}
|
||||
|
||||
@ -1382,10 +1447,61 @@ index dbf82205db5bccbe169ed0e947d1ad83dd850fd6..b323d29ac8da2b557db618b2143b4c7f
|
||||
+ return shouldBypassCSPImpl(*instrumentingAgents);
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+inline bool InspectorInstrumentation::interceptRequest(ResourceLoader& loader, CompletionHandler<void(bool handled)>&& handler)
|
||||
+{
|
||||
+ FAST_RETURN_IF_NO_FRONTENDS(false);
|
||||
+ if (InstrumentingAgents* instrumentingAgents = instrumentingAgentsForFrame(loader.frame()))
|
||||
+ return interceptRequestImpl(*instrumentingAgents, loader, WTFMove(handler));
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
inline InstrumentingAgents* InspectorInstrumentation::instrumentingAgentsForContext(ScriptExecutionContext* context)
|
||||
{
|
||||
return context ? instrumentingAgentsForContext(*context) : nullptr;
|
||||
diff --git a/Source/WebCore/inspector/InspectorInstrumentationWebKit.cpp b/Source/WebCore/inspector/InspectorInstrumentationWebKit.cpp
|
||||
index 954aaf121a9fa507d83bc10ae37de1f128f7dcfc..043bfa8b5302e599e3fd2ad729e09acb211a0ec3 100644
|
||||
--- a/Source/WebCore/inspector/InspectorInstrumentationWebKit.cpp
|
||||
+++ b/Source/WebCore/inspector/InspectorInstrumentationWebKit.cpp
|
||||
@@ -30,6 +30,11 @@
|
||||
|
||||
namespace WebCore {
|
||||
|
||||
+bool InspectorInstrumentationWebKit::interceptRequestInternal(ResourceLoader& loader, CompletionHandler<void(bool handled)>&& handler)
|
||||
+{
|
||||
+ return InspectorInstrumentation::interceptRequest(loader, WTFMove(handler));
|
||||
+}
|
||||
+
|
||||
bool InspectorInstrumentationWebKit::shouldInterceptResponseInternal(const Frame& frame, const ResourceResponse& response)
|
||||
{
|
||||
return InspectorInstrumentation::shouldInterceptResponse(frame, response);
|
||||
diff --git a/Source/WebCore/inspector/InspectorInstrumentationWebKit.h b/Source/WebCore/inspector/InspectorInstrumentationWebKit.h
|
||||
index b67e89b80b4e7a8586cac81ade5d58a1bcb0d431..e7b2cebbe0054802fb5378f269570c28497ed0ff 100644
|
||||
--- a/Source/WebCore/inspector/InspectorInstrumentationWebKit.h
|
||||
+++ b/Source/WebCore/inspector/InspectorInstrumentationWebKit.h
|
||||
@@ -36,14 +36,22 @@ class SharedBuffer;
|
||||
|
||||
class WEBCORE_EXPORT InspectorInstrumentationWebKit {
|
||||
public:
|
||||
+ static bool interceptRequest(ResourceLoader&, CompletionHandler<void(bool handled)>&&);
|
||||
static bool shouldInterceptResponse(const Frame*, const ResourceResponse&);
|
||||
static void interceptResponse(const Frame*, const ResourceResponse&, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&&);
|
||||
|
||||
private:
|
||||
+ static bool interceptRequestInternal(ResourceLoader&, CompletionHandler<void(bool handled)>&&);
|
||||
static bool shouldInterceptResponseInternal(const Frame&, const ResourceResponse&);
|
||||
static void interceptResponseInternal(const Frame&, const ResourceResponse&, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&&);
|
||||
};
|
||||
|
||||
+inline bool InspectorInstrumentationWebKit::interceptRequest(ResourceLoader& loader, CompletionHandler<void(bool handled)>&& handler)
|
||||
+{
|
||||
+ FAST_RETURN_IF_NO_FRONTENDS(false);
|
||||
+ return interceptRequestInternal(loader, WTFMove(handler));
|
||||
+}
|
||||
+
|
||||
inline bool InspectorInstrumentationWebKit::shouldInterceptResponse(const Frame* frame, const ResourceResponse& response)
|
||||
{
|
||||
FAST_RETURN_IF_NO_FRONTENDS(false);
|
||||
diff --git a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp b/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
|
||||
index aecc79bc0ca56fb65fe0330f08e4ee688bf81e89..7b78b5a90004786aee21161bee739c1270e4ba7c 100644
|
||||
--- a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
|
||||
@ -1734,7 +1850,7 @@ index b578660fbb3ce176e4e0aeb5a22021dc880e47f0..a7c968bc9f88c7d26e1887bb53106b4a
|
||||
class Page;
|
||||
class SecurityOrigin;
|
||||
diff --git a/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp b/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp
|
||||
index ca8f169d18a697a4dea405c933398e67feef01c6..539263dd036da49441df8bcb98242d555c157428 100644
|
||||
index ca8f169d18a697a4dea405c933398e67feef01c6..2a6e57a9e5a781c41b45115d977acc1ef74f48c4 100644
|
||||
--- a/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp
|
||||
+++ b/Source/WebCore/inspector/agents/InspectorNetworkAgent.cpp
|
||||
@@ -99,6 +99,11 @@ using namespace Inspector;
|
||||
@ -1763,7 +1879,153 @@ index ca8f169d18a697a4dea405c933398e67feef01c6..539263dd036da49441df8bcb98242d55
|
||||
auto protocolResourceType = InspectorPageAgent::resourceTypeJSON(type);
|
||||
|
||||
Document* document = loader && loader->frame() ? loader->frame()->document() : nullptr;
|
||||
@@ -1292,6 +1304,11 @@ void InspectorNetworkAgent::searchInRequest(ErrorString& errorString, const Stri
|
||||
@@ -1109,19 +1121,117 @@ void InspectorNetworkAgent::interceptResponse(const ResourceResponse& response,
|
||||
m_frontendDispatcher->responseIntercepted(requestId, buildObjectForResourceResponse(response, nullptr));
|
||||
}
|
||||
|
||||
-void InspectorNetworkAgent::interceptContinue(ErrorString& errorString, const String& requestId)
|
||||
-{
|
||||
+bool InspectorNetworkAgent::interceptRequest(ResourceLoader& loader, CompletionHandler<void(bool handled)>&& handler) {
|
||||
+ if (!m_interceptionEnabled)
|
||||
+ return false;
|
||||
+ String requestId = IdentifiersFactory::requestId(loader.identifier());
|
||||
+ auto pendingRequest = makeUnique<PendingInterceptRequest>();
|
||||
+ pendingRequest->m_loader = &loader;
|
||||
+ pendingRequest->m_callback = WTFMove(handler);
|
||||
+ m_pendingInterceptRequests.set(requestId, WTFMove(pendingRequest));
|
||||
+ m_frontendDispatcher->requestIntercepted(requestId, buildObjectForResourceRequest(loader.request()));
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+void InspectorNetworkAgent::interceptContinue(ErrorString& errorString, const String& requestId, const JSON::Object* headers)
|
||||
+{
|
||||
+ auto pendingRequest = m_pendingInterceptRequests.take(requestId);
|
||||
+ if (pendingRequest) {
|
||||
+ ResourceLoader* loader = pendingRequest->m_loader.get();
|
||||
+ if (!loader->identifier()) {
|
||||
+ // Do not throw upon continue of canceled requests.
|
||||
+ return;
|
||||
+ }
|
||||
+ if (headers) {
|
||||
+ // Safe to const cast at this point, we are only adjusting the headers.
|
||||
+ ResourceRequest* request = const_cast<ResourceRequest*>(&loader->request());
|
||||
+ HTTPHeaderMap explicitHeaders;
|
||||
+ for (auto& header : *headers) {
|
||||
+ String headerValue;
|
||||
+ if (header.value->asString(headerValue))
|
||||
+ explicitHeaders.add(header.key, headerValue);
|
||||
+ }
|
||||
+ request->setHTTPHeaderFields(WTFMove(explicitHeaders));
|
||||
+ }
|
||||
+ pendingRequest->m_callback(false);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
auto pendingInterceptResponse = m_pendingInterceptResponses.take(requestId);
|
||||
- if (!pendingInterceptResponse) {
|
||||
- errorString = "Missing pending intercept response for given requestId"_s;
|
||||
+ if (pendingInterceptResponse) {
|
||||
+ pendingInterceptResponse->respondWithOriginalResponse();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ errorString = "Missing pending intercept response for given requestId"_s;
|
||||
+}
|
||||
+
|
||||
+void InspectorNetworkAgent::interceptAsError(ErrorString& errorString, const String& requestId, const String& reason)
|
||||
+{
|
||||
+ auto pendingRequest = m_pendingInterceptRequests.take(requestId);
|
||||
+ if (pendingRequest) {
|
||||
+ ResourceLoader* loader = pendingRequest->m_loader.get();
|
||||
+ if (!loader->identifier()) {
|
||||
+ errorString = "Unable to abort request, it has already been processed"_s;
|
||||
+ return;
|
||||
+ }
|
||||
+ ResourceError error(errorDomainWebKitInternal, 0, loader->url(), "Request intercepted"_s, ResourceError::Type::General);
|
||||
+ if (reason == "AccessControl")
|
||||
+ error = ResourceError(errorDomainWebKitInternal, 0, loader->url(), "Access denied"_s, ResourceError::Type::AccessControl);
|
||||
+ else if (reason == "Cancellation")
|
||||
+ error = ResourceError(errorDomainWebKitInternal, 0, loader->url(), "Request canceled"_s, ResourceError::Type::Cancellation);
|
||||
+ else if (reason == "Timeout")
|
||||
+ error = ResourceError(errorDomainWebKitInternal, 0, loader->url(), "Request timed out"_s, ResourceError::Type::Timeout);
|
||||
+ loader->didFail(error);
|
||||
+ pendingRequest->m_callback(true);
|
||||
return;
|
||||
}
|
||||
|
||||
- pendingInterceptResponse->respondWithOriginalResponse();
|
||||
+ errorString = "Missing pending intercept response for given requestId"_s;
|
||||
}
|
||||
|
||||
-void InspectorNetworkAgent::interceptWithResponse(ErrorString& errorString, const String& requestId, const String& content, bool base64Encoded, const String* mimeType, const int* status, const String* statusText, const JSON::Object* headers)
|
||||
+void InspectorNetworkAgent::interceptWithResponse(ErrorString& errorString, const String& requestId, const String* content, const bool* base64Encoded, const String* mimeType, const int* status, const String* statusText, const JSON::Object* headers)
|
||||
{
|
||||
+ auto pendingRequest = m_pendingInterceptRequests.take(requestId);
|
||||
+ if (pendingRequest && status && statusText && mimeType && headers) {
|
||||
+ RefPtr<ResourceLoader> loader = pendingRequest->m_loader.get();
|
||||
+ if (!loader->identifier()) {
|
||||
+ errorString = "Unable to fulfill request, it has already been processed"_s;
|
||||
+ return;
|
||||
+ }
|
||||
+ RefPtr<SharedBuffer> data;
|
||||
+ if (base64Encoded && *base64Encoded && content) {
|
||||
+ Vector<uint8_t> buffer;
|
||||
+ if (!base64Decode(*content, buffer)) {
|
||||
+ errorString = "Unable to decode given content"_s;
|
||||
+ return;
|
||||
+ }
|
||||
+ data = SharedBuffer::create(WTFMove(buffer));
|
||||
+ } else if (content) {
|
||||
+ data = SharedBuffer::create(content->utf8().data(), content->utf8().length());
|
||||
+ }
|
||||
+
|
||||
+ ResourceResponse response(pendingRequest->m_loader->url(), *mimeType, data->size(), String());
|
||||
+ response.setSource(ResourceResponse::Source::InspectorOverride);
|
||||
+ response.setHTTPStatusCode(*status);
|
||||
+ response.setHTTPStatusText(*statusText);
|
||||
+ HTTPHeaderMap explicitHeaders;
|
||||
+ for (auto& header : *headers) {
|
||||
+ String headerValue;
|
||||
+ if (header.value->asString(headerValue))
|
||||
+ explicitHeaders.add(header.key, headerValue);
|
||||
+ }
|
||||
+ response.setHTTPHeaderFields(WTFMove(explicitHeaders));
|
||||
+ response.setHTTPHeaderField(HTTPHeaderName::ContentType, response.mimeType());
|
||||
+ loader->didReceiveResponse(response, [loader, data = data.releaseNonNull()]() mutable {
|
||||
+ if (data->size())
|
||||
+ loader->didReceiveBuffer(WTFMove(data), data->size(), DataPayloadWholeResource);
|
||||
+ loader->didFinishLoading(NetworkLoadMetrics());
|
||||
+ });
|
||||
+ pendingRequest->m_callback(true);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
auto pendingInterceptResponse = m_pendingInterceptResponses.take(requestId);
|
||||
if (!pendingInterceptResponse) {
|
||||
errorString = "Missing pending intercept response for given requestId"_s;
|
||||
@@ -1149,16 +1259,17 @@ void InspectorNetworkAgent::interceptWithResponse(ErrorString& errorString, cons
|
||||
}
|
||||
|
||||
RefPtr<SharedBuffer> overrideData;
|
||||
- if (base64Encoded) {
|
||||
+ if (base64Encoded && *base64Encoded && content) {
|
||||
Vector<uint8_t> buffer;
|
||||
- if (!base64Decode(content, buffer)) {
|
||||
+ if (!base64Decode(*content, buffer)) {
|
||||
errorString = "Unable to decode given content"_s;
|
||||
pendingInterceptResponse->respondWithOriginalResponse();
|
||||
return;
|
||||
}
|
||||
overrideData = SharedBuffer::create(WTFMove(buffer));
|
||||
- } else
|
||||
- overrideData = SharedBuffer::create(content.utf8().data(), content.utf8().length());
|
||||
+ } else if (content) {
|
||||
+ overrideData = SharedBuffer::create(content->utf8().data(), content->utf8().length());
|
||||
+ }
|
||||
|
||||
pendingInterceptResponse->respond(overrideResponse, overrideData);
|
||||
}
|
||||
@@ -1292,6 +1403,11 @@ void InspectorNetworkAgent::searchInRequest(ErrorString& errorString, const Stri
|
||||
results = ContentSearchUtilities::searchInTextByLines(resourceData->content(), query, caseSensitive, isRegex);
|
||||
}
|
||||
|
||||
@ -1776,10 +2038,27 @@ index ca8f169d18a697a4dea405c933398e67feef01c6..539263dd036da49441df8bcb98242d55
|
||||
{
|
||||
m_resourcesData->clear(loaderIdentifier(&loader));
|
||||
diff --git a/Source/WebCore/inspector/agents/InspectorNetworkAgent.h b/Source/WebCore/inspector/agents/InspectorNetworkAgent.h
|
||||
index a68f84520736977c8b9216616c5a178fbf5275d6..364dd6793f0f35134a302827a72f6c9b0bd388cd 100644
|
||||
index a68f84520736977c8b9216616c5a178fbf5275d6..1a69942522052106bf44148b07d39d65964818d1 100644
|
||||
--- a/Source/WebCore/inspector/agents/InspectorNetworkAgent.h
|
||||
+++ b/Source/WebCore/inspector/agents/InspectorNetworkAgent.h
|
||||
@@ -125,6 +125,8 @@ public:
|
||||
@@ -90,8 +90,9 @@ public:
|
||||
void setInterceptionEnabled(ErrorString&, bool enabled) final;
|
||||
void addInterception(ErrorString&, const String& url, const bool* caseSensitive, const bool* isRegex, const String* networkStageString) final;
|
||||
void removeInterception(ErrorString&, const String& url, const bool* caseSensitive, const bool* isRegex, const String* networkStageString) final;
|
||||
- void interceptContinue(ErrorString&, const String& requestId) final;
|
||||
- void interceptWithResponse(ErrorString&, const String& requestId, const String& content, bool base64Encoded, const String* mimeType, const int* status, const String* statusText, const JSON::Object* headers) final;
|
||||
+ void interceptContinue(ErrorString&, const String& requestId, const JSON::Object* headers) final;
|
||||
+ void interceptAsError(ErrorString&, const String& requestId, const String& reason) final;
|
||||
+ void interceptWithResponse(ErrorString&, const String& requestId, const String* content, const bool* base64Encoded, const String* mimeType, const int* status, const String* statusText, const JSON::Object* headers) final;
|
||||
|
||||
// InspectorInstrumentation
|
||||
void willRecalculateStyle();
|
||||
@@ -121,10 +122,13 @@ public:
|
||||
bool willInterceptRequest(const ResourceRequest&);
|
||||
bool shouldInterceptResponse(const ResourceResponse&);
|
||||
void interceptResponse(const ResourceResponse&, unsigned long identifier, CompletionHandler<void(const ResourceResponse&, RefPtr<SharedBuffer>)>&&);
|
||||
+ bool interceptRequest(ResourceLoader& loader, CompletionHandler<void(bool handled)>&&);
|
||||
|
||||
void searchOtherRequests(const JSC::Yarr::RegularExpression&, RefPtr<JSON::ArrayOf<Inspector::Protocol::Page::SearchResult>>&);
|
||||
void searchInRequest(ErrorString&, const String& requestId, const String& query, bool caseSensitive, bool isRegex, RefPtr<JSON::ArrayOf<Inspector::Protocol::GenericTypes::SearchMatch>>&);
|
||||
|
||||
@ -1788,6 +2067,30 @@ index a68f84520736977c8b9216616c5a178fbf5275d6..364dd6793f0f35134a302827a72f6c9b
|
||||
protected:
|
||||
InspectorNetworkAgent(WebAgentContext&);
|
||||
|
||||
@@ -191,6 +195,15 @@ private:
|
||||
bool m_responded { false };
|
||||
};
|
||||
|
||||
+ class PendingInterceptRequest {
|
||||
+ WTF_MAKE_NONCOPYABLE(PendingInterceptRequest);
|
||||
+ WTF_MAKE_FAST_ALLOCATED;
|
||||
+ public:
|
||||
+ PendingInterceptRequest() = default;
|
||||
+ RefPtr<ResourceLoader> m_loader;
|
||||
+ CompletionHandler<void(bool handled)> m_callback;
|
||||
+ };
|
||||
+
|
||||
std::unique_ptr<Inspector::NetworkFrontendDispatcher> m_frontendDispatcher;
|
||||
RefPtr<Inspector::NetworkBackendDispatcher> m_backendDispatcher;
|
||||
Inspector::InjectedScriptManager& m_injectedScriptManager;
|
||||
@@ -214,6 +227,7 @@ private:
|
||||
};
|
||||
Vector<Intercept> m_intercepts;
|
||||
HashMap<String, std::unique_ptr<PendingInterceptResponse>> m_pendingInterceptResponses;
|
||||
+ HashMap<String, std::unique_ptr<PendingInterceptRequest>> m_pendingInterceptRequests;
|
||||
|
||||
// FIXME: InspectorNetworkAgent should not be aware of style recalculation.
|
||||
RefPtr<Inspector::Protocol::Network::Initiator> m_styleRecalculationInitiator;
|
||||
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
||||
index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..f098efafd98f734f04f54d5ca56bae9045320427 100644
|
||||
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
||||
@ -7953,6 +8256,34 @@ index 1c5c6ca4bacba4b134d44af9200b0b1e8b4ca2b3..49bfaecf5c2f7cd704c7ef91952303e7
|
||||
2D11B7532126A282006F8878 /* UnifiedSource2-mm.mm in Sources */,
|
||||
2D11B7562126A282006F8878 /* UnifiedSource3.cpp in Sources */,
|
||||
2D11B7552126A282006F8878 /* UnifiedSource3-mm.mm in Sources */,
|
||||
diff --git a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
|
||||
index d723cae3331551dff866171a859c641820a6376e..07c84938d2313d83715a27aea77a2c230e937e66 100644
|
||||
--- a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
|
||||
+++ b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
|
||||
@@ -57,6 +57,7 @@
|
||||
#include <WebCore/FetchOptions.h>
|
||||
#include <WebCore/Frame.h>
|
||||
#include <WebCore/FrameLoader.h>
|
||||
+#include <WebCore/InspectorInstrumentationWebKit.h>
|
||||
#include <WebCore/NetscapePlugInStreamLoader.h>
|
||||
#include <WebCore/NetworkLoadInformation.h>
|
||||
#include <WebCore/PlatformStrategies.h>
|
||||
@@ -216,6 +217,15 @@ void WebLoaderStrategy::scheduleLoad(ResourceLoader& resourceLoader, CachedResou
|
||||
|
||||
if (!tryLoadingUsingURLSchemeHandler(resourceLoader)) {
|
||||
RELEASE_LOG_IF_ALLOWED("scheduleLoad: URL will be scheduled with the NetworkProcess (frame=%p, webPageID=%" PRIu64 ", frameID=%" PRIu64 ", resourceID=%" PRIu64 ")", resourceLoader.frame(), trackingParameters.pageID.toUInt64(), trackingParameters.frameID.toUInt64(), identifier);
|
||||
+
|
||||
+ RefPtr<ResourceLoader> coreLoader = &resourceLoader;
|
||||
+ if (InspectorInstrumentationWebKit::interceptRequest(resourceLoader, [this, coreLoader, trackingParameters, shouldClearReferrerOnHTTPSToHTTPRedirect, resource](bool handled) mutable {
|
||||
+ if (!handled)
|
||||
+ scheduleLoadFromNetworkProcess(*coreLoader, coreLoader->request(), trackingParameters, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime(resource));
|
||||
+ })) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
scheduleLoadFromNetworkProcess(resourceLoader, resourceLoader.request(), trackingParameters, shouldClearReferrerOnHTTPSToHTTPRedirect, maximumBufferingTime(resource));
|
||||
return;
|
||||
}
|
||||
diff --git a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp b/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp
|
||||
index a70f6fd52096a5dca901ea70a3755f14d6b4a0fd..f02e5c774a49d3e67860adb3b011531313eaf8d1 100644
|
||||
--- a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user