Title: [196486] tags/Safari-602.1.18.9/Source/WebCore
Revision
196486
Author
[email protected]
Date
2016-02-12 11:07:55 -0800 (Fri, 12 Feb 2016)

Log Message

Merged r196023.  rdar://problem/24411911

Modified Paths

Diff

Modified: tags/Safari-602.1.18.9/Source/WebCore/ChangeLog (196485 => 196486)


--- tags/Safari-602.1.18.9/Source/WebCore/ChangeLog	2016-02-12 19:06:29 UTC (rev 196485)
+++ tags/Safari-602.1.18.9/Source/WebCore/ChangeLog	2016-02-12 19:07:55 UTC (rev 196486)
@@ -1,3 +1,44 @@
+2016-02-12  Babak Shafiei  <[email protected]>
+
+        Merge r196023.
+
+    2016-02-01  Antti Koivisto  <[email protected]>
+
+            Tab suspension code shouldn't use page cache cacheability logic
+            https://bugs.webkit.org/show_bug.cgi?id=153680
+
+            Reviewed by Andreas Kling.
+
+            Most of PageCache::canCache() is unnecessary for tab suspension.
+
+            Also improve robustness and introduce 1 minute delay before suspending.
+
+            * page/Page.cpp:
+            (WebCore::Page::setPageActivityState):
+            (WebCore::Page::setIsVisible):
+            (WebCore::Page::setIsVisibleInternal):
+            (WebCore::Page::setIsPrerender):
+            (WebCore::Page::canTabSuspend):
+
+                Include visibility test here.
+
+                Instead of calling PageCache::canCache() just check for each frame
+                - that the document is loaded
+                - that active DOM objects allow suspension
+
+            (WebCore::Page::setIsTabSuspended):
+            (WebCore::Page::setTabSuspensionEnabled):
+            (WebCore::Page::updateTabSuspensionState):
+
+                Refactor for robustness.
+
+            (WebCore::Page::tabSuspensionTimerFired):
+
+                Call canTabSuspend, the result might have changed.
+
+            (WebCore::Page::scheduleTabSuspension): Deleted.
+            * page/Page.h:
+
 2016-02-09  Babak Shafiei  <[email protected]>
 
         Merge r195816.

Modified: tags/Safari-602.1.18.9/Source/WebCore/page/Page.cpp (196485 => 196486)


--- tags/Safari-602.1.18.9/Source/WebCore/page/Page.cpp	2016-02-12 19:06:29 UTC (rev 196485)
+++ tags/Safari-602.1.18.9/Source/WebCore/page/Page.cpp	2016-02-12 19:07:55 UTC (rev 196486)
@@ -1305,10 +1305,7 @@
 {
     chrome().client().setPageActivityState(activityState);
     
-    if (activityState == PageActivityState::NoFlags && !isVisible())
-        scheduleTabSuspension(true);
-    else
-        scheduleTabSuspension(false);
+    updateTabSuspensionState();
 }
 
 void Page::setIsVisible(bool isVisible)
@@ -1361,7 +1358,7 @@
             view->hide();
     }
 
-    scheduleTabSuspension(!isVisible);
+    updateTabSuspensionState();
 }
 
 void Page::setIsPrerender()
@@ -1867,17 +1864,29 @@
         return false;
     if (m_isPrerender)
         return false;
+    if (isVisible())
+        return false;
     if (m_pageThrottler.activityState() != PageActivityState::NoFlags)
         return false;
-    // FIXME: PageCache::canCache does a bunch of checks that are not needed for the tab suspension case. There should be a specific check.
-    if (!PageCache::singleton().canCache(*this))
-        return false;
 
+    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
+        if (frame->loader().state() != FrameStateComplete)
+            return false;
+        if (frame->loader().isLoading())
+            return false;
+        if (!frame->document() || !frame->document()->canSuspendActiveDOMObjectsForDocumentSuspension(nullptr))
+            return false;
+    }
+
     return true;
 }
 
 void Page::setIsTabSuspended(bool shouldSuspend)
 {
+    if (m_isTabSuspended == shouldSuspend)
+        return;
+    m_isTabSuspended = shouldSuspend;
+
     for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
         if (auto* document = frame->document()) {
             if (shouldSuspend)
@@ -1893,26 +1902,20 @@
     s_tabSuspensionIsEnabled = enable;
 }
 
-void Page::scheduleTabSuspension(bool shouldSuspend)
+void Page::updateTabSuspensionState()
 {
-    if (m_shouldTabSuspend == shouldSuspend)
+    if (canTabSuspend()) {
+        const auto tabSuspensionDelay = std::chrono::minutes(1);
+        m_tabSuspensionTimer.startOneShot(tabSuspensionDelay);
         return;
-    
-    if (shouldSuspend && canTabSuspend()) {
-        m_shouldTabSuspend = shouldSuspend;
-        m_tabSuspensionTimer.startOneShot(0);
-    } else {
-        m_tabSuspensionTimer.stop();
-        if (!shouldSuspend) {
-            m_shouldTabSuspend = shouldSuspend;
-            setIsTabSuspended(false);
-        }
     }
+    m_tabSuspensionTimer.stop();
+    setIsTabSuspended(false);
 }
 
 void Page::tabSuspensionTimerFired()
 {
-    setIsTabSuspended(true);
+    setIsTabSuspended(canTabSuspend());
 }
 
 } // namespace WebCore

Modified: tags/Safari-602.1.18.9/Source/WebCore/page/Page.h (196485 => 196486)


--- tags/Safari-602.1.18.9/Source/WebCore/page/Page.h	2016-02-12 19:06:29 UTC (rev 196485)
+++ tags/Safari-602.1.18.9/Source/WebCore/page/Page.h	2016-02-12 19:07:55 UTC (rev 196486)
@@ -521,7 +521,7 @@
     void hiddenPageDOMTimerThrottlingStateChanged();
     void setTimerThrottlingEnabled(bool);
     bool canTabSuspend();
-    void scheduleTabSuspension(bool);
+    void updateTabSuspensionState();
     void tabSuspensionTimerFired();
 
     const std::unique_ptr<Chrome> m_chrome;
@@ -663,7 +663,7 @@
     SessionID m_sessionID;
 
     bool m_isClosing;
-    bool m_shouldTabSuspend { false };
+    bool m_isTabSuspended { false };
     Timer m_tabSuspensionTimer;
 
     MediaProducer::MediaStateFlags m_mediaState { MediaProducer::IsNotPlaying };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to