Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

browser(webkit): continue screecast after cross-process navigation #2499

Merged
merged 1 commit into from
Jun 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion browser_patches/webkit/BUILD_NUMBER
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1269
1270
144 changes: 79 additions & 65 deletions browser_patches/webkit/patches/bootstrap.diff
Original file line number Diff line number Diff line change
Expand Up @@ -8476,35 +8476,26 @@ index 6bbd1cabd27ae2847648a8c2edcf9acfcd556ff5..38d101b9a96986e40f6e9f0261fa429a
{
m_hasReceivedFirstUpdate = true;
diff --git a/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.h b/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.h
index d7695088e7cfc4f638f157338754f9f157489749..74a3654235d5e24a39d3714ec4d2f45a8803c816 100644
index d7695088e7cfc4f638f157338754f9f157489749..d7ed4f58f033ebfc13142f2d6e8814d6dd13dd8e 100644
--- a/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.h
+++ b/Source/WebKit/UIProcess/CoordinatedGraphics/DrawingAreaProxyCoordinatedGraphics.h
@@ -30,6 +30,8 @@
@@ -30,6 +30,7 @@
#include "BackingStore.h"
#include "DrawingAreaProxy.h"
#include "LayerTreeContext.h"
+#include <wtf/Function.h>
+#include <wtf/HashMap.h>
#include <wtf/RunLoop.h>

namespace WebCore {
@@ -49,6 +51,15 @@ public:
@@ -49,6 +50,7 @@ public:

bool isInAcceleratedCompositingMode() const { return !m_layerTreeContext.isEmpty(); }
const LayerTreeContext& layerTreeContext() const { return m_layerTreeContext; }
+ void waitForSizeUpdate(Function<void ()>&&);
+
+ using PaintCallback = Function<void(cairo_surface_t*, WebCore::IntSize)>;
+ void setPaintCallback(PaintCallback&& callback) { m_paintCallback = WTFMove(callback); }
+ void didPaint(cairo_surface_t* surface, WebCore::IntSize size)
+ {
+ if (m_paintCallback)
+ m_paintCallback(surface, size);
+ }

private:
// DrawingAreaProxy
@@ -126,12 +137,15 @@ private:
@@ -126,6 +128,8 @@ private:
// For a new Drawing Area don't draw anything until the WebProcess has sent over the first content.
bool m_hasReceivedFirstUpdate { false };

Expand All @@ -8513,13 +8504,6 @@ index d7695088e7cfc4f638f157338754f9f157489749..74a3654235d5e24a39d3714ec4d2f45a
#if !PLATFORM(WPE)
bool m_isBackingStoreDiscardable { true };
std::unique_ptr<BackingStore> m_backingStore;
RunLoop::Timer<DrawingAreaProxyCoordinatedGraphics> m_discardBackingStoreTimer;
#endif
std::unique_ptr<DrawingMonitor> m_drawingMonitor;
+ PaintCallback m_paintCallback;
};

} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp b/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp
index c5de4e7d0f59194f43a023b089e372c58cf8ee06..211f4c1baf5d1a66cd08ee8147e96f7ec6c0098a 100644
--- a/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp
Expand Down Expand Up @@ -8622,10 +8606,10 @@ index 59cdfdafab1d85ea3a5aecb3cd2293e6dfb1eb8d..52fe7990b1c18b964ee3cfa9f324e3c2
// The timeout we use when waiting for a DidUpdateGeometry message.
diff --git a/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..103febd9eed246c6cc1f21f7e5e4f5a56bb03ac5
index 0000000000000000000000000000000000000000..d796a81ab5dae0627fab017f77074d411c4da40a
--- /dev/null
+++ b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp
@@ -0,0 +1,257 @@
@@ -0,0 +1,255 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
Expand Down Expand Up @@ -8695,6 +8679,14 @@ index 0000000000000000000000000000000000000000..103febd9eed246c6cc1f21f7e5e4f5a5
+ stop(errorString);
+}
+
+#if USE(COORDINATED_GRAPHICS)
+void InspectorScreencastAgent::didPaint(cairo_surface_t* surface)
+{
+ if (m_encoder)
+ m_encoder->encodeFrame(surface, m_page.drawingArea()->size());
+}
+#endif
+
+void InspectorScreencastAgent::start(Inspector::ErrorString& errorString, const String& format, const int* quality)
+{
+ if (m_enabled)
Expand Down Expand Up @@ -8759,23 +8751,16 @@ index 0000000000000000000000000000000000000000..103febd9eed246c6cc1f21f7e5e4f5a5
+ errorString = "Already recording"_s;
+ return;
+ }
+
+ if (width < 10 || width > 10000 || height < 10 || height > 10000) {
+ errorString = "Invalid size"_s;
+ return;
+ }
+
+ if (auto* drawingArea = static_cast<DrawingAreaProxyCoordinatedGraphics*>(m_page.drawingArea())) {
+ m_encoder = ScreencastEncoder::create(errorString, file, IntSize(width, height));
+ if (!m_encoder)
+ return;
+
+ drawingArea->setPaintCallback([encoder = m_encoder.get()] (cairo_surface_t* surface, WebCore::IntSize size) {
+ encoder->encodeFrame(surface, size);
+ });
+ } else {
+ errorString = "Cannot get drawing area"_s;
+ m_encoder = ScreencastEncoder::create(errorString, file, IntSize(width, height));
+ if (!m_encoder)
+ return;
+ }
+
+#else
+ errorString = "Not implemented"_s;
+#endif
Expand All @@ -8789,9 +8774,6 @@ index 0000000000000000000000000000000000000000..103febd9eed246c6cc1f21f7e5e4f5a5
+ return;
+ }
+
+ if (auto* drawingArea = static_cast<DrawingAreaProxyCoordinatedGraphics*>(m_page.drawingArea()))
+ drawingArea->setPaintCallback(nullptr);
+
+ m_encoder->finish([protectRef = m_encoder.copyRef(), callback = WTFMove(callback)] {
+ callback->sendSuccess();
+ });
Expand Down Expand Up @@ -8885,10 +8867,10 @@ index 0000000000000000000000000000000000000000..103febd9eed246c6cc1f21f7e5e4f5a5
+} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.h b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.h
new file mode 100644
index 0000000000000000000000000000000000000000..2f96d82a650993bc0b0469453e7634d20771d797
index 0000000000000000000000000000000000000000..dbdb294ee1b4c04e1dec3f53bd229d2a89e7e767
--- /dev/null
+++ b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.h
@@ -0,0 +1,85 @@
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
Expand Down Expand Up @@ -8945,6 +8927,10 @@ index 0000000000000000000000000000000000000000..2f96d82a650993bc0b0469453e7634d2
+ void didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*) override;
+ void willDestroyFrontendAndBackend(Inspector::DisconnectReason) override;
+
+#if USE(COORDINATED_GRAPHICS)
+ void didPaint(cairo_surface_t*);
+#endif
+
+ void start(Inspector::ErrorString&, const String& format, const int* quality) override;
+ void stop(Inspector::ErrorString&) override;
+ void frameAck(Inspector::ErrorString&) override;
Expand Down Expand Up @@ -9556,7 +9542,7 @@ index a2239cec8e18850f35f7f88a9c4ebadc62bf4023..79f3ff84327dc075ec96983e04db4b10

} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e04094a77 100644
index 1861cff806131196ea49b4f8aca6665beebbf6e8..fc37922a680f2a46e2512975b558b839d75cff42 100644
--- a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
+++ b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
@@ -26,12 +26,20 @@
Expand All @@ -9580,7 +9566,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
#include <JavaScriptCore/InspectorAgentBase.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h>
#include <JavaScriptCore/InspectorBackendDispatchers.h>
@@ -48,27 +56,104 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage)
@@ -48,27 +56,106 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage)
return WebPageInspectorTarget::toTargetID(provisionalPage.webPageID());
}

