summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-16 06:09:22 +0000
committeryurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-16 06:09:22 +0000
commitab73cc3b7b33d14919b127366b95bf341ba6ff24 (patch)
treefca48090c394e768e8a10f2e932adf6d1bf62afe
parentafa8020c67d16ff5792a15bda51277e3a03fedbd (diff)
downloadchromium_src-ab73cc3b7b33d14919b127366b95bf341ba6ff24.zip
chromium_src-ab73cc3b7b33d14919b127366b95bf341ba6ff24.tar.gz
chromium_src-ab73cc3b7b33d14919b127366b95bf341ba6ff24.tar.bz2
DevTools: support dispatching devtools commands when there is a tight loop in JavaScript
Review URL: http://codereview.chromium.org/3152011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56184 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/debugger/devtools_sanity_unittest.cc3
-rw-r--r--chrome/common/devtools_messages_internal.h6
-rw-r--r--chrome/renderer/devtools_agent_filter.cc44
-rw-r--r--chrome/renderer/devtools_agent_filter.h3
-rw-r--r--chrome/renderer/devtools_client.cc4
-rw-r--r--chrome/renderer/devtools_client.h1
6 files changed, 42 insertions, 19 deletions
diff --git a/chrome/browser/debugger/devtools_sanity_unittest.cc b/chrome/browser/debugger/devtools_sanity_unittest.cc
index b7e73af..3b8ee35 100644
--- a/chrome/browser/debugger/devtools_sanity_unittest.cc
+++ b/chrome/browser/debugger/devtools_sanity_unittest.cc
@@ -369,8 +369,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPauseWhenLoadingDevTools) {
// is already running.
// The test fails on linux and should be related to Webkit patch
// http://trac.webkit.org/changeset/64124/trunk.
-// Should be reenabled once WebKit r65304 is rolled.
-IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, FAILS_TestPauseWhenScriptIsRunning) {
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestPauseWhenScriptIsRunning) {
RunTest("testPauseWhenScriptIsRunning", kPauseWhenScriptIsRunning);
}
diff --git a/chrome/common/devtools_messages_internal.h b/chrome/common/devtools_messages_internal.h
index 236b4b3..4eb9cca 100644
--- a/chrome/common/devtools_messages_internal.h
+++ b/chrome/common/devtools_messages_internal.h
@@ -89,12 +89,6 @@ IPC_BEGIN_MESSAGES(DevToolsAgent)
IPC_MESSAGE_CONTROL1(DevToolsAgentMsg_DebuggerCommand,
std::string /* command */)
- // This command is sent to debugger when user wants to pause script execution
- // immediately. This message should be processed on the IO thread so that it
- // can have effect even if the Renderer thread is busy with JavaScript
- // execution.
- IPC_MESSAGE_CONTROL0(DevToolsAgentMsg_DebuggerPauseScript)
-
// Inspect element with the given coordinates.
IPC_MESSAGE_CONTROL2(DevToolsAgentMsg_InspectElement,
int /* x */,
diff --git a/chrome/renderer/devtools_agent_filter.cc b/chrome/renderer/devtools_agent_filter.cc
index cd836e5..dc2bb44 100644
--- a/chrome/renderer/devtools_agent_filter.cc
+++ b/chrome/renderer/devtools_agent_filter.cc
@@ -16,6 +16,28 @@
using WebKit::WebDevToolsAgent;
using WebKit::WebString;
+namespace {
+
+class MessageImpl : public WebDevToolsAgent::MessageDescriptor {
+ public:
+ MessageImpl(const std::string& message, int host_id)
+ : msg(message),
+ host_id(host_id) {}
+ virtual ~MessageImpl() {}
+ virtual WebDevToolsAgent* agent() {
+ DevToolsAgent* agent = DevToolsAgent::FromHostId(host_id);
+ if (!agent)
+ return 0;
+ return agent->GetWebAgent();
+ }
+ virtual WebString message() { return WebString::fromUTF8(msg); }
+ private:
+ int host_id;
+ std::string msg;
+};
+
+}
+
// static
void DevToolsAgentFilter::DispatchMessageLoop() {
MessageLoop* current = MessageLoop::current();
@@ -31,7 +53,8 @@ IPC::Channel* DevToolsAgentFilter::channel_ = NULL;
int DevToolsAgentFilter::current_routing_id_ = 0;
DevToolsAgentFilter::DevToolsAgentFilter()
- : message_handled_(false) {
+ : message_handled_(false),
+ render_thread_loop_(MessageLoop::current()) {
WebDevToolsAgent::setMessageLoopDispatchHandler(
&DevToolsAgentFilter::DispatchMessageLoop);
}
@@ -45,8 +68,8 @@ bool DevToolsAgentFilter::OnMessageReceived(const IPC::Message& message) {
current_routing_id_ = message.routing_id();
IPC_BEGIN_MESSAGE_MAP(DevToolsAgentFilter, message)
IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DebuggerCommand, OnDebuggerCommand)
- IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DebuggerPauseScript,
- OnDebuggerPauseScript)
+ IPC_MESSAGE_HANDLER(DevToolsAgentMsg_DispatchOnInspectorBackend,
+ OnDispatchOnInspectorBackend)
IPC_MESSAGE_UNHANDLED(message_handled_ = false)
IPC_END_MESSAGE_MAP()
return message_handled_;
@@ -57,6 +80,17 @@ void DevToolsAgentFilter::OnDebuggerCommand(const std::string& command) {
WebString::fromUTF8(command), current_routing_id_);
}
-void DevToolsAgentFilter::OnDebuggerPauseScript() {
- WebDevToolsAgent::debuggerPauseScript();
+void DevToolsAgentFilter::OnDispatchOnInspectorBackend(
+ const std::string& message) {
+ if (!WebDevToolsAgent::shouldInterruptForMessage(
+ WebString::fromUTF8(message))) {
+ message_handled_ = false;
+ return;
+ }
+ WebDevToolsAgent::interruptAndDispatch(
+ new MessageImpl(message, current_routing_id_));
+
+ render_thread_loop_->PostTask(
+ FROM_HERE,
+ NewRunnableFunction(&WebDevToolsAgent::processPendingMessages));
}
diff --git a/chrome/renderer/devtools_agent_filter.h b/chrome/renderer/devtools_agent_filter.h
index fd4d7e7..b5012d4 100644
--- a/chrome/renderer/devtools_agent_filter.h
+++ b/chrome/renderer/devtools_agent_filter.h
@@ -37,9 +37,10 @@ class DevToolsAgentFilter : public IPC::ChannelProxy::MessageFilter {
// OnDebuggerCommand will be executed in the IO thread so that we can
// handle debug messages even when v8 is stopped.
void OnDebuggerCommand(const std::string& command);
- void OnDebuggerPauseScript();
+ void OnDispatchOnInspectorBackend(const std::string& message);
bool message_handled_;
+ MessageLoop* render_thread_loop_;
// Made static to allow DevToolsAgent to use it for replying directly
// from IO thread.
diff --git a/chrome/renderer/devtools_client.cc b/chrome/renderer/devtools_client.cc
index 0e544ad..1c6aaaa 100644
--- a/chrome/renderer/devtools_client.cc
+++ b/chrome/renderer/devtools_client.cc
@@ -61,10 +61,6 @@ void DevToolsClient::sendDebuggerCommandToAgent(const WebString& command) {
Send(DevToolsAgentMsg_DebuggerCommand(command.utf8()));
}
-void DevToolsClient::sendDebuggerPauseScript() {
- Send(DevToolsAgentMsg_DebuggerPauseScript());
-}
-
void DevToolsClient::activateWindow() {
render_view_->Send(new ViewHostMsg_ActivateDevToolsWindow(
render_view_->routing_id()));
diff --git a/chrome/renderer/devtools_client.h b/chrome/renderer/devtools_client.h
index fdef8d1..577e189 100644
--- a/chrome/renderer/devtools_client.h
+++ b/chrome/renderer/devtools_client.h
@@ -44,7 +44,6 @@ class DevToolsClient : public WebKit::WebDevToolsFrontendClient {
virtual void sendFrontendLoaded();
virtual void sendMessageToBackend(const WebKit::WebString&);
virtual void sendDebuggerCommandToAgent(const WebKit::WebString& command);
- virtual void sendDebuggerPauseScript();
virtual void activateWindow();
virtual void closeWindow();