| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 const std::vector<TransferredMessagePort>& sent_message_ports, | 152 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 153 const ServiceWorkerVersion::StatusCallback& callback, | 153 const ServiceWorkerVersion::StatusCallback& callback, |
| 154 ServiceWorkerStatusCode status) { | 154 ServiceWorkerStatusCode status) { |
| 155 // Transfering the message ports failed, so destroy the ports. | 155 // Transfering the message ports failed, so destroy the ports. |
| 156 for (const TransferredMessagePort& port : sent_message_ports) { | 156 for (const TransferredMessagePort& port : sent_message_ports) { |
| 157 MessagePortService::GetInstance()->ClosePort(port.id); | 157 MessagePortService::GetInstance()->ClosePort(port.id); |
| 158 } | 158 } |
| 159 callback.Run(status); | 159 callback.Run(status); |
| 160 } | 160 } |
| 161 | 161 |
| 162 void RunErrorServicePortConnectCallback( | |
| 163 const ServiceWorkerVersion::ServicePortConnectCallback& callback, | |
| 164 ServiceWorkerStatusCode status) { | |
| 165 callback.Run(status, false /* accept_connection */, base::string16(), | |
| 166 base::string16()); | |
| 167 } | |
| 168 | |
| 169 void KillEmbeddedWorkerProcess(int process_id, ResultCode code) { | 162 void KillEmbeddedWorkerProcess(int process_id, ResultCode code) { |
| 170 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 163 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 171 RenderProcessHost* render_process_host = | 164 RenderProcessHost* render_process_host = |
| 172 RenderProcessHost::FromID(process_id); | 165 RenderProcessHost::FromID(process_id); |
| 173 if (render_process_host->GetHandle() != base::kNullProcessHandle) { | 166 if (render_process_host->GetHandle() != base::kNullProcessHandle) { |
| 174 bad_message::ReceivedBadMessage(render_process_host, | 167 bad_message::ReceivedBadMessage(render_process_host, |
| 175 bad_message::SERVICE_WORKER_BAD_URL); | 168 bad_message::SERVICE_WORKER_BAD_URL); |
| 176 } | 169 } |
| 177 } | 170 } |
| 178 | 171 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 registration_id_, scope_.GetOrigin(), | 535 registration_id_, scope_.GetOrigin(), |
| 543 base::Bind(&ServiceWorkerVersion::FoundRegistrationForUpdate, | 536 base::Bind(&ServiceWorkerVersion::FoundRegistrationForUpdate, |
| 544 weak_factory_.GetWeakPtr())); | 537 weak_factory_.GetWeakPtr())); |
| 545 } | 538 } |
| 546 | 539 |
| 547 void ServiceWorkerVersion::DeferScheduledUpdate() { | 540 void ServiceWorkerVersion::DeferScheduledUpdate() { |
| 548 if (update_timer_.IsRunning()) | 541 if (update_timer_.IsRunning()) |
| 549 update_timer_.Reset(); | 542 update_timer_.Reset(); |
| 550 } | 543 } |
| 551 | 544 |
| 545 int ServiceWorkerVersion::StartRequest(const StatusCallback& error_callback) { |
| 546 OnBeginEvent(); |
| 547 DCHECK_EQ(RUNNING, running_status()) |
| 548 << "Can only start a request with a running worker."; |
| 549 return AddRequest(error_callback, &custom_requests_, REQUEST_CUSTOM); |
| 550 } |
| 551 |
| 552 bool ServiceWorkerVersion::FinishRequest(int request_id) { |
| 553 PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id); |
| 554 if (!request) |
| 555 return false; |
| 556 RemoveCallbackAndStopIfRedundant(&custom_requests_, request_id); |
| 557 return true; |
| 558 } |
| 559 |
| 560 void ServiceWorkerVersion::RunAfterStartWorker( |
| 561 const StatusCallback& error_callback, |
| 562 const base::Closure& task) { |
| 563 StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 564 error_callback, task)); |
| 565 } |
| 566 |
| 552 void ServiceWorkerVersion::DispatchMessageEvent( | 567 void ServiceWorkerVersion::DispatchMessageEvent( |
| 553 const base::string16& message, | 568 const base::string16& message, |
| 554 const std::vector<TransferredMessagePort>& sent_message_ports, | 569 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 555 const StatusCallback& callback) { | 570 const StatusCallback& callback) { |
| 556 for (const TransferredMessagePort& port : sent_message_ports) { | 571 for (const TransferredMessagePort& port : sent_message_ports) { |
| 557 MessagePortService::GetInstance()->HoldMessages(port.id); | 572 MessagePortService::GetInstance()->HoldMessages(port.id); |
| 558 } | 573 } |
| 559 | 574 |
| 560 DispatchMessageEventInternal(message, sent_message_ports, callback); | 575 DispatchMessageEventInternal(message, sent_message_ports, callback); |
| 561 } | 576 } |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 AddRequest(callback, &geofencing_requests_, REQUEST_GEOFENCING); | 794 AddRequest(callback, &geofencing_requests_, REQUEST_GEOFENCING); |
| 780 ServiceWorkerStatusCode status = | 795 ServiceWorkerStatusCode status = |
| 781 embedded_worker_->SendMessage(ServiceWorkerMsg_GeofencingEvent( | 796 embedded_worker_->SendMessage(ServiceWorkerMsg_GeofencingEvent( |
| 782 request_id, event_type, region_id, region)); | 797 request_id, event_type, region_id, region)); |
| 783 if (status != SERVICE_WORKER_OK) { | 798 if (status != SERVICE_WORKER_OK) { |
| 784 geofencing_requests_.Remove(request_id); | 799 geofencing_requests_.Remove(request_id); |
| 785 RunSoon(base::Bind(callback, status)); | 800 RunSoon(base::Bind(callback, status)); |
| 786 } | 801 } |
| 787 } | 802 } |
| 788 | 803 |
| 789 void ServiceWorkerVersion::DispatchServicePortConnectEvent( | |
| 790 const ServicePortConnectCallback& callback, | |
| 791 const GURL& target_url, | |
| 792 const GURL& origin, | |
| 793 int port_id) { | |
| 794 OnBeginEvent(); | |
| 795 DCHECK_EQ(ACTIVATED, status()) << status(); | |
| 796 | |
| 797 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 798 switches::kEnableExperimentalWebPlatformFeatures)) { | |
| 799 callback.Run(SERVICE_WORKER_ERROR_ABORT, false, base::string16(), | |
| 800 base::string16()); | |
| 801 return; | |
| 802 } | |
| 803 | |
| 804 if (running_status() != RUNNING) { | |
| 805 // Schedule calling this method after starting the worker. | |
| 806 StartWorker( | |
| 807 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | |
| 808 base::Bind(&RunErrorServicePortConnectCallback, callback), | |
| 809 base::Bind(&self::DispatchServicePortConnectEvent, | |
| 810 weak_factory_.GetWeakPtr(), callback, target_url, | |
| 811 origin, port_id))); | |
| 812 return; | |
| 813 } | |
| 814 | |
| 815 int request_id = AddRequest(callback, &service_port_connect_requests_, | |
| 816 REQUEST_SERVICE_PORT_CONNECT); | |
| 817 if (!service_port_dispatcher_) { | |
| 818 embedded_worker_->GetServiceRegistry()->ConnectToRemoteService( | |
| 819 mojo::GetProxy(&service_port_dispatcher_)); | |
| 820 service_port_dispatcher_.set_connection_error_handler(base::Bind( | |
| 821 &ServiceWorkerVersion::OnServicePortDispatcherConnectionError, | |
| 822 weak_factory_.GetWeakPtr())); | |
| 823 } | |
| 824 service_port_dispatcher_->Connect( | |
| 825 mojo::String::From(target_url), mojo::String::From(origin), port_id, | |
| 826 base::Bind(&ServiceWorkerVersion::OnServicePortConnectEventFinished, | |
| 827 weak_factory_.GetWeakPtr(), request_id)); | |
| 828 } | |
| 829 | |
| 830 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( | 804 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( |
| 831 const NavigatorConnectClient& client, | 805 const NavigatorConnectClient& client, |
| 832 const base::string16& message, | 806 const base::string16& message, |
| 833 const std::vector<TransferredMessagePort>& sent_message_ports, | 807 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 834 const StatusCallback& callback) { | 808 const StatusCallback& callback) { |
| 835 OnBeginEvent(); | 809 OnBeginEvent(); |
| 836 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to | 810 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to |
| 837 // have already put all the sent message ports on hold. So no need to do that | 811 // have already put all the sent message ports on hold. So no need to do that |
| 838 // here again. | 812 // here again. |
| 839 | 813 |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 994 ServiceWorkerVersion::PendingRequest<CallbackType>::PendingRequest( | 968 ServiceWorkerVersion::PendingRequest<CallbackType>::PendingRequest( |
| 995 const CallbackType& callback, | 969 const CallbackType& callback, |
| 996 const base::TimeTicks& time) | 970 const base::TimeTicks& time) |
| 997 : callback(callback), start_time(time) { | 971 : callback(callback), start_time(time) { |
| 998 } | 972 } |
| 999 | 973 |
| 1000 template <typename CallbackType> | 974 template <typename CallbackType> |
| 1001 ServiceWorkerVersion::PendingRequest<CallbackType>::~PendingRequest() { | 975 ServiceWorkerVersion::PendingRequest<CallbackType>::~PendingRequest() { |
| 1002 } | 976 } |
| 1003 | 977 |
| 978 ServiceWorkerVersion::BaseMojoService::BaseMojoService( |
| 979 ServiceWorkerVersion* worker, |
| 980 const char* service_name) |
| 981 : worker_(worker), service_name_(service_name) {} |
| 982 |
| 983 ServiceWorkerVersion::BaseMojoService::~BaseMojoService() { |
| 984 IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer>::iterator iter( |
| 985 &worker_->custom_requests_); |
| 986 while (!iter.IsAtEnd()) { |
| 987 PendingRequest<StatusCallback>* request = iter.GetCurrentValue(); |
| 988 if (request->mojo_service == service_name_) { |
| 989 request->callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 990 worker_->custom_requests_.Remove(iter.GetCurrentKey()); |
| 991 } |
| 992 iter.Advance(); |
| 993 } |
| 994 } |
| 995 |
| 1004 void ServiceWorkerVersion::OnThreadStarted() { | 996 void ServiceWorkerVersion::OnThreadStarted() { |
| 1005 if (running_status() == STOPPING) | 997 if (running_status() == STOPPING) |
| 1006 return; | 998 return; |
| 1007 DCHECK_EQ(STARTING, running_status()); | 999 DCHECK_EQ(STARTING, running_status()); |
| 1008 // Activate ping/pong now that JavaScript execution will start. | 1000 // Activate ping/pong now that JavaScript execution will start. |
| 1009 ping_controller_->Activate(); | 1001 ping_controller_->Activate(); |
| 1010 } | 1002 } |
| 1011 | 1003 |
| 1012 void ServiceWorkerVersion::OnStarting() { | 1004 void ServiceWorkerVersion::OnStarting() { |
| 1013 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1005 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1369 if (!request) { | 1361 if (!request) { |
| 1370 NOTREACHED() << "Got unexpected message: " << request_id; | 1362 NOTREACHED() << "Got unexpected message: " << request_id; |
| 1371 return; | 1363 return; |
| 1372 } | 1364 } |
| 1373 | 1365 |
| 1374 scoped_refptr<ServiceWorkerVersion> protect(this); | 1366 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1375 request->callback.Run(SERVICE_WORKER_OK); | 1367 request->callback.Run(SERVICE_WORKER_OK); |
| 1376 RemoveCallbackAndStopIfRedundant(&geofencing_requests_, request_id); | 1368 RemoveCallbackAndStopIfRedundant(&geofencing_requests_, request_id); |
| 1377 } | 1369 } |
| 1378 | 1370 |
| 1379 void ServiceWorkerVersion::OnServicePortConnectEventFinished( | |
| 1380 int request_id, | |
| 1381 ServicePortConnectResult result, | |
| 1382 const mojo::String& name, | |
| 1383 const mojo::String& data) { | |
| 1384 TRACE_EVENT1("ServiceWorker", | |
| 1385 "ServiceWorkerVersion::OnServicePortConnectEventFinished", | |
| 1386 "Request id", request_id); | |
| 1387 PendingRequest<ServicePortConnectCallback>* request = | |
| 1388 service_port_connect_requests_.Lookup(request_id); | |
| 1389 if (!request) { | |
| 1390 NOTREACHED() << "Got unexpected message: " << request_id; | |
| 1391 return; | |
| 1392 } | |
| 1393 | |
| 1394 scoped_refptr<ServiceWorkerVersion> protect(this); | |
| 1395 request->callback.Run(SERVICE_WORKER_OK, | |
| 1396 result == SERVICE_PORT_CONNECT_RESULT_ACCEPT, | |
| 1397 name.To<base::string16>(), data.To<base::string16>()); | |
| 1398 RemoveCallbackAndStopIfRedundant(&service_port_connect_requests_, request_id); | |
| 1399 } | |
| 1400 | |
| 1401 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1371 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
| 1402 // Just abort if we are shutting down. | 1372 // Just abort if we are shutting down. |
| 1403 if (!context_) | 1373 if (!context_) |
| 1404 return; | 1374 return; |
| 1405 | 1375 |
| 1406 if (!url.is_valid()) { | 1376 if (!url.is_valid()) { |
| 1407 DVLOG(1) << "Received unexpected invalid URL from renderer process."; | 1377 DVLOG(1) << "Received unexpected invalid URL from renderer process."; |
| 1408 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 1378 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 1409 base::Bind(&KillEmbeddedWorkerProcess, | 1379 base::Bind(&KillEmbeddedWorkerProcess, |
| 1410 embedded_worker_->process_id(), | 1380 embedded_worker_->process_id(), |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1512 context_->GetProviderHostByClientID(client_uuid); | 1482 context_->GetProviderHostByClientID(client_uuid); |
| 1513 if (!provider_host) { | 1483 if (!provider_host) { |
| 1514 // The client may already have been closed, just ignore. | 1484 // The client may already have been closed, just ignore. |
| 1515 return; | 1485 return; |
| 1516 } | 1486 } |
| 1517 if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { | 1487 if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { |
| 1518 // The client does not belong to the same origin as this ServiceWorker, | 1488 // The client does not belong to the same origin as this ServiceWorker, |
| 1519 // possibly due to timing issue or bad message. | 1489 // possibly due to timing issue or bad message. |
| 1520 return; | 1490 return; |
| 1521 } | 1491 } |
| 1522 provider_host->PostMessage(this, message, sent_message_ports); | 1492 provider_host->PostMessageToClient(this, message, sent_message_ports); |
| 1523 } | 1493 } |
| 1524 | 1494 |
| 1525 void ServiceWorkerVersion::OnFocusClient(int request_id, | 1495 void ServiceWorkerVersion::OnFocusClient(int request_id, |
| 1526 const std::string& client_uuid) { | 1496 const std::string& client_uuid) { |
| 1527 if (!context_) | 1497 if (!context_) |
| 1528 return; | 1498 return; |
| 1529 TRACE_EVENT2("ServiceWorker", | 1499 TRACE_EVENT2("ServiceWorker", |
| 1530 "ServiceWorkerVersion::OnFocusClient", | 1500 "ServiceWorkerVersion::OnFocusClient", |
| 1531 "Request id", request_id, | 1501 "Request id", request_id, |
| 1532 "Client id", client_uuid); | 1502 "Client id", client_uuid); |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 return; | 1955 return; |
| 1986 } | 1956 } |
| 1987 | 1957 |
| 1988 embedded_worker_->StopIfIdle(); | 1958 embedded_worker_->StopIfIdle(); |
| 1989 } | 1959 } |
| 1990 | 1960 |
| 1991 bool ServiceWorkerVersion::HasInflightRequests() const { | 1961 bool ServiceWorkerVersion::HasInflightRequests() const { |
| 1992 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || | 1962 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || |
| 1993 !fetch_requests_.IsEmpty() || !sync_requests_.IsEmpty() || | 1963 !fetch_requests_.IsEmpty() || !sync_requests_.IsEmpty() || |
| 1994 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || | 1964 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || |
| 1995 !geofencing_requests_.IsEmpty() || | 1965 !geofencing_requests_.IsEmpty() || !custom_requests_.IsEmpty() || |
| 1996 !service_port_connect_requests_.IsEmpty() || | |
| 1997 !streaming_url_request_jobs_.empty(); | 1966 !streaming_url_request_jobs_.empty(); |
| 1998 } | 1967 } |
| 1999 | 1968 |
| 2000 void ServiceWorkerVersion::RecordStartWorkerResult( | 1969 void ServiceWorkerVersion::RecordStartWorkerResult( |
| 2001 ServiceWorkerStatusCode status) { | 1970 ServiceWorkerStatusCode status) { |
| 2002 base::TimeTicks start_time = start_time_; | 1971 base::TimeTicks start_time = start_time_; |
| 2003 ClearTick(&start_time_); | 1972 ClearTick(&start_time_); |
| 2004 | 1973 |
| 2005 ServiceWorkerMetrics::RecordStartWorkerStatus(status, | 1974 ServiceWorkerMetrics::RecordStartWorkerStatus(status, |
| 2006 IsInstalled(prestart_status_)); | 1975 IsInstalled(prestart_status_)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2089 SERVICE_WORKER_ERROR_TIMEOUT); | 2058 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2090 case REQUEST_NOTIFICATION_CLICK: | 2059 case REQUEST_NOTIFICATION_CLICK: |
| 2091 return RunIDMapCallback(¬ification_click_requests_, info.id, | 2060 return RunIDMapCallback(¬ification_click_requests_, info.id, |
| 2092 SERVICE_WORKER_ERROR_TIMEOUT); | 2061 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2093 case REQUEST_PUSH: | 2062 case REQUEST_PUSH: |
| 2094 return RunIDMapCallback(&push_requests_, info.id, | 2063 return RunIDMapCallback(&push_requests_, info.id, |
| 2095 SERVICE_WORKER_ERROR_TIMEOUT); | 2064 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2096 case REQUEST_GEOFENCING: | 2065 case REQUEST_GEOFENCING: |
| 2097 return RunIDMapCallback(&geofencing_requests_, info.id, | 2066 return RunIDMapCallback(&geofencing_requests_, info.id, |
| 2098 SERVICE_WORKER_ERROR_TIMEOUT); | 2067 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2099 case REQUEST_SERVICE_PORT_CONNECT: | 2068 case REQUEST_CUSTOM: |
| 2100 return RunIDMapCallback(&service_port_connect_requests_, info.id, | 2069 return RunIDMapCallback(&custom_requests_, info.id, |
| 2101 SERVICE_WORKER_ERROR_TIMEOUT, | 2070 SERVICE_WORKER_ERROR_TIMEOUT); |
| 2102 false /* accept_connection */, base::string16(), | |
| 2103 base::string16()); | |
| 2104 case NUM_REQUEST_TYPES: | 2071 case NUM_REQUEST_TYPES: |
| 2105 break; | 2072 break; |
| 2106 } | 2073 } |
| 2107 NOTREACHED() << "Got unexpected request type: " << info.type; | 2074 NOTREACHED() << "Got unexpected request type: " << info.type; |
| 2108 return false; | 2075 return false; |
| 2109 } | 2076 } |
| 2110 | 2077 |
| 2111 bool ServiceWorkerVersion::ShouldStopIfRequestTimesOut( | 2078 bool ServiceWorkerVersion::ShouldStopIfRequestTimesOut( |
| 2112 const RequestInfo& info) { | 2079 const RequestInfo& info) { |
| 2113 // Note, returning false for a type means that the On*EventFinished should not | 2080 // Note, returning false for a type means that the On*EventFinished should not |
| 2114 // call NOTREACHED if it can't find the matching request, it may have simply | 2081 // call NOTREACHED if it can't find the matching request, it may have simply |
| 2115 // timed out. | 2082 // timed out. |
| 2116 switch (info.type) { | 2083 switch (info.type) { |
| 2117 case REQUEST_SYNC: | 2084 case REQUEST_SYNC: |
| 2118 return false; | 2085 return false; |
| 2119 case REQUEST_ACTIVATE: | 2086 case REQUEST_ACTIVATE: |
| 2120 case REQUEST_INSTALL: | 2087 case REQUEST_INSTALL: |
| 2121 case REQUEST_FETCH: | 2088 case REQUEST_FETCH: |
| 2122 case REQUEST_NOTIFICATION_CLICK: | 2089 case REQUEST_NOTIFICATION_CLICK: |
| 2123 case REQUEST_PUSH: | 2090 case REQUEST_PUSH: |
| 2124 case REQUEST_GEOFENCING: | 2091 case REQUEST_GEOFENCING: |
| 2125 case REQUEST_SERVICE_PORT_CONNECT: | 2092 return true; |
| 2093 case REQUEST_CUSTOM: |
| 2094 // TODO(mek): Custom requests need some way to specify their timeout |
| 2095 // behavior. |
| 2126 return true; | 2096 return true; |
| 2127 case NUM_REQUEST_TYPES: | 2097 case NUM_REQUEST_TYPES: |
| 2128 NOTREACHED() << "Got unexpected request type: " << info.type; | 2098 NOTREACHED() << "Got unexpected request type: " << info.type; |
| 2129 } | 2099 } |
| 2130 NOTREACHED() << "Got unexpected request type: " << info.type; | 2100 NOTREACHED() << "Got unexpected request type: " << info.type; |
| 2131 return false; | 2101 return false; |
| 2132 } | 2102 } |
| 2133 | 2103 |
| 2134 void ServiceWorkerVersion::SetAllRequestExpirations( | 2104 void ServiceWorkerVersion::SetAllRequestExpirations( |
| 2135 const base::TimeTicks& expiration) { | 2105 const base::TimeTicks& expiration) { |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2236 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | 2206 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
| 2237 RunIDMapCallbacks(&install_requests_, | 2207 RunIDMapCallbacks(&install_requests_, |
| 2238 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); | 2208 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); |
| 2239 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, | 2209 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, |
| 2240 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 2210 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 2241 ServiceWorkerResponse()); | 2211 ServiceWorkerResponse()); |
| 2242 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); | 2212 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2243 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); | 2213 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2244 RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); | 2214 RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2245 RunIDMapCallbacks(&geofencing_requests_, SERVICE_WORKER_ERROR_FAILED); | 2215 RunIDMapCallbacks(&geofencing_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2216 RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2246 | 2217 |
| 2247 // Close all mojo services. This will also fire and clear all callbacks | 2218 // Close all mojo services. This will also fire and clear all callbacks |
| 2248 // for messages that are still outstanding for those services. | 2219 // for messages that are still outstanding for those services. |
| 2249 OnServicePortDispatcherConnectionError(); | 2220 mojo_services_.clear(); |
| 2250 | |
| 2251 OnBackgroundSyncDispatcherConnectionError(); | 2221 OnBackgroundSyncDispatcherConnectionError(); |
| 2252 | 2222 |
| 2253 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 2223 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 2254 streaming_url_request_jobs_.clear(); | 2224 streaming_url_request_jobs_.clear(); |
| 2255 | 2225 |
| 2256 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 2226 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 2257 | 2227 |
| 2258 if (should_restart) | 2228 if (should_restart) |
| 2259 StartWorkerInternal(); | 2229 StartWorkerInternal(); |
| 2260 } | 2230 } |
| 2261 | 2231 |
| 2262 void ServiceWorkerVersion::OnServicePortDispatcherConnectionError() { | |
| 2263 RunIDMapCallbacks(&service_port_connect_requests_, | |
| 2264 SERVICE_WORKER_ERROR_FAILED, false, base::string16(), | |
| 2265 base::string16()); | |
| 2266 service_port_dispatcher_.reset(); | |
| 2267 } | |
| 2268 | |
| 2269 void ServiceWorkerVersion::OnBackgroundSyncDispatcherConnectionError() { | 2232 void ServiceWorkerVersion::OnBackgroundSyncDispatcherConnectionError() { |
| 2270 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); | 2233 RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2271 background_sync_dispatcher_.reset(); | 2234 background_sync_dispatcher_.reset(); |
| 2272 } | 2235 } |
| 2273 | 2236 |
| 2237 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { |
| 2238 // Simply deleting the service will cause error callbacks to be called from |
| 2239 // the destructor of the MojoService instance. |
| 2240 mojo_services_.erase(service_name); |
| 2241 } |
| 2242 |
| 2274 void ServiceWorkerVersion::OnBeginEvent() { | 2243 void ServiceWorkerVersion::OnBeginEvent() { |
| 2275 if (should_exclude_from_uma_ || running_status() != RUNNING || | 2244 if (should_exclude_from_uma_ || running_status() != RUNNING || |
| 2276 idle_time_.is_null()) { | 2245 idle_time_.is_null()) { |
| 2277 return; | 2246 return; |
| 2278 } | 2247 } |
| 2279 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 2248 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 2280 idle_time_); | 2249 idle_time_); |
| 2281 } | 2250 } |
| 2282 | 2251 |
| 2283 } // namespace content | 2252 } // namespace content |
| OLD | NEW |