summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhoro@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-30 10:59:14 +0000
committerhoro@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-30 10:59:14 +0000
commit5f97a864f2a028f77a2c758075fc74242c879967 (patch)
tree407e4eb6aff2d8f83693d0078984dd15b6ac5e3c
parent3fe57da4f047d7b07589434c13aa1aa970039590 (diff)
downloadchromium_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
-rw-r--r--content/browser/service_worker/embedded_worker_instance.cc17
-rw-r--r--content/browser/service_worker/embedded_worker_instance.h8
-rw-r--r--content/browser/service_worker/embedded_worker_registry.cc29
-rw-r--r--content/browser/service_worker/embedded_worker_registry.h4
-rw-r--r--content/browser/service_worker/embedded_worker_test_helper.cc16
-rw-r--r--content/browser/service_worker/embedded_worker_test_helper.h6
-rw-r--r--content/common/service_worker/embedded_worker_messages.h16
-rw-r--r--content/renderer/service_worker/embedded_worker_context_client.cc17
-rw-r--r--content/renderer/service_worker/embedded_worker_context_client.h6
-rw-r--r--content/renderer/service_worker/embedded_worker_dispatcher.cc25
-rw-r--r--content/renderer/service_worker/embedded_worker_dispatcher.h7
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(&params),
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_;