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