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

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

Issue 2905593002: Clients.matchAll() should return ordered clients by type/focus time/creation time (Closed)
Patch Set: Address shimazu's comments #24 and leon's #21 Created 3 years, 7 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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_client_utils.h" 5 #include "content/browser/service_worker/service_worker_client_utils.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <tuple> 8 #include <tuple>
9 9
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 95
96 int frame_tree_node_id_; 96 int frame_tree_node_id_;
97 const OpenURLCallback callback_; 97 const OpenURLCallback callback_;
98 98
99 DISALLOW_COPY_AND_ASSIGN(OpenURLObserver); 99 DISALLOW_COPY_AND_ASSIGN(OpenURLObserver);
100 }; 100 };
101 101
102 ServiceWorkerClientInfo GetWindowClientInfoOnUI( 102 ServiceWorkerClientInfo GetWindowClientInfoOnUI(
103 int render_process_id, 103 int render_process_id,
104 int render_frame_id, 104 int render_frame_id,
105 base::TimeTicks create_time,
105 const std::string& client_uuid) { 106 const std::string& client_uuid) {
106 DCHECK_CURRENTLY_ON(BrowserThread::UI); 107 DCHECK_CURRENTLY_ON(BrowserThread::UI);
107 RenderFrameHostImpl* render_frame_host = 108 RenderFrameHostImpl* render_frame_host =
108 RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 109 RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
109 if (!render_frame_host) 110 if (!render_frame_host)
110 return ServiceWorkerClientInfo(); 111 return ServiceWorkerClientInfo();
111 112
112 // TODO(mlamouri,michaeln): it is possible to end up collecting information 113 // TODO(mlamouri,michaeln): it is possible to end up collecting information
113 // for a frame that is actually being navigated and isn't exactly what we are 114 // for a frame that is actually being navigated and isn't exactly what we are
114 // expecting. 115 // expecting.
115 return ServiceWorkerClientInfo( 116 return ServiceWorkerClientInfo(
116 client_uuid, render_frame_host->GetVisibilityState(), 117 client_uuid, render_frame_host->GetVisibilityState(),
117 render_frame_host->IsFocused(), render_frame_host->GetLastCommittedURL(), 118 render_frame_host->IsFocused(), render_frame_host->GetLastCommittedURL(),
118 render_frame_host->GetParent() ? REQUEST_CONTEXT_FRAME_TYPE_NESTED 119 render_frame_host->GetParent() ? REQUEST_CONTEXT_FRAME_TYPE_NESTED
119 : REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL, 120 : REQUEST_CONTEXT_FRAME_TYPE_TOP_LEVEL,
120 render_frame_host->frame_tree_node()->last_focus_time(), 121 render_frame_host->frame_tree_node()->last_focus_time(), create_time,
121 blink::kWebServiceWorkerClientTypeWindow); 122 blink::kWebServiceWorkerClientTypeWindow);
122 } 123 }
123 124
124 ServiceWorkerClientInfo FocusOnUI(int render_process_id, 125 ServiceWorkerClientInfo FocusOnUI(int render_process_id,
125 int render_frame_id, 126 int render_frame_id,
127 base::TimeTicks create_time,
126 const std::string& client_uuid) { 128 const std::string& client_uuid) {
127 DCHECK_CURRENTLY_ON(BrowserThread::UI); 129 DCHECK_CURRENTLY_ON(BrowserThread::UI);
128 RenderFrameHostImpl* render_frame_host = 130 RenderFrameHostImpl* render_frame_host =
129 RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 131 RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
130 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( 132 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
131 WebContents::FromRenderFrameHost(render_frame_host)); 133 WebContents::FromRenderFrameHost(render_frame_host));
132 134
133 if (!render_frame_host || !web_contents) 135 if (!render_frame_host || !web_contents)
134 return ServiceWorkerClientInfo(); 136 return ServiceWorkerClientInfo();
135 137
136 FrameTreeNode* frame_tree_node = render_frame_host->frame_tree_node(); 138 FrameTreeNode* frame_tree_node = render_frame_host->frame_tree_node();
137 139
138 // Focus the frame in the frame tree node, in case it has changed. 140 // Focus the frame in the frame tree node, in case it has changed.
139 frame_tree_node->frame_tree()->SetFocusedFrame( 141 frame_tree_node->frame_tree()->SetFocusedFrame(
140 frame_tree_node, render_frame_host->GetSiteInstance()); 142 frame_tree_node, render_frame_host->GetSiteInstance());
141 143
142 // Focus the frame's view to make sure the frame is now considered as focused. 144 // Focus the frame's view to make sure the frame is now considered as focused.
143 render_frame_host->GetView()->Focus(); 145 render_frame_host->GetView()->Focus();
144 146
145 // Move the web contents to the foreground. 147 // Move the web contents to the foreground.
146 web_contents->Activate(); 148 web_contents->Activate();
147 149
148 return GetWindowClientInfoOnUI(render_process_id, render_frame_id, 150 return GetWindowClientInfoOnUI(render_process_id, render_frame_id,
149 client_uuid); 151 create_time, client_uuid);
150 } 152 }
151 153
152 // This is only called for main frame navigations in OpenWindowOnUI(). 154 // This is only called for main frame navigations in OpenWindowOnUI().
153 void DidOpenURLOnUI(const OpenURLCallback& callback, 155 void DidOpenURLOnUI(const OpenURLCallback& callback,
154 WebContents* web_contents) { 156 WebContents* web_contents) {
155 DCHECK_CURRENTLY_ON(BrowserThread::UI); 157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
156 158
157 if (!web_contents) { 159 if (!web_contents) {
158 BrowserThread::PostTask( 160 BrowserThread::PostTask(
159 BrowserThread::IO, FROM_HERE, 161 BrowserThread::IO, FROM_HERE,
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 context->GetClientProviderHostIterator(origin); 269 context->GetClientProviderHostIterator(origin);
268 !it->IsAtEnd(); it->Advance()) { 270 !it->IsAtEnd(); it->Advance()) {
269 ServiceWorkerProviderHost* provider_host = it->GetProviderHost(); 271 ServiceWorkerProviderHost* provider_host = it->GetProviderHost();
270 if (provider_host->process_id() != render_process_id || 272 if (provider_host->process_id() != render_process_id ||
271 provider_host->frame_id() != render_frame_id) { 273 provider_host->frame_id() != render_frame_id) {
272 continue; 274 continue;
273 } 275 }
274 BrowserThread::PostTaskAndReplyWithResult( 276 BrowserThread::PostTaskAndReplyWithResult(
275 BrowserThread::UI, FROM_HERE, 277 BrowserThread::UI, FROM_HERE,
276 base::Bind(&GetWindowClientInfoOnUI, provider_host->process_id(), 278 base::Bind(&GetWindowClientInfoOnUI, provider_host->process_id(),
277 provider_host->route_id(), provider_host->client_uuid()), 279 provider_host->route_id(), provider_host->create_time(),
280 provider_host->client_uuid()),
278 base::Bind(callback, SERVICE_WORKER_OK)); 281 base::Bind(callback, SERVICE_WORKER_OK));
279 return; 282 return;
280 } 283 }
281 284
282 // If here, it means that no provider_host was found, in which case, the 285 // If here, it means that no provider_host was found, in which case, the
283 // renderer should still be informed that the window was opened. 286 // renderer should still be informed that the window was opened.
284 callback.Run(SERVICE_WORKER_OK, ServiceWorkerClientInfo()); 287 callback.Run(SERVICE_WORKER_OK, ServiceWorkerClientInfo());
285 } 288 }
286 289
287 void AddWindowClient( 290 void AddWindowClient(
288 ServiceWorkerProviderHost* host, 291 ServiceWorkerProviderHost* host,
289 std::vector<std::tuple<int, int, std::string>>* client_info) { 292 std::vector<std::tuple<int, int, base::TimeTicks, std::string>>*
293 client_info) {
290 DCHECK_CURRENTLY_ON(BrowserThread::IO); 294 DCHECK_CURRENTLY_ON(BrowserThread::IO);
291 if (host->client_type() != blink::kWebServiceWorkerClientTypeWindow) 295 if (host->client_type() != blink::kWebServiceWorkerClientTypeWindow)
292 return; 296 return;
293 client_info->push_back(std::make_tuple(host->process_id(), host->frame_id(), 297 client_info->push_back(std::make_tuple(host->process_id(), host->frame_id(),
298 host->create_time(),
294 host->client_uuid())); 299 host->client_uuid()));
295 } 300 }
296 301
297 void AddNonWindowClient(ServiceWorkerProviderHost* host, 302 void AddNonWindowClient(ServiceWorkerProviderHost* host,
298 const ServiceWorkerClientQueryOptions& options, 303 const ServiceWorkerClientQueryOptions& options,
299 ServiceWorkerClients* clients) { 304 ServiceWorkerClients* clients) {
300 DCHECK_CURRENTLY_ON(BrowserThread::IO); 305 DCHECK_CURRENTLY_ON(BrowserThread::IO);
301 blink::WebServiceWorkerClientType host_client_type = host->client_type(); 306 blink::WebServiceWorkerClientType host_client_type = host->client_type();
302 if (host_client_type == blink::kWebServiceWorkerClientTypeWindow) 307 if (host_client_type == blink::kWebServiceWorkerClientTypeWindow)
303 return; 308 return;
304 if (options.client_type != blink::kWebServiceWorkerClientTypeAll && 309 if (options.client_type != blink::kWebServiceWorkerClientTypeAll &&
305 options.client_type != host_client_type) 310 options.client_type != host_client_type)
306 return; 311 return;
307 312
308 ServiceWorkerClientInfo client_info( 313 ServiceWorkerClientInfo client_info(
309 host->client_uuid(), blink::kWebPageVisibilityStateHidden, 314 host->client_uuid(), blink::kWebPageVisibilityStateHidden,
310 false, // is_focused 315 false, // is_focused
311 host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, base::TimeTicks(), 316 host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, base::TimeTicks(),
312 host_client_type); 317 host->create_time(), host_client_type);
313 clients->push_back(client_info); 318 clients->push_back(client_info);
314 } 319 }
315 320
316 void OnGetWindowClientsOnUI( 321 void OnGetWindowClientsOnUI(
317 // The tuple contains process_id, frame_id, client_uuid. 322 // The tuple contains process_id, frame_id, create_time, client_uuid.
318 const std::vector<std::tuple<int, int, std::string>>& clients_info, 323 const std::vector<std::tuple<int, int, base::TimeTicks, std::string>>&
324 clients_info,
319 const GURL& script_url, 325 const GURL& script_url,
320 const GetWindowClientsCallback& callback) { 326 const GetWindowClientsCallback& callback,
327 std::unique_ptr<ServiceWorkerClients> clients) {
321 DCHECK_CURRENTLY_ON(BrowserThread::UI); 328 DCHECK_CURRENTLY_ON(BrowserThread::UI);
322 329
323 std::unique_ptr<ServiceWorkerClients> clients(new ServiceWorkerClients);
324 for (const auto& it : clients_info) { 330 for (const auto& it : clients_info) {
325 ServiceWorkerClientInfo info = GetWindowClientInfoOnUI( 331 ServiceWorkerClientInfo info = GetWindowClientInfoOnUI(
326 std::get<0>(it), std::get<1>(it), std::get<2>(it)); 332 std::get<0>(it), std::get<1>(it), std::get<2>(it), std::get<3>(it));
327 333
328 // If the request to the provider_host returned an empty 334 // If the request to the provider_host returned an empty
329 // ServiceWorkerClientInfo, that means that it wasn't possible to associate 335 // ServiceWorkerClientInfo, that means that it wasn't possible to associate
330 // it with a valid RenderFrameHost. It might be because the frame was killed 336 // it with a valid RenderFrameHost. It might be because the frame was killed
331 // or navigated in between. 337 // or navigated in between.
332 if (info.IsEmpty()) 338 if (info.IsEmpty())
333 continue; 339 continue;
334 340
335 // We can get info for a frame that was navigating end ended up with a 341 // We can get info for a frame that was navigating end ended up with a
336 // different URL than expected. In such case, we should make sure to not 342 // different URL than expected. In such case, we should make sure to not
337 // expose cross-origin WindowClient. 343 // expose cross-origin WindowClient.
338 if (info.url.GetOrigin() != script_url.GetOrigin()) 344 if (info.url.GetOrigin() != script_url.GetOrigin())
339 continue; 345 continue;
340 346
341 clients->push_back(info); 347 clients->push_back(info);
342 } 348 }
343 349
344 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 350 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
345 base::Bind(callback, base::Passed(&clients))); 351 base::Bind(callback, base::Passed(&clients)));
346 } 352 }
347 353
348 struct ServiceWorkerClientInfoSortMRU { 354 struct ServiceWorkerClientInfoSort {
349 bool operator()(const ServiceWorkerClientInfo& a, 355 bool operator()(const ServiceWorkerClientInfo& a,
350 const ServiceWorkerClientInfo& b) const { 356 const ServiceWorkerClientInfo& b) const {
351 return a.last_focus_time > b.last_focus_time; 357 if ((a.client_type != b.client_type) &&
358 ((a.client_type == blink::kWebServiceWorkerClientTypeWindow) ||
359 (b.client_type == blink::kWebServiceWorkerClientTypeWindow)))
360 return a.client_type < b.client_type;
shimazu 2017/05/29 01:45:13 I feel numerical comparison of enum is a bit scare
xiaofengzhang 2017/06/01 01:00:42 Done. Thanks a lot :-)
361 else if (a.last_focus_time != b.last_focus_time)
362 return a.last_focus_time > b.last_focus_time;
363 else
364 return a.create_time < b.create_time;
shimazu 2017/05/29 01:45:13 I think it's better to use '<=' to preserve the or
xiaofengzhang 2017/06/01 01:00:42 It seems "<=" will cause some test failure.
shimazu 2017/06/01 09:50:49 Hmm... I didn't think this change cause crashes. C
shimazu 2017/06/05 01:48:43 Ah, sorry, that's my bad. C++ Compare requires com
352 } 365 }
353 }; 366 };
354 367
355 void DidGetClients(const ClientsCallback& callback, 368 void DidGetClients(const ClientsCallback& callback,
356 ServiceWorkerClients* clients) { 369 std::unique_ptr<ServiceWorkerClients> clients) {
357 DCHECK_CURRENTLY_ON(BrowserThread::IO); 370 DCHECK_CURRENTLY_ON(BrowserThread::IO);
358 371
359 // Sort clients so that the most recently active tab is in the front. 372 std::sort(clients->begin(), clients->end(), ServiceWorkerClientInfoSort());
360 std::sort(clients->begin(), clients->end(), ServiceWorkerClientInfoSortMRU());
361 373
362 callback.Run(clients); 374 callback.Run(std::move(clients));
363 } 375 }
364 376
365 void GetNonWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller, 377 void GetNonWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller,
366 const ServiceWorkerClientQueryOptions& options, 378 const ServiceWorkerClientQueryOptions& options,
367 ServiceWorkerClients* clients) { 379 const ClientsCallback& callback,
380 std::unique_ptr<ServiceWorkerClients> clients) {
368 DCHECK_CURRENTLY_ON(BrowserThread::IO); 381 DCHECK_CURRENTLY_ON(BrowserThread::IO);
369 if (!options.include_uncontrolled) { 382 if (!options.include_uncontrolled) {
370 for (auto& controllee : controller->controllee_map()) 383 for (auto& controllee : controller->controllee_map())
371 AddNonWindowClient(controllee.second, options, clients); 384 AddNonWindowClient(controllee.second, options, clients.get());
372 } else if (controller->context()) { 385 } else if (controller->context()) {
373 GURL origin = controller->script_url().GetOrigin(); 386 GURL origin = controller->script_url().GetOrigin();
374 for (auto it = controller->context()->GetClientProviderHostIterator(origin); 387 for (auto it = controller->context()->GetClientProviderHostIterator(origin);
375 !it->IsAtEnd(); it->Advance()) { 388 !it->IsAtEnd(); it->Advance()) {
376 AddNonWindowClient(it->GetProviderHost(), options, clients); 389 AddNonWindowClient(it->GetProviderHost(), options, clients.get());
377 } 390 }
378 } 391 }
392 DidGetClients(callback, std::move(clients));
379 } 393 }
380 394
381 void DidGetWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller, 395 void DidGetWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller,
382 const ServiceWorkerClientQueryOptions& options, 396 const ServiceWorkerClientQueryOptions& options,
383 const ClientsCallback& callback, 397 const ClientsCallback& callback,
384 std::unique_ptr<ServiceWorkerClients> clients) { 398 std::unique_ptr<ServiceWorkerClients> clients) {
385 DCHECK_CURRENTLY_ON(BrowserThread::IO); 399 DCHECK_CURRENTLY_ON(BrowserThread::IO);
386 if (options.client_type == blink::kWebServiceWorkerClientTypeAll) 400 if (options.client_type == blink::kWebServiceWorkerClientTypeAll) {
387 GetNonWindowClients(controller, options, clients.get()); 401 GetNonWindowClients(controller, options, callback, std::move(clients));
388 DidGetClients(callback, clients.get()); 402 return;
403 }
404 DidGetClients(callback, std::move(clients));
389 } 405 }
390 406
391 void GetWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller, 407 void GetWindowClients(const base::WeakPtr<ServiceWorkerVersion>& controller,
392 const ServiceWorkerClientQueryOptions& options, 408 const ServiceWorkerClientQueryOptions& options,
393 const ClientsCallback& callback) { 409 const ClientsCallback& callback,
410 std::unique_ptr<ServiceWorkerClients> clients) {
394 DCHECK_CURRENTLY_ON(BrowserThread::IO); 411 DCHECK_CURRENTLY_ON(BrowserThread::IO);
395 DCHECK(options.client_type == blink::kWebServiceWorkerClientTypeWindow || 412 DCHECK(options.client_type == blink::kWebServiceWorkerClientTypeWindow ||
396 options.client_type == blink::kWebServiceWorkerClientTypeAll); 413 options.client_type == blink::kWebServiceWorkerClientTypeAll);
397 414
398 std::vector<std::tuple<int, int, std::string>> clients_info; 415 std::vector<std::tuple<int, int, base::TimeTicks, std::string>> clients_info;
399 if (!options.include_uncontrolled) { 416 if (!options.include_uncontrolled) {
400 for (auto& controllee : controller->controllee_map()) 417 for (auto& controllee : controller->controllee_map()) {
shimazu 2017/05/29 01:45:13 Brackets are not necessary here.
xiaofengzhang 2017/06/01 01:00:42 Done. aha, I didn't want to add the brackets here,
401 AddWindowClient(controllee.second, &clients_info); 418 AddWindowClient(controllee.second, &clients_info);
419 }
402 } else if (controller->context()) { 420 } else if (controller->context()) {
403 GURL origin = controller->script_url().GetOrigin(); 421 GURL origin = controller->script_url().GetOrigin();
404 for (auto it = controller->context()->GetClientProviderHostIterator(origin); 422 for (auto it = controller->context()->GetClientProviderHostIterator(origin);
405 !it->IsAtEnd(); it->Advance()) { 423 !it->IsAtEnd(); it->Advance()) {
406 AddWindowClient(it->GetProviderHost(), &clients_info); 424 AddWindowClient(it->GetProviderHost(), &clients_info);
407 } 425 }
408 } 426 }
409 427
410 if (clients_info.empty()) { 428 if (clients_info.empty()) {
411 DidGetWindowClients(controller, options, callback, 429 DidGetWindowClients(controller, options, callback, std::move(clients));
412 base::WrapUnique(new ServiceWorkerClients));
413 return; 430 return;
414 } 431 }
415 432
416 BrowserThread::PostTask( 433 BrowserThread::PostTask(
417 BrowserThread::UI, FROM_HERE, 434 BrowserThread::UI, FROM_HERE,
418 base::Bind( 435 base::Bind(
419 &OnGetWindowClientsOnUI, clients_info, controller->script_url(), 436 &OnGetWindowClientsOnUI, clients_info, controller->script_url(),
420 base::Bind(&DidGetWindowClients, controller, options, callback))); 437 base::Bind(&DidGetWindowClients, controller, options, callback),
438 base::Passed(&clients)));
421 } 439 }
422 440
423 } // namespace 441 } // namespace
424 442
425 void FocusWindowClient(ServiceWorkerProviderHost* provider_host, 443 void FocusWindowClient(ServiceWorkerProviderHost* provider_host,
426 const ClientCallback& callback) { 444 const ClientCallback& callback) {
427 DCHECK_CURRENTLY_ON(BrowserThread::IO); 445 DCHECK_CURRENTLY_ON(BrowserThread::IO);
428 DCHECK_EQ(blink::kWebServiceWorkerClientTypeWindow, 446 DCHECK_EQ(blink::kWebServiceWorkerClientTypeWindow,
429 provider_host->client_type()); 447 provider_host->client_type());
430 BrowserThread::PostTaskAndReplyWithResult( 448 BrowserThread::PostTaskAndReplyWithResult(
431 BrowserThread::UI, FROM_HERE, 449 BrowserThread::UI, FROM_HERE,
432 base::Bind(&FocusOnUI, provider_host->process_id(), 450 base::Bind(&FocusOnUI, provider_host->process_id(),
433 provider_host->frame_id(), provider_host->client_uuid()), 451 provider_host->frame_id(), provider_host->create_time(),
452 provider_host->client_uuid()),
434 callback); 453 callback);
435 } 454 }
436 455
437 void OpenWindow(const GURL& url, 456 void OpenWindow(const GURL& url,
438 const GURL& script_url, 457 const GURL& script_url,
439 int worker_process_id, 458 int worker_process_id,
440 const base::WeakPtr<ServiceWorkerContextCore>& context, 459 const base::WeakPtr<ServiceWorkerContextCore>& context,
441 const NavigationCallback& callback) { 460 const NavigationCallback& callback) {
442 DCHECK_CURRENTLY_ON(BrowserThread::IO); 461 DCHECK_CURRENTLY_ON(BrowserThread::IO);
443 BrowserThread::PostTask( 462 BrowserThread::PostTask(
(...skipping 25 matching lines...) Expand all
469 blink::WebServiceWorkerClientType client_type = provider_host->client_type(); 488 blink::WebServiceWorkerClientType client_type = provider_host->client_type();
470 DCHECK(client_type == blink::kWebServiceWorkerClientTypeWindow || 489 DCHECK(client_type == blink::kWebServiceWorkerClientTypeWindow ||
471 client_type == blink::kWebServiceWorkerClientTypeWorker || 490 client_type == blink::kWebServiceWorkerClientTypeWorker ||
472 client_type == blink::kWebServiceWorkerClientTypeSharedWorker) 491 client_type == blink::kWebServiceWorkerClientTypeSharedWorker)
473 << client_type; 492 << client_type;
474 493
475 if (client_type == blink::kWebServiceWorkerClientTypeWindow) { 494 if (client_type == blink::kWebServiceWorkerClientTypeWindow) {
476 BrowserThread::PostTaskAndReplyWithResult( 495 BrowserThread::PostTaskAndReplyWithResult(
477 BrowserThread::UI, FROM_HERE, 496 BrowserThread::UI, FROM_HERE,
478 base::Bind(&GetWindowClientInfoOnUI, provider_host->process_id(), 497 base::Bind(&GetWindowClientInfoOnUI, provider_host->process_id(),
479 provider_host->route_id(), provider_host->client_uuid()), 498 provider_host->route_id(), provider_host->create_time(),
499 provider_host->client_uuid()),
480 callback); 500 callback);
481 return; 501 return;
482 } 502 }
483 503
484 ServiceWorkerClientInfo client_info( 504 ServiceWorkerClientInfo client_info(
485 provider_host->client_uuid(), blink::kWebPageVisibilityStateHidden, 505 provider_host->client_uuid(), blink::kWebPageVisibilityStateHidden,
486 false, // is_focused 506 false, // is_focused
487 provider_host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE, 507 provider_host->document_url(), REQUEST_CONTEXT_FRAME_TYPE_NONE,
488 base::TimeTicks(), provider_host->client_type()); 508 base::TimeTicks(), provider_host->create_time(),
509 provider_host->client_type());
489 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 510 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
490 base::Bind(callback, client_info)); 511 base::Bind(callback, client_info));
491 } 512 }
492 513
493 void GetClients(const base::WeakPtr<ServiceWorkerVersion>& controller, 514 void GetClients(const base::WeakPtr<ServiceWorkerVersion>& controller,
494 const ServiceWorkerClientQueryOptions& options, 515 const ServiceWorkerClientQueryOptions& options,
495 const ClientsCallback& callback) { 516 const ClientsCallback& callback) {
496 DCHECK_CURRENTLY_ON(BrowserThread::IO); 517 DCHECK_CURRENTLY_ON(BrowserThread::IO);
497 518
498 ServiceWorkerClients clients; 519 auto clients = base::MakeUnique<ServiceWorkerClients>();
499 if (!controller->HasControllee() && !options.include_uncontrolled) { 520 if (!controller->HasControllee() && !options.include_uncontrolled) {
500 DidGetClients(callback, &clients); 521 DidGetClients(callback, std::move(clients));
501 return; 522 return;
502 } 523 }
503 524
504 // For Window clients we want to query the info on the UI thread first. 525 // For Window clients we want to query the info on the UI thread first.
505 if (options.client_type == blink::kWebServiceWorkerClientTypeWindow || 526 if (options.client_type == blink::kWebServiceWorkerClientTypeWindow ||
506 options.client_type == blink::kWebServiceWorkerClientTypeAll) { 527 options.client_type == blink::kWebServiceWorkerClientTypeAll) {
507 GetWindowClients(controller, options, callback); 528 GetWindowClients(controller, options, callback, std::move(clients));
508 return; 529 return;
509 } 530 }
510 531
511 GetNonWindowClients(controller, options, &clients); 532 GetNonWindowClients(controller, options, callback, std::move(clients));
512 DidGetClients(callback, &clients);
513 } 533 }
514 534
515 } // namespace service_worker_client_utils 535 } // namespace service_worker_client_utils
516 } // namespace content 536 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698