diff options
author | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-16 06:09:22 +0000 |
---|---|---|
committer | yurys@chromium.org <yurys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-16 06:09:22 +0000 |
commit | ab73cc3b7b33d14919b127366b95bf341ba6ff24 (patch) | |
tree | fca48090c394e768e8a10f2e932adf6d1bf62afe | |
parent | afa8020c67d16ff5792a15bda51277e3a03fedbd (diff) | |
download | chromium_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.cc | 3 | ||||
-rw-r--r-- | chrome/common/devtools_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/renderer/devtools_agent_filter.cc | 44 | ||||
-rw-r--r-- | chrome/renderer/devtools_agent_filter.h | 3 | ||||
-rw-r--r-- | chrome/renderer/devtools_client.cc | 4 | ||||
-rw-r--r-- | chrome/renderer/devtools_client.h | 1 |
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(); |