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_provider_host.h" | 5 #include "content/browser/service_worker/service_worker_provider_host.h" |
6 | 6 |
7 #include "base/guid.h" | 7 #include "base/guid.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "content/browser/frame_host/frame_tree.h" | 9 #include "content/browser/frame_host/frame_tree.h" |
10 #include "content/browser/frame_host/frame_tree_node.h" | 10 #include "content/browser/frame_host/frame_tree_node.h" |
(...skipping 13 matching lines...) Expand all Loading... | |
24 #include "content/common/service_worker/service_worker_types.h" | 24 #include "content/common/service_worker/service_worker_types.h" |
25 #include "content/public/browser/render_frame_host.h" | 25 #include "content/public/browser/render_frame_host.h" |
26 #include "content/public/browser/render_widget_host_view.h" | 26 #include "content/public/browser/render_widget_host_view.h" |
27 #include "content/public/browser/web_contents.h" | 27 #include "content/public/browser/web_contents.h" |
28 #include "content/public/common/child_process_host.h" | 28 #include "content/public/common/child_process_host.h" |
29 | 29 |
30 namespace content { | 30 namespace content { |
31 | 31 |
32 namespace { | 32 namespace { |
33 | 33 |
34 ServiceWorkerClientInfo FocusOnUIThread( | 34 ServiceWorkerClientInfo FocusOnUIThread(int render_process_id, int route_id) { |
dcheng
2015/06/17 23:21:13
Nit: keep this named "render_frame_id"
horo
2015/06/17 23:51:07
Done.
| |
35 int render_process_id, | |
36 int render_frame_id) { | |
37 RenderFrameHostImpl* render_frame_host = | 35 RenderFrameHostImpl* render_frame_host = |
38 RenderFrameHostImpl::FromID(render_process_id, render_frame_id); | 36 RenderFrameHostImpl::FromID(render_process_id, route_id); |
39 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( | 37 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
40 WebContents::FromRenderFrameHost(render_frame_host)); | 38 WebContents::FromRenderFrameHost(render_frame_host)); |
41 | 39 |
42 if (!render_frame_host || !web_contents) | 40 if (!render_frame_host || !web_contents) |
43 return ServiceWorkerClientInfo(); | 41 return ServiceWorkerClientInfo(); |
44 | 42 |
45 FrameTreeNode* frame_tree_node = render_frame_host->frame_tree_node(); | 43 FrameTreeNode* frame_tree_node = render_frame_host->frame_tree_node(); |
46 | 44 |
47 // Focus the frame in the frame tree node, in case it has changed. | 45 // Focus the frame in the frame tree node, in case it has changed. |
48 frame_tree_node->frame_tree()->SetFocusedFrame(frame_tree_node); | 46 frame_tree_node->frame_tree()->SetFocusedFrame(frame_tree_node); |
49 | 47 |
50 // Focus the frame's view to make sure the frame is now considered as focused. | 48 // Focus the frame's view to make sure the frame is now considered as focused. |
51 render_frame_host->GetView()->Focus(); | 49 render_frame_host->GetView()->Focus(); |
52 | 50 |
53 // Move the web contents to the foreground. | 51 // Move the web contents to the foreground. |
54 web_contents->Activate(); | 52 web_contents->Activate(); |
55 | 53 |
56 return ServiceWorkerProviderHost::GetWindowClientInfoOnUI(render_process_id, | 54 return ServiceWorkerProviderHost::GetWindowClientInfoOnUI(render_process_id, |
57 render_frame_id); | 55 route_id); |
58 } | 56 } |
59 | 57 |
60 } // anonymous namespace | 58 } // anonymous namespace |
61 | 59 |
62 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( | 60 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( |
63 const GetRegistrationForReadyCallback& callback) | 61 const GetRegistrationForReadyCallback& callback) |
64 : callback(callback), | 62 : callback(callback), |
65 called(false) { | 63 called(false) { |
66 } | 64 } |
67 | 65 |
68 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() { | 66 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() { |
69 } | 67 } |
70 | 68 |
71 ServiceWorkerProviderHost::ServiceWorkerProviderHost( | 69 ServiceWorkerProviderHost::ServiceWorkerProviderHost( |
72 int render_process_id, | 70 int render_process_id, |
73 int render_frame_id, | 71 int route_id, |
74 int provider_id, | 72 int provider_id, |
75 ServiceWorkerProviderType provider_type, | 73 ServiceWorkerProviderType provider_type, |
76 base::WeakPtr<ServiceWorkerContextCore> context, | 74 base::WeakPtr<ServiceWorkerContextCore> context, |
77 ServiceWorkerDispatcherHost* dispatcher_host) | 75 ServiceWorkerDispatcherHost* dispatcher_host) |
78 : client_uuid_(base::GenerateGUID()), | 76 : client_uuid_(base::GenerateGUID()), |
79 render_process_id_(render_process_id), | 77 render_process_id_(render_process_id), |
80 render_frame_id_(render_frame_id), | 78 route_id_(route_id), |
81 render_thread_id_(kDocumentMainThreadId), | 79 render_thread_id_(kDocumentMainThreadId), |
82 provider_id_(provider_id), | 80 provider_id_(provider_id), |
83 provider_type_(provider_type), | 81 provider_type_(provider_type), |
84 context_(context), | 82 context_(context), |
85 dispatcher_host_(dispatcher_host), | 83 dispatcher_host_(dispatcher_host), |
86 allow_association_(true) { | 84 allow_association_(true) { |
87 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); | 85 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
88 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); | 86 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); |
89 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { | 87 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { |
90 // Actual thread id is set when the service worker context gets started. | 88 // Actual thread id is set when the service worker context gets started. |
(...skipping 14 matching lines...) Expand all Loading... | |
105 | 103 |
106 for (auto& key_registration : matching_registrations_) { | 104 for (auto& key_registration : matching_registrations_) { |
107 DecreaseProcessReference(key_registration.second->pattern()); | 105 DecreaseProcessReference(key_registration.second->pattern()); |
108 key_registration.second->RemoveListener(this); | 106 key_registration.second->RemoveListener(this); |
109 } | 107 } |
110 | 108 |
111 for (const GURL& pattern : associated_patterns_) | 109 for (const GURL& pattern : associated_patterns_) |
112 DecreaseProcessReference(pattern); | 110 DecreaseProcessReference(pattern); |
113 } | 111 } |
114 | 112 |
113 int ServiceWorkerProviderHost::frame_id() const { | |
114 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_WINDOW) | |
115 return route_id_; | |
116 return MSG_ROUTING_NONE; | |
117 } | |
118 | |
115 void ServiceWorkerProviderHost::OnVersionAttributesChanged( | 119 void ServiceWorkerProviderHost::OnVersionAttributesChanged( |
116 ServiceWorkerRegistration* registration, | 120 ServiceWorkerRegistration* registration, |
117 ChangedVersionAttributesMask changed_mask, | 121 ChangedVersionAttributesMask changed_mask, |
118 const ServiceWorkerRegistrationInfo& info) { | 122 const ServiceWorkerRegistrationInfo& info) { |
119 if (!get_ready_callback_ || get_ready_callback_->called) | 123 if (!get_ready_callback_ || get_ready_callback_->called) |
120 return; | 124 return; |
121 if (changed_mask.active_changed() && registration->active_version()) { | 125 if (changed_mask.active_changed() && registration->active_version()) { |
122 // Wait until the state change so we don't send the get for ready | 126 // Wait until the state change so we don't send the get for ready |
123 // registration complete message before set version attributes message. | 127 // registration complete message before set version attributes message. |
124 registration->active_version()->RegisterStatusChangeCallback(base::Bind( | 128 registration->active_version()->RegisterStatusChangeCallback(base::Bind( |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
379 &new_routing_ids); | 383 &new_routing_ids); |
380 | 384 |
381 Send(new ServiceWorkerMsg_MessageToDocument( | 385 Send(new ServiceWorkerMsg_MessageToDocument( |
382 kDocumentMainThreadId, provider_id(), | 386 kDocumentMainThreadId, provider_id(), |
383 message, | 387 message, |
384 sent_message_ports, | 388 sent_message_ports, |
385 new_routing_ids)); | 389 new_routing_ids)); |
386 } | 390 } |
387 | 391 |
388 void ServiceWorkerProviderHost::Focus(const GetClientInfoCallback& callback) { | 392 void ServiceWorkerProviderHost::Focus(const GetClientInfoCallback& callback) { |
393 if (provider_type_ != SERVICE_WORKER_PROVIDER_FOR_WINDOW) { | |
394 callback.Run(ServiceWorkerClientInfo()); | |
395 return; | |
396 } | |
389 BrowserThread::PostTaskAndReplyWithResult( | 397 BrowserThread::PostTaskAndReplyWithResult( |
390 BrowserThread::UI, FROM_HERE, | 398 BrowserThread::UI, FROM_HERE, |
391 base::Bind(&FocusOnUIThread, | 399 base::Bind(&FocusOnUIThread, render_process_id_, route_id_), callback); |
392 render_process_id_, | |
393 render_frame_id_), | |
394 callback); | |
395 } | 400 } |
396 | 401 |
397 void ServiceWorkerProviderHost::GetWindowClientInfo( | 402 void ServiceWorkerProviderHost::GetWindowClientInfo( |
398 const GetClientInfoCallback& callback) const { | 403 const GetClientInfoCallback& callback) const { |
399 BrowserThread::PostTaskAndReplyWithResult( | 404 BrowserThread::PostTaskAndReplyWithResult( |
400 BrowserThread::UI, FROM_HERE, | 405 BrowserThread::UI, FROM_HERE, |
401 base::Bind(&ServiceWorkerProviderHost::GetWindowClientInfoOnUI, | 406 base::Bind(&ServiceWorkerProviderHost::GetWindowClientInfoOnUI, |
402 render_process_id_, render_frame_id_), | 407 render_process_id_, route_id_), |
403 callback); | 408 callback); |
404 } | 409 } |
405 | 410 |
406 // static | 411 // static |
407 ServiceWorkerClientInfo ServiceWorkerProviderHost::GetWindowClientInfoOnUI( | 412 ServiceWorkerClientInfo ServiceWorkerProviderHost::GetWindowClientInfoOnUI( |
408 int render_process_id, | 413 int render_process_id, |
409 int render_frame_id) { | 414 int route_id) { |
410 RenderFrameHostImpl* render_frame_host = | 415 RenderFrameHostImpl* render_frame_host = |
411 RenderFrameHostImpl::FromID(render_process_id, render_frame_id); | 416 RenderFrameHostImpl::FromID(render_process_id, route_id); |
412 if (!render_frame_host) | 417 if (!render_frame_host) |
413 return ServiceWorkerClientInfo(); | 418 return ServiceWorkerClientInfo(); |
414 | 419 |
415 // TODO(mlamouri,michaeln): it is possible to end up collecting information | 420 // TODO(mlamouri,michaeln): it is possible to end up collecting information |
416 // for a frame that is actually being navigated and isn't exactly what we are | 421 // for a frame that is actually being navigated and isn't exactly what we are |
417 // expecting. | 422 // expecting. |
418 return ServiceWorkerClientInfo( | 423 return ServiceWorkerClientInfo( |
419 render_frame_host->GetVisibilityState(), | 424 render_frame_host->GetVisibilityState(), |
420 render_frame_host->IsFocused(), | 425 render_frame_host->IsFocused(), |
421 render_frame_host->GetLastCommittedURL(), | 426 render_frame_host->GetLastCommittedURL(), |
(...skipping 24 matching lines...) Expand all Loading... | |
446 const GetRegistrationForReadyCallback& callback) { | 451 const GetRegistrationForReadyCallback& callback) { |
447 if (get_ready_callback_) | 452 if (get_ready_callback_) |
448 return false; | 453 return false; |
449 get_ready_callback_.reset(new OneShotGetReadyCallback(callback)); | 454 get_ready_callback_.reset(new OneShotGetReadyCallback(callback)); |
450 ReturnRegistrationForReadyIfNeeded(); | 455 ReturnRegistrationForReadyIfNeeded(); |
451 return true; | 456 return true; |
452 } | 457 } |
453 | 458 |
454 void ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() { | 459 void ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() { |
455 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); | 460 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
456 DCHECK_NE(MSG_ROUTING_NONE, render_frame_id_); | 461 DCHECK_NE(MSG_ROUTING_NONE, route_id_); |
457 DCHECK_EQ(kDocumentMainThreadId, render_thread_id_); | 462 DCHECK_EQ(kDocumentMainThreadId, render_thread_id_); |
458 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); | 463 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); |
459 | 464 |
460 for (const GURL& pattern : associated_patterns_) | 465 for (const GURL& pattern : associated_patterns_) |
461 DecreaseProcessReference(pattern); | 466 DecreaseProcessReference(pattern); |
462 | 467 |
463 for (auto& key_registration : matching_registrations_) | 468 for (auto& key_registration : matching_registrations_) |
464 DecreaseProcessReference(key_registration.second->pattern()); | 469 DecreaseProcessReference(key_registration.second->pattern()); |
465 | 470 |
466 if (associated_registration_.get()) { | 471 if (associated_registration_.get()) { |
467 if (dispatcher_host_) { | 472 if (dispatcher_host_) { |
468 Send(new ServiceWorkerMsg_DisassociateRegistration( | 473 Send(new ServiceWorkerMsg_DisassociateRegistration( |
469 render_thread_id_, provider_id())); | 474 render_thread_id_, provider_id())); |
470 } | 475 } |
471 } | 476 } |
472 | 477 |
473 render_process_id_ = ChildProcessHost::kInvalidUniqueID; | 478 render_process_id_ = ChildProcessHost::kInvalidUniqueID; |
474 render_frame_id_ = MSG_ROUTING_NONE; | 479 route_id_ = MSG_ROUTING_NONE; |
475 render_thread_id_ = kInvalidEmbeddedWorkerThreadId; | 480 render_thread_id_ = kInvalidEmbeddedWorkerThreadId; |
476 provider_id_ = kInvalidServiceWorkerProviderId; | 481 provider_id_ = kInvalidServiceWorkerProviderId; |
477 provider_type_ = SERVICE_WORKER_PROVIDER_UNKNOWN; | 482 provider_type_ = SERVICE_WORKER_PROVIDER_UNKNOWN; |
478 dispatcher_host_ = nullptr; | 483 dispatcher_host_ = nullptr; |
479 } | 484 } |
480 | 485 |
481 void ServiceWorkerProviderHost::CompleteCrossSiteTransfer( | 486 void ServiceWorkerProviderHost::CompleteCrossSiteTransfer( |
482 int new_process_id, | 487 int new_process_id, |
483 int new_frame_id, | 488 int new_frame_id, |
484 int new_provider_id, | 489 int new_provider_id, |
485 ServiceWorkerProviderType new_provider_type, | 490 ServiceWorkerProviderType new_provider_type, |
486 ServiceWorkerDispatcherHost* new_dispatcher_host) { | 491 ServiceWorkerDispatcherHost* new_dispatcher_host) { |
487 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_); | 492 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
488 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, new_process_id); | 493 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, new_process_id); |
489 DCHECK_NE(MSG_ROUTING_NONE, new_frame_id); | 494 DCHECK_NE(MSG_ROUTING_NONE, new_frame_id); |
490 | 495 |
491 render_process_id_ = new_process_id; | 496 render_process_id_ = new_process_id; |
492 render_frame_id_ = new_frame_id; | 497 route_id_ = new_frame_id; |
493 render_thread_id_ = kDocumentMainThreadId; | 498 render_thread_id_ = kDocumentMainThreadId; |
494 provider_id_ = new_provider_id; | 499 provider_id_ = new_provider_id; |
495 provider_type_ = new_provider_type; | 500 provider_type_ = new_provider_type; |
496 dispatcher_host_ = new_dispatcher_host; | 501 dispatcher_host_ = new_dispatcher_host; |
497 | 502 |
498 for (const GURL& pattern : associated_patterns_) | 503 for (const GURL& pattern : associated_patterns_) |
499 IncreaseProcessReference(pattern); | 504 IncreaseProcessReference(pattern); |
500 | 505 |
501 for (auto& key_registration : matching_registrations_) | 506 for (auto& key_registration : matching_registrations_) |
502 IncreaseProcessReference(key_registration.second->pattern()); | 507 IncreaseProcessReference(key_registration.second->pattern()); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
650 return context_ != NULL; | 655 return context_ != NULL; |
651 } | 656 } |
652 | 657 |
653 void ServiceWorkerProviderHost::Send(IPC::Message* message) const { | 658 void ServiceWorkerProviderHost::Send(IPC::Message* message) const { |
654 DCHECK(dispatcher_host_); | 659 DCHECK(dispatcher_host_); |
655 DCHECK(IsReadyToSendMessages()); | 660 DCHECK(IsReadyToSendMessages()); |
656 dispatcher_host_->Send(message); | 661 dispatcher_host_->Send(message); |
657 } | 662 } |
658 | 663 |
659 } // namespace content | 664 } // namespace content |
OLD | NEW |