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 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 ServiceWorkerStatusCode status = | 649 ServiceWorkerStatusCode status = |
650 embedded_worker_->SendMessage(ServiceWorkerMsg_NotificationClickEvent( | 650 embedded_worker_->SendMessage(ServiceWorkerMsg_NotificationClickEvent( |
651 request_id, persistent_notification_id, notification_data, | 651 request_id, persistent_notification_id, notification_data, |
652 action_index)); | 652 action_index)); |
653 if (status != SERVICE_WORKER_OK) { | 653 if (status != SERVICE_WORKER_OK) { |
654 notification_click_requests_.Remove(request_id); | 654 notification_click_requests_.Remove(request_id); |
655 RunSoon(base::Bind(callback, status)); | 655 RunSoon(base::Bind(callback, status)); |
656 } | 656 } |
657 } | 657 } |
658 | 658 |
| 659 void ServiceWorkerVersion::DispatchNotificationCloseEvent( |
| 660 const StatusCallback& callback, |
| 661 int64_t persistent_notification_id, |
| 662 const PlatformNotificationData& notification_data) { |
| 663 OnBeginEvent(); |
| 664 DCHECK_EQ(ACTIVATED, status()) << status(); |
| 665 if (running_status() != RUNNING) { |
| 666 // Schedule calling this method after starting the worker. |
| 667 StartWorker(base::Bind( |
| 668 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), callback, |
| 669 base::Bind(&self::DispatchNotificationCloseEvent, |
| 670 weak_factory_.GetWeakPtr(), callback, |
| 671 persistent_notification_id, notification_data))); |
| 672 return; |
| 673 } |
| 674 |
| 675 int request_id = AddRequest( |
| 676 callback, ¬ification_close_requests_, REQUEST_NOTIFICATION_CLOSE, |
| 677 ServiceWorkerMetrics::EventType::NOTIFICATION_CLOSE); |
| 678 ServiceWorkerStatusCode status = |
| 679 embedded_worker_->SendMessage(ServiceWorkerMsg_NotificationCloseEvent( |
| 680 request_id, persistent_notification_id, notification_data)); |
| 681 if (status != SERVICE_WORKER_OK) { |
| 682 notification_close_requests_.Remove(request_id); |
| 683 RunSoon(base::Bind(callback, status)); |
| 684 } |
| 685 } |
| 686 |
659 void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback, | 687 void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback, |
660 const std::string& data) { | 688 const std::string& data) { |
661 OnBeginEvent(); | 689 OnBeginEvent(); |
662 DCHECK_EQ(ACTIVATED, status()) << status(); | 690 DCHECK_EQ(ACTIVATED, status()) << status(); |
663 if (running_status() != RUNNING) { | 691 if (running_status() != RUNNING) { |
664 // Schedule calling this method after starting the worker. | 692 // Schedule calling this method after starting the worker. |
665 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 693 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
666 weak_factory_.GetWeakPtr(), callback, | 694 weak_factory_.GetWeakPtr(), callback, |
667 base::Bind(&self::DispatchPushEvent, | 695 base::Bind(&self::DispatchPushEvent, |
668 weak_factory_.GetWeakPtr(), | 696 weak_factory_.GetWeakPtr(), |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, | 1007 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ActivateEventFinished, |
980 OnActivateEventFinished) | 1008 OnActivateEventFinished) |
981 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished, | 1009 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_InstallEventFinished, |
982 OnInstallEventFinished) | 1010 OnInstallEventFinished) |
983 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 1011 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
984 OnFetchEventFinished) | 1012 OnFetchEventFinished) |
985 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, | 1013 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, |
986 OnNotificationClickEventFinished) | 1014 OnNotificationClickEventFinished) |
987 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, | 1015 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
988 OnPushEventFinished) | 1016 OnPushEventFinished) |
| 1017 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationCloseEventFinished, |
| 1018 OnNotificationCloseEventFinished) |
989 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | 1019 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
990 OnOpenWindow) | 1020 OnOpenWindow) |
991 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, | 1021 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
992 OnSetCachedMetadata) | 1022 OnSetCachedMetadata) |
993 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, | 1023 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, |
994 OnClearCachedMetadata) | 1024 OnClearCachedMetadata) |
995 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, | 1025 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, |
996 OnPostMessageToClient) | 1026 OnPostMessageToClient) |
997 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 1027 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
998 OnFocusClient) | 1028 OnFocusClient) |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; | 1221 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; |
1192 | 1222 |
1193 ServiceWorkerMetrics::RecordEventDuration( | 1223 ServiceWorkerMetrics::RecordEventDuration( |
1194 request->event_type, base::TimeTicks::Now() - request->start_time); | 1224 request->event_type, base::TimeTicks::Now() - request->start_time); |
1195 | 1225 |
1196 scoped_refptr<ServiceWorkerVersion> protect(this); | 1226 scoped_refptr<ServiceWorkerVersion> protect(this); |
1197 request->callback.Run(status); | 1227 request->callback.Run(status); |
1198 RemoveCallbackAndStopIfRedundant(&push_requests_, request_id); | 1228 RemoveCallbackAndStopIfRedundant(&push_requests_, request_id); |
1199 } | 1229 } |
1200 | 1230 |
| 1231 void ServiceWorkerVersion::OnNotificationCloseEventFinished(int request_id) { |
| 1232 TRACE_EVENT1("ServiceWorker", |
| 1233 "ServiceWorkerVersion::OnNotificationCloseEventFinished", |
| 1234 "Request id", request_id); |
| 1235 PendingRequest<StatusCallback>* request = |
| 1236 notification_close_requests_.Lookup(request_id); |
| 1237 if (!request) { |
| 1238 NOTREACHED() << "Got unexpected message: " << request_id; |
| 1239 return; |
| 1240 } |
| 1241 |
| 1242 ServiceWorkerMetrics::RecordEventDuration( |
| 1243 request->event_type, base::TimeTicks::Now() - request->start_time); |
| 1244 |
| 1245 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1246 request->callback.Run(SERVICE_WORKER_OK); |
| 1247 RemoveCallbackAndStopIfRedundant(¬ification_close_requests_, request_id); |
| 1248 } |
| 1249 |
1201 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1250 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
1202 // Just abort if we are shutting down. | 1251 // Just abort if we are shutting down. |
1203 if (!context_) | 1252 if (!context_) |
1204 return; | 1253 return; |
1205 | 1254 |
1206 if (!url.is_valid()) { | 1255 if (!url.is_valid()) { |
1207 DVLOG(1) << "Received unexpected invalid URL from renderer process."; | 1256 DVLOG(1) << "Received unexpected invalid URL from renderer process."; |
1208 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 1257 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
1209 base::Bind(&KillEmbeddedWorkerProcess, | 1258 base::Bind(&KillEmbeddedWorkerProcess, |
1210 embedded_worker_->process_id(), | 1259 embedded_worker_->process_id(), |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1727 return; | 1776 return; |
1728 } | 1777 } |
1729 | 1778 |
1730 embedded_worker_->StopIfIdle(); | 1779 embedded_worker_->StopIfIdle(); |
1731 } | 1780 } |
1732 | 1781 |
1733 bool ServiceWorkerVersion::HasInflightRequests() const { | 1782 bool ServiceWorkerVersion::HasInflightRequests() const { |
1734 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || | 1783 return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() || |
1735 !fetch_requests_.IsEmpty() || | 1784 !fetch_requests_.IsEmpty() || |
1736 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || | 1785 !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() || |
| 1786 !notification_close_requests_.IsEmpty() || |
1737 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1787 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); |
1738 } | 1788 } |
1739 | 1789 |
1740 void ServiceWorkerVersion::RecordStartWorkerResult( | 1790 void ServiceWorkerVersion::RecordStartWorkerResult( |
1741 ServiceWorkerStatusCode status) { | 1791 ServiceWorkerStatusCode status) { |
1742 base::TimeTicks start_time = start_time_; | 1792 base::TimeTicks start_time = start_time_; |
1743 ClearTick(&start_time_); | 1793 ClearTick(&start_time_); |
1744 | 1794 |
1745 ServiceWorkerMetrics::RecordStartWorkerStatus(status, | 1795 ServiceWorkerMetrics::RecordStartWorkerStatus(status, |
1746 IsInstalled(prestart_status_)); | 1796 IsInstalled(prestart_status_)); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1824 return RunIDMapCallback(&install_requests_, info.id, | 1874 return RunIDMapCallback(&install_requests_, info.id, |
1825 SERVICE_WORKER_ERROR_TIMEOUT); | 1875 SERVICE_WORKER_ERROR_TIMEOUT); |
1826 case REQUEST_FETCH: | 1876 case REQUEST_FETCH: |
1827 return RunIDMapCallback( | 1877 return RunIDMapCallback( |
1828 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, | 1878 &fetch_requests_, info.id, SERVICE_WORKER_ERROR_TIMEOUT, |
1829 /* The other args are ignored for non-OK status. */ | 1879 /* The other args are ignored for non-OK status. */ |
1830 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); | 1880 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, ServiceWorkerResponse()); |
1831 case REQUEST_NOTIFICATION_CLICK: | 1881 case REQUEST_NOTIFICATION_CLICK: |
1832 return RunIDMapCallback(¬ification_click_requests_, info.id, | 1882 return RunIDMapCallback(¬ification_click_requests_, info.id, |
1833 SERVICE_WORKER_ERROR_TIMEOUT); | 1883 SERVICE_WORKER_ERROR_TIMEOUT); |
| 1884 case REQUEST_NOTIFICATION_CLOSE: |
| 1885 return RunIDMapCallback(¬ification_close_requests_, info.id, |
| 1886 SERVICE_WORKER_ERROR_TIMEOUT); |
1834 case REQUEST_PUSH: | 1887 case REQUEST_PUSH: |
1835 return RunIDMapCallback(&push_requests_, info.id, | 1888 return RunIDMapCallback(&push_requests_, info.id, |
1836 SERVICE_WORKER_ERROR_TIMEOUT); | 1889 SERVICE_WORKER_ERROR_TIMEOUT); |
1837 case REQUEST_CUSTOM: | 1890 case REQUEST_CUSTOM: |
1838 return RunIDMapCallback(&custom_requests_, info.id, | 1891 return RunIDMapCallback(&custom_requests_, info.id, |
1839 SERVICE_WORKER_ERROR_TIMEOUT); | 1892 SERVICE_WORKER_ERROR_TIMEOUT); |
1840 case NUM_REQUEST_TYPES: | 1893 case NUM_REQUEST_TYPES: |
1841 break; | 1894 break; |
1842 } | 1895 } |
1843 NOTREACHED() << "Got unexpected request type: " << info.type; | 1896 NOTREACHED() << "Got unexpected request type: " << info.type; |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1978 void ServiceWorkerVersion::OnBeginEvent() { | 2031 void ServiceWorkerVersion::OnBeginEvent() { |
1979 if (should_exclude_from_uma_ || running_status() != RUNNING || | 2032 if (should_exclude_from_uma_ || running_status() != RUNNING || |
1980 idle_time_.is_null()) { | 2033 idle_time_.is_null()) { |
1981 return; | 2034 return; |
1982 } | 2035 } |
1983 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 2036 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1984 idle_time_); | 2037 idle_time_); |
1985 } | 2038 } |
1986 | 2039 |
1987 } // namespace content | 2040 } // namespace content |
OLD | NEW |