Index: content/browser/service_worker/service_worker_provider_host.cc |
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc |
index a27a2c1bbd5b06aba31b540bdfe14306174fcc3f..d145d4bea7279e465ecb260b7dad69f894129aa5 100644 |
--- a/content/browser/service_worker/service_worker_provider_host.cc |
+++ b/content/browser/service_worker/service_worker_provider_host.cc |
@@ -4,6 +4,7 @@ |
#include "content/browser/service_worker/service_worker_provider_host.h" |
+#include "base/command_line.h" |
#include "base/guid.h" |
#include "base/stl_util.h" |
#include "base/time/time.h" |
@@ -27,6 +28,7 @@ |
#include "content/public/browser/render_widget_host_view.h" |
#include "content/public/browser/web_contents.h" |
#include "content/public/common/child_process_host.h" |
+#include "content/public/common/content_switches.h" |
namespace content { |
@@ -57,6 +59,11 @@ ServiceWorkerClientInfo FocusOnUIThread(int render_process_id, |
render_frame_id); |
} |
+// PlzNavigate |
+// Next ServiceWorkerProviderHost ID for navigations, starts at -2 and keeps |
+// going down. |
+int g_next_navigation_provider_id = -2; |
+ |
} // anonymous namespace |
ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( |
@@ -68,6 +75,19 @@ ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( |
ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() { |
} |
+// static |
+scoped_ptr<ServiceWorkerProviderHost> |
+ServiceWorkerProviderHost::PreCreateNavigationHost( |
+ base::WeakPtr<ServiceWorkerContextCore> context) { |
+ CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
danakj
2015/10/27 18:20:26
Hi, I randomly came across this. Please use DCHECK
|
+ switches::kEnableBrowserSideNavigation)); |
+ // Generate a new browser-assigned id for the host. |
+ int provider_id = g_next_navigation_provider_id--; |
+ return scoped_ptr<ServiceWorkerProviderHost>(new ServiceWorkerProviderHost( |
+ ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE, provider_id, |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW, context, nullptr)); |
+} |
+ |
ServiceWorkerProviderHost::ServiceWorkerProviderHost( |
int render_process_id, |
int route_id, |
@@ -84,9 +104,14 @@ ServiceWorkerProviderHost::ServiceWorkerProviderHost( |
context_(context), |
dispatcher_host_(dispatcher_host), |
allow_association_(true) { |
- DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); |
DCHECK_NE(SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME, provider_type_); |
+ |
+ // PlzNavigate |
+ CHECK_IMPLIES(render_process_id == ChildProcessHost::kInvalidUniqueID, |
+ base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableBrowserSideNavigation)); |
+ |
if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { |
// Actual thread id is set when the service worker context gets started. |
render_thread_id_ = kInvalidEmbeddedWorkerThreadId; |
@@ -516,29 +541,28 @@ void ServiceWorkerProviderHost::CompleteCrossSiteTransfer( |
DCHECK_NE(ChildProcessHost::kInvalidUniqueID, new_process_id); |
DCHECK_NE(MSG_ROUTING_NONE, new_frame_id); |
- render_process_id_ = new_process_id; |
- route_id_ = new_frame_id; |
render_thread_id_ = kDocumentMainThreadId; |
provider_id_ = new_provider_id; |
provider_type_ = new_provider_type; |
- dispatcher_host_ = new_dispatcher_host; |
- for (const GURL& pattern : associated_patterns_) |
- IncreaseProcessReference(pattern); |
+ FinalizeInitialization(new_process_id, new_frame_id, new_dispatcher_host); |
+} |
- for (auto& key_registration : matching_registrations_) |
- IncreaseProcessReference(key_registration.second->pattern()); |
+// PlzNavigate |
+void ServiceWorkerProviderHost::CompleteNavigationInitialized( |
+ int process_id, |
+ int frame_routing_id, |
+ ServiceWorkerDispatcherHost* dispatcher_host) { |
+ CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableBrowserSideNavigation)); |
+ DCHECK_EQ(ChildProcessHost::kInvalidUniqueID, render_process_id_); |
+ DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, provider_type_); |
+ DCHECK_EQ(kDocumentMainThreadId, render_thread_id_); |
- if (associated_registration_.get()) { |
- SendAssociateRegistrationMessage(); |
- if (dispatcher_host_ && associated_registration_->active_version()) { |
- Send(new ServiceWorkerMsg_SetControllerServiceWorker( |
- render_thread_id_, provider_id(), |
- GetOrCreateServiceWorkerHandle( |
- associated_registration_->active_version()), |
- false /* shouldNotifyControllerChange */)); |
- } |
- } |
+ DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id); |
+ DCHECK_NE(MSG_ROUTING_NONE, frame_routing_id); |
+ |
+ FinalizeInitialization(process_id, frame_routing_id, dispatcher_host); |
} |
void ServiceWorkerProviderHost::SendUpdateFoundMessage( |
@@ -684,4 +708,30 @@ void ServiceWorkerProviderHost::Send(IPC::Message* message) const { |
dispatcher_host_->Send(message); |
} |
+void ServiceWorkerProviderHost::FinalizeInitialization( |
+ int process_id, |
+ int frame_routing_id, |
+ ServiceWorkerDispatcherHost* dispatcher_host) { |
+ render_process_id_ = process_id; |
+ route_id_ = frame_routing_id; |
+ dispatcher_host_ = dispatcher_host; |
+ |
+ for (const GURL& pattern : associated_patterns_) |
+ IncreaseProcessReference(pattern); |
+ |
+ for (auto& key_registration : matching_registrations_) |
+ IncreaseProcessReference(key_registration.second->pattern()); |
+ |
+ if (associated_registration_.get()) { |
+ SendAssociateRegistrationMessage(); |
+ if (dispatcher_host_ && associated_registration_->active_version()) { |
+ Send(new ServiceWorkerMsg_SetControllerServiceWorker( |
+ render_thread_id_, provider_id(), |
+ GetOrCreateServiceWorkerHandle( |
+ associated_registration_->active_version()), |
+ false /* shouldNotifyControllerChange */)); |
+ } |
+ } |
+} |
+ |
} // namespace content |