Changeset 240443 in webkit
- Timestamp:
- Jan 24, 2019 10:35:05 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r240442 r240443 1 2019-01-24 Antti Koivisto <antti@apple.com> 2 3 [PSON] Flash on back navigation on Mac 4 https://bugs.webkit.org/show_bug.cgi?id=193716 5 <rdar://problem/47148458> 6 7 Reviewed by Chris Dumez. 8 9 We close the page immediately if we fail to suspend. Layers disappear and we get a flash. 10 11 * UIProcess/SuspendedPageProxy.cpp: 12 (WebKit::SuspendedPageProxy::~SuspendedPageProxy): 13 (WebKit::SuspendedPageProxy::close): 14 15 Track closed state so we don't send the message twice, causing unhandled message errors in web process. 16 17 (WebKit::SuspendedPageProxy::didProcessRequestToSuspend): 18 19 Close the suspended page if the suspension fails. 20 Skip this if we are using web process side compositing on Mac. 21 22 * UIProcess/SuspendedPageProxy.h: 23 * UIProcess/WebPageProxy.cpp: 24 (WebKit::WebPageProxy::enterAcceleratedCompositingMode): 25 26 On Mac, close the failed SuspendedPageProxy when entering compositing mode. At this point we don't need it to keep layers alive. 27 28 * UIProcess/WebProcessPool.cpp: 29 (WebKit::WebProcessPool::closeFailedSuspendedPagesForPage): 30 * UIProcess/WebProcessPool.h: 31 * WebProcess/WebPage/WebPage.cpp: 32 (WebKit::WebPage::suspendForProcessSwap): 33 34 Don't close the page on suspension failure. This is now managed by the UI process. 35 1 36 2019-01-24 Chris Dumez <cdumez@apple.com> 2 37 -
trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp
r240365 r240443 27 27 #include "SuspendedPageProxy.h" 28 28 29 #include "DrawingAreaProxy.h" 29 30 #include "Logging.h" 30 31 #include "WebPageMessages.h" … … 100 101 // If the suspended page was not consumed before getting destroyed, then close the corresponding page 101 102 // on the WebProcess side. 102 m_process->send(Messages::WebPage::Close(), m_page.pageID());103 close(); 103 104 104 105 if (m_suspensionState == SuspensionState::Suspending) … … 140 141 } 141 142 143 void SuspendedPageProxy::close() 144 { 145 ASSERT(m_suspensionState != SuspensionState::Resumed); 146 147 if (m_isClosed) 148 return; 149 150 m_isClosed = true; 151 m_process->send(Messages::WebPage::Close(), m_page.pageID()); 152 } 153 142 154 void SuspendedPageProxy::didProcessRequestToSuspend(SuspensionState newSuspensionState) 143 155 { … … 154 166 155 167 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_page.pageID()); 168 169 bool shouldDelayClosingOnFailure = false; 170 #if PLATFORM(MAC) 171 // With web process side tiles, we need to keep the suspended page around on failure to avoid flashing. 172 // It is removed by WebPageProxy::enterAcceleratedCompositingMode when the target page is ready. 173 shouldDelayClosingOnFailure = m_page.drawingArea() && m_page.drawingArea()->type() == DrawingAreaTypeTiledCoreAnimation; 174 #endif 175 if (m_suspensionState == SuspensionState::FailedToSuspend && !shouldDelayClosingOnFailure) 176 close(); 156 177 157 178 if (m_readyToUnsuspendHandler) -
trunk/Source/WebKit/UIProcess/SuspendedPageProxy.h
r239997 r240443 53 53 void waitUntilReadyToUnsuspend(CompletionHandler<void(SuspendedPageProxy*)>&&); 54 54 void unsuspend(); 55 void close(); 55 56 56 57 #if !LOG_DISABLED … … 70 71 uint64_t m_mainFrameID; 71 72 String m_registrableDomain; 73 bool m_isClosed { false }; 72 74 73 75 SuspensionState m_suspensionState { SuspensionState::Suspending }; -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r240365 r240443 6848 6848 void WebPageProxy::enterAcceleratedCompositingMode(const LayerTreeContext& layerTreeContext) 6849 6849 { 6850 #if PLATFORM(MAC) 6851 ASSERT(m_drawingArea->type() == DrawingAreaTypeTiledCoreAnimation); 6852 #endif 6850 6853 pageClient().enterAcceleratedCompositingMode(layerTreeContext); 6854 // We needed the failed suspended page to stay alive to avoid flashing. Now we can get rid of it. 6855 m_process->processPool().closeFailedSuspendedPagesForPage(*this); 6851 6856 } 6852 6857 -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r240365 r240443 2263 2263 } 2264 2264 2265 void WebProcessPool::closeFailedSuspendedPagesForPage(WebPageProxy& page) 2266 { 2267 for (auto& suspendedPage : m_suspendedPages) { 2268 if (&suspendedPage->page() == &page && suspendedPage->failedToSuspend()) 2269 suspendedPage->close(); 2270 } 2271 } 2272 2265 2273 std::unique_ptr<SuspendedPageProxy> WebProcessPool::takeSuspendedPage(SuspendedPageProxy& suspendedPage) 2266 2274 { -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r240365 r240443 448 448 void addSuspendedPage(std::unique_ptr<SuspendedPageProxy>&&); 449 449 void removeAllSuspendedPagesForPage(WebPageProxy&); 450 void closeFailedSuspendedPagesForPage(WebPageProxy&); 450 451 std::unique_ptr<SuspendedPageProxy> takeSuspendedPage(SuspendedPageProxy&); 451 452 void removeSuspendedPage(SuspendedPageProxy&); -
trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r240365 r240443 1341 1341 { 1342 1342 auto failedToSuspend = [this, protectedThis = makeRef(*this)] { 1343 close();1344 1343 send(Messages::WebPageProxy::DidFailToSuspendAfterProcessSwap()); 1345 1344 }; -
trunk/Tools/ChangeLog
r240442 r240443 1 2019-01-24 Antti Koivisto <antti@apple.com> 2 3 [PSON] Flash on back navigation on Mac 4 https://bugs.webkit.org/show_bug.cgi?id=193716 5 <rdar://problem/47148458> 6 7 Reviewed by Chris Dumez. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: 10 11 Closing of the previous page is delayed so waiting for didFinishNavigation is 12 not sufficient to guarantee we have received all the messages. Wait for them. 13 1 14 2019-01-24 Chris Dumez <cdumez@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm
r240442 r240443 2414 2414 done = false; 2415 2415 2416 while ([receivedMessages count] < 7) 2417 TestWebKitAPI::Util::sleep(0.1); 2418 2416 2419 EXPECT_EQ(7u, [receivedMessages count]); 2417 2420 EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - pageshow NOT persisted", receivedMessages.get()[0]); … … 2504 2507 done = false; 2505 2508 2509 while ([receivedMessages count] < 7) 2510 TestWebKitAPI::Util::sleep(0.1); 2511 2506 2512 EXPECT_EQ(7u, [receivedMessages count]); 2507 2513 EXPECT_WK_STREQ(@"pson://www.webkit.org/main.html - load", receivedMessages.get()[0]);
Note: See TracChangeset
for help on using the changeset viewer.