diff options
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_; |