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

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

Issue 871013003: Gather the ServiceWorker client information in the browser process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rfh_getvisibilitystate
Patch Set: rebase Created 5 years, 11 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/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
(...skipping 18 matching lines...) Expand all
29 public: 29 public:
30 GetClientDocumentsCallback(int request_id, 30 GetClientDocumentsCallback(int request_id,
31 ServiceWorkerVersion* version) 31 ServiceWorkerVersion* version)
32 : request_id_(request_id), 32 : request_id_(request_id),
33 version_(version) { 33 version_(version) {
34 DCHECK(version_); 34 DCHECK(version_);
35 } 35 }
36 36
37 void AddClientInfo(int client_id, const ServiceWorkerClientInfo& info) { 37 void AddClientInfo(int client_id, const ServiceWorkerClientInfo& info) {
38 clients_.push_back(info); 38 clients_.push_back(info);
39 clients_.back().client_id = client_id; 39 clients_.back().SetClientID(client_id);
40 } 40 }
41 41
42 private: 42 private:
43 friend class base::RefCounted<GetClientDocumentsCallback>; 43 friend class base::RefCounted<GetClientDocumentsCallback>;
44 44
45 virtual ~GetClientDocumentsCallback() { 45 virtual ~GetClientDocumentsCallback() {
michaeln 2015/01/26 22:09:46 can you add a DCHECK here for the IO thead?
mlamouri (slow - plz ping) 2015/01/27 15:03:08 Done.
46 if (version_->running_status() == RUNNING) { 46 if (version_->running_status() == RUNNING) {
michaeln 2015/01/26 22:09:46 What gaurantees version_ is still valid? Since hos
mlamouri (slow - plz ping) 2015/01/27 15:03:08 Done.
47 version_->embedded_worker_->SendMessage( 47 version_->embedded_worker_->SendMessage(
48 ServiceWorkerMsg_DidGetClientDocuments(request_id_, clients_)); 48 ServiceWorkerMsg_DidGetClientDocuments(request_id_, clients_));
49 } 49 }
50 } 50 }
51 51
52 std::vector<ServiceWorkerClientInfo> clients_; 52 std::vector<ServiceWorkerClientInfo> clients_;
53 int request_id_; 53 int request_id_;
54 54
55 // |version_| must outlive this callback. 55 // |version_| must outlive this callback.
56 ServiceWorkerVersion* version_; 56 ServiceWorkerVersion* version_;
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK, 709 SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK,
710 ServiceWorkerResponse()); 710 ServiceWorkerResponse());
711 RunIDMapCallbacks(&sync_callbacks_, 711 RunIDMapCallbacks(&sync_callbacks_,
712 SERVICE_WORKER_ERROR_FAILED); 712 SERVICE_WORKER_ERROR_FAILED);
713 RunIDMapCallbacks(&notification_click_callbacks_, 713 RunIDMapCallbacks(&notification_click_callbacks_,
714 SERVICE_WORKER_ERROR_FAILED); 714 SERVICE_WORKER_ERROR_FAILED);
715 RunIDMapCallbacks(&push_callbacks_, 715 RunIDMapCallbacks(&push_callbacks_,
716 SERVICE_WORKER_ERROR_FAILED); 716 SERVICE_WORKER_ERROR_FAILED);
717 RunIDMapCallbacks(&geofencing_callbacks_, 717 RunIDMapCallbacks(&geofencing_callbacks_,
718 SERVICE_WORKER_ERROR_FAILED); 718 SERVICE_WORKER_ERROR_FAILED);
719 RunIDMapCallbacks(&get_client_info_callbacks_,
720 SERVICE_WORKER_ERROR_FAILED,
721 ServiceWorkerClientInfo());
722 RunIDMapCallbacks(&cross_origin_connect_callbacks_, 719 RunIDMapCallbacks(&cross_origin_connect_callbacks_,
723 SERVICE_WORKER_ERROR_FAILED, 720 SERVICE_WORKER_ERROR_FAILED,
724 false); 721 false);
725 722
726 streaming_url_request_jobs_.clear(); 723 streaming_url_request_jobs_.clear();
727 724
728 FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStopped(this)); 725 FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStopped(this));
729 726
730 // There should be no more communication from/to a stopped worker. Deleting 727 // There should be no more communication from/to a stopped worker. Deleting
731 // the listener prevents any pending completion callbacks from causing 728 // the listener prevents any pending completion callbacks from causing
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, 784 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished,
788 OnPushEventFinished) 785 OnPushEventFinished)
789 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, 786 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished,
790 OnGeofencingEventFinished) 787 OnGeofencingEventFinished)
791 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, 788 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished,
792 OnCrossOriginConnectEventFinished) 789 OnCrossOriginConnectEventFinished)
793 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, 790 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument,
794 OnPostMessageToDocument) 791 OnPostMessageToDocument)
795 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, 792 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient,
796 OnFocusClient) 793 OnFocusClient)
797 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoSuccess,
798 OnGetClientInfoSuccess)
799 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError,
800 OnGetClientInfoError)
801 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, 794 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting,
802 OnSkipWaiting) 795 OnSkipWaiting)
803 IPC_MESSAGE_UNHANDLED(handled = false) 796 IPC_MESSAGE_UNHANDLED(handled = false)
804 IPC_END_MESSAGE_MAP() 797 IPC_END_MESSAGE_MAP()
805 return handled; 798 return handled;
806 } 799 }
807 800
808 void ServiceWorkerVersion::OnStartMessageSent( 801 void ServiceWorkerVersion::OnStartMessageSent(
809 ServiceWorkerStatusCode status) { 802 ServiceWorkerStatusCode status) {
810 if (status != SERVICE_WORKER_OK) 803 if (status != SERVICE_WORKER_OK)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 std::vector<ServiceWorkerClientInfo>())); 841 std::vector<ServiceWorkerClientInfo>()));
849 } 842 }
850 return; 843 return;
851 } 844 }
852 scoped_refptr<GetClientDocumentsCallback> callback( 845 scoped_refptr<GetClientDocumentsCallback> callback(
853 new GetClientDocumentsCallback(request_id, this)); 846 new GetClientDocumentsCallback(request_id, this));
854 ControlleeByIDMap::iterator it(&controllee_by_id_); 847 ControlleeByIDMap::iterator it(&controllee_by_id_);
855 TRACE_EVENT0("ServiceWorker", 848 TRACE_EVENT0("ServiceWorker",
856 "ServiceWorkerVersion::OnGetClientDocuments"); 849 "ServiceWorkerVersion::OnGetClientDocuments");
857 while (!it.IsAtEnd()) { 850 while (!it.IsAtEnd()) {
858 int client_request_id = get_client_info_callbacks_.Add( 851 it.GetCurrentValue()->GetClientInfo(
859 new GetClientInfoCallback(base::Bind( 852 base::Bind(&ServiceWorkerVersion::DidGetClientInfo,
860 &ServiceWorkerVersion::DidGetClientInfo, 853 weak_factory_.GetWeakPtr(), it.GetCurrentKey(), callback));
861 weak_factory_.GetWeakPtr(), it.GetCurrentKey(), callback)));
862 it.GetCurrentValue()->GetClientInfo(embedded_worker_->embedded_worker_id(),
863 client_request_id);
864 it.Advance(); 854 it.Advance();
865 } 855 }
866 } 856 }
867 857
868 void ServiceWorkerVersion::OnGetClientInfoSuccess(
869 int request_id,
870 const ServiceWorkerClientInfo& info) {
871 GetClientInfoCallback* callback =
872 get_client_info_callbacks_.Lookup(request_id);
873 if (!callback) {
874 // The callback may already have been cleared by OnStopped, just ignore.
875 return;
876 }
877 callback->Run(SERVICE_WORKER_OK, info);
878 RemoveCallbackAndStopIfDoomed(&get_client_info_callbacks_, request_id);
879 }
880
881 void ServiceWorkerVersion::OnGetClientInfoError(int request_id) {
882 GetClientInfoCallback* callback =
883 get_client_info_callbacks_.Lookup(request_id);
884 if (!callback) {
885 // The callback may already have been cleared by OnStopped, just ignore.
886 return;
887 }
888 callback->Run(SERVICE_WORKER_ERROR_FAILED, ServiceWorkerClientInfo());
889 RemoveCallbackAndStopIfDoomed(&get_client_info_callbacks_, request_id);
890 }
891
892 void ServiceWorkerVersion::OnActivateEventFinished( 858 void ServiceWorkerVersion::OnActivateEventFinished(
893 int request_id, 859 int request_id,
894 blink::WebServiceWorkerEventResult result) { 860 blink::WebServiceWorkerEventResult result) {
895 DCHECK(ACTIVATING == status() || 861 DCHECK(ACTIVATING == status() ||
896 REDUNDANT == status()) << status(); 862 REDUNDANT == status()) << status();
897 TRACE_EVENT0("ServiceWorker", 863 TRACE_EVENT0("ServiceWorker",
898 "ServiceWorkerVersion::OnActivateEventFinished"); 864 "ServiceWorkerVersion::OnActivateEventFinished");
899 865
900 StatusCallback* callback = activate_callbacks_.Lookup(request_id); 866 StatusCallback* callback = activate_callbacks_.Lookup(request_id);
901 if (!callback) { 867 if (!callback) {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 } 1067 }
1102 1068
1103 void ServiceWorkerVersion::DidSkipWaiting(int request_id) { 1069 void ServiceWorkerVersion::DidSkipWaiting(int request_id) {
1104 if (running_status() == STARTING || running_status() == RUNNING) 1070 if (running_status() == STARTING || running_status() == RUNNING)
1105 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id)); 1071 embedded_worker_->SendMessage(ServiceWorkerMsg_DidSkipWaiting(request_id));
1106 } 1072 }
1107 1073
1108 void ServiceWorkerVersion::DidGetClientInfo( 1074 void ServiceWorkerVersion::DidGetClientInfo(
1109 int client_id, 1075 int client_id,
1110 scoped_refptr<GetClientDocumentsCallback> callback, 1076 scoped_refptr<GetClientDocumentsCallback> callback,
1111 ServiceWorkerStatusCode status,
1112 const ServiceWorkerClientInfo& info) { 1077 const ServiceWorkerClientInfo& info) {
1113 if (status == SERVICE_WORKER_OK) 1078 DCHECK(!info.IsEmpty());
michaeln 2015/01/26 22:09:46 i think you may need to allow for, and filter out,
mlamouri (slow - plz ping) 2015/01/27 15:03:08 Done.
1114 callback->AddClientInfo(client_id, info); 1079 callback->AddClientInfo(client_id, info);
1115 } 1080 }
1116 1081
1117 void ServiceWorkerVersion::ScheduleStopWorker() { 1082 void ServiceWorkerVersion::ScheduleStopWorker() {
1118 if (running_status() != RUNNING) 1083 if (running_status() != RUNNING)
1119 return; 1084 return;
1120 stop_worker_timer_.Stop(); 1085 stop_worker_timer_.Stop();
1121 stop_worker_timer_.Start( 1086 stop_worker_timer_.Start(
1122 FROM_HERE, base::TimeDelta::FromSeconds( 1087 FROM_HERE, base::TimeDelta::FromSeconds(
1123 is_doomed_ ? kStopDoomedWorkerDelay : kStopWorkerDelay), 1088 is_doomed_ ? kStopDoomedWorkerDelay : kStopWorkerDelay),
1124 base::Bind(&ServiceWorkerVersion::StopWorkerIfIdle, 1089 base::Bind(&ServiceWorkerVersion::StopWorkerIfIdle,
(...skipping 17 matching lines...) Expand all
1142 1107
1143 bool ServiceWorkerVersion::HasInflightRequests() const { 1108 bool ServiceWorkerVersion::HasInflightRequests() const {
1144 return 1109 return
1145 !activate_callbacks_.IsEmpty() || 1110 !activate_callbacks_.IsEmpty() ||
1146 !install_callbacks_.IsEmpty() || 1111 !install_callbacks_.IsEmpty() ||
1147 !fetch_callbacks_.IsEmpty() || 1112 !fetch_callbacks_.IsEmpty() ||
1148 !sync_callbacks_.IsEmpty() || 1113 !sync_callbacks_.IsEmpty() ||
1149 !notification_click_callbacks_.IsEmpty() || 1114 !notification_click_callbacks_.IsEmpty() ||
1150 !push_callbacks_.IsEmpty() || 1115 !push_callbacks_.IsEmpty() ||
1151 !geofencing_callbacks_.IsEmpty() || 1116 !geofencing_callbacks_.IsEmpty() ||
1152 !get_client_info_callbacks_.IsEmpty() ||
1153 !cross_origin_connect_callbacks_.IsEmpty() || 1117 !cross_origin_connect_callbacks_.IsEmpty() ||
1154 !streaming_url_request_jobs_.empty(); 1118 !streaming_url_request_jobs_.empty();
1155 } 1119 }
1156 1120
1157 void ServiceWorkerVersion::DoomInternal() { 1121 void ServiceWorkerVersion::DoomInternal() {
1158 DCHECK(is_doomed_); 1122 DCHECK(is_doomed_);
1159 DCHECK(!HasControllee()); 1123 DCHECK(!HasControllee());
1160 SetStatus(REDUNDANT); 1124 SetStatus(REDUNDANT);
1161 StopWorkerIfIdle(); 1125 StopWorkerIfIdle();
1162 if (!context_) 1126 if (!context_)
1163 return; 1127 return;
1164 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; 1128 std::vector<ServiceWorkerDatabase::ResourceRecord> resources;
1165 script_cache_map_.GetResources(&resources); 1129 script_cache_map_.GetResources(&resources);
1166 context_->storage()->PurgeResources(resources); 1130 context_->storage()->PurgeResources(resources);
1167 } 1131 }
1168 1132
1169 template <typename IDMAP> 1133 template <typename IDMAP>
1170 void ServiceWorkerVersion::RemoveCallbackAndStopIfDoomed( 1134 void ServiceWorkerVersion::RemoveCallbackAndStopIfDoomed(
1171 IDMAP* callbacks, 1135 IDMAP* callbacks,
1172 int request_id) { 1136 int request_id) {
1173 callbacks->Remove(request_id); 1137 callbacks->Remove(request_id);
1174 if (is_doomed_) { 1138 if (is_doomed_) {
1175 // The stop should be already scheduled, but try to stop immediately, in 1139 // The stop should be already scheduled, but try to stop immediately, in
1176 // order to release worker resources soon. 1140 // order to release worker resources soon.
1177 StopWorkerIfIdle(); 1141 StopWorkerIfIdle();
1178 } 1142 }
1179 } 1143 }
1180 1144
1181 } // namespace content 1145 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698