Skip to content

Commit 0aff9be

Browse files
authored
browser(firefox): screencast for headless mac (microsoft#2956)
1 parent 4a00e5c commit 0aff9be

File tree

3 files changed

+73
-41
lines changed

3 files changed

+73
-41
lines changed

browser_patches/firefox/BUILD_NUMBER

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1127
2-
Changed: [email protected] Tue Jul 14 12:47:49 PDT 2020
1+
1128
2+
Changed: [email protected] Wed Jul 15 09:22:48 PDT 2020

browser_patches/firefox/juggler/screencast/nsScreencastService.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ nsresult nsScreencastService::StartVideoRecording(nsIDocShell* aDocShell, const
132132
return NS_ERROR_UNEXPECTED;
133133
nsIWidget* widget = view->GetWidget();
134134

135-
#ifdef MOZ_WIDGET_GTK
136135
*sessionId = ++mLastSessionId;
137136
rtc::scoped_refptr<webrtc::VideoCaptureModule> capturer = CreateWindowCapturer(widget, *sessionId);
138137
if (!capturer)
@@ -154,10 +153,6 @@ nsresult nsScreencastService::StartVideoRecording(nsIDocShell* aDocShell, const
154153

155154
mIdToSession.emplace(*sessionId, std::move(session));
156155
return NS_OK;
157-
#else
158-
// TODO: support Windows and Mac.
159-
return NS_ERROR_NOT_IMPLEMENTED;
160-
#endif
161156
}
162157

163158
nsresult nsScreencastService::StopVideoRecording(int32_t sessionId) {

browser_patches/firefox/patches/bootstrap.diff

+71-34
Original file line numberDiff line numberDiff line change
@@ -1810,8 +1810,34 @@ index ea8b9b08f3e6f6e99b8a4fa3fa427beb8c5f5945..a7ec2bd3afe53d500f0cd8f800223ee2
18101810
};
18111811

18121812
/**
1813+
diff --git a/widget/InProcessCompositorWidget.cpp b/widget/InProcessCompositorWidget.cpp
1814+
index 7d7ef5a5f9e6c092e643eb5c3feef239e90c0bb2..7c975244f26b3c2ec20d8174e5d84fc9938860a9 100644
1815+
--- a/widget/InProcessCompositorWidget.cpp
1816+
+++ b/widget/InProcessCompositorWidget.cpp
1817+
@@ -4,6 +4,8 @@
1818+
1819+
#include "InProcessCompositorWidget.h"
1820+
1821+
+#include "HeadlessCompositorWidget.h"
1822+
+#include "HeadlessWidget.h"
1823+
#include "mozilla/VsyncDispatcher.h"
1824+
#include "nsBaseWidget.h"
1825+
1826+
@@ -22,6 +24,12 @@ RefPtr<CompositorWidget> CompositorWidget::CreateLocal(
1827+
const CompositorWidgetInitData& aInitData,
1828+
const layers::CompositorOptions& aOptions, nsIWidget* aWidget) {
1829+
MOZ_ASSERT(aWidget);
1830+
+ if (aInitData.type() ==
1831+
+ CompositorWidgetInitData::THeadlessCompositorWidgetInitData) {
1832+
+ return new HeadlessCompositorWidget(
1833+
+ aInitData.get_HeadlessCompositorWidgetInitData(), aOptions,
1834+
+ static_cast<HeadlessWidget*>(aWidget));
1835+
+ }
1836+
# ifdef MOZ_WIDGET_ANDROID
1837+
return new AndroidCompositorWidget(aOptions,
1838+
static_cast<nsBaseWidget*>(aWidget));
18131839
diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
1814-
index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac068503639b33887 100644
1840+
index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823cd01d6001 100644
18151841
--- a/widget/headless/HeadlessCompositorWidget.cpp
18161842
+++ b/widget/headless/HeadlessCompositorWidget.cpp
18171843
@@ -3,6 +3,7 @@
@@ -1822,7 +1848,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
18221848
#include "mozilla/widget/PlatformWidgetTypes.h"
18231849
#include "HeadlessCompositorWidget.h"
18241850
#include "VsyncDispatcher.h"
1825-
@@ -17,6 +18,54 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1851+
@@ -17,6 +18,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
18261852
mClientSize = aInitData.InitialClientSize();
18271853
}
18281854

@@ -1839,6 +1865,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
18391865
+ MOZ_ASSERT(NS_IsInCompositorThread());
18401866
+ mSnapshotListener = std::move(listener);
18411867
+ UpdateDrawTarget();
1868+
+ PeriodicSnapshot();
18421869
+}
18431870
+
18441871
+already_AddRefed<gfx::DrawTarget> HeadlessCompositorWidget::StartRemoteDrawingInRegion(
@@ -1850,34 +1877,11 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
18501877
+ RefPtr<gfx::DrawTarget> result = mDrawTarget;
18511878
+ return result.forget();
18521879
+}
1853-
+
1854-
+void HeadlessCompositorWidget::EndRemoteDrawingInRegion(
1855-
+ gfx::DrawTarget* aDrawTarget, const LayoutDeviceIntRegion& aInvalidRegion) {
1856-
+ if (!mDrawTarget)
1857-
+ return;
1858-
+
1859-
+ if (!mSnapshotListener)
1860-
+ return;
1861-
+
1862-
+ RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
1863-
+ if (!snapshot) {
1864-
+ fprintf(stderr, "Failed to get snapshot of draw target\n");
1865-
+ return;
1866-
+ }
1867-
+
1868-
+ RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
1869-
+ if (!dataSurface) {
1870-
+ fprintf(stderr, "Failed to get data surface from snapshot\n");
1871-
+ return;
1872-
+ }
1873-
+
1874-
+ mSnapshotListener(std::move(dataSurface));
1875-
+}
18761880
+
18771881
void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
18781882
if (RefPtr<CompositorVsyncDispatcher> cvd =
18791883
mWidget->GetCompositorVsyncDispatcher()) {
1880-
@@ -29,6 +78,25 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1884+
@@ -29,6 +56,51 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
18811885
void HeadlessCompositorWidget::NotifyClientSizeChanged(
18821886
const LayoutDeviceIntSize& aClientSize) {
18831887
mClientSize = aClientSize;
@@ -1900,14 +1904,40 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..41f483959bd80aa9cc6ad9eac0685036
19001904
+ // TODO: this is called on Main thread, while Start/End drawing are on Compositor thread.
19011905
+ mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
19021906
+ mozilla::gfx::BackendType::SKIA, size, format);
1907+
+}
1908+
+
1909+
+void HeadlessCompositorWidget::PeriodicSnapshot() {
1910+
+ if (!mDrawTarget)
1911+
+ return;
1912+
+
1913+
+ if (!mSnapshotListener)
1914+
+ return;
1915+
+
1916+
+ RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
1917+
+ if (!snapshot) {
1918+
+ fprintf(stderr, "Failed to get snapshot of draw target\n");
1919+
+ return;
1920+
+ }
1921+
+
1922+
+ RefPtr<gfx::DataSourceSurface> dataSurface = snapshot->GetDataSurface();
1923+
+ if (!dataSurface) {
1924+
+ fprintf(stderr, "Failed to get data surface from snapshot\n");
1925+
+ return;
1926+
+ }
1927+
+
1928+
+ mSnapshotListener(std::move(dataSurface));
1929+
+
1930+
+ NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
1931+
+ "HeadlessCompositorWidget::PeriodicSnapshot", this,
1932+
+ &HeadlessCompositorWidget::PeriodicSnapshot), 40);
19031933
}
19041934

19051935
LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
19061936
diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
1907-
index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935225869fc 100644
1937+
index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505fcc40e13 100644
19081938
--- a/widget/headless/HeadlessCompositorWidget.h
19091939
+++ b/widget/headless/HeadlessCompositorWidget.h
1910-
@@ -23,9 +23,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1940+
@@ -23,9 +23,13 @@ class HeadlessCompositorWidget final : public CompositorWidget,
19111941
HeadlessWidget* aWindow);
19121942

19131943
void NotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize);
@@ -1917,19 +1947,17 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935
19171947

19181948
+ already_AddRefed<gfx::DrawTarget> StartRemoteDrawingInRegion(
19191949
+ LayoutDeviceIntRegion& aInvalidRegion, layers::BufferMode* aBufferMode) override;
1920-
+ void EndRemoteDrawingInRegion(
1921-
+ gfx::DrawTarget* aDrawTarget,
1922-
+ const LayoutDeviceIntRegion& aInvalidRegion) override;
19231950
+
19241951
uintptr_t GetWidgetKey() override;
19251952

19261953
LayoutDeviceIntSize GetClientSize() override;
1927-
@@ -42,9 +49,15 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1954+
@@ -42,9 +46,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
19281955
}
19291956

19301957
private:
19311958
+ void SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener);
19321959
+ void UpdateDrawTarget();
1960+
+ void PeriodicSnapshot();
19331961
+
19341962
HeadlessWidget* mWidget;
19351963

@@ -1941,10 +1969,19 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..849cd6f98982fbabc8e483c8bb8f7935
19411969

19421970
} // namespace widget
19431971
diff --git a/widget/headless/HeadlessWidget.cpp b/widget/headless/HeadlessWidget.cpp
1944-
index 7589d8a1a886dab5431e423d20f7d0aa19c2af75..19dd67a330848b6b39bfc578a6940385329fff8e 100644
1972+
index 7589d8a1a886dab5431e423d20f7d0aa19c2af75..b14925a7b6972c120a59f70fbbe70a1145a5cb4e 100644
19451973
--- a/widget/headless/HeadlessWidget.cpp
19461974
+++ b/widget/headless/HeadlessWidget.cpp
1947-
@@ -499,5 +499,13 @@ nsresult HeadlessWidget::SynthesizeNativeTouchPoint(
1975+
@@ -104,6 +104,8 @@ void HeadlessWidget::Destroy() {
1976+
}
1977+
}
1978+
1979+
+ SetSnapshotListener(nullptr);
1980+
+
1981+
nsBaseWidget::OnDestroy();
1982+
1983+
nsBaseWidget::Destroy();
1984+
@@ -499,5 +501,13 @@ nsresult HeadlessWidget::SynthesizeNativeTouchPoint(
19481985
return NS_OK;
19491986
}
19501987

0 commit comments

Comments
 (0)