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

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

Issue 2653493009: Add two interfaces for ServiceWorkerProviderContext/ProviderHost (Closed)
Patch Set: Rebase Created 3 years, 9 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 <utility> 7 #include <utility>
8 8
9 #include "base/guid.h" 9 #include "base/guid.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 ResourceType resource_type) 51 ResourceType resource_type)
52 : ServiceWorkerRequestHandler(context, 52 : ServiceWorkerRequestHandler(context,
53 provider_host, 53 provider_host,
54 blob_storage_context, 54 blob_storage_context,
55 resource_type) {} 55 resource_type) {}
56 ~ServiceWorkerURLTrackingRequestHandler() override {} 56 ~ServiceWorkerURLTrackingRequestHandler() override {}
57 57
58 // Called via custom URLRequestJobFactory. 58 // Called via custom URLRequestJobFactory.
59 net::URLRequestJob* MaybeCreateJob( 59 net::URLRequestJob* MaybeCreateJob(
60 net::URLRequest* request, 60 net::URLRequest* request,
61 net::NetworkDelegate* network_delegate, 61 net::NetworkDelegate* /* network_delegate */,
62 ResourceContext* resource_context) override { 62 ResourceContext* /* resource_context */) override {
falken 2017/03/28 06:29:43 You can just omit the names when they don't add ne
shimazu 2017/05/08 08:34:29 Done.
63 const GURL stripped_url = net::SimplifyUrlForRequest(request->url()); 63 const GURL stripped_url = net::SimplifyUrlForRequest(request->url());
64 provider_host_->SetDocumentUrl(stripped_url); 64 provider_host_->SetDocumentUrl(stripped_url);
65 provider_host_->SetTopmostFrameUrl(request->first_party_for_cookies()); 65 provider_host_->SetTopmostFrameUrl(request->first_party_for_cookies());
66 return nullptr; 66 return nullptr;
67 } 67 }
68 68
69 private: 69 private:
70 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerURLTrackingRequestHandler); 70 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerURLTrackingRequestHandler);
71 }; 71 };
72 72
73 void RemoveProviderHost(base::WeakPtr<ServiceWorkerContextCore> context,
74 int process_id,
75 int provider_id) {
76 TRACE_EVENT0("ServiceWorker", "ServiceWorkerProviderHost::ProviderDestroyed");
falken 2017/03/28 06:29:42 Trace event is using the old name.
shimazu 2017/05/08 08:34:28 Done.
77 if (!context)
78 return;
79 if (!context->GetProviderHost(process_id, provider_id)) {
80 // PlzNavigate: in some cancellation of navigation cases, it is possible
81 // for the pre-created host to have been destroyed before being claimed by
82 // the renderer. The provider is then destroyed in the renderer, and no
83 // matching host will be found.
84 CHECK(IsBrowserSideNavigationEnabled() &&
85 ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id));
86 return;
87 }
88 context->RemoveProviderHost(process_id, provider_id);
89 }
90
73 } // anonymous namespace 91 } // anonymous namespace
74 92
75 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback( 93 ServiceWorkerProviderHost::OneShotGetReadyCallback::OneShotGetReadyCallback(
76 const GetRegistrationForReadyCallback& callback) 94 const GetRegistrationForReadyCallback& callback)
77 : callback(callback), 95 : callback(callback),
78 called(false) { 96 called(false) {
79 } 97 }
80 98
81 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() { 99 ServiceWorkerProviderHost::OneShotGetReadyCallback::~OneShotGetReadyCallback() {
82 } 100 }
83 101
84 // static 102 // static
85 std::unique_ptr<ServiceWorkerProviderHost> 103 std::unique_ptr<ServiceWorkerProviderHost>
86 ServiceWorkerProviderHost::PreCreateNavigationHost( 104 ServiceWorkerProviderHost::PreCreateNavigationHost(
87 base::WeakPtr<ServiceWorkerContextCore> context, 105 base::WeakPtr<ServiceWorkerContextCore> context,
88 bool are_ancestors_secure, 106 bool are_ancestors_secure,
89 const WebContentsGetter& web_contents_getter) { 107 const WebContentsGetter& web_contents_getter) {
90 CHECK(IsBrowserSideNavigationEnabled()); 108 CHECK(IsBrowserSideNavigationEnabled());
91 // Generate a new browser-assigned id for the host. 109 // Generate a new browser-assigned id for the host.
92 int provider_id = g_next_navigation_provider_id--; 110 int provider_id = g_next_navigation_provider_id--;
93 auto host = base::WrapUnique(new ServiceWorkerProviderHost( 111 auto host = base::WrapUnique(new ServiceWorkerProviderHost(
94 ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE, provider_id, 112 ChildProcessHost::kInvalidUniqueID, MSG_ROUTING_NONE, provider_id,
95 SERVICE_WORKER_PROVIDER_FOR_WINDOW, are_ancestors_secure, context, 113 SERVICE_WORKER_PROVIDER_FOR_WINDOW, are_ancestors_secure,
96 nullptr)); 114 mojom::ServiceWorkerProviderAssociatedPtrInfo(),
115 mojom::ServiceWorkerProviderHostAssociatedRequest(), context, nullptr));
97 host->web_contents_getter_ = web_contents_getter; 116 host->web_contents_getter_ = web_contents_getter;
98 return host; 117 return host;
99 } 118 }
100 119
101 // static 120 // static
102 std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create( 121 std::unique_ptr<ServiceWorkerProviderHost> ServiceWorkerProviderHost::Create(
103 int process_id, 122 int process_id,
104 ServiceWorkerProviderHostInfo info, 123 ServiceWorkerProviderHostInfo info,
105 base::WeakPtr<ServiceWorkerContextCore> context, 124 base::WeakPtr<ServiceWorkerContextCore> context,
106 ServiceWorkerDispatcherHost* dispatcher_host) { 125 ServiceWorkerDispatcherHost* dispatcher_host) {
107 return base::WrapUnique(new ServiceWorkerProviderHost( 126 return base::WrapUnique(new ServiceWorkerProviderHost(
108 process_id, info.route_id, info.provider_id, info.type, 127 process_id, info.route_id, info.provider_id, info.type,
109 info.is_parent_frame_secure, context, dispatcher_host)); 128 info.is_parent_frame_secure, std::move(info.client_ptr_info),
129 std::move(info.host_request), context, dispatcher_host));
110 } 130 }
111 131
112 ServiceWorkerProviderHost::ServiceWorkerProviderHost( 132 ServiceWorkerProviderHost::ServiceWorkerProviderHost(
113 int render_process_id, 133 int render_process_id,
114 int route_id, 134 int route_id,
115 int provider_id, 135 int provider_id,
116 ServiceWorkerProviderType provider_type, 136 ServiceWorkerProviderType provider_type,
117 bool is_parent_frame_secure, 137 bool is_parent_frame_secure,
138 mojom::ServiceWorkerProviderAssociatedPtrInfo client_info,
139 mojom::ServiceWorkerProviderHostAssociatedRequest request,
118 base::WeakPtr<ServiceWorkerContextCore> context, 140 base::WeakPtr<ServiceWorkerContextCore> context,
119 ServiceWorkerDispatcherHost* dispatcher_host) 141 ServiceWorkerDispatcherHost* dispatcher_host)
120 : client_uuid_(base::GenerateGUID()), 142 : client_uuid_(base::GenerateGUID()),
121 render_process_id_(render_process_id), 143 render_process_id_(render_process_id),
122 route_id_(route_id), 144 route_id_(route_id),
123 render_thread_id_(kDocumentMainThreadId), 145 render_thread_id_(kDocumentMainThreadId),
124 provider_id_(provider_id), 146 provider_id_(provider_id),
125 provider_type_(provider_type), 147 provider_type_(provider_type),
126 is_parent_frame_secure_(is_parent_frame_secure), 148 is_parent_frame_secure_(is_parent_frame_secure),
127 context_(context), 149 context_(context),
128 dispatcher_host_(dispatcher_host), 150 dispatcher_host_(dispatcher_host),
129 allow_association_(true) { 151 allow_association_(true),
152 binding_(this, std::move(request)) {
130 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); 153 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_);
131 154
132 // PlzNavigate 155 // PlzNavigate
133 CHECK(render_process_id != ChildProcessHost::kInvalidUniqueID || 156 CHECK(render_process_id != ChildProcessHost::kInvalidUniqueID ||
134 IsBrowserSideNavigationEnabled()); 157 IsBrowserSideNavigationEnabled());
135 158
136 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { 159 if (provider_type_ == SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) {
137 // Actual thread id is set when the service worker context gets started. 160 // Actual thread id is set when the service worker context gets started.
138 render_thread_id_ = kInvalidEmbeddedWorkerThreadId; 161 render_thread_id_ = kInvalidEmbeddedWorkerThreadId;
139 } 162 }
140 context_->RegisterProviderHostByClientID(client_uuid_, this); 163 context_->RegisterProviderHostByClientID(client_uuid_, this);
164
165 // Mojo pile is possible to be null when testing.
falken 2017/03/28 06:29:43 Can we instead fix the tests?
shimazu 2017/05/08 08:34:28 Yes, I agree with avoiding testing code in product
166 if (client_info.is_valid() && binding_.is_bound()) {
167 client_.Bind(std::move(client_info));
168 binding_.set_connection_error_handler(base::Bind(
169 &RemoveProviderHost, context_, render_process_id, provider_id));
170 }
141 } 171 }
142 172
143 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() { 173 ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
144 if (context_) 174 if (context_)
145 context_->UnregisterProviderHostByClientID(client_uuid_); 175 context_->UnregisterProviderHostByClientID(client_uuid_);
146 176
147 // Clear docurl so the deferred activation of a waiting worker 177 // Clear docurl so the deferred activation of a waiting worker
148 // won't associate the new version with a provider being destroyed. 178 // won't associate the new version with a provider being destroyed.
149 document_url_ = GURL(); 179 document_url_ = GURL();
150 if (controlling_version_.get()) 180 if (controlling_version_.get())
(...skipping 26 matching lines...) Expand all
177 207
178 std::set<std::string> schemes; 208 std::set<std::string> schemes;
179 GetContentClient()->browser()->GetSchemesBypassingSecureContextCheckWhitelist( 209 GetContentClient()->browser()->GetSchemesBypassingSecureContextCheckWhitelist(
180 &schemes); 210 &schemes);
181 return schemes.find(document_url().scheme()) != schemes.end(); 211 return schemes.find(document_url().scheme()) != schemes.end();
182 } 212 }
183 213
184 void ServiceWorkerProviderHost::OnVersionAttributesChanged( 214 void ServiceWorkerProviderHost::OnVersionAttributesChanged(
185 ServiceWorkerRegistration* registration, 215 ServiceWorkerRegistration* registration,
186 ChangedVersionAttributesMask changed_mask, 216 ChangedVersionAttributesMask changed_mask,
187 const ServiceWorkerRegistrationInfo& info) { 217 const ServiceWorkerRegistrationInfo& /* info */) {
188 if (!get_ready_callback_ || get_ready_callback_->called) 218 if (!get_ready_callback_ || get_ready_callback_->called)
189 return; 219 return;
190 if (changed_mask.active_changed() && registration->active_version()) { 220 if (changed_mask.active_changed() && registration->active_version()) {
191 // Wait until the state change so we don't send the get for ready 221 // Wait until the state change so we don't send the get for ready
192 // registration complete message before set version attributes message. 222 // registration complete message before set version attributes message.
193 registration->active_version()->RegisterStatusChangeCallback(base::Bind( 223 registration->active_version()->RegisterStatusChangeCallback(base::Bind(
194 &ServiceWorkerProviderHost::ReturnRegistrationForReadyIfNeeded, 224 &ServiceWorkerProviderHost::ReturnRegistrationForReadyIfNeeded,
195 AsWeakPtr())); 225 AsWeakPtr()));
196 } 226 }
197 } 227 }
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 std::unique_ptr<ServiceWorkerProviderHost> 532 std::unique_ptr<ServiceWorkerProviderHost>
503 ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() { 533 ServiceWorkerProviderHost::PrepareForCrossSiteTransfer() {
504 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_); 534 DCHECK_NE(ChildProcessHost::kInvalidUniqueID, render_process_id_);
505 DCHECK_NE(MSG_ROUTING_NONE, route_id_); 535 DCHECK_NE(MSG_ROUTING_NONE, route_id_);
506 DCHECK_EQ(kDocumentMainThreadId, render_thread_id_); 536 DCHECK_EQ(kDocumentMainThreadId, render_thread_id_);
507 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_); 537 DCHECK_NE(SERVICE_WORKER_PROVIDER_UNKNOWN, provider_type_);
508 538
509 std::unique_ptr<ServiceWorkerProviderHost> new_provider_host = 539 std::unique_ptr<ServiceWorkerProviderHost> new_provider_host =
510 base::WrapUnique(new ServiceWorkerProviderHost( 540 base::WrapUnique(new ServiceWorkerProviderHost(
511 process_id(), frame_id(), provider_id(), provider_type(), 541 process_id(), frame_id(), provider_id(), provider_type(),
512 is_parent_frame_secure(), context_, dispatcher_host())); 542 is_parent_frame_secure(),
543 mojom::ServiceWorkerProviderAssociatedPtrInfo(),
544 mojom::ServiceWorkerProviderHostAssociatedRequest(), context_,
545 dispatcher_host()));
513 546
514 for (const GURL& pattern : associated_patterns_) 547 for (const GURL& pattern : associated_patterns_)
515 DecreaseProcessReference(pattern); 548 DecreaseProcessReference(pattern);
516 549
517 for (auto& key_registration : matching_registrations_) 550 for (auto& key_registration : matching_registrations_)
518 DecreaseProcessReference(key_registration.second->pattern()); 551 DecreaseProcessReference(key_registration.second->pattern());
519 552
520 if (associated_registration_.get()) { 553 if (associated_registration_.get()) {
521 if (dispatcher_host_) { 554 if (dispatcher_host_) {
522 Send(new ServiceWorkerMsg_DisassociateRegistration( 555 Send(new ServiceWorkerMsg_DisassociateRegistration(
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 render_thread_id_, provider_id(), 784 render_thread_id_, provider_id(),
752 GetOrCreateServiceWorkerHandle( 785 GetOrCreateServiceWorkerHandle(
753 associated_registration_->active_version()), 786 associated_registration_->active_version()),
754 false /* shouldNotifyControllerChange */, 787 false /* shouldNotifyControllerChange */,
755 associated_registration_->active_version()->used_features())); 788 associated_registration_->active_version()->used_features()));
756 } 789 }
757 } 790 }
758 } 791 }
759 792
760 } // namespace content 793 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698