summaryrefslogtreecommitdiffstats
path: root/chrome/browser/renderer_host
diff options
context:
space:
mode:
authoryurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-18 16:17:21 +0000
committeryurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-18 16:17:21 +0000
commit68b4d89935563f7009074cef5b7be8e0d8148bd4 (patch)
treef987689e2cc300230538482e7fa7b61b8dabd4bf /chrome/browser/renderer_host
parentdaeb1b6db0ddff328b2ed4bc839a9f15936c3496 (diff)
downloadchromium_src-68b4d89935563f7009074cef5b7be8e0d8148bd4.zip
chromium_src-68b4d89935563f7009074cef5b7be8e0d8148bd4.tar.gz
chromium_src-68b4d89935563f7009074cef5b7be8e0d8148bd4.tar.bz2
Create communication channel between developer tools UI implemented in JS and residing in a process different from inspected page renderer process. There is no direct IPC channel between the two processes so all messages are routed through browser process.
On the side of inspected page there is ToolsAgent existing in all renderers so that we can start inspecting the page at any moment by talking to this object. On the side of developer tools renderer there is ToolsClient which is created only for RenderView that host developer tools UI. This change is a slightly modified version of http://codereview.chromium.org/20221/show Review URL: http://codereview.chromium.org/20430 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9944 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/renderer_host')
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc44
-rw-r--r--chrome/browser/renderer_host/render_view_host.h20
2 files changed, 62 insertions, 2 deletions
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 8c64d5f..3629350 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -14,6 +14,7 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/cross_site_request_manager.h"
#include "chrome/browser/debugger/debugger_wrapper.h"
+#include "chrome/browser/debugger/tools_window.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/metrics/user_metrics.h"
#include "chrome/browser/renderer_host/renderer_security_policy.h"
@@ -87,6 +88,7 @@ RenderViewHost::RenderViewHost(SiteInstance* instance,
renderer_initialized_(false),
waiting_for_drag_context_response_(false),
debugger_attached_(false),
+ tools_window_(NULL),
enable_dom_ui_bindings_(false),
pending_request_id_(0),
enable_external_host_bindings_(false),
@@ -96,7 +98,9 @@ RenderViewHost::RenderViewHost(SiteInstance* instance,
run_modal_reply_msg_(NULL),
has_unload_listener_(false),
is_waiting_for_unload_ack_(false),
- are_javascript_messages_suppressed_(false) {
+ are_javascript_messages_suppressed_(false),
+ inspected_process_id_(0),
+ inspected_view_id_(0) {
DCHECK(instance_);
DCHECK(delegate_);
if (modal_dialog_event == NULL)
@@ -554,6 +558,12 @@ void RenderViewHost::ShowJavaScriptConsole() {
Send(new ViewMsg_ShowJavaScriptConsole(routing_id()));
}
+void RenderViewHost::ShowDeveloperTools() {
+ if (!tools_window_.get())
+ tools_window_.reset(new ToolsWindow);
+ tools_window_->Show(process()->host_id(), routing_id());
+}
+
void RenderViewHost::DragSourceEndedAt(
int client_x, int client_y, int screen_x, int screen_y) {
Send(new ViewMsg_DragSourceEndedOrMoved(
@@ -582,6 +592,16 @@ void RenderViewHost::AllowDOMUIBindings() {
process()->host_id());
}
+void RenderViewHost::SetUpToolsClient(int inspected_process_id,
+ int inspected_view_id) {
+ RendererSecurityPolicy::GetInstance()->GrantDOMUIBindings(
+ process()->host_id());
+ Send(new ViewMsg_SetUpToolsClient(routing_id()));
+
+ inspected_process_id_ = inspected_process_id;
+ inspected_view_id_ = inspected_view_id;
+}
+
void RenderViewHost::AllowExternalHostBindings() {
enable_external_host_bindings_ = true;
}
@@ -732,6 +752,8 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole)
IPC_MESSAGE_HANDLER(ViewHostMsg_DebuggerOutput, OnDebuggerOutput);
IPC_MESSAGE_HANDLER(ViewHostMsg_DidDebugAttach, DidDebugAttach);
+ IPC_MESSAGE_HANDLER(ViewHostMsg_ToolsAgentMsg, OnToolsAgentMsg);
+ IPC_MESSAGE_HANDLER(ViewHostMsg_ToolsClientMsg, OnToolsClientMsg);
IPC_MESSAGE_HANDLER(ViewHostMsg_UserMetricsRecordAction,
OnUserMetricsRecordAction)
IPC_MESSAGE_HANDLER(ViewHostMsg_MissingPluginStatus, OnMissingPluginStatus);
@@ -1171,6 +1193,26 @@ void RenderViewHost::DidDebugAttach() {
}
}
+void RenderViewHost::OnToolsAgentMsg(int tools_message_type,
+ const std::wstring& body) {
+ RenderViewHost* host = RenderViewHost::FromID(inspected_process_id_,
+ inspected_view_id_);
+ CHECK(host);
+ if (host) {
+ host->Send(new ViewMsg_ToolsAgentMsg(
+ inspected_view_id_, tools_message_type, body));
+ }
+}
+
+void RenderViewHost::OnToolsClientMsg(int tools_message_type,
+ const std::wstring& body) {
+ if (!tools_window_.get()) {
+ NOTREACHED();
+ return;
+ }
+ tools_window_->SendToolsClientMessage(tools_message_type, body);
+}
+
void RenderViewHost::OnUserMetricsRecordAction(const std::wstring& action) {
UserMetrics::RecordComputedAction(action.c_str(), process()->profile());
}
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index 2f36219..dbd18a1 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -26,6 +26,7 @@ class NavigationEntry;
class RenderViewHostDelegate;
class SiteInstance;
class SkBitmap;
+class ToolsWindow;
class ViewMsg_Navigate;
struct ContextMenuParams;
struct ViewHostMsg_DidPrintPage_Params;
@@ -291,6 +292,9 @@ class RenderViewHost : public RenderWidgetHost {
// Show the JavaScript console.
void ShowJavaScriptConsole();
+ // Show the Web Inspector.
+ void ShowDeveloperTools();
+
// Notifies the renderer that a drop occurred. This is necessary because the
// render may be the one that started the drag.
void DragSourceEndedAt(
@@ -320,6 +324,11 @@ class RenderViewHost : public RenderWidgetHost {
// Must be called before CreateRenderView().
void AllowDOMUIBindings();
+ // Tell the render view to connect as a tools client to the specified
+ // renderer. Must be called when RenderView is created but before any
+ // navigation.
+ void SetUpToolsClient(int inspected_process_id, int inspected_view_id);
+
// Sets a property with the given name and value on the DOM UI binding object.
// Must call AllowDOMUIBindings() on this renderer first.
void SetDOMUIProperty(const std::string& name, const std::string& value);
@@ -506,6 +515,8 @@ class RenderViewHost : public RenderWidgetHost {
const std::wstring& source_id);
void OnDebuggerOutput(const std::wstring& output);
void DidDebugAttach();
+ void OnToolsAgentMsg(int tools_message_type, const std::wstring& body);
+ void OnToolsClientMsg(int tools_message_type, const std::wstring& body);
void OnUserMetricsRecordAction(const std::wstring& action);
void OnMissingPluginStatus(int status);
void OnMessageReceived(IPC::Message* msg) { }
@@ -561,9 +572,12 @@ class RenderViewHost : public RenderWidgetHost {
// information.
bool waiting_for_drag_context_response_;
- // is the debugger attached to us or not
+ // If the debugger attached to us or not.
bool debugger_attached_;
+ // Allows to show exactly one developer tools window for this render view.
+ scoped_ptr<ToolsWindow> tools_window_;
+
// True if we've been told to set up the the Javascript bindings for
// sending messages back to the browser.
bool enable_dom_ui_bindings_;
@@ -610,6 +624,10 @@ class RenderViewHost : public RenderWidgetHost {
bool are_javascript_messages_suppressed_;
+ int inspected_process_id_;
+
+ int inspected_view_id_;
+
DISALLOW_EVIL_CONSTRUCTORS(RenderViewHost);
};