| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 ServiceWorkerStatusCode status = | 678 ServiceWorkerStatusCode status = |
| 679 embedded_worker_->SendMessage(ServiceWorkerMsg_NotificationClickEvent( | 679 embedded_worker_->SendMessage(ServiceWorkerMsg_NotificationClickEvent( |
| 680 request_id, persistent_notification_id, notification_data, | 680 request_id, persistent_notification_id, notification_data, |
| 681 action_index)); | 681 action_index)); |
| 682 if (status != SERVICE_WORKER_OK) { | 682 if (status != SERVICE_WORKER_OK) { |
| 683 notification_click_requests_.Remove(request_id); | 683 notification_click_requests_.Remove(request_id); |
| 684 RunSoon(base::Bind(callback, status)); | 684 RunSoon(base::Bind(callback, status)); |
| 685 } | 685 } |
| 686 } | 686 } |
| 687 | 687 |
| 688 void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback, | |
| 689 const std::string& data) { | |
| 690 OnBeginEvent(); | |
| 691 DCHECK_EQ(ACTIVATED, status()) << status(); | |
| 692 if (running_status() != RUNNING) { | |
| 693 // Schedule calling this method after starting the worker. | |
| 694 StartWorker(base::Bind(&RunTaskAfterStartWorker, | |
| 695 weak_factory_.GetWeakPtr(), callback, | |
| 696 base::Bind(&self::DispatchPushEvent, | |
| 697 weak_factory_.GetWeakPtr(), | |
| 698 callback, data))); | |
| 699 return; | |
| 700 } | |
| 701 | |
| 702 int request_id = AddRequest(callback, &push_requests_, REQUEST_PUSH, | |
| 703 ServiceWorkerMetrics::EventType::PUSH); | |
| 704 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | |
| 705 ServiceWorkerMsg_PushEvent(request_id, data)); | |
| 706 if (status != SERVICE_WORKER_OK) { | |
| 707 push_requests_.Remove(request_id); | |
| 708 RunSoon(base::Bind(callback, status)); | |
| 709 } | |
| 710 } | |
| 711 | |
| 712 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( | 688 void ServiceWorkerVersion::DispatchCrossOriginMessageEvent( |
| 713 const NavigatorConnectClient& client, | 689 const NavigatorConnectClient& client, |
| 714 const base::string16& message, | 690 const base::string16& message, |
| 715 const std::vector<TransferredMessagePort>& sent_message_ports, | 691 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 716 const StatusCallback& callback) { | 692 const StatusCallback& callback) { |
| 717 OnBeginEvent(); | 693 OnBeginEvent(); |
| 718 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to | 694 // Unlike in the case of DispatchMessageEvent, here the caller is assumed to |
| 719 // have already put all the sent message ports on hold. So no need to do that | 695 // have already put all the sent message ports on hold. So no need to do that |
| 720 // here again. | 696 // here again. |
| 721 | 697 |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, | 989 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClients, |
| 1014 OnGetClients) | 990 OnGetClients) |
| 1015 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, | 991 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, |
| 1016 OnActivateEventFinished) | 992 OnActivateEventFinished) |
| 1017 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished, | 993 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished, |
| 1018 OnInstallEventFinished) | 994 OnInstallEventFinished) |
| 1019 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 995 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
| 1020 OnFetchEventFinished) | 996 OnFetchEventFinished) |
| 1021 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, | 997 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, |
| 1022 OnNotificationClickEventFinished) | 998 OnNotificationClickEventFinished) |
| 1023 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, | |
| 1024 OnPushEventFinished) | |
| 1025 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | 999 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
| 1026 OnOpenWindow) | 1000 OnOpenWindow) |
| 1027 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, | 1001 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
| 1028 OnSetCachedMetadata) | 1002 OnSetCachedMetadata) |
| 1029 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, | 1003 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, |
| 1030 OnClearCachedMetadata) | 1004 OnClearCachedMetadata) |
| 1031 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, | 1005 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, |
| 1032 OnPostMessageToClient) | 1006 OnPostMessageToClient) |
| 1033 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 1007 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
| 1034 OnFocusClient) | 1008 OnFocusClient) |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1204 } | 1178 } |
| 1205 | 1179 |
| 1206 ServiceWorkerMetrics::RecordEventDuration( | 1180 ServiceWorkerMetrics::RecordEventDuration( |
| 1207 request->event_type, base::TimeTicks::Now() - request->start_time); | 1181 request->event_type, base::TimeTicks::Now() - request->start_time); |
| 1208 | 1182 |
| 1209 scoped_refptr<ServiceWorkerVersion> protect(this); | 1183 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1210 request->callback.Run(SERVICE_WORKER_OK); | 1184 request->callback.Run(SERVICE_WORKER_OK); |
| 1211 RemoveCallbackAndStopIfRedundant(¬ification_click_requests_, request_id); | 1185 RemoveCallbackAndStopIfRedundant(¬ification_click_requests_, request_id); |
| 1212 } | 1186 } |
| 1213 | 1187 |
| 1214 void ServiceWorkerVersion::OnPushEventFinished( | 1188 void ServiceWorkerVersion::OnSimpleEventResponse( |
| 1215 int request_id, | 1189 int request_id, |
| 1216 blink::WebServiceWorkerEventResult result) { | 1190 blink::WebServiceWorkerEventResult result) { |
| 1217 TRACE_EVENT1("ServiceWorker", | 1191 // Copy error callback before calling FinishRequest. |
| 1218 "ServiceWorkerVersion::OnPushEventFinished", | 1192 PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id); |
| 1219 "Request id", request_id); | 1193 DCHECK(request) << "Invalid request id"; |
| 1220 PendingRequest<StatusCallback>* request = push_requests_.Lookup(request_id); | 1194 StatusCallback callback = request->callback; |
| 1221 if (!request) { | 1195 |
| 1222 NOTREACHED() << "Got unexpected message: " << request_id; | 1196 FinishRequest(request_id); |
| 1223 return; | 1197 |
| 1224 } | |
| 1225 ServiceWorkerStatusCode status = SERVICE_WORKER_OK; | 1198 ServiceWorkerStatusCode status = SERVICE_WORKER_OK; |
| 1226 if (result == blink::WebServiceWorkerEventResultRejected) | 1199 if (result == blink::WebServiceWorkerEventResultRejected) |
| 1227 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; | 1200 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; |
| 1228 | 1201 callback.Run(status); |
| 1229 ServiceWorkerMetrics::RecordEventDuration( | |
| 1230 request->event_type, base::TimeTicks::Now() - request->start_time); | |
| 1231 | |
| 1232 scoped_refptr<ServiceWorkerVersion> protect(this); | |
| 1233 request->callback.Run(status); | |
| 1234 RemoveCallbackAndStopIfRedundant(&push_requests_, request_id); | |
| 1235 } | 1202 } |
| 1236 | 1203 |
| 1237 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1204 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
| 1238 // Just abort if we are shutting down. | 1205 // Just abort if we are shutting down. |
| 1239 if (!context_) | 1206 if (!context_) |
| 1240 return; | 1207 return; |
| 1241 | 1208 |
| 1242 if (!url.is_valid()) { | 1209 if (!url.is_valid()) { |
| 1243 DVLOG(1) << "Received unexpected invalid URL from renderer process."; | 1210 DVLOG(1) << "Received unexpected invalid URL from renderer process."; |
| 1244 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 1211 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1762 !stop_callbacks_.empty()) { | 1729 !stop_callbacks_.empty()) { |
| 1763 return; | 1730 return; |
| 1764 } | 1731 } |
| 1765 | 1732 |
| 1766 embedded_worker_->StopIfIdle(); | 1733 embedded_worker_->StopIfIdle(); |
| 1767 } | 1734 } |
| 1768 | 1735 |
| 1769 bool ServiceWorkerVersion::HasInflightRequests() const { | 1736 bool ServiceWorkerVersion::HasInflightRequests() const { |
| 1770 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || | 1737 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || |
| 1771 !fetch_requests_.IsEmpty() || | 1738 !fetch_requests_.IsEmpty() || |
| 1772 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || | 1739 !notification_click_requests_.IsEmpty() || |
| 1773 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1740 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); |
| 1774 } | 1741 } |
| 1775 | 1742 |
| 1776 void ServiceWorkerVersion::RecordStartWorkerResult( | 1743 void ServiceWorkerVersion::RecordStartWorkerResult( |
| 1777 ServiceWorkerStatusCode status) { | 1744 ServiceWorkerStatusCode status) { |
| 1778 base::TimeTicks start_time = start_time_; | 1745 base::TimeTicks start_time = start_time_; |
| 1779 ClearTick(&start_time_); | 1746 ClearTick(&start_time_); |
| 1780 | 1747 |
| 1781 if (context_) | 1748 if (context_) |
| 1782 context_->UpdateVersionFailureCount(version_id_, status); | 1749 context_->UpdateVersionFailureCount(version_id_, status); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1872 return RunIDMapCallback(&install_requests_, info.id, | 1839 return RunIDMapCallback(&install_requests_, info.id, |
| 1873 SERVICE_WORKER_ERROR_TIMEOUT); | 1840 SERVICE_WORKER_ERROR_TIMEOUT); |
| 1874 case REQUEST_FETCH: | 1841 case REQUEST_FETCH: |
| 1875 return RunIDMapCallback( | 1842 return RunIDMapCallback( |
| 1876 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, | 1843 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, |
| 1877 /* The other args are ignored for non-OK status. */ | 1844 /* The other args are ignored for non-OK status. */ |
| 1878 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); | 1845 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); |
| 1879 case REQUEST_NOTIFICATION_CLICK: | 1846 case REQUEST_NOTIFICATION_CLICK: |
| 1880 return RunIDMapCallback(¬ification_click_requests_, info.id, | 1847 return RunIDMapCallback(¬ification_click_requests_, info.id, |
| 1881 SERVICE_WORKER_ERROR_TIMEOUT); | 1848 SERVICE_WORKER_ERROR_TIMEOUT); |
| 1882 case REQUEST_PUSH: | |
| 1883 return RunIDMapCallback(&push_requests_, info.id, | |
| 1884 SERVICE_WORKER_ERROR_TIMEOUT); | |
| 1885 case REQUEST_CUSTOM: | 1849 case REQUEST_CUSTOM: |
| 1886 return RunIDMapCallback(&custom_requests_, info.id, | 1850 return RunIDMapCallback(&custom_requests_, info.id, |
| 1887 SERVICE_WORKER_ERROR_TIMEOUT); | 1851 SERVICE_WORKER_ERROR_TIMEOUT); |
| 1888 case NUM_REQUEST_TYPES: | 1852 case NUM_REQUEST_TYPES: |
| 1889 break; | 1853 break; |
| 1890 } | 1854 } |
| 1891 NOTREACHED() << "Got unexpected request type: " << info.type; | 1855 NOTREACHED() << "Got unexpected request type: " << info.type; |
| 1892 return false; | 1856 return false; |
| 1893 } | 1857 } |
| 1894 | 1858 |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1994 // callbacks for events). | 1958 // callbacks for events). |
| 1995 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. | 1959 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. |
| 1996 RunIDMapCallbacks(&activate_requests_, | 1960 RunIDMapCallbacks(&activate_requests_, |
| 1997 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); | 1961 SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED); |
| 1998 RunIDMapCallbacks(&install_requests_, | 1962 RunIDMapCallbacks(&install_requests_, |
| 1999 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); | 1963 SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED); |
| 2000 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, | 1964 RunIDMapCallbacks(&fetch_requests_, SERVICE_WORKER_ERROR_FAILED, |
| 2001 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, | 1965 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, |
| 2002 ServiceWorkerResponse()); | 1966 ServiceWorkerResponse()); |
| 2003 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); | 1967 RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2004 RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED); | |
| 2005 RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); | 1968 RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED); |
| 2006 | 1969 |
| 2007 // Close all mojo services. This will also fire and clear all callbacks | 1970 // Close all mojo services. This will also fire and clear all callbacks |
| 2008 // for messages that are still outstanding for those services. | 1971 // for messages that are still outstanding for those services. |
| 2009 mojo_services_.clear(); | 1972 mojo_services_.clear(); |
| 2010 | 1973 |
| 2011 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1974 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 2012 streaming_url_request_jobs_.clear(); | 1975 streaming_url_request_jobs_.clear(); |
| 2013 | 1976 |
| 2014 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1977 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2026 void ServiceWorkerVersion::OnBeginEvent() { | 1989 void ServiceWorkerVersion::OnBeginEvent() { |
| 2027 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1990 if (should_exclude_from_uma_ || running_status() != RUNNING || |
| 2028 idle_time_.is_null()) { | 1991 idle_time_.is_null()) { |
| 2029 return; | 1992 return; |
| 2030 } | 1993 } |
| 2031 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1994 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 2032 idle_time_); | 1995 idle_time_); |
| 2033 } | 1996 } |
| 2034 | 1997 |
| 2035 } // namespace content | 1998 } // namespace content |
| OLD | NEW |