blob: 2f7bddc3fa6c78373e562209eef20af46d1297d1 [file] [log] [blame] [edit]
// Copyright (c) 2012 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_DEVTOOLS_WINDOW_H_
#define CHROME_BROWSER_DEBUGGER_DEVTOOLS_WINDOW_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/debugger/devtools_file_helper.h"
#include "chrome/browser/debugger/devtools_toggle_action.h"
#include "content/public/browser/devtools_client_host.h"
#include "content/public/browser/devtools_frontend_host_delegate.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/web_contents_delegate.h"
namespace IPC {
class Message;
}
class Browser;
class BrowserWindow;
class PrefService;
class Profile;
class TabContents;
namespace base {
class Value;
}
namespace content {
class DevToolsAgentHost;
class DevToolsClientHost;
struct FileChooserParams;
class RenderViewHost;
class WebContents;
}
class DevToolsWindow : private content::NotificationObserver,
private content::WebContentsDelegate,
private content::DevToolsFrontendHostDelegate,
private DevToolsFileHelper::Delegate {
public:
static const char kDevToolsApp[];
static void RegisterUserPrefs(PrefService* prefs);
static TabContents* GetDevToolsContents(content::WebContents* inspected_tab);
static bool IsDevToolsWindow(content::RenderViewHost* window_rvh);
static DevToolsWindow* OpenDevToolsWindowForWorker(
Profile* profile,
content::DevToolsAgentHost* worker_agent);
static DevToolsWindow* CreateDevToolsWindowForWorker(Profile* profile);
static DevToolsWindow* OpenDevToolsWindow(
content::RenderViewHost* inspected_rvh);
static DevToolsWindow* ToggleDevToolsWindow(
Browser* browser,
DevToolsToggleAction action);
// Exposed for testing, normal clients should not use this method.
static DevToolsWindow* ToggleDevToolsWindow(
content::RenderViewHost* inspected_rvh,
bool force_open,
DevToolsToggleAction action);
static void InspectElement(
content::RenderViewHost* inspected_rvh, int x, int y);
virtual ~DevToolsWindow();
// Overridden from DevToolsClientHost.
virtual void InspectedContentsClosing() OVERRIDE;
virtual void ContentsReplaced(content::WebContents* new_contents) OVERRIDE;
content::RenderViewHost* GetRenderViewHost();
void Show(DevToolsToggleAction action);
TabContents* tab_contents() { return tab_contents_; }
Browser* browser() { return browser_; } // For tests.
bool is_docked() { return docked_; }
content::DevToolsClientHost* devtools_client_host() {
return frontend_host_;
}
private:
static DevToolsWindow* Create(Profile* profile,
content::RenderViewHost* inspected_rvh,
bool docked, bool shared_worker_frontend);
DevToolsWindow(TabContents* tab_contents, Profile* profile,
content::RenderViewHost* inspected_rvh, bool docked);
void CreateDevToolsBrowser();
bool FindInspectedBrowserAndTabIndex(Browser**, int* tab);
BrowserWindow* GetInspectedBrowserWindow();
bool IsInspectedBrowserPopupOrPanel();
void UpdateFrontendAttachedState();
// Overridden from content::NotificationObserver.
virtual void Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) OVERRIDE;
void ScheduleAction(DevToolsToggleAction action);
void DoAction();
static GURL GetDevToolsUrl(Profile* profile, bool docked,
bool shared_worker_frontend);
void UpdateTheme();
void AddDevToolsExtensionsToClient();
void CallClientFunction(const std::string& function_name,
const base::Value* arg);
// Overridden from content::WebContentsDelegate.
virtual content::WebContents* OpenURLFromTab(
content::WebContents* source,
const content::OpenURLParams& params) OVERRIDE;
virtual void AddNewContents(content::WebContents* source,
content::WebContents* new_contents,
WindowOpenDisposition disposition,
const gfx::Rect& initial_pos,
bool user_gesture,
bool* was_blocked) OVERRIDE;
virtual void CloseContents(content::WebContents* source) OVERRIDE {}
virtual bool PreHandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) OVERRIDE;
virtual void HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) OVERRIDE;
virtual content::JavaScriptDialogCreator*
GetJavaScriptDialogCreator() OVERRIDE;
virtual void RunFileChooser(
content::WebContents* web_contents,
const content::FileChooserParams& params) OVERRIDE;
virtual void FrameNavigating(const std::string& url) OVERRIDE {}
static DevToolsWindow* AsDevToolsWindow(content::DevToolsClientHost*);
static DevToolsWindow* AsDevToolsWindow(content::RenderViewHost*);
// content::DevToolsClientHandlerDelegate overrides.
virtual void ActivateWindow() OVERRIDE;
virtual void CloseWindow() OVERRIDE;
virtual void MoveWindow(int x, int y) OVERRIDE;
virtual void DockWindow() OVERRIDE;
virtual void UndockWindow() OVERRIDE;
virtual void SetDockSide(const std::string& side) OVERRIDE;
virtual void OpenInNewTab(const std::string& url) OVERRIDE;
virtual void SaveToFile(const std::string& url,
const std::string& content,
bool save_as) OVERRIDE;
virtual void AppendToFile(const std::string& url,
const std::string& content) OVERRIDE;
// Overridden from DevToolsFileHelper::Delegate
virtual void FileSavedAs(const std::string& url) OVERRIDE;
virtual void AppendedTo(const std::string& url) OVERRIDE;
void RequestSetDocked(bool docked);
void UpdateBrowserToolbar();
Profile* profile_;
TabContents* inspected_tab_;
TabContents* tab_contents_;
Browser* browser_;
bool docked_;
bool is_loaded_;
DevToolsToggleAction action_on_load_;
content::NotificationRegistrar registrar_;
content::DevToolsClientHost* frontend_host_;
scoped_ptr<DevToolsFileHelper> file_helper_;
DISALLOW_COPY_AND_ASSIGN(DevToolsWindow);
};
#endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_WINDOW_H_