blob: 22a1f93a364abaa2ac9915f1a901017ce58c1cf2 [file] [log] [blame]
// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_
#define WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_
#include <wtf/HashMap.h>
#include <wtf/Noncopyable.h>
#include "v8/include/v8-debug.h"
#include "webkit/api/public/WebDevToolsAgent.h"
namespace WebCore {
class PageGroupLoadDeferrer;
}
class DebuggerAgentImpl;
class DictionaryValue;
class WebFrameImpl;
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
// to the v8 debugger. This class coordinates communication between the debug
// agents and v8 debugger. It will set debug output handler as long as at least
// one debugger agent is attached and remove it when last debugger agent is
// detached. When message is received from debugger it will route it to the
// right debugger agent if there is one otherwise the message will be ignored.
//
// v8 may send a message(e.g. exception event) after which it
// would expect some actions from the handler. If there is no appropriate
// debugger agent to handle such messages the manager will perform the action
// itself, otherwise v8 may hang waiting for the action.
class DebuggerAgentManager : public Noncopyable {
public:
static void DebugAttach(DebuggerAgentImpl* debugger_agent);
static void DebugDetach(DebuggerAgentImpl* debugger_agent);
static void DebugBreak(DebuggerAgentImpl* debugger_agent);
static void DebugCommand(const WebCore::String& command);
static void ExecuteDebuggerCommand(const WebCore::String& command,
int caller_id);
static void SetMessageLoopDispatchHandler(
WebKit::WebDevToolsAgent::MessageLoopDispatchHandler handler);
// Sets |host_id| as the frame context data. This id is used to filter scripts
// related to the inspected page.
static void SetHostId(WebFrameImpl* webframe, int host_id);
static void OnWebViewClosed(WebViewImpl* webview);
static void OnNavigate();
class UtilityContextScope : public Noncopyable {
public:
UtilityContextScope() {
ASSERT(!in_utility_context_);
in_utility_context_ = true;
}
~UtilityContextScope() {
if (debug_break_delayed_) {
v8::Debug::DebugBreak();
debug_break_delayed_ = false;
}
in_utility_context_ = false;
}
};
private:
DebuggerAgentManager();
~DebuggerAgentManager();
static void V8DebugHostDispatchHandler();
static void OnV8DebugMessage(const v8::Debug::Message& message);
static void SendCommandToV8(const WebCore::String& cmd,
v8::Debug::ClientData* data);
static void SendContinueCommandToV8();
static DebuggerAgentImpl* FindAgentForCurrentV8Context();
static DebuggerAgentImpl* DebuggerAgentForHostId(int host_id);
typedef HashMap<int, DebuggerAgentImpl*> AttachedAgentsMap;
static AttachedAgentsMap* attached_agents_map_;
static WebKit::WebDevToolsAgent::MessageLoopDispatchHandler
message_loop_dispatch_handler_;
static bool in_host_dispatch_handler_;
typedef HashMap<WebViewImpl*, WebCore::PageGroupLoadDeferrer*>
DeferrersMap;
static DeferrersMap page_deferrers_;
static bool in_utility_context_;
static bool debug_break_delayed_;
};
#endif // WEBKIT_GLUE_DEVTOOLS_DEBUGGER_AGENT_MANAGER_H_