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/location.h" | 8 #include "base/location.h" |
9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
(...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
669 base::Bind(&ServiceWorkerVersion::FoundRegistrationForUpdate, | 669 base::Bind(&ServiceWorkerVersion::FoundRegistrationForUpdate, |
670 weak_factory_.GetWeakPtr())); | 670 weak_factory_.GetWeakPtr())); |
671 } | 671 } |
672 | 672 |
673 void ServiceWorkerVersion::DeferScheduledUpdate() { | 673 void ServiceWorkerVersion::DeferScheduledUpdate() { |
674 if (update_timer_.IsRunning()) | 674 if (update_timer_.IsRunning()) |
675 update_timer_.Reset(); | 675 update_timer_.Reset(); |
676 } | 676 } |
677 | 677 |
678 void ServiceWorkerVersion::DispatchMessageEvent( | 678 void ServiceWorkerVersion::DispatchMessageEvent( |
| 679 ServiceWorkerProviderHost* provider_host, |
679 const base::string16& message, | 680 const base::string16& message, |
680 const std::vector<TransferredMessagePort>& sent_message_ports, | 681 const std::vector<TransferredMessagePort>& sent_message_ports, |
681 const StatusCallback& callback) { | 682 const StatusCallback& callback) { |
682 for (const TransferredMessagePort& port : sent_message_ports) { | 683 for (const TransferredMessagePort& port : sent_message_ports) { |
683 MessagePortService::GetInstance()->HoldMessages(port.id); | 684 MessagePortService::GetInstance()->HoldMessages(port.id); |
684 } | 685 } |
685 | 686 |
686 DispatchMessageEventInternal(message, sent_message_ports, callback); | 687 if (provider_host->provider_type() == |
| 688 SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { |
| 689 ServiceWorkerObjectInfo worker_info = |
| 690 provider_host->GetOrCreateServiceWorkerHandle( |
| 691 provider_host->running_hosted_version()); |
| 692 DispatchWorkerMessageEventInternal(message, sent_message_ports, worker_info, |
| 693 callback); |
| 694 } else if (provider_host->provider_type() == |
| 695 SERVICE_WORKER_PROVIDER_FOR_WINDOW) { |
| 696 provider_host->GetWindowClientInfo( |
| 697 base::Bind(&ServiceWorkerVersion::DispatchClientMessageEventInternal, |
| 698 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 699 provider_host->client_uuid(), callback)); |
| 700 } else { |
| 701 ServiceWorkerClientInfo client_info(blink::WebPageVisibilityStateHidden, |
| 702 false, // is_focused |
| 703 provider_host->document_url(), |
| 704 REQUEST_CONTEXT_FRAME_TYPE_NONE, |
| 705 provider_host->client_type()); |
| 706 DispatchClientMessageEventInternal(message, sent_message_ports, |
| 707 provider_host->client_uuid(), callback, |
| 708 client_info); |
| 709 } |
687 } | 710 } |
688 | 711 |
689 void ServiceWorkerVersion::DispatchMessageEventInternal( | 712 void ServiceWorkerVersion::DispatchWorkerMessageEventInternal( |
690 const base::string16& message, | 713 const base::string16& message, |
691 const std::vector<TransferredMessagePort>& sent_message_ports, | 714 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 715 const ServiceWorkerObjectInfo& worker_info, |
692 const StatusCallback& callback) { | 716 const StatusCallback& callback) { |
693 if (running_status() != RUNNING) { | 717 if (running_status() != RUNNING) { |
694 // Schedule calling this method after starting the worker. | 718 // Schedule calling this method after starting the worker. |
695 StartWorker(base::Bind( | 719 StartWorker(base::Bind( |
696 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 720 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
697 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), | 721 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), |
698 base::Bind(&self::DispatchMessageEventInternal, | 722 base::Bind(&self::DispatchWorkerMessageEventInternal, |
699 weak_factory_.GetWeakPtr(), message, sent_message_ports, | 723 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
700 callback))); | 724 worker_info, callback))); |
701 return; | 725 return; |
702 } | 726 } |
703 | 727 |
704 // TODO(kinuko): Cleanup this (and corresponding unit test) when message | 728 // TODO(kinuko): Cleanup this (and corresponding unit test) when message |
705 // event becomes extendable, round-trip event. (crbug.com/498596) | 729 // event becomes extendable, round-trip event. (crbug.com/498596) |
706 RestartTick(&idle_time_); | 730 RestartTick(&idle_time_); |
707 | 731 |
| 732 int request_id = AddRequest(callback, &message_callbacks_, REQUEST_MESSAGE); |
| 733 MessagePortMessageFilter* filter = |
| 734 embedded_worker_->message_port_message_filter(); |
| 735 std::vector<int> new_routing_ids; |
| 736 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
| 737 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 738 ServiceWorkerMsg_WorkerMessageEvent(request_id, worker_info, message, |
| 739 sent_message_ports, new_routing_ids)); |
| 740 if (status != SERVICE_WORKER_OK) { |
| 741 message_callbacks_.Remove(request_id); |
| 742 RunSoon(base::Bind(callback, status)); |
| 743 } |
| 744 } |
| 745 |
| 746 void ServiceWorkerVersion::DispatchClientMessageEventInternal( |
| 747 const base::string16& message, |
| 748 const std::vector<TransferredMessagePort>& sent_message_ports, |
| 749 const std::string& client_uuid, |
| 750 const StatusCallback& callback, |
| 751 const ServiceWorkerClientInfo& client_info) { |
| 752 if (running_status() != RUNNING) { |
| 753 // Schedule calling this method after starting the worker. |
| 754 StartWorker(base::Bind( |
| 755 &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 756 base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), |
| 757 base::Bind(&self::DispatchClientMessageEventInternal, |
| 758 weak_factory_.GetWeakPtr(), message, sent_message_ports, |
| 759 client_uuid, callback, client_info))); |
| 760 return; |
| 761 } |
| 762 |
| 763 // TODO(kinuko): Cleanup this (and corresponding unit test) when message |
| 764 // event becomes extendable, round-trip event. (crbug.com/498596) |
| 765 RestartTick(&idle_time_); |
| 766 |
| 767 int request_id = AddRequest(callback, &message_callbacks_, REQUEST_MESSAGE); |
| 768 ServiceWorkerClientInfo client(client_info); |
| 769 client.client_uuid = client_uuid; |
708 MessagePortMessageFilter* filter = | 770 MessagePortMessageFilter* filter = |
709 embedded_worker_->message_port_message_filter(); | 771 embedded_worker_->message_port_message_filter(); |
710 std::vector<int> new_routing_ids; | 772 std::vector<int> new_routing_ids; |
711 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | 773 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
712 ServiceWorkerStatusCode status = | 774 ServiceWorkerStatusCode status = |
713 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( | 775 embedded_worker_->SendMessage(ServiceWorkerMsg_ClientMessageEvent( |
714 message, sent_message_ports, new_routing_ids)); | 776 request_id, client, message, sent_message_ports, new_routing_ids)); |
715 RunSoon(base::Bind(callback, status)); | 777 if (status != SERVICE_WORKER_OK) { |
| 778 message_callbacks_.Remove(request_id); |
| 779 RunSoon(base::Bind(callback, status)); |
| 780 } |
716 } | 781 } |
717 | 782 |
718 void ServiceWorkerVersion::DispatchInstallEvent( | 783 void ServiceWorkerVersion::DispatchInstallEvent( |
719 const StatusCallback& callback) { | 784 const StatusCallback& callback) { |
720 DCHECK_EQ(INSTALLING, status()) << status(); | 785 DCHECK_EQ(INSTALLING, status()) << status(); |
721 | 786 |
722 if (running_status() != RUNNING) { | 787 if (running_status() != RUNNING) { |
723 // Schedule calling this method after starting the worker. | 788 // Schedule calling this method after starting the worker. |
724 StartWorker( | 789 StartWorker( |
725 base::Bind(&RunTaskAfterStartWorker, | 790 base::Bind(&RunTaskAfterStartWorker, |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 1246 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
1182 OnSyncEventFinished) | 1247 OnSyncEventFinished) |
1183 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, | 1248 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, |
1184 OnNotificationClickEventFinished) | 1249 OnNotificationClickEventFinished) |
1185 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, | 1250 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
1186 OnPushEventFinished) | 1251 OnPushEventFinished) |
1187 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, | 1252 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, |
1188 OnGeofencingEventFinished) | 1253 OnGeofencingEventFinished) |
1189 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, | 1254 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, |
1190 OnCrossOriginConnectEventFinished) | 1255 OnCrossOriginConnectEventFinished) |
| 1256 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_MessageEventFinished, |
| 1257 OnMessageEventFinished) |
1191 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | 1258 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
1192 OnOpenWindow) | 1259 OnOpenWindow) |
1193 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, | 1260 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
1194 OnSetCachedMetadata) | 1261 OnSetCachedMetadata) |
1195 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, | 1262 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ClearCachedMetadata, |
1196 OnClearCachedMetadata) | 1263 OnClearCachedMetadata) |
1197 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, | 1264 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToClient, |
1198 OnPostMessageToClient) | 1265 OnPostMessageToClient) |
1199 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 1266 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
1200 OnFocusClient) | 1267 OnFocusClient) |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1437 NOTREACHED() << "Got unexpected message: " << request_id; | 1504 NOTREACHED() << "Got unexpected message: " << request_id; |
1438 return; | 1505 return; |
1439 } | 1506 } |
1440 | 1507 |
1441 scoped_refptr<ServiceWorkerVersion> protect(this); | 1508 scoped_refptr<ServiceWorkerVersion> protect(this); |
1442 callback->Run(SERVICE_WORKER_OK, accept_connection); | 1509 callback->Run(SERVICE_WORKER_OK, accept_connection); |
1443 RemoveCallbackAndStopIfRedundant(&cross_origin_connect_callbacks_, | 1510 RemoveCallbackAndStopIfRedundant(&cross_origin_connect_callbacks_, |
1444 request_id); | 1511 request_id); |
1445 } | 1512 } |
1446 | 1513 |
| 1514 void ServiceWorkerVersion::OnMessageEventFinished(int request_id) { |
| 1515 TRACE_EVENT1("ServiceWorker", "ServiceWorkerVersion::OnMessageEventFinished", |
| 1516 "Request id", request_id); |
| 1517 StatusCallback* callback = message_callbacks_.Lookup(request_id); |
| 1518 if (!callback) { |
| 1519 NOTREACHED() << "Got unexpected message: " << request_id; |
| 1520 return; |
| 1521 } |
| 1522 |
| 1523 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 1524 callback->Run(SERVICE_WORKER_OK); |
| 1525 RemoveCallbackAndStopIfRedundant(&message_callbacks_, request_id); |
| 1526 } |
| 1527 |
1447 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1528 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
1448 // Just abort if we are shutting down. | 1529 // Just abort if we are shutting down. |
1449 if (!context_) | 1530 if (!context_) |
1450 return; | 1531 return; |
1451 | 1532 |
1452 if (!url.is_valid()) { | 1533 if (!url.is_valid()) { |
1453 DVLOG(1) << "Received unexpected invalid URL from renderer process."; | 1534 DVLOG(1) << "Received unexpected invalid URL from renderer process."; |
1454 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 1535 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
1455 base::Bind(&KillEmbeddedWorkerProcess, | 1536 base::Bind(&KillEmbeddedWorkerProcess, |
1456 embedded_worker_->process_id(), | 1537 embedded_worker_->process_id(), |
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2032 case REQUEST_PUSH: | 2113 case REQUEST_PUSH: |
2033 return RunIDMapCallback(&push_callbacks_, info.id, | 2114 return RunIDMapCallback(&push_callbacks_, info.id, |
2034 SERVICE_WORKER_ERROR_TIMEOUT); | 2115 SERVICE_WORKER_ERROR_TIMEOUT); |
2035 case REQUEST_GEOFENCING: | 2116 case REQUEST_GEOFENCING: |
2036 return RunIDMapCallback(&geofencing_callbacks_, info.id, | 2117 return RunIDMapCallback(&geofencing_callbacks_, info.id, |
2037 SERVICE_WORKER_ERROR_TIMEOUT); | 2118 SERVICE_WORKER_ERROR_TIMEOUT); |
2038 case REQUEST_CROSS_ORIGIN_CONNECT: | 2119 case REQUEST_CROSS_ORIGIN_CONNECT: |
2039 return RunIDMapCallback(&cross_origin_connect_callbacks_, info.id, | 2120 return RunIDMapCallback(&cross_origin_connect_callbacks_, info.id, |
2040 SERVICE_WORKER_ERROR_TIMEOUT, | 2121 SERVICE_WORKER_ERROR_TIMEOUT, |
2041 false /* accept_connection */); | 2122 false /* accept_connection */); |
| 2123 case REQUEST_MESSAGE: |
| 2124 return RunIDMapCallback(&message_callbacks_, info.id, |
| 2125 SERVICE_WORKER_ERROR_TIMEOUT); |
2042 } | 2126 } |
2043 NOTREACHED() << "Got unexpected request type: " << info.type; | 2127 NOTREACHED() << "Got unexpected request type: " << info.type; |
2044 return false; | 2128 return false; |
2045 } | 2129 } |
2046 | 2130 |
2047 void ServiceWorkerVersion::SetAllRequestTimes(const base::TimeTicks& ticks) { | 2131 void ServiceWorkerVersion::SetAllRequestTimes(const base::TimeTicks& ticks) { |
2048 std::queue<RequestInfo> new_requests; | 2132 std::queue<RequestInfo> new_requests; |
2049 while (!requests_.empty()) { | 2133 while (!requests_.empty()) { |
2050 RequestInfo info = requests_.front(); | 2134 RequestInfo info = requests_.front(); |
2051 info.time = ticks; | 2135 info.time = ticks; |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2158 | 2242 |
2159 streaming_url_request_jobs_.clear(); | 2243 streaming_url_request_jobs_.clear(); |
2160 | 2244 |
2161 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 2245 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
2162 | 2246 |
2163 if (should_restart) | 2247 if (should_restart) |
2164 StartWorkerInternal(false /* pause_after_download */); | 2248 StartWorkerInternal(false /* pause_after_download */); |
2165 } | 2249 } |
2166 | 2250 |
2167 } // namespace content | 2251 } // namespace content |
OLD | NEW |