Skip to content

Commit 6db8962

Browse files
authored
browser(firefox): smooth resize in headless (#3043)
1 parent 23f506b commit 6db8962

File tree

2 files changed

+30
-18
lines changed

2 files changed

+30
-18
lines changed

browser_patches/firefox/BUILD_NUMBER

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1132
2-
Changed: [email protected] Mon Jul 20 10:26:17 PDT 2020
1+
1133
2+
Changed: [email protected] Mon Jul 20 14:11:12 PDT 2020

browser_patches/firefox/patches/bootstrap.diff

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,7 +1837,7 @@ index 7d7ef5a5f9e6c092e643eb5c3feef239e90c0bb2..7c975244f26b3c2ec20d8174e5d84fc9
18371837
return new AndroidCompositorWidget(aOptions,
18381838
static_cast<nsBaseWidget*>(aWidget));
18391839
diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
1840-
index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823cd01d6001 100644
1840+
index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f5e4ccdd5 100644
18411841
--- a/widget/headless/HeadlessCompositorWidget.cpp
18421842
+++ b/widget/headless/HeadlessCompositorWidget.cpp
18431843
@@ -3,6 +3,7 @@
@@ -1848,23 +1848,24 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
18481848
#include "mozilla/widget/PlatformWidgetTypes.h"
18491849
#include "HeadlessCompositorWidget.h"
18501850
#include "VsyncDispatcher.h"
1851-
@@ -17,6 +18,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1851+
@@ -17,6 +18,33 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
18521852
mClientSize = aInitData.InitialClientSize();
18531853
}
18541854

18551855
+void HeadlessCompositorWidget::SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener) {
18561856
+ MOZ_ASSERT(NS_IsMainThread());
18571857
+
1858-
+ layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&>(
1858+
+ layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&, LayoutDeviceIntSize>(
18591859
+ "HeadlessCompositorWidget::SetSnapshotListener", this,
18601860
+ &HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread,
1861-
+ std::move(listener)));
1861+
+ std::move(listener), mClientSize));
18621862
+}
18631863
+
1864-
+void HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener) {
1864+
+void HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread(
1865+
+ HeadlessWidget::SnapshotListener&& listener, const LayoutDeviceIntSize& aClientSize) {
18651866
+ MOZ_ASSERT(NS_IsInCompositorThread());
18661867
+ mSnapshotListener = std::move(listener);
1867-
+ UpdateDrawTarget();
1868+
+ UpdateDrawTarget(aClientSize);
18681869
+ PeriodicSnapshot();
18691870
+}
18701871
+
@@ -1881,29 +1882,38 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
18811882
void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
18821883
if (RefPtr<CompositorVsyncDispatcher> cvd =
18831884
mWidget->GetCompositorVsyncDispatcher()) {
1884-
@@ -29,6 +56,51 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1885+
@@ -29,6 +57,60 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
18851886
void HeadlessCompositorWidget::NotifyClientSizeChanged(
18861887
const LayoutDeviceIntSize& aClientSize) {
18871888
mClientSize = aClientSize;
1888-
+ UpdateDrawTarget();
1889+
+ layers::CompositorThread()->Dispatch(NewRunnableMethod<LayoutDeviceIntSize>(
1890+
+ "HeadlessCompositorWidget::UpdateDrawTarget", this,
1891+
+ &HeadlessCompositorWidget::UpdateDrawTarget,
1892+
+ aClientSize));
18891893
+}
18901894
+
1891-
+void HeadlessCompositorWidget::UpdateDrawTarget() {
1895+
+void HeadlessCompositorWidget::UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize) {
1896+
+ MOZ_ASSERT(NS_IsInCompositorThread());
18921897
+ if (!mSnapshotListener) {
18931898
+ mDrawTarget = nullptr;
18941899
+ return;
18951900
+ }
18961901
+
1897-
+ if (mClientSize.IsEmpty()) {
1902+
+ if (aClientSize.IsEmpty()) {
18981903
+ mDrawTarget = nullptr;
18991904
+ return;
19001905
+ }
19011906
+
1907+
+ RefPtr<gfx::DrawTarget> old = std::move(mDrawTarget);
19021908
+ gfx::SurfaceFormat format = gfx::SurfaceFormat::B8G8R8A8;
1903-
+ gfx::IntSize size = mClientSize.ToUnknownSize();
1904-
+ // TODO: this is called on Main thread, while Start/End drawing are on Compositor thread.
1909+
+ gfx::IntSize size = aClientSize.ToUnknownSize();
19051910
+ mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
19061911
+ mozilla::gfx::BackendType::SKIA, size, format);
1912+
+ if (old) {
1913+
+ RefPtr<gfx::SourceSurface> snapshot = old->Snapshot();
1914+
+ if (snapshot)
1915+
+ mDrawTarget->CopySurface(snapshot.get(), old->GetRect(), gfx::IntPoint(0, 0));
1916+
+ }
19071917
+}
19081918
+
19091919
+void HeadlessCompositorWidget::PeriodicSnapshot() {
@@ -1934,7 +1944,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
19341944

19351945
LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
19361946
diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
1937-
index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505fcc40e13 100644
1947+
index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..37b0320f3bde99ef7635c71452a3a4b75695bcc5 100644
19381948
--- a/widget/headless/HeadlessCompositorWidget.h
19391949
+++ b/widget/headless/HeadlessCompositorWidget.h
19401950
@@ -23,9 +23,13 @@ class HeadlessCompositorWidget final : public CompositorWidget,
@@ -1951,12 +1961,14 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505
19511961
uintptr_t GetWidgetKey() override;
19521962

19531963
LayoutDeviceIntSize GetClientSize() override;
1954-
@@ -42,9 +46,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1964+
@@ -42,9 +46,18 @@ class HeadlessCompositorWidget final : public CompositorWidget,
19551965
}
19561966

19571967
private:
1958-
+ void SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener);
1959-
+ void UpdateDrawTarget();
1968+
+ void SetSnapshotListenerOnCompositorThread(
1969+
+ HeadlessWidget::SnapshotListener&& listener,
1970+
+ const LayoutDeviceIntSize& aClientSize);
1971+
+ void UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize);
19601972
+ void PeriodicSnapshot();
19611973
+
19621974
HeadlessWidget* mWidget;

0 commit comments

Comments
 (0)