⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 238490 in webkit


Ignore:
Timestamp:
Nov 26, 2018, 1:40:49 AM (8 years ago)
Author:
Antti Koivisto
Message:

Clean up layer tree freezing logic in WebPage
https://bugs.webkit.org/show_bug.cgi?id=191826

Reviewed by Dean Jackson.

Use OptionSet<LayerTreeFreezeReason> to track various reasons that can cause layer tree to get frozen.

  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::reinitializeWebPage):
(WebKit::WebPage::freezeLayerTree):
(WebKit::WebPage::unfreezeLayerTree):
(WebKit::WebPage::updateDrawingAreaLayerTreeFreezeState):

Layer tree is unfrozen when there there are no reasons to freeze it.

(WebKit::WebPage::didStartPageTransition):
(WebKit::WebPage::didCompletePageTransition):
(WebKit::WebPage::beginPrinting):
(WebKit::WebPage::endPrinting):
(WebKit::WebPage::setIsSuspended):
(WebKit::WebPage::setLayerTreeStateIsFrozen): Deleted.

  • WebProcess/WebPage/WebPage.h:
  • WebProcess/WebPage/ios/WebPageIOS.mm:

(WebKit::WebPage::applicationDidEnterBackground):
(WebKit::WebPage::applicationWillEnterForeground):

  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::actualPrepareToSuspend):
(WebKit::WebProcess::cancelPrepareToSuspend):
(WebKit::WebProcess::freezeAllLayerTrees):
(WebKit::WebProcess::unfreezeAllLayerTrees):
(WebKit::WebProcess::processDidResume):
(WebKit::WebProcess::setAllLayerTreeStatesFrozen): Deleted.

  • WebProcess/WebProcess.h:
