browser(webkit): introduce screencast agent in web process (#2248)

This commit is contained in:
Yury Semikhatsky 2020-05-14 15:48:05 -07:00 committed by GitHub
parent 63cc126805
commit f743cd9763
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 465 additions and 43 deletions

View File

@ -1 +1 @@
1230
1231

View File

@ -1614,6 +1614,18 @@ index 6d5be9a591a272cd67d6e9d097b30505bdf8ae5e..8f67ba28c380e844c8e4191ee7044665
return false;
}
diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt
index 51d46a8fcb19cd2d801e1e00086924bd9388ffd7..8148f0f7a8663d7c2635e38aa08170649e437c4a 100644
--- a/Source/WebCore/Sources.txt
+++ b/Source/WebCore/Sources.txt
@@ -1424,6 +1424,7 @@ inspector/agents/InspectorLayerTreeAgent.cpp
inspector/agents/InspectorMemoryAgent.cpp
inspector/agents/InspectorNetworkAgent.cpp
inspector/agents/InspectorPageAgent.cpp
+inspector/agents/InspectorScreencastAgent.cpp
inspector/agents/InspectorTimelineAgent.cpp
inspector/agents/InspectorWorkerAgent.cpp
inspector/agents/WebConsoleAgent.cpp
diff --git a/Source/WebCore/SourcesCocoa.txt b/Source/WebCore/SourcesCocoa.txt
index 71bab3866a179a695c769252584f77c2bcb64606..f2d3d3eababdde1635a649d0fc8a3a7b51fad191 100644
--- a/Source/WebCore/SourcesCocoa.txt
@ -1868,10 +1880,30 @@ index 3e2f9beaf00d25860436b7b608bfe9fb23195bae..e1a18032645fc9f9803ee891a4193030
return;
diff --git a/Source/WebCore/inspector/InspectorController.cpp b/Source/WebCore/inspector/InspectorController.cpp
index f6784b88e479fdd184f0a1496c5e34d3714a1683..f0981d2ce954bd1833a0e8d8fe03c6c85e027b22 100644
index f6784b88e479fdd184f0a1496c5e34d3714a1683..0687486f07a45b951054e55603f9b6daf819d822 100644
--- a/Source/WebCore/inspector/InspectorController.cpp
+++ b/Source/WebCore/inspector/InspectorController.cpp
@@ -366,8 +366,8 @@ void InspectorController::inspect(Node* node)
@@ -84,6 +84,9 @@
#include <JavaScriptCore/JSLock.h>
#include <wtf/Stopwatch.h>
+#if PLATFORM(WPE) || PLATFORM(WIN)
+#include "InspectorScreencastAgent.h"
+#endif
#if ENABLE(REMOTE_INSPECTOR)
#include "PageDebuggable.h"
#endif
@@ -185,6 +188,9 @@ void InspectorController::createLazyAgents()
m_agents.append(makeUnique<PageHeapAgent>(pageContext));
m_agents.append(makeUnique<PageAuditAgent>(pageContext));
m_agents.append(makeUnique<InspectorCanvasAgent>(pageContext));
+#if PLATFORM(WPE) || PLATFORM(WIN)
+ m_agents.append(makeUnique<InspectorScreencastAgent>(pageContext));
+#endif
m_agents.append(makeUnique<InspectorTimelineAgent>(pageContext));
m_agents.append(makeUnique<InspectorAnimationAgent>(pageContext));
@@ -366,8 +372,8 @@ void InspectorController::inspect(Node* node)
if (!enabled())
return;
@ -1882,7 +1914,21 @@ index f6784b88e479fdd184f0a1496c5e34d3714a1683..f0981d2ce954bd1833a0e8d8fe03c6c8
ensureDOMAgent().inspect(node);
}
@@ -510,4 +510,24 @@ void InspectorController::didComposite(Frame& frame)
@@ -500,6 +506,13 @@ JSC::VM& InspectorController::vm()
return commonVM();
}
+// Playwright begin
+void InspectorController::willDisplay()
+{
+ InspectorInstrumentation::willDisplay(m_page);
+}
+// Playwright end
+
void InspectorController::willComposite(Frame& frame)
{
InspectorInstrumentation::willComposite(frame);
@@ -510,4 +523,24 @@ void InspectorController::didComposite(Frame& frame)
InspectorInstrumentation::didComposite(frame);
}
@ -1908,10 +1954,16 @@ index f6784b88e479fdd184f0a1496c5e34d3714a1683..f0981d2ce954bd1833a0e8d8fe03c6c8
+
} // namespace WebCore
diff --git a/Source/WebCore/inspector/InspectorController.h b/Source/WebCore/inspector/InspectorController.h
index 3fae9951d703f83d0de805a71dfe0f7260feac58..6d6fbf9be7522188468f1dec988e6aee5d5aa877 100644
index 3fae9951d703f83d0de805a71dfe0f7260feac58..b128a43568db28c399b7c86bc4f32ed541859689 100644
--- a/Source/WebCore/inspector/InspectorController.h
+++ b/Source/WebCore/inspector/InspectorController.h
@@ -100,6 +100,10 @@ public:
@@ -97,9 +97,16 @@ public:
WEBCORE_EXPORT void setIndicating(bool);
+// Playwright begin
+ WEBCORE_EXPORT void willDisplay();
+// Playwright end
WEBCORE_EXPORT void willComposite(Frame&);
WEBCORE_EXPORT void didComposite(Frame&);
@ -1922,7 +1974,7 @@ index 3fae9951d703f83d0de805a71dfe0f7260feac58..6d6fbf9be7522188468f1dec988e6aee
bool isUnderTest() const { return m_isUnderTest; }
void setIsUnderTest(bool isUnderTest) { m_isUnderTest = isUnderTest; }
WEBCORE_EXPORT void evaluateForTestInFrontend(const String& script);
@@ -149,6 +153,7 @@ private:
@@ -149,6 +156,7 @@ private:
bool m_isAutomaticInspection { false };
bool m_pauseAfterInitialization = { false };
bool m_didCreateLazyAgents { false };
@ -1931,10 +1983,36 @@ index 3fae9951d703f83d0de805a71dfe0f7260feac58..6d6fbf9be7522188468f1dec988e6aee
} // namespace WebCore
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.cpp b/Source/WebCore/inspector/InspectorInstrumentation.cpp
index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f299d369e 100644
index 0c442ee908877d2067d65e87441652a8cf00c88e..b6aec17893afb39c7eab7310ef9f2ce401c9456b 100644
--- a/Source/WebCore/inspector/InspectorInstrumentation.cpp
+++ b/Source/WebCore/inspector/InspectorInstrumentation.cpp
@@ -628,6 +628,12 @@ void InspectorInstrumentation::didFailLoadingImpl(InstrumentingAgents& instrumen
@@ -53,6 +53,7 @@
#include "InspectorMemoryAgent.h"
#include "InspectorNetworkAgent.h"
#include "InspectorPageAgent.h"
+#include "InspectorScreencastAgent.h"
#include "InspectorTimelineAgent.h"
#include "InspectorWorkerAgent.h"
#include "InstrumentingAgents.h"
@@ -502,6 +503,17 @@ void InspectorInstrumentation::didLayoutImpl(InstrumentingAgents& instrumentingA
pageAgent->didLayout();
}
+// Playwright begin
+void InspectorInstrumentation::willDisplayImpl(InstrumentingAgents& instrumentingAgents)
+{
+#if PLATFORM(WPE) || PLATFORM(WIN)
+
+ if (auto* screencastAgent = instrumentingAgents.inspectorScreencastAgent())
+ screencastAgent->willDisplay();
+#endif
+}
+// Playwright end
+
void InspectorInstrumentation::willCompositeImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
{
if (InspectorTimelineAgent* timelineAgent = instrumentingAgents.trackingInspectorTimelineAgent())
@@ -628,6 +640,12 @@ void InspectorInstrumentation::didFailLoadingImpl(InstrumentingAgents& instrumen
consoleAgent->didFailLoading(identifier, error); // This should come AFTER resource notification, front-end relies on this.
}
@ -1947,7 +2025,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
void InspectorInstrumentation::willLoadXHRSynchronouslyImpl(InstrumentingAgents& instrumentingAgents)
{
if (InspectorNetworkAgent* networkAgent = instrumentingAgents.inspectorNetworkAgent())
@@ -660,20 +666,17 @@ void InspectorInstrumentation::didReceiveScriptResponseImpl(InstrumentingAgents&
@@ -660,20 +678,17 @@ void InspectorInstrumentation::didReceiveScriptResponseImpl(InstrumentingAgents&
void InspectorInstrumentation::domContentLoadedEventFiredImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
{
@ -1971,7 +2049,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
}
void InspectorInstrumentation::frameDetachedFromParentImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
@@ -751,12 +754,6 @@ void InspectorInstrumentation::frameDocumentUpdatedImpl(InstrumentingAgents& ins
@@ -751,12 +766,6 @@ void InspectorInstrumentation::frameDocumentUpdatedImpl(InstrumentingAgents& ins
pageDOMDebuggerAgent->frameDocumentUpdated(frame);
}
@ -1984,7 +2062,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
void InspectorInstrumentation::frameStartedLoadingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
{
if (frame.isMainFrame()) {
@@ -793,6 +790,12 @@ void InspectorInstrumentation::frameClearedScheduledNavigationImpl(Instrumenting
@@ -793,6 +802,12 @@ void InspectorInstrumentation::frameClearedScheduledNavigationImpl(Instrumenting
inspectorPageAgent->frameClearedScheduledNavigation(frame);
}
@ -1997,7 +2075,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
void InspectorInstrumentation::defaultAppearanceDidChangeImpl(InstrumentingAgents& instrumentingAgents, bool useDarkAppearance)
{
if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
@@ -1295,6 +1298,43 @@ void InspectorInstrumentation::renderLayerDestroyedImpl(InstrumentingAgents& ins
@@ -1295,6 +1310,43 @@ void InspectorInstrumentation::renderLayerDestroyedImpl(InstrumentingAgents& ins
layerTreeAgent->renderLayerDestroyed(renderLayer);
}
@ -2041,7 +2119,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
InstrumentingAgents& InspectorInstrumentation::instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope& workerGlobalScope)
{
return workerGlobalScope.inspectorController().m_instrumentingAgents;
@@ -1306,6 +1346,13 @@ InstrumentingAgents& InspectorInstrumentation::instrumentingAgentsForPage(Page&
@@ -1306,6 +1358,13 @@ InstrumentingAgents& InspectorInstrumentation::instrumentingAgentsForPage(Page&
return page.inspectorController().m_instrumentingAgents.get();
}
@ -2056,7 +2134,7 @@ index 0c442ee908877d2067d65e87441652a8cf00c88e..4234144873e3fa3caf12960c5eaa6b7f
{
if (is<Document>(context))
diff --git a/Source/WebCore/inspector/InspectorInstrumentation.h b/Source/WebCore/inspector/InspectorInstrumentation.h
index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f48fd8d39f 100644
index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..cd95112f4ed24429dfe27343228592e1d4ff7db4 100644
--- a/Source/WebCore/inspector/InspectorInstrumentation.h
+++ b/Source/WebCore/inspector/InspectorInstrumentation.h
@@ -31,6 +31,7 @@
@ -2090,7 +2168,17 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
class HTTPHeaderMap;
class InspectorTimelineAgent;
class InstrumentingAgents;
@@ -198,6 +202,7 @@ public:
@@ -181,6 +185,9 @@ public:
static void willLayout(Frame&);
static void didLayout(Frame&, RenderObject&);
static void didScroll(Page&);
+// Playwright begin
+ static void willDisplay(Page&);
+// Playwright end
static void willComposite(Frame&);
static void didComposite(Frame&);
static void willPaint(RenderObject&);
@@ -198,6 +205,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&);
@ -2098,7 +2186,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static void willSendRequest(WorkerGlobalScope&, unsigned long identifier, ResourceRequest&);
static void didReceiveResourceResponse(WorkerGlobalScope&, unsigned long identifier, const ResourceResponse&);
@@ -224,11 +229,11 @@ public:
@@ -224,11 +232,11 @@ public:
static void frameDetachedFromParent(Frame&);
static void didCommitLoad(Frame&, DocumentLoader*);
static void frameDocumentUpdated(Frame&);
@ -2111,7 +2199,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static void defaultAppearanceDidChange(Page&, bool useDarkAppearance);
static void willDestroyCachedResource(CachedResource&);
@@ -318,6 +323,13 @@ public:
@@ -318,6 +326,13 @@ public:
static void layerTreeDidChange(Page*);
static void renderLayerDestroyed(Page*, const RenderLayer&);
@ -2125,7 +2213,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static void frontendCreated();
static void frontendDeleted();
static bool hasFrontends() { return InspectorInstrumentationPublic::hasFrontends(); }
@@ -333,6 +345,8 @@ public:
@@ -333,6 +348,8 @@ public:
static void registerInstrumentingAgents(InstrumentingAgents&);
static void unregisterInstrumentingAgents(InstrumentingAgents&);
@ -2134,7 +2222,17 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
private:
static void didClearWindowObjectInWorldImpl(InstrumentingAgents&, Frame&, DOMWrapperWorld&);
static bool isDebuggerPausedImpl(InstrumentingAgents&);
@@ -419,6 +433,7 @@ private:
@@ -400,6 +417,9 @@ private:
static void willLayoutImpl(InstrumentingAgents&, Frame&);
static void didLayoutImpl(InstrumentingAgents&, RenderObject&);
static void didScrollImpl(InstrumentingAgents&);
+// Playwright begin
+ static void willDisplayImpl(InstrumentingAgents&);
+// Playwright end
static void willCompositeImpl(InstrumentingAgents&, Frame&);
static void didCompositeImpl(InstrumentingAgents&);
static void willPaintImpl(InstrumentingAgents&, RenderObject&);
@@ -419,6 +439,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&);
@ -2142,7 +2240,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static void willLoadXHRSynchronouslyImpl(InstrumentingAgents&);
static void didLoadXHRSynchronouslyImpl(InstrumentingAgents&);
static void scriptImportedImpl(InstrumentingAgents&, unsigned long identifier, const String& sourceString);
@@ -429,11 +444,11 @@ private:
@@ -429,11 +450,11 @@ private:
static void frameDetachedFromParentImpl(InstrumentingAgents&, Frame&);
static void didCommitLoadImpl(InstrumentingAgents&, Frame&, DocumentLoader*);
static void frameDocumentUpdatedImpl(InstrumentingAgents&, Frame&);
@ -2155,7 +2253,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static void defaultAppearanceDidChangeImpl(InstrumentingAgents&, bool useDarkAppearance);
static void willDestroyCachedResourceImpl(CachedResource&);
@@ -519,6 +534,13 @@ private:
@@ -519,6 +540,13 @@ private:
static void layerTreeDidChangeImpl(InstrumentingAgents&);
static void renderLayerDestroyedImpl(InstrumentingAgents&, const RenderLayer&);
@ -2169,7 +2267,22 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
static InstrumentingAgents& instrumentingAgentsForPage(Page&);
static InstrumentingAgents& instrumentingAgentsForWorkerGlobalScope(WorkerGlobalScope&);
@@ -1107,6 +1129,13 @@ inline void InspectorInstrumentation::didFailLoading(Frame* frame, DocumentLoade
@@ -968,6 +996,14 @@ inline void InspectorInstrumentation::didScroll(Page& page)
didScrollImpl(instrumentingAgentsForPage(page));
}
+// Playwright begin
+inline void InspectorInstrumentation::willDisplay(Page& page)
+{
+ FAST_RETURN_IF_NO_FRONTENDS(void());
+ willDisplayImpl(instrumentingAgentsForPage(page));
+}
+// Playwright end
+
inline void InspectorInstrumentation::willComposite(Frame& frame)
{
FAST_RETURN_IF_NO_FRONTENDS(void());
@@ -1107,6 +1143,13 @@ inline void InspectorInstrumentation::didFailLoading(Frame* frame, DocumentLoade
didFailLoadingImpl(*instrumentingAgents, identifier, loader, error);
}
@ -2183,7 +2296,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
inline void InspectorInstrumentation::didFailLoading(WorkerGlobalScope& workerGlobalScope, unsigned long identifier, const ResourceError& error)
{
didFailLoadingImpl(instrumentingAgentsForWorkerGlobalScope(workerGlobalScope), identifier, nullptr, error);
@@ -1202,13 +1231,6 @@ inline void InspectorInstrumentation::frameDocumentUpdated(Frame& frame)
@@ -1202,13 +1245,6 @@ inline void InspectorInstrumentation::frameDocumentUpdated(Frame& frame)
frameDocumentUpdatedImpl(*instrumentingAgents, frame);
}
@ -2197,7 +2310,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
inline void InspectorInstrumentation::frameStartedLoading(Frame& frame)
{
FAST_RETURN_IF_NO_FRONTENDS(void());
@@ -1237,6 +1259,13 @@ inline void InspectorInstrumentation::frameClearedScheduledNavigation(Frame& fra
@@ -1237,6 +1273,13 @@ inline void InspectorInstrumentation::frameClearedScheduledNavigation(Frame& fra
frameClearedScheduledNavigationImpl(*instrumentingAgents, frame);
}
@ -2211,7 +2324,7 @@ index 03bdd55cc930de0cfc61f8d9e4210f4952aa4633..f5ba8d9989675341f39238d86f7ce2f4
inline void InspectorInstrumentation::defaultAppearanceDidChange(Page& page, bool useDarkAppearance)
{
FAST_RETURN_IF_NO_FRONTENDS(void());
@@ -1687,6 +1716,50 @@ inline void InspectorInstrumentation::renderLayerDestroyed(Page* page, const Ren
@@ -1687,6 +1730,50 @@ inline void InspectorInstrumentation::renderLayerDestroyed(Page* page, const Ren
renderLayerDestroyedImpl(*instrumentingAgents, renderLayer);
}
@ -2313,6 +2426,48 @@ index b67e89b80b4e7a8586cac81ade5d58a1bcb0d431..c468bc0981d1fb13272b28095f9f7584
inline bool InspectorInstrumentationWebKit::shouldInterceptResponse(const Frame* frame, const ResourceResponse& response)
{
FAST_RETURN_IF_NO_FRONTENDS(false);
diff --git a/Source/WebCore/inspector/InstrumentingAgents.cpp b/Source/WebCore/inspector/InstrumentingAgents.cpp
index d7a2f71958d943cccac434eac93e33dae27cc404..6cd053bd72ef6d14f15b0bd6739f672b0468198b 100644
--- a/Source/WebCore/inspector/InstrumentingAgents.cpp
+++ b/Source/WebCore/inspector/InstrumentingAgents.cpp
@@ -46,6 +46,7 @@ void InstrumentingAgents::reset()
{
m_inspectorAgent = nullptr;
m_inspectorPageAgent = nullptr;
+ m_inspectorScreencastAgent = nullptr;
m_inspectorCSSAgent = nullptr;
m_inspectorLayerTreeAgent = nullptr;
m_inspectorWorkerAgent = nullptr;
diff --git a/Source/WebCore/inspector/InstrumentingAgents.h b/Source/WebCore/inspector/InstrumentingAgents.h
index f59c3dbdcaf78cf9c6d8dbb432dccf22f15d507d..e6abccfbf286613180ecea948947c61075bc57b3 100644
--- a/Source/WebCore/inspector/InstrumentingAgents.h
+++ b/Source/WebCore/inspector/InstrumentingAgents.h
@@ -57,6 +57,7 @@ class InspectorLayerTreeAgent;
class InspectorMemoryAgent;
class InspectorNetworkAgent;
class InspectorPageAgent;
+class InspectorScreencastAgent;
class InspectorTimelineAgent;
class InspectorWorkerAgent;
class Page;
@@ -88,6 +89,9 @@ public:
InspectorPageAgent* inspectorPageAgent() const { return m_inspectorPageAgent; }
void setInspectorPageAgent(InspectorPageAgent* agent) { m_inspectorPageAgent = agent; }
+ InspectorScreencastAgent* inspectorScreencastAgent() const { return m_inspectorScreencastAgent; }
+ void setInspectorScreencastAgent(InspectorScreencastAgent* agent) { m_inspectorScreencastAgent = agent; }
+
InspectorCanvasAgent* inspectorCanvasAgent() const { return m_inspectorCanvasAgent; }
void setInspectorCanvasAgent(InspectorCanvasAgent* agent) { m_inspectorCanvasAgent = agent; }
@@ -169,6 +173,7 @@ private:
Inspector::InspectorAgent* m_inspectorAgent { nullptr };
InspectorPageAgent* m_inspectorPageAgent { nullptr };
+ InspectorScreencastAgent* m_inspectorScreencastAgent { nullptr };
InspectorCSSAgent* m_inspectorCSSAgent { nullptr };
InspectorLayerTreeAgent* m_inspectorLayerTreeAgent { nullptr };
InspectorWorkerAgent* m_inspectorWorkerAgent { nullptr };
diff --git a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp b/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
index a2f8dfa1624ddff42e359c862e0748e72ecbc96c..b7a4e23bf12b1367f1eda92bc9ae113055c455d5 100644
--- a/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
@ -4109,6 +4264,255 @@ index 6c75829502336b0806db2531e78186d2c559e44c..1ad6b8e863c56fd572910db6c6fb524d
};
} // namespace WebCore
diff --git a/Source/WebCore/inspector/agents/InspectorScreencastAgent.cpp b/Source/WebCore/inspector/agents/InspectorScreencastAgent.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e7f4a5b8b23771f8d81dd4c61c642923399ca757
--- /dev/null
+++ b/Source/WebCore/inspector/agents/InspectorScreencastAgent.cpp
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "InspectorScreencastAgent.h"
+
+#if PLATFORM(WPE) || PLATFORM(WIN)
+
+#include "Page.h"
+#include "FrameSnapshotting.h"
+#include "ImageBuffer.h"
+#include <JavaScriptCore/InspectorFrontendDispatchers.h>
+#include <JavaScriptCore/InspectorFrontendRouter.h>
+
+namespace WebCore {
+
+using namespace Inspector;
+
+InspectorScreencastAgent::InspectorScreencastAgent(PageAgentContext& context)
+ : InspectorAgentBase("Screencast"_s, context)
+ , m_frontendDispatcher(makeUnique<ScreencastFrontendDispatcher>(context.frontendRouter))
+ , m_backendDispatcher(ScreencastBackendDispatcher::create(context.backendDispatcher, this))
+ , m_inspectedPage(context.inspectedPage)
+{
+}
+
+InspectorScreencastAgent::~InspectorScreencastAgent()
+{
+}
+
+void InspectorScreencastAgent::didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*)
+{
+}
+
+void InspectorScreencastAgent::willDestroyFrontendAndBackend(DisconnectReason)
+{
+ ErrorString errorString;
+ stop(errorString);
+}
+
+void InspectorScreencastAgent::start(Inspector::ErrorString& errorString, const String& format, const int* quality)
+{
+ if (isEnabled())
+ return;
+
+#if !PLATFORM(GTK)
+ // TODO: make ImageBufferUtilitiesCairo produce jpeg on WPE and Windows.
+ if (format != "png") {
+ errorString = "Only png format is supported on WPE."_s;
+ return;
+ }
+#endif
+
+ if (format == "jpeg") {
+ m_format = "image/jpeg";
+ } else if (format == "png") {
+ m_format = "image/png";
+ } else {
+ errorString = "Unsupported format."_s;
+ return;
+ }
+
+ if (quality && (*quality < 0 || *quality >100)) {
+ errorString = "Unsupported quality."_s;
+ return;
+ }
+
+ if (quality)
+ m_quality = *quality;
+ m_instrumentingAgents.setInspectorScreencastAgent(this);
+}
+
+void InspectorScreencastAgent::stop(Inspector::ErrorString&)
+{
+ if (!isEnabled())
+ return;
+
+ m_instrumentingAgents.setInspectorScreencastAgent(nullptr);
+ m_inflightFrames = 0;
+ m_quality = WTF::nullopt;
+}
+
+void InspectorScreencastAgent::frameAck(Inspector::ErrorString& errorString)
+{
+ if (!m_inflightFrames) {
+ errorString = "No inflight frames to ack"_s;
+ return;
+ }
+
+ --m_inflightFrames;
+}
+
+bool InspectorScreencastAgent::isEnabled() const
+{
+ return m_instrumentingAgents.inspectorScreencastAgent();
+}
+
+void InspectorScreencastAgent::willDisplay()
+{
+ if (!isEnabled())
+ return;
+
+ if (m_inflightFrames > 2)
+ return;
+
+ String snapshot = takeSnapshot();
+ if (snapshot.isEmpty())
+ return;
+
+ ++m_inflightFrames;
+ m_frontendDispatcher->frame(snapshot);
+}
+
+String InspectorScreencastAgent::takeSnapshot()
+{
+ SnapshotOptions options = SnapshotOptionsNone;
+ options |= SnapshotOptionsInViewCoordinates;
+ IntSize size = m_inspectedPage.mainFrame().view()->visibleSize();
+ fprintf(stderr, "view().visibleSize() = %s\n", size.toJSONString().ascii().data());
+ IntRect rectangle({0, 0}, size);
+ std::unique_ptr<ImageBuffer> snapshot = snapshotFrameRect(m_inspectedPage.mainFrame(), rectangle, options);
+
+ if (!snapshot)
+ return String();
+
+ Optional<double> quality;
+ if (m_quality)
+ quality = *m_quality / 100.0;
+
+ Vector<uint8_t> data = snapshot->toData(m_format, quality);
+ return base64Encode(data);
+}
+
+} // namespace WebCore
+
+#endif // PLATFORM(WPE) || PLATFORM(WIN)
diff --git a/Source/WebCore/inspector/agents/InspectorScreencastAgent.h b/Source/WebCore/inspector/agents/InspectorScreencastAgent.h
new file mode 100644
index 0000000000000000000000000000000000000000..031911914c9fd89fb3ee8e42a95f97cdf1b9c4cd
--- /dev/null
+++ b/Source/WebCore/inspector/agents/InspectorScreencastAgent.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if PLATFORM(WPE) || PLATFORM(WIN)
+
+#include "InspectorWebAgentBase.h"
+#include <JavaScriptCore/InspectorBackendDispatchers.h>
+#include <JavaScriptCore/InspectorFrontendDispatchers.h>
+
+#include <wtf/Forward.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/WeakPtr.h>
+
+namespace Inspector {
+class BackendDispatcher;
+class FrontendChannel;
+class FrontendRouter;
+class ScreencastFrontendDispatcher;
+}
+
+namespace WebCore {
+
+class Page;
+
+class InspectorScreencastAgent : public InspectorAgentBase, public Inspector::ScreencastBackendDispatcherHandler, public CanMakeWeakPtr<InspectorScreencastAgent> {
+ WTF_MAKE_NONCOPYABLE(InspectorScreencastAgent);
+ WTF_MAKE_FAST_ALLOCATED;
+public:
+ InspectorScreencastAgent(PageAgentContext&);
+ ~InspectorScreencastAgent() override;
+
+ void didCreateFrontendAndBackend(Inspector::FrontendRouter*, Inspector::BackendDispatcher*) override;
+ void willDestroyFrontendAndBackend(Inspector::DisconnectReason) override;
+
+ void start(Inspector::ErrorString&, const String& format, const int* quality) override;
+ void stop(Inspector::ErrorString&) override;
+ void frameAck(Inspector::ErrorString&) override;
+
+ void willDisplay();
+
+private:
+ bool isEnabled() const;
+ String takeSnapshot();
+
+ std::unique_ptr<Inspector::ScreencastFrontendDispatcher> m_frontendDispatcher;
+ Ref<Inspector::ScreencastBackendDispatcher> m_backendDispatcher;
+ Page& m_inspectedPage;
+ int m_inflightFrames { 0 };
+ String m_format;
+ Optional<int> m_quality;
+};
+
+} // namespace WebCore
+
+#endif // PLATFORM(WPE) || PLATFORM(WIN)
diff --git a/Source/WebCore/inspector/agents/InspectorWorkerAgent.cpp b/Source/WebCore/inspector/agents/InspectorWorkerAgent.cpp
index a7a20f7234743d65382b5c93077c95f2bfa793bb..ba10548085cc4012c1d42d78112445c9a5777070 100644
--- a/Source/WebCore/inspector/agents/InspectorWorkerAgent.cpp
@ -8384,10 +8788,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..b982b01789b697f3e7810b374705d95ccaf6a0ba
index 0000000000000000000000000000000000000000..f301bc4d2782a4ba1deca8bb59da46c00ae09896
--- /dev/null
+++ b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp
@@ -0,0 +1,202 @@
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
@ -8419,7 +8823,9 @@ index 0000000000000000000000000000000000000000..b982b01789b697f3e7810b374705d95c
+#include "PageClient.h"
+#include "WebAutomationSession.h"
+#include "WebPageProxy.h"
+#include <JavaScriptCore/InspectorFrontendDispatchers.h>
+#include <JavaScriptCore/InspectorFrontendRouter.h>
+#include <WebCore/NotImplemented.h>
+
+#if PLATFORM(GTK)
+#include <WebCore/ImageBufferUtilitiesCairo.h>
@ -8456,7 +8862,7 @@ index 0000000000000000000000000000000000000000..b982b01789b697f3e7810b374705d95c
+void InspectorScreencastAgent::start(Inspector::ErrorString& errorString, const String& format, const int* quality)
+{
+ if (m_enabled)
+ return;
+ return;
+
+ if (format == "jpeg") {
+ m_format = ImageFormat::Jpeg;
@ -8486,7 +8892,7 @@ index 0000000000000000000000000000000000000000..b982b01789b697f3e7810b374705d95c
+void InspectorScreencastAgent::stop(Inspector::ErrorString&)
+{
+ if (!m_enabled)
+ return;
+ return;
+
+ m_enabled = false;
+ m_inflightFrames = 0;
@ -8585,6 +8991,8 @@ index 0000000000000000000000000000000000000000..b982b01789b697f3e7810b374705d95c
+#else
+String InspectorScreencastAgent::platformTakeSnapshot()
+{
+ // WPE and Windows implementation lives in the Web Process.
+ notImplemented();
+ return String();
+}
+#endif
@ -8592,10 +9000,10 @@ index 0000000000000000000000000000000000000000..b982b01789b697f3e7810b374705d95c
+} // 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..b5eeeca0f6b8c5c31e3786c0a675e32285a808c4
index 0000000000000000000000000000000000000000..a1d8892da8bebd48346a4ccb9e9836dab9da7909
--- /dev/null
+++ b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.h
@@ -0,0 +1,77 @@
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 Microsoft Corporation.
+ *
@ -8634,6 +9042,7 @@ index 0000000000000000000000000000000000000000..b5eeeca0f6b8c5c31e3786c0a675e322
+class BackendDispatcher;
+class FrontendChannel;
+class FrontendRouter;
+class ScreencastFrontendDispatcher;
+}
+
+namespace WebKit {
@ -8787,7 +9196,7 @@ index a2239cec8e18850f35f7f88a9c4ebadc62bf4023..79f3ff84327dc075ec96983e04db4b10
} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd4258581464081f92 100644
index 1861cff806131196ea49b4f8aca6665beebbf6e8..57cb5bd0a6916b00da01af17b743da9e04094a77 100644
--- a/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
+++ b/Source/WebKit/UIProcess/Inspector/WebPageInspectorController.cpp
@@ -26,12 +26,20 @@
@ -8811,7 +9220,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
#include <JavaScriptCore/InspectorAgentBase.h>
#include <JavaScriptCore/InspectorBackendDispatcher.h>
#include <JavaScriptCore/InspectorBackendDispatchers.h>
@@ -48,27 +56,103 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage)
@@ -48,27 +56,104 @@ static String getTargetID(const ProvisionalPageProxy& provisionalPage)
return WebPageInspectorTarget::toTargetID(provisionalPage.webPageID());
}
@ -8844,8 +9253,9 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
+ m_inputAgent = inputAgent.get();
+ 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));
+
+#endif
+ if (s_observer)
+ s_observer->didCreateInspectorController(m_page);
+
@ -8918,7 +9328,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
}
bool WebPageInspectorController::hasLocalFrontend() const
@@ -82,6 +166,17 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro
@@ -82,6 +167,17 @@ void WebPageInspectorController::connectFrontend(Inspector::FrontendChannel& fro
bool connectingFirstFrontend = !m_frontendRouter->hasFrontends();
@ -8936,7 +9346,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
m_frontendRouter->connectFrontend(frontendChannel);
if (connectingFirstFrontend)
@@ -100,8 +195,10 @@ void WebPageInspectorController::disconnectFrontend(FrontendChannel& frontendCha
@@ -100,8 +196,10 @@ void WebPageInspectorController::disconnectFrontend(FrontendChannel& frontendCha
m_frontendRouter->disconnectFrontend(frontendChannel);
bool disconnectingLastFrontend = !m_frontendRouter->hasFrontends();
@ -8948,7 +9358,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());
@@ -124,6 +221,8 @@ void WebPageInspectorController::disconnectAllFrontends()
@@ -124,6 +222,8 @@ void WebPageInspectorController::disconnectAllFrontends()
// Disconnect any remaining remote frontends.
m_frontendRouter->disconnectAllFrontends();
@ -8957,7 +9367,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
m_page.didChangeInspectorFrontendCount(m_frontendRouter->frontendCount());
#if ENABLE(REMOTE_INSPECTOR)
@@ -150,6 +249,55 @@ void WebPageInspectorController::setIndicating(bool indicating)
@@ -150,6 +250,55 @@ void WebPageInspectorController::setIndicating(bool indicating)
}
#endif
@ -9013,7 +9423,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
void WebPageInspectorController::createInspectorTarget(const String& targetId, Inspector::InspectorTargetType type)
{
addTarget(InspectorTargetProxy::create(m_page, targetId, type));
@@ -169,6 +317,33 @@ void WebPageInspectorController::sendMessageToInspectorFrontend(const String& ta
@@ -169,6 +318,33 @@ void WebPageInspectorController::sendMessageToInspectorFrontend(const String& ta
m_targetAgent->sendMessageFromTargetToFrontend(targetId, message);
}
@ -9047,7 +9457,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
bool WebPageInspectorController::shouldPauseLoading(const ProvisionalPageProxy& provisionalPage) const
{
if (!m_frontendRouter->hasFrontends())
@@ -188,7 +363,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag
@@ -188,7 +364,7 @@ void WebPageInspectorController::setContinueLoadingCallback(const ProvisionalPag
void WebPageInspectorController::didCreateProvisionalPage(ProvisionalPageProxy& provisionalPage)
{
@ -9056,7 +9466,7 @@ index 1861cff806131196ea49b4f8aca6665beebbf6e8..521ef88239d5db7274cd19cd42585814
}
void WebPageInspectorController::willDestroyProvisionalPage(const ProvisionalPageProxy& provisionalPage)
@@ -241,4 +416,20 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy>
@@ -241,4 +417,20 @@ void WebPageInspectorController::addTarget(std::unique_ptr<InspectorTargetProxy>
m_targets.set(target->identifier(), WTFMove(target));
}
@ -13630,7 +14040,7 @@ index 1324229bf6dd3a90324aa55dff533186f97b52e8..b459bf67142874851e3f6e0caf0a229b
{
if (m_page.activeOpenPanelResultListener())
diff --git a/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp b/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp
index 28189c82da62d9e0d9f516f1a69d4a8614dbd1d6..0664c282e8514abe6f8f213c3a496a4a6a9cdcda 100644
index 28189c82da62d9e0d9f516f1a69d4a8614dbd1d6..fb39c9ea955e8255de7dbb755cf0c26aff23a3c0 100644
--- a/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp
+++ b/Source/WebKit/WebProcess/WebPage/CoordinatedGraphics/DrawingAreaCoordinatedGraphics.cpp
@@ -244,12 +244,20 @@ void DrawingAreaCoordinatedGraphics::updatePreferences(const WebPreferencesStore
@ -13654,6 +14064,18 @@ index 28189c82da62d9e0d9f516f1a69d4a8614dbd1d6..0664c282e8514abe6f8f213c3a496a4a
// 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.
@@ -713,6 +721,11 @@ void DrawingAreaCoordinatedGraphics::display()
return;
}
+// Playwright begin
+#if PLATFORM(WPE) || PLATFORM(WIN)
+ m_webPage.corePage()->inspectorController().willDisplay();
+#endif
+// Playwright end
send(Messages::DrawingAreaProxy::Update(m_backingStoreStateID, updateInfo));
m_isWaitingForDidUpdate = true;
}
diff --git a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp b/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp
index b2d54a627b94583bda3518c4e7c3364481b605a4..d407e32b6a7b8b27925c49391e86d42c9b3dfa8b 100644
--- a/Source/WebKit/WebProcess/WebPage/WebDocumentLoader.cpp