Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/browser/service_worker/service_worker_process_manager.h" | 5 #include "content/browser/service_worker/service_worker_process_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <utility> | 10 #include <utility> |
| 11 | 11 |
| 12 #include "content/browser/renderer_host/render_process_host_impl.h" | 12 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 13 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 13 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 14 #include "content/common/service_worker/embedded_worker_settings.h" | |
| 14 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 16 #include "content/public/browser/content_browser_client.h" | |
| 15 #include "content/public/browser/site_instance.h" | 17 #include "content/public/browser/site_instance.h" |
| 16 #include "content/public/common/child_process_host.h" | 18 #include "content/public/common/child_process_host.h" |
| 19 #include "content/public/common/content_client.h" | |
| 17 #include "url/gurl.h" | 20 #include "url/gurl.h" |
| 18 | 21 |
| 19 namespace content { | 22 namespace content { |
| 20 | 23 |
| 21 namespace { | 24 namespace { |
| 22 | 25 |
| 23 // Functor to sort by the .second element of a struct. | 26 // Functor to sort by the .second element of a struct. |
| 24 struct SecondGreater { | 27 struct SecondGreater { |
| 25 template <typename Value> | 28 template <typename Value> |
| 26 bool operator()(const Value& lhs, const Value& rhs) { | 29 bool operator()(const Value& lhs, const Value& rhs) { |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 return !it->second.empty(); | 132 return !it->second.empty(); |
| 130 } | 133 } |
| 131 | 134 |
| 132 void ServiceWorkerProcessManager::AllocateWorkerProcess( | 135 void ServiceWorkerProcessManager::AllocateWorkerProcess( |
| 133 int embedded_worker_id, | 136 int embedded_worker_id, |
| 134 const GURL& pattern, | 137 const GURL& pattern, |
| 135 const GURL& script_url, | 138 const GURL& script_url, |
| 136 bool can_use_existing_process, | 139 bool can_use_existing_process, |
| 137 const base::Callback<void(ServiceWorkerStatusCode, | 140 const base::Callback<void(ServiceWorkerStatusCode, |
| 138 int process_id, | 141 int process_id, |
| 139 bool is_new_process)>& callback) { | 142 bool is_new_process, |
| 143 const EmbeddedWorkerSettings&)>& callback) { | |
| 140 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 144 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 141 BrowserThread::PostTask( | 145 BrowserThread::PostTask( |
| 142 BrowserThread::UI, FROM_HERE, | 146 BrowserThread::UI, FROM_HERE, |
| 143 base::Bind(&ServiceWorkerProcessManager::AllocateWorkerProcess, | 147 base::Bind(&ServiceWorkerProcessManager::AllocateWorkerProcess, |
| 144 weak_this_, embedded_worker_id, pattern, script_url, | 148 weak_this_, embedded_worker_id, pattern, script_url, |
| 145 can_use_existing_process, callback)); | 149 can_use_existing_process, callback)); |
| 146 return; | 150 return; |
| 147 } | 151 } |
| 148 | 152 |
| 153 EmbeddedWorkerSettings settings; | |
| 154 settings.data_saver_enabled = | |
| 155 GetContentClient()->browser()->IsDataSaverEnabled(browser_context_); | |
|
falken
2016/02/19 06:58:35
We should add a comment that this the EWSettings f
bengr
2016/03/07 23:35:29
Done.
| |
| 156 | |
| 149 if (process_id_for_test_ != ChildProcessHost::kInvalidUniqueID) { | 157 if (process_id_for_test_ != ChildProcessHost::kInvalidUniqueID) { |
| 150 // Let tests specify the returned process ID. Note: We may need to be able | 158 // Let tests specify the returned process ID. Note: We may need to be able |
| 151 // to specify the error code too. | 159 // to specify the error code too. |
| 152 int result = can_use_existing_process ? process_id_for_test_ | 160 int result = can_use_existing_process ? process_id_for_test_ |
| 153 : new_process_id_for_test_; | 161 : new_process_id_for_test_; |
| 154 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 162 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 155 base::Bind(callback, SERVICE_WORKER_OK, result, | 163 base::Bind(callback, SERVICE_WORKER_OK, result, |
| 156 false /* is_new_process */)); | 164 false /* is_new_process */, settings)); |
| 157 return; | 165 return; |
| 158 } | 166 } |
| 159 | 167 |
| 160 if (IsShutdown()) { | 168 if (IsShutdown()) { |
| 161 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 169 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 162 base::Bind(callback, SERVICE_WORKER_ERROR_ABORT, | 170 base::Bind(callback, SERVICE_WORKER_ERROR_ABORT, |
| 163 ChildProcessHost::kInvalidUniqueID, | 171 ChildProcessHost::kInvalidUniqueID, |
| 164 false /* is_new_process */)); | 172 false /* is_new_process */, settings)); |
| 165 return; | 173 return; |
| 166 } | 174 } |
| 167 | 175 |
| 168 // TODO(nhiroki): Make sure the instance info is not mixed up. | 176 // TODO(nhiroki): Make sure the instance info is not mixed up. |
| 169 // (http://crbug.com/568915) | 177 // (http://crbug.com/568915) |
| 170 CHECK(!ContainsKey(instance_info_, embedded_worker_id)) | 178 CHECK(!ContainsKey(instance_info_, embedded_worker_id)) |
| 171 << embedded_worker_id << " already has a process allocated"; | 179 << embedded_worker_id << " already has a process allocated"; |
| 172 | 180 |
| 173 if (can_use_existing_process) { | 181 if (can_use_existing_process) { |
| 174 int process_id = FindAvailableProcess(pattern); | 182 int process_id = FindAvailableProcess(pattern); |
| 175 if (process_id != ChildProcessHost::kInvalidUniqueID) { | 183 if (process_id != ChildProcessHost::kInvalidUniqueID) { |
| 176 RenderProcessHost::FromID(process_id)->IncrementWorkerRefCount(); | 184 RenderProcessHost::FromID(process_id)->IncrementWorkerRefCount(); |
| 177 instance_info_.insert( | 185 instance_info_.insert( |
| 178 std::make_pair(embedded_worker_id, ProcessInfo(process_id))); | 186 std::make_pair(embedded_worker_id, ProcessInfo(process_id))); |
| 179 BrowserThread::PostTask( | 187 BrowserThread::PostTask( |
| 180 BrowserThread::IO, FROM_HERE, | 188 BrowserThread::IO, FROM_HERE, |
| 181 base::Bind(callback, SERVICE_WORKER_OK, process_id, | 189 base::Bind(callback, SERVICE_WORKER_OK, process_id, |
| 182 false /* is_new_process */)); | 190 false /* is_new_process */, settings)); |
| 183 return; | 191 return; |
| 184 } | 192 } |
| 185 } | 193 } |
| 186 | 194 |
| 187 // No existing processes available; start a new one. | 195 // No existing processes available; start a new one. |
| 188 scoped_refptr<SiteInstance> site_instance = | 196 scoped_refptr<SiteInstance> site_instance = |
| 189 SiteInstance::CreateForURL(browser_context_, script_url); | 197 SiteInstance::CreateForURL(browser_context_, script_url); |
| 190 RenderProcessHost* rph = site_instance->GetProcess(); | 198 RenderProcessHost* rph = site_instance->GetProcess(); |
| 191 | 199 |
| 192 // This Init() call posts a task to the IO thread that adds the RPH's | 200 // This Init() call posts a task to the IO thread that adds the RPH's |
| 193 // ServiceWorkerDispatcherHost to the | 201 // ServiceWorkerDispatcherHost to the |
| 194 // EmbeddedWorkerRegistry::process_sender_map_. | 202 // EmbeddedWorkerRegistry::process_sender_map_. |
| 195 if (!rph->Init()) { | 203 if (!rph->Init()) { |
| 196 LOG(ERROR) << "Couldn't start a new process!"; | 204 LOG(ERROR) << "Couldn't start a new process!"; |
| 197 BrowserThread::PostTask( | 205 BrowserThread::PostTask( |
| 198 BrowserThread::IO, FROM_HERE, | 206 BrowserThread::IO, FROM_HERE, |
| 199 base::Bind(callback, SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND, | 207 base::Bind(callback, SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND, |
| 200 ChildProcessHost::kInvalidUniqueID, | 208 ChildProcessHost::kInvalidUniqueID, |
| 201 false /* is_new_process */)); | 209 false /* is_new_process */, settings)); |
| 202 return; | 210 return; |
| 203 } | 211 } |
| 204 | 212 |
| 205 instance_info_.insert( | 213 instance_info_.insert( |
| 206 std::make_pair(embedded_worker_id, ProcessInfo(site_instance))); | 214 std::make_pair(embedded_worker_id, ProcessInfo(site_instance))); |
| 207 | 215 |
| 208 rph->IncrementWorkerRefCount(); | 216 rph->IncrementWorkerRefCount(); |
| 209 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 217 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 210 base::Bind(callback, SERVICE_WORKER_OK, rph->GetID(), | 218 base::Bind(callback, SERVICE_WORKER_OK, rph->GetID(), |
| 211 true /* is_new_process */)); | 219 true /* is_new_process */, settings)); |
| 212 } | 220 } |
| 213 | 221 |
| 214 void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) { | 222 void ServiceWorkerProcessManager::ReleaseWorkerProcess(int embedded_worker_id) { |
| 215 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 223 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
| 216 BrowserThread::PostTask( | 224 BrowserThread::PostTask( |
| 217 BrowserThread::UI, | 225 BrowserThread::UI, |
| 218 FROM_HERE, | 226 FROM_HERE, |
| 219 base::Bind(&ServiceWorkerProcessManager::ReleaseWorkerProcess, | 227 base::Bind(&ServiceWorkerProcessManager::ReleaseWorkerProcess, |
| 220 weak_this_, | 228 weak_this_, |
| 221 embedded_worker_id)); | 229 embedded_worker_id)); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 namespace std { | 316 namespace std { |
| 309 // Destroying ServiceWorkerProcessManagers only on the UI thread allows the | 317 // Destroying ServiceWorkerProcessManagers only on the UI thread allows the |
| 310 // member WeakPtr to safely guard the object's lifetime when used on that | 318 // member WeakPtr to safely guard the object's lifetime when used on that |
| 311 // thread. | 319 // thread. |
| 312 void default_delete<content::ServiceWorkerProcessManager>::operator()( | 320 void default_delete<content::ServiceWorkerProcessManager>::operator()( |
| 313 content::ServiceWorkerProcessManager* ptr) const { | 321 content::ServiceWorkerProcessManager* ptr) const { |
| 314 content::BrowserThread::DeleteSoon( | 322 content::BrowserThread::DeleteSoon( |
| 315 content::BrowserThread::UI, FROM_HERE, ptr); | 323 content::BrowserThread::UI, FROM_HERE, ptr); |
| 316 } | 324 } |
| 317 } // namespace std | 325 } // namespace std |
| OLD | NEW |