Bug 1332040 - Dispatch resize after fullscreen transistion for headless. r?jrmuizel draft
authorBrendan Dahl <bdahl@mozilla.com>
Sun, 20 May 2018 17:00:57 -0700
changeset 798369 1c9aabd79e54718bedcebd64b7f61dc3889e7046
parent 796393 24bae072acb09114c367e6b9ffde9261b2ad8a58
push id110739
push userbmo:bdahl@mozilla.com
push dateTue, 22 May 2018 18:59:00 +0000
reviewersjrmuizel
bugs1332040
milestone62.0a1
Bug 1332040 - Dispatch resize after fullscreen transistion for headless. r?jrmuizel MozReview-Commit-ID: Lo17bhJsnww
widget/headless/HeadlessWidget.cpp
--- a/widget/headless/HeadlessWidget.cpp
+++ b/widget/headless/HeadlessWidget.cpp
@@ -412,23 +412,36 @@ HeadlessWidget::MakeFullScreen(bool aFul
     if (mSizeMode != nsSizeMode_Fullscreen) {
       mLastSizeMode = mSizeMode;
     }
     mSizeMode = nsSizeMode_Fullscreen;
   } else {
     mSizeMode = mLastSizeMode;
   }
 
-  nsBaseWidget::InfallibleMakeFullScreen(aFullScreen, aTargetScreen);
-
+  // Notify the listener first so size mode change events are triggered before
+  // resize events.
   if (mWidgetListener) {
     mWidgetListener->SizeModeChanged(mSizeMode);
     mWidgetListener->FullscreenChanged(aFullScreen);
   }
 
+  // Real widget backends don't seem to follow a common approach for
+  // when and how many resize events are triggered during fullscreen
+  // transitions. InfallibleMakeFullScreen will trigger a resize, but it
+  // will be ignored if still transitioning to fullscreen, so it must be
+  // triggered on the next tick.
+  RefPtr<HeadlessWidget> self(this);
+  nsCOMPtr<nsIScreen> targetScreen(aTargetScreen);
+  NS_DispatchToCurrentThread(NS_NewRunnableFunction(
+    "HeadlessWidget::MakeFullScreen",
+    [self, targetScreen, aFullScreen]() -> void {
+      self->InfallibleMakeFullScreen(aFullScreen, targetScreen);
+    }));
+
   return NS_OK;
 }
 
 nsresult
 HeadlessWidget::AttachNativeKeyEvent(WidgetKeyboardEvent& aEvent)
 {
   HeadlessKeyBindings& bindings = HeadlessKeyBindings::GetInstance();
   return bindings.AttachNativeKeyEvent(aEvent);