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

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

Issue 1294243004: PlzNavigate: Make ServiceWorker work with PlzNavigate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 3 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_provider_host.h" 5 #include "content/browser/service_worker/service_worker_provider_host.h"
6 6
7 #include "base/atomic_sequence_num.h"
8 #include "base/command_line.h"
7 #include "base/guid.h" 9 #include "base/guid.h"
8 #include "base/stl_util.h" 10 #include "base/stl_util.h"
9 #include "base/time/time.h" 11 #include "base/time/time.h"
10 #include "content/browser/frame_host/frame_tree.h" 12 #include "content/browser/frame_host/frame_tree.h"
11 #include "content/browser/frame_host/frame_tree_node.h" 13 #include "content/browser/frame_host/frame_tree_node.h"
12 #include "content/browser/frame_host/render_frame_host_impl.h" 14 #include "content/browser/frame_host/render_frame_host_impl.h"
13 #include "content/browser/message_port_message_filter.h" 15 #include "content/browser/message_port_message_filter.h"
14 #include "content/browser/service_worker/service_worker_context_core.h" 16 #include "content/browser/service_worker/service_worker_context_core.h"
15 #include "content/browser/service_worker/service_worker_context_request_handler. h" 17 #include "content/browser/service_worker/service_worker_context_request_handler. h"
16 #include "content/browser/service_worker/service_worker_controllee_request_handl er.h" 18 #include "content/browser/service_worker/service_worker_controllee_request_handl er.h"
17 #include "content/browser/service_worker/service_worker_dispatcher_host.h" 19 #include "content/browser/service_worker/service_worker_dispatcher_host.h"
18 #include "content/browser/service_worker/service_worker_handle.h" 20 #include "content/browser/service_worker/service_worker_handle.h"
19 #include "content/browser/service_worker/service_worker_registration_handle.h" 21 #include "content/browser/service_worker/service_worker_registration_handle.h"
20 #include "content/browser/service_worker/service_worker_version.h" 22 #include "content/browser/service_worker/service_worker_version.h"
21 #include "content/browser/web_contents/web_contents_impl.h" 23 #include "content/browser/web_contents/web_contents_impl.h"
22 #include "content/common/resource_request_body.h" 24 #include "content/common/resource_request_body.h"
23 #include "content/common/service_worker/service_worker_messages.h" 25 #include "content/common/service_worker/service_worker_messages.h"
24 #include "content/common/service_worker/service_worker_types.h" 26 #include "content/common/service_worker/service_worker_types.h"
25 #include "content/common/service_worker/service_worker_utils.h" 27 #include "content/common/service_worker/service_worker_utils.h"
26 #include "content/public/browser/render_frame_host.h" 28 #include "content/public/browser/render_frame_host.h"
27 #include "content/public/browser/render_widget_host_view.h" 29 #include "content/public/browser/render_widget_host_view.h"
28 #include "content/public/browser/web_contents.h" 30 #include "content/public/browser/web_contents.h"
29 #include "content/public/common/child_process_host.h" 31 #include "content/public/common/child_process_host.h"
32 #include "content/public/common/content_switches.h"
30 33
31 namespace content { 34 namespace content {
32 35
33 namespace { 36 namespace {
34 37
35 ServiceWorkerClientInfo FocusOnUIThread(int render_process_id, 38 ServiceWorkerClientInfo FocusOnUIThread(int render_process_id,
36 int render_frame_id) { 39 int render_frame_id) {
37 RenderFrameHostImpl* render_frame_host = 40 RenderFrameHostImpl* render_frame_host =
38 RenderFrameHostImpl::FromID(render_process_id, render_frame_id); 41 RenderFrameHostImpl::FromID(render_process_id, render_frame_id);
39 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( 42 WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
(...skipping 12 matching lines...) Expand all
52 55
53 // Move the web contents to the foreground. 56 // Move the web contents to the foreground.
54 web_contents->Activate(); 57 web_contents->Activate();
55 58
56 return ServiceWorkerProviderHost::GetWindowClientInfoOnUI(render_process_id, 59 return ServiceWorkerProviderHost::GetWindowClientInfoOnUI(render_process_id,
57 render_frame_id); 60 render_frame_id);
58 } 61 }
59 62
60 } // anonymous namespace 63 } // anonymous namespace
61 64
65 // PlzNavigate
66 int ServiceWorkerProviderHost::kVirtualProcessIDForBrowserRequest = -2;
67
68 // PlzNavigate
69 int ServiceWorkerProviderHost::GetNextBrowserProviderID() {
70 static base::StaticAtomicSequenceNumber sequence;
michaeln 2015/09/16 00:56:42 Use of a thread safe construct here can be mislead
Fabrice (no longer in Chrome) 2015/09/30 17:32:07 Done.
71 return -2 - sequence.GetNext(); // Start at -2
72 }
73
62 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( 74 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback(
63 const GetRegistrationForReadyCallback& callback) 75 const GetRegistrationForReadyCallback& callback)
64 : callback(callback), 76 : callback(callback),
65 called(false) { 77 called(false) {
66 } 78 }
67 79
68 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() { 80 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() {
69 } 81 }
70 82
71 ServiceWorkerProviderHost::ServiceWorkerProviderHost( 83 ServiceWorkerProviderHost::ServiceWorkerProviderHost(
72 int render_process_id, 84 int render_process_id,
73 int route_id, 85 int route_id,
74 int provider_id, 86 int provider_id,
75 ServiceWorkerProviderType provider_type, 87 ServiceWorkerProviderType provider_type,
76 base::WeakPtr<ServiceWorkerContextCore> context, 88 base::WeakPtr<ServiceWorkerContextCore> context,
77 ServiceWorkerDispatcherHost* dispatcher_host) 89 ServiceWorkerDispatcherHost* dispatcher_host)
78 : client_uuid_(base::GenerateGUID()), 90 : client_uuid_(base::GenerateGUID()),
79 render_process_id_(render_process_id), 91 render_process_id_(render_process_id),
80 route_id_(route_id), 92 route_id_(route_id),
81 render_thread_id_(kDocumentMainThreadId), 93 render_thread_id_(kDocumentMainThreadId),
82 provider_id_(provider_id), 94 provider_id_(provider_id),
83 provider_type_(provider_type), 95 provider_type_(provider_type),
84 context_(context), 96 context_(context),
85 dispatcher_host_(dispatcher_host), 97 dispatcher_host_(dispatcher_host),
86 allow_association_(true) { 98 allow_association_(true) {
87 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); 99 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_);
88 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); 100 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_);
89 DCHECK_NE(SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME, provider_type_); 101 DCHECK_NE(SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME, provider_type_);
102
103 // PlzNavigate
104 CHECK_IMPLIES(render_process_id == kVirtualProcessIDForBrowserRequest,
105 base::CommandLine::ForCurrentProcess()->HasSwitch(
106 switches::kEnableBrowserSideNavigation));
107
90 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { 108 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) {
91 // Actual thread id is set when the service worker context gets started. 109 // Actual thread id is set when the service worker context gets started.
92 render_thread_id_ = kInvalidEmbeddedWorkerThreadId; 110 render_thread_id_ = kInvalidEmbeddedWorkerThreadId;
93 } 111 }
94 context_->RegisterProviderHostByClientID(client_uuid_, this); 112 context_->RegisterProviderHostByClientID(client_uuid_, this);
95 } 113 }
96 114
97 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() { 115 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
98 if (context_) 116 if (context_)
99 context_->UnregisterProviderHostByClientID(client_uuid_); 117 context_->UnregisterProviderHostByClientID(client_uuid_);
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 scoped_ptr<ServiceWorkerRequestHandler> 350 scoped_ptr<ServiceWorkerRequestHandler>
333 ServiceWorkerProviderHost::CreateRequestHandler( 351 ServiceWorkerProviderHost::CreateRequestHandler(
334 FetchRequestMode request_mode, 352 FetchRequestMode request_mode,
335 FetchCredentialsMode credentials_mode, 353 FetchCredentialsMode credentials_mode,
336 FetchRedirectMode redirect_mode, 354 FetchRedirectMode redirect_mode,
337 ResourceType resource_type, 355 ResourceType resource_type,
338 RequestContextType request_context_type, 356 RequestContextType request_context_type,
339 RequestContextFrameType frame_type, 357 RequestContextFrameType frame_type,
340 base::WeakPtr<storage::BlobStorageContext> blob_storage_context, 358 base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
341 scoped_refptr<ResourceRequestBody> body) { 359 scoped_refptr<ResourceRequestBody> body) {
360 scoped_ptr<ServiceWorkerRequestHandler> handler;
342 if (IsHostToRunningServiceWorker()) { 361 if (IsHostToRunningServiceWorker()) {
343 return scoped_ptr<ServiceWorkerRequestHandler>( 362 handler = scoped_ptr<ServiceWorkerRequestHandler>(
344 new ServiceWorkerContextRequestHandler( 363 new ServiceWorkerContextRequestHandler(
345 context_, AsWeakPtr(), blob_storage_context, resource_type)); 364 context_, AsWeakPtr(), blob_storage_context, resource_type));
346 } 365 }
347 if (ServiceWorkerUtils::IsMainResourceType(resource_type) || 366 if (ServiceWorkerUtils::IsMainResourceType(resource_type) ||
348 controlling_version()) { 367 controlling_version()) {
349 return scoped_ptr<ServiceWorkerRequestHandler>( 368 handler = scoped_ptr<ServiceWorkerRequestHandler>(
350 new ServiceWorkerControlleeRequestHandler( 369 new ServiceWorkerControlleeRequestHandler(
351 context_, AsWeakPtr(), blob_storage_context, request_mode, 370 context_, AsWeakPtr(), blob_storage_context, request_mode,
352 credentials_mode, redirect_mode, resource_type, 371 credentials_mode, redirect_mode, resource_type,
353 request_context_type, frame_type, body)); 372 request_context_type, frame_type, body));
354 } 373 }
355 return scoped_ptr<ServiceWorkerRequestHandler>(); 374 if (handler && render_process_id_ == kVirtualProcessIDForBrowserRequest) {
375 // PlzNavigate
376 handler->SetBrowserProviderHost(
michaeln 2015/09/16 00:56:42 This is an odd hidden artifact? See comments about
Fabrice (no longer in Chrome) 2015/09/30 17:32:07 Done.
377 scoped_ptr<ServiceWorkerProviderHost>(this));
378 }
379 return handler;
356 } 380 }
357 381
358 ServiceWorkerObjectInfo 382 ServiceWorkerObjectInfo
359 ServiceWorkerProviderHost::GetOrCreateServiceWorkerHandle( 383 ServiceWorkerProviderHost::GetOrCreateServiceWorkerHandle(
360 ServiceWorkerVersion* version) { 384 ServiceWorkerVersion* version) {
361 DCHECK(dispatcher_host_); 385 DCHECK(dispatcher_host_);
362 if (!context_ || !version) 386 if (!context_ || !version)
363 return ServiceWorkerObjectInfo(); 387 return ServiceWorkerObjectInfo();
364 ServiceWorkerHandle* handle = dispatcher_host_->FindServiceWorkerHandle( 388 ServiceWorkerHandle* handle = dispatcher_host_->FindServiceWorkerHandle(
365 provider_id(), version->version_id()); 389 provider_id(), version->version_id());
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 provider_type_ = SERVICE_WORKER_PROVIDER_UNKNOWN; 529 provider_type_ = SERVICE_WORKER_PROVIDER_UNKNOWN;
506 dispatcher_host_ = nullptr; 530 dispatcher_host_ = nullptr;
507 } 531 }
508 532
509 void ServiceWorkerProviderHost::CompleteCrossSiteTransfer( 533 void ServiceWorkerProviderHost::CompleteCrossSiteTransfer(
510 int new_process_id, 534 int new_process_id,
511 int new_frame_id, 535 int new_frame_id,
512 int new_provider_id, 536 int new_provider_id,
513 ServiceWorkerProviderType new_provider_type, 537 ServiceWorkerProviderType new_provider_type,
514 ServiceWorkerDispatcherHost* new_dispatcher_host) { 538 ServiceWorkerDispatcherHost* new_dispatcher_host) {
539 CHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(
540 switches::kEnableBrowserSideNavigation));
515 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_); 541 DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_);
516 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, new_process_id); 542 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, new_process_id);
517 DCHECK_NE(MSG_ROUTING_NONE, new_frame_id); 543 DCHECK_NE(MSG_ROUTING_NONE, new_frame_id);
518 544
519 render_process_id_ = new_process_id; 545 render_process_id_ = new_process_id;
520 route_id_ = new_frame_id; 546 route_id_ = new_frame_id;
521 render_thread_id_ = kDocumentMainThreadId; 547 render_thread_id_ = kDocumentMainThreadId;
522 provider_id_ = new_provider_id; 548 provider_id_ = new_provider_id;
523 provider_type_ = new_provider_type; 549 provider_type_ = new_provider_type;
524 dispatcher_host_ = new_dispatcher_host; 550 dispatcher_host_ = new_dispatcher_host;
525 551
526 for (const GURL& pattern : associated_patterns_) 552 for (const GURL& pattern : associated_patterns_)
527 IncreaseProcessReference(pattern); 553 IncreaseProcessReference(pattern);
528 554
529 for (auto& key_registration : matching_registrations_) 555 for (auto& key_registration : matching_registrations_)
530 IncreaseProcessReference(key_registration.second->pattern()); 556 IncreaseProcessReference(key_registration.second->pattern());
531 557
532 if (associated_registration_.get()) { 558 if (associated_registration_.get()) {
533 SendAssociateRegistrationMessage(); 559 SendAssociateRegistrationMessage();
534 if (dispatcher_host_ && associated_registration_->active_version()) { 560 if (dispatcher_host_ && associated_registration_->active_version()) {
535 Send(new ServiceWorkerMsg_SetControllerServiceWorker( 561 Send(new ServiceWorkerMsg_SetControllerServiceWorker(
536 render_thread_id_, provider_id(), 562 render_thread_id_, provider_id(),
537 GetOrCreateServiceWorkerHandle( 563 GetOrCreateServiceWorkerHandle(
538 associated_registration_->active_version()), 564 associated_registration_->active_version()),
539 false /* shouldNotifyControllerChange */)); 565 false /* shouldNotifyControllerChange */));
540 } 566 }
541 } 567 }
542 } 568 }
543 569
570 // PlzNavigate
571 void ServiceWorkerProviderHost::CompleteBrowserInitialized(int process_id,
572 int frame_id) {
573 CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch(
574 switches::kEnableBrowserSideNavigation));
575 DCHECK_EQ(kVirtualProcessIDForBrowserRequest, render_process_id_);
576 DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, provider_type_);
577 DCHECK_EQ(kDocumentMainThreadId, render_thread_id_);
578
579 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id);
580 DCHECK_NE(MSG_ROUTING_NONE, frame_id);
581
582 render_process_id_ = process_id;
583 route_id_ = frame_id;
michaeln 2015/09/19 00:14:40 Oh, we also need to set dispatcher_host_ in here.
Fabrice (no longer in Chrome) 2015/09/30 17:32:07 Added everything that was missing.
584 }
585
544 void ServiceWorkerProviderHost::SendUpdateFoundMessage( 586 void ServiceWorkerProviderHost::SendUpdateFoundMessage(
545 int registration_handle_id) { 587 int registration_handle_id) {
546 if (!dispatcher_host_) 588 if (!dispatcher_host_)
547 return; // Could be nullptr in some tests. 589 return; // Could be nullptr in some tests.
548 590
549 if (!IsReadyToSendMessages()) { 591 if (!IsReadyToSendMessages()) {
550 queued_events_.push_back( 592 queued_events_.push_back(
551 base::Bind(&ServiceWorkerProviderHost::SendUpdateFoundMessage, 593 base::Bind(&ServiceWorkerProviderHost::SendUpdateFoundMessage,
552 AsWeakPtr(), registration_handle_id)); 594 AsWeakPtr(), registration_handle_id));
553 return; 595 return;
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 return context_ != NULL; 720 return context_ != NULL;
679 } 721 }
680 722
681 void ServiceWorkerProviderHost::Send(IPC::Message* message) const { 723 void ServiceWorkerProviderHost::Send(IPC::Message* message) const {
682 DCHECK(dispatcher_host_); 724 DCHECK(dispatcher_host_);
683 DCHECK(IsReadyToSendMessages()); 725 DCHECK(IsReadyToSendMessages());
684 dispatcher_host_->Send(message); 726 dispatcher_host_->Send(message);
685 } 727 }
686 728
687 } // namespace content 729 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698