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() { |