From 584b8d9e8a6e62654d6a68b47b6415cbd6e7642d Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Wed, 17 Nov 2010 08:46:00 -0500 Subject: [PATCH] Bug 602962 - Undo close tab thumbnail disappears when rotating screen orientation [r=smaug r=roc a=blocking-fennecb3] --- content/base/src/nsContentUtils.cpp | 1 + content/base/src/nsGkAtomList.h | 1 + content/events/src/nsDOMEvent.cpp | 3 + content/events/src/nsDOMEvent.h | 1 + content/events/test/Makefile.in | 2 + content/events/test/bug602962.xul | 8 +++ content/events/test/test_bug602962.xul | 94 ++++++++++++++++++++++++++ layout/base/nsPresShell.cpp | 22 ++++++ widget/public/nsGUIEvent.h | 3 + 9 files changed, 135 insertions(+) create mode 100644 content/events/test/bug602962.xul create mode 100644 content/events/test/test_bug602962.xul diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 031462e3d72d..c773189fb77f 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -592,6 +592,7 @@ nsContentUtils::InitializeEventTable() { { nsGkAtoms::onpageshow, NS_PAGE_SHOW, EventNameType_HTML, NS_EVENT }, { nsGkAtoms::onpagehide, NS_PAGE_HIDE, EventNameType_HTML, NS_EVENT }, + { nsGkAtoms::onMozBeforeResize, NS_BEFORERESIZE_EVENT, EventNameType_None, NS_EVENT }, { nsGkAtoms::onresize, NS_RESIZE_EVENT, (EventNameType_HTMLXUL | EventNameType_SVGSVG), NS_EVENT }, { nsGkAtoms::onscroll, NS_SCROLL_EVENT, diff --git a/content/base/src/nsGkAtomList.h b/content/base/src/nsGkAtomList.h index e3e36306d1b5..7fe052fdb8b8 100644 --- a/content/base/src/nsGkAtomList.h +++ b/content/base/src/nsGkAtomList.h @@ -709,6 +709,7 @@ GK_ATOM(onpopupshown, "onpopupshown") GK_ATOM(onreadystatechange, "onreadystatechange") GK_ATOM(onRequest, "onRequest") GK_ATOM(onreset, "onreset") +GK_ATOM(onMozBeforeResize, "onMozBeforeResize") GK_ATOM(onresize, "onresize") GK_ATOM(onscroll, "onscroll") GK_ATOM(onselect, "onselect") diff --git a/content/events/src/nsDOMEvent.cpp b/content/events/src/nsDOMEvent.cpp index 929b15309aa5..50fcd7655404 100644 --- a/content/events/src/nsDOMEvent.cpp +++ b/content/events/src/nsDOMEvent.cpp @@ -93,6 +93,7 @@ static const char* const sEventNames[] = { #endif // MOZ_MEDIA "MozAfterPaint", "MozBeforePaint", + "MozBeforeResize", "MozSwipeGesture", "MozMagnifyGestureStart", "MozMagnifyGestureUpdate", @@ -1316,6 +1317,8 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType) return sEventNames[eDOMEvents_afterpaint]; case NS_BEFOREPAINT: return sEventNames[eDOMEvents_beforepaint]; + case NS_BEFORERESIZE_EVENT: + return sEventNames[eDOMEvents_beforeresize]; case NS_SIMPLE_GESTURE_SWIPE: return sEventNames[eDOMEvents_MozSwipeGesture]; case NS_SIMPLE_GESTURE_MAGNIFY_START: diff --git a/content/events/src/nsDOMEvent.h b/content/events/src/nsDOMEvent.h index 70f1759a2eae..39621e8c86a6 100644 --- a/content/events/src/nsDOMEvent.h +++ b/content/events/src/nsDOMEvent.h @@ -175,6 +175,7 @@ public: #endif eDOMEvents_afterpaint, eDOMEvents_beforepaint, + eDOMEvents_beforeresize, eDOMEvents_MozSwipeGesture, eDOMEvents_MozMagnifyGestureStart, eDOMEvents_MozMagnifyGestureUpdate, diff --git a/content/events/test/Makefile.in b/content/events/test/Makefile.in index 382397ecb49f..65b8652a0388 100644 --- a/content/events/test/Makefile.in +++ b/content/events/test/Makefile.in @@ -110,6 +110,8 @@ _CHROME_FILES = \ test_bug415498.xul \ bug415498-doc1.html \ bug415498-doc2.html \ + bug602962.xul \ + test_bug602962.xul \ $(NULL) libs:: $(_TEST_FILES) diff --git a/content/events/test/bug602962.xul b/content/events/test/bug602962.xul new file mode 100644 index 000000000000..0d54b7ad5260 --- /dev/null +++ b/content/events/test/bug602962.xul @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/content/events/test/test_bug602962.xul b/content/events/test/test_bug602962.xul new file mode 100644 index 000000000000..b74c6ad0f957 --- /dev/null +++ b/content/events/test/test_bug602962.xul @@ -0,0 +1,94 @@ + + + + + + + Test for Bug 602962 + + + diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 2b97518d0ba9..5249ac358f78 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -1355,6 +1355,7 @@ private: nsIWidget *aRootWidget); void FireResizeEvent(); + void FireBeforeResizeEvent(); static void AsyncResizeEventCallback(nsITimer* aTimer, void* aPresShell); nsRevocableEventPtr > mResizeEvent; nsCOMPtr mAsyncResizeEventTimer; @@ -2830,6 +2831,11 @@ PresShell::ResizeReflowIgnoreOverride(nscoord aWidth, nscoord aHeight) return NS_ERROR_NOT_AVAILABLE; } + if (!mIsDestroying && !mResizeEvent.IsPending() && + !mAsyncResizeTimerIsActive) { + FireBeforeResizeEvent(); + } + mPresContext->SetVisibleArea(nsRect(0, 0, aWidth, aHeight)); // There isn't anything useful we can do if the initial reflow hasn't happened @@ -2905,6 +2911,22 @@ PresShell::ResizeReflowIgnoreOverride(nscoord aWidth, nscoord aHeight) return NS_OK; //XXX this needs to be real. MMP } +void +PresShell::FireBeforeResizeEvent() +{ + if (mIsDocumentGone) + return; + + // Send beforeresize event from here. + nsEvent event(PR_TRUE, NS_BEFORERESIZE_EVENT); + + nsPIDOMWindow *window = mDocument->GetWindow(); + if (window) { + nsCOMPtr kungFuDeathGrip(this); + nsEventDispatcher::Dispatch(window, mPresContext, &event); + } +} + void PresShell::FireResizeEvent() { diff --git a/widget/public/nsGUIEvent.h b/widget/public/nsGUIEvent.h index 1d6cf0e82dc7..ec3c87b5089b 100644 --- a/widget/public/nsGUIEvent.h +++ b/widget/public/nsGUIEvent.h @@ -236,6 +236,9 @@ class nsHashKey; #define NS_OFFLINE (NS_WINDOW_START + 64) #define NS_ONLINE (NS_WINDOW_START + 65) +// Indicates a resize will occur +#define NS_BEFORERESIZE_EVENT (NS_WINDOW_START + 66) + #define NS_MOUSE_MESSAGE_START 300 #define NS_MOUSE_MOVE (NS_MOUSE_MESSAGE_START) #define NS_MOUSE_BUTTON_UP (NS_MOUSE_MESSAGE_START + 1)