Expand Down Expand Up @@ -9614,7 +9600,9 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
+ m_agents.append(WTFMove(inputAgent));
+ m_agents.append(makeUnique<InspectorDialogAgent>(m_backendDispatcher.get(), m_frontendRouter.get(), m_page));
+#if !PLATFORM(WPE) && !PLATFORM(WIN)
+ m_agents.append(makeUnique<InspectorScreencastAgent>(m_backendDispatcher.get(), m_frontendRouter.get(), m_page));
+ auto screencastAgent = makeUnique<InspectorScreencastAgent>(m_backendDispatcher.get(), m_frontendRouter.get(), m_page);
+ m_screecastAgent = screencastAgent.get();
+ m_agents.append(WTFMove(screencastAgent));
+#endif
+ if (s_observer)
+ s_observer->didCreateInspectorController(m_page);
Expand Down Expand Up @@ -9688,7 +9676,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
}

bool WebPageInspectorController::hasLocalFrontend() const
@@ -82,6 +167,17 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro
@@ -82,6 +169,17 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro

bool connectingFirstFrontend = !m_frontendRouter->hasFrontends();

Expand All @@ -9706,7 +9694,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
m_frontendRouter->connectFrontend(frontendChannel);

if (connectingFirstFrontend)
@@ -100,8 +196,10 @@ void WebPageInspectorController::disconnectFrontend(FrontendChannel& frontendCha
@@ -100,8 +198,10 @@ void WebPageInspectorController::disconnectFrontend(FrontendChannel& frontendCha
m_frontendRouter->disconnectFrontend(frontendChannel);

bool disconnectingLastFrontend = !m_frontendRouter->hasFrontends();
Expand All @@ -9718,7 +9706,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e

m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());

@@ -124,6 +222,8 @@ void WebPageInspectorController::disconnectAllFrontends()
@@ -124,6 +224,8 @@ void WebPageInspectorController::disconnectAllFrontends()
// Disconnect any remaining remote frontends.
m_frontendRouter->disconnectAllFrontends();

Expand All @@ -9727,10 +9715,21 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());

