[xulrunner] Fix drop down window location

Christopher Aillon caillon at fedoraproject.org
Thu Jan 27 07:19:15 UTC 2011


commit ff1fc1adb24b2e31cd85ab0aaa6c3691988cf9aa
Author: Christopher Aillon <caillon at redhat.com>
Date:   Wed Jan 26 23:17:06 2011 -0800

    Fix drop down window location
    
    Fixes https://bugzilla.redhat.com/show_bug.cgi?id=672718
          https://bugzilla.mozilla.org/show_bug.cgi?id=628861
    
    See https://bugzilla.mozilla.org/show_bug.cgi?id=562138#c8

 revert-562138.patch |  290 +++++++++++++++++++++++++++++++++++++++++++++++++++
 xulrunner.spec      |    8 ++-
 2 files changed, 297 insertions(+), 1 deletions(-)
---
diff --git a/revert-562138.patch b/revert-562138.patch
new file mode 100644
index 0000000..cc97d00
--- /dev/null
+++ b/revert-562138.patch
@@ -0,0 +1,290 @@
+See https://bugzilla.mozilla.org/show_bug.cgi?id=562138#c8
+
+# HG changeset patch
+# User Markus Stange <mstange at themasta.com>
+# Date 1296111298 -3600
+# Node ID 433f39574cd72d30e47e6500fad52a0398753367
+# Parent  f948c56cb86f83354f0bd9d579cd51167464b4f2
+Backed out changeset f948c56cb86f (bug 562138 part 2) because it depends on changeset 44c42d8b8d08 which is going to be backed out.
+
+diff --git a/widget/src/cocoa/nsCocoaWindow.h b/widget/src/cocoa/nsCocoaWindow.h
+--- a/widget/src/cocoa/nsCocoaWindow.h
++++ b/widget/src/cocoa/nsCocoaWindow.h
+@@ -291,17 +291,16 @@ public:
+     NS_IMETHOD ResetInputState();
+     
+     NS_IMETHOD BeginSecureKeyboardInput();
+     NS_IMETHOD EndSecureKeyboardInput();
+ 
+     static void UnifiedShading(void* aInfo, const CGFloat* aIn, CGFloat* aOut);
+ 
+     void SetPopupWindowLevel();
+-    PRBool IsVisible();
+ 
+     PRBool IsChildInFailingLeftClickThrough(NSView *aChild);
+     PRBool ShouldFocusPlugin();
+ 
+     NS_IMETHOD         ReparentNativeWidget(nsIWidget* aNewParent);
+ protected:
+ 
+   nsresult             CreateNativeWindow(const NSRect &aRect,
+@@ -335,14 +334,13 @@ protected:
+   PRInt32              mShadowStyle;
+   NSUInteger           mWindowFilter;
+ 
+   PRPackedBool         mWindowMadeHere; // true if we created the window, false for embedding
+   PRPackedBool         mSheetNeedsShow; // if this is a sheet, are we waiting to be shown?
+                                         // this is used for sibling sheet contention only
+   PRPackedBool         mFullScreen;
+   PRPackedBool         mModal;
+-  PRPackedBool         mIsShowing;      // PR_TRUE during a Show(PR_TRUE) call.
+ 
+   PRInt32              mNumModalDescendents;
+ };
+ 
+ #endif // nsCocoaWindow_h_
+diff --git a/widget/src/cocoa/nsCocoaWindow.mm b/widget/src/cocoa/nsCocoaWindow.mm
+--- a/widget/src/cocoa/nsCocoaWindow.mm
++++ b/widget/src/cocoa/nsCocoaWindow.mm
+@@ -143,17 +143,16 @@ nsCocoaWindow::nsCocoaWindow()
+ , mSheetWindowParent(nil)
+ , mPopupContentView(nil)
+ , mShadowStyle(NS_STYLE_WINDOW_SHADOW_DEFAULT)
+ , mWindowFilter(0)
+ , mWindowMadeHere(PR_FALSE)
+ , mSheetNeedsShow(PR_FALSE)
+ , mFullScreen(PR_FALSE)
+ , mModal(PR_FALSE)
+-, mIsShowing(PR_FALSE)
+ , mNumModalDescendents(0)
+ {
+ 
+ }
+ 
+ void nsCocoaWindow::DestroyNativeWindow()
+ {
+   NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
+@@ -528,30 +527,24 @@ void* nsCocoaWindow::GetNativeData(PRUin
+       break;
+   }
+ 
+   return retVal;
+ 
+   NS_OBJC_END_TRY_ABORT_BLOCK_NSNULL;
+ }
+ 
+-PRBool
+-nsCocoaWindow::IsVisible()
+-{
+-  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_RETURN;
+-
+-  return [mWindow isVisible] || mSheetNeedsShow || mIsShowing;
+-
+-  NS_OBJC_END_TRY_ABORT_BLOCK_RETURN(PR_FALSE);
+-}
+-
+ NS_IMETHODIMP nsCocoaWindow::IsVisible(PRBool & aState)
+ {
+-  aState = IsVisible();
++  NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
++
++  aState = ([mWindow isVisible] || mSheetNeedsShow);
+   return NS_OK;
++
++  NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+ }
+ 
+ NS_IMETHODIMP nsCocoaWindow::SetModal(PRBool aState)
+ {
+   // This is used during startup (outside the event loop) when creating
+   // the add-ons compatibility checking dialog and the profile manager UI;
+   // therefore, it needs to provide an autorelease pool to avoid cocoa
+   // objects leaking.
+@@ -626,42 +619,29 @@ NS_IMETHODIMP nsCocoaWindow::SetModal(PR
+ 
+ // Hide or show this window
+ NS_IMETHODIMP nsCocoaWindow::Show(PRBool bState)
+ {
+   NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
+ 
+   // We need to re-execute sometimes in order to bring already-visible
+   // windows forward.
+-  if (!bState && !IsVisible())
++  if (!mSheetNeedsShow && !bState && ![mWindow isVisible])
+     return NS_OK;
+ 
+   nsIWidget* parentWidget = mParent;
+   nsCOMPtr<nsPIWidgetCocoa> piParentWidget(do_QueryInterface(parentWidget));
+   NSWindow* nativeParentWindow = (parentWidget) ?
+     (NSWindow*)parentWidget->GetNativeData(NS_NATIVE_WINDOW) : nil;
+ 
+   if (bState && !mBounds.IsEmpty()) {
+-    // IsVisible can be entered from inside this method, for example through
+-    // synchronous painting. Unfortunately, at that point [mWindow isVisible]
+-    // still returns NO, so we use mIsShowing to tell us that we should return
+-    // true from IsVisible anyway.
+-    mIsShowing = PR_TRUE;
+-
+-    if (mPopupContentView) {
+-      // Ensure our content view is visible. We never need to hide it.
+-      mPopupContentView->Show(PR_TRUE);
+-    }
+-
+     if (mWindowType == eWindowType_sheet) {
+       // bail if no parent window (its basically what we do in Carbon)
+-      if (!nativeParentWindow || !piParentWidget) {
+-        mIsShowing = PR_FALSE;
++      if (!nativeParentWindow || !piParentWidget)
+         return NS_ERROR_FAILURE;
+-      }
+ 
+       NSWindow* topNonSheetWindow = nativeParentWindow;
+       
+       // If this sheet is the child of another sheet, hide the parent so that
+       // this sheet can be displayed. Leave the parent mSheetNeedsShow alone,
+       // that is only used to handle sibling sheet contention. The parent will
+       // return once there are no more child sheets.
+       PRBool parentIsSheet = PR_FALSE;
+@@ -744,17 +724,16 @@ NS_IMETHODIMP nsCocoaWindow::Show(PRBool
+     }
+     else {
+       [mWindow setAcceptsMouseMovedEvents:YES];
+       NS_OBJC_BEGIN_TRY_LOGONLY_BLOCK;
+       [mWindow makeKeyAndOrderFront:nil];
+       NS_OBJC_END_TRY_LOGONLY_BLOCK;
+       SendSetZLevelEvent();
+     }
+-    mIsShowing = PR_FALSE;
+   }
+   else {
+     // roll up any popups if a top-level window is going away
+     if (mWindowType == eWindowType_toplevel || mWindowType == eWindowType_dialog)
+       RollUpPopups();
+ 
+     // now get rid of the window/sheet
+     if (mWindowType == eWindowType_sheet) {
+@@ -850,16 +829,19 @@ NS_IMETHODIMP nsCocoaWindow::Show(PRBool
+       if ([mWindow isKindOfClass:[PopupWindow class]] &&
+           [(PopupWindow*) mWindow isContextMenu]) {
+         [[NSDistributedNotificationCenter defaultCenter]
+           postNotificationName:@"com.apple.HIToolbox.endMenuTrackingNotification"
+                         object:@"org.mozilla.gecko.PopupWindow"];
+       }
+     }
+   }
++  
++  if (mPopupContentView)
++      mPopupContentView->Show(bState);
+ 
+   return NS_OK;
+ 
+   NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
+ }
+ 
+ struct ShadowParams {
+   float standardDeviation;
+
+
+# HG changeset patch
+# User Markus Stange <mstange at themasta.com>
+# Date 1296111382 -3600
+# Node ID 2cfc443d28ee87835e17b665d41be3a6fb0dca23
+# Parent  44c42d8b8d087ed22c02ffe90f7d23f84ee8abbb
+Backed out changeset 44c42d8b8d08 (bug 562138 part 1) because it caused bug 627824 and bug 628861.
+
+diff --git a/view/src/nsView.cpp b/view/src/nsView.cpp
+--- a/view/src/nsView.cpp
++++ b/view/src/nsView.cpp
+@@ -433,63 +433,51 @@ nsIntRect nsIView::CalcWidgetBounds(nsWi
+ void nsView::DoResetWidgetBounds(PRBool aMoveOnly,
+                                  PRBool aInvalidateChangedSize) {
+   // The geometry of a root view's widget is controlled externally,
+   // NOT by sizing or positioning the view
+   if (mViewManager->GetRootView() == this) {
+     return;
+   }
+   
+-  NS_PRECONDITION(mWindow, "Why was this called??");
+-
+   nsIntRect curBounds;
+   mWindow->GetBounds(curBounds);
+ 
+   nsWindowType type;
+   mWindow->GetWindowType(type);
+ 
+   if (curBounds.IsEmpty() && mDimBounds.IsEmpty() && type == eWindowType_popup) {
+     // Don't manipulate empty popup widgets. For example there's no point
+     // moving hidden comboboxes around, or doing X server roundtrips
+     // to compute their true screen position. This could mean that WidgetToScreen
+     // operations on these widgets don't return up-to-date values, but popup
+     // positions aren't reliable anyway because of correction to be on or off-screen.
+     return;
+   }
+ 
++  NS_PRECONDITION(mWindow, "Why was this called??");
++
+   nsIntRect newBounds = CalcWidgetBounds(type);
+ 
+   PRBool changedPos = curBounds.TopLeft() != newBounds.TopLeft();
+   PRBool changedSize = curBounds.Size() != newBounds.Size();
+ 
+-  PRBool curVisibility;
+-  mWindow->IsVisible(curVisibility);
+-  PRBool newVisibility = IsEffectivelyVisible();
+-
+-  if (curVisibility && !newVisibility) {
+-    mWindow->Show(PR_FALSE);
+-  }
+-
+   // Child views are never attached to top level widgets, this is safe.
+   if (changedPos) {
+     if (changedSize && !aMoveOnly) {
+       mWindow->Resize(newBounds.x, newBounds.y, newBounds.width, newBounds.height,
+                       aInvalidateChangedSize);
+     } else {
+       mWindow->Move(newBounds.x, newBounds.y);
+     }
+   } else {
+     if (changedSize && !aMoveOnly) {
+       mWindow->Resize(newBounds.width, newBounds.height, aInvalidateChangedSize);
+     } // else do nothing!
+   }
+-
+-  if (!curVisibility && newVisibility) {
+-    mWindow->Show(PR_TRUE);
+-  }
+ }
+ 
+ void nsView::SetDimensions(const nsRect& aRect, PRBool aPaint, PRBool aResizeWidget)
+ {
+   nsRect dims = aRect;
+   dims.MoveBy(mPosX, mPosY);
+ 
+   // Don't use nsRect's operator== here, since it returns true when
+@@ -511,17 +499,23 @@ void nsView::NotifyEffectiveVisibilityCh
+ {
+   if (!aEffectivelyVisible)
+   {
+     DropMouseGrabbing();
+   }
+ 
+   if (nsnull != mWindow)
+   {
+-    ResetWidgetBounds(PR_FALSE, PR_TRUE, PR_FALSE);
++    if (aEffectivelyVisible)
++    {
++      DoResetWidgetBounds(PR_FALSE, PR_TRUE);
++      mWindow->Show(PR_TRUE);
++    }
++    else
++      mWindow->Show(PR_FALSE);
+   }
+ 
+   for (nsView* child = mFirstChild; child; child = child->mNextSibling) {
+     if (child->mVis == nsViewVisibility_kHide) {
+       // It was effectively hidden and still is
+       continue;
+     }
+     // Our child is visible if we are
+
+
diff --git a/xulrunner.spec b/xulrunner.spec
index 9fcdab8..18e8c3c 100644
--- a/xulrunner.spec
+++ b/xulrunner.spec
@@ -30,7 +30,7 @@
 Summary:        XUL Runtime for Gecko Applications
 Name:           xulrunner
 Version:        2.0
-Release:        0.17%{?pretag}%{?dist}
+Release:        0.18%{?pretag}%{?dist}
 URL:            http://developer.mozilla.org/En/XULRunner
 License:        MPLv1.1 or GPLv2+ or LGPLv2+
 Group:          Applications/Internet
@@ -62,6 +62,7 @@ Patch23:        wmclass.patch
 Patch24:        crashreporter-remove-static.patch
 
 # Upstream patches
+Patch30:        revert-562138.patch
 
 # ---------------------------------------------------
 
@@ -167,6 +168,8 @@ sed -e 's/__RPM_VERSION_INTERNAL__/%{version_internal}/' %{P:%%PATCH0} \
 %patch23 -p1 -b .wmclass
 %patch24 -p1 -b .static
 
+%patch30 -p1 -b .revert-562138
+
 # For xulrunner-2.0-system-cairo-tee.patch
 autoconf-2.13
 
@@ -477,6 +480,9 @@ fi
 #---------------------------------------------------------------------
 
 %changelog
+* Wed Jan 26 2011 Christopher Aillon <caillon at redhat.com> - 2.0-0.18
+- Fix issue with popup windows showing in the wrong place
+
 * Tue Jan 25 2011 Christopher Aillon <caillon at redhat.com> - 2.0-0.17
 - Update to 2.0 Beta 10
 


More information about the scm-commits mailing list