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
+
+
+
+
+ Mozilla 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)