#if ENABLE(REMOTE_INSPECTOR)
@@ -150,6 +250,55 @@ void WebPageInspectorController::setIndicating(bool indicating)
@@ -150,6 +252,66 @@ void WebPageInspectorController::setIndicating(bool indicating)
}
#endif

+#if USE(COORDINATED_GRAPHICS)
+void WebPageInspectorController::didPaint(cairo_surface_t* surface)
+{
+ if (!m_frontendRouter->hasFrontends())
+ return;
+
+ m_screecastAgent->didPaint(surface);
+}
+#endif
+
+
+void WebPageInspectorController::navigate(WebCore::ResourceRequest&& request, WebFrameProxy* frame, NavigationHandler&& completionHandler)
+{
+ auto navigation = m_page.loadRequestForInspector(WTFMove(request), frame);
Expand Down Expand Up @@ -9783,7 +9782,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
void WebPageInspectorController::createInspectorTarget(const String& targetId, Inspector::InspectorTargetType type)
{
addTarget(InspectorTargetProxy::create(m_page, targetId, type));
@@ -169,6 +318,33 @@ void WebPageInspectorController::sendMessageToInspectorFrontend(const String& ta
@@ -169,6 +331,33 @@ void WebPageInspectorController::sendMessageToInspectorFrontend(const String& ta
m_targetAgent->sendMessageFromTargetToFrontend(targetId, message);
}

Expand Down Expand Up @@ -9817,7 +9816,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
bool WebPageInspectorController::shouldPauseLoading(const ProvisionalPageProxy& provisionalPage) const
{
if (!m_frontendRouter->hasFrontends())
@@ -188,7 +364,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag
@@ -188,7 +377,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag

void WebPageInspectorController::didCreateProvisionalPage(ProvisionalPageProxy& provisionalPage)
{
Expand All @@ -9826,7 +9825,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
}

void WebPageInspectorController::willDestroyProvisionalPage(const ProvisionalPageProxy& provisionalPage)
@@ -241,4 +417,20 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy>
@@ -241,4 +430,20 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy>
m_targets.set(target->identifier(), WTFMove(target));
}

Expand All @@ -9848,7 +9847,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e
+
} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.h b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.h
index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..bb4d6b26bf245aebc2bd0f435a7bb83151331961 100644
index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..ca95d658c1f260020624291aaf5d8ea4172e5b45 100644
--- a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.h
+++ b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.h
@@ -26,17 +26,27 @@
Expand Down Expand Up @@ -9879,10 +9878,11 @@ index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..bb4d6b26bf245aebc2bd0f435a7bb831
}

namespace WebKit {
@@ -44,6 +54,21 @@ namespace WebKit {
@@ -44,6 +54,22 @@ namespace WebKit {
class InspectorBrowserAgent;
struct WebPageAgentContext;

+class InspectorScreencastAgent;
+class WebFrameProxy;
+class WebPageInspectorEmulationAgent;
+class WebPageInspectorInputAgent;
Expand All @@ -9901,7 +9901,7 @@ index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..bb4d6b26bf245aebc2bd0f435a7bb831
class WebPageInspectorController {
WTF_MAKE_NONCOPYABLE(WebPageInspectorController);
WTF_MAKE_FAST_ALLOCATED;
@@ -51,7 +76,19 @@ public:
@@ -51,7 +77,19 @@ public:
WebPageInspectorController(WebPageProxy&);

void init();
Expand All @@ -9921,17 +9921,20 @@ index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..bb4d6b26bf245aebc2bd0f435a7bb831

bool hasLocalFrontend() const;

@@ -65,10 +102,22 @@ public:
@@ -64,11 +102,25 @@ public:
#if ENABLE(REMOTE_INSPECTOR)
void setIndicating(bool);
#endif

+#if USE(COORDINATED_GRAPHICS)
+ void didPaint(cairo_surface_t*);
+#endif
+ using NavigationHandler = Function<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 didFailProvisionalLoadForFrame(uint64_t navigationID, const WebCore::ResourceError& error);
+
void createInspectorTarget(const String& targetId, Inspector::InspectorTargetType);
void destroyInspectorTarget(const String& targetId);
void sendMessageToInspectorFrontend(const String& targetId, const String& message);
Expand All @@ -9944,20 +9947,21 @@ index 9ce5ef36b652fd56a843c1d12a4c3c3cf639282c..bb4d6b26bf245aebc2bd0f435a7bb831
bool shouldPauseLoading(const ProvisionalPageProxy&) const;
void setContinueLoadingCallback(const ProvisionalPageProxy&, WTF::Function<void()>&&);

@@ -84,6 +133,7 @@ private:
@@ -84,6 +136,7 @@ private:
void createLazyAgents();

void addTarget(std::unique_ptr<InspectorTargetProxy>&&);
+ void adjustPageSettings();

Ref<Inspector::FrontendRouter> m_frontendRouter;
Ref<Inspector::BackendDispatcher> m_backendDispatcher;
@@ -92,11 +142,16 @@ private:
@@ -92,11 +145,17 @@ private:
WebPageProxy& m_page;

Inspector::InspectorTargetAgent* m_targetAgent;
+ WebPageInspectorEmulationAgent* m_emulationAgent { nullptr };
+ WebPageInspectorInputAgent* m_inputAgent { nullptr };
+ InspectorScreencastAgent* m_screecastAgent { nullptr };
HashMap<String, std::unique_ptr<InspectorTargetProxy>> m_targets;

InspectorBrowserAgent* m_enabledInspectorBrowserAgent;
Expand Down Expand Up @@ -12702,24 +12706,27 @@ index 964c6315e38f5e0a0303febce45b1e975054f0b4..117d8c7c74bc81b34cfc0fe2b11a5429
UniqueRef<SOAuthorizationCoordinator> m_soAuthorizationCoordinator;
#endif
diff --git a/Source/WebKit/UIProcess/cairo/BackingStoreCairo.cpp b/Source/WebKit/UIProcess/cairo/BackingStoreCairo.cpp
index dc0a70b8824afdc7ec3dd1f69f4d9b51942924f6..f31988b5b9b896f17994bcf15c72b5f384d65afb 100644
index dc0a70b8824afdc7ec3dd1f69f4d9b51942924f6..4da6649c86b46dea36c2750802494ddb9b70cc24 100644
--- a/Source/WebKit/UIProcess/cairo/BackingStoreCairo.cpp
+++ b/Source/WebKit/UIProcess/cairo/BackingStoreCairo.cpp
@@ -27,6 +27,7 @@
@@ -27,9 +27,11 @@
#include "config.h"
#include "BackingStore.h"

+#include "DrawingAreaProxyCoordinatedGraphics.h"
#include "ShareableBitmap.h"
#include "UpdateInfo.h"
#include "WebPageProxy.h"
@@ -72,6 +73,10 @@ void BackingStore::paint(cairo_t* context, const IntRect& rect)
+#include "WebPageInspectorController.h"
#include <WebCore/BackingStoreBackendCairoImpl.h>
#include <WebCore/CairoUtilities.h>
#include <WebCore/GraphicsContextImplCairo.h>
@@ -72,6 +74,9 @@ void BackingStore::paint(cairo_t* context, const IntRect& rect)
cairo_rectangle(context, rect.x(), rect.y(), rect.width(), rect.height());
cairo_fill(context);
cairo_restore(context);
+#if PLATFORM(GTK)
+ if (auto* drawingArea = static_cast<DrawingAreaProxyCoordinatedGraphics*>(m_webPageProxy.drawingArea()))
+ drawingArea->didPaint(m_backend->surface(), drawingArea->size());
+ m_webPageProxy.inspectorController().didPaint(m_backend->surface());
+#endif
}

Expand Down Expand Up @@ -12997,15 +13004,22 @@ index 0000000000000000000000000000000000000000..a073a77390b206deb794efe937df4f35
+
+#endif // ENABLE(REMOTE_INSPECTOR)
diff --git a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreX11.cpp b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreX11.cpp
index be19b6007c9c0fbfffb859e40fd34751493fe7d1..dd51b743f0bb5ba5a537edd1caf0005054c89839 100644
index be19b6007c9c0fbfffb859e40fd34751493fe7d1..ce214fb7e22f8623aff6e2487cecd0272b21c478 100644
--- a/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreX11.cpp
+++ b/Source/WebKit/UIProcess/gtk/AcceleratedBackingStoreX11.cpp
@@ -256,6 +256,9 @@ bool AcceleratedBackingStoreX11::paint(cairo_t* cr, const IntRect& clipRect)
@@ -31,6 +31,7 @@
#include "DrawingAreaProxyCoordinatedGraphics.h"
#include "LayerTreeContext.h"
#include "WebPageProxy.h"
+#include "WebPageInspectorController.h"
#include <WebCore/CairoUtilities.h>
#include <WebCore/PlatformDisplayX11.h>
#include <WebCore/XErrorTrapper.h>
@@ -256,6 +257,8 @@ bool AcceleratedBackingStoreX11::paint(cairo_t* cr, const IntRect& clipRect)

cairo_restore(cr);

+ if (auto* drawingArea = static_cast<DrawingAreaProxyCoordinatedGraphics*>(m_webPage.drawingArea()))
+ drawingArea->didPaint(m_surface.get(), drawingArea->size());
+ m_webPage.inspectorController().didPaint(m_surface.get());
+
cairo_surface_flush(m_surface.get());

Expand Down