| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/service_worker/service_worker_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "content/public/browser/content_browser_client.h" | 35 #include "content/public/browser/content_browser_client.h" |
| 36 #include "content/public/browser/page_navigator.h" | 36 #include "content/public/browser/page_navigator.h" |
| 37 #include "content/public/browser/render_frame_host.h" | 37 #include "content/public/browser/render_frame_host.h" |
| 38 #include "content/public/browser/render_process_host.h" | 38 #include "content/public/browser/render_process_host.h" |
| 39 #include "content/public/browser/web_contents.h" | 39 #include "content/public/browser/web_contents.h" |
| 40 #include "content/public/browser/web_contents_observer.h" | 40 #include "content/public/browser/web_contents_observer.h" |
| 41 #include "content/public/common/child_process_host.h" | 41 #include "content/public/common/child_process_host.h" |
| 42 #include "content/public/common/content_client.h" | 42 #include "content/public/common/content_client.h" |
| 43 #include "content/public/common/content_switches.h" | 43 #include "content/public/common/content_switches.h" |
| 44 #include "content/public/common/result_codes.h" | 44 #include "content/public/common/result_codes.h" |
| 45 #include "mojo/common/common_type_converters.h" |
| 46 #include "mojo/common/url_type_converters.h" |
| 45 #include "net/http/http_response_headers.h" | 47 #include "net/http/http_response_headers.h" |
| 46 #include "net/http/http_response_info.h" | 48 #include "net/http/http_response_info.h" |
| 47 | 49 |
| 48 namespace content { | 50 namespace content { |
| 49 | 51 |
| 50 using StatusCallback = ServiceWorkerVersion::StatusCallback; | 52 using StatusCallback = ServiceWorkerVersion::StatusCallback; |
| 51 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; | 53 using ServiceWorkerClients = std::vector<ServiceWorkerClientInfo>; |
| 52 using GetClientsCallback = | 54 using GetClientsCallback = |
| 53 base::Callback<void(scoped_ptr<ServiceWorkerClients>)>; | 55 base::Callback<void(scoped_ptr<ServiceWorkerClients>)>; |
| 54 | 56 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 const std::vector<TransferredMessagePort>& sent_message_ports, | 160 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 159 const ServiceWorkerVersion::StatusCallback& callback, | 161 const ServiceWorkerVersion::StatusCallback& callback, |
| 160 ServiceWorkerStatusCode status) { | 162 ServiceWorkerStatusCode status) { |
| 161 // Transfering the message ports failed, so destroy the ports. | 163 // Transfering the message ports failed, so destroy the ports. |
| 162 for (const TransferredMessagePort& port : sent_message_ports) { | 164 for (const TransferredMessagePort& port : sent_message_ports) { |
| 163 MessagePortService::GetInstance()->ClosePort(port.id); | 165 MessagePortService::GetInstance()->ClosePort(port.id); |
| 164 } | 166 } |
| 165 callback.Run(status); | 167 callback.Run(status); |
| 166 } | 168 } |
| 167 | 169 |
| 168 void RunErrorCrossOriginConnectCallback( | 170 void RunErrorServicePortConnectCallback( |
| 169 const ServiceWorkerVersion::CrossOriginConnectCallback& callback, | 171 const ServiceWorkerVersion::ServicePortConnectCallback& callback, |
| 170 ServiceWorkerStatusCode status) { | 172 ServiceWorkerStatusCode status) { |
| 171 callback.Run(status, false /* accept_connection */); | 173 callback.Run(status, false /* accept_connection */, base::string16(), |
| 174 base::string16()); |
| 172 } | 175 } |
| 173 | 176 |
| 174 void RunErrorSendStashedPortsCallback( | 177 void RunErrorSendStashedPortsCallback( |
| 175 const ServiceWorkerVersion::SendStashedPortsCallback& callback, | 178 const ServiceWorkerVersion::SendStashedPortsCallback& callback, |
| 176 ServiceWorkerStatusCode status) { | 179 ServiceWorkerStatusCode status) { |
| 177 callback.Run(status, std::vector<int>()); | 180 callback.Run(status, std::vector<int>()); |
| 178 } | 181 } |
| 179 | 182 |
| 180 using WindowOpenedCallback = base::Callback<void(int, int)>; | 183 using WindowOpenedCallback = base::Callback<void(int, int)>; |
| 181 | 184 |
| (...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 887 AddRequest(callback, &geofencing_requests_, REQUEST_GEOFENCING); | 890 AddRequest(callback, &geofencing_requests_, REQUEST_GEOFENCING); |
| 888 ServiceWorkerStatusCode status = | 891 ServiceWorkerStatusCode status = |
| 889 embedded_worker_->SendMessage(ServiceWorkerMsg_GeofencingEvent( | 892 embedded_worker_->SendMessage(ServiceWorkerMsg_GeofencingEvent( |
| 890 request_id, event_type, region_id, region)); | 893 request_id, event_type, region_id, region)); |
| 891 if (status != SERVICE_WORKER_OK) { | 894 if (status != SERVICE_WORKER_OK) { |
| 892 geofencing_requests_.Remove(request_id); | 895 geofencing_requests_.Remove(request_id); |
| 893 RunSoon(base::Bind(callback, status)); | 896 RunSoon(base::Bind(callback, status)); |
| 894 } | 897 } |
| 895 } | 898 } |
| 896 | 899 |
| 897 void ServiceWorkerVersion::DispatchCrossOriginConnectEvent( | 900 void ServiceWorkerVersion::DispatchServicePortConnectEvent( |
| 898 const CrossOriginConnectCallback& callback, | 901 const ServicePortConnectCallback& callback, |
| 899 const NavigatorConnectClient& client) { | 902 const GURL& target_url, |
| 903 const GURL& origin, |
| 904 int port_id) { |
| 900 DCHECK_EQ(ACTIVATED, status()) << status(); | 905 DCHECK_EQ(ACTIVATED, status()) << status(); |
| 901 | 906 |
| 902 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 907 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 903 switches::kEnableExperimentalWebPlatformFeatures)) { | 908 switches::kEnableExperimentalWebPlatformFeatures)) { |
| 904 callback.Run(SERVICE_WORKER_ERROR_ABORT, false); | 909 callback.Run(SERVICE_WORKER_ERROR_ABORT, false, base::string16(), |
| 910 base::string16()); |
| 905 return; | 911 return; |
| 906 } | 912 } |
| 907 | 913 |
| 908 if (running_status() != RUNNING) { | 914 if (running_status() != RUNNING) { |
| 909 // Schedule calling this method after starting the worker. | 915 // Schedule calling this method after starting the worker. |
| 910 StartWorker( | 916 StartWorker( |
| 911 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 917 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 912 base::Bind(&RunErrorCrossOriginConnectCallback, callback), | 918 base::Bind(&RunErrorServicePortConnectCallback, callback), |
| 913 base::Bind(&self::DispatchCrossOriginConnectEvent, | 919 base::Bind(&self::DispatchServicePortConnectEvent, |
| 914 weak_factory_.GetWeakPtr(), callback, client))); | 920 weak_factory_.GetWeakPtr(), callback, target_url, |
| 921 origin, port_id))); |
| 915 return; | 922 return; |
| 916 } | 923 } |
| 917 | 924 |
| 918 int request_id = AddRequest(callback, &cross_origin_connect_requests_, | 925 int request_id = AddRequest(callback, &service_port_connect_requests_, |
| 919 REQUEST_CROSS_ORIGIN_CONNECT); | 926 REQUEST_SERVICE_PORT_CONNECT); |
| 920 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 927 if (!service_port_dispatcher_) { |
| 921 ServiceWorkerMsg_CrossOriginConnectEvent(request_id, client)); | 928 embedded_worker_->GetServiceRegistry()->ConnectToRemoteService( |
| 922 if (status != SERVICE_WORKER_OK) { | 929 mojo::GetProxy(&service_port_dispatcher_)); |
| 923 cross_origin_connect_requests_.Remove(request_id); | 930 service_port_dispatcher_.set_connection_error_handler(base::Bind( |
| 924 RunSoon(base::Bind(callback, status, false)); | 931 &ServiceWorkerVersion::OnServicePortDispatcherConnectionError, |
| 932 weak_factory_.GetWeakPtr())); |
| 925 } | 933 } |
| 934 service_port_dispatcher_->Connect( |
| 935 mojo::String::From(target_url), mojo::String::From(origin), port_id, |
| 936 base::Bind(&ServiceWorkerVersion::OnServicePortConnectEventFinished, |
| 937 weak_factory_.GetWeakPtr(), request_id)); |
| 926 } | 938 } |
| 927 | 939 |
| 928 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( | 940 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( |
| 929 const NavigatorConnectClient& client, | 941 const NavigatorConnectClient& client, |
| 930 const base::string16& message, | 942 const base::string16& message, |
| 931 const std::vector<TransferredMessagePort>& sent_message_ports, | 943 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 932 const StatusCallback& callback) { | 944 const StatusCallback& callback) { |
| 933 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to | 945 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to |
| 934 // have already put all the sent message ports on hold. So no need to do that | 946 // have already put all the sent message ports on hold. So no need to do that |
| 935 // here again. | 947 // here again. |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1196 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 1208 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
| 1197 OnFetchEventFinished) | 1209 OnFetchEventFinished) |
| 1198 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 1210 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
| 1199 OnSyncEventFinished) | 1211 OnSyncEventFinished) |
| 1200 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, | 1212 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, |
| 1201 OnNotificationClickEventFinished) | 1213 OnNotificationClickEventFinished) |
| 1202 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, | 1214 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
| 1203 OnPushEventFinished) | 1215 OnPushEventFinished) |
| 1204 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, | 1216 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, |
| 1205 OnGeofencingEventFinished) | 1217 OnGeofencingEventFinished) |
| 1206 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, | |
| 1207 OnCrossOriginConnectEventFinished) | |
| 1208 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | 1218 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
| 1209 OnOpenWindow) | 1219 OnOpenWindow) |
| 1210 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, | 1220 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
| 1211 OnSetCachedMetadata) | 1221 OnSetCachedMetadata) |
| 1212 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, | 1222 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, |
| 1213 OnClearCachedMetadata) | 1223 OnClearCachedMetadata) |
| 1214 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, | 1224 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, |
| 1215 OnPostMessageToClient) | 1225 OnPostMessageToClient) |
| 1216 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 1226 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
| 1217 OnFocusClient) | 1227 OnFocusClient) |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1455 if (!request) { | 1465 if (!request) { |
| 1456 NOTREACHED() << "Got unexpected message: " << request_id; | 1466 NOTREACHED() << "Got unexpected message: " << request_id; |
| 1457 return; | 1467 return; |
| 1458 } | 1468 } |
| 1459 | 1469 |
| 1460 scoped_refptr<ServiceWorkerVersion> protect(this); | 1470 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1461 request->callback.Run(SERVICE_WORKER_OK); | 1471 request->callback.Run(SERVICE_WORKER_OK); |
| 1462 RemoveCallbackAndStopIfRedundant(&geofencing_requests_, request_id); | 1472 RemoveCallbackAndStopIfRedundant(&geofencing_requests_, request_id); |
| 1463 } | 1473 } |
| 1464 | 1474 |
| 1465 void ServiceWorkerVersion::OnCrossOriginConnectEventFinished( | 1475 void ServiceWorkerVersion::OnServicePortConnectEventFinished( |
| 1466 int request_id, | 1476 int request_id, |
| 1467 bool accept_connection) { | 1477 ServicePortConnectResult result, |
| 1478 const mojo::String& name, |
| 1479 const mojo::String& data) { |
| 1468 TRACE_EVENT1("ServiceWorker", | 1480 TRACE_EVENT1("ServiceWorker", |
| 1469 "ServiceWorkerVersion::OnCrossOriginConnectEventFinished", | 1481 "ServiceWorkerVersion::OnServicePortConnectEventFinished", |
| 1470 "Request id", request_id); | 1482 "Request id", request_id); |
| 1471 PendingRequest<CrossOriginConnectCallback>* request = | 1483 PendingRequest<ServicePortConnectCallback>* request = |
| 1472 cross_origin_connect_requests_.Lookup(request_id); | 1484 service_port_connect_requests_.Lookup(request_id); |
| 1473 if (!request) { | 1485 if (!request) { |
| 1474 NOTREACHED() << "Got unexpected message: " << request_id; | 1486 NOTREACHED() << "Got unexpected message: " << request_id; |
| 1475 return; | 1487 return; |
| 1476 } | 1488 } |
| 1477 | 1489 |
| 1478 scoped_refptr<ServiceWorkerVersion> protect(this); | 1490 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1479 request->callback.Run(SERVICE_WORKER_OK, accept_connection); | 1491 request->callback.Run(SERVICE_WORKER_OK, |
| 1480 RemoveCallbackAndStopIfRedundant(&cross_origin_connect_requests_, request_id); | 1492 result == SERVICE_PORT_CONNECT_RESULT_ACCEPT, |
| 1493 name.To<base::string16>(), data.To<base::string16>()); |
| 1494 RemoveCallbackAndStopIfRedundant(&service_port_connect_requests_, request_id); |
| 1481 } | 1495 } |
| 1482 | 1496 |
| 1483 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1497 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
| 1484 // Just abort if we are shutting down. | 1498 // Just abort if we are shutting down. |
| 1485 if (!context_) | 1499 if (!context_) |
| 1486 return; | 1500 return; |
| 1487 | 1501 |
| 1488 if (!url.is_valid()) { | 1502 if (!url.is_valid()) { |
| 1489 DVLOG(1) << "Received unexpected invalid URL from renderer process."; | 1503 DVLOG(1) << "Received unexpected invalid URL from renderer process."; |
| 1490 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 1504 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1973 // forcibly fail pending callbacks so no one is stuck waiting | 1987 // forcibly fail pending callbacks so no one is stuck waiting |
| 1974 // for the worker. | 1988 // for the worker. |
| 1975 embedded_worker_->StopIfIdle(); | 1989 embedded_worker_->StopIfIdle(); |
| 1976 } | 1990 } |
| 1977 | 1991 |
| 1978 bool ServiceWorkerVersion::HasInflightRequests() const { | 1992 bool ServiceWorkerVersion::HasInflightRequests() const { |
| 1979 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || | 1993 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || |
| 1980 !fetch_requests_.IsEmpty() || !sync_requests_.IsEmpty() || | 1994 !fetch_requests_.IsEmpty() || !sync_requests_.IsEmpty() || |
| 1981 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || | 1995 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || |
| 1982 !geofencing_requests_.IsEmpty() || | 1996 !geofencing_requests_.IsEmpty() || |
| 1983 !cross_origin_connect_requests_.IsEmpty() || | 1997 !service_port_connect_requests_.IsEmpty() || |
| 1984 !streaming_url_request_jobs_.empty(); | 1998 !streaming_url_request_jobs_.empty(); |
| 1985 } | 1999 } |
| 1986 | 2000 |
| 1987 void ServiceWorkerVersion::RecordStartWorkerResult( | 2001 void ServiceWorkerVersion::RecordStartWorkerResult( |
| 1988 ServiceWorkerStatusCode status) { | 2002 ServiceWorkerStatusCode status) { |
| 1989 base::TimeTicks start_time = start_time_; | 2003 base::TimeTicks start_time = start_time_; |
| 1990 ClearTick(&start_time_); | 2004 ClearTick(&start_time_); |
| 1991 | 2005 |
| 1992 ServiceWorkerMetrics::RecordStartWorkerStatus(status, | 2006 ServiceWorkerMetrics::RecordStartWorkerStatus(status, |
| 1993 IsInstalled(prestart_status_)); | 2007 IsInstalled(prestart_status_)); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2064 SERVICE_WORKER_ERROR_TIMEOUT); | 2078 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2065 case REQUEST_NOTIFICATION_CLICK: | 2079 case REQUEST_NOTIFICATION_CLICK: |
| 2066 return RunIDMapCallback(¬ification_click_requests_, info.id, | 2080 return RunIDMapCallback(¬ification_click_requests_, info.id, |
| 2067 SERVICE_WORKER_ERROR_TIMEOUT); | 2081 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2068 case REQUEST_PUSH: | 2082 case REQUEST_PUSH: |
| 2069 return RunIDMapCallback(&push_requests_, info.id, | 2083 return RunIDMapCallback(&push_requests_, info.id, |
| 2070 SERVICE_WORKER_ERROR_TIMEOUT); | 2084 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2071 case REQUEST_GEOFENCING: | 2085 case REQUEST_GEOFENCING: |
| 2072 return RunIDMapCallback(&geofencing_requests_, info.id, | 2086 return RunIDMapCallback(&geofencing_requests_, info.id, |
| 2073 SERVICE_WORKER_ERROR_TIMEOUT); | 2087 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2074 case REQUEST_CROSS_ORIGIN_CONNECT: | 2088 case REQUEST_SERVICE_PORT_CONNECT: |
| 2075 return RunIDMapCallback(&cross_origin_connect_requests_, info.id, | 2089 return RunIDMapCallback(&service_port_connect_requests_, info.id, |
| 2076 SERVICE_WORKER_ERROR_TIMEOUT, | 2090 SERVICE_WORKER_ERROR_TIMEOUT, |
| 2077 false /* accept_connection */); | 2091 false /* accept_connection */, base::string16(), |
| 2092 base::string16()); |
| 2078 } | 2093 } |
| 2079 NOTREACHED() << "Got unexpected request type: " << info.type; | 2094 NOTREACHED() << "Got unexpected request type: " << info.type; |
| 2080 return false; | 2095 return false; |
| 2081 } | 2096 } |
| 2082 | 2097 |
| 2083 void ServiceWorkerVersion::SetAllRequestTimes(const base::TimeTicks& ticks) { | 2098 void ServiceWorkerVersion::SetAllRequestTimes(const base::TimeTicks& ticks) { |
| 2084 std::queue<RequestInfo> new_requests; | 2099 std::queue<RequestInfo> new_requests; |
| 2085 while (!requests_.empty()) { | 2100 while (!requests_.empty()) { |
| 2086 RequestInfo info = requests_.front(); | 2101 RequestInfo info = requests_.front(); |
| 2087 info.time = ticks; | 2102 info.time = ticks; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2184 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | 2199 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
| 2185 RunIDMapCallbacks(&install_requests_, | 2200 RunIDMapCallbacks(&install_requests_, |
| 2186 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); | 2201 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); |
| 2187 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, | 2202 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, |
| 2188 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 2203 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 2189 ServiceWorkerResponse()); | 2204 ServiceWorkerResponse()); |
| 2190 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); | 2205 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2191 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); | 2206 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2192 RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); | 2207 RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2193 RunIDMapCallbacks(&geofencing_requests_, SERVICE_WORKER_ERROR_FAILED); | 2208 RunIDMapCallbacks(&geofencing_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2194 RunIDMapCallbacks(&cross_origin_connect_requests_, | 2209 |
| 2195 SERVICE_WORKER_ERROR_FAILED, false); | 2210 // Close all mojo services. This will also fire and clear all callbacks |
| 2211 // for messages that are still outstanding for those services. |
| 2212 OnServicePortDispatcherConnectionError(); |
| 2196 | 2213 |
| 2197 streaming_url_request_jobs_.clear(); | 2214 streaming_url_request_jobs_.clear(); |
| 2198 | 2215 |
| 2199 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 2216 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 2200 | 2217 |
| 2201 if (should_restart) | 2218 if (should_restart) |
| 2202 StartWorkerInternal(); | 2219 StartWorkerInternal(); |
| 2203 } | 2220 } |
| 2204 | 2221 |
| 2222 void ServiceWorkerVersion::OnServicePortDispatcherConnectionError() { |
| 2223 RunIDMapCallbacks(&service_port_connect_requests_, |
| 2224 SERVICE_WORKER_ERROR_FAILED, false, base::string16(), |
| 2225 base::string16()); |
| 2226 service_port_dispatcher_.reset(); |
| 2227 } |
| 2228 |
| 2205 } // namespace content | 2229 } // namespace content |
| OLD | NEW |