[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