diff options
author | horo@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-30 10:59:14 +0000 |
---|---|---|
committer | horo@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-30 10:59:14 +0000 |
commit | 5f97a864f2a028f77a2c758075fc74242c879967 (patch) | |
tree | 407e4eb6aff2d8f83693d0078984dd15b6ac5e3c | |
parent | 3fe57da4f047d7b07589434c13aa1aa970039590 (diff) | |
download | chromium_src-5f97a864f2a028f77a2c758075fc74242c879967.zip chromium_src-5f97a864f2a028f77a2c758075fc74242c879967.tar.gz chromium_src-5f97a864f2a028f77a2c758075fc74242c879967.tar.bz2 |
Introduce worker_devtools_agent_route_id for EmbeddedWorker.
worker_devtools_agent_route_id is created with RenderProcessHostImpl::GetNextRoutingIDForProcess().
The worker_devtools_agent_route_id is sent to the renderer wrapped in EmbeddedWorkerMsg_StartWorker message and used to call DevToolsClientMsg_DispatchOnInspectorFrontend and DevToolsHostMsg_SaveAgentRuntimeState in EmbeddedWorkerContextClient.
These messages will be handled by SharedWorkerDevToolsManager::WorkerDevToolsAgentHost in the browser process.
BUG=358657
Review URL: https://codereview.chromium.org/252633003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@267173 0039d316-1c4b-4281-b951-d872f2087c98
11 files changed, 96 insertions, 55 deletions
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc index 8bad509..b56df25 100644 --- a/content/browser/service_worker/embedded_worker_instance.cc +++ b/content/browser/service_worker/embedded_worker_instance.cc @@ -75,21 +75,25 @@ 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) : registry_(registry), embedded_worker_id_(embedded_worker_id), status_(STOPPED), process_id_(-1), - thread_id_(-1) { + thread_id_(-1), + worker_devtools_agent_route_id_(MSG_ROUTING_NONE) { } -void EmbeddedWorkerInstance::RecordProcessId(int process_id, - ServiceWorkerStatusCode status) { +void EmbeddedWorkerInstance::RecordProcessId( + int process_id, + ServiceWorkerStatusCode status, + int worker_devtools_agent_route_id) { 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; } @@ -109,6 +113,7 @@ void EmbeddedWorkerInstance::OnStopped() { status_ = STOPPED; process_id_ = -1; thread_id_ = -1; + worker_devtools_agent_route_id_ = MSG_ROUTING_NONE; FOR_EACH_OBSERVER(Listener, listener_list_, OnStopped()); } diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h index c4ed7fc..a56a594 100644 --- a/content/browser/service_worker/embedded_worker_instance.h +++ b/content/browser/service_worker/embedded_worker_instance.h @@ -94,6 +94,9 @@ class CONTENT_EXPORT EmbeddedWorkerInstance { Status status() const { return status_; } int process_id() const { return process_id_; } int thread_id() const { return thread_id_; } + int worker_devtools_agent_route_id() const { + return worker_devtools_agent_route_id_; + } void AddListener(Listener* listener); void RemoveListener(Listener* listener); @@ -113,7 +116,9 @@ class CONTENT_EXPORT EmbeddedWorkerInstance { // Called back from EmbeddedWorkerRegistry after Start() passes control to the // UI thread to acquire a reference to the process. - void RecordProcessId(int process_id, ServiceWorkerStatusCode status); + void RecordProcessId(int process_id, + ServiceWorkerStatusCode status, + int worker_devtools_agent_route_id); // Called back from Registry when the worker instance has ack'ed that // its WorkerGlobalScope is actually started on |thread_id| in the @@ -157,6 +162,7 @@ class CONTENT_EXPORT EmbeddedWorkerInstance { // Current running information. -1 indicates the worker is not running. int process_id_; int thread_id_; + int worker_devtools_agent_route_id_; ProcessRefMap process_refs_; ListenerList listener_list_; diff --git a/content/browser/service_worker/embedded_worker_registry.cc b/content/browser/service_worker/embedded_worker_registry.cc index d10f553..82b9bb0 100644 --- a/content/browser/service_worker/embedded_worker_registry.cc +++ b/content/browser/service_worker/embedded_worker_registry.cc @@ -6,6 +6,7 @@ #include "base/bind_helpers.h" #include "base/stl_util.h" +#include "content/browser/renderer_host/render_widget_helper.h" #include "content/browser/service_worker/embedded_worker_instance.h" #include "content/browser/service_worker/service_worker_context_core.h" #include "content/browser/service_worker/service_worker_context_wrapper.h" @@ -38,17 +39,20 @@ void EmbeddedWorkerRegistry::StartWorker(const std::vector<int>& process_ids, callback.Run(SERVICE_WORKER_ERROR_ABORT); return; } + scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( + new EmbeddedWorkerMsg_StartWorker_Params()); + params->embedded_worker_id = embedded_worker_id; + params->service_worker_version_id = service_worker_version_id; + params->scope = scope; + params->script_url = script_url; + params->worker_devtools_agent_route_id = MSG_ROUTING_NONE; context_->process_manager()->AllocateWorkerProcess( process_ids, script_url, base::Bind(&EmbeddedWorkerRegistry::StartWorkerWithProcessId, this, embedded_worker_id, - base::Passed(make_scoped_ptr(new EmbeddedWorkerMsg_StartWorker( - embedded_worker_id, - service_worker_version_id, - scope, - script_url))), + base::Passed(¶ms), callback)); } @@ -174,7 +178,7 @@ EmbeddedWorkerRegistry::~EmbeddedWorkerRegistry() { void EmbeddedWorkerRegistry::StartWorkerWithProcessId( int embedded_worker_id, - scoped_ptr<EmbeddedWorkerMsg_StartWorker> message, + scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, const StatusCallback& callback, ServiceWorkerStatusCode status, int process_id) { @@ -188,7 +192,16 @@ void EmbeddedWorkerRegistry::StartWorkerWithProcessId( callback.Run(SERVICE_WORKER_ERROR_ABORT); return; } - worker->second->RecordProcessId(process_id, status); + if (status == SERVICE_WORKER_OK) { + // Gets the new routing id for the renderer process. + scoped_refptr<RenderWidgetHelper> helper( + RenderWidgetHelper::FromProcessHostID(process_id)); + // |helper| may be NULL in unittest. + params->worker_devtools_agent_route_id = + helper ? helper->GetNextRoutingID() : MSG_ROUTING_NONE; + } + worker->second->RecordProcessId( + process_id, status, params->worker_devtools_agent_route_id); if (status != SERVICE_WORKER_OK) { callback.Run(status); @@ -198,7 +211,7 @@ void EmbeddedWorkerRegistry::StartWorkerWithProcessId( // is created, and keep an entry in process_sender_map_ for its whole // lifetime. DCHECK(ContainsKey(process_sender_map_, process_id)); - callback.Run(Send(process_id, message.release())); + callback.Run(Send(process_id, new EmbeddedWorkerMsg_StartWorker(*params))); } ServiceWorkerStatusCode EmbeddedWorkerRegistry::Send( diff --git a/content/browser/service_worker/embedded_worker_registry.h b/content/browser/service_worker/embedded_worker_registry.h index 5c12111..a79b258 100644 --- a/content/browser/service_worker/embedded_worker_registry.h +++ b/content/browser/service_worker/embedded_worker_registry.h @@ -17,7 +17,7 @@ #include "content/common/content_export.h" #include "content/common/service_worker/service_worker_status_code.h" -class EmbeddedWorkerMsg_StartWorker; +struct EmbeddedWorkerMsg_StartWorker_Params; class GURL; namespace IPC { @@ -96,7 +96,7 @@ class CONTENT_EXPORT EmbeddedWorkerRegistry void StartWorkerWithProcessId( int embedded_worker_id, - scoped_ptr<EmbeddedWorkerMsg_StartWorker> message, + scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, const StatusCallback& callback, ServiceWorkerStatusCode status, int process_id); diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc index 7501f5a..698e260d 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.cc +++ b/content/browser/service_worker/embedded_worker_test_helper.cc @@ -162,21 +162,19 @@ void EmbeddedWorkerTestHelper::SimulateSend( } void EmbeddedWorkerTestHelper::OnStartWorkerStub( - int embedded_worker_id, - int64 service_worker_version_id, - const GURL& scope, - const GURL& script_url) { - EmbeddedWorkerInstance* worker = registry()->GetWorker(embedded_worker_id); + const EmbeddedWorkerMsg_StartWorker_Params& params) { + EmbeddedWorkerInstance* worker = + registry()->GetWorker(params.embedded_worker_id); ASSERT_TRUE(worker != NULL); EXPECT_EQ(EmbeddedWorkerInstance::STARTING, worker->status()); base::MessageLoopProxy::current()->PostTask( FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnStartWorker, weak_factory_.GetWeakPtr(), - embedded_worker_id, - service_worker_version_id, - scope, - script_url)); + params.embedded_worker_id, + params.service_worker_version_id, + params.scope, + params.script_url)); } void EmbeddedWorkerTestHelper::OnStopWorkerStub(int embedded_worker_id) { diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h index 27a0416..7cd817d 100644 --- a/content/browser/service_worker/embedded_worker_test_helper.h +++ b/content/browser/service_worker/embedded_worker_test_helper.h @@ -14,6 +14,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +struct EmbeddedWorkerMsg_StartWorker_Params; class GURL; namespace content { @@ -104,10 +105,7 @@ class EmbeddedWorkerTestHelper : public IPC::Sender, EmbeddedWorkerRegistry* registry(); private: - void OnStartWorkerStub(int embedded_worker_id, - int64 service_worker_version_id, - const GURL& scope, - const GURL& script_url); + void OnStartWorkerStub(const EmbeddedWorkerMsg_StartWorker_Params& params); void OnStopWorkerStub(int embedded_worker_id); void OnMessageToWorkerStub(int thread_id, int embedded_worker_id, diff --git a/content/common/service_worker/embedded_worker_messages.h b/content/common/service_worker/embedded_worker_messages.h index 5631cd9..c130285 100644 --- a/content/common/service_worker/embedded_worker_messages.h +++ b/content/common/service_worker/embedded_worker_messages.h @@ -16,6 +16,15 @@ #define IPC_MESSAGE_START EmbeddedWorkerMsgStart +// Parameters structure for EmbeddedWorkerMsg_StartWorker. +IPC_STRUCT_BEGIN(EmbeddedWorkerMsg_StartWorker_Params) + IPC_STRUCT_MEMBER(int, embedded_worker_id) + IPC_STRUCT_MEMBER(int64, service_worker_version_id) + IPC_STRUCT_MEMBER(GURL, scope) + IPC_STRUCT_MEMBER(GURL, script_url) + IPC_STRUCT_MEMBER(int, worker_devtools_agent_route_id) +IPC_STRUCT_END() + // Parameters structure for EmbeddedWorkerHostMsg_ReportConsoleMessage. // The data members directly correspond to parameters of // WorkerMessagingProxy::reportConsoleMessage() @@ -28,11 +37,8 @@ IPC_STRUCT_BEGIN(EmbeddedWorkerHostMsg_ReportConsoleMessage_Params) IPC_STRUCT_END() // Browser -> Renderer message to create a new embedded worker context. -IPC_MESSAGE_CONTROL4(EmbeddedWorkerMsg_StartWorker, - int /* embedded_worker_id */, - int64 /* service_worker_version_id */, - GURL /* scope */, - GURL /* script_url */) +IPC_MESSAGE_CONTROL1(EmbeddedWorkerMsg_StartWorker, + EmbeddedWorkerMsg_StartWorker_Params /* params */) // Browser -> Renderer message to stop (terminate) the embedded worker. IPC_MESSAGE_CONTROL1(EmbeddedWorkerMsg_StopWorker, diff --git a/content/renderer/service_worker/embedded_worker_context_client.cc b/content/renderer/service_worker/embedded_worker_context_client.cc index 5f809c2..688dd85 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.cc +++ b/content/renderer/service_worker/embedded_worker_context_client.cc @@ -13,6 +13,7 @@ #include "content/child/thread_safe_sender.h" #include "content/child/worker_task_runner.h" #include "content/child/worker_thread_task_runner.h" +#include "content/common/devtools_messages.h" #include "content/common/service_worker/embedded_worker_messages.h" #include "content/common/service_worker/service_worker_types.h" #include "content/public/renderer/document_state.h" @@ -83,11 +84,13 @@ EmbeddedWorkerContextClient::EmbeddedWorkerContextClient( int embedded_worker_id, int64 service_worker_version_id, const GURL& service_worker_scope, - const GURL& script_url) + const GURL& script_url, + int worker_devtools_agent_route_id) : embedded_worker_id_(embedded_worker_id), service_worker_version_id_(service_worker_version_id), service_worker_scope_(service_worker_scope), script_url_(script_url), + worker_devtools_agent_route_id_(worker_devtools_agent_route_id), sender_(ChildThread::current()->thread_safe_sender()), main_thread_proxy_(base::MessageLoopProxy::current()), weak_factory_(this) { @@ -190,6 +193,18 @@ void EmbeddedWorkerContextClient::reportConsoleMessage( embedded_worker_id_, params)); } +void EmbeddedWorkerContextClient::dispatchDevToolsMessage( + const blink::WebString& message) { + sender_->Send(new DevToolsClientMsg_DispatchOnInspectorFrontend( + worker_devtools_agent_route_id_, message.utf8())); +} + +void EmbeddedWorkerContextClient::saveDevToolsAgentState( + const blink::WebString& state) { + sender_->Send(new DevToolsHostMsg_SaveAgentRuntimeState( + worker_devtools_agent_route_id_, state.utf8())); +} + void EmbeddedWorkerContextClient::didHandleActivateEvent( int request_id, blink::WebServiceWorkerEventResult result) { diff --git a/content/renderer/service_worker/embedded_worker_context_client.h b/content/renderer/service_worker/embedded_worker_context_client.h index 5e026ae..4312af2 100644 --- a/content/renderer/service_worker/embedded_worker_context_client.h +++ b/content/renderer/service_worker/embedded_worker_context_client.h @@ -51,7 +51,8 @@ class EmbeddedWorkerContextClient EmbeddedWorkerContextClient(int embedded_worker_id, int64 service_worker_version_id, const GURL& service_worker_scope, - const GURL& script_url); + const GURL& script_url, + int worker_devtools_agent_route_id); virtual ~EmbeddedWorkerContextClient(); @@ -78,6 +79,8 @@ class EmbeddedWorkerContextClient const blink::WebString& message, int line_number, const blink::WebString& source_url); + virtual void dispatchDevToolsMessage(const blink::WebString&); + virtual void saveDevToolsAgentState(const blink::WebString&); virtual void didHandleActivateEvent(int request_id, blink::WebServiceWorkerEventResult); virtual void didHandleInstallEvent(int request_id, @@ -107,6 +110,7 @@ class EmbeddedWorkerContextClient const int64 service_worker_version_id_; const GURL service_worker_scope_; const GURL script_url_; + const int worker_devtools_agent_route_id_; scoped_refptr<ThreadSafeSender> sender_; scoped_refptr<base::MessageLoopProxy> main_thread_proxy_; scoped_refptr<base::TaskRunner> worker_task_runner_; diff --git a/content/renderer/service_worker/embedded_worker_dispatcher.cc b/content/renderer/service_worker/embedded_worker_dispatcher.cc index fd5850f..b0ce041 100644 --- a/content/renderer/service_worker/embedded_worker_dispatcher.cc +++ b/content/renderer/service_worker/embedded_worker_dispatcher.cc @@ -58,28 +58,27 @@ void EmbeddedWorkerDispatcher::WorkerContextDestroyed( workers_.Remove(embedded_worker_id); } -void EmbeddedWorkerDispatcher::OnStartWorker(int embedded_worker_id, - int64 service_worker_version_id, - const GURL& service_worker_scope, - const GURL& script_url) { - DCHECK(!workers_.Lookup(embedded_worker_id)); +void EmbeddedWorkerDispatcher::OnStartWorker( + const EmbeddedWorkerMsg_StartWorker_Params& params) { + DCHECK(!workers_.Lookup(params.embedded_worker_id)); RenderThread::Get()->EnsureWebKitInitialized(); - scoped_ptr<WorkerWrapper> wrapper(new WorkerWrapper( - blink::WebEmbeddedWorker::create( + scoped_ptr<WorkerWrapper> wrapper( + new WorkerWrapper(blink::WebEmbeddedWorker::create( new EmbeddedWorkerContextClient( - embedded_worker_id, - service_worker_version_id, - service_worker_scope, - script_url), + params.embedded_worker_id, + params.service_worker_version_id, + params.scope, + params.script_url, + params.worker_devtools_agent_route_id), NULL))); blink::WebEmbeddedWorkerStartData start_data; - start_data.scriptURL = script_url; + start_data.scriptURL = params.script_url; start_data.userAgent = base::UTF8ToUTF16(GetContentClient()->GetUserAgent()); start_data.startMode = blink::WebEmbeddedWorkerStartModeDontPauseOnStart; wrapper->worker()->startWorkerContext(start_data); - workers_.AddWithID(wrapper.release(), embedded_worker_id); + workers_.AddWithID(wrapper.release(), params.embedded_worker_id); } void EmbeddedWorkerDispatcher::OnStopWorker(int embedded_worker_id) { diff --git a/content/renderer/service_worker/embedded_worker_dispatcher.h b/content/renderer/service_worker/embedded_worker_dispatcher.h index 0ef1afd..4f3434f 100644 --- a/content/renderer/service_worker/embedded_worker_dispatcher.h +++ b/content/renderer/service_worker/embedded_worker_dispatcher.h @@ -10,7 +10,7 @@ #include "base/memory/weak_ptr.h" #include "ipc/ipc_listener.h" -struct ServiceWorkerMsg_StartWorker_Params; +struct EmbeddedWorkerMsg_StartWorker_Params; class GURL; namespace WebKit { @@ -33,10 +33,7 @@ class EmbeddedWorkerDispatcher : public IPC::Listener { private: class WorkerWrapper; - void OnStartWorker(int embedded_worker_id, - int64 service_worker_version_id, - const GURL& service_worker_scope, - const GURL& script_url); + void OnStartWorker(const EmbeddedWorkerMsg_StartWorker_Params& params); void OnStopWorker(int embedded_worker_id); IDMap<WorkerWrapper, IDMapOwnPointer> workers_; |