Changeset 225850 in webkit
- Timestamp:
- Dec 13, 2017 10:13:47 AM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r225841 r225850 1 2017-12-13 Chris Dumez <cdumez@apple.com> 2 3 [iOS] Take process assertion to prevent the service worker process from getting suspended 4 https://bugs.webkit.org/show_bug.cgi?id=180735 5 6 Reviewed by Brady Eidson. 7 8 Take process assertion to prevent the service worker process from getting suspended while 9 it is still needed. We use the same policy as for the network process, meaning that 10 unsuspended WebContent processes prevent the service worker process from getting suspended. 11 12 This patch still does not enable service workers on iOS. The demo at https://mdn.github.io/sw-test/ 13 appears to work. However, things are not working as expected for mobile.twitter.com where I 14 see the fetches intercepted by the service worker fail when offline for some reason (unrelated 15 to process suspension). 16 17 * UIProcess/WebProcessPool.cpp: 18 (WebKit::m_foregroundWebProcessCounter): 19 (WebKit::m_backgroundWebProcessCounter): 20 (WebKit::WebProcessPool::ensureNetworkProcess): 21 (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess): 22 (WebKit::WebProcessPool::disconnectProcess): 23 (WebKit::WebProcessPool::updateProcessAssertions): 24 (WebKit::WebProcessPool::reinstateNetworkProcessAssertionState): 25 * UIProcess/WebProcessPool.h: 26 * UIProcess/WebProcessProxy.cpp: 27 (WebKit::WebProcessProxy::didSetAssertionState): 28 * UIProcess/WebProcessProxy.h: 29 1 30 2017-12-13 Carlos Garcia Campos <cgarcia@igalia.com> 2 31 -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r225720 r225850 235 235 , m_hiddenPageThrottlingTimer(RunLoop::main(), this, &WebProcessPool::updateHiddenPageThrottlingAutoIncreaseLimit) 236 236 , m_serviceWorkerProcessTerminationTimer(RunLoop::main(), this, &WebProcessPool::terminateServiceWorkerProcess) 237 #if PLATFORM(IOS) 238 , m_foregroundWebProcessCounter([this](RefCounterEvent) { updateProcessAssertions(); }) 239 , m_backgroundWebProcessCounter([this](RefCounterEvent) { updateProcessAssertions(); }) 240 #endif 237 241 { 238 242 if (m_configuration->shouldHaveLegacyDataStore()) … … 487 491 if (m_didNetworkProcessCrash) { 488 492 m_didNetworkProcessCrash = false; 489 for (auto& process : m_processes) 490 process->reinstateNetworkProcessAssertionState(*m_networkProcess); 493 reinstateNetworkProcessAssertionState(*m_networkProcess); 491 494 if (m_websiteDataStore) 492 495 m_websiteDataStore->websiteDataStore().networkProcessDidCrash(); … … 599 602 auto serviceWorkerProcessProxy = ServiceWorkerProcessProxy::create(*this, m_websiteDataStore->websiteDataStore()); 600 603 m_serviceWorkerProcess = serviceWorkerProcessProxy.ptr(); 604 updateProcessAssertions(); 601 605 initializeNewWebProcess(serviceWorkerProcessProxy.get(), m_websiteDataStore->websiteDataStore()); 602 606 m_processes.append(WTFMove(serviceWorkerProcessProxy)); … … 924 928 m_processWithPageCache = nullptr; 925 929 #if ENABLE(SERVICE_WORKER) 926 if (m_serviceWorkerProcess == process) 930 if (m_serviceWorkerProcess == process) { 927 931 m_serviceWorkerProcess = nullptr; 932 updateProcessAssertions(); 933 } 928 934 #endif 929 935 … … 1746 1752 } 1747 1753 1754 void WebProcessPool::updateProcessAssertions() 1755 { 1756 #if PLATFORM(IOS) 1757 #if ENABLE(SERVICE_WORKER) 1758 auto updateServiceWorkerProcessAssertion = [&] { 1759 if (m_serviceWorkerProcess && m_foregroundWebProcessCounter.value()) { 1760 if (!m_foregroundTokenForServiceWorkerProcess) 1761 m_foregroundTokenForServiceWorkerProcess = m_serviceWorkerProcess->throttler().foregroundActivityToken(); 1762 m_backgroundTokenForServiceWorkerProcess = nullptr; 1763 return; 1764 } 1765 if (m_serviceWorkerProcess && m_backgroundWebProcessCounter.value()) { 1766 if (!m_backgroundTokenForServiceWorkerProcess) 1767 m_backgroundTokenForServiceWorkerProcess = m_serviceWorkerProcess->throttler().backgroundActivityToken(); 1768 m_foregroundTokenForServiceWorkerProcess = nullptr; 1769 return; 1770 } 1771 m_foregroundTokenForServiceWorkerProcess = nullptr; 1772 m_backgroundTokenForServiceWorkerProcess = nullptr; 1773 }; 1774 updateServiceWorkerProcessAssertion(); 1775 #endif 1776 1777 auto updateNetworkProcessAssertion = [&] { 1778 if (m_foregroundWebProcessCounter.value()) { 1779 if (!m_foregroundTokenForNetworkProcess) 1780 m_foregroundTokenForNetworkProcess = ensureNetworkProcess().throttler().foregroundActivityToken(); 1781 m_backgroundTokenForNetworkProcess = nullptr; 1782 return; 1783 } 1784 if (m_backgroundWebProcessCounter.value()) { 1785 if (!m_backgroundTokenForNetworkProcess) 1786 m_backgroundTokenForNetworkProcess = ensureNetworkProcess().throttler().backgroundActivityToken(); 1787 m_foregroundTokenForNetworkProcess = nullptr; 1788 return; 1789 } 1790 m_foregroundTokenForNetworkProcess = nullptr; 1791 m_backgroundTokenForNetworkProcess = nullptr; 1792 }; 1793 updateNetworkProcessAssertion(); 1794 #endif 1795 } 1796 1797 void WebProcessPool::reinstateNetworkProcessAssertionState(NetworkProcessProxy& newNetworkProcessProxy) 1798 { 1799 #if PLATFORM(IOS) 1800 // The network process crashed; take new tokens for the new network process. 1801 if (m_backgroundTokenForNetworkProcess) 1802 m_backgroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().backgroundActivityToken(); 1803 else if (m_foregroundTokenForNetworkProcess) 1804 m_foregroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().foregroundActivityToken(); 1805 #else 1806 UNUSED_PARAM(newNetworkProcessProxy); 1807 #endif 1808 } 1809 1748 1810 } // namespace WebKit -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r225716 r225850 426 426 static void unregisterProcessPoolCreationListener(uint64_t identifier); 427 427 428 #if PLATFORM(IOS) 429 ForegroundWebProcessToken foregroundWebProcessToken() const { return ForegroundWebProcessToken(m_foregroundWebProcessCounter.count()); } 430 BackgroundWebProcessToken backgroundWebProcessToken() const { return BackgroundWebProcessToken(m_backgroundWebProcessCounter.count()); } 431 #endif 432 428 433 private: 429 434 void platformInitialize(); … … 451 456 void processStoppedUsingGamepads(WebProcessProxy&); 452 457 #endif 458 459 void reinstateNetworkProcessAssertionState(NetworkProcessProxy&); 460 void updateProcessAssertions(); 453 461 454 462 // IPC::MessageReceiver. … … 638 646 HashMap<PAL::SessionID, HashSet<WebPageProxy*>> m_sessionToPagesMap; 639 647 RunLoop::Timer<WebProcessPool> m_serviceWorkerProcessTerminationTimer; 648 649 #if PLATFORM(IOS) 650 ForegroundWebProcessCounter m_foregroundWebProcessCounter; 651 BackgroundWebProcessCounter m_backgroundWebProcessCounter; 652 ProcessThrottler::ForegroundActivityToken m_foregroundTokenForNetworkProcess; 653 ProcessThrottler::BackgroundActivityToken m_backgroundTokenForNetworkProcess; 654 #if ENABLE(SERVICE_WORKER) 655 ProcessThrottler::ForegroundActivityToken m_foregroundTokenForServiceWorkerProcess; 656 ProcessThrottler::BackgroundActivityToken m_backgroundTokenForServiceWorkerProcess; 657 #endif 658 #endif 640 659 }; 641 660 -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r225553 r225850 1058 1058 } 1059 1059 1060 void WebProcessProxy:: reinstateNetworkProcessAssertionState(NetworkProcessProxy& newNetworkProcessProxy)1060 void WebProcessProxy::didSetAssertionState(AssertionState state) 1061 1061 { 1062 1062 #if PLATFORM(IOS) 1063 ASSERT(!m_backgroundTokenForNetworkProcess || !m_foregroundTokenForNetworkProcess); 1064 1065 // The network process crashed; take new tokens for the new network process. 1066 if (m_backgroundTokenForNetworkProcess) 1067 m_backgroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().backgroundActivityToken(); 1068 else if (m_foregroundTokenForNetworkProcess) 1069 m_foregroundTokenForNetworkProcess = newNetworkProcessProxy.throttler().foregroundActivityToken(); 1070 #else 1071 UNUSED_PARAM(newNetworkProcessProxy); 1072 #endif 1073 } 1074 1075 void WebProcessProxy::didSetAssertionState(AssertionState state) 1076 { 1077 #if PLATFORM(IOS) 1078 ASSERT(!m_backgroundTokenForNetworkProcess || !m_foregroundTokenForNetworkProcess); 1063 if (isServiceWorkerProcess()) 1064 return; 1065 1066 ASSERT(!m_backgroundToken || !m_foregroundToken); 1079 1067 1080 1068 switch (state) { 1081 1069 case AssertionState::Suspended: 1082 1070 RELEASE_LOG(ProcessSuspension, "%p - WebProcessProxy::didSetAssertionState(Suspended) release all assertions for network process", this); 1083 m_foregroundToken ForNetworkProcess= nullptr;1084 m_backgroundToken ForNetworkProcess= nullptr;1071 m_foregroundToken = nullptr; 1072 m_backgroundToken = nullptr; 1085 1073 for (auto& page : m_pageMap.values()) 1086 1074 page->processWillBecomeSuspended(); … … 1089 1077 case AssertionState::Background: 1090 1078 RELEASE_LOG(ProcessSuspension, "%p - WebProcessProxy::didSetAssertionState(Background) taking background assertion for network process", this); 1091 m_backgroundToken ForNetworkProcess = processPool().ensureNetworkProcess().throttler().backgroundActivityToken();1092 m_foregroundToken ForNetworkProcess= nullptr;1079 m_backgroundToken = processPool().backgroundWebProcessToken(); 1080 m_foregroundToken = nullptr; 1093 1081 break; 1094 1082 1095 1083 case AssertionState::Foreground: 1096 1084 RELEASE_LOG(ProcessSuspension, "%p - WebProcessProxy::didSetAssertionState(Foreground) taking foreground assertion for network process", this); 1097 m_foregroundToken ForNetworkProcess = processPool().ensureNetworkProcess().throttler().foregroundActivityToken();1098 m_backgroundToken ForNetworkProcess= nullptr;1085 m_foregroundToken = processPool().foregroundWebProcessToken(); 1086 m_backgroundToken = nullptr; 1099 1087 for (auto& page : m_pageMap.values()) 1100 1088 page->processWillBecomeForeground(); … … 1102 1090 } 1103 1091 1104 ASSERT(!m_backgroundToken ForNetworkProcess || !m_foregroundTokenForNetworkProcess);1092 ASSERT(!m_backgroundToken || !m_foregroundToken); 1105 1093 #else 1106 1094 UNUSED_PARAM(state); -
trunk/Source/WebKit/UIProcess/WebProcessProxy.h
r225289 r225850 78 78 struct WebsiteData; 79 79 80 #if PLATFORM(IOS) 81 enum ForegroundWebProcessCounterType { }; 82 typedef RefCounter<ForegroundWebProcessCounterType> ForegroundWebProcessCounter; 83 typedef ForegroundWebProcessCounter::Token ForegroundWebProcessToken; 84 enum BackgroundWebProcessCounterType { }; 85 typedef RefCounter<BackgroundWebProcessCounterType> BackgroundWebProcessCounter; 86 typedef BackgroundWebProcessCounter::Token BackgroundWebProcessToken; 87 #endif 88 80 89 class WebProcessProxy : public ChildProcessProxy, public ResponsivenessTimer::Client, private ProcessThrottlerClient { 81 90 public: … … 175 184 ProcessThrottler& throttler() { return m_throttler; } 176 185 177 void reinstateNetworkProcessAssertionState(NetworkProcessProxy&);178 179 186 void isResponsive(WTF::Function<void(bool isWebProcessResponsive)>&&); 180 187 void didReceiveMainThreadPing(); … … 281 288 ProcessThrottler::BackgroundActivityToken m_tokenForHoldingLockedFiles; 282 289 #if PLATFORM(IOS) 283 ProcessThrottler::ForegroundActivityToken m_foregroundTokenForNetworkProcess;284 ProcessThrottler::BackgroundActivityToken m_backgroundTokenForNetworkProcess;290 ForegroundWebProcessToken m_foregroundToken; 291 BackgroundWebProcessToken m_backgroundToken; 285 292 #endif 286 293
Note: See TracChangeset
for help on using the changeset viewer.