Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(431)

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 1235803003: ServiceWorker: Introduce ExtendableMessageEvent to replace MessageEvent Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/child/service_worker/service_worker_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698