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/stl_util.h" | 9 #include "base/stl_util.h" |
10 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
11 #include "content/browser/message_port_message_filter.h" | 11 #include "content/browser/message_port_message_filter.h" |
12 #include "content/browser/message_port_service.h" | 12 #include "content/browser/message_port_service.h" |
13 #include "content/browser/service_worker/embedded_worker_instance.h" | 13 #include "content/browser/service_worker/embedded_worker_instance.h" |
14 #include "content/browser/service_worker/embedded_worker_registry.h" | 14 #include "content/browser/service_worker/embedded_worker_registry.h" |
15 #include "content/browser/service_worker/service_worker_context_core.h" | 15 #include "content/browser/service_worker/service_worker_context_core.h" |
16 #include "content/browser/service_worker/service_worker_context_wrapper.h" | |
16 #include "content/browser/service_worker/service_worker_registration.h" | 17 #include "content/browser/service_worker/service_worker_registration.h" |
17 #include "content/browser/service_worker/service_worker_utils.h" | 18 #include "content/browser/service_worker/service_worker_utils.h" |
19 #include "content/browser/storage_partition_impl.h" | |
18 #include "content/common/service_worker/service_worker_messages.h" | 20 #include "content/common/service_worker/service_worker_messages.h" |
19 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
22 #include "content/public/browser/content_browser_client.h" | |
23 #include "content/public/browser/page_navigator.h" | |
24 #include "content/public/browser/render_frame_host.h" | |
25 #include "content/public/browser/render_process_host.h" | |
26 #include "content/public/browser/web_contents.h" | |
27 #include "content/public/browser/web_contents_observer.h" | |
28 #include "content/public/common/child_process_host.h" | |
29 #include "content/public/common/content_client.h" | |
20 #include "content/public/common/content_switches.h" | 30 #include "content/public/common/content_switches.h" |
21 | 31 |
22 namespace content { | 32 namespace content { |
23 | 33 |
24 typedef ServiceWorkerVersion::StatusCallback StatusCallback; | 34 typedef ServiceWorkerVersion::StatusCallback StatusCallback; |
25 typedef ServiceWorkerVersion::MessageCallback MessageCallback; | 35 typedef ServiceWorkerVersion::MessageCallback MessageCallback; |
26 | 36 |
27 class ServiceWorkerVersion::GetClientDocumentsCallback | 37 class ServiceWorkerVersion::GetClientDocumentsCallback |
28 : public base::RefCounted<GetClientDocumentsCallback> { | 38 : public base::RefCounted<GetClientDocumentsCallback> { |
29 public: | 39 public: |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
136 } | 146 } |
137 callback.Run(status); | 147 callback.Run(status); |
138 } | 148 } |
139 | 149 |
140 void RunErrorCrossOriginConnectCallback( | 150 void RunErrorCrossOriginConnectCallback( |
141 const ServiceWorkerVersion::CrossOriginConnectCallback& callback, | 151 const ServiceWorkerVersion::CrossOriginConnectCallback& callback, |
142 ServiceWorkerStatusCode status) { | 152 ServiceWorkerStatusCode status) { |
143 callback.Run(status, false); | 153 callback.Run(status, false); |
144 } | 154 } |
145 | 155 |
156 using WindowOpenedCallback = base::Callback<void(int,int)>; | |
157 | |
158 // The WindowOpenedObserver class is a WebContentsObserver that will wait for a | |
159 // new Window's WebContents to be initialized, run the |callback| passed to its | |
160 // constructor then self destroy. | |
161 // The callback will receive the process and frame ids. If something went wrong | |
162 // those will be (kInvalidUniqueID,MSG_ROUTING_NONE). | |
163 class WindowOpenedObserver : public WebContentsObserver { | |
164 public: | |
165 WindowOpenedObserver(WebContents* web_contents, | |
166 const WindowOpenedCallback& callback) | |
167 : WebContentsObserver(web_contents) | |
168 , callback_(callback) | |
169 {} | |
170 | |
171 void DocumentAvailableInMainFrame() override { | |
172 DCHECK(web_contents()); | |
173 | |
174 RenderFrameHost* render_frame_host = web_contents()->GetMainFrame(); | |
175 DCHECK(render_frame_host); | |
176 | |
177 RunCallback(render_frame_host->GetProcess()->GetID(), | |
178 render_frame_host->GetRoutingID()); | |
179 } | |
180 | |
181 void RenderProcessGone(base::TerminationStatus status) override { | |
182 RunCallback(ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE); | |
183 } | |
184 | |
185 void WebContentsDestroyed() override { | |
186 RunCallback(ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE); | |
187 } | |
188 | |
189 private: | |
190 void RunCallback(int render_process_id, int render_frame_id) { | |
191 // After running the callback, |this| will stop observing, thus | |
192 // web_contents() should return nullptr and |RunCallback| should no longer | |
193 // be called. Then, |this| will self destroy. | |
194 DCHECK(web_contents()); | |
195 | |
196 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | |
197 base::Bind(callback_, | |
198 render_process_id, | |
199 render_frame_id)); | |
200 Observe(nullptr); | |
201 base::MessageLoop::current()->DeleteSoon(FROM_HERE, this); | |
202 } | |
203 | |
204 const WindowOpenedCallback callback_; | |
205 }; | |
206 | |
207 void OpenWindowOnUI( | |
208 const GURL& url, | |
209 const GURL& referrer, | |
210 const scoped_refptr<ServiceWorkerContextWrapper>& context_wrapper, | |
211 const WindowOpenedCallback& callback) { | |
212 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
213 | |
214 BrowserContext* browser_context = context_wrapper->storage_partition() | |
215 ? context_wrapper->storage_partition()->browser_context() | |
216 : nullptr; | |
217 // We are shutting down. | |
218 if (!browser_context) | |
219 return; | |
220 | |
221 OpenURLParams params(url, | |
222 Referrer(referrer, blink::WebReferrerPolicyDefault), | |
223 NEW_FOREGROUND_TAB, | |
224 ui::PAGE_TRANSITION_AUTO_TOPLEVEL, | |
225 false); | |
226 WebContents* web_contents = | |
227 GetContentClient()->browser()->OpenURL(browser_context, params); | |
michaeln
2015/01/17 00:25:32
imo, storage_partition ptr would make sense as an
michaeln
2015/01/17 00:25:32
can this method return nullptr for a web_contents,
mlamouri (slow - plz ping)
2015/01/26 13:19:08
Let's discuss about that in the CL related to Cont
| |
228 | |
229 new WindowOpenedObserver(web_contents, callback); | |
230 } | |
231 | |
146 } // namespace | 232 } // namespace |
147 | 233 |
148 ServiceWorkerVersion::ServiceWorkerVersion( | 234 ServiceWorkerVersion::ServiceWorkerVersion( |
149 ServiceWorkerRegistration* registration, | 235 ServiceWorkerRegistration* registration, |
150 const GURL& script_url, | 236 const GURL& script_url, |
151 int64 version_id, | 237 int64 version_id, |
152 base::WeakPtr<ServiceWorkerContextCore> context) | 238 base::WeakPtr<ServiceWorkerContextCore> context) |
153 : version_id_(version_id), | 239 : version_id_(version_id), |
154 registration_id_(kInvalidServiceWorkerVersionId), | 240 registration_id_(kInvalidServiceWorkerVersionId), |
155 script_url_(script_url), | 241 script_url_(script_url), |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
781 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 867 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
782 OnSyncEventFinished) | 868 OnSyncEventFinished) |
783 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, | 869 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_NotificationClickEventFinished, |
784 OnNotificationClickEventFinished) | 870 OnNotificationClickEventFinished) |
785 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, | 871 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
786 OnPushEventFinished) | 872 OnPushEventFinished) |
787 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, | 873 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, |
788 OnGeofencingEventFinished) | 874 OnGeofencingEventFinished) |
789 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, | 875 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, |
790 OnCrossOriginConnectEventFinished) | 876 OnCrossOriginConnectEventFinished) |
877 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, | |
878 OnOpenWindow) | |
791 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, | 879 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, |
792 OnPostMessageToDocument) | 880 OnPostMessageToDocument) |
793 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, | 881 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FocusClient, |
794 OnFocusClient) | 882 OnFocusClient) |
795 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoSuccess, | 883 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoSuccess, |
michaeln
2015/01/17 00:25:32
Hmmm...
This is not new, but these two ClientInfo
mlamouri (slow - plz ping)
2015/01/26 13:19:08
I've changed how this is being handled in https://
| |
796 OnGetClientInfoSuccess) | 884 OnGetClientInfoSuccess) |
797 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError, | 885 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetClientInfoError, |
798 OnGetClientInfoError) | 886 OnGetClientInfoError) |
799 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, | 887 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SkipWaiting, |
800 OnSkipWaiting) | 888 OnSkipWaiting) |
801 IPC_MESSAGE_UNHANDLED(handled = false) | 889 IPC_MESSAGE_UNHANDLED(handled = false) |
802 IPC_END_MESSAGE_MAP() | 890 IPC_END_MESSAGE_MAP() |
803 return handled; | 891 return handled; |
804 } | 892 } |
805 | 893 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1031 if (!callback) { | 1119 if (!callback) { |
1032 NOTREACHED() << "Got unexpected message: " << request_id; | 1120 NOTREACHED() << "Got unexpected message: " << request_id; |
1033 return; | 1121 return; |
1034 } | 1122 } |
1035 | 1123 |
1036 scoped_refptr<ServiceWorkerVersion> protect(this); | 1124 scoped_refptr<ServiceWorkerVersion> protect(this); |
1037 callback->Run(SERVICE_WORKER_OK, accept_connection); | 1125 callback->Run(SERVICE_WORKER_OK, accept_connection); |
1038 cross_origin_connect_callbacks_.Remove(request_id); | 1126 cross_origin_connect_callbacks_.Remove(request_id); |
1039 } | 1127 } |
1040 | 1128 |
1129 void ServiceWorkerVersion::OnOpenWindow( | |
1130 int request_id, const GURL& url, const GURL& referrer) { | |
1131 // Just abort if we are shutting down. | |
1132 if (!context_) | |
1133 return; | |
1134 scoped_refptr<ServiceWorkerContextWrapper> context_wrapper( | |
1135 context_->wrapper()); | |
1136 | |
1137 BrowserThread::PostTask( | |
1138 BrowserThread::UI, FROM_HERE, | |
1139 base::Bind(&OpenWindowOnUI, | |
1140 url, | |
1141 referrer, | |
1142 context_wrapper, | |
michaeln
2015/01/17 00:25:32
nit: make_scoped_refptr(context_->wrapper()) might
mlamouri (slow - plz ping)
2015/01/26 13:19:08
Done.
| |
1143 base::Bind(&ServiceWorkerVersion::DidOpenWindow, | |
1144 weak_factory_.GetWeakPtr(), | |
1145 request_id))); | |
1146 } | |
1147 | |
1148 void ServiceWorkerVersion::DidOpenWindow(int request_id, | |
1149 int render_process_id, | |
1150 int render_frame_id) { | |
1151 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
1152 | |
1153 if (running_status() != RUNNING) | |
1154 return; | |
1155 | |
1156 if (render_process_id == ChildProcessHost::kInvalidUniqueID && | |
nasko
2015/01/17 00:05:28
RenderProcessHost is what hosts Blink renderers. C
mlamouri (slow - plz ping)
2015/01/26 13:19:08
My understanding was that a RenderProcess was a ty
| |
1157 render_frame_id == MSG_ROUTING_NONE) { | |
1158 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowError(request_id)); | |
1159 return; | |
1160 } | |
1161 | |
1162 for (const auto& it : controllee_map_) { | |
1163 const ServiceWorkerProviderHost* provider_host = it.first; | |
1164 if (provider_host->process_id() != render_process_id || | |
1165 provider_host->frame_id() != render_frame_id) { | |
1166 continue; | |
1167 } | |
1168 | |
1169 int client_request_id = get_client_info_callbacks_.Add( | |
1170 new GetClientInfoCallback(base::Bind( | |
1171 &ServiceWorkerVersion::OnOpenWindowFinished, | |
1172 weak_factory_.GetWeakPtr(), request_id))); | |
1173 provider_host->GetClientInfo(embedded_worker_->embedded_worker_id(), | |
1174 client_request_id); | |
1175 return; | |
1176 } | |
1177 | |
1178 // If here, it means that no provider_host was found, in which case, the | |
1179 // renderer should still be informed that the window was opened. | |
1180 OnOpenWindowFinished(request_id, | |
1181 SERVICE_WORKER_ERROR_FAILED, | |
1182 ServiceWorkerClientInfo()); | |
1183 } | |
1184 | |
1185 void ServiceWorkerVersion::OnOpenWindowFinished( | |
1186 int request_id, | |
1187 ServiceWorkerStatusCode status, | |
1188 const ServiceWorkerClientInfo& client_info) { | |
michaeln
2015/01/17 00:25:32
how is the client_info.client_id field filled in,
mlamouri (slow - plz ping)
2015/01/26 13:19:08
Fixed.
| |
1189 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
1190 | |
1191 if (running_status() != RUNNING) | |
1192 return; | |
1193 | |
1194 // If the status is an error, it means that it wasn't possible to find the | |
1195 // client but the window was correctly opened. In that case, the renderer is | |
1196 // expecting to receive the |client_info| with the boolean (|dummy_client|) | |
1197 // set to true. | |
1198 if (status != SERVICE_WORKER_OK) { | |
1199 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowResponse( | |
1200 request_id, client_info, true)); | |
1201 return; | |
1202 } | |
1203 | |
1204 embedded_worker_->SendMessage(ServiceWorkerMsg_OpenWindowResponse( | |
1205 request_id, client_info, false)); | |
1206 } | |
1207 | |
1041 void ServiceWorkerVersion::OnPostMessageToDocument( | 1208 void ServiceWorkerVersion::OnPostMessageToDocument( |
1042 int client_id, | 1209 int client_id, |
1043 const base::string16& message, | 1210 const base::string16& message, |
1044 const std::vector<int>& sent_message_port_ids) { | 1211 const std::vector<int>& sent_message_port_ids) { |
1045 TRACE_EVENT1("ServiceWorker", | 1212 TRACE_EVENT1("ServiceWorker", |
1046 "ServiceWorkerVersion::OnPostMessageToDocument", | 1213 "ServiceWorkerVersion::OnPostMessageToDocument", |
1047 "Client id", client_id); | 1214 "Client id", client_id); |
1048 ServiceWorkerProviderHost* provider_host = | 1215 ServiceWorkerProviderHost* provider_host = |
1049 controllee_by_id_.Lookup(client_id); | 1216 controllee_by_id_.Lookup(client_id); |
1050 if (!provider_host) { | 1217 if (!provider_host) { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1158 SetStatus(REDUNDANT); | 1325 SetStatus(REDUNDANT); |
1159 StopWorkerIfIdle(); | 1326 StopWorkerIfIdle(); |
1160 if (!context_) | 1327 if (!context_) |
1161 return; | 1328 return; |
1162 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; | 1329 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
1163 script_cache_map_.GetResources(&resources); | 1330 script_cache_map_.GetResources(&resources); |
1164 context_->storage()->PurgeResources(resources); | 1331 context_->storage()->PurgeResources(resources); |
1165 } | 1332 } |
1166 | 1333 |
1167 } // namespace content | 1334 } // namespace content |
OLD | NEW |