diff options
author | yurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-20 11:14:55 +0000 |
---|---|---|
committer | yurys@google.com <yurys@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-20 11:14:55 +0000 |
commit | 5e1ce07a5f99e59bfe961c70e1d5cc2bf8f4fd86 (patch) | |
tree | c311ca8cfad3579e526aa6e8f97b6aff0b68ccdc /chrome | |
parent | a10c64530127a1e735b8e7a0d4eb8351e3ef65d2 (diff) | |
download | chromium_src-5e1ce07a5f99e59bfe961c70e1d5cc2bf8f4fd86.zip chromium_src-5e1ce07a5f99e59bfe961c70e1d5cc2bf8f4fd86.tar.gz chromium_src-5e1ce07a5f99e59bfe961c70e1d5cc2bf8f4fd86.tar.bz2 |
Add tab content type for developer tools UI.
Add code routing messages between ToolsAgent and ToolsClient in the browser process.
There is no direct IPC channel between inspected process and developer tools UI so all messages have to be routed through the 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.
(darin: tools message representation will be later changed from id+string to just IPC::Message)
Review URL: http://codereview.chromium.org/21510
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10090 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
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_; |