Changeset 238490 in webkit
- Timestamp:
- Nov 26, 2018, 1:40:49 AM (8 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 6 edited
-
ChangeLog (modified) (1 diff)
-
WebProcess/WebPage/WebPage.cpp (modified) (8 diffs)
-
WebProcess/WebPage/WebPage.h (modified) (4 diffs)
-
WebProcess/WebPage/ios/WebPageIOS.mm (modified) (2 diffs)
-
WebProcess/WebProcess.cpp (modified) (4 diffs)
-
WebProcess/WebProcess.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r238476 r238490 1 2018-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 1 37 2018-11-25 Antti Koivisto <antti@apple.com> 2 38 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r238471 r238490 660 660 setSize(parameters.viewSize); 661 661 662 if (m_shouldResetDrawingArea ) {662 if (m_shouldResetDrawingAreaAfterSuspend) { 663 663 // Make sure we destroy the previous drawing area before constructing the new one as DrawingArea registers / unregisters 664 664 // itself as an IPC::MesssageReceiver in its constructor / destructor. 665 665 m_drawingArea = nullptr; 666 m_shouldResetDrawingArea = false;666 m_shouldResetDrawingAreaAfterSuspend = false; 667 667 668 668 m_drawingArea = DrawingArea::create(*this, parameters); … … 674 674 m_shouldAttachDrawingAreaOnPageTransition = parameters.shouldDelayAttachingDrawingArea; 675 675 #endif 676 unfreezeLayerTree(LayerTreeFreezeReason::PageSuspended); 676 677 } 677 678 … … 2328 2329 } 2329 2330 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); 2331 void WebPage::freezeLayerTree(LayerTreeFreezeReason reason) 2332 { 2333 m_LayerTreeFreezeReasons.add(reason); 2334 updateDrawingAreaLayerTreeFreezeState(); 2335 } 2336 2337 void WebPage::unfreezeLayerTree(LayerTreeFreezeReason reason) 2338 { 2339 m_LayerTreeFreezeReasons.remove(reason); 2340 updateDrawingAreaLayerTreeFreezeState(); 2341 } 2342 2343 void WebPage::updateDrawingAreaLayerTreeFreezeState() 2344 { 2345 if (!m_drawingArea) 2346 return; 2347 m_drawingArea->setLayerTreeStateIsFrozen(!!m_LayerTreeFreezeReasons); 2337 2348 } 2338 2349 … … 3007 3018 void WebPage::didStartPageTransition() 3008 3019 { 3009 setLayerTreeStateIsFrozen(true);3020 freezeLayerTree(LayerTreeFreezeReason::PageTransition); 3010 3021 3011 3022 #if PLATFORM(MAC) … … 3031 3042 void WebPage::didCompletePageTransition() 3032 3043 { 3033 // FIXME: Layer tree freezing should be managed entirely in the UI process side. 3034 setLayerTreeStateIsFrozen(false); 3044 unfreezeLayerTree(LayerTreeFreezeReason::PageTransition); 3035 3045 3036 3046 #if PLATFORM(MAC) … … 4462 4472 m_printContext = std::make_unique<PrintContext>(coreFrame); 4463 4473 4464 drawingArea()->setLayerTreeStateIsFrozen(true); 4474 freezeLayerTree(LayerTreeFreezeReason::Printing); 4475 4465 4476 m_printContext->begin(printInfo.availablePaperWidth, printInfo.availablePaperHeight); 4466 4477 … … 4476 4487 void WebPage::endPrinting() 4477 4488 { 4478 drawingArea()->setLayerTreeStateIsFrozen(false); 4489 unfreezeLayerTree(LayerTreeFreezeReason::Printing); 4490 4479 4491 m_printContext = nullptr; 4480 4492 } … … 6223 6235 m_isSuspended = suspended; 6224 6236 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; 6229 6242 } 6230 6243 -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.h
r238475 r238490 684 684 bool hasRichlyEditableSelection() const; 685 685 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 687 696 void markLayersVolatile(WTF::Function<void (bool)>&& completionHandler = { }); 688 697 void cancelMarkLayersVolatile(); … … 1176 1185 #endif 1177 1186 1187 void updateDrawingAreaLayerTreeFreezeState(); 1178 1188 bool markLayersVolatileImmediatelyIfPossible(); 1179 1189 void layerVolatilityTimerFired(); … … 1472 1482 WebCore::IntSize m_viewSize; 1473 1483 std::unique_ptr<DrawingArea> m_drawingArea; 1474 bool m_shouldResetDrawingArea { false };1484 bool m_shouldResetDrawingAreaAfterSuspend { false }; 1475 1485 1476 1486 HashSet<PluginView*> m_pluginViews; … … 1770 1780 #endif 1771 1781 1782 OptionSet<LayerTreeFreezeReason> m_LayerTreeFreezeReasons; 1772 1783 bool m_isSuspended { false }; 1773 1784 bool m_needsFontAttributes { false }; -
trunk/Source/WebKit/WebProcess/WebPage/ios/WebPageIOS.mm
r238475 r238490 2883 2883 2884 2884 m_isSuspendedUnderLock = isSuspendedUnderLock; 2885 setLayerTreeStateIsFrozen(true);2885 freezeLayerTree(LayerTreeFreezeReason::BackgroundApplication); 2886 2886 2887 2887 if (m_page) … … 2898 2898 m_isSuspendedUnderLock = false; 2899 2899 cancelMarkLayersVolatile(); 2900 setLayerTreeStateIsFrozen(false);2900 unfreezeLayerTree(LayerTreeFreezeReason::BackgroundApplication); 2901 2901 2902 2902 [[NSNotificationCenter defaultCenter] postNotificationName:WebUIApplicationWillEnterForegroundNotification object:nil userInfo:@{@"isSuspendedUnderLock": @(isSuspendedUnderLock)}]; -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r238388 r238490 1379 1379 MemoryPressureHandler::singleton().releaseMemory(Critical::Yes, Synchronous::Yes); 1380 1380 1381 setAllLayerTreeStatesFrozen(true);1381 freezeAllLayerTrees(); 1382 1382 1383 1383 #if PLATFORM(COCOA) … … 1427 1427 { 1428 1428 RELEASE_LOG(ProcessSuspension, "%p - WebProcess::cancelPrepareToSuspend()", this); 1429 setAllLayerTreeStatesFrozen(false);1429 unfreezeAllLayerTrees(); 1430 1430 1431 1431 #if PLATFORM(IOS_FAMILY) … … 1475 1475 } 1476 1476 1477 void WebProcess:: setAllLayerTreeStatesFrozen(bool frozen)1477 void WebProcess::freezeAllLayerTrees() 1478 1478 { 1479 1479 for (auto& page : m_pageMap.values()) 1480 page->setLayerTreeStateIsFrozen(frozen); 1481 } 1482 1480 page->freezeLayerTree(WebPage::LayerTreeFreezeReason::ProcessSuspended); 1481 } 1482 1483 void WebProcess::unfreezeAllLayerTrees() 1484 { 1485 for (auto& page : m_pageMap.values()) 1486 page->unfreezeLayerTree(WebPage::LayerTreeFreezeReason::ProcessSuspended); 1487 } 1488 1483 1489 void WebProcess::processDidResume() 1484 1490 { … … 1486 1492 1487 1493 cancelMarkAllLayersVolatile(); 1488 setAllLayerTreeStatesFrozen(false);1494 unfreezeAllLayerTrees(); 1489 1495 1490 1496 #if PLATFORM(IOS_FAMILY) -
trunk/Source/WebKit/WebProcess/WebProcess.h
r238388 r238490 261 261 void markAllLayersVolatile(WTF::Function<void(bool)>&& completionHandler); 262 262 void cancelMarkAllLayersVolatile(); 263 void setAllLayerTreeStatesFrozen(bool); 263 264 void freezeAllLayerTrees(); 265 void unfreezeAllLayerTrees(); 266 264 267 void processSuspensionCleanupTimerFired(); 265 268
Note:
See TracChangeset
for help on using the changeset viewer.