Title: [151235] trunk/Source/WebKit2
Revision
151235
Author
[email protected]
Date
2013-06-05 12:57:53 -0700 (Wed, 05 Jun 2013)

Log Message

[wk2] WebProcess' page-in-window count can be wrong
https://bugs.webkit.org/show_bug.cgi?id=117106
<rdar://problem/14040991>

Reviewed by Anders Carlsson.

If we're using a single WebProcess and a window is closed, we were
not decrementing the page-in-window count (because we apparently don't
setIsInWindow(false) a WebPage in a closing window before tearing it down).

Turn the page-in-window count into a HashSet of pageIDs instead.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::WebPage):
(WebKit::WebPage::setIsInWindow):
Send the pageID instead (this change is just so that I don't need to
fetch the WebPage in WebProcess::removeWebPage).

* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::WebProcess):
Remove m_inWindowPageCount.

(WebKit::WebProcess::removeWebPage):
Ensure that WebPages being torn-down are removed from the in-window WebPage set.

(WebKit::WebProcess::pageDidEnterWindow):
(WebKit::WebProcess::pageWillLeaveWindow):
Use our new HashSet instead of a count.

(WebKit::WebProcess::nonVisibleProcessCleanupTimerFired):
Make sure that we don't have any visible pages before doing cleanup.

* WebProcess/WebProcess.h:
Remove m_inWindowPageCount.
Add m_inWindowPageSet.
Make pageDidEnterWindow/pageWillLeaveWindow take pageID instead of WebPage.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (151234 => 151235)


--- trunk/Source/WebKit2/ChangeLog	2013-06-05 19:41:38 UTC (rev 151234)
+++ trunk/Source/WebKit2/ChangeLog	2013-06-05 19:57:53 UTC (rev 151235)
@@ -1,5 +1,44 @@
 2013-06-05  Tim Horton  <[email protected]>
 
+        [wk2] WebProcess' page-in-window count can be wrong
+        https://bugs.webkit.org/show_bug.cgi?id=117106
+        <rdar://problem/14040991>
+
+        Reviewed by Anders Carlsson.
+
+        If we're using a single WebProcess and a window is closed, we were
+        not decrementing the page-in-window count (because we apparently don't
+        setIsInWindow(false) a WebPage in a closing window before tearing it down).
+
+        Turn the page-in-window count into a HashSet of pageIDs instead.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::WebPage):
+        (WebKit::WebPage::setIsInWindow):
+        Send the pageID instead (this change is just so that I don't need to
+        fetch the WebPage in WebProcess::removeWebPage).
+
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::WebProcess):
+        Remove m_inWindowPageCount.
+
+        (WebKit::WebProcess::removeWebPage):
+        Ensure that WebPages being torn-down are removed from the in-window WebPage set.
+
+        (WebKit::WebProcess::pageDidEnterWindow):
+        (WebKit::WebProcess::pageWillLeaveWindow):
+        Use our new HashSet instead of a count.
+
+        (WebKit::WebProcess::nonVisibleProcessCleanupTimerFired):
+        Make sure that we don't have any visible pages before doing cleanup.
+
+        * WebProcess/WebProcess.h:
+        Remove m_inWindowPageCount.
+        Add m_inWindowPageSet.
+        Make pageDidEnterWindow/pageWillLeaveWindow take pageID instead of WebPage.
+
+2013-06-05  Tim Horton  <[email protected]>
+
         REGRESSION (r148713): Crash under waitForDidUpdateInWindowState
         https://bugs.webkit.org/show_bug.cgi?id=117268
         <rdar://problem/13822353>

Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp (151234 => 151235)


--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2013-06-05 19:41:38 UTC (rev 151234)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp	2013-06-05 19:57:53 UTC (rev 151235)
@@ -375,7 +375,7 @@
     if (!parameters.isInWindow)
         m_page->setIsInWindow(false);
     else
-        WebProcess::shared().pageDidEnterWindow(this);
+        WebProcess::shared().pageDidEnterWindow(m_pageID);
 
     setIsInWindow(parameters.isInWindow);
 
