Title: [119219] trunk/Source/WebCore
Revision
119219
Author
[email protected]
Date
2012-06-01 05:30:09 -0700 (Fri, 01 Jun 2012)

Log Message

Frame::willDetachPage() shouldn't be called more than once.
https://bugs.webkit.org/show_bug.cgi?id=88056

Reviewed by Ryosuke Niwa.

This change moved willDetachPage() to private and calls it from
detachFromParent().  Also, it checks m_page and call
willDetachPage() only once, if m_page is available.

No new tests. Covered by existing suites.

* loader/FrameLoader.cpp:
(WebCore::FrameLoader::closeAndRemoveChild):
(WebCore::FrameLoader::detachFromParent):
* page/Frame.cpp:
(WebCore::Frame::detachFromPage):
(WebCore):
(WebCore::Frame::willDetachPage):
* page/Frame.h:
(Frame):
* page/Page.cpp:
(WebCore::Page::~Page):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (119218 => 119219)


--- trunk/Source/WebCore/ChangeLog	2012-06-01 12:26:49 UTC (rev 119218)
+++ trunk/Source/WebCore/ChangeLog	2012-06-01 12:30:09 UTC (rev 119219)
@@ -1,3 +1,28 @@
+2012-06-01  MORITA Hajime  <[email protected]>
+
+        Frame::willDetachPage() shouldn't be called more than once.
+        https://bugs.webkit.org/show_bug.cgi?id=88056
+
+        Reviewed by Ryosuke Niwa.
+
+        This change moved willDetachPage() to private and calls it from
+        detachFromParent().  Also, it checks m_page and call
+        willDetachPage() only once, if m_page is available.
+
+        No new tests. Covered by existing suites.
+
+        * loader/FrameLoader.cpp:
+        (WebCore::FrameLoader::closeAndRemoveChild):
+        (WebCore::FrameLoader::detachFromParent):
+        * page/Frame.cpp:
+        (WebCore::Frame::detachFromPage):
+        (WebCore):
+        (WebCore::Frame::willDetachPage):
+        * page/Frame.h:
+        (Frame):
+        * page/Page.cpp:
+        (WebCore::Page::~Page):
+
 2012-06-01  Pierre Rossi  <[email protected]>
 
         [Qt] Support drawing a pattern with a translation.

Modified: trunk/Source/WebCore/loader/FrameLoader.cpp (119218 => 119219)


--- trunk/Source/WebCore/loader/FrameLoader.cpp	2012-06-01 12:26:49 UTC (rev 119218)
+++ trunk/Source/WebCore/loader/FrameLoader.cpp	2012-06-01 12:30:09 UTC (rev 119219)
@@ -2266,7 +2266,6 @@
     child->setView(0);
     if (child->ownerElement() && child->page())
         child->page()->decrementFrameCount();
-    child->willDetachPage();
     child->detachFromPage();
 
     m_frame->tree()->removeChild(child);
@@ -2345,7 +2344,6 @@
         parent->loader()->scheduleCheckCompleted();
     } else {
         m_frame->setView(0);
-        m_frame->willDetachPage();
         m_frame->detachFromPage();
     }
 }

Modified: trunk/Source/WebCore/page/Frame.cpp (119218 => 119219)


--- trunk/Source/WebCore/page/Frame.cpp	2012-06-01 12:26:49 UTC (rev 119218)
+++ trunk/Source/WebCore/page/Frame.cpp	2012-06-01 12:30:09 UTC (rev 119219)
@@ -689,18 +689,23 @@
     return m_domWindow.get();
 }
 
-void Frame::willDetachPage()
+void Frame::detachFromPage()
 {
     if (Frame* parent = tree()->parent())
         parent->loader()->checkLoadComplete();
+    if (m_page)
+        willDetachPage();
+    m_page = 0;
+}
 
+
+void Frame::willDetachPage()
+{
     HashSet<FrameDestructionObserver*>::iterator stop = m_destructionObservers.end();
     for (HashSet<FrameDestructionObserver*>::iterator it = m_destructionObservers.begin(); it != stop; ++it)
         (*it)->willDetachPage();
 
-    // FIXME: It's unclear as to why this is called more than once, but it is,
-    // so page() could be NULL.
-    if (page() && page()->focusController()->focusedFrame() == this)
+    if (page()->focusController()->focusedFrame() == this)
         page()->focusController()->setFocusedFrame(0);
 
     script()->clearScriptObjects();

Modified: trunk/Source/WebCore/page/Frame.h (119218 => 119219)


--- trunk/Source/WebCore/page/Frame.h	2012-06-01 12:26:49 UTC (rev 119218)
+++ trunk/Source/WebCore/page/Frame.h	2012-06-01 12:30:09 UTC (rev 119219)
@@ -91,7 +91,6 @@
         void addDestructionObserver(FrameDestructionObserver*);
         void removeDestructionObserver(FrameDestructionObserver*);
 
-        void willDetachPage();
         void detachFromPage();
         void disconnectOwnerElement();
 
@@ -207,6 +206,7 @@
         Frame(Page*, HTMLFrameOwnerElement*, FrameLoaderClient*);
 
         void injectUserScriptsForWorld(DOMWrapperWorld*, const UserScriptVector&, UserScriptInjectionTime);
+        void willDetachPage();
 
         HashSet<FrameDestructionObserver*> m_destructionObservers;
 
@@ -351,11 +351,6 @@
         return m_page;
     }
 
-    inline void Frame::detachFromPage()
-    {
-        m_page = 0;
-    }
-
     inline EventHandler* Frame::eventHandler() const
     {
         return &m_eventHandler;

Modified: trunk/Source/WebCore/page/Page.cpp (119218 => 119219)


--- trunk/Source/WebCore/page/Page.cpp	2012-06-01 12:26:49 UTC (rev 119218)
+++ trunk/Source/WebCore/page/Page.cpp	2012-06-01 12:30:09 UTC (rev 119219)
@@ -187,10 +187,8 @@
     setGroupName(String());
     allPages->remove(this);
     
-    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext()) {
-        frame->willDetachPage();
+    for (Frame* frame = mainFrame(); frame; frame = frame->tree()->traverseNext())
         frame->detachFromPage();
-    }
 
     m_editorClient->pageDestroyed();
     if (m_alternativeTextClient)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to