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

Side by Side Diff: content/child/service_worker/service_worker_network_provider.cc

Issue 1399363004: PlzNavigate: Make ServiceWorker work with PlzNavigate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed Kinuko's comments Created 5 years, 1 month 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/child/service_worker/service_worker_network_provider.h" 5 #include "content/child/service_worker/service_worker_network_provider.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "base/command_line.h"
8 #include "content/child/child_thread_impl.h" 9 #include "content/child/child_thread_impl.h"
9 #include "content/child/service_worker/service_worker_provider_context.h" 10 #include "content/child/service_worker/service_worker_provider_context.h"
11 #include "content/common/navigation_params.h"
10 #include "content/common/service_worker/service_worker_messages.h" 12 #include "content/common/service_worker/service_worker_messages.h"
13 #include "content/common/service_worker/service_worker_utils.h"
14 #include "content/public/common/content_switches.h"
11 15
12 namespace content { 16 namespace content {
13 17
14 namespace { 18 namespace {
15 19
16 const char kUserDataKey[] = "SWProviderKey"; 20 const char kUserDataKey[] = "SWProviderKey";
17 21
18 // Must be unique in the child process. 22 // Must be unique in the child process.
19 int GetNextProviderId() { 23 int GetNextProviderId() {
20 static base::StaticAtomicSequenceNumber sequence; 24 static base::StaticAtomicSequenceNumber sequence;
(...skipping 16 matching lines...) Expand all
37 scoped_ptr<ServiceWorkerNetworkProvider> network_provider) { 41 scoped_ptr<ServiceWorkerNetworkProvider> network_provider) {
38 datasource_userdata->SetUserData(&kUserDataKey, network_provider.release()); 42 datasource_userdata->SetUserData(&kUserDataKey, network_provider.release());
39 } 43 }
40 44
41 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState( 45 ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState(
42 base::SupportsUserData* datasource_userdata) { 46 base::SupportsUserData* datasource_userdata) {
43 return static_cast<ServiceWorkerNetworkProvider*>( 47 return static_cast<ServiceWorkerNetworkProvider*>(
44 datasource_userdata->GetUserData(&kUserDataKey)); 48 datasource_userdata->GetUserData(&kUserDataKey));
45 } 49 }
46 50
51 // static
52 scoped_ptr<ServiceWorkerNetworkProvider>
53 ServiceWorkerNetworkProvider::CreateForNavigation(
54 int route_id,
55 const RequestNavigationParams& request_params,
56 blink::WebSandboxFlags sandbox_flags,
57 bool content_initiated) {
58 bool browser_side_navigation =
59 base::CommandLine::ForCurrentProcess()->HasSwitch(
60 switches::kEnableBrowserSideNavigation);
61 bool should_create_provider_for_window = false;
62 int service_worker_provider_id = kInvalidServiceWorkerProviderId;
63 scoped_ptr<ServiceWorkerNetworkProvider> network_provider;
64
65 // Determine if a ServiceWorkerNetworkProvider should be created and properly
66 // initialized for the navigation. A default ServiceWorkerNetworkProvider
67 // will always be created since it is expected in a certain number of places,
68 // however it will have an invalid id.
69 // PlzNavigate: |service_worker_provider_id| can be sent by the browser, if
70 // it already created the SeviceWorkerProviderHost.
71 if (browser_side_navigation && !content_initiated) {
72 should_create_provider_for_window =
73 request_params.should_create_service_worker;
74 service_worker_provider_id = request_params.service_worker_provider_id;
75 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
76 service_worker_provider_id) ||
77 service_worker_provider_id == kInvalidServiceWorkerProviderId);
78 } else {
79 should_create_provider_for_window =
80 (sandbox_flags & blink::WebSandboxFlags::Origin) !=
81 blink::WebSandboxFlags::Origin;
82 }
83
84 // Now create the ServiceWorkerNetworkProvider (with invalid id if needed).
85 if (should_create_provider_for_window) {
86 if (service_worker_provider_id == kInvalidServiceWorkerProviderId) {
87 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>(
88 new ServiceWorkerNetworkProvider(route_id,
89 SERVICE_WORKER_PROVIDER_FOR_WINDOW));
90 } else {
91 CHECK(browser_side_navigation);
92 DCHECK(ServiceWorkerUtils::IsBrowserAssignedProviderId(
93 service_worker_provider_id));
94 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>(
95 new ServiceWorkerNetworkProvider(route_id,
96 SERVICE_WORKER_PROVIDER_FOR_WINDOW,
97 service_worker_provider_id));
98 }
99 } else {
100 network_provider = scoped_ptr<ServiceWorkerNetworkProvider>(
101 new ServiceWorkerNetworkProvider());
102 }
103 return network_provider.Pass();
104 }
105
47 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider( 106 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider(
48 int route_id, 107 int route_id,
49 ServiceWorkerProviderType provider_type) 108 ServiceWorkerProviderType provider_type,
50 : provider_id_(GenerateProviderIdForType(provider_type)) { 109 int browser_provider_id)
110 : provider_id_(browser_provider_id) {
51 if (provider_id_ == kInvalidServiceWorkerProviderId) 111 if (provider_id_ == kInvalidServiceWorkerProviderId)
52 return; 112 return;
53 context_ = new ServiceWorkerProviderContext(provider_id_, provider_type); 113 context_ = new ServiceWorkerProviderContext(provider_id_, provider_type);
54 if (!ChildThreadImpl::current()) 114 if (!ChildThreadImpl::current())
55 return; // May be null in some tests. 115 return; // May be null in some tests.
56 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated( 116 ChildThreadImpl::current()->Send(new ServiceWorkerHostMsg_ProviderCreated(
57 provider_id_, route_id, provider_type)); 117 provider_id_, route_id, provider_type));
58 } 118 }
59 119
120 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider(
121 int route_id,
122 ServiceWorkerProviderType provider_type)
123 : ServiceWorkerNetworkProvider(route_id,
124 provider_type,
125 GenerateProviderIdForType(provider_type)) {}
126
127 ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider()
128 : provider_id_(kInvalidServiceWorkerProviderId) {}
129
60 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() { 130 ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() {
61 if (provider_id_ == kInvalidServiceWorkerProviderId) 131 if (provider_id_ == kInvalidServiceWorkerProviderId)
62 return; 132 return;
63 if (!ChildThreadImpl::current()) 133 if (!ChildThreadImpl::current())
64 return; // May be null in some tests. 134 return; // May be null in some tests.
65 ChildThreadImpl::current()->Send( 135 ChildThreadImpl::current()->Send(
66 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_)); 136 new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_));
67 } 137 }
68 138
69 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId( 139 void ServiceWorkerNetworkProvider::SetServiceWorkerVersionId(
70 int64 version_id) { 140 int64 version_id) {
71 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_); 141 DCHECK_NE(kInvalidServiceWorkerProviderId, provider_id_);
72 if (!ChildThreadImpl::current()) 142 if (!ChildThreadImpl::current())
73 return; // May be null in some tests. 143 return; // May be null in some tests.
74 ChildThreadImpl::current()->Send( 144 ChildThreadImpl::current()->Send(
75 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id)); 145 new ServiceWorkerHostMsg_SetVersionId(provider_id_, version_id));
76 } 146 }
77 147
78 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const { 148 bool ServiceWorkerNetworkProvider::IsControlledByServiceWorker() const {
79 return context() && context()->controller(); 149 return context() && context()->controller();
80 } 150 }
81 151
82 } // namespace content 152 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698