Chromium Code Reviews| Index: content/browser/shared_worker/shared_worker_host.cc |
| diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc |
| index eb58399bc9466779b549c3e79d713419d1d328c3..c270604624ce9fd6ff6132011d30283d123e1527 100644 |
| --- a/content/browser/shared_worker/shared_worker_host.cc |
| +++ b/content/browser/shared_worker/shared_worker_host.cc |
| @@ -4,15 +4,19 @@ |
| #include "content/browser/shared_worker/shared_worker_host.h" |
| +#include "content/browser/devtools/shared_worker_devtools_manager.h" |
| #include "content/browser/frame_host/render_frame_host_delegate.h" |
| #include "content/browser/frame_host/render_frame_host_impl.h" |
| #include "content/browser/message_port_service.h" |
| #include "content/browser/shared_worker/shared_worker_instance.h" |
| #include "content/browser/shared_worker/shared_worker_message_filter.h" |
| +#include "content/browser/shared_worker/shared_worker_service_impl.h" |
| +#include "content/common/devtools_messages.h" |
| #include "content/common/view_messages.h" |
| #include "content/common/worker_messages.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/content_browser_client.h" |
| +#include "content/public/browser/render_process_host.h" |
| #include "content/public/common/content_client.h" |
| namespace content { |
| @@ -26,10 +30,84 @@ void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { |
| host->delegate()->WorkerCrashed(host); |
| } |
| +void WorkerScriptLoadedOnUI(int worker_process_id, int worker_route_id) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + SharedWorkerDevToolsManager::GetInstance()->WorkerContextStarted( |
| + worker_process_id, worker_route_id); |
| +} |
| + |
| } // namespace |
| +class WorkerDevToolsMessageHandler |
| + : public IPC::Listener, |
| + public base::RefCountedThreadSafe< |
| + WorkerDevToolsMessageHandler, |
| + content::BrowserThread::DeleteOnUIThread> { |
| + public: |
| + WorkerDevToolsMessageHandler() |
| + : render_process_id_(0), route_id_(0), registered_(false) {} |
| + void Register(int render_process_id, |
| + int route_id, |
| + const GURL& url, |
| + const base::string16& name) { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + RenderProcessHost* host = RenderProcessHost::FromID(render_process_id); |
| + if (!host) |
| + return; |
| + host->AddRoute(route_id, this); |
| + render_process_id_ = render_process_id; |
| + route_id_ = route_id; |
| + SharedWorkerDevToolsManager::GetInstance()->WorkerCreated( |
| + render_process_id_, route_id_, url, name); |
| + registered_ = true; |
| + } |
| + virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(WorkerDevToolsMessageHandler, msg) |
|
yurys
2014/03/13 09:06:52
This messages are DevTools-specific and we should
horo
2014/03/14 08:53:20
Done.
|
| + IPC_MESSAGE_HANDLER(DevToolsClientMsg_DispatchOnInspectorFrontend, |
| + OnDispatchOnInspectorFrontend) |
| + IPC_MESSAGE_HANDLER(DevToolsHostMsg_SaveAgentRuntimeState, |
| + OnSaveAgentRumtimeState) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| + } |
| + void OnDispatchOnInspectorFrontend(const std::string& message) { |
| + SharedWorkerDevToolsManager::GetInstance()->ForwardToDevToolsClient( |
| + render_process_id_, route_id_, message); |
| + } |
| + void OnSaveAgentRumtimeState(const std::string& state) { |
| + SharedWorkerDevToolsManager::GetInstance()->SaveAgentRuntimeState( |
| + render_process_id_, route_id_, state); |
| + } |
| + |
| + private: |
| + friend struct content::BrowserThread::DeleteOnThread< |
| + content::BrowserThread::UI>; |
| + friend class base::DeleteHelper<WorkerDevToolsMessageHandler>; |
| + |
| + virtual ~WorkerDevToolsMessageHandler() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + SharedWorkerDevToolsManager::GetInstance()->WorkerDestroyed( |
| + render_process_id_, route_id_); |
| + if (!registered_) |
| + return; |
| + RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_); |
| + if (!host) |
| + return; |
| + host->RemoveRoute(route_id_); |
| + } |
| + |
| + int render_process_id_; |
| + int route_id_; |
| + bool registered_; |
| + DISALLOW_COPY_AND_ASSIGN(WorkerDevToolsMessageHandler); |
| +}; |
| + |
| SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance) |
| : instance_(instance), |
| + dev_tools_handler_(new WorkerDevToolsMessageHandler()), |
| container_render_filter_(NULL), |
| worker_route_id_(MSG_ROUTING_NONE) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| @@ -52,6 +130,8 @@ SharedWorkerHost::~SharedWorkerHost() { |
| parent_iter->render_frame_id())); |
| } |
| } |
| + SharedWorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( |
| + worker_process_id_, worker_route_id_); |
| } |
| bool SharedWorkerHost::Send(IPC::Message* message) { |
| @@ -66,8 +146,18 @@ void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) { |
| CHECK(instance_); |
| DCHECK(worker_route_id_ == MSG_ROUTING_NONE); |
| container_render_filter_ = filter; |
| + worker_process_id_ = filter->render_process_id(); |
| worker_route_id_ = filter->GetNextRoutingID(); |
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&WorkerDevToolsMessageHandler::Register, |
| + dev_tools_handler_, |
| + worker_process_id_, |
| + worker_route_id_, |
| + instance_->url(), |
| + instance_->name())); |
| + |
| WorkerProcessMsg_CreateWorker_Params params; |
| params.url = instance_->url(); |
| params.name = instance_->name(); |
| @@ -130,13 +220,15 @@ void SharedWorkerHost::WorkerContextClosed() { |
| } |
| void SharedWorkerHost::WorkerContextDestroyed() { |
| - if (!instance_) |
| - return; |
| instance_.reset(); |
| } |
| void SharedWorkerHost::WorkerScriptLoaded() { |
| - // TODO(horo): implement this. |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind( |
| + &WorkerScriptLoadedOnUI, worker_process_id_, worker_route_id_)); |
| } |
| void SharedWorkerHost::WorkerScriptLoadFailed() { |