Bug 1270753 part 2 - Clean up corresponding old window size when the DOMWindowUtils is destroyed. r?smaug
MozReview-Commit-ID: 3l3jeP4NWZ3
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -118,16 +118,61 @@ using namespace mozilla;
using namespace mozilla::dom;
using namespace mozilla::ipc;
using namespace mozilla::layers;
using namespace mozilla::widget;
using namespace mozilla::gfx;
class gfxContext;
+class OldWindowSize : public LinkedListElement<OldWindowSize>
+{
+public:
+ static void Set(nsIWeakReference* aWindowRef, const nsSize& aSize)
+ {
+ OldWindowSize* item = GetItem(aWindowRef);
+ if (item) {
+ item->mSize = aSize;
+ } else {
+ item = new OldWindowSize(aWindowRef, aSize);
+ sList.insertBack(item);
+ }
+ }
+
+ static nsSize GetAndRemove(nsIWeakReference* aWindowRef)
+ {
+ nsSize result;
+ if (OldWindowSize* item = GetItem(aWindowRef)) {
+ result = item->mSize;
+ delete item;
+ }
+ return result;
+ }
+
+private:
+ explicit OldWindowSize(nsIWeakReference* aWindowRef, const nsSize& aSize)
+ : mWindowRef(aWindowRef), mSize(aSize) { }
+ ~OldWindowSize() { };
+
+ static OldWindowSize* GetItem(nsIWeakReference* aWindowRef)
+ {
+ OldWindowSize* item = sList.getFirst();
+ while (item && item->mWindowRef != aWindowRef) {
+ item = item->getNext();
+ }
+ return item;
+ }
+
+ static LinkedList<OldWindowSize> sList;
+ nsWeakPtr mWindowRef;
+ nsSize mSize;
+};
+
+LinkedList<OldWindowSize> OldWindowSize::sList;
+
NS_INTERFACE_MAP_BEGIN(nsDOMWindowUtils)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMWindowUtils)
NS_INTERFACE_MAP_ENTRY(nsIDOMWindowUtils)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
NS_INTERFACE_MAP_END
NS_IMPL_ADDREF(nsDOMWindowUtils)
NS_IMPL_RELEASE(nsDOMWindowUtils)
@@ -136,16 +181,17 @@ nsDOMWindowUtils::nsDOMWindowUtils(nsGlo
{
nsCOMPtr<nsISupports> supports = do_QueryObject(aWindow);
mWindow = do_GetWeakReference(supports);
NS_ASSERTION(aWindow->IsOuterWindow(), "How did that happen?");
}
nsDOMWindowUtils::~nsDOMWindowUtils()
{
+ OldWindowSize::GetAndRemove(mWindow);
}
nsIPresShell*
nsDOMWindowUtils::GetPresShell()
{
nsCOMPtr<nsPIDOMWindowOuter> window = do_QueryReferent(mWindow);
if (!window)
return nullptr;
@@ -3099,61 +3145,16 @@ PrepareForFullscreenChange(nsIPresShell*
if (aOldSize) {
viewManager->GetWindowDimensions(&aOldSize->width, &aOldSize->height);
}
viewManager->SetWindowDimensions(aSize.width, aSize.height);
}
}
}
-class OldWindowSize : public LinkedListElement<OldWindowSize>
-{
-public:
- static void Set(nsIWeakReference* aWindowRef, const nsSize& aSize)
- {
- OldWindowSize* item = GetItem(aWindowRef);
- if (item) {
- item->mSize = aSize;
- } else {
- item = new OldWindowSize(aWindowRef, aSize);
- sList.insertBack(item);
- }
- }
-
- static nsSize GetAndRemove(nsIWeakReference* aWindowRef)
- {
- nsSize result;
- if (OldWindowSize* item = GetItem(aWindowRef)) {
- result = item->mSize;
- delete item;
- }
- return result;
- }
-
-private:
- explicit OldWindowSize(nsIWeakReference* aWindowRef, const nsSize& aSize)
- : mWindowRef(aWindowRef), mSize(aSize) { }
- ~OldWindowSize() { };
-
- static OldWindowSize* GetItem(nsIWeakReference* aWindowRef)
- {
- OldWindowSize* item = sList.getFirst();
- while (item && item->mWindowRef != aWindowRef) {
- item = item->getNext();
- }
- return item;
- }
-
- static LinkedList<OldWindowSize> sList;
- nsWeakPtr mWindowRef;
- nsSize mSize;
-};
-
-LinkedList<OldWindowSize> OldWindowSize::sList;
-
NS_IMETHODIMP
nsDOMWindowUtils::HandleFullscreenRequests(bool* aRetVal)
{
PROFILER_MARKER("Enter fullscreen");
nsCOMPtr<nsIDocument> doc = GetDocument();
NS_ENSURE_STATE(doc);
// Notify the pres shell that we are starting fullscreen change, and