Location:
trunk/Source/WebKit
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r238476 r238490  
     12018-11-26  Antti Koivisto  <antti@apple.com>
     2
     3        Clean up layer tree freezing logic in WebPage
     4        https://bugs.webkit.org/show_bug.cgi?id=191826
     5
     6        Reviewed by Dean Jackson.
     7
     8        Use OptionSet<LayerTreeFreezeReason> to track various reasons that can cause layer tree to get frozen.
     9
     10        * WebProcess/WebPage/WebPage.cpp:
     11        (WebKit::WebPage::reinitializeWebPage):
     12        (WebKit::WebPage::freezeLayerTree):
     13        (WebKit::WebPage::unfreezeLayerTree):
     14        (WebKit::WebPage::updateDrawingAreaLayerTreeFreezeState):
     15
     16        Layer tree is unfrozen when there there are no reasons to freeze it.
     17
     18        (WebKit::WebPage::didStartPageTransition):
     19        (WebKit::WebPage::didCompletePageTransition):
     20        (WebKit::WebPage::beginPrinting):
     21        (WebKit::WebPage::endPrinting):
     22        (WebKit::WebPage::setIsSuspended):
     23        (WebKit::WebPage::setLayerTreeStateIsFrozen): Deleted.
     24        * WebProcess/WebPage/WebPage.h:
     25        * WebProcess/WebPage/ios/WebPageIOS.mm:
     26        (WebKit::WebPage::applicationDidEnterBackground):
     27        (WebKit::WebPage::applicationWillEnterForeground):
     28        * WebProcess/WebProcess.cpp:
     29        (WebKit::WebProcess::actualPrepareToSuspend):
     30        (WebKit::WebProcess::cancelPrepareToSuspend):
     31        (WebKit::WebProcess::freezeAllLayerTrees):
     32        (WebKit::WebProcess::unfreezeAllLayerTrees):
     33        (WebKit::WebProcess::processDidResume):
     34        (WebKit::WebProcess::setAllLayerTreeStatesFrozen): Deleted.
     35        * WebProcess/WebProcess.h:
     36
    1372018-11-25  Antti Koivisto  <antti@apple.com>
    238
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r238471 r238490  
    660660    setSize(parameters.viewSize);
    661661
    662     if (m_shouldResetDrawingArea) {
     662    if (m_shouldResetDrawingAreaAfterSuspend) {
    663663        // Make sure we destroy the previous drawing area before constructing the new one as DrawingArea registers / unregisters
    664664        // itself as an IPC::MesssageReceiver in its constructor / destructor.
    665665        m_drawingArea = nullptr;
    666         m_shouldResetDrawingArea = false;
     666        m_shouldResetDrawingAreaAfterSuspend = false;
    667667
    668668        m_drawingArea = DrawingArea::create(*this, parameters);
     
    674674        m_shouldAttachDrawingAreaOnPageTransition = parameters.shouldDelayAttachingDrawingArea;
    675675#endif
     676        unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended);
    676677    }
    677678
     
    23282329}
    23292330
    2330 void WebPage::setLayerTreeStateIsFrozen(bool frozen)
    2331 {
    2332     auto* drawingArea = this->drawingArea();
    2333     if (!drawingArea)
    2334         return;
    2335 
    2336     drawingArea->setLayerTreeStateIsFrozen(frozen || m_isSuspended || m_shouldResetDrawingArea);
     2331void WebPage::freezeLayerTree(LayerTreeFreezeReason reason)
     2332{
     2333    m_LayerTreeFreezeReasons.add(reason);
     2334    updateDrawingAreaLayerTreeFreezeState();
     2335}
     2336
     2337void WebPage::unfreezeLayerTree(LayerTreeFreezeReason reason)
     2338{
     2339    m_LayerTreeFreezeReasons.remove(reason);
     2340    updateDrawingAreaLayerTreeFreezeState();
     2341}
     2342
     2343void WebPage::updateDrawingAreaLayerTreeFreezeState()
     2344{
     2345    if (!m_drawingArea)
     2346        return;
     2347    m_drawingArea->setLayerTreeStateIsFrozen(!!m_LayerTreeFreezeReasons);
    23372348}
    23382349
     
    30073018void WebPage::didStartPageTransition()
    30083019{
    3009     setLayerTreeStateIsFrozen(true);
     3020    freezeLayerTree(LayerTreeFreezeReason::PageTransition);
    30103021
    30113022#if PLATFORM(MAC)
     
    30313042void WebPage::didCompletePageTransition()
    30323043{
    3033     // FIXME: Layer tree freezing should be managed entirely in the UI process side.
    3034     setLayerTreeStateIsFrozen(false);
     3044    unfreezeLayerTree(LayerTreeFreezeReason::PageTransition);
    30353045
    30363046#if PLATFORM(MAC)
     
    44624472        m_printContext = std::make_unique<PrintContext>(coreFrame);
    44634473
    4464     drawingArea()->setLayerTreeStateIsFrozen(true);
     4474    freezeLayerTree(LayerTreeFreezeReason::Printing);
     4475
    44654476    m_printContext->begin(printInfo.availablePaperWidth, printInfo.availablePaperHeight);
    44664477
     
    44764487void WebPage::endPrinting()
    44774488{
    4478     drawingArea()->setLayerTreeStateIsFrozen(false);
     4489    unfreezeLayerTree(LayerTreeFreezeReason::Printing);
     4490
    44794491    m_printContext = nullptr;
    44804492}
     
    62236235    m_isSuspended = suspended;
    62246236
    6225     if (!m_isSuspended)
    6226         m_shouldResetDrawingArea = true;
    6227 
    6228     setLayerTreeStateIsFrozen(true);
     6237    if (m_isSuspended) {
     6238        // Unfrozen on drawing area reset.
     6239        freezeLayerTree(LayerTreeFreezeReason::PageSuspended);
     6240    } else
     6241        m_shouldResetDrawingAreaAfterSuspend = true;
    62296242}
    62306243
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.h

    r238475 r238490  
    684684    bool hasRichlyEditableSelection() const;
    685685
    686     void setLayerTreeStateIsFrozen(bool);
     686    enum class LayerTreeFreezeReason {
     687        PageTransition          = 1 << 0,
     688        BackgroundApplication   = 1 << 1,
     689        ProcessSuspended        = 1 << 2,
     690        PageSuspended           = 1 << 3,
     691        Printing                = 1 << 4,
     692    };
     693    void freezeLayerTree(LayerTreeFreezeReason);
     694    void unfreezeLayerTree(LayerTreeFreezeReason);
     695
    687696    void markLayersVolatile(WTF::Function<void (bool)>&& completionHandler = { });
    688697    void cancelMarkLayersVolatile();
     
    11761185#endif
    11771186
     1187    void updateDrawingAreaLayerTreeFreezeState();
    11781188    bool markLayersVolatileImmediatelyIfPossible();
    11791189    void layerVolatilityTimerFired();
     
    14721482    WebCore::IntSize m_viewSize;
    14731483    std::unique_ptr<DrawingArea> m_drawingArea;
    1474     bool m_shouldResetDrawingArea { false };
     1484    bool m_shouldResetDrawingAreaAfterSuspend { false };
    14751485
    14761486    HashSet<PluginView*> m_pluginViews;
     
    17701780#endif
    17711781
     1782    OptionSet<LayerTreeFreezeReason> m_LayerTreeFreezeReasons;
    17721783    bool m_isSuspended { false };
    17731784    bool m_needsFontAttributes { false };
  • trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm

    r238475 r238490  
    28832883
    28842884    m_isSuspendedUnderLock = isSuspendedUnderLock;
    2885     setLayerTreeStateIsFrozen(true);
     2885    freezeLayerTree(LayerTreeFreezeReason::BackgroundApplication);
    28862886
    28872887    if (m_page)
     
    28982898    m_isSuspendedUnderLock = false;
    28992899    cancelMarkLayersVolatile();
    2900     setLayerTreeStateIsFrozen(false);
     2900    unfreezeLayerTree(LayerTreeFreezeReason::BackgroundApplication);
    29012901
    29022902    [[NSNotificationCenter defaultCenter] postNotificationName:WebUIApplicationWillEnterForegroundNotification object:nil userInfo:@{@"isSuspendedUnderLock": @(isSuspendedUnderLock)}];
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r238388 r238490  
    13791379        MemoryPressureHandler::singleton().releaseMemory(Critical::Yes, Synchronous::Yes);
    13801380
    1381     setAllLayerTreeStatesFrozen(true);
     1381    freezeAllLayerTrees();
    13821382   
    13831383#if PLATFORM(COCOA)
     
    14271427{
    14281428    RELEASE_LOG(ProcessSuspension, "%p - WebProcess::cancelPrepareToSuspend()", this);
    1429     setAllLayerTreeStatesFrozen(false);
     1429    unfreezeAllLayerTrees();
    14301430
    14311431#if PLATFORM(IOS_FAMILY)
     
    14751475}
    14761476
    1477 void WebProcess::setAllLayerTreeStatesFrozen(bool frozen)
     1477void WebProcess::freezeAllLayerTrees()
    14781478{
    14791479    for (auto& page : m_pageMap.values())
    1480         page->setLayerTreeStateIsFrozen(frozen);
    1481 }
    1482    
     1480        page->freezeLayerTree(WebPage::LayerTreeFreezeReason::ProcessSuspended);
     1481}
     1482
     1483void WebProcess::unfreezeAllLayerTrees()
     1484{
     1485    for (auto& page : m_pageMap.values())
     1486        page->unfreezeLayerTree(WebPage::LayerTreeFreezeReason::ProcessSuspended);
     1487}
     1488
    14831489void WebProcess::processDidResume()
    14841490{
     
    14861492
    14871493    cancelMarkAllLayersVolatile();
    1488     setAllLayerTreeStatesFrozen(false);
     1494    unfreezeAllLayerTrees();
    14891495   
    14901496#if PLATFORM(IOS_FAMILY)
  • trunk/Source/WebKit/WebProcess/WebProcess.h

    r238388 r238490  
    261261    void markAllLayersVolatile(WTF::Function<void(bool)>&& completionHandler);
    262262    void cancelMarkAllLayersVolatile();
    263     void setAllLayerTreeStatesFrozen(bool);
     263
     264    void freezeAllLayerTrees();
     265    void unfreezeAllLayerTrees();
     266
    264267    void processSuspensionCleanupTimerFired();
    265268
Note: See TracChangeset for help on using the changeset viewer.