browser(webkit): implement Browser.navigate (#473)

This commit is contained in:
Yury Semikhatsky 2020-01-13 16:35:08 -08:00 committed by GitHub
parent 8b09358a56
commit d529ef95d2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 444 additions and 73 deletions

View File

@ -1 +1 @@
1084 1085

View File

@ -393,10 +393,10 @@ index 1eb7abb2fa21d7a8ec0833160f53e5c523ec4317..b10dd23de692fd5f447a9b845b5695ac
bool m_shouldPauseOnStart { false }; bool m_shouldPauseOnStart { false };
diff --git a/Source/JavaScriptCore/inspector/protocol/Browser.json b/Source/JavaScriptCore/inspector/protocol/Browser.json diff --git a/Source/JavaScriptCore/inspector/protocol/Browser.json b/Source/JavaScriptCore/inspector/protocol/Browser.json
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..f58236088a813e1e4afc2d7a315c20676efeeb4b index 0000000000000000000000000000000000000000..5bbb1e96506ac1a0a34289326fa81985b9b81f79
--- /dev/null --- /dev/null
+++ b/Source/JavaScriptCore/inspector/protocol/Browser.json +++ b/Source/JavaScriptCore/inspector/protocol/Browser.json
@@ -0,0 +1,178 @@ @@ -0,0 +1,192 @@
+{ +{
+ "domain": "Browser", + "domain": "Browser",
+ "availability": ["web"], + "availability": ["web"],
@ -500,6 +500,20 @@ index 0000000000000000000000000000000000000000..f58236088a813e1e4afc2d7a315c2067
+ ] + ]
+ }, + },
+ { + {
+ "name": "navigate",
+ "async": true,
+ "description": "Navigates current page to the given URL.",
+ "parameters": [
+ { "name": "url", "type": "string", "description": "URL to navigate the page to." },
+ { "name": "pageProxyId", "$ref": "PageProxyID", "description": "Unique identifier of the page proxy." },
+ { "name": "frameId", "$ref": "Network.FrameId", "optional": true, "description": "Id of the frame to navigate."},
+ { "name": "referrer", "type": "string", "optional": true, "description": "Referrer URL." }
+ ],
+ "returns": [
+ { "name": "navigationId", "$ref": "Network.NavigationId", "optional": true, "description": "Identifier of the loader associated with the navigation." }
+ ]
+ },
+ {
+ "name": "setIgnoreCertificateErrors", + "name": "setIgnoreCertificateErrors",
+ "description": "Change whether all certificate errors should be ignored.", + "description": "Change whether all certificate errors should be ignored.",
+ "parameters": [ + "parameters": [
@ -897,10 +911,22 @@ index 0000000000000000000000000000000000000000..34909cce9f6d8d7c74be4c96e40f80ca
+ ] + ]
+} +}
diff --git a/Source/JavaScriptCore/inspector/protocol/Network.json b/Source/JavaScriptCore/inspector/protocol/Network.json diff --git a/Source/JavaScriptCore/inspector/protocol/Network.json b/Source/JavaScriptCore/inspector/protocol/Network.json
index 658f14f8af68073b99a01dd7332628223b67fcd7..bf7c6b49ac403a3b877f60b0f2e236971dc3b592 100644 index 658f14f8af68073b99a01dd7332628223b67fcd7..1e6268d67dfc6f2e9d246051bfd253649b630570 100644
--- a/Source/JavaScriptCore/inspector/protocol/Network.json --- a/Source/JavaScriptCore/inspector/protocol/Network.json
+++ b/Source/JavaScriptCore/inspector/protocol/Network.json +++ b/Source/JavaScriptCore/inspector/protocol/Network.json
@@ -231,7 +231,8 @@ @@ -14,6 +14,11 @@
"type": "string",
"description": "Unique frame identifier."
},
+ {
+ "id": "NavigationId",
+ "type": "string",
+ "description": "Frame navigation identifier that survives web process swaps."
+ },
{
"id": "RequestId",
"type": "string",
@@ -231,7 +236,8 @@
"name": "setInterceptionEnabled", "name": "setInterceptionEnabled",
"description": "Enable interception of network requests.", "description": "Enable interception of network requests.",
"parameters": [ "parameters": [
@ -910,7 +936,7 @@ index 658f14f8af68073b99a01dd7332628223b67fcd7..bf7c6b49ac403a3b877f60b0f2e23697
] ]
}, },
{ {
@@ -258,7 +259,16 @@ @@ -258,7 +264,16 @@
"name": "interceptContinue", "name": "interceptContinue",
"description": "Continue an interception with no modifications.", "description": "Continue an interception with no modifications.",
"parameters": [ "parameters": [
@ -928,7 +954,7 @@ index 658f14f8af68073b99a01dd7332628223b67fcd7..bf7c6b49ac403a3b877f60b0f2e23697
] ]
}, },
{ {
@@ -266,13 +276,20 @@ @@ -266,13 +281,20 @@
"description": "Provide response content for an intercepted response.", "description": "Provide response content for an intercepted response.",
"parameters": [ "parameters": [
{ "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network response to modify." }, { "name": "requestId", "$ref": "RequestId", "description": "Identifier for the intercepted Network response to modify." },
@ -951,7 +977,7 @@ index 658f14f8af68073b99a01dd7332628223b67fcd7..bf7c6b49ac403a3b877f60b0f2e23697
} }
], ],
"events": [ "events": [
@@ -356,6 +373,14 @@ @@ -356,6 +378,14 @@
{ "name": "response", "$ref": "Response", "description": "Original response content that would proceed if this is continued." } { "name": "response", "$ref": "Response", "description": "Original response content that would proceed if this is continued." }
] ]
}, },
@ -2444,7 +2470,7 @@ index a68f84520736977c8b9216616c5a178fbf5275d6..bee832c4c65f9a4487c0d0b7c6fd6985
} // namespace WebCore } // namespace WebCore
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..10659e29a0c2a6dcebc90c117194835f2f8f818f 100644 index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..4c3fa82e3bb63bd3750731157950563808c754c2 100644
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp --- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp +++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
@@ -32,6 +32,8 @@ @@ -32,6 +32,8 @@
@ -2472,7 +2498,7 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..10659e29a0c2a6dcebc90c117194835f
#include "HTMLNames.h" #include "HTMLNames.h"
#include "ImageBuffer.h" #include "ImageBuffer.h"
#include "InspectorClient.h" #include "InspectorClient.h"
@@ -55,19 +60,25 @@ @@ -55,18 +60,24 @@
#include "MIMETypeRegistry.h" #include "MIMETypeRegistry.h"
#include "MemoryCache.h" #include "MemoryCache.h"
#include "Page.h" #include "Page.h"
@ -2493,11 +2519,10 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..10659e29a0c2a6dcebc90c117194835f
#include <JavaScriptCore/IdentifiersFactory.h> #include <JavaScriptCore/IdentifiersFactory.h>
+#include <JavaScriptCore/InjectedScriptManager.h> +#include <JavaScriptCore/InjectedScriptManager.h>
#include <JavaScriptCore/RegularExpression.h> #include <JavaScriptCore/RegularExpression.h>
+#include <platform/ProcessIdentifier.h>
#include <wtf/ListHashSet.h> #include <wtf/ListHashSet.h>
+#include <wtf/ProcessID.h>
#include <wtf/Stopwatch.h> #include <wtf/Stopwatch.h>
#include <wtf/text/Base64.h> #include <wtf/text/Base64.h>
#include <wtf/text/StringBuilder.h>
@@ -339,6 +350,7 @@ InspectorPageAgent::InspectorPageAgent(PageAgentContext& context, InspectorClien @@ -339,6 +350,7 @@ InspectorPageAgent::InspectorPageAgent(PageAgentContext& context, InspectorClien
, m_frontendDispatcher(makeUnique<Inspector::PageFrontendDispatcher>(context.frontendRouter)) , m_frontendDispatcher(makeUnique<Inspector::PageFrontendDispatcher>(context.frontendRouter))
, m_backendDispatcher(Inspector::PageBackendDispatcher::create(context.backendDispatcher, this)) , m_backendDispatcher(Inspector::PageBackendDispatcher::create(context.backendDispatcher, this))
@ -2593,7 +2618,7 @@ index d4e6b5d1f2151a1f4c16081b2695dd66da416ba2..10659e29a0c2a6dcebc90c117194835f
+static String globalIDForFrame(Frame& frame) +static String globalIDForFrame(Frame& frame)
+{ +{
+ return makeString(getCurrentProcessID(), ".", frame.loader().client().frameID()->toUInt64()); + return makeString(Process::identifier().toUInt64(), ".", frame.loader().client().frameID()->toUInt64());
+} +}
+ +
void InspectorPageAgent::frameDetached(Frame& frame) void InspectorPageAgent::frameDetached(Frame& frame)
@ -3503,10 +3528,15 @@ index 5d12564c5908689a5ec78d036bd24d57b241775a..0ed1e261967b446f54210a52512aa79c
} }
diff --git a/Source/WebCore/loader/DocumentLoader.h b/Source/WebCore/loader/DocumentLoader.h diff --git a/Source/WebCore/loader/DocumentLoader.h b/Source/WebCore/loader/DocumentLoader.h
index 05f4c14eec4da40450a5cf0f6a21fbf547045c46..15417787025db89985197faf97ce575e2f7ff847 100644 index 05f4c14eec4da40450a5cf0f6a21fbf547045c46..a5924e79a1c105cbdefa676c41ac2cdcf2cdaaae 100644
--- a/Source/WebCore/loader/DocumentLoader.h --- a/Source/WebCore/loader/DocumentLoader.h
+++ b/Source/WebCore/loader/DocumentLoader.h +++ b/Source/WebCore/loader/DocumentLoader.h
@@ -162,6 +162,8 @@ public: @@ -159,9 +159,13 @@ public:
WEBCORE_EXPORT virtual void detachFromFrame();
+ virtual void replacedByFragmentNavigation(Frame&) { }
+
WEBCORE_EXPORT FrameLoader* frameLoader() const; WEBCORE_EXPORT FrameLoader* frameLoader() const;
WEBCORE_EXPORT SubresourceLoader* mainResourceLoader() const; WEBCORE_EXPORT SubresourceLoader* mainResourceLoader() const;
WEBCORE_EXPORT RefPtr<SharedBuffer> mainResourceData() const; WEBCORE_EXPORT RefPtr<SharedBuffer> mainResourceData() const;
@ -3516,7 +3546,7 @@ index 05f4c14eec4da40450a5cf0f6a21fbf547045c46..15417787025db89985197faf97ce575e
DocumentWriter& writer() const { return m_writer; } DocumentWriter& writer() const { return m_writer; }
diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp
index 9a72b906215d3790814255ff0c5cd9c34d9f9f70..a79921cce6ca0fc0f64e8d7ea36a326db82ac4db 100644 index 9a72b906215d3790814255ff0c5cd9c34d9f9f70..903221a3bfa7458a08f4fac19d2a192b86d27319 100644
--- a/Source/WebCore/loader/FrameLoader.cpp --- a/Source/WebCore/loader/FrameLoader.cpp
+++ b/Source/WebCore/loader/FrameLoader.cpp +++ b/Source/WebCore/loader/FrameLoader.cpp
@@ -1177,6 +1177,7 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat @@ -1177,6 +1177,7 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat
@ -3536,7 +3566,16 @@ index 9a72b906215d3790814255ff0c5cd9c34d9f9f70..a79921cce6ca0fc0f64e8d7ea36a326d
// The search for a target frame is done earlier in the case of form submission. // The search for a target frame is done earlier in the case of form submission.
Frame* targetFrame = isFormSubmission ? nullptr : findFrameForNavigation(effectiveFrameName); Frame* targetFrame = isFormSubmission ? nullptr : findFrameForNavigation(effectiveFrameName);
if (targetFrame && targetFrame != &m_frame) { if (targetFrame && targetFrame != &m_frame) {
@@ -3179,6 +3182,8 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error) @@ -1595,6 +1598,8 @@ void FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType t
const String& httpMethod = loader->request().httpMethod();
if (shouldPerformFragmentNavigation(isFormSubmission, httpMethod, policyChecker().loadType(), newURL)) {
+ loader->replacedByFragmentNavigation(m_frame);
+
RefPtr<DocumentLoader> oldDocumentLoader = m_documentLoader;
NavigationAction action { *m_frame.document(), loader->request(), InitiatedByMainFrame::Unknown, policyChecker().loadType(), isFormSubmission };
@@ -3179,6 +3184,8 @@ void FrameLoader::receivedMainResourceError(const ResourceError& error)
checkCompleted(); checkCompleted();
if (m_frame.page()) if (m_frame.page())
checkLoadComplete(); checkLoadComplete();
@ -3545,7 +3584,7 @@ index 9a72b906215d3790814255ff0c5cd9c34d9f9f70..a79921cce6ca0fc0f64e8d7ea36a326d
} }
void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue) void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue)
@@ -3945,9 +3950,6 @@ String FrameLoader::referrer() const @@ -3945,9 +3952,6 @@ String FrameLoader::referrer() const
void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
{ {
@ -3555,17 +3594,17 @@ index 9a72b906215d3790814255ff0c5cd9c34d9f9f70..a79921cce6ca0fc0f64e8d7ea36a326d
Vector<Ref<DOMWrapperWorld>> worlds; Vector<Ref<DOMWrapperWorld>> worlds;
ScriptController::getAllWorlds(worlds); ScriptController::getAllWorlds(worlds);
for (auto& world : worlds) for (auto& world : worlds)
@@ -3956,13 +3958,12 @@ void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds() @@ -3956,13 +3960,12 @@ void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world) void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world)
{ {
- if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript) || !m_frame.windowProxy().existingJSWindowProxy(world)) - if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript) || !m_frame.windowProxy().existingJSWindowProxy(world))
- return; - return;
-
- m_client.dispatchDidClearWindowObjectInWorld(world);
+ if (m_frame.script().canExecuteScripts(NotAboutToExecuteScript) && m_frame.windowProxy().existingJSWindowProxy(world)) { + if (m_frame.script().canExecuteScripts(NotAboutToExecuteScript) && m_frame.windowProxy().existingJSWindowProxy(world)) {
+ m_client.dispatchDidClearWindowObjectInWorld(world); + m_client.dispatchDidClearWindowObjectInWorld(world);
- m_client.dispatchDidClearWindowObjectInWorld(world);
-
- if (Page* page = m_frame.page()) - if (Page* page = m_frame.page())
- page->inspectorController().didClearWindowObjectInWorld(m_frame, world); - page->inspectorController().didClearWindowObjectInWorld(m_frame, world);
+ if (Page* page = m_frame.page()) + if (Page* page = m_frame.page())
@ -5648,10 +5687,10 @@ index 15a4c1ff1c4aeee7d807856db0b3a74002e421dd..92212f1b5befe0f3b8c5222e81221a8a
#include <wpe/WebKitContextMenuItem.h> #include <wpe/WebKitContextMenuItem.h>
diff --git a/Source/WebKit/UIProcess/BrowserInspectorController.cpp b/Source/WebKit/UIProcess/BrowserInspectorController.cpp diff --git a/Source/WebKit/UIProcess/BrowserInspectorController.cpp b/Source/WebKit/UIProcess/BrowserInspectorController.cpp
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..bf0041fe42a0c76d00e834c0d28e529d809f38ad index 0000000000000000000000000000000000000000..96e356efa5140b247cd0ee929468f75835645b39
--- /dev/null --- /dev/null
+++ b/Source/WebKit/UIProcess/BrowserInspectorController.cpp +++ b/Source/WebKit/UIProcess/BrowserInspectorController.cpp
@@ -0,0 +1,220 @@ @@ -0,0 +1,231 @@
+/* +/*
+ * Copyright (C) 2019 Microsoft Corporation. + * Copyright (C) 2019 Microsoft Corporation.
+ * + *
@ -5729,6 +5768,8 @@ index 0000000000000000000000000000000000000000..bf0041fe42a0c76d00e834c0d28e529d
+ m_page.inspectorController().dispatchMessageFromFrontend(message); + m_page.inspectorController().dispatchMessageFromFrontend(message);
+ } + }
+ +
+ WebPageProxy& page() { return m_page; }
+
+ void disconnect() + void disconnect()
+ { + {
+ m_page.inspectorController().disconnectFrontend(*this); + m_page.inspectorController().disconnectFrontend(*this);
@ -5765,7 +5806,8 @@ index 0000000000000000000000000000000000000000..bf0041fe42a0c76d00e834c0d28e529d
+ , m_backendDispatcher(BackendDispatcher::create(m_frontendRouter.copyRef())) + , m_backendDispatcher(BackendDispatcher::create(m_frontendRouter.copyRef()))
+ , m_browserAgentClient(std::move(client)) + , m_browserAgentClient(std::move(client))
+{ +{
+ auto browserAgent = makeUnique<InspectorBrowserAgent>(m_frontendRouter, m_backendDispatcher, m_browserAgentClient.get()); + PageProxyIDMap* map = this;
+ auto browserAgent = makeUnique<InspectorBrowserAgent>(m_frontendRouter, m_backendDispatcher, m_browserAgentClient.get(), *map);
+ m_browserAgent = browserAgent.get(); + m_browserAgent = browserAgent.get();
+ m_agents.append(WTFMove(browserAgent)); + m_agents.append(WTFMove(browserAgent));
+} +}
@ -5869,15 +5911,23 @@ index 0000000000000000000000000000000000000000..bf0041fe42a0c76d00e834c0d28e529d
+ m_pageProxyChannels.remove(it); + m_pageProxyChannels.remove(it);
+} +}
+ +
+WebPageProxy* BrowserInspectorController::findPageProxy(const String& pageProxyID)
+{
+ if (auto* pageProxyChannel = m_pageProxyChannels.get(pageProxyID))
+ return &pageProxyChannel->page();
+
+ return nullptr;
+}
+
+} // namespace WebKit +} // namespace WebKit
+ +
+#endif // ENABLE(REMOTE_INSPECTOR) +#endif // ENABLE(REMOTE_INSPECTOR)
diff --git a/Source/WebKit/UIProcess/BrowserInspectorController.h b/Source/WebKit/UIProcess/BrowserInspectorController.h diff --git a/Source/WebKit/UIProcess/BrowserInspectorController.h b/Source/WebKit/UIProcess/BrowserInspectorController.h
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..24335436b5c0f37e06eeecc87af24e5e4090a494 index 0000000000000000000000000000000000000000..f5df3e0d216a73d776030536a06a0113a153c323
--- /dev/null --- /dev/null
+++ b/Source/WebKit/UIProcess/BrowserInspectorController.h +++ b/Source/WebKit/UIProcess/BrowserInspectorController.h
@@ -0,0 +1,80 @@ @@ -0,0 +1,84 @@
+/* +/*
+ * Copyright (C) 2019 Microsoft Corporation. + * Copyright (C) 2019 Microsoft Corporation.
+ * + *
@ -5907,6 +5957,7 @@ index 0000000000000000000000000000000000000000..24335436b5c0f37e06eeecc87af24e5e
+ +
+#if ENABLE(REMOTE_INSPECTOR) +#if ENABLE(REMOTE_INSPECTOR)
+ +
+#include "InspectorBrowserAgent.h"
+#include "WebPageInspectorController.h" +#include "WebPageInspectorController.h"
+#include <JavaScriptCore/InspectorAgentRegistry.h> +#include <JavaScriptCore/InspectorAgentRegistry.h>
+#include <wtf/Forward.h> +#include <wtf/Forward.h>
@ -5923,7 +5974,7 @@ index 0000000000000000000000000000000000000000..24335436b5c0f37e06eeecc87af24e5e
+class InspectorBrowserAgent; +class InspectorBrowserAgent;
+class InspectorBrowserAgentClient; +class InspectorBrowserAgentClient;
+ +
+class BrowserInspectorController : private WebPageInspectorControllerObserver { +class BrowserInspectorController : private WebPageInspectorControllerObserver, private PageProxyIDMap {
+ WTF_MAKE_NONCOPYABLE(BrowserInspectorController); + WTF_MAKE_NONCOPYABLE(BrowserInspectorController);
+ WTF_MAKE_FAST_ALLOCATED; + WTF_MAKE_FAST_ALLOCATED;
+public: +public:
@ -5942,6 +5993,9 @@ index 0000000000000000000000000000000000000000..24335436b5c0f37e06eeecc87af24e5e
+ void didCreateInspectorController(WebPageProxy&) override; + void didCreateInspectorController(WebPageProxy&) override;
+ void willDestroyInspectorController(WebPageProxy&) override; + void willDestroyInspectorController(WebPageProxy&) override;
+ +
+ // PageProxyIDMap
+ WebPageProxy* findPageProxy(const String& pageProxyID) override;
+
+ void connectToAllPages(); + void connectToAllPages();
+ void disconnectFromAllPages(); + void disconnectFromAllPages();
+ void connectToPage(WebPageProxy&); + void connectToPage(WebPageProxy&);
@ -6251,10 +6305,10 @@ index 4896c404bc8b25d69360de7d1c509383282b2317..14bdebf732e929ea367c961f9d0bec85
static constexpr Seconds didUpdateBackingStoreStateTimeout() { return Seconds::fromMilliseconds(500); } static constexpr Seconds didUpdateBackingStoreStateTimeout() { return Seconds::fromMilliseconds(500); }
diff --git a/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp b/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp diff --git a/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp b/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..cf7832855e823cea9b3773e47e88499dc7727d1d index 0000000000000000000000000000000000000000..1010d47e14d15cd62053f3f861d8e2e0b2fd4fbe
--- /dev/null --- /dev/null
+++ b/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp +++ b/Source/WebKit/UIProcess/InspectorBrowserAgent.cpp
@@ -0,0 +1,388 @@ @@ -0,0 +1,475 @@
+/* +/*
+ * Copyright (C) 2019 Microsoft Corporation. + * Copyright (C) 2019 Microsoft Corporation.
+ * + *
@ -6292,12 +6346,18 @@ index 0000000000000000000000000000000000000000..cf7832855e823cea9b3773e47e88499d
+#include "NetworkProcessProxy.h" +#include "NetworkProcessProxy.h"
+#include "WebGeolocationManagerProxy.h" +#include "WebGeolocationManagerProxy.h"
+#include "WebGeolocationPosition.h" +#include "WebGeolocationPosition.h"
+#include "WebPageInspectorController.h"
+#include "WebPageInspectorTarget.h" +#include "WebPageInspectorTarget.h"
+#include "WebPageProxy.h" +#include "WebPageProxy.h"
+#include "WebProcessPool.h" +#include "WebProcessPool.h"
+#include "WebProcessProxy.h"
+#include <WebCore/FrameIdentifier.h>
+#include <WebCore/GeolocationPositionData.h> +#include <WebCore/GeolocationPositionData.h>
+#include <WebCore/ProcessIdentifier.h>
+#include <WebCore/ResourceRequest.h>
+#include <JavaScriptCore/InspectorFrontendRouter.h> +#include <JavaScriptCore/InspectorFrontendRouter.h>
+#include <pal/SessionID.h> +#include <pal/SessionID.h>
+#include <stdlib.h>
+#include <wtf/HashMap.h> +#include <wtf/HashMap.h>
+#include <wtf/HexNumber.h> +#include <wtf/HexNumber.h>
+ +
@ -6350,11 +6410,12 @@ index 0000000000000000000000000000000000000000..cf7832855e823cea9b3773e47e88499d
+ +
+} // namespace +} // namespace
+ +
+InspectorBrowserAgent::InspectorBrowserAgent(Inspector::FrontendRouter& frontendRouter, Inspector::BackendDispatcher& backendDispatcher, InspectorBrowserAgentClient* client) +InspectorBrowserAgent::InspectorBrowserAgent(Inspector::FrontendRouter& frontendRouter, Inspector::BackendDispatcher& backendDispatcher, InspectorBrowserAgentClient* client, PageProxyIDMap& pageProxyIDMap)
+ : InspectorAgentBase("Browser"_s) + : InspectorAgentBase("Browser"_s)
+ , m_frontendDispatcher(makeUnique<BrowserFrontendDispatcher>(frontendRouter)) + , m_frontendDispatcher(makeUnique<BrowserFrontendDispatcher>(frontendRouter))
+ , m_backendDispatcher(BrowserBackendDispatcher::create(backendDispatcher, this)) + , m_backendDispatcher(BrowserBackendDispatcher::create(backendDispatcher, this))
+ , m_client(client) + , m_client(client)
+ , m_pageProxyIDMap(pageProxyIDMap)
+{ +{
+} +}
+ +
@ -6436,6 +6497,86 @@ index 0000000000000000000000000000000000000000..cf7832855e823cea9b3773e47e88499d
+ *pageProxyID = toPageProxyIDProtocolString(*page); + *pageProxyID = toPageProxyIDProtocolString(*page);
+} +}
+ +
+WebFrameProxy* InspectorBrowserAgent::frameForID(const String& frameID, String& error)
+{
+ size_t dotPos = frameID.find(".");
+ if (dotPos == notFound) {
+ error = "Invalid frame id"_s;
+ return nullptr;
+ }
+
+ if (!frameID.isAllASCII()) {
+ error = "Invalid frame id"_s;
+ return nullptr;
+ }
+
+ String processIDString = frameID.left(dotPos);
+ uint64_t pid = strtoull(processIDString.ascii().data(), 0, 10);
+ auto processID = makeObjectIdentifier<WebCore::ProcessIdentifierType>(pid);
+ WebProcessProxy* process = WebProcessProxy::processForIdentifier(processID);
+ if (!process) {
+ error = "Cannot find web process for the frame id"_s;
+ return nullptr;
+ }
+
+ String frameIDString = frameID.substring(dotPos + 1);
+ uint64_t frameIDNumber = strtoull(frameIDString.ascii().data(), 0, 10);
+ auto frameIdentifier = WebCore::frameIdentifierFromID(frameIDNumber);
+ WebFrameProxy* frame = process->webFrame(frameIdentifier);
+ if (!frame) {
+ error = "Cannot find web frame for the frame id"_s;
+ return nullptr;
+ }
+
+ return frame;
+}
+
+void InspectorBrowserAgent::navigate(const String& url, const String& pageProxyID, const String* frameID, const String* referrer, Ref<NavigateCallback>&& callback)
+{
+ WebPageProxy* page = m_pageProxyIDMap.findPageProxy(pageProxyID);
+ if (!page) {
+ callback->sendFailure("Cannot find page proxy with provided 'pageProxyId'"_s);
+ return;
+ }
+
+ WebCore::ResourceRequest resourceRequest { url };
+
+ if (referrer)
+ resourceRequest.setHTTPReferrer(*referrer);
+
+ if (!resourceRequest.url().isValid()) {
+ callback->sendFailure("Cannot navigate to invalid URL"_s);
+ return;
+ }
+
+ WebFrameProxy* frame = nullptr;
+ if (frameID) {
+ String error;
+ frame = frameForID(*frameID, error);
+ if (!frame) {
+ callback->sendFailure(error);
+ return;
+ }
+
+ if (frame->page() != page) {
+ callback->sendFailure("Frame with specified is not from the specified page"_s);
+ return;
+ }
+ }
+
+ page->inspectorController().navigate(WTFMove(resourceRequest), frame, [callback = WTFMove(callback)](const String& error, uint64_t navigationID) {
+ if (!error.isEmpty()) {
+ callback->sendFailure(error);
+ return;
+ }
+
+ Optional<String> navigationIDString;
+ if (navigationID)
+ navigationIDString = String::number(navigationID);
+ callback->sendSuccess(navigationIDString);
+ });
+}
+
+void InspectorBrowserAgent::setIgnoreCertificateErrors(Inspector::ErrorString& errorString, const String* browserContextID, bool ignore) +void InspectorBrowserAgent::setIgnoreCertificateErrors(Inspector::ErrorString& errorString, const String* browserContextID, bool ignore)
+{ +{
+ BrowserContext browserContext = lookupBrowserContext(errorString, browserContextID); + BrowserContext browserContext = lookupBrowserContext(errorString, browserContextID);
@ -6645,10 +6786,10 @@ index 0000000000000000000000000000000000000000..cf7832855e823cea9b3773e47e88499d
+#endif // ENABLE(REMOTE_INSPECTOR) +#endif // ENABLE(REMOTE_INSPECTOR)
diff --git a/Source/WebKit/UIProcess/InspectorBrowserAgent.h b/Source/WebKit/UIProcess/InspectorBrowserAgent.h diff --git a/Source/WebKit/UIProcess/InspectorBrowserAgent.h b/Source/WebKit/UIProcess/InspectorBrowserAgent.h
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..52f5587b0d978ca54ce68697de0f8a354fed761a index 0000000000000000000000000000000000000000..ff40ea272b15fb07ed1539c2c5b84eaa4d383f7f
--- /dev/null --- /dev/null
+++ b/Source/WebKit/UIProcess/InspectorBrowserAgent.h +++ b/Source/WebKit/UIProcess/InspectorBrowserAgent.h
@@ -0,0 +1,99 @@ @@ -0,0 +1,112 @@
+/* +/*
+ * Copyright (C) 2019 Microsoft Corporation. + * Copyright (C) 2019 Microsoft Corporation.
+ * + *
@ -6700,13 +6841,22 @@ index 0000000000000000000000000000000000000000..52f5587b0d978ca54ce68697de0f8a35
+namespace WebKit { +namespace WebKit {
+ +
+class NetworkProcess; +class NetworkProcess;
+class WebFrameProxy;
+class WebProcessPool; +class WebProcessPool;
+ +
+class PageProxyIDMap {
+public:
+ virtual WebPageProxy* findPageProxy(const String& pageProxyID) = 0;
+
+protected:
+ virtual ~PageProxyIDMap() = default;
+};
+
+class InspectorBrowserAgent final : public Inspector::InspectorAgentBase, public Inspector::BrowserBackendDispatcherHandler { +class InspectorBrowserAgent final : public Inspector::InspectorAgentBase, public Inspector::BrowserBackendDispatcherHandler {
+ WTF_MAKE_NONCOPYABLE(InspectorBrowserAgent); + WTF_MAKE_NONCOPYABLE(InspectorBrowserAgent);
+ WTF_MAKE_FAST_ALLOCATED; + WTF_MAKE_FAST_ALLOCATED;
+public: +public:
+ InspectorBrowserAgent(Inspector::FrontendRouter&, Inspector::BackendDispatcher&, InspectorBrowserAgentClient*); + InspectorBrowserAgent(Inspector::FrontendRouter&, Inspector::BackendDispatcher&, InspectorBrowserAgentClient*, PageProxyIDMap&);
+ ~InspectorBrowserAgent() override; + ~InspectorBrowserAgent() override;
+ +
+ void didCreateWebPageProxy(const WebPageProxy&); + void didCreateWebPageProxy(const WebPageProxy&);
@ -6721,6 +6871,7 @@ index 0000000000000000000000000000000000000000..52f5587b0d978ca54ce68697de0f8a35
+ void createContext(Inspector::ErrorString&, String* browserContextID) override; + void createContext(Inspector::ErrorString&, String* browserContextID) override;
+ void deleteContext(Inspector::ErrorString&, const String& browserContextID) override; + void deleteContext(Inspector::ErrorString&, const String& browserContextID) override;
+ void createPage(Inspector::ErrorString&, const String* browserContextID, String* pageProxyID) override; + void createPage(Inspector::ErrorString&, const String* browserContextID, String* pageProxyID) override;
+ void navigate(const String& url, const String& pageProxyID, const String* frameId, const String* referrer, Ref<NavigateCallback>&&) override;
+ void setIgnoreCertificateErrors(Inspector::ErrorString&, const String* browserContextID, bool ignore) override; + void setIgnoreCertificateErrors(Inspector::ErrorString&, const String* browserContextID, bool ignore) override;
+ +
+ void getAllCookies(const String* browserContextID, Ref<GetAllCookiesCallback>&&) override; + void getAllCookies(const String* browserContextID, Ref<GetAllCookiesCallback>&&) override;
@ -6736,9 +6887,12 @@ index 0000000000000000000000000000000000000000..52f5587b0d978ca54ce68697de0f8a35
+ +
+private: +private:
+ BrowserContext lookupBrowserContext(Inspector::ErrorString&, const String* browserContextID); + BrowserContext lookupBrowserContext(Inspector::ErrorString&, const String* browserContextID);
+ WebFrameProxy* frameForID(const String& frameID, String& error);
+
+ std::unique_ptr<Inspector::BrowserFrontendDispatcher> m_frontendDispatcher; + std::unique_ptr<Inspector::BrowserFrontendDispatcher> m_frontendDispatcher;
+ Ref<Inspector::BrowserBackendDispatcher> m_backendDispatcher; + Ref<Inspector::BrowserBackendDispatcher> m_backendDispatcher;
+ InspectorBrowserAgentClient* m_client; + InspectorBrowserAgentClient* m_client;
+ PageProxyIDMap& m_pageProxyIDMap;
+ using Permissions = HashMap<String, HashSet<String>>; + using Permissions = HashMap<String, HashSet<String>>;
+ HashMap<String, Permissions> m_permissions; + HashMap<String, Permissions> m_permissions;
+ HashMap<String, BrowserContext> m_browserContexts; + HashMap<String, BrowserContext> m_browserContexts;
@ -7380,13 +7534,14 @@ index 846a5aa27dfab3d274cffa4873861f2587d17fd8..cf0dc99f5601636c48abff09cd47ace4
} }
diff --git a/Source/WebKit/UIProcess/WebPageInspectorController.cpp b/Source/WebKit/UIProcess/WebPageInspectorController.cpp diff --git a/Source/WebKit/UIProcess/WebPageInspectorController.cpp b/Source/WebKit/UIProcess/WebPageInspectorController.cpp
index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf995052e00383 100644 index 1ee28bf716374371433215148aa20a51927a8a33..d1f8ee1cba075a5d2cda6a9171b4193217b93b04 100644
--- a/Source/WebKit/UIProcess/WebPageInspectorController.cpp --- a/Source/WebKit/UIProcess/WebPageInspectorController.cpp
+++ b/Source/WebKit/UIProcess/WebPageInspectorController.cpp +++ b/Source/WebKit/UIProcess/WebPageInspectorController.cpp
@@ -26,10 +26,15 @@ @@ -26,10 +26,16 @@
#include "config.h" #include "config.h"
#include "WebPageInspectorController.h" #include "WebPageInspectorController.h"
+#include "APINavigation.h"
+#include "InspectorDialogAgent.h" +#include "InspectorDialogAgent.h"
+#include "InspectorBrowserAgent.h" +#include "InspectorBrowserAgent.h"
#include "ProvisionalPageProxy.h" #include "ProvisionalPageProxy.h"
@ -7399,7 +7554,7 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
#include <JavaScriptCore/InspectorAgentBase.h> #include <JavaScriptCore/InspectorAgentBase.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h> #include <JavaScriptCore/InspectorBackendDispatcher.h>
#include <JavaScriptCore/InspectorBackendDispatchers.h> #include <JavaScriptCore/InspectorBackendDispatchers.h>
@@ -46,29 +51,94 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage) @@ -46,29 +52,94 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage)
return WebPageInspectorTarget::toTargetID(provisionalPage.webPageID()); return WebPageInspectorTarget::toTargetID(provisionalPage.webPageID());
} }
@ -7498,7 +7653,7 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
} }
bool WebPageInspectorController::hasLocalFrontend() const bool WebPageInspectorController::hasLocalFrontend() const
@@ -80,6 +150,9 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro @@ -80,6 +151,9 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro
{ {
bool connectingFirstFrontend = !m_frontendRouter->hasFrontends(); bool connectingFirstFrontend = !m_frontendRouter->hasFrontends();
@ -7508,7 +7663,28 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
m_frontendRouter->connectFrontend(frontendChannel); m_frontendRouter->connectFrontend(frontendChannel);
if (connectingFirstFrontend) if (connectingFirstFrontend)
@@ -134,6 +207,11 @@ void WebPageInspectorController::dispatchMessageFromFrontend(const String& messa @@ -98,8 +172,10 @@ void WebPageInspectorController::disconnectFrontend(FrontendChannel& frontendCha
m_frontendRouter->disconnectFrontend(frontendChannel);
bool disconnectingLastFrontend = !m_frontendRouter->hasFrontends();
- if (disconnectingLastFrontend)
+ if (disconnectingLastFrontend) {
m_agents.willDestroyFrontendAndBackend(DisconnectReason::InspectorDestroyed);
+ m_pendingNavigations.clear();
+ }
m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());
@@ -122,6 +198,8 @@ void WebPageInspectorController::disconnectAllFrontends()
// Disconnect any remaining remote frontends.
m_frontendRouter->disconnectAllFrontends();
+ m_pendingNavigations.clear();
+
m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());
#if ENABLE(REMOTE_INSPECTOR)
@@ -134,6 +212,11 @@ void WebPageInspectorController::dispatchMessageFromFrontend(const String& messa
m_backendDispatcher->dispatch(message); m_backendDispatcher->dispatch(message);
} }
@ -7520,7 +7696,57 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
#if ENABLE(REMOTE_INSPECTOR) #if ENABLE(REMOTE_INSPECTOR)
void WebPageInspectorController::setIndicating(bool indicating) void WebPageInspectorController::setIndicating(bool indicating)
{ {
@@ -186,7 +264,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag @@ -148,6 +231,49 @@ void WebPageInspectorController::setIndicating(bool indicating)
}
#endif
+void WebPageInspectorController::navigate(WebCore::ResourceRequest&& request, WebFrameProxy* frame, NavigationHandler&& completionHandler)
+{
+ auto navigation = m_page.loadRequestForInspector(WTFMove(request), frame);
+ if (!navigation) {
+ completionHandler("Failed to navigate"_s, 0);
+ return;
+ }
+
+ m_pendingNavigations.set(navigation->navigationID(), WTFMove(completionHandler));
+}
+
+void WebPageInspectorController::didReceivePolicyDecision(WebCore::PolicyAction action, uint64_t navigationID)
+{
+ if (!m_frontendRouter->hasFrontends())
+ return;
+
+ if (!navigationID)
+ return;
+
+ auto completionHandler = m_pendingNavigations.take(navigationID);
+ if (!completionHandler)
+ return;
+
+ if (action == WebCore::PolicyAction::Ignore)
+ completionHandler("Navigation cancelled"_s, 0);
+ else
+ completionHandler(String(), navigationID);
+}
+
+void WebPageInspectorController::didDestroyNavigation(uint64_t navigationID)
+{
+ if (!m_frontendRouter->hasFrontends())
+ return;
+
+ auto completionHandler = m_pendingNavigations.take(navigationID);
+ if (!completionHandler)
+ return;
+
+ // Inspector initiated navigation is destroyed before policy check only when it
+ // becomes a fragment navigation (which always reuses current navigation).
+ completionHandler(String(), 0);
+}
+
void WebPageInspectorController::createInspectorTarget(const String& targetId, Inspector::InspectorTargetType type)
{
addTarget(InspectorTargetProxy::create(m_page, targetId, type));
@@ -186,7 +312,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag
void WebPageInspectorController::didCreateProvisionalPage(ProvisionalPageProxy& provisionalPage) void WebPageInspectorController::didCreateProvisionalPage(ProvisionalPageProxy& provisionalPage)
{ {
@ -7529,7 +7755,7 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
} }
void WebPageInspectorController::willDestroyProvisionalPage(const ProvisionalPageProxy& provisionalPage) void WebPageInspectorController::willDestroyProvisionalPage(const ProvisionalPageProxy& provisionalPage)
@@ -218,4 +296,16 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy> @@ -218,4 +344,16 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy>
m_targets.set(target->identifier(), WTFMove(target)); m_targets.set(target->identifier(), WTFMove(target));
} }
@ -7547,7 +7773,7 @@ index 1ee28bf716374371433215148aa20a51927a8a33..da2cd76c2b3b13e1f7bcb7e22dbf9950
+ +
} // namespace WebKit } // namespace WebKit
diff --git a/Source/WebKit/UIProcess/WebPageInspectorController.h b/Source/WebKit/UIProcess/WebPageInspectorController.h diff --git a/Source/WebKit/UIProcess/WebPageInspectorController.h b/Source/WebKit/UIProcess/WebPageInspectorController.h
index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e90280893b02a2a 100644 index 78caedf0c0ce83675569502d150fcc44e5f9868c..59403ed2f9acb7b9a1a3cab05378ff96b3465a55 100644
--- a/Source/WebKit/UIProcess/WebPageInspectorController.h --- a/Source/WebKit/UIProcess/WebPageInspectorController.h
+++ b/Source/WebKit/UIProcess/WebPageInspectorController.h +++ b/Source/WebKit/UIProcess/WebPageInspectorController.h
@@ -26,6 +26,7 @@ @@ -26,6 +26,7 @@
@ -7558,15 +7784,21 @@ index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e902808
#include <JavaScriptCore/InspectorAgentRegistry.h> #include <JavaScriptCore/InspectorAgentRegistry.h>
#include <JavaScriptCore/InspectorTargetAgent.h> #include <JavaScriptCore/InspectorTargetAgent.h>
#include <WebCore/PageIdentifier.h> #include <WebCore/PageIdentifier.h>
@@ -37,10 +38,22 @@ namespace Inspector { @@ -37,10 +38,28 @@ namespace Inspector {
class BackendDispatcher; class BackendDispatcher;
class FrontendChannel; class FrontendChannel;
class FrontendRouter; class FrontendRouter;
+class InspectorTarget; +class InspectorTarget;
+}
+
+namespace WebCore {
+class ResourceRequest;
+enum class PolicyAction : uint8_t;
} }
namespace WebKit { namespace WebKit {
+class WebFrameProxy;
+class WebPageInspectorInputAgent; +class WebPageInspectorInputAgent;
+ +
+class WebPageInspectorControllerObserver { +class WebPageInspectorControllerObserver {
@ -7581,7 +7813,7 @@ index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e902808
class WebPageInspectorController { class WebPageInspectorController {
WTF_MAKE_NONCOPYABLE(WebPageInspectorController); WTF_MAKE_NONCOPYABLE(WebPageInspectorController);
WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_FAST_ALLOCATED;
@@ -48,7 +61,15 @@ public: @@ -48,7 +67,15 @@ public:
WebPageInspectorController(WebPageProxy&); WebPageInspectorController(WebPageProxy&);
void init(); void init();
@ -7597,7 +7829,7 @@ index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e902808
bool hasLocalFrontend() const; bool hasLocalFrontend() const;
@@ -57,6 +78,7 @@ public: @@ -57,11 +84,17 @@ public:
void disconnectAllFrontends(); void disconnectAllFrontends();
void dispatchMessageFromFrontend(const String& message); void dispatchMessageFromFrontend(const String& message);
@ -7605,7 +7837,17 @@ index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e902808
#if ENABLE(REMOTE_INSPECTOR) #if ENABLE(REMOTE_INSPECTOR)
void setIndicating(bool); void setIndicating(bool);
@@ -75,13 +97,17 @@ public: #endif
+ using NavigationHandler = CompletionHandler<void(const String&, uint64_t)>;
+ void navigate(WebCore::ResourceRequest&&, WebFrameProxy*, NavigationHandler&&);
+ void didReceivePolicyDecision(WebCore::PolicyAction action, uint64_t navigationID);
+ void didDestroyNavigation(uint64_t navigationID);
+
void createInspectorTarget(const String& targetId, Inspector::InspectorTargetType);
void destroyInspectorTarget(const String& targetId);
void sendMessageToInspectorFrontend(const String& targetId, const String& message);
@@ -75,13 +108,18 @@ public:
private: private:
void addTarget(std::unique_ptr<InspectorTargetProxy>&&); void addTarget(std::unique_ptr<InspectorTargetProxy>&&);
@ -7619,6 +7861,7 @@ index 78caedf0c0ce83675569502d150fcc44e5f9868c..02b057160948455c3c78efb18e902808
+ Inspector::InspectorTargetAgent* m_targetAgent { nullptr }; + Inspector::InspectorTargetAgent* m_targetAgent { nullptr };
+ WebPageInspectorInputAgent* m_inputAgent { nullptr }; + WebPageInspectorInputAgent* m_inputAgent { nullptr };
HashMap<String, std::unique_ptr<InspectorTargetProxy>> m_targets; HashMap<String, std::unique_ptr<InspectorTargetProxy>> m_targets;
+ HashMap<uint64_t, NavigationHandler> m_pendingNavigations;
+ +
+ static WebPageInspectorControllerObserver* s_observer; + static WebPageInspectorControllerObserver* s_observer;
}; };
@ -8138,7 +8381,7 @@ index 0000000000000000000000000000000000000000..76290475097e756e3d932d22be4d8c79
+ +
+} // namespace WebKit +} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp
index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279ea0e9f093 100644 index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..264c58287d665720bc273b550d5f9b38b368c7f1 100644
--- a/Source/WebKit/UIProcess/WebPageProxy.cpp --- a/Source/WebKit/UIProcess/WebPageProxy.cpp
+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit/UIProcess/WebPageProxy.cpp
@@ -889,6 +889,7 @@ void WebPageProxy::finishAttachingToWebProcess(ProcessLaunchReason reason) @@ -889,6 +889,7 @@ void WebPageProxy::finishAttachingToWebProcess(ProcessLaunchReason reason)
@ -8149,7 +8392,29 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
} }
void WebPageProxy::didAttachToRunningProcess() void WebPageProxy::didAttachToRunningProcess()
@@ -1660,6 +1661,14 @@ void WebPageProxy::setControlledByAutomation(bool controlled) @@ -1224,6 +1225,21 @@ WebProcessProxy& WebPageProxy::ensureRunningProcess()
return m_process;
}
+RefPtr<API::Navigation> WebPageProxy::loadRequestForInspector(WebCore::ResourceRequest&& request, WebFrameProxy* frame)
+{
+ if (!frame || frame == mainFrame())
+ return loadRequest(WTFMove(request), WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow);
+
+ auto navigation = m_navigationState->createLoadRequestNavigation(ResourceRequest(request), m_backForwardList->currentItem());
+ LoadParameters loadParameters;
+ loadParameters.navigationID = navigation->navigationID();
+ loadParameters.request = WTFMove(request);
+ loadParameters.shouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow;
+ loadParameters.shouldTreatAsContinuingLoad = false;
+ m_process->send(Messages::WebPage::LoadRequestInFrameForInspector(loadParameters, frame->frameID()), m_webPageID);
+ return navigation;
+}
+
RefPtr<API::Navigation> WebPageProxy::loadRequest(ResourceRequest&& request, ShouldOpenExternalURLsPolicy shouldOpenExternalURLsPolicy, API::Object* userData)
{
if (m_isClosed)
@@ -1660,6 +1676,14 @@ void WebPageProxy::setControlledByAutomation(bool controlled)
m_process->processPool().sendToNetworkingProcess(Messages::NetworkProcess::SetSessionIsControlledByAutomation(m_websiteDataStore->sessionID(), m_controlledByAutomation)); m_process->processPool().sendToNetworkingProcess(Messages::NetworkProcess::SetSessionIsControlledByAutomation(m_websiteDataStore->sessionID(), m_controlledByAutomation));
} }
@ -8164,7 +8429,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
void WebPageProxy::createInspectorTarget(const String& targetId, Inspector::InspectorTargetType type) void WebPageProxy::createInspectorTarget(const String& targetId, Inspector::InspectorTargetType type)
{ {
m_inspectorController->createInspectorTarget(targetId, type); m_inspectorController->createInspectorTarget(targetId, type);
@@ -2716,7 +2725,7 @@ static TrackingType mergeTrackingTypes(TrackingType a, TrackingType b) @@ -2716,7 +2740,7 @@ static TrackingType mergeTrackingTypes(TrackingType a, TrackingType b)
void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent) void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent)
{ {
@ -8173,7 +8438,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
const EventNames& names = eventNames(); const EventNames& names = eventNames();
for (auto& touchPoint : touchStartEvent.touchPoints()) { for (auto& touchPoint : touchStartEvent.touchPoints()) {
IntPoint location = touchPoint.location(); IntPoint location = touchPoint.location();
@@ -2749,7 +2758,7 @@ void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent @@ -2749,7 +2773,7 @@ void WebPageProxy::updateTouchEventTracking(const WebTouchEvent& touchStartEvent
m_touchAndPointerEventTracking.touchStartTracking = TrackingType::Synchronous; m_touchAndPointerEventTracking.touchStartTracking = TrackingType::Synchronous;
m_touchAndPointerEventTracking.touchMoveTracking = TrackingType::Synchronous; m_touchAndPointerEventTracking.touchMoveTracking = TrackingType::Synchronous;
m_touchAndPointerEventTracking.touchEndTracking = TrackingType::Synchronous; m_touchAndPointerEventTracking.touchEndTracking = TrackingType::Synchronous;
@ -8182,7 +8447,23 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
} }
TrackingType WebPageProxy::touchEventTrackingType(const WebTouchEvent& touchStartEvent) const TrackingType WebPageProxy::touchEventTrackingType(const WebTouchEvent& touchStartEvent) const
@@ -5404,6 +5413,8 @@ void WebPageProxy::runJavaScriptAlert(FrameIdentifier frameID, SecurityOriginDat @@ -3082,6 +3106,7 @@ void WebPageProxy::receivedNavigationPolicyDecision(PolicyAction policyAction, A
void WebPageProxy::receivedPolicyDecision(PolicyAction action, API::Navigation* navigation, Optional<WebsitePoliciesData>&& websitePolicies, Ref<PolicyDecisionSender>&& sender, WillContinueLoadInNewProcess willContinueLoadInNewProcess)
{
+ m_inspectorController->didReceivePolicyDecision(action, navigation ? navigation->navigationID() : 0);
if (!hasRunningProcess()) {
sender->send(PolicyAction::Ignore, 0, DownloadID(), WTF::nullopt);
return;
@@ -4175,6 +4200,7 @@ void WebPageProxy::didDestroyNavigation(uint64_t navigationID)
// FIXME: Message check the navigationID.
m_navigationState->didDestroyNavigation(navigationID);
+ m_inspectorController->didDestroyNavigation(navigationID);
}
void WebPageProxy::didStartProvisionalLoadForFrame(FrameIdentifier frameID, uint64_t navigationID, URL&& url, URL&& unreachableURL, const UserData& userData)
@@ -5404,6 +5430,8 @@ void WebPageProxy::runJavaScriptAlert(FrameIdentifier frameID, SecurityOriginDat
if (auto* automationSession = process().processPool().automationSession()) if (auto* automationSession = process().processPool().automationSession())
automationSession->willShowJavaScriptDialog(*this); automationSession->willShowJavaScriptDialog(*this);
} }
@ -8191,7 +8472,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
m_uiClient->runJavaScriptAlert(*this, message, frame, WTFMove(securityOrigin), WTFMove(reply)); m_uiClient->runJavaScriptAlert(*this, message, frame, WTFMove(securityOrigin), WTFMove(reply));
} }
@@ -5423,6 +5434,8 @@ void WebPageProxy::runJavaScriptConfirm(FrameIdentifier frameID, SecurityOriginD @@ -5423,6 +5451,8 @@ void WebPageProxy::runJavaScriptConfirm(FrameIdentifier frameID, SecurityOriginD
if (auto* automationSession = process().processPool().automationSession()) if (auto* automationSession = process().processPool().automationSession())
automationSession->willShowJavaScriptDialog(*this); automationSession->willShowJavaScriptDialog(*this);
} }
@ -8200,7 +8481,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
m_uiClient->runJavaScriptConfirm(*this, message, frame, WTFMove(securityOrigin), WTFMove(reply)); m_uiClient->runJavaScriptConfirm(*this, message, frame, WTFMove(securityOrigin), WTFMove(reply));
} }
@@ -5442,6 +5455,8 @@ void WebPageProxy::runJavaScriptPrompt(FrameIdentifier frameID, SecurityOriginDa @@ -5442,6 +5472,8 @@ void WebPageProxy::runJavaScriptPrompt(FrameIdentifier frameID, SecurityOriginDa
if (auto* automationSession = process().processPool().automationSession()) if (auto* automationSession = process().processPool().automationSession())
automationSession->willShowJavaScriptDialog(*this); automationSession->willShowJavaScriptDialog(*this);
} }
@ -8209,7 +8490,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
m_uiClient->runJavaScriptPrompt(*this, message, defaultValue, frame, WTFMove(securityOrigin), WTFMove(reply)); m_uiClient->runJavaScriptPrompt(*this, message, defaultValue, frame, WTFMove(securityOrigin), WTFMove(reply));
} }
@@ -5601,6 +5616,8 @@ void WebPageProxy::runBeforeUnloadConfirmPanel(FrameIdentifier frameID, Security @@ -5601,6 +5633,8 @@ void WebPageProxy::runBeforeUnloadConfirmPanel(FrameIdentifier frameID, Security
return; return;
} }
} }
@ -8218,7 +8499,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
// Since runBeforeUnloadConfirmPanel() can spin a nested run loop we need to turn off the responsiveness timer. // Since runBeforeUnloadConfirmPanel() can spin a nested run loop we need to turn off the responsiveness timer.
m_process->responsivenessTimer().stop(); m_process->responsivenessTimer().stop();
@@ -6625,6 +6642,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) @@ -6625,6 +6659,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
if (auto* automationSession = process().processPool().automationSession()) if (auto* automationSession = process().processPool().automationSession())
automationSession->mouseEventsFlushedForPage(*this); automationSession->mouseEventsFlushedForPage(*this);
pageClient().didFinishProcessingAllPendingMouseEvents(); pageClient().didFinishProcessingAllPendingMouseEvents();
@ -8226,7 +8507,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
} }
break; break;
@@ -6651,7 +6669,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) @@ -6651,7 +6686,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
case WebEvent::RawKeyDown: case WebEvent::RawKeyDown:
case WebEvent::Char: { case WebEvent::Char: {
LOG(KeyHandling, "WebPageProxy::didReceiveEvent: %s (queue empty %d)", webKeyboardEventTypeString(type), m_keyEventQueue.isEmpty()); LOG(KeyHandling, "WebPageProxy::didReceiveEvent: %s (queue empty %d)", webKeyboardEventTypeString(type), m_keyEventQueue.isEmpty());
@ -8234,7 +8515,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
MESSAGE_CHECK(m_process, !m_keyEventQueue.isEmpty()); MESSAGE_CHECK(m_process, !m_keyEventQueue.isEmpty());
NativeWebKeyboardEvent event = m_keyEventQueue.takeFirst(); NativeWebKeyboardEvent event = m_keyEventQueue.takeFirst();
@@ -6671,7 +6688,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) @@ -6671,7 +6705,6 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
// The call to doneWithKeyEvent may close this WebPage. // The call to doneWithKeyEvent may close this WebPage.
// Protect against this being destroyed. // Protect against this being destroyed.
Ref<WebPageProxy> protect(*this); Ref<WebPageProxy> protect(*this);
@ -8242,7 +8523,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
pageClient().doneWithKeyEvent(event, handled); pageClient().doneWithKeyEvent(event, handled);
if (!handled) if (!handled)
m_uiClient->didNotHandleKeyEvent(this, event); m_uiClient->didNotHandleKeyEvent(this, event);
@@ -6680,6 +6696,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled) @@ -6680,6 +6713,7 @@ void WebPageProxy::didReceiveEvent(uint32_t opaqueType, bool handled)
if (!canProcessMoreKeyEvents) { if (!canProcessMoreKeyEvents) {
if (auto* automationSession = process().processPool().automationSession()) if (auto* automationSession = process().processPool().automationSession())
automationSession->keyboardEventsFlushedForPage(*this); automationSession->keyboardEventsFlushedForPage(*this);
@ -8250,7 +8531,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
} }
break; break;
} }
@@ -7148,8 +7165,10 @@ static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason) @@ -7148,8 +7182,10 @@ static bool shouldReloadAfterProcessTermination(ProcessTerminationReason reason)
void WebPageProxy::dispatchProcessDidTerminate(ProcessTerminationReason reason) void WebPageProxy::dispatchProcessDidTerminate(ProcessTerminationReason reason)
{ {
RELEASE_LOG_IF_ALLOWED(Loading, "dispatchProcessDidTerminate: reason = %d", reason); RELEASE_LOG_IF_ALLOWED(Loading, "dispatchProcessDidTerminate: reason = %d", reason);
@ -8262,7 +8543,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
if (m_loaderClient) if (m_loaderClient)
handledByClient = reason != ProcessTerminationReason::RequestedByClient && m_loaderClient->processDidCrash(*this); handledByClient = reason != ProcessTerminationReason::RequestedByClient && m_loaderClient->processDidCrash(*this);
else else
@@ -7596,6 +7615,14 @@ void WebPageProxy::gamepadActivity(const Vector<GamepadData>& gamepadDatas, bool @@ -7596,6 +7632,14 @@ void WebPageProxy::gamepadActivity(const Vector<GamepadData>& gamepadDatas, bool
void WebPageProxy::didReceiveAuthenticationChallengeProxy(Ref<AuthenticationChallengeProxy>&& authenticationChallenge) void WebPageProxy::didReceiveAuthenticationChallengeProxy(Ref<AuthenticationChallengeProxy>&& authenticationChallenge)
{ {
@ -8277,7 +8558,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
m_navigationClient->didReceiveAuthenticationChallenge(*this, authenticationChallenge.get()); m_navigationClient->didReceiveAuthenticationChallenge(*this, authenticationChallenge.get());
} }
@@ -7657,7 +7684,8 @@ void WebPageProxy::requestGeolocationPermissionForFrame(uint64_t geolocationID, @@ -7657,7 +7701,8 @@ void WebPageProxy::requestGeolocationPermissionForFrame(uint64_t geolocationID,
MESSAGE_CHECK(m_process, frame); MESSAGE_CHECK(m_process, frame);
// FIXME: Geolocation should probably be using toString() as its string representation instead of databaseIdentifier(). // FIXME: Geolocation should probably be using toString() as its string representation instead of databaseIdentifier().
@ -8287,7 +8568,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
auto request = m_geolocationPermissionRequestManager.createRequest(geolocationID); auto request = m_geolocationPermissionRequestManager.createRequest(geolocationID);
Function<void(bool)> completionHandler = [request = WTFMove(request)](bool allowed) { Function<void(bool)> completionHandler = [request = WTFMove(request)](bool allowed) {
if (allowed) if (allowed)
@@ -7665,6 +7693,11 @@ void WebPageProxy::requestGeolocationPermissionForFrame(uint64_t geolocationID, @@ -7665,6 +7710,11 @@ void WebPageProxy::requestGeolocationPermissionForFrame(uint64_t geolocationID,
else else
request->deny(); request->deny();
}; };
@ -8300,7 +8581,7 @@ index 4ff9dddf30a92ba6a0f7f324c0bf187077b2e8f0..7775168a12a7f4078555bc311e47279e
// FIXME: Once iOS migrates to the new WKUIDelegate SPI, clean this up // FIXME: Once iOS migrates to the new WKUIDelegate SPI, clean this up
// and make it one UIClient call that calls the completionHandler with false // and make it one UIClient call that calls the completionHandler with false
diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h
index 2c87b48e73c2fd361a2a0da8c8e766cd2c57e325..948ed5e74828f4c9ed4a5f90536489a515d0a952 100644 index 2c87b48e73c2fd361a2a0da8c8e766cd2c57e325..540724a733c77da5484c73e993cd73f77184a180 100644
--- a/Source/WebKit/UIProcess/WebPageProxy.h --- a/Source/WebKit/UIProcess/WebPageProxy.h
+++ b/Source/WebKit/UIProcess/WebPageProxy.h +++ b/Source/WebKit/UIProcess/WebPageProxy.h
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
@ -8330,7 +8611,15 @@ index 2c87b48e73c2fd361a2a0da8c8e766cd2c57e325..948ed5e74828f4c9ed4a5f90536489a5
void initializeWebPage(); void initializeWebPage();
void setDrawingArea(std::unique_ptr<DrawingAreaProxy>&&); void setDrawingArea(std::unique_ptr<DrawingAreaProxy>&&);
@@ -2248,6 +2254,7 @@ private: @@ -563,6 +569,7 @@ public:
void closePage();
void addPlatformLoadParameters(LoadParameters&);
+ RefPtr<API::Navigation> loadRequestForInspector(WebCore::ResourceRequest&&, WebFrameProxy*);
RefPtr<API::Navigation> loadRequest(WebCore::ResourceRequest&&, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldAllowExternalSchemes, API::Object* userData = nullptr);
RefPtr<API::Navigation> loadFile(const String& fileURL, const String& resourceDirectoryURL, API::Object* userData = nullptr);
RefPtr<API::Navigation> loadData(const IPC::DataReference&, const String& MIMEType, const String& encoding, const String& baseURL, API::Object* userData = nullptr, WebCore::ShouldOpenExternalURLsPolicy = WebCore::ShouldOpenExternalURLsPolicy::ShouldNotAllow);
@@ -2248,6 +2255,7 @@ private:
bool m_treatsSHA1CertificatesAsInsecure { true }; bool m_treatsSHA1CertificatesAsInsecure { true };
RefPtr<WebInspectorProxy> m_inspector; RefPtr<WebInspectorProxy> m_inspector;
@ -8338,7 +8627,7 @@ index 2c87b48e73c2fd361a2a0da8c8e766cd2c57e325..948ed5e74828f4c9ed4a5f90536489a5
#if ENABLE(FULLSCREEN_API) #if ENABLE(FULLSCREEN_API)
std::unique_ptr<WebFullScreenManagerProxy> m_fullScreenManager; std::unique_ptr<WebFullScreenManagerProxy> m_fullScreenManager;
@@ -2649,6 +2656,8 @@ private: @@ -2649,6 +2657,8 @@ private:
bool m_isLayerTreeFrozenDueToSwipeAnimation { false }; bool m_isLayerTreeFrozenDueToSwipeAnimation { false };
String m_overriddenMediaType; String m_overriddenMediaType;
@ -9846,24 +10135,68 @@ index fbdf254ec42dc736ca0a00f521de8339f08ffbf2..5bd0472c37cc18d5dd6680e833fab394
// If async scrolling is disabled, we have to force-disable async frame and overflow scrolling // If async scrolling is disabled, we have to force-disable async frame and overflow scrolling
// to keep the non-async scrolling on those elements working. // to keep the non-async scrolling on those elements working.
diff --git a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp
index b2d54a627b94583bda3518c4e7c3364481b605a4..62f1dc0b6075e867ddd19a216bdf0d374d326ff7 100644
--- a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp
+++ b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp
@@ -47,6 +47,14 @@ void WebDocumentLoader::detachFromFrame()
DocumentLoader::detachFromFrame();
}
+void WebDocumentLoader::replacedByFragmentNavigation(Frame& frame)
+{
+ ASSERT(!frame());
+ // Notify WebPageProxy that the navigation has been converted into same page navigation.
+ if (m_navigationID)
+ WebFrame::fromCoreFrame(frame)->documentLoaderDetached(m_navigationID);
+}
+
void WebDocumentLoader::setNavigationID(uint64_t navigationID)
{
ASSERT(navigationID);
diff --git a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h diff --git a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h
index f127d64d005ab7b93875591b94a5899205e91579..3d3080e188f57061726e4cd78f0e67a4096cd715 100644 index f127d64d005ab7b93875591b94a5899205e91579..df0de26e4dc449a0fbf93e7037444df4e5365822 100644
--- a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h --- a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h
+++ b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h +++ b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.h
@@ -43,6 +43,8 @@ public: @@ -43,7 +43,10 @@ public:
private: private:
WebDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&); WebDocumentLoader(const WebCore::ResourceRequest&, const WebCore::SubstituteData&);
+ uint64_t loaderIDForInspector() override { return navigationID(); } + uint64_t loaderIDForInspector() override { return navigationID(); }
+ +
void detachFromFrame() override; void detachFromFrame() override;
+ void replacedByFragmentNavigation(WebCore::Frame&) override;
uint64_t m_navigationID; uint64_t m_navigationID;
};
diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.cpp b/Source/WebKit/WebProcess/WebPage/WebPage.cpp diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.cpp b/Source/WebKit/WebProcess/WebPage/WebPage.cpp
index a360fe5674b3065197ffe9eaa5853f559b35be63..442d0493fa0705b187dc7c078ea564d222448606 100644 index a360fe5674b3065197ffe9eaa5853f559b35be63..bfce3df00812dc961c3f73bb42501f7b22195caf 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp --- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp
+++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp +++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp
@@ -1721,17 +1721,13 @@ void WebPage::setSize(const WebCore::IntSize& viewSize) @@ -1538,6 +1538,22 @@ void WebPage::platformDidReceiveLoadParameters(const LoadParameters& loadParamet
}
#endif
+void WebPage::loadRequestInFrameForInspector(LoadParameters&& loadParameters, WebCore::FrameIdentifier frameID)
+{
+ WebFrame* frame = WebProcess::singleton().webFrame(frameID);
+ if (!frame) {
+ send(Messages::WebPageProxy::DidDestroyNavigation(loadParameters.navigationID));
+ return;
+ }
+
+ // FIXME: use m_pendingNavigationID instead?
+ m_pendingFrameNavigationID = loadParameters.navigationID;
+
+ FrameLoadRequest frameLoadRequest { *frame->coreFrame(), loadParameters.request, ShouldOpenExternalURLsPolicy::ShouldNotAllow };
+ frame->coreFrame()->loader().load(WTFMove(frameLoadRequest));
+ ASSERT(!m_pendingFrameNavigationID);
+}
+
void WebPage::loadRequest(LoadParameters&& loadParameters)
{
SendStopResponsivenessTimer stopper;
@@ -1721,17 +1737,13 @@ void WebPage::setSize(const WebCore::IntSize& viewSize)
view->resize(viewSize); view->resize(viewSize);
m_drawingArea->setNeedsDisplay(); m_drawingArea->setNeedsDisplay();
@ -9882,7 +10215,7 @@ index a360fe5674b3065197ffe9eaa5853f559b35be63..442d0493fa0705b187dc7c078ea564d2
// Viewport properties have no impact on zero sized fixed viewports. // Viewport properties have no impact on zero sized fixed viewports.
if (m_viewSize.isEmpty()) if (m_viewSize.isEmpty())
@@ -1748,26 +1744,18 @@ void WebPage::sendViewportAttributesChanged(const ViewportArguments& viewportArg @@ -1748,26 +1760,18 @@ void WebPage::sendViewportAttributesChanged(const ViewportArguments& viewportArg
ViewportAttributes attr = computeViewportAttributes(viewportArguments, minimumLayoutFallbackWidth, deviceWidth, deviceHeight, 1, m_viewSize); ViewportAttributes attr = computeViewportAttributes(viewportArguments, minimumLayoutFallbackWidth, deviceWidth, deviceHeight, 1, m_viewSize);
@ -9912,7 +10245,7 @@ index a360fe5674b3065197ffe9eaa5853f559b35be63..442d0493fa0705b187dc7c078ea564d2
#if USE(COORDINATED_GRAPHICS) #if USE(COORDINATED_GRAPHICS)
m_drawingArea->didChangeViewportAttributes(WTFMove(attr)); m_drawingArea->didChangeViewportAttributes(WTFMove(attr));
@@ -1775,7 +1763,6 @@ void WebPage::sendViewportAttributesChanged(const ViewportArguments& viewportArg @@ -1775,7 +1779,6 @@ void WebPage::sendViewportAttributesChanged(const ViewportArguments& viewportArg
send(Messages::WebPageProxy::DidChangeViewportProperties(attr)); send(Messages::WebPageProxy::DidChangeViewportProperties(attr));
#endif #endif
} }
@ -9920,7 +10253,7 @@ index a360fe5674b3065197ffe9eaa5853f559b35be63..442d0493fa0705b187dc7c078ea564d2
void WebPage::scrollMainFrameIfNotAtMaxScrollPosition(const IntSize& scrollOffset) void WebPage::scrollMainFrameIfNotAtMaxScrollPosition(const IntSize& scrollOffset)
{ {
@@ -2157,17 +2144,13 @@ void WebPage::viewportPropertiesDidChange(const ViewportArguments& viewportArgum @@ -2157,17 +2160,13 @@ void WebPage::viewportPropertiesDidChange(const ViewportArguments& viewportArgum
viewportConfigurationChanged(); viewportConfigurationChanged();
#endif #endif
@ -9939,11 +10272,29 @@ index a360fe5674b3065197ffe9eaa5853f559b35be63..442d0493fa0705b187dc7c078ea564d2
} }
void WebPage::listenForLayoutMilestones(OptionSet<WebCore::LayoutMilestone> milestones) void WebPage::listenForLayoutMilestones(OptionSet<WebCore::LayoutMilestone> milestones)
@@ -6229,6 +6228,9 @@ Ref<DocumentLoader> WebPage::createDocumentLoader(Frame& frame, const ResourceRe
WebsitePoliciesData::applyToDocumentLoader(WTFMove(*m_pendingWebsitePolicies), documentLoader);
m_pendingWebsitePolicies = WTF::nullopt;
}
+ } else if (m_pendingFrameNavigationID) {
+ documentLoader->setNavigationID(m_pendingFrameNavigationID);
+ m_pendingFrameNavigationID = 0;
}
return documentLoader;
diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h
index b07cf17f1b22c7119f5cbddd1bae8c29cf9d9ad0..51fa89e597c2dc8fd9eaf07d6c40fa060ed16b1b 100644 index b07cf17f1b22c7119f5cbddd1bae8c29cf9d9ad0..624c6e71a5f834f1e6ea6c34e587e8315d8f23d3 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPage.h --- a/Source/WebKit/WebProcess/WebPage/WebPage.h
+++ b/Source/WebKit/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit/WebProcess/WebPage/WebPage.h
@@ -1491,9 +1491,7 @@ private: @@ -1344,6 +1344,7 @@ private:
// Actions
void tryClose(CompletionHandler<void(bool)>&&);
void platformDidReceiveLoadParameters(const LoadParameters&);
+ void loadRequestInFrameForInspector(LoadParameters&&, WebCore::FrameIdentifier);
void loadRequest(LoadParameters&&);
NO_RETURN void loadRequestWaitingForProcessLaunch(LoadParameters&&, URL&&, WebPageProxyIdentifier, bool);
void loadData(LoadParameters&&);
@@ -1491,9 +1492,7 @@ private:
void countStringMatches(const String&, uint32_t findOptions, uint32_t maxMatchCount); void countStringMatches(const String&, uint32_t findOptions, uint32_t maxMatchCount);
void replaceMatches(const Vector<uint32_t>& matchIndices, const String& replacementText, bool selectionOnly, CallbackID); void replaceMatches(const Vector<uint32_t>& matchIndices, const String& replacementText, bool selectionOnly, CallbackID);
@ -9953,6 +10304,26 @@ index b07cf17f1b22c7119f5cbddd1bae8c29cf9d9ad0..51fa89e597c2dc8fd9eaf07d6c40fa06
void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex); void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex);
void setTextForActivePopupMenu(int32_t index); void setTextForActivePopupMenu(int32_t index);
@@ -1949,6 +1948,7 @@ private:
UserActivity m_userActivity;
uint64_t m_pendingNavigationID { 0 };
+ uint64_t m_pendingFrameNavigationID { 0 };
Optional<WebsitePoliciesData> m_pendingWebsitePolicies;
bool m_mainFrameProgressCompleted { false };
diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
index 9bf21ec351c2bbb543f801fb854af0a8d118199d..b8c104b2f90107358f5958b1b990902cadf013a6 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
+++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
@@ -165,6 +165,7 @@ GenerateSyntheticEditingCommand(enum:uint8_t WebKit::SyntheticEditingCommandType
LoadURLInFrame(URL url, String referrer, WebCore::FrameIdentifier frameID)
LoadDataInFrame(IPC::DataReference data, String MIMEType, String encodingName, URL baseURL, WebCore::FrameIdentifier frameID)
LoadRequest(struct WebKit::LoadParameters loadParameters)
+ LoadRequestInFrameForInspector(struct WebKit::LoadParameters loadParameters, WebCore::FrameIdentifier frameID)
LoadRequestWaitingForProcessLaunch(struct WebKit::LoadParameters loadParameters, URL resourceDirectoryURL, WebKit::WebPageProxyIdentifier pageID, bool checkAssumedReadAccessToResourceURL)
LoadData(struct WebKit::LoadParameters loadParameters)
LoadAlternateHTML(struct WebKit::LoadParameters loadParameters)
diff --git a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp b/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp diff --git a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp b/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp
index a70f6fd52096a5dca901ea70a3755f14d6b4a0fd..f02e5c774a49d3e67860adb3b011531313eaf8d1 100644 index a70f6fd52096a5dca901ea70a3755f14d6b4a0fd..f02e5c774a49d3e67860adb3b011531313eaf8d1 100644
--- a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp --- a/Source/WebKit/WebProcess/WebPage/WebPageInspectorTarget.cpp