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