diff options
author | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-06 12:06:07 +0000 |
---|---|---|
committer | pfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-06 12:06:07 +0000 |
commit | 48b03754b6f842eea4b179cbe9b7716ce893083b (patch) | |
tree | 1b7c93fe380350066f67ebc6cd184e19e96e76bb /webkit/glue | |
parent | bd12c913345c751026942f5d4222a6dc6ce6cafa (diff) | |
download | chromium_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.cc | 25 | ||||
-rw-r--r-- | webkit/glue/devtools/debugger_agent_impl.h | 4 | ||||
-rw-r--r-- | webkit/glue/devtools/debugger_agent_manager.cc | 76 | ||||
-rw-r--r-- | webkit/glue/devtools/debugger_agent_manager.h | 11 | ||||
-rw-r--r-- | webkit/glue/webdevtoolsagent_impl.cc | 1 |
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(); |