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_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 926 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 switch (sender_provider_host->provider_type()) { | 937 switch (sender_provider_host->provider_type()) { |
938 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: | 938 case SERVICE_WORKER_PROVIDER_FOR_WINDOW: |
939 case SERVICE_WORKER_PROVIDER_FOR_WORKER: | 939 case SERVICE_WORKER_PROVIDER_FOR_WORKER: |
940 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: | 940 case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
941 service_worker_client_utils::GetClient( | 941 service_worker_client_utils::GetClient( |
942 sender_provider_host, | 942 sender_provider_host, |
943 base::Bind(&ServiceWorkerDispatcherHost:: | 943 base::Bind(&ServiceWorkerDispatcherHost:: |
944 DispatchExtendableMessageEventInternal< | 944 DispatchExtendableMessageEventInternal< |
945 ServiceWorkerClientInfo>, | 945 ServiceWorkerClientInfo>, |
946 this, worker, message, source_origin, sent_message_ports, | 946 this, worker, message, source_origin, sent_message_ports, |
947 callback)); | 947 base::nullopt, callback)); |
948 break; | 948 break; |
949 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: | 949 case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: { |
| 950 // Clamp timeout to the sending worker's remaining timeout, to prevent |
| 951 // postMessage from keeping workers alive forever. |
| 952 base::TimeDelta timeout = |
| 953 sender_provider_host->running_hosted_version()->remaining_timeout(); |
950 RunSoon(base::Bind( | 954 RunSoon(base::Bind( |
951 &ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal< | 955 &ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal< |
952 ServiceWorkerObjectInfo>, | 956 ServiceWorkerObjectInfo>, |
953 this, worker, message, source_origin, sent_message_ports, callback, | 957 this, worker, message, source_origin, sent_message_ports, |
| 958 base::make_optional(timeout), callback, |
954 sender_provider_host->GetOrCreateServiceWorkerHandle( | 959 sender_provider_host->GetOrCreateServiceWorkerHandle( |
955 sender_provider_host->running_hosted_version()))); | 960 sender_provider_host->running_hosted_version()))); |
956 break; | 961 break; |
| 962 } |
957 case SERVICE_WORKER_PROVIDER_UNKNOWN: | 963 case SERVICE_WORKER_PROVIDER_UNKNOWN: |
958 default: | 964 default: |
959 NOTREACHED() << sender_provider_host->provider_type(); | 965 NOTREACHED() << sender_provider_host->provider_type(); |
960 break; | 966 break; |
961 } | 967 } |
962 } | 968 } |
963 | 969 |
964 void ServiceWorkerDispatcherHost::OnProviderCreated( | 970 void ServiceWorkerDispatcherHost::OnProviderCreated( |
965 int provider_id, | 971 int provider_id, |
966 int route_id, | 972 int route_id, |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId, | 1106 Send(new ServiceWorkerMsg_AssociateRegistration(kDocumentMainThreadId, |
1101 provider_id, info, attrs)); | 1107 provider_id, info, attrs)); |
1102 } | 1108 } |
1103 | 1109 |
1104 template <typename SourceInfo> | 1110 template <typename SourceInfo> |
1105 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal( | 1111 void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal( |
1106 scoped_refptr<ServiceWorkerVersion> worker, | 1112 scoped_refptr<ServiceWorkerVersion> worker, |
1107 const base::string16& message, | 1113 const base::string16& message, |
1108 const url::Origin& source_origin, | 1114 const url::Origin& source_origin, |
1109 const std::vector<int>& sent_message_ports, | 1115 const std::vector<int>& sent_message_ports, |
| 1116 const base::Optional<base::TimeDelta>& timeout, |
1110 const StatusCallback& callback, | 1117 const StatusCallback& callback, |
1111 const SourceInfo& source_info) { | 1118 const SourceInfo& source_info) { |
1112 if (!source_info.IsValid()) { | 1119 if (!source_info.IsValid()) { |
1113 DidFailToDispatchExtendableMessageEvent<SourceInfo>( | 1120 DidFailToDispatchExtendableMessageEvent<SourceInfo>( |
1114 sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED); | 1121 sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED); |
1115 return; | 1122 return; |
1116 } | 1123 } |
| 1124 |
| 1125 // If not enough time is left to actually process the event don't even |
| 1126 // bother starting the worker and sending the event. |
| 1127 if (timeout && *timeout < base::TimeDelta::FromMilliseconds(100)) { |
| 1128 DidFailToDispatchExtendableMessageEvent<SourceInfo>( |
| 1129 sent_message_ports, source_info, callback, |
| 1130 SERVICE_WORKER_ERROR_TIMEOUT); |
| 1131 return; |
| 1132 } |
| 1133 |
1117 worker->RunAfterStartWorker( | 1134 worker->RunAfterStartWorker( |
1118 ServiceWorkerMetrics::EventType::MESSAGE, | 1135 ServiceWorkerMetrics::EventType::MESSAGE, |
1119 base::Bind(&ServiceWorkerDispatcherHost:: | 1136 base::Bind(&ServiceWorkerDispatcherHost:: |
1120 DispatchExtendableMessageEventAfterStartWorker, | 1137 DispatchExtendableMessageEventAfterStartWorker, |
1121 this, worker, message, source_origin, sent_message_ports, | 1138 this, worker, message, source_origin, sent_message_ports, |
1122 ExtendableMessageEventSource(source_info), callback), | 1139 ExtendableMessageEventSource(source_info), timeout, callback), |
1123 base::Bind( | 1140 base::Bind( |
1124 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent< | 1141 &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent< |
1125 SourceInfo>, | 1142 SourceInfo>, |
1126 this, sent_message_ports, source_info, callback)); | 1143 this, sent_message_ports, source_info, callback)); |
1127 } | 1144 } |
1128 | 1145 |
1129 void ServiceWorkerDispatcherHost:: | 1146 void ServiceWorkerDispatcherHost:: |
1130 DispatchExtendableMessageEventAfterStartWorker( | 1147 DispatchExtendableMessageEventAfterStartWorker( |
1131 scoped_refptr<ServiceWorkerVersion> worker, | 1148 scoped_refptr<ServiceWorkerVersion> worker, |
1132 const base::string16& message, | 1149 const base::string16& message, |
1133 const url::Origin& source_origin, | 1150 const url::Origin& source_origin, |
1134 const std::vector<int>& sent_message_ports, | 1151 const std::vector<int>& sent_message_ports, |
1135 const ExtendableMessageEventSource& source, | 1152 const ExtendableMessageEventSource& source, |
| 1153 const base::Optional<base::TimeDelta>& timeout, |
1136 const StatusCallback& callback) { | 1154 const StatusCallback& callback) { |
1137 int request_id = | 1155 int request_id; |
1138 worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); | 1156 if (timeout) { |
| 1157 request_id = worker->StartRequestWithCustomTimeout( |
| 1158 ServiceWorkerMetrics::EventType::MESSAGE, callback, *timeout, |
| 1159 ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); |
| 1160 } else { |
| 1161 request_id = worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, |
| 1162 callback); |
| 1163 } |
1139 | 1164 |
1140 MessagePortMessageFilter* filter = | 1165 MessagePortMessageFilter* filter = |
1141 worker->embedded_worker()->message_port_message_filter(); | 1166 worker->embedded_worker()->message_port_message_filter(); |
1142 std::vector<int> new_routing_ids; | 1167 std::vector<int> new_routing_ids; |
1143 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 1168 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
1144 | 1169 |
1145 ServiceWorkerMsg_ExtendableMessageEvent_Params params; | 1170 ServiceWorkerMsg_ExtendableMessageEvent_Params params; |
1146 params.message = message; | 1171 params.message = message; |
1147 params.source_origin = source_origin; | 1172 params.source_origin = source_origin; |
1148 params.message_ports = sent_message_ports; | 1173 params.message_ports = sent_message_ports; |
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1720 if (!handle) { | 1745 if (!handle) { |
1721 bad_message::ReceivedBadMessage(this, | 1746 bad_message::ReceivedBadMessage(this, |
1722 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1747 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
1723 return; | 1748 return; |
1724 } | 1749 } |
1725 handle->version()->StopWorker( | 1750 handle->version()->StopWorker( |
1726 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1751 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
1727 } | 1752 } |
1728 | 1753 |
1729 } // namespace content | 1754 } // namespace content |
OLD | NEW |