Chromium Code Reviews| Index: content/browser/service_worker/embedded_worker_instance.cc |
| diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc |
| index 24d2a9529a9843eb6dbf7c36e44efeabd748dd4d..043f872a589508de154fedc5ecd47b4502e5f361 100644 |
| --- a/content/browser/service_worker/embedded_worker_instance.cc |
| +++ b/content/browser/service_worker/embedded_worker_instance.cc |
| @@ -4,8 +4,11 @@ |
| #include "content/browser/service_worker/embedded_worker_instance.h" |
| +#include "content/browser/devtools/embedded_worker_devtools_manager.h" |
| #include "content/browser/service_worker/embedded_worker_registry.h" |
| #include "content/common/service_worker/embedded_worker_messages.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/render_process_host.h" |
| #include "ipc/ipc_message.h" |
| #include "url/gurl.h" |
| @@ -19,9 +22,114 @@ struct SecondGreater { |
| return lhs.second > rhs.second; |
| } |
| }; |
| + |
| +void RegisterToDevToolsManagerOnUI( |
| + int process_id, |
| + const base::FilePath& storage_partition_path, |
| + const GURL& scope, |
| + const base::Callback<void(int worker_devtools_agent_route_id, |
| + bool pause_on_start)>& callback) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + int worker_devtools_agent_route_id = MSG_ROUTING_NONE; |
| + bool pause_on_start = false; |
| + if (RenderProcessHost* rph = RenderProcessHost::FromID(process_id)) { |
| + // |rph| may be NULL in unit tests. |
| + worker_devtools_agent_route_id = rph->GetNextRoutingID(); |
| + pause_on_start = |
| + EmbeddedWorkerDevToolsManager::GetInstance()->ServiceWorkerCreated( |
| + process_id, |
| + worker_devtools_agent_route_id, |
| + storage_partition_path, |
| + scope); |
| + } |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(callback, worker_devtools_agent_route_id, pause_on_start)); |
| +} |
| + |
| +void NotifyWorkerContextStartedOnUI(int worker_process_id, |
| + int worker_route_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + EmbeddedWorkerDevToolsManager::GetInstance()->WorkerContextStarted( |
| + worker_process_id, worker_route_id); |
| +} |
| + |
| +void NotifyWorkerDestroyedOnUI(int worker_process_id, int worker_route_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + EmbeddedWorkerDevToolsManager::GetInstance()->WorkerDestroyed( |
| + worker_process_id, worker_route_id); |
| +} |
| + |
| } // namespace |
| +EmbeddedWorkerInstance::DevToolsManagerBridge::DevToolsManagerBridge( |
| + int embedded_worker_id, |
| + const base::FilePath& storage_partition_path) |
| + : embedded_worker_id_(embedded_worker_id), |
| + storage_partition_path_(storage_partition_path), |
| + worker_process_id_(-1), |
| + worker_devtools_agent_route_id_(MSG_ROUTING_NONE) { |
| +} |
| + |
| +EmbeddedWorkerInstance::DevToolsManagerBridge::~DevToolsManagerBridge() { |
| +} |
| + |
| +void EmbeddedWorkerInstance::DevToolsManagerBridge::RegisterToDevToolsManager( |
| + int process_id, |
| + const base::Callback<void(int worker_devtools_agent_route_id, |
| + bool pause_on_start)>& callback) { |
| + worker_process_id_ = process_id; |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind( |
| + RegisterToDevToolsManagerOnUI, |
| + worker_process_id_, |
| + storage_partition_path_, |
| + scope_, |
| + base::Bind( |
| + &DevToolsManagerBridge::RegisteredCallback, this, callback))); |
| +} |
| + |
| +void EmbeddedWorkerInstance::DevToolsManagerBridge::RegisteredCallback( |
| + const base::Callback<void(int worker_devtools_agent_route_id, |
| + bool pause_on_start)>& callback, |
| + int worker_devtools_agent_route_id, |
| + bool pause_on_start) { |
| + worker_devtools_agent_route_id_ = worker_devtools_agent_route_id; |
| + callback.Run(worker_devtools_agent_route_id, pause_on_start); |
| +} |
| + |
| +void EmbeddedWorkerInstance::DevToolsManagerBridge::OnStarted() { |
| +} |
| + |
| +void EmbeddedWorkerInstance::DevToolsManagerBridge::OnStopped() { |
| + if (worker_devtools_agent_route_id_ != MSG_ROUTING_NONE) { |
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(NotifyWorkerDestroyedOnUI, |
| + worker_process_id_, |
| + worker_devtools_agent_route_id_)); |
| + } |
| +} |
| +void EmbeddedWorkerInstance::DevToolsManagerBridge::OnScriptLoaded() { |
| + if (worker_devtools_agent_route_id_ != MSG_ROUTING_NONE) { |
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(NotifyWorkerContextStartedOnUI, |
| + worker_process_id_, |
| + worker_devtools_agent_route_id_)); |
| + } |
| +} |
| + |
| +bool EmbeddedWorkerInstance::DevToolsManagerBridge::OnMessageReceived( |
| + const IPC::Message& message) { |
| + return false; |
| +} |
| + |
| EmbeddedWorkerInstance::~EmbeddedWorkerInstance() { |
| + RemoveListener(dev_tools_manager_bridge_.get()); |
|
kinuko
2014/05/08 11:17:31
nit: doesn't feel it's necessary
horo
2014/05/08 14:17:46
Done.
|
| registry_->RemoveWorker(process_id_, embedded_worker_id_); |
| } |
| @@ -31,6 +139,7 @@ void EmbeddedWorkerInstance::Start(int64 service_worker_version_id, |
| const std::vector<int>& possible_process_ids, |
| const StatusCallback& callback) { |
| DCHECK(status_ == STOPPED); |
| + dev_tools_manager_bridge_->set_scope(scope); |
|
kinuko
2014/05/08 11:17:31
Looks like the scope can be given to ctor of Embed
horo
2014/05/08 14:17:46
Done.
|
| status_ = STARTING; |
| std::vector<int> ordered_process_ids = SortProcesses(possible_process_ids); |
| registry_->StartWorker(ordered_process_ids, |
| @@ -75,32 +184,38 @@ void EmbeddedWorkerInstance::ReleaseProcessReference(int process_id) { |
| process_refs_.erase(found); |
| } |
| -EmbeddedWorkerInstance::EmbeddedWorkerInstance(EmbeddedWorkerRegistry* registry, |
| - int embedded_worker_id) |
| +EmbeddedWorkerInstance::EmbeddedWorkerInstance( |
| + EmbeddedWorkerRegistry* registry, |
| + int embedded_worker_id, |
| + const base::FilePath& storage_partition_path) |
| : registry_(registry), |
| embedded_worker_id_(embedded_worker_id), |
| status_(STOPPED), |
| process_id_(-1), |
| thread_id_(-1), |
| - worker_devtools_agent_route_id_(MSG_ROUTING_NONE) { |
| + worker_devtools_agent_route_id_(MSG_ROUTING_NONE), |
| + dev_tools_manager_bridge_( |
| + new DevToolsManagerBridge(embedded_worker_id, |
| + storage_partition_path)) { |
|
kinuko
2014/05/08 11:17:31
nit: you can get this via registry ptr here rather
horo
2014/05/08 14:17:46
Done.
Added EmbeddedWorkerRegistry::storage_partit
|
| + AddListener(dev_tools_manager_bridge_.get()); |
| } |
| -void EmbeddedWorkerInstance::RecordProcessId( |
| +void EmbeddedWorkerInstance::WorkerProcessAllocated( |
| int process_id, |
| - ServiceWorkerStatusCode status, |
| - int worker_devtools_agent_route_id) { |
| + const base::Callback<void(int worker_devtools_agent_route_id, |
| + bool pause_on_start)>& callback) { |
| DCHECK_EQ(process_id_, -1); |
| - DCHECK_EQ(worker_devtools_agent_route_id_, MSG_ROUTING_NONE); |
| - if (status == SERVICE_WORKER_OK) { |
| - process_id_ = process_id; |
| - worker_devtools_agent_route_id_ = worker_devtools_agent_route_id; |
| - } else { |
| - status_ = STOPPED; |
| - } |
| + process_id_ = process_id; |
| + dev_tools_manager_bridge_->RegisterToDevToolsManager(process_id, callback); |
| +} |
| + |
| +void EmbeddedWorkerInstance::WorkerProcessAllocationFailed() { |
| + DCHECK_EQ(process_id_, -1); |
| + status_ = STOPPED; |
| } |
| void EmbeddedWorkerInstance::OnScriptLoaded() { |
| - // TODO(horo): Implement this. |
| + FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded()); |
| } |
| void EmbeddedWorkerInstance::OnScriptLoadFailed() { |