Changeset 245873 in webkit
- Timestamp:
- May 29, 2019 3:21:08 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r245854 r245873 1 2019-05-29 Youenn Fablet <youenn@apple.com> 2 3 Reestablish WebSWClientConnection in case of network process crash 4 https://bugs.webkit.org/show_bug.cgi?id=198333 5 6 Reviewed by Alex Christensen. 7 8 * http/wpt/service-workers/service-worker-networkprocess-crash-expected.txt: Added. 9 * http/wpt/service-workers/service-worker-networkprocess-crash.html: Added. 10 1 11 2019-05-29 Antti Koivisto <antti@apple.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r245871 r245873 1 2019-05-29 Youenn Fablet <youenn@apple.com> 2 3 Reestablish WebSWClientConnection in case of network process crash 4 https://bugs.webkit.org/show_bug.cgi?id=198333 5 6 Reviewed by Alex Christensen. 7 8 Refactor DocumentLoader to no longer take a ref to the SWClientConnection. 9 Instead, store the sessionID and get the SWClientConnection from it. 10 Remove unused code from ServiceWorkerContainer. 11 12 Test: http/wpt/service-workers/service-worker-networkprocess-crash.html 13 14 * loader/DocumentLoader.cpp: 15 (WebCore::DocumentLoader::registerTemporaryServiceWorkerClient): 16 (WebCore::DocumentLoader::unregisterTemporaryServiceWorkerClient): 17 * loader/DocumentLoader.h: 18 * workers/service/ServiceWorkerContainer.cpp: 19 * workers/service/ServiceWorkerContainer.h: 20 * workers/service/ServiceWorkerJobClient.h: 21 1 22 2019-05-29 David Kilzer <ddkilzer@apple.com> 2 23 -
trunk/Source/WebCore/loader/DocumentLoader.cpp
r245481 r245873 1816 1816 m_temporaryServiceWorkerClient = TemporaryServiceWorkerClient { 1817 1817 DocumentIdentifier::generate(), 1818 *ServiceWorkerProvider::singleton().existingServiceWorkerConnectionForSession(m_frame->page()->sessionID())1818 m_frame->page()->sessionID() 1819 1819 }; 1820 1820 1821 auto& serviceWorkerConnection = ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(m_temporaryServiceWorkerClient->sessionID); 1822 1821 1823 // FIXME: Compute ServiceWorkerClientFrameType appropriately. 1822 ServiceWorkerClientData data { { m_temporaryServiceWorkerClient->serviceWorkerConnection->serverConnectionIdentifier(), m_temporaryServiceWorkerClient->documentIdentifier }, ServiceWorkerClientType::Window, ServiceWorkerClientFrameType::None, url };1824 ServiceWorkerClientData data { { serviceWorkerConnection.serverConnectionIdentifier(), m_temporaryServiceWorkerClient->documentIdentifier }, ServiceWorkerClientType::Window, ServiceWorkerClientFrameType::None, url }; 1823 1825 1824 1826 RefPtr<SecurityOrigin> topOrigin; … … 1827 1829 else 1828 1830 topOrigin = &m_frame->mainFrame().document()->topOrigin(); 1829 m_temporaryServiceWorkerClient->serviceWorkerConnection->registerServiceWorkerClient(*topOrigin, WTFMove(data), m_serviceWorkerRegistrationData->identifier, m_frame->loader().userAgent(url));1831 serviceWorkerConnection.registerServiceWorkerClient(*topOrigin, WTFMove(data), m_serviceWorkerRegistrationData->identifier, m_frame->loader().userAgent(url)); 1830 1832 #else 1831 1833 UNUSED_PARAM(url); … … 1839 1841 return; 1840 1842 1841 m_temporaryServiceWorkerClient->serviceWorkerConnection->unregisterServiceWorkerClient(m_temporaryServiceWorkerClient->documentIdentifier); 1843 auto& serviceWorkerConnection = ServiceWorkerProvider::singleton().serviceWorkerConnectionForSession(m_temporaryServiceWorkerClient->sessionID); 1844 serviceWorkerConnection.unregisterServiceWorkerClient(m_temporaryServiceWorkerClient->documentIdentifier); 1842 1845 m_temporaryServiceWorkerClient = WTF::nullopt; 1843 1846 #endif -
trunk/Source/WebCore/loader/DocumentLoader.h
r245483 r245873 612 612 struct TemporaryServiceWorkerClient { 613 613 DocumentIdentifier documentIdentifier; 614 Ref<SWClientConnection> serviceWorkerConnection;614 PAL::SessionID sessionID; 615 615 }; 616 616 Optional<TemporaryServiceWorkerClient> m_temporaryServiceWorkerClient; -
trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp
r244225 r245873 576 576 } 577 577 578 SWServerConnectionIdentifier ServiceWorkerContainer::connectionIdentifier()579 {580 ASSERT(m_swConnection);581 return m_swConnection->serverConnectionIdentifier();582 }583 584 578 const char* ServiceWorkerContainer::activeDOMObjectName() const 585 579 { -
trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h
r244160 r245873 104 104 void didFinishGetRegistrationsRequest(uint64_t requestIdentifier, Vector<ServiceWorkerRegistrationData>&&); 105 105 106 SWServerConnectionIdentifier connectionIdentifier() final;107 106 DocumentOrWorkerIdentifier contextIdentifier() final; 108 107 -
trunk/Source/WebCore/workers/service/ServiceWorkerJobClient.h
r240727 r245873 52 52 virtual void jobFinishedLoadingScript(ServiceWorkerJob&, const String& script, const ContentSecurityPolicyResponseHeaders&, const String& referrerPolicy) = 0; 53 53 virtual void jobFailedLoadingScript(ServiceWorkerJob&, const ResourceError&, Exception&&) = 0; 54 55 virtual SWServerConnectionIdentifier connectionIdentifier() = 0;56 54 }; 57 55 -
trunk/Source/WebKit/ChangeLog
r245872 r245873 1 2019-05-29 Youenn Fablet <youenn@apple.com> 2 3 Reestablish WebSWClientConnection in case of network process crash 4 https://bugs.webkit.org/show_bug.cgi?id=198333 5 6 Reviewed by Alex Christensen. 7 8 WebSWClientConnection now takes a RefPtr<IPC::Connection> so that on network process crash, it will set it back to null. 9 On the next call that needs the connection, WebSWClientConnection will reinitialize its underlying IPC connection and its own identifier. 10 Make sure that all code paths requiring this initialization are covered. 11 12 * WebProcess/Network/NetworkProcessConnection.cpp: 13 (WebKit::NetworkProcessConnection::didClose): 14 (WebKit::NetworkProcessConnection::serviceWorkerConnectionForSession): 15 (WebKit::NetworkProcessConnection::isRegisteredActiveSWClientConnection): 16 (WebKit::NetworkProcessConnection::initializeSWClientConnection): 17 * WebProcess/Network/NetworkProcessConnection.h: 18 * WebProcess/Storage/WebSWClientConnection.cpp: 19 (WebKit::WebSWClientConnection::WebSWClientConnection): 20 (WebKit::WebSWClientConnection::~WebSWClientConnection): 21 (WebKit::WebSWClientConnection::initializeConnectionIfNeeded): 22 (WebKit::WebSWClientConnection::ensureConnectionAndSend): 23 (WebKit::WebSWClientConnection::scheduleJobInServer): 24 (WebKit::WebSWClientConnection::finishFetchingScriptInServer): 25 (WebKit::WebSWClientConnection::addServiceWorkerRegistrationInServer): 26 (WebKit::WebSWClientConnection::removeServiceWorkerRegistrationInServer): 27 (WebKit::WebSWClientConnection::registerServiceWorkerClient): 28 (WebKit::WebSWClientConnection::unregisterServiceWorkerClient): 29 (WebKit::WebSWClientConnection::didResolveRegistrationPromise): 30 (WebKit::WebSWClientConnection::matchRegistration): 31 (WebKit::WebSWClientConnection::runOrDelayTaskForImport): 32 (WebKit::WebSWClientConnection::whenRegistrationReady): 33 (WebKit::WebSWClientConnection::getRegistrations): 34 (WebKit::WebSWClientConnection::startFetch): 35 (WebKit::WebSWClientConnection::cancelFetch): 36 (WebKit::WebSWClientConnection::continueDidReceiveFetchResponse): 37 (WebKit::WebSWClientConnection::connectionToServerLost): 38 (WebKit::WebSWClientConnection::syncTerminateWorker): 39 (WebKit::WebSWClientConnection::serverConnectionIdentifier const): 40 (WebKit::WebSWClientConnection::updateThrottleState): 41 * WebProcess/Storage/WebSWClientConnection.h: 42 1 43 2019-05-29 Said Abou-Hallawa <sabouhallawa@apple.com> 2 44 -
trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp
r245796 r245873 196 196 197 197 #if ENABLE(SERVICE_WORKER) 198 m_swConnectionsByIdentifier.clear(); 198 199 for (auto& connection : m_swConnectionsBySession.values()) 199 200 connection->connectionToServerLost(); 200 201 m_swConnectionsByIdentifier.clear();202 m_swConnectionsBySession.clear();203 201 #endif 204 202 } … … 263 261 { 264 262 ASSERT(sessionID.isValid()); 265 return *m_swConnectionsBySession.ensure(sessionID, [&] { 266 auto connection = WebSWClientConnection::create(m_connection, sessionID); 267 268 auto result = m_swConnectionsByIdentifier.add(connection->serverConnectionIdentifier(), connection.ptr()); 269 ASSERT_UNUSED(result, result.isNewEntry); 270 271 return connection; 263 return *m_swConnectionsBySession.ensure(sessionID, [sessionID] { 264 return WebSWClientConnection::create(sessionID); 272 265 }).iterator->value; 273 266 } 267 268 SWServerConnectionIdentifier NetworkProcessConnection::initializeSWClientConnection(WebSWClientConnection& connection) 269 { 270 SWServerConnectionIdentifier identifier; 271 bool result = m_connection->sendSync(Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection(connection.sessionID()), Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection::Reply(identifier), 0); 272 ASSERT_UNUSED(result, result); 273 274 ASSERT(!m_swConnectionsByIdentifier.contains(identifier)); 275 m_swConnectionsByIdentifier.add(identifier, &connection); 276 277 return identifier; 278 } 279 274 280 #endif 275 281 } // namespace WebKit -
trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.h
r238655 r245873 30 30 #include "ShareableResource.h" 31 31 #include "WebIDBConnectionToServer.h" 32 #include <WebCore/ServiceWorkerTypes.h> 32 33 #include <wtf/RefCounted.h> 33 34 #include <wtf/text/WTFString.h> … … 75 76 WebSWClientConnection* existingServiceWorkerConnectionForSession(PAL::SessionID sessionID) { return m_swConnectionsBySession.get(sessionID); } 76 77 WebSWClientConnection& serviceWorkerConnectionForSession(PAL::SessionID); 78 79 WebCore::SWServerConnectionIdentifier initializeSWClientConnection(WebSWClientConnection&); 77 80 #endif 78 81 -
trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp
r245299 r245873 32 32 #include "FormDataReference.h" 33 33 #include "Logging.h" 34 #include "Network ConnectionToWebProcessMessages.h"34 #include "NetworkProcessConnection.h" 35 35 #include "ServiceWorkerClientFetch.h" 36 36 #include "WebCoreArgumentCoders.h" … … 52 52 using namespace WebCore; 53 53 54 WebSWClientConnection::WebSWClientConnection(IPC::Connection& connection, SessionID sessionID) 54 55 WebSWClientConnection::WebSWClientConnection(SessionID sessionID) 55 56 : m_sessionID(sessionID) 56 , m_connection(connection)57 57 , m_swOriginTable(makeUniqueRef<WebSWOriginTable>()) 58 58 { 59 59 ASSERT(sessionID.isValid()); 60 bool result = sendSync(Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection(sessionID), Messages::NetworkConnectionToWebProcess::EstablishSWServerConnection::Reply(m_identifier)); 61 62 ASSERT_UNUSED(result, result); 60 initializeConnectionIfNeeded(); 61 } 62 63 WebSWClientConnection::~WebSWClientConnection() 64 { 65 } 66 67 void WebSWClientConnection::initializeConnectionIfNeeded() 68 { 69 if (m_connection) 70 return; 71 72 auto& networkProcessConnection = WebProcess::singleton().ensureNetworkProcessConnection(); 73 74 m_connection = &networkProcessConnection.connection(); 75 m_identifier = networkProcessConnection.initializeSWClientConnection(*this); 76 63 77 updateThrottleState(); 64 78 } 65 79 66 WebSWClientConnection::~WebSWClientConnection() 67 { 80 template<typename U> 81 void WebSWClientConnection::ensureConnectionAndSend(const U& message) 82 { 83 initializeConnectionIfNeeded(); 84 send(message); 68 85 } 69 86 70 87 void WebSWClientConnection::scheduleJobInServer(const ServiceWorkerJobData& jobData) 71 88 { 72 send(Messages::WebSWServerConnection::ScheduleJobInServer(jobData));89 ensureConnectionAndSend(Messages::WebSWServerConnection::ScheduleJobInServer(jobData)); 73 90 } 74 91 75 92 void WebSWClientConnection::finishFetchingScriptInServer(const ServiceWorkerFetchResult& result) 76 93 { 77 send(Messages::WebSWServerConnection::FinishFetchingScriptInServer(result));94 ensureConnectionAndSend(Messages::WebSWServerConnection::FinishFetchingScriptInServer(result)); 78 95 } 79 96 80 97 void WebSWClientConnection::addServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier identifier) 81 98 { 82 send(Messages::WebSWServerConnection::AddServiceWorkerRegistrationInServer(identifier));99 ensureConnectionAndSend(Messages::WebSWServerConnection::AddServiceWorkerRegistrationInServer(identifier)); 83 100 } 84 101 85 102 void WebSWClientConnection::removeServiceWorkerRegistrationInServer(ServiceWorkerRegistrationIdentifier identifier) 86 103 { 87 send(Messages::WebSWServerConnection::RemoveServiceWorkerRegistrationInServer(identifier));104 ensureConnectionAndSend(Messages::WebSWServerConnection::RemoveServiceWorkerRegistrationInServer(identifier)); 88 105 } 89 106 … … 97 114 void WebSWClientConnection::registerServiceWorkerClient(const SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData& data, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, const String& userAgent) 98 115 { 99 send(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier, userAgent });116 ensureConnectionAndSend(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier, userAgent }); 100 117 } 101 118 102 119 void WebSWClientConnection::unregisterServiceWorkerClient(DocumentIdentifier contextIdentifier) 103 120 { 104 send(Messages::WebSWServerConnection::UnregisterServiceWorkerClient { ServiceWorkerClientIdentifier { serverConnectionIdentifier(), contextIdentifier } });121 ensureConnectionAndSend(Messages::WebSWServerConnection::UnregisterServiceWorkerClient { ServiceWorkerClientIdentifier { serverConnectionIdentifier(), contextIdentifier } }); 105 122 } 106 123 107 124 void WebSWClientConnection::didResolveRegistrationPromise(const ServiceWorkerRegistrationKey& key) 108 125 { 109 send(Messages::WebSWServerConnection::DidResolveRegistrationPromise(key));126 ensureConnectionAndSend(Messages::WebSWServerConnection::DidResolveRegistrationPromise(key)); 110 127 } 111 128 … … 158 175 uint64_t callbackID = ++m_previousCallbackIdentifier; 159 176 m_ongoingMatchRegistrationTasks.add(callbackID, WTFMove(callback)); 160 send(Messages::WebSWServerConnection::MatchRegistration(callbackID, topOrigin, clientURL));177 ensureConnectionAndSend(Messages::WebSWServerConnection::MatchRegistration(callbackID, topOrigin, clientURL)); 161 178 }); 162 179 } … … 164 181 void WebSWClientConnection::runOrDelayTaskForImport(WTF::Function<void()>&& task) 165 182 { 166 if (m_swOriginTable->isImported()) 183 if (m_swOriginTable->isImported()) { 167 184 task(); 168 else 169 m_tasksPendingOriginImport.append(WTFMove(task)); 185 return; 186 } 187 m_tasksPendingOriginImport.append(WTFMove(task)); 188 initializeConnectionIfNeeded(); 170 189 } 171 190 … … 174 193 uint64_t callbackID = ++m_previousCallbackIdentifier; 175 194 m_ongoingRegistrationReadyTasks.add(callbackID, WTFMove(callback)); 176 send(Messages::WebSWServerConnection::WhenRegistrationReady(callbackID, topOrigin.data(), clientURL));195 ensureConnectionAndSend(Messages::WebSWServerConnection::WhenRegistrationReady(callbackID, topOrigin.data(), clientURL)); 177 196 } 178 197 … … 196 215 uint64_t callbackID = ++m_previousCallbackIdentifier; 197 216 m_ongoingGetRegistrationsTasks.add(callbackID, WTFMove(callback)); 198 send(Messages::WebSWServerConnection::GetRegistrations(callbackID, topOrigin, clientURL));217 ensureConnectionAndSend(Messages::WebSWServerConnection::GetRegistrations(callbackID, topOrigin, clientURL)); 199 218 }); 200 219 } … … 202 221 void WebSWClientConnection::startFetch(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier, const ResourceRequest& request, const FetchOptions& options, const String& referrer) 203 222 { 204 send(Messages::WebSWServerConnection::StartFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier, request, options, IPC::FormDataReference { request.httpBody() }, referrer });223 ensureConnectionAndSend(Messages::WebSWServerConnection::StartFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier, request, options, IPC::FormDataReference { request.httpBody() }, referrer }); 205 224 } 206 225 207 226 void WebSWClientConnection::cancelFetch(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier) 208 227 { 209 send(Messages::WebSWServerConnection::CancelFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier });228 ensureConnectionAndSend(Messages::WebSWServerConnection::CancelFetch { serviceWorkerRegistrationIdentifier, fetchIdentifier }); 210 229 } 211 230 212 231 void WebSWClientConnection::continueDidReceiveFetchResponse(FetchIdentifier fetchIdentifier, ServiceWorkerRegistrationIdentifier serviceWorkerRegistrationIdentifier) 213 232 { 214 send(Messages::WebSWServerConnection::ContinueDidReceiveFetchResponse { serviceWorkerRegistrationIdentifier, fetchIdentifier });233 ensureConnectionAndSend(Messages::WebSWServerConnection::ContinueDidReceiveFetchResponse { serviceWorkerRegistrationIdentifier, fetchIdentifier }); 215 234 } 216 235 217 236 void WebSWClientConnection::connectionToServerLost() 218 237 { 238 m_connection = nullptr; 239 219 240 auto registrationTasks = WTFMove(m_ongoingMatchRegistrationTasks); 220 241 for (auto& callback : registrationTasks.values()) … … 230 251 void WebSWClientConnection::syncTerminateWorker(ServiceWorkerIdentifier identifier) 231 252 { 253 initializeConnectionIfNeeded(); 254 232 255 sendSync(Messages::WebSWServerConnection::SyncTerminateWorkerFromClient(identifier), Messages::WebSWServerConnection::SyncTerminateWorkerFromClient::Reply()); 233 256 } 234 257 258 WebCore::SWServerConnectionIdentifier WebSWClientConnection::serverConnectionIdentifier() const 259 { 260 const_cast<WebSWClientConnection*>(this)->initializeConnectionIfNeeded(); 261 return m_identifier; 262 } 263 235 264 void WebSWClientConnection::updateThrottleState() 236 265 { 237 266 m_isThrottleable = WebProcess::singleton().areAllPagesThrottleable(); 238 send(Messages::WebSWServerConnection::SetThrottleState { m_isThrottleable });267 ensureConnectionAndSend(Messages::WebSWServerConnection::SetThrottleState { m_isThrottleable }); 239 268 } 240 269 -
trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h
r245299 r245873 48 48 class WebServiceWorkerProvider; 49 49 50 class WebSWClientConnection final : public WebCore::SWClientConnection, p ublicIPC::MessageSender, public IPC::MessageReceiver {50 class WebSWClientConnection final : public WebCore::SWClientConnection, private IPC::MessageSender, public IPC::MessageReceiver { 51 51 public: 52 static Ref<WebSWClientConnection> create( IPC::Connection& connection, PAL::SessionID sessionID) { return adoptRef(*new WebSWClientConnection { connection,sessionID }); }52 static Ref<WebSWClientConnection> create(PAL::SessionID sessionID) { return adoptRef(*new WebSWClientConnection { sessionID }); } 53 53 ~WebSWClientConnection(); 54 54 55 WebCore::SWServerConnectionIdentifier serverConnectionIdentifier() const final { return m_identifier; }55 WebCore::SWServerConnectionIdentifier serverConnectionIdentifier() const final; 56 56 57 57 void addServiceWorkerRegistrationInServer(WebCore::ServiceWorkerRegistrationIdentifier) final; … … 70 70 void syncTerminateWorker(WebCore::ServiceWorkerIdentifier) final; 71 71 72 PAL::SessionID sessionID() const { return m_sessionID; } 73 72 74 private: 73 WebSWClientConnection(IPC::Connection&, PAL::SessionID); 75 explicit WebSWClientConnection(PAL::SessionID); 76 77 void initializeConnectionIfNeeded(); 74 78 75 79 void scheduleJobInServer(const WebCore::ServiceWorkerJobData&) final; … … 95 99 void runOrDelayTaskForImport(WTF::Function<void()>&& task); 96 100 97 IPC::Connection* messageSenderConnection() const final { return m_connection. ptr(); }101 IPC::Connection* messageSenderConnection() const final { return m_connection.get(); } 98 102 uint64_t messageSenderDestinationID() const final { return m_identifier.toUInt64(); } 99 103 … … 101 105 void setSWOriginTableIsImported(); 102 106 107 template<typename U> void ensureConnectionAndSend(const U& message); 108 103 109 PAL::SessionID m_sessionID; 104 110 WebCore::SWServerConnectionIdentifier m_identifier; 105 111 106 Ref <IPC::Connection> m_connection;112 RefPtr<IPC::Connection> m_connection; 107 113 UniqueRef<WebSWOriginTable> m_swOriginTable; 108 114
Note: See TracChangeset
for help on using the changeset viewer.