@@ -2105,7 +2105,7 @@
         m_page->willMoveOffscreen();
         
         if (pageWasInWindow)
-            WebProcess::shared().pageWillLeaveWindow(this);
+            WebProcess::shared().pageWillLeaveWindow(m_pageID);
     } else {
         // Defer the call to Page::setCanStartMedia() since it ends up sending a synchronous message to the UI process
         // in order to get plug-in connections, and the UI process will be waiting for the Web process to update the backing
@@ -2116,7 +2116,7 @@
         m_page->didMoveOnscreen();
         
         if (!pageWasInWindow)
-            WebProcess::shared().pageDidEnterWindow(this);
+            WebProcess::shared().pageDidEnterWindow(m_pageID);
     }
 
     m_page->setIsInWindow(isInWindow);

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (151234 => 151235)


--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2013-06-05 19:41:38 UTC (rev 151234)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp	2013-06-05 19:57:53 UTC (rev 151235)
@@ -176,7 +176,6 @@
 #if ENABLE(PLUGIN_PROCESS)
     , m_pluginProcessConnectionManager(PluginProcessConnectionManager::create())
 #endif
-    , m_inWindowPageCount(0)
     , m_nonVisibleProcessCleanupTimer(this, &WebProcess::nonVisibleProcessCleanupTimerFired)
 {
     // Initialize our platform strategies.
@@ -588,6 +587,7 @@
 {
     ASSERT(m_pageMap.contains(pageID));
 
+    pageWillLeaveWindow(pageID);
     m_pageMap.remove(pageID);
 
     enableTermination();
@@ -1161,27 +1161,26 @@
 
 #endif
     
-void WebProcess::pageDidEnterWindow(WebPage*)
+void WebProcess::pageDidEnterWindow(uint64_t pageID)
 {
-    m_inWindowPageCount++;
+    m_pagesInWindows.add(pageID);
     m_nonVisibleProcessCleanupTimer.stop();
 }
 
-void WebProcess::pageWillLeaveWindow(WebPage*)
+void WebProcess::pageWillLeaveWindow(uint64_t pageID)
 {
-    ASSERT(m_inWindowPageCount > 0);
-    if (m_inWindowPageCount <= 0)
-        return;
+    m_pagesInWindows.remove(pageID);
 
-    m_inWindowPageCount--;
-
-    if (!m_inWindowPageCount)
+    if (m_pagesInWindows.isEmpty() && !m_nonVisibleProcessCleanupTimer.isActive())
         m_nonVisibleProcessCleanupTimer.startOneShot(nonVisibleProcessCleanupDelay);
 }
     
 void WebProcess::nonVisibleProcessCleanupTimerFired(Timer<WebProcess>*)
 {
-    ASSERT(!m_inWindowPageCount);
+    ASSERT(m_pagesInWindows.isEmpty());
+    if (!m_pagesInWindows.isEmpty())
+        return;
+
 #if PLATFORM(MAC)
     wkDestroyRenderingResources();
 #endif

Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (151234 => 151235)


--- trunk/Source/WebKit2/WebProcess/WebProcess.h	2013-06-05 19:41:38 UTC (rev 151234)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h	2013-06-05 19:57:53 UTC (rev 151235)
@@ -163,8 +163,8 @@
     void ensurePrivateBrowsingSession();
     void destroyPrivateBrowsingSession();
     
-    void pageDidEnterWindow(WebPage*);
-    void pageWillLeaveWindow(WebPage*);
+    void pageDidEnterWindow(uint64_t pageID);
+    void pageWillLeaveWindow(uint64_t pageID);
 
     void nonVisibleProcessCleanupTimerFired(WebCore::Timer<WebProcess>*);
 
@@ -313,7 +313,7 @@
     RefPtr<PluginProcessConnectionManager> m_pluginProcessConnectionManager;
 #endif
 
-    int m_inWindowPageCount;
+    HashSet<uint64_t> m_pagesInWindows;
     WebCore::Timer<WebProcess> m_nonVisibleProcessCleanupTimer;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to