Home | History | Annotate | Download | only in devtools
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_
      6 #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/strings/string16.h"
     15 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
     16 #include "chrome/browser/devtools/devtools_embedder_message_dispatcher.h"
     17 #include "chrome/browser/devtools/devtools_file_helper.h"
     18 #include "chrome/browser/devtools/devtools_file_system_indexer.h"
     19 #include "chrome/browser/devtools/devtools_targets_ui.h"
     20 #include "content/public/browser/devtools_agent_host.h"
     21 #include "content/public/browser/devtools_frontend_host.h"
     22 #include "content/public/browser/notification_observer.h"
     23 #include "content/public/browser/notification_registrar.h"
     24 #include "ui/gfx/size.h"
     25 
     26 class InfoBarService;
     27 class Profile;
     28 
     29 namespace content {
     30 struct FileChooserParams;
     31 class WebContents;
     32 }
     33 
     34 // Base implementation of DevTools bindings around front-end.
     35 class DevToolsUIBindings : public content::NotificationObserver,
     36                            public content::DevToolsFrontendHost::Delegate,
     37                            public DevToolsEmbedderMessageDispatcher::Delegate,
     38                            public DevToolsAndroidBridge::DeviceCountListener,
     39                            public content::DevToolsAgentHostClient {
     40  public:
     41   static DevToolsUIBindings* ForWebContents(
     42       content::WebContents* web_contents);
     43   static GURL ApplyThemeToURL(Profile* profile, const GURL& base_url);
     44 
     45   class Delegate {
     46    public:
     47     virtual ~Delegate() {}
     48     virtual void ActivateWindow() = 0;
     49     virtual void CloseWindow() = 0;
     50     virtual void SetInspectedPageBounds(const gfx::Rect& rect) = 0;
     51     virtual void InspectElementCompleted() = 0;
     52     virtual void MoveWindow(int x, int y) = 0;
     53     virtual void SetIsDocked(bool is_docked) = 0;
     54     virtual void OpenInNewTab(const std::string& url) = 0;
     55     virtual void SetWhitelistedShortcuts(const std::string& message) = 0;
     56 
     57     virtual void InspectedContentsClosing() = 0;
     58     virtual void OnLoadCompleted() = 0;
     59     virtual InfoBarService* GetInfoBarService() = 0;
     60     virtual void RenderProcessGone() = 0;
     61   };
     62 
     63   explicit DevToolsUIBindings(content::WebContents* web_contents);
     64   virtual ~DevToolsUIBindings();
     65 
     66   content::WebContents* web_contents() { return web_contents_; }
     67   Profile* profile() { return profile_; }
     68   content::DevToolsAgentHost* agent_host() { return agent_host_.get(); }
     69 
     70   // Takes ownership over the |delegate|.
     71   void SetDelegate(Delegate* delegate);
     72   void CallClientFunction(const std::string& function_name,
     73                           const base::Value* arg1,
     74                           const base::Value* arg2,
     75                           const base::Value* arg3);
     76   void AttachTo(const scoped_refptr<content::DevToolsAgentHost>& agent_host);
     77   void Reattach();
     78   void Detach();
     79   bool IsAttachedTo(content::DevToolsAgentHost* agent_host);
     80 
     81  private:
     82   // content::NotificationObserver overrides.
     83   virtual void Observe(int type,
     84                        const content::NotificationSource& source,
     85                        const content::NotificationDetails& details) OVERRIDE;
     86 
     87   // content::DevToolsFrontendHost::Delegate implementation.
     88   virtual void HandleMessageFromDevToolsFrontend(
     89       const std::string& message) OVERRIDE;
     90   virtual void HandleMessageFromDevToolsFrontendToBackend(
     91       const std::string& message) OVERRIDE;
     92 
     93   // content::DevToolsAgentHostClient implementation.
     94   virtual void DispatchProtocolMessage(
     95       content::DevToolsAgentHost* agent_host,
     96       const std::string& message) OVERRIDE;
     97   virtual void AgentHostClosed(
     98        content::DevToolsAgentHost* agent_host,
     99        bool replaced_with_another_client) OVERRIDE;
    100 
    101   // DevToolsEmbedderMessageDispatcher::Delegate implementation.
    102   virtual void ActivateWindow() OVERRIDE;
    103   virtual void CloseWindow() OVERRIDE;
    104   virtual void SetInspectedPageBounds(const gfx::Rect& rect) OVERRIDE;
    105   virtual void InspectElementCompleted() OVERRIDE;
    106   virtual void InspectedURLChanged(const std::string& url) OVERRIDE;
    107   virtual void MoveWindow(int x, int y) OVERRIDE;
    108   virtual void SetIsDocked(bool is_docked) OVERRIDE;
    109   virtual void OpenInNewTab(const std::string& url) OVERRIDE;
    110   virtual void SaveToFile(const std::string& url,
    111                           const std::string& content,
    112                           bool save_as) OVERRIDE;
    113   virtual void AppendToFile(const std::string& url,
    114                             const std::string& content) OVERRIDE;
    115   virtual void RequestFileSystems() OVERRIDE;
    116   virtual void AddFileSystem() OVERRIDE;
    117   virtual void RemoveFileSystem(const std::string& file_system_path) OVERRIDE;
    118   virtual void UpgradeDraggedFileSystemPermissions(
    119       const std::string& file_system_url) OVERRIDE;
    120   virtual void IndexPath(int request_id,
    121                          const std::string& file_system_path) OVERRIDE;
    122   virtual void StopIndexing(int request_id) OVERRIDE;
    123   virtual void SearchInPath(int request_id,
    124                             const std::string& file_system_path,
    125                             const std::string& query) OVERRIDE;
    126   virtual void SetWhitelistedShortcuts(const std::string& message) OVERRIDE;
    127   virtual void ZoomIn() OVERRIDE;
    128   virtual void ZoomOut() OVERRIDE;
    129   virtual void ResetZoom() OVERRIDE;
    130   virtual void OpenUrlOnRemoteDeviceAndInspect(const std::string& browser_id,
    131                                                const std::string& url) OVERRIDE;
    132   virtual void SetDeviceCountUpdatesEnabled(bool enabled) OVERRIDE;
    133   virtual void SetDevicesUpdatesEnabled(bool enabled) OVERRIDE;
    134   virtual void SendMessageToBrowser(const std::string& message) OVERRIDE;
    135 
    136   void EnableRemoteDeviceCounter(bool enable);
    137 
    138   // DevToolsAndroidBridge::DeviceCountListener override:
    139   virtual void DeviceCountChanged(int count) OVERRIDE;
    140 
    141   // Forwards discovered devices to frontend.
    142   virtual void DevicesUpdated(const std::string& source,
    143                               const base::ListValue& targets);
    144 
    145   void DocumentOnLoadCompletedInMainFrame();
    146 
    147   // DevToolsFileHelper callbacks.
    148   void FileSavedAs(const std::string& url);
    149   void CanceledFileSaveAs(const std::string& url);
    150   void AppendedTo(const std::string& url);
    151   void FileSystemsLoaded(
    152       const std::vector<DevToolsFileHelper::FileSystem>& file_systems);
    153   void FileSystemAdded(const DevToolsFileHelper::FileSystem& file_system);
    154   void IndexingTotalWorkCalculated(int request_id,
    155                                    const std::string& file_system_path,
    156                                    int total_work);
    157   void IndexingWorked(int request_id,
    158                       const std::string& file_system_path,
    159                       int worked);
    160   void IndexingDone(int request_id, const std::string& file_system_path);
    161   void SearchCompleted(int request_id,
    162                        const std::string& file_system_path,
    163                        const std::vector<std::string>& file_paths);
    164   typedef base::Callback<void(bool)> InfoBarCallback;
    165   void ShowDevToolsConfirmInfoBar(const base::string16& message,
    166                                   const InfoBarCallback& callback);
    167 
    168   // Theme and extensions support.
    169   void UpdateTheme();
    170   void AddDevToolsExtensionsToClient();
    171 
    172   class FrontendWebContentsObserver;
    173   friend class FrontendWebContentsObserver;
    174   scoped_ptr<FrontendWebContentsObserver> frontend_contents_observer_;
    175 
    176   Profile* profile_;
    177   content::WebContents* web_contents_;
    178   scoped_ptr<Delegate> delegate_;
    179   scoped_refptr<content::DevToolsAgentHost> agent_host_;
    180   content::NotificationRegistrar registrar_;
    181   scoped_ptr<content::DevToolsFrontendHost> frontend_host_;
    182   scoped_ptr<DevToolsFileHelper> file_helper_;
    183   scoped_refptr<DevToolsFileSystemIndexer> file_system_indexer_;
    184   typedef std::map<
    185       int,
    186       scoped_refptr<DevToolsFileSystemIndexer::FileSystemIndexingJob> >
    187       IndexingJobsMap;
    188   IndexingJobsMap indexing_jobs_;
    189 
    190   bool device_count_updates_enabled_;
    191   bool devices_updates_enabled_;
    192   scoped_ptr<DevToolsTargetsUIHandler> remote_targets_handler_;
    193   scoped_ptr<DevToolsEmbedderMessageDispatcher> embedder_message_dispatcher_;
    194   GURL url_;
    195   base::WeakPtrFactory<DevToolsUIBindings> weak_factory_;
    196 
    197   DISALLOW_COPY_AND_ASSIGN(DevToolsUIBindings);
    198 };
    199 
    200 #endif  // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_
    201