Bug 1447775 - Change persist mode immediately after sizemodechange change, r?jimm draft
authorMartin Stransky <stransky@redhat.com>
Thu, 12 Apr 2018 11:36:00 +0200
changeset 780963 6654f42bc0e615e3fd2328d23b4a2283cad9ad45
parent 779089 b4bc6b2401738b78fd47127a4c716bb9178e1a09
push id106172
push userstransky@redhat.com
push dateThu, 12 Apr 2018 09:51:11 +0000
reviewersjimm
bugs1447775
milestone61.0a1
Bug 1447775 - Change persist mode immediately after sizemodechange change, r?jimm Recently the window sizemode attribute is updated with 500ms delay (on Linux). It causes race condition between reflow/CSS rule and window resize callbacks and also causes visual glitch when toolbar dragspace is enabled. TabsToolbar height is used at resize callback to do dragspace calculation. It has old values here because it depends on 'window[sizemode="normal"] #TabsToolbar' css rule which is applied with 500ms delay. So we use old TabsToolbar height for the dragspace, then the sizemode us updated by PersistenceTimer and a new TabsToolbar height is calculated but the dragspace size stays as we're not notified about the TabsToolbar height update. MozReview-Commit-ID: AiensY5LMDO
xpfe/appshell/nsWebShellWindow.cpp
--- a/xpfe/appshell/nsWebShellWindow.cpp
+++ b/xpfe/appshell/nsWebShellWindow.cpp
@@ -350,20 +350,16 @@ nsWebShellWindow::SizeModeChanged(nsSize
   if (sizeMode == nsSizeMode_Maximized || sizeMode == nsSizeMode_Fullscreen) {
     uint32_t zLevel;
     GetZLevel(&zLevel);
     if (zLevel > nsIXULWindow::normalZ)
       SetZLevel(nsIXULWindow::normalZ);
   }
   mWindow->SetSizeMode(sizeMode);
 
-  // Persist mode, but not immediately, because in many (all?)
-  // cases this will merge with the similar call in NS_SIZE and
-  // write the attribute values only once.
-  SetPersistenceTimer(PAD_MISC);
   nsCOMPtr<nsPIDOMWindowOuter> ourWindow =
     mDocShell ? mDocShell->GetWindow() : nullptr;
   if (ourWindow) {
     // Ensure that the fullscreen state is synchronized between
     // the widget and the outer window object.
     if (sizeMode == nsSizeMode_Fullscreen) {
       ourWindow->SetFullScreen(true);
     }
@@ -384,16 +380,22 @@ nsWebShellWindow::SizeModeChanged(nsSize
     ourWindow->DispatchCustomEvent(NS_LITERAL_STRING("sizemodechange"));
   }
 
   nsIPresShell* presShell;
   if ((presShell = GetPresShell())) {
     presShell->GetPresContext()->SizeModeChanged(sizeMode);
   }
 
+  // Persist mode immediately as the timer causes race condition
+  // between css rules dependent on window sizemode and
+  // sizemodechange/resize listener which calculates TabsToolbar height.
+  PersistentAttributesDirty(PAD_MISC);
+  SavePersistentAttributes();
+
   // Note the current implementation of SetSizeMode just stores
   // the new state; it doesn't actually resize. So here we store
   // the state and pass the event on to the OS. The day is coming
   // when we'll handle the event here, and the return result will
   // then need to be different.
 }
 
 void