summaryrefslogtreecommitdiffstats
path: root/webkit/glue
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 12:06:07 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-06 12:06:07 +0000
commit48b03754b6f842eea4b179cbe9b7716ce893083b (patch)
tree1b7c93fe380350066f67ebc6cd184e19e96e76bb /webkit/glue
parentbd12c913345c751026942f5d4222a6dc6ce6cafa (diff)
downloadchromium_src-48b03754b6f842eea4b179cbe9b7716ce893083b.zip
chromium_src-48b03754b6f842eea4b179cbe9b7716ce893083b.tar.gz
chromium_src-48b03754b6f842eea4b179cbe9b7716ce893083b.tar.bz2
DevTools: Do not fail on closing WebInspector while on a breakpoint.
Review URL: http://codereview.chromium.org/108020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15403 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/glue')
-rw-r--r--webkit/glue/devtools/debugger_agent_impl.cc25
-rw-r--r--webkit/glue/devtools/debugger_agent_impl.h4
-rw-r--r--webkit/glue/devtools/debugger_agent_manager.cc76
-rw-r--r--webkit/glue/devtools/debugger_agent_manager.h11
-rw-r--r--webkit/glue/webdevtoolsagent_impl.cc1
5 files changed, 78 insertions, 39 deletions
diff --git a/webkit/glue/devtools/debugger_agent_impl.cc b/webkit/glue/devtools/debugger_agent_impl.cc
index 845bd6e..1734d69 100644
--- a/webkit/glue/devtools/debugger_agent_impl.cc
+++ b/webkit/glue/devtools/debugger_agent_impl.cc
@@ -11,7 +11,6 @@
#include "Document.h"
#include "Node.h"
#include "Page.h"
-#include "PageGroupLoadDeferrer.h"
#undef LOG
#include "grit/webkit_resources.h"
@@ -31,7 +30,6 @@ using WebCore::DOMWindow;
using WebCore::Document;
using WebCore::Node;
using WebCore::Page;
-using WebCore::PageGroupLoadDeferrer;
using WebCore::String;
using WebCore::V8ClassIndex;
using WebCore::V8Custom;
@@ -158,29 +156,6 @@ String DebuggerAgentImpl::ExecuteUtilityFunction(
}
}
-void DebuggerAgentImpl::RunWithDeferredMessages(
- const HashSet<DebuggerAgentImpl*>& agents,
- WebDevToolsAgent::MessageLoopDispatchHandler handler) {
- Vector<PageGroupLoadDeferrer*> deferrers;
- // 1. Disable active objects and input events.
- for (HashSet<DebuggerAgentImpl*>::const_iterator ag_it = agents.begin();
- ag_it != agents.end(); ++ag_it) {
- DebuggerAgentImpl* agent = *ag_it;
- deferrers.append(new PageGroupLoadDeferrer(agent->GetPage(), true));
- agent->web_view()->SetIgnoreInputEvents(true);
- }
-
- // 2. Process messages.
- handler();
-
- // 3. Bring things back.
- for (HashSet<DebuggerAgentImpl*>::const_iterator ag_it = agents.begin();
- ag_it != agents.end(); ++ag_it) {
- (*ag_it)->web_view()->SetIgnoreInputEvents(false);
- }
- deleteAllValues(deferrers);
-}
-
WebCore::Page* DebuggerAgentImpl::GetPage() {
return web_view_impl_->page();
}
diff --git a/webkit/glue/devtools/debugger_agent_impl.h b/webkit/glue/devtools/debugger_agent_impl.h
index 0425dfe..5d8e6f8 100644
--- a/webkit/glue/devtools/debugger_agent_impl.h
+++ b/webkit/glue/devtools/debugger_agent_impl.h
@@ -47,10 +47,6 @@ class DebuggerAgentImpl : public DebuggerAgent {
const WebCore::String& json_args,
WebCore::String* exception);
- static void RunWithDeferredMessages(
- const HashSet<DebuggerAgentImpl*>& agents,
- WebDevToolsAgent::MessageLoopDispatchHandler handler);
-
WebCore::Page* GetPage();
WebDevToolsAgentImpl* webdevtools_agent() { return webdevtools_agent_; };
diff --git a/webkit/glue/devtools/debugger_agent_manager.cc b/webkit/glue/devtools/debugger_agent_manager.cc
index 378acb6..aa692aa 100644
--- a/webkit/glue/devtools/debugger_agent_manager.cc
+++ b/webkit/glue/devtools/debugger_agent_manager.cc
@@ -5,6 +5,7 @@
#include "config.h"
#include "Frame.h"
+#include "PageGroupLoadDeferrer.h"
#include "v8_proxy.h"
#include <wtf/HashSet.h>
#undef LOG
@@ -16,6 +17,7 @@
#include "webkit/glue/devtools/debugger_agent_impl.h"
#include "webkit/glue/devtools/debugger_agent_manager.h"
#include "webkit/glue/webdevtoolsagent_impl.h"
+#include "webkit/glue/webview_impl.h"
#if USE(V8)
#include "v8/include/v8-debug.h"
@@ -27,6 +29,9 @@ WebDevToolsAgent::MessageLoopDispatchHandler
// static
bool DebuggerAgentManager::in_host_dispatch_handler_ = false;
+// static
+DebuggerAgentManager::DeferrersMap DebuggerAgentManager::page_deferrers_;
+
namespace {
class CallerIdWrapper : public v8::Debug::ClientData {
@@ -59,17 +64,49 @@ void DebuggerAgentManager::V8DebugMessageHandler(const uint16_t* message,
}
void DebuggerAgentManager::V8DebugHostDispatchHandler() {
+ if (!DebuggerAgentManager::message_loop_dispatch_handler_ ||
+ !attached_agents_) {
+ return;
+ }
if (in_host_dispatch_handler_) {
return;
}
in_host_dispatch_handler_ = true;
- if (DebuggerAgentManager::message_loop_dispatch_handler_
- && attached_agents_) {
- DebuggerAgentImpl::RunWithDeferredMessages(
- *attached_agents_,
- message_loop_dispatch_handler_);
+
+ Vector<WebViewImpl*> views;
+ // 1. Disable active objects and input events.
+ for (AttachedAgentsSet::iterator it = attached_agents_->begin();
+ it != attached_agents_->end();
+ ++it) {
+ DebuggerAgentImpl* agent = *it;
+ page_deferrers_.set(
+ agent->web_view(),
+ new WebCore::PageGroupLoadDeferrer(agent->GetPage(), true));
+ views.append(agent->web_view());
+ agent->web_view()->SetIgnoreInputEvents(true);
}
+
+ // 2. Process messages.
+ DebuggerAgentManager::message_loop_dispatch_handler_();
+
+ // 3. Bring things back.
+ for (Vector<WebViewImpl*>::iterator it = views.begin();
+ it != views.end();
+ ++it) {
+ if (page_deferrers_.contains(*it)) {
+ // The view was not closed during the dispatch.
+ (*it)->SetIgnoreInputEvents(false);
+ }
+ }
+ deleteAllValues(page_deferrers_);
+ page_deferrers_.clear();
+
in_host_dispatch_handler_ = false;
+ if (!attached_agents_) {
+ // Remove handlers if all agents were detached within host dispatch.
+ v8::Debug::SetMessageHandler(NULL);
+ v8::Debug::SetHostDispatchHandler(NULL);
+ }
}
// static
@@ -101,10 +138,17 @@ void DebuggerAgentManager::DebugDetach(DebuggerAgentImpl* debugger_agent) {
DCHECK(attached_agents_->contains(debugger_agent));
attached_agents_->remove(debugger_agent);
if (attached_agents_->isEmpty()) {
- v8::Debug::SetMessageHandler(NULL);
- v8::Debug::SetHostDispatchHandler(NULL);
delete attached_agents_;
attached_agents_ = NULL;
+ // Note that we do not empty handlers while in dispatch - we schedule
+ // continue and do removal once we are out of the dispatch.
+ if (!in_host_dispatch_handler_) {
+ v8::Debug::SetMessageHandler(NULL);
+ v8::Debug::SetHostDispatchHandler(NULL);
+ } else if (FindAgentForCurrentV8Context() == debugger_agent) {
+ // Force continue just in case to handle close while on a breakpoint.
+ SendContinueCommandToV8();
+ }
}
#endif
}
@@ -141,9 +185,7 @@ void DebuggerAgentManager::DebuggerOutput(const std::string& out,
if (!agent) {
// Autocontinue execution on break and exception events if there is no
// handler.
- std::wstring continue_cmd(
- L"{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}");
- SendCommandToV8(continue_cmd, new CallerIdWrapper());
+ SendContinueCommandToV8();
return;
}
agent->DebuggerOutput(out);
@@ -163,6 +205,14 @@ void DebuggerAgentManager::SetMessageLoopDispatchHandler(
}
// static
+void DebuggerAgentManager::OnWebViewClosed(WebViewImpl* webview) {
+ if (page_deferrers_.contains(webview)) {
+ delete page_deferrers_.get(webview);
+ page_deferrers_.remove(webview);
+ }
+}
+
+// static
void DebuggerAgentManager::SendCommandToV8(const std::wstring& cmd,
v8::Debug::ClientData* data) {
#if USE(V8)
@@ -172,6 +222,12 @@ void DebuggerAgentManager::SendCommandToV8(const std::wstring& cmd,
#endif
}
+void DebuggerAgentManager::SendContinueCommandToV8() {
+ std::wstring continue_cmd(
+ L"{\"seq\":1,\"type\":\"request\",\"command\":\"continue\"}");
+ SendCommandToV8(continue_cmd, new CallerIdWrapper());
+}
+
// static
DebuggerAgentImpl* DebuggerAgentManager::FindAgentForCurrentV8Context() {
if (!attached_agents_) {
diff --git a/webkit/glue/devtools/debugger_agent_manager.h b/webkit/glue/devtools/debugger_agent_manager.h
index 2b37993..87cf3d8 100644
--- a/webkit/glue/devtools/debugger_agent_manager.h
+++ b/webkit/glue/devtools/debugger_agent_manager.h
@@ -12,8 +12,13 @@
#include "v8/include/v8-debug.h"
#include "webkit/glue/webdevtoolsagent.h"
+namespace WebCore {
+class PageGroupLoadDeferrer;
+}
+
class DebuggerAgentImpl;
class DictionaryValue;
+class WebViewImpl;
// There is single v8 instance per render process. Also there may be several
// RenderViews and consequently devtools agents in the process that want to talk
@@ -42,6 +47,8 @@ class DebuggerAgentManager {
static void SetMessageLoopDispatchHandler(
WebDevToolsAgent::MessageLoopDispatchHandler handler);
+ static void OnWebViewClosed(WebViewImpl* webview);
+
private:
DebuggerAgentManager();
~DebuggerAgentManager();
@@ -54,6 +61,7 @@ class DebuggerAgentManager {
v8::Debug::ClientData* caller_data);
static void SendCommandToV8(const std::wstring& cmd,
v8::Debug::ClientData* data);
+ static void SendContinueCommandToV8();
static DebuggerAgentImpl* FindAgentForCurrentV8Context();
static DebuggerAgentImpl* FindDebuggerAgentForToolsAgent(
@@ -65,6 +73,9 @@ class DebuggerAgentManager {
static WebDevToolsAgent::MessageLoopDispatchHandler
message_loop_dispatch_handler_;
static bool in_host_dispatch_handler_;
+ typedef HashMap<WebViewImpl*, WebCore::PageGroupLoadDeferrer*>
+ DeferrersMap;
+ static DeferrersMap page_deferrers_;
DISALLOW_COPY_AND_ASSIGN(DebuggerAgentManager);
};
diff --git a/webkit/glue/webdevtoolsagent_impl.cc b/webkit/glue/webdevtoolsagent_impl.cc
index 05998eb..36c1dcf 100644
--- a/webkit/glue/webdevtoolsagent_impl.cc
+++ b/webkit/glue/webdevtoolsagent_impl.cc
@@ -57,6 +57,7 @@ WebDevToolsAgentImpl::WebDevToolsAgentImpl(
}
WebDevToolsAgentImpl::~WebDevToolsAgentImpl() {
+ DebuggerAgentManager::OnWebViewClosed(web_view_impl_);
if (!utility_context_.IsEmpty()) {
utility_context_.Dispose();
utility_context_.Clear();