summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/debugger/debugger.scons12
-rw-r--r--chrome/browser/debugger/debugger.vcproj24
-rw-r--r--chrome/browser/debugger/tools_contents.cc43
-rw-r--r--chrome/browser/debugger/tools_contents.h45
-rw-r--r--chrome/browser/debugger/tools_view.cc92
-rw-r--r--chrome/browser/debugger/tools_view.h75
-rw-r--r--chrome/browser/debugger/tools_window.cc54
-rw-r--r--chrome/browser/debugger/tools_window.h44
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc33
-rw-r--r--chrome/browser/renderer_host/render_view_host.h14
-rw-r--r--chrome/browser/renderer_host/render_view_host_delegate.h5
-rw-r--r--chrome/browser/tab_contents/tab_contents_factory.cc7
-rw-r--r--chrome/browser/tab_contents/tab_contents_type.h1
-rw-r--r--chrome/browser/tab_contents/web_contents_view.h8
-rw-r--r--chrome/browser/tab_contents/web_contents_view_gtk.cc9
-rw-r--r--chrome/browser/tab_contents/web_contents_view_gtk.h3
-rw-r--r--chrome/browser/tab_contents/web_contents_view_mac.h3
-rw-r--r--chrome/browser/tab_contents/web_contents_view_mac.mm9
-rw-r--r--chrome/browser/tab_contents/web_contents_view_win.cc21
-rw-r--r--chrome/browser/tab_contents/web_contents_view_win.h7
20 files changed, 507 insertions, 2 deletions
diff --git a/chrome/browser/debugger/debugger.scons b/chrome/browser/debugger/debugger.scons
index 30d1a65..f34a8f1 100644
--- a/chrome/browser/debugger/debugger.scons
+++ b/chrome/browser/debugger/debugger.scons
@@ -54,6 +54,12 @@ input_files = ChromeFileList([
'debugger_window.h',
'debugger_wrapper.cc',
'debugger_wrapper.h',
+ 'tools_contents.cc',
+ 'tools_contents.h',
+ 'tools_view.cc',
+ 'tools_view.h',
+ 'tools_window.cc',
+ 'tools_window.h',
])
if env.Bit('linux'):
@@ -62,6 +68,9 @@ if env.Bit('linux'):
'debugger_contents.cc',
'debugger_view.cc',
'debugger_window.cc',
+ 'tools_contents.cc',
+ 'tools_view.cc',
+ 'tools_window.cc',
)
if env.Bit('mac'):
@@ -72,6 +81,9 @@ if env.Bit('mac'):
'debugger_node.cc',
'debugger_view.cc',
'debugger_window.cc',
+ 'tools_contents.cc',
+ 'tools_view.cc',
+ 'tools_window.cc',
)
if not env.Bit('mac'):
diff --git a/chrome/browser/debugger/debugger.vcproj b/chrome/browser/debugger/debugger.vcproj
index d72b86a..e02dd18 100644
--- a/chrome/browser/debugger/debugger.vcproj
+++ b/chrome/browser/debugger/debugger.vcproj
@@ -213,6 +213,30 @@
RelativePath=".\debugger_wrapper.h"
>
</File>
+ <File
+ RelativePath=".\tools_contents.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\tools_contents.h"
+ >
+ </File>
+ <File
+ RelativePath=".\tools_view.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\tools_view.h"
+ >
+ </File>
+ <File
+ RelativePath=".\tools_window.cc"
+ >
+ </File>
+ <File
+ RelativePath=".\tools_window.h"
+ >
+ </File>
</Files>
<Globals>
</Globals>
diff --git a/chrome/browser/debugger/tools_contents.cc b/chrome/browser/debugger/tools_contents.cc
new file mode 100644
index 0000000..19d9d59
--- /dev/null
+++ b/chrome/browser/debugger/tools_contents.cc
@@ -0,0 +1,43 @@
+// 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.
+
+#include "chrome/browser/debugger/tools_contents.h"
+
+#include "base/singleton.h"
+
+ToolsContents::ToolsContents(Profile* profile, SiteInstance* instance)
+ : WebContents(profile,
+ instance,
+ NULL,
+ MSG_ROUTING_NONE,
+ NULL) {
+ set_type(TAB_CONTENTS_TOOLS);
+}
+
+void ToolsContents::RendererCreated(RenderViewHost* render_view_host) {
+ RenderViewID* render_view_id =
+ ToolsContents::GetInspectedViewInfoAccessor()->GetProperty(
+ property_bag());
+ DCHECK(render_view_id);
+ if (!render_view_id)
+ return;
+
+ render_view_host->SetupToolsClient(render_view_id->process_id,
+ render_view_id->view_id);
+ ToolsContents::GetInspectedViewInfoAccessor()->DeleteProperty(property_bag());
+}
+
+// static
+bool ToolsContents::IsToolsUrl(const GURL& url) {
+ // TODO(yurys): implement
+ return (url.SchemeIs("chrome-ui") && url.host() == "inspector" &&
+ url.path() == "/debugger-oop.html");
+}
+
+// static
+PropertyAccessor<ToolsContents::RenderViewID>*
+ ToolsContents::GetInspectedViewInfoAccessor() {
+ return Singleton<PropertyAccessor<ToolsContents::RenderViewID> >().get();
+}
+
diff --git a/chrome/browser/debugger/tools_contents.h b/chrome/browser/debugger/tools_contents.h
new file mode 100644
index 0000000..ceee9fc
--- /dev/null
+++ b/chrome/browser/debugger/tools_contents.h
@@ -0,0 +1,45 @@
+// 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 CHROME_BROWSER_DEBUGGER_TOOLS_CONTENTS_H_
+#define CHROME_BROWSER_DEBUGGER_TOOLS_CONTENTS_H_
+
+#include <utility>
+
+#include "chrome/browser/tab_contents/web_contents.h"
+#include "chrome/common/property_bag.h"
+
+// TODO(yurys): it may be made into DOMUI if the latter supports RendererCreated
+// notification.
+class ToolsContents : public WebContents {
+ public:
+ ToolsContents(Profile* profile, SiteInstance* instance);
+
+ static bool IsToolsUrl(const GURL& url);
+
+ struct RenderViewID {
+ RenderViewID(int pid, int vid) : process_id(pid), view_id(vid) {}
+ int process_id;
+ int view_id;
+ };
+ // (render process id, render view id)
+ static PropertyAccessor<RenderViewID>* GetInspectedViewInfoAccessor();
+
+ protected:
+ // WebContents overrides:
+ // We override updating history with a no-op so these pages
+ // are not saved to history.
+ virtual void UpdateHistoryForNavigation(
+ const GURL& url,
+ const ViewHostMsg_FrameNavigate_Params& params) { }
+
+ // Will notify just created renderer that it's going to host developer
+ // tools UI.
+ virtual void RendererCreated(RenderViewHost* render_view_host);
+
+ DISALLOW_COPY_AND_ASSIGN(ToolsContents);
+};
+
+#endif // CHROME_BROWSER_DEBUGGER_TOOLS_CONTENTS_H_
+
diff --git a/chrome/browser/debugger/tools_view.cc b/chrome/browser/debugger/tools_view.cc
new file mode 100644
index 0000000..c99720b
--- /dev/null
+++ b/chrome/browser/debugger/tools_view.cc
@@ -0,0 +1,92 @@
+// 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.
+
+#include "chrome/browser/debugger/tools_view.h"
+
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/debugger/tools_contents.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/web_contents.h"
+#include "chrome/browser/views/tab_contents_container_view.h"
+#include "chrome/common/property_bag.h"
+#include "chrome/common/render_messages.h"
+
+ToolsView::ToolsView(int inspected_process_id, int inspected_view_id)
+ : inspected_process_id_(inspected_process_id),
+ inspected_view_id_(inspected_view_id),
+ web_contents_(NULL) {
+ web_container_ = new TabContentsContainerView();
+ AddChildView(web_container_);
+}
+
+ToolsView::~ToolsView() {
+}
+
+void ToolsView::SendToolsClientMessage(int tools_message_type,
+ const std::wstring& body) {
+ if (!web_contents_) {
+ NOTREACHED();
+ return;
+ }
+ int routing_id = web_contents_->render_view_host()->routing_id();
+ web_contents_->render_view_host()->Send(
+ new ViewMsg_ToolsClientMsg(routing_id, tools_message_type, body));
+}
+
+std::string ToolsView::GetClassName() const {
+ return "ToolsView";
+}
+
+gfx::Size ToolsView::GetPreferredSize() {
+ return gfx::Size(700, 400);
+}
+
+void ToolsView::Layout() {
+ web_container_->SetBounds(0, 0, width(), height());
+}
+
+void ToolsView::ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child) {
+ if (is_add && child == this) {
+ DCHECK(GetWidget());
+ Init();
+ }
+}
+
+void ToolsView::Init() {
+ // We can't create the WebContents until we've actually been put into a real
+ // view hierarchy somewhere.
+ Profile* profile = BrowserList::GetLastActive()->profile();
+
+ TabContents* tc = TabContents::CreateWithType(TAB_CONTENTS_TOOLS, profile,
+ NULL);
+ web_contents_ = tc->AsWebContents();
+ web_contents_->SetupController(profile);
+ web_contents_->set_delegate(this);
+ web_container_->SetTabContents(web_contents_);
+ web_contents_->render_view_host()->AllowDOMUIBindings();
+
+ ToolsContents::GetInspectedViewInfoAccessor()->SetProperty(
+ web_contents_->property_bag(),
+ ToolsContents::RenderViewID(inspected_process_id_, inspected_view_id_));
+
+ GURL contents("chrome-ui://inspector/debugger-oop.html");
+ // this will call CreateRenderView to create renderer process
+ web_contents_->controller()->LoadURL(contents, GURL(),
+ PageTransition::START_PAGE);
+}
+
+void ToolsView::OnWindowClosing() {
+ web_container_->SetTabContents(NULL); // detach last (and only) tab
+ web_contents_->CloseContents(); // destroy the tab and navigation controller
+}
+
+void ToolsView::OpenURLFromTab(TabContents* source,
+ const GURL& url, const GURL& referrer,
+ WindowOpenDisposition disposition,
+ PageTransition::Type transition) {
+ NOTREACHED();
+}
+
diff --git a/chrome/browser/debugger/tools_view.h b/chrome/browser/debugger/tools_view.h
new file mode 100644
index 0000000..8835f27
--- /dev/null
+++ b/chrome/browser/debugger/tools_view.h
@@ -0,0 +1,75 @@
+// 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 CHROME_BROWSER_DEBUGGER_TOOLS_VIEW_H_
+#define CHROME_BROWSER_DEBUGGER_TOOLS_VIEW_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/gfx/size.h"
+#include "chrome/browser/tab_contents/tab_contents_delegate.h"
+#include "chrome/views/view.h"
+
+class TabContentsContainerView;
+class WebContents;
+
+class ToolsView : public views::View,
+ public TabContentsDelegate {
+ public:
+ explicit ToolsView(int inspected_process_id, int inspected_view_id);
+ virtual ~ToolsView();
+
+ void SendToolsClientMessage(int tools_message_type, const std::wstring& body);
+
+ // Destroy content views when the window is closing.
+ void OnWindowClosing();
+
+ private:
+ // Overridden from TabContentsDelegate:
+ virtual void NavigationStateChanged(const TabContents* source,
+ unsigned changed_flags) {}
+ virtual void ReplaceContents(TabContents* source,
+ TabContents* new_contents) {}
+ virtual void AddNewContents(TabContents* source,
+ TabContents* new_contents,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture) {}
+ virtual void ActivateContents(TabContents* contents) {}
+ virtual void LoadingStateChanged(TabContents* source) {}
+ virtual void CloseContents(TabContents* source) {}
+ virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
+ virtual bool IsPopup(TabContents* source) { return false; }
+ virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {}
+ virtual void URLStarredChanged(TabContents* source, bool) {}
+ virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
+ virtual bool CanBlur() const { return false; }
+ // Opens a new URL inside the passed in TabContents, if source is 0 open
+ // in the current front-most tab.
+ virtual void OpenURLFromTab(TabContents* source,
+ const GURL& url, const GURL& referrer,
+ WindowOpenDisposition disposition,
+ PageTransition::Type transition);
+
+ // Overridden from views::View:
+ virtual std::string GetClassName() const;
+ virtual gfx::Size GetPreferredSize();
+ virtual void Layout();
+ virtual void ViewHierarchyChanged(bool is_add,
+ views::View* parent,
+ views::View* child);
+
+ void Init();
+
+ const int inspected_process_id_;
+ const int inspected_view_id_;
+ WebContents* web_contents_;
+ TabContentsContainerView* web_container_;
+
+ DISALLOW_COPY_AND_ASSIGN(ToolsView);
+};
+
+#endif // CHROME_BROWSER_DEBUGGER_TOOLS_VIEW_H_
+
diff --git a/chrome/browser/debugger/tools_window.cc b/chrome/browser/debugger/tools_window.cc
new file mode 100644
index 0000000..e87578e
--- /dev/null
+++ b/chrome/browser/debugger/tools_window.cc
@@ -0,0 +1,54 @@
+// 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.
+
+#include "chrome/browser/debugger/tools_window.h"
+
+#include "chrome/browser/debugger/tools_view.h"
+#include "chrome/views/window.h"
+
+ToolsWindow::ToolsWindow() : window_(NULL), tools_view_(NULL) {
+}
+
+ToolsWindow::~ToolsWindow() {
+}
+
+void ToolsWindow::Show(int inspected_process_id,
+ int inspected_view_id) {
+ if (window_) {
+ window_->Show();
+ return;
+ }
+
+ tools_view_ = new ToolsView(inspected_process_id, inspected_view_id);
+ window_ = views::Window::CreateChromeWindow(NULL, gfx::Rect(), this);
+ window_->Show();
+}
+
+void ToolsWindow::SendToolsClientMessage(int tools_message_type,
+ const std::wstring& body) {
+ if (!tools_view_)
+ return;
+ tools_view_->SendToolsClientMessage(tools_message_type, body);
+}
+
+std::wstring ToolsWindow::GetWindowTitle() const {
+ return L"Developer Tools";
+}
+
+void ToolsWindow::WindowClosing() {
+ if (tools_view_) {
+ tools_view_->OnWindowClosing();
+ tools_view_ = NULL;
+ window_ = NULL;
+ }
+}
+
+bool ToolsWindow::CanResize() const {
+ return true;
+}
+
+views::View* ToolsWindow::GetContentsView() {
+ return tools_view_;
+}
+
diff --git a/chrome/browser/debugger/tools_window.h b/chrome/browser/debugger/tools_window.h
new file mode 100644
index 0000000..8b70710
--- /dev/null
+++ b/chrome/browser/debugger/tools_window.h
@@ -0,0 +1,44 @@
+// 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 CHROME_BROWSER_DEBUGGER_TOOLS_WINDOW_H_
+#define CHROME_BROWSER_DEBUGGER_TOOLS_WINDOW_H_
+
+#include "base/basictypes.h"
+
+#include "chrome/views/window_delegate.h"
+
+namespace views {
+class Window;
+}
+class ToolsView;
+class TabContents;
+
+class ToolsWindow : public views::WindowDelegate {
+ public:
+ ToolsWindow();
+ virtual ~ToolsWindow();
+
+ // Show inspector window for the tab
+ void Show(int inspected_process_id,
+ int inspected_view_id);
+
+ void SendToolsClientMessage(int tools_message_type,
+ const std::wstring& body);
+
+ private:
+ // views::WindowDelegate methods:
+ virtual std::wstring GetWindowTitle() const;
+ virtual void WindowClosing();
+ virtual bool CanResize() const;
+ virtual views::View* GetContentsView();
+
+ views::Window* window_;
+ ToolsView* tools_view_;
+
+ DISALLOW_COPY_AND_ASSIGN(ToolsWindow);
+};
+
+#endif // CHROME_BROWSER_DEBUGGER_TOOLS_WINDOW_H_
+
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index ae84b8f..62a305f 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -96,7 +96,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)
@@ -582,6 +584,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 +744,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 +1185,23 @@ void RenderViewHost::DidDebugAttach() {
}
}
+void RenderViewHost::OnToolsAgentMsg(int tools_message_type,
+ const std::wstring& body) {
+ RenderViewHost* host = RenderViewHost::FromID(inspected_process_id_,
+ inspected_view_id_);
+ 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) {
+ RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
+ if (view)
+ view->ForwardMessageToToolsClient(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 15d0c6f..c6bab37 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;
@@ -320,6 +321,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 +512,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,7 +569,7 @@ 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_;
// True if we've been told to set up the the Javascript bindings for
@@ -610,6 +618,10 @@ class RenderViewHost : public RenderWidgetHost {
bool are_javascript_messages_suppressed_;
+ int inspected_process_id_;
+
+ int inspected_view_id_;
+
DISALLOW_EVIL_CONSTRUCTORS(RenderViewHost);
};
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h
index 7cfe6f9..5623b57 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.h
+++ b/chrome/browser/renderer_host/render_view_host_delegate.h
@@ -119,6 +119,11 @@ class RenderViewHostDelegate {
const gfx::Rect& selection_rect,
int active_match_ordinal,
bool final_update) = 0;
+
+ // Forwards message to ToolsClient in developer tools window open for this
+ // page.
+ virtual void ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body) = 0;
};
// Interface for saving web pages.
diff --git a/chrome/browser/tab_contents/tab_contents_factory.cc b/chrome/browser/tab_contents/tab_contents_factory.cc
index e6aa1a2..50031b1 100644
--- a/chrome/browser/tab_contents/tab_contents_factory.cc
+++ b/chrome/browser/tab_contents/tab_contents_factory.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/debugger/debugger_contents.h"
+#include "chrome/browser/debugger/tools_contents.h"
#include "chrome/browser/tab_contents/tab_contents_factory.h"
#include "chrome/browser/tab_contents/view_source_contents.h"
#include "chrome/browser/tab_contents/web_contents.h"
@@ -70,6 +71,9 @@ TabContents* TabContents::CreateWithType(TabContentsType type,
case TAB_CONTENTS_DEBUGGER:
contents = new DebuggerContents(profile, instance);
break;
+ case TAB_CONTENTS_TOOLS:
+ contents = new ToolsContents(profile, instance);
+ break;
case TAB_CONTENTS_DOM_UI:
contents = new DOMUIContents(profile, instance, NULL);
break;
@@ -120,6 +124,9 @@ TabContentsType TabContents::TypeForURL(GURL* url) {
if (DebuggerContents::IsDebuggerUrl(*url))
return TAB_CONTENTS_DEBUGGER;
+ if (ToolsContents::IsToolsUrl(*url))
+ return TAB_CONTENTS_TOOLS;
+
if (url->SchemeIs(DOMUIContents::GetScheme().c_str()))
return TAB_CONTENTS_DOM_UI;
diff --git a/chrome/browser/tab_contents/tab_contents_type.h b/chrome/browser/tab_contents/tab_contents_type.h
index 87cd6452..6a8afd9 100644
--- a/chrome/browser/tab_contents/tab_contents_type.h
+++ b/chrome/browser/tab_contents/tab_contents_type.h
@@ -21,6 +21,7 @@ enum TabContentsType {
TAB_CONTENTS_ABOUT_UI,
TAB_CONTENTS_DEBUGGER,
TAB_CONTENTS_DOM_UI,
+ TAB_CONTENTS_TOOLS,
TAB_CONTENTS_NUM_TYPES
};
diff --git a/chrome/browser/tab_contents/web_contents_view.h b/chrome/browser/tab_contents/web_contents_view.h
index 4bf8dca..f286776 100644
--- a/chrome/browser/tab_contents/web_contents_view.h
+++ b/chrome/browser/tab_contents/web_contents_view.h
@@ -108,6 +108,14 @@ class WebContentsView : public RenderViewHostDelegate::View {
// RenderWidgetHost is deleted. Removes |host| from internal maps.
void RenderWidgetHostDestroyed(RenderWidgetHost* host);
+ // Opens developer tools window for the page.
+ virtual void OpenDeveloperTools() = 0;
+
+ // Forwards message to ToolsClient in developer tools window open for this
+ // page.
+ virtual void ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body) = 0;
+
// Find in page --------------------------------------------------------------
// Opens the find in page window if it isn't already open. It will advance to
diff --git a/chrome/browser/tab_contents/web_contents_view_gtk.cc b/chrome/browser/tab_contents/web_contents_view_gtk.cc
index 22b450f..41d5033 100644
--- a/chrome/browser/tab_contents/web_contents_view_gtk.cc
+++ b/chrome/browser/tab_contents/web_contents_view_gtk.cc
@@ -77,6 +77,15 @@ void WebContentsViewGtk::SizeContents(const gfx::Size& size) {
NOTIMPLEMENTED();
}
+void WebContentsViewGtk::OpenDeveloperTools() {
+ NOTIMPLEMENTED();
+}
+
+void WebContentsViewGtk::ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body) {
+ NOTIMPLEMENTED();
+}
+
void WebContentsViewGtk::FindInPage(const Browser& browser,
bool find_next, bool forward_direction) {
NOTIMPLEMENTED();
diff --git a/chrome/browser/tab_contents/web_contents_view_gtk.h b/chrome/browser/tab_contents/web_contents_view_gtk.h
index a4273f5..2bd347e 100644
--- a/chrome/browser/tab_contents/web_contents_view_gtk.h
+++ b/chrome/browser/tab_contents/web_contents_view_gtk.h
@@ -30,6 +30,9 @@ class WebContentsViewGtk : public WebContentsView {
virtual void SetPageTitle(const std::wstring& title);
virtual void Invalidate();
virtual void SizeContents(const gfx::Size& size);
+ virtual void OpenDeveloperTools();
+ virtual void ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body);
virtual void FindInPage(const Browser& browser,
bool find_next, bool forward_direction);
virtual void HideFindBar(bool end_session);
diff --git a/chrome/browser/tab_contents/web_contents_view_mac.h b/chrome/browser/tab_contents/web_contents_view_mac.h
index d576605..26d59f3 100644
--- a/chrome/browser/tab_contents/web_contents_view_mac.h
+++ b/chrome/browser/tab_contents/web_contents_view_mac.h
@@ -46,6 +46,9 @@ class WebContentsViewMac : public WebContentsView,
virtual void SetPageTitle(const std::wstring& title);
virtual void Invalidate();
virtual void SizeContents(const gfx::Size& size);
+ virtual void OpenDeveloperTools();
+ virtual void ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body);
virtual void FindInPage(const Browser& browser,
bool find_next, bool forward_direction);
virtual void HideFindBar(bool end_session);
diff --git a/chrome/browser/tab_contents/web_contents_view_mac.mm b/chrome/browser/tab_contents/web_contents_view_mac.mm
index ba80b54..5275993 100644
--- a/chrome/browser/tab_contents/web_contents_view_mac.mm
+++ b/chrome/browser/tab_contents/web_contents_view_mac.mm
@@ -99,6 +99,15 @@ void WebContentsViewMac::SizeContents(const gfx::Size& size) {
NOTIMPLEMENTED(); // Leaving the hack unimplemented.
}
+void WebContentsViewMac::OpenDeveloperTools() {
+ NOTIMPLEMENTED();
+}
+
+void WebContentsViewMac::ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body) {
+ NOTIMPLEMENTED();
+}
+
void WebContentsViewMac::FindInPage(const Browser& browser,
bool find_next, bool forward_direction) {
if (!find_bar_.get()) {
diff --git a/chrome/browser/tab_contents/web_contents_view_win.cc b/chrome/browser/tab_contents/web_contents_view_win.cc
index 9728ec8..be41930 100644
--- a/chrome/browser/tab_contents/web_contents_view_win.cc
+++ b/chrome/browser/tab_contents/web_contents_view_win.cc
@@ -9,6 +9,7 @@
#include "chrome/browser/bookmarks/bookmark_drag_data.h"
#include "chrome/browser/browser.h" // TODO(beng): this dependency is awful.
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/debugger/tools_window.h"
#include "chrome/browser/download/download_request_manager.h"
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/renderer_host/render_view_host.h"
@@ -216,6 +217,26 @@ void WebContentsViewWin::SizeContents(const gfx::Size& size) {
WasSized(size);
}
+void WebContentsViewWin::OpenDeveloperTools() {
+ if (!tools_window_.get())
+ tools_window_.reset(new ToolsWindow);
+
+ RenderViewHost* host = web_contents_->render_view_host();
+ if (!host)
+ return;
+
+ tools_window_->Show(host->process()->host_id(), host->routing_id());
+}
+
+void WebContentsViewWin::ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body) {
+ if (!tools_window_.get()) {
+ NOTREACHED() << "Developer tools window is not open.";
+ return;
+ }
+ tools_window_->SendToolsClientMessage(tools_message_type, body);
+}
+
void WebContentsViewWin::FindInPage(const Browser& browser,
bool find_next, bool forward_direction) {
if (!find_bar_.get()) {
diff --git a/chrome/browser/tab_contents/web_contents_view_win.h b/chrome/browser/tab_contents/web_contents_view_win.h
index a8649d7..2c80eaf 100644
--- a/chrome/browser/tab_contents/web_contents_view_win.h
+++ b/chrome/browser/tab_contents/web_contents_view_win.h
@@ -12,6 +12,7 @@
class FindBarWin;
class SadTabView;
+class ToolsWindow;
struct WebDropData;
class WebDropTarget;
@@ -40,6 +41,9 @@ class WebContentsViewWin : public WebContentsView,
virtual void SetPageTitle(const std::wstring& title);
virtual void Invalidate();
virtual void SizeContents(const gfx::Size& size);
+ virtual void OpenDeveloperTools();
+ virtual void ForwardMessageToToolsClient(int tools_message_type,
+ const std::wstring& body);
virtual void FindInPage(const Browser& browser,
bool find_next, bool forward_direction);
virtual void HideFindBar(bool end_session);
@@ -108,6 +112,9 @@ class WebContentsViewWin : public WebContentsView,
WebContents* web_contents_;
+ // Allows to show exactly one developer tools window for this page.
+ scoped_ptr<ToolsWindow> tools_window_;
+
// For find in page. This may be NULL if there is no find bar, and if it is
// non-NULL, it may or may not be visible.
scoped_ptr<FindBarWin> find_bar_;