Changeset 195871 in webkit


Ignore:
Timestamp:
Jan 29, 2016 5:29:33 PM (8 years ago)
Author:
Antti Koivisto
Message:

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.

  • 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

  • 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:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r195863 r195871  
     12016-01-29  Antti Koivisto  <antti@apple.com>
     2
     3        Tab suspension code shouldn't use page cache cacheability logic
     4        https://bugs.webkit.org/show_bug.cgi?id=153680
     5
     6        Reviewed by Andreas Kling.
     7
     8        Most of PageCache::canCache() is unnecessary for tab suspension.
     9
     10        Also improve robustness.
     11
     12        * page/Page.cpp:
     13        (WebCore::Page::setPageActivityState):
     14        (WebCore::Page::setIsVisible):
     15        (WebCore::Page::setIsVisibleInternal):
     16        (WebCore::Page::setIsPrerender):
     17        (WebCore::Page::canTabSuspend):
     18
     19            Include visibility test here.
     20
     21            Instead of calling PageCache::canCache() just check for each frame that
     22            - that the document is loaded
     23            - that active DOM objects allow suspension
     24
     25        (WebCore::Page::setIsTabSuspended):
     26        (WebCore::Page::setTabSuspensionEnabled):
     27        (WebCore::Page::updateTabSuspensionState):
     28
     29            Refactor for robustness.
     30
     31        (WebCore::Page::tabSuspensionTimerFired):
     32
     33            Call canTabSuspend, the result might have changed.
     34
     35        (WebCore::Page::scheduleTabSuspension): Deleted.
     36        * page/Page.h:
     37
    1382016-01-29  Ryosuke Niwa  <rniwa@webkit.org>
    239
  • trunk/Source/WebCore/page/Page.cpp

    r195790 r195871  
    13061306    chrome().client().setPageActivityState(activityState);
    13071307   
    1308     if (activityState == PageActivityState::NoFlags && !isVisible())
    1309         scheduleTabSuspension(true);
    1310     else
    1311         scheduleTabSuspension(false);
     1308    updateTabSuspensionState();
    13121309}
    13131310
     
    13621359    }
    13631360
    1364     scheduleTabSuspension(!isVisible);
     1361    updateTabSuspensionState();
    13651362}
    13661363
     
    18681865    if (m_isPrerender)
    18691866        return false;
     1867    if (isVisible())
     1868        return false;
    18701869    if (m_pageThrottler.activityState() != PageActivityState::NoFlags)
    18711870        return false;
    1872     // FIXME: PageCache::canCache does a bunch of checks that are not needed for the tab suspension case. There should be a specific check.
    1873     if (!PageCache::singleton().canCache(*this))
    1874         return false;
     1871
     1872    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
     1873        if (frame->loader().state() == FrameStateProvisional)
     1874            return false;
     1875        if (frame->loader().isLoading())
     1876            return false;
     1877        if (!frame->document() || !frame->document()->canSuspendActiveDOMObjectsForDocumentSuspension(nullptr))
     1878            return false;
     1879    }
    18751880
    18761881    return true;
     
    18791884void Page::setIsTabSuspended(bool shouldSuspend)
    18801885{
     1886    if (m_isTabSuspended == shouldSuspend)
     1887        return;
     1888    m_isTabSuspended = shouldSuspend;
     1889
    18811890    for (Frame* frame = &mainFrame(); frame; frame = frame->tree().traverseNext()) {
    18821891        if (auto* document = frame->document()) {
     
    18941903}
    18951904
    1896 void Page::scheduleTabSuspension(bool shouldSuspend)
    1897 {
    1898     if (m_shouldTabSuspend == shouldSuspend)
    1899         return;
    1900    
    1901     if (shouldSuspend && canTabSuspend()) {
    1902         m_shouldTabSuspend = shouldSuspend;
     1905void Page::updateTabSuspensionState()
     1906{
     1907    if (canTabSuspend()) {
    19031908        m_tabSuspensionTimer.startOneShot(0);
    1904     } else {
    1905         m_tabSuspensionTimer.stop();
    1906         if (!shouldSuspend) {
    1907             m_shouldTabSuspend = shouldSuspend;
    1908             setIsTabSuspended(false);
    1909         }
    1910     }
     1909        return;
     1910    }
     1911    m_tabSuspensionTimer.stop();
     1912    setIsTabSuspended(false);
    19111913}
    19121914
    19131915void Page::tabSuspensionTimerFired()
    19141916{
    1915     setIsTabSuspended(true);
     1917    setIsTabSuspended(canTabSuspend());
    19161918}
    19171919
  • trunk/Source/WebCore/page/Page.h

    r195644 r195871  
    522522    void setTimerThrottlingEnabled(bool);
    523523    bool canTabSuspend();
    524     void scheduleTabSuspension(bool);
     524    void updateTabSuspensionState();
    525525    void tabSuspensionTimerFired();
    526526
     
    664664
    665665    bool m_isClosing;
    666     bool m_shouldTabSuspend { false };
     666    bool m_isTabSuspended { false };
    667667    Timer m_tabSuspensionTimer;
    668668
Note: See TracChangeset for help on using the changeset viewer.