| 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 "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 ServiceWorkerStatusCode status = | 989 ServiceWorkerStatusCode status = |
| 990 embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); | 990 embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); |
| 991 if (status != SERVICE_WORKER_OK) { | 991 if (status != SERVICE_WORKER_OK) { |
| 992 activate_callbacks_.Remove(request_id); | 992 activate_callbacks_.Remove(request_id); |
| 993 RunSoon(base::Bind(callback, status)); | 993 RunSoon(base::Bind(callback, status)); |
| 994 } | 994 } |
| 995 } | 995 } |
| 996 | 996 |
| 997 void ServiceWorkerVersion::OnGetClients( | 997 void ServiceWorkerVersion::OnGetClients( |
| 998 int request_id, | 998 int request_id, |
| 999 const ServiceWorkerClientQueryOptions& options) { | 999 const ServiceWorkerClientQueryOptions& /* options */) { |
| 1000 if (controllee_map_.empty() && !options.include_uncontrolled) { | 1000 // TODO(kinuko): Handle ClientQueryOptions. (crbug.com/455241, 460415 etc) |
| 1001 if (controllee_map_.empty()) { |
| 1001 if (running_status() == RUNNING) { | 1002 if (running_status() == RUNNING) { |
| 1002 embedded_worker_->SendMessage( | 1003 embedded_worker_->SendMessage( |
| 1003 ServiceWorkerMsg_DidGetClients(request_id, | 1004 ServiceWorkerMsg_DidGetClients(request_id, |
| 1004 std::vector<ServiceWorkerClientInfo>())); | 1005 std::vector<ServiceWorkerClientInfo>())); |
| 1005 } | 1006 } |
| 1006 return; | 1007 return; |
| 1007 } | 1008 } |
| 1008 | 1009 |
| 1009 TRACE_EVENT0("ServiceWorker", | 1010 TRACE_EVENT0("ServiceWorker", |
| 1010 "ServiceWorkerVersion::OnGetClients"); | 1011 "ServiceWorkerVersion::OnGetClients"); |
| 1011 | 1012 |
| 1012 // 4.3.1 matchAll(options) | |
| 1013 std::vector<Tuple<int,int,std::string>> clients_info; | 1013 std::vector<Tuple<int,int,std::string>> clients_info; |
| 1014 if (!options.include_uncontrolled) { | 1014 for (auto& controllee : controllee_map_) { |
| 1015 for (auto& controllee : controllee_map_) { | 1015 int process_id = controllee.second->process_id(); |
| 1016 int process_id = controllee.second->process_id(); | 1016 int frame_id = controllee.second->frame_id(); |
| 1017 int frame_id = controllee.second->frame_id(); | 1017 const std::string& client_uuid = controllee.first; |
| 1018 const std::string& client_uuid = controllee.first; | 1018 |
| 1019 clients_info.push_back(MakeTuple(process_id, frame_id, client_uuid)); | 1019 clients_info.push_back(MakeTuple(process_id, frame_id, client_uuid)); |
| 1020 } | |
| 1021 } else { | |
| 1022 for (auto it = | |
| 1023 context_->GetClientProviderHostIterator(script_url_.GetOrigin()); | |
| 1024 !it->IsAtEnd(); it->Advance()) { | |
| 1025 ServiceWorkerProviderHost* host = it->GetProviderHost(); | |
| 1026 clients_info.push_back( | |
| 1027 MakeTuple(host->process_id(), host->frame_id(), host->client_uuid())); | |
| 1028 } | |
| 1029 } | 1020 } |
| 1030 | 1021 |
| 1031 BrowserThread::PostTask( | 1022 BrowserThread::PostTask( |
| 1032 BrowserThread::UI, FROM_HERE, | 1023 BrowserThread::UI, FROM_HERE, |
| 1033 base::Bind(&OnGetClientsFromUI, clients_info, script_url_, | 1024 base::Bind(&OnGetClientsFromUI, clients_info, script_url_, |
| 1034 base::Bind(&ServiceWorkerVersion::DidGetClients, | 1025 base::Bind(&ServiceWorkerVersion::DidGetClients, |
| 1035 weak_factory_.GetWeakPtr(), | 1026 weak_factory_.GetWeakPtr(), |
| 1036 request_id))); | 1027 request_id))); |
| 1037 | 1028 |
| 1038 } | 1029 } |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1238 if (running_status() != RUNNING) | 1229 if (running_status() != RUNNING) |
| 1239 return; | 1230 return; |
| 1240 | 1231 |
| 1241 if (render_process_id == ChildProcessHost::kInvalidUniqueID && | 1232 if (render_process_id == ChildProcessHost::kInvalidUniqueID && |
| 1242 render_frame_id == MSG_ROUTING_NONE) { | 1233 render_frame_id == MSG_ROUTING_NONE) { |
| 1243 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowError( | 1234 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowError( |
| 1244 request_id, "Something went wrong while trying to open the window.")); | 1235 request_id, "Something went wrong while trying to open the window.")); |
| 1245 return; | 1236 return; |
| 1246 } | 1237 } |
| 1247 | 1238 |
| 1248 for (auto it = | 1239 for (const auto& it : controllee_map_) { |
| 1249 context_->GetClientProviderHostIterator(script_url_.GetOrigin()); | 1240 const ServiceWorkerProviderHost* provider_host = it.second; |
| 1250 !it->IsAtEnd(); it->Advance()) { | |
| 1251 ServiceWorkerProviderHost* provider_host = it->GetProviderHost(); | |
| 1252 if (provider_host->process_id() != render_process_id || | 1241 if (provider_host->process_id() != render_process_id || |
| 1253 provider_host->frame_id() != render_frame_id) { | 1242 provider_host->frame_id() != render_frame_id) { |
| 1254 continue; | 1243 continue; |
| 1255 } | 1244 } |
| 1256 provider_host->GetClientInfo(base::Bind( | 1245 |
| 1257 &ServiceWorkerVersion::OnOpenWindowFinished, weak_factory_.GetWeakPtr(), | 1246 // it.second is the client_uuid associated with the provider_host. |
| 1258 request_id, provider_host->client_uuid())); | 1247 provider_host->GetClientInfo( |
| 1248 base::Bind(&ServiceWorkerVersion::OnOpenWindowFinished, |
| 1249 weak_factory_.GetWeakPtr(), request_id, it.first)); |
| 1259 return; | 1250 return; |
| 1260 } | 1251 } |
| 1261 | 1252 |
| 1262 // If here, it means that no provider_host was found, in which case, the | 1253 // If here, it means that no provider_host was found, in which case, the |
| 1263 // renderer should still be informed that the window was opened. | 1254 // renderer should still be informed that the window was opened. |
| 1264 OnOpenWindowFinished(request_id, std::string(), ServiceWorkerClientInfo()); | 1255 OnOpenWindowFinished(request_id, std::string(), ServiceWorkerClientInfo()); |
| 1265 } | 1256 } |
| 1266 | 1257 |
| 1267 void ServiceWorkerVersion::OnOpenWindowFinished( | 1258 void ServiceWorkerVersion::OnOpenWindowFinished( |
| 1268 int request_id, | 1259 int request_id, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1319 TRACE_EVENT_ASYNC_END1("ServiceWorker", | 1310 TRACE_EVENT_ASYNC_END1("ServiceWorker", |
| 1320 "ServiceWorkerVersion::OnClearCachedMetadata", | 1311 "ServiceWorkerVersion::OnClearCachedMetadata", |
| 1321 callback_id, "result", result); | 1312 callback_id, "result", result); |
| 1322 FOR_EACH_OBSERVER(Listener, listeners_, OnCachedMetadataUpdated(this)); | 1313 FOR_EACH_OBSERVER(Listener, listeners_, OnCachedMetadataUpdated(this)); |
| 1323 } | 1314 } |
| 1324 | 1315 |
| 1325 void ServiceWorkerVersion::OnPostMessageToClient( | 1316 void ServiceWorkerVersion::OnPostMessageToClient( |
| 1326 const std::string& client_uuid, | 1317 const std::string& client_uuid, |
| 1327 const base::string16& message, | 1318 const base::string16& message, |
| 1328 const std::vector<TransferredMessagePort>& sent_message_ports) { | 1319 const std::vector<TransferredMessagePort>& sent_message_ports) { |
| 1329 if (!context_) | |
| 1330 return; | |
| 1331 TRACE_EVENT1("ServiceWorker", | 1320 TRACE_EVENT1("ServiceWorker", |
| 1332 "ServiceWorkerVersion::OnPostMessageToDocument", | 1321 "ServiceWorkerVersion::OnPostMessageToDocument", |
| 1333 "Client id", client_uuid); | 1322 "Client id", client_uuid); |
| 1334 ServiceWorkerProviderHost* provider_host = | 1323 auto it = controllee_map_.find(client_uuid); |
| 1335 context_->GetProviderHostByClientID(client_uuid); | 1324 if (it == controllee_map_.end()) { |
| 1336 if (!provider_host) { | |
| 1337 // The client may already have been closed, just ignore. | 1325 // The client may already have been closed, just ignore. |
| 1338 return; | 1326 return; |
| 1339 } | 1327 } |
| 1340 if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { | 1328 if (it->second->document_url().GetOrigin() != script_url_.GetOrigin()) { |
| 1341 // The client does not belong to the same origin as this ServiceWorker, | 1329 // The client does not belong to the same origin as this ServiceWorker, |
| 1342 // possibly due to timing issue or bad message. | 1330 // possibly due to timing issue or bad message. |
| 1343 return; | 1331 return; |
| 1344 } | 1332 } |
| 1345 provider_host->PostMessage(message, sent_message_ports); | 1333 it->second->PostMessage(message, sent_message_ports); |
| 1346 } | 1334 } |
| 1347 | 1335 |
| 1348 void ServiceWorkerVersion::OnFocusClient(int request_id, | 1336 void ServiceWorkerVersion::OnFocusClient(int request_id, |
| 1349 const std::string& client_uuid) { | 1337 const std::string& client_uuid) { |
| 1350 if (!context_) | |
| 1351 return; | |
| 1352 TRACE_EVENT2("ServiceWorker", | 1338 TRACE_EVENT2("ServiceWorker", |
| 1353 "ServiceWorkerVersion::OnFocusClient", | 1339 "ServiceWorkerVersion::OnFocusClient", |
| 1354 "Request id", request_id, | 1340 "Request id", request_id, |
| 1355 "Client id", client_uuid); | 1341 "Client id", client_uuid); |
| 1356 ServiceWorkerProviderHost* provider_host = | 1342 auto it = controllee_map_.find(client_uuid); |
| 1357 context_->GetProviderHostByClientID(client_uuid); | 1343 if (it == controllee_map_.end()) { |
| 1358 if (!provider_host) { | |
| 1359 // The client may already have been closed, just ignore. | 1344 // The client may already have been closed, just ignore. |
| 1360 return; | 1345 return; |
| 1361 } | 1346 } |
| 1362 if (provider_host->document_url().GetOrigin() != script_url_.GetOrigin()) { | 1347 if (it->second->document_url().GetOrigin() != script_url_.GetOrigin()) { |
| 1363 // The client does not belong to the same origin as this ServiceWorker, | 1348 // The client does not belong to the same origin as this ServiceWorker, |
| 1364 // possibly due to timing issue or bad message. | 1349 // possibly due to timing issue or bad message. |
| 1365 return; | 1350 return; |
| 1366 } | 1351 } |
| 1367 provider_host->Focus(base::Bind(&ServiceWorkerVersion::OnFocusClientFinished, | 1352 |
| 1368 weak_factory_.GetWeakPtr(), request_id, | 1353 it->second->Focus( |
| 1369 client_uuid)); | 1354 base::Bind(&ServiceWorkerVersion::OnFocusClientFinished, |
| 1355 weak_factory_.GetWeakPtr(), |
| 1356 request_id, |
| 1357 client_uuid)); |
| 1370 } | 1358 } |
| 1371 | 1359 |
| 1372 void ServiceWorkerVersion::OnFocusClientFinished( | 1360 void ServiceWorkerVersion::OnFocusClientFinished( |
| 1373 int request_id, | 1361 int request_id, |
| 1374 const std::string& cliend_uuid, | 1362 const std::string& cliend_uuid, |
| 1375 const ServiceWorkerClientInfo& client) { | 1363 const ServiceWorkerClientInfo& client) { |
| 1376 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 1364 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 1377 | 1365 |
| 1378 if (running_status() != RUNNING) | 1366 if (running_status() != RUNNING) |
| 1379 return; | 1367 return; |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1667 int request_id) { | 1655 int request_id) { |
| 1668 callbacks->Remove(request_id); | 1656 callbacks->Remove(request_id); |
| 1669 if (is_doomed_) { | 1657 if (is_doomed_) { |
| 1670 // The stop should be already scheduled, but try to stop immediately, in | 1658 // The stop should be already scheduled, but try to stop immediately, in |
| 1671 // order to release worker resources soon. | 1659 // order to release worker resources soon. |
| 1672 StopWorkerIfIdle(); | 1660 StopWorkerIfIdle(); |
| 1673 } | 1661 } |
| 1674 } | 1662 } |
| 1675 | 1663 |
| 1676 } // namespace content | 1664 } // namespace content |
| OLD | NEW |