@@ -1944,7 +1944,7 @@ index 7d7ef5a5f9e6c092e643eb5c3feef239e90c0bb2..7c975244f26b3c2ec20d8174e5d84fc9
19441944 return new AndroidCompositorWidget(aOptions,
19451945 static_cast<nsBaseWidget*>(aWidget));
19461946diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
1947- index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f5e4ccdd5 100644
1947+ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..45456bd34713a32695c0fe6a84588f31e40c137d 100644
19481948--- a/widget/headless/HeadlessCompositorWidget.cpp
19491949+++ b/widget/headless/HeadlessCompositorWidget.cpp
19501950@@ -3,6 +3,7 @@
@@ -1955,24 +1955,23 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f
19551955 #include "mozilla/widget/PlatformWidgetTypes.h"
19561956 #include "HeadlessCompositorWidget.h"
19571957 #include "VsyncDispatcher.h"
1958- @@ -17,6 +18,33 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1958+ @@ -17,6 +18,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
19591959 mClientSize = aInitData.InitialClientSize();
19601960 }
19611961
19621962+ void HeadlessCompositorWidget::SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener) {
19631963+ MOZ_ASSERT(NS_IsMainThread());
19641964+
1965- + layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&, LayoutDeviceIntSize >(
1965+ + layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&>(
19661966+ "HeadlessCompositorWidget::SetSnapshotListener", this,
19671967+ &HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread,
1968- + std::move(listener), mClientSize ));
1968+ + std::move(listener)));
19691969+ }
19701970+
19711971+ void HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread(
1972- + HeadlessWidget::SnapshotListener&& listener, const LayoutDeviceIntSize& aClientSize ) {
1972+ + HeadlessWidget::SnapshotListener&& listener) {
19731973+ MOZ_ASSERT(NS_IsInCompositorThread());
19741974+ mSnapshotListener = std::move(listener);
1975- + UpdateDrawTarget(aClientSize);
19761975+ PeriodicSnapshot();
19771976+ }
19781977+
@@ -1989,7 +1988,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f
19891988 void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
19901989 if (RefPtr<CompositorVsyncDispatcher> cvd =
19911990 mWidget->GetCompositorVsyncDispatcher()) {
1992- @@ -29,6 +57,60 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1991+ @@ -29,6 +56,58 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
19931992 void HeadlessCompositorWidget::NotifyClientSizeChanged(
19941993 const LayoutDeviceIntSize& aClientSize) {
19951994 mClientSize = aClientSize;
@@ -2001,11 +2000,6 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f
20012000+
20022001+ void HeadlessCompositorWidget::UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize) {
20032002+ MOZ_ASSERT(NS_IsInCompositorThread());
2004- + if (!mSnapshotListener) {
2005- + mDrawTarget = nullptr;
2006- + return;
2007- + }
2008- +
20092003+ if (aClientSize.IsEmpty()) {
20102004+ mDrawTarget = nullptr;
20112005+ return;
@@ -2024,10 +2018,17 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f
20242018+ }
20252019+
20262020+ void HeadlessCompositorWidget::PeriodicSnapshot() {
2027- + if (!mDrawTarget )
2021+ + if (!mSnapshotListener )
20282022+ return;
20292023+
2030- + if (!mSnapshotListener)
2024+ + TakeSnapshot();
2025+ + NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
2026+ + "HeadlessCompositorWidget::PeriodicSnapshot", this,
2027+ + &HeadlessCompositorWidget::PeriodicSnapshot), 40);
2028+ + }
2029+ +
2030+ + void HeadlessCompositorWidget::TakeSnapshot() {
2031+ + if (!mDrawTarget)
20312032+ return;
20322033+
20332034+ RefPtr<gfx::SourceSurface> snapshot = mDrawTarget->Snapshot();
@@ -2043,15 +2044,11 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f
20432044+ }
20442045+
20452046+ mSnapshotListener(std::move(dataSurface));
2046- +
2047- + NS_DelayedDispatchToCurrentThread(NewRunnableMethod(
2048- + "HeadlessCompositorWidget::PeriodicSnapshot", this,
2049- + &HeadlessCompositorWidget::PeriodicSnapshot), 40);
20502047 }
20512048
20522049 LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
20532050diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
2054- index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..37b0320f3bde99ef7635c71452a3a4b75695bcc5 100644
2051+ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..b0e3572413f80e5bd125f777c3247b10b8521a73 100644
20552052--- a/widget/headless/HeadlessCompositorWidget.h
20562053+++ b/widget/headless/HeadlessCompositorWidget.h
20572054@@ -23,9 +23,13 @@ class HeadlessCompositorWidget final : public CompositorWidget,
@@ -2073,10 +2070,10 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..37b0320f3bde99ef7635c71452a3a4b7
20732070
20742071 private:
20752072+ void SetSnapshotListenerOnCompositorThread(
2076- + HeadlessWidget::SnapshotListener&& listener,
2077- + const LayoutDeviceIntSize& aClientSize);
2073+ + HeadlessWidget::SnapshotListener&& listener);
20782074+ void UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize);
20792075+ void PeriodicSnapshot();
2076+ + void TakeSnapshot();
20802077+
20812078 HeadlessWidget* mWidget;
20822079
0 commit comments