// Copyright 2014 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_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_ #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_ #include #include #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/strings/string16.h" #include "chrome/browser/devtools/device/devtools_android_bridge.h" #include "chrome/browser/devtools/devtools_embedder_message_dispatcher.h" #include "chrome/browser/devtools/devtools_file_helper.h" #include "chrome/browser/devtools/devtools_file_system_indexer.h" #include "chrome/browser/devtools/devtools_targets_ui.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_frontend_host.h" #include "net/url_request/url_fetcher_delegate.h" #include "ui/gfx/geometry/size.h" class DevToolsAndroidBridge; class InfoBarService; class Profile; namespace content { struct FileChooserParams; class WebContents; } // Base implementation of DevTools bindings around front-end. class DevToolsUIBindings :public content::DevToolsFrontendHost::Delegate, public DevToolsEmbedderMessageDispatcher::Delegate, public DevToolsAndroidBridge::DeviceCountListener, public content::DevToolsAgentHostClient, public net::URLFetcherDelegate { public: static DevToolsUIBindings* ForWebContents( content::WebContents* web_contents); class Delegate { public: virtual ~Delegate() {} virtual void ActivateWindow() = 0; virtual void CloseWindow() = 0; virtual void SetInspectedPageBounds(const gfx::Rect& rect) = 0; virtual void InspectElementCompleted() = 0; virtual void SetIsDocked(bool is_docked) = 0; virtual void OpenInNewTab(const std::string& url) = 0; virtual void SetWhitelistedShortcuts(const std::string& message) = 0; virtual void InspectedContentsClosing() = 0; virtual void OnLoadCompleted() = 0; virtual InfoBarService* GetInfoBarService() = 0; virtual void RenderProcessGone(bool crashed) = 0; }; explicit DevToolsUIBindings(content::WebContents* web_contents); ~DevToolsUIBindings() override; content::WebContents* web_contents() { return web_contents_; } Profile* profile() { return profile_; } content::DevToolsAgentHost* agent_host() { return agent_host_.get(); } // Takes ownership over the |delegate|. void SetDelegate(Delegate* delegate); void CallClientFunction(const std::string& function_name, const base::Value* arg1, const base::Value* arg2, const base::Value* arg3); void AttachTo(const scoped_refptr& agent_host); void Reattach(); void Detach(); bool IsAttachedTo(content::DevToolsAgentHost* agent_host); private: // content::DevToolsFrontendHost::Delegate implementation. void HandleMessageFromDevToolsFrontend(const std::string& message) override; void HandleMessageFromDevToolsFrontendToBackend( const std::string& message) override; // content::DevToolsAgentHostClient implementation. void DispatchProtocolMessage(content::DevToolsAgentHost* agent_host, const std::string& message) override; void AgentHostClosed(content::DevToolsAgentHost* agent_host, bool replaced_with_another_client) override; // DevToolsEmbedderMessageDispatcher::Delegate implementation. void ActivateWindow() override; void CloseWindow() override; void LoadCompleted() override; void SetInspectedPageBounds(const gfx::Rect& rect) override; void InspectElementCompleted() override; void InspectedURLChanged(const std::string& url) override; void LoadNetworkResource(const DispatchCallback& callback, const std::string& url, const std::string& headers, int stream_id) override; void SetIsDocked(const DispatchCallback& callback, bool is_docked) override; void OpenInNewTab(const std::string& url) override; void SaveToFile(const std::string& url, const std::string& content, bool save_as) override; void AppendToFile(const std::string& url, const std::string& content) override; void RequestFileSystems() override; void AddFileSystem() override; void RemoveFileSystem(const std::string& file_system_path) override; void UpgradeDraggedFileSystemPermissions( const std::string& file_system_url) override; void IndexPath(int index_request_id, const std::string& file_system_path) override; void StopIndexing(int index_request_id) override; void SearchInPath(int search_request_id, const std::string& file_system_path, const std::string& query) override; void SetWhitelistedShortcuts(const std::string& message) override; void ZoomIn() override; void ZoomOut() override; void ResetZoom() override; void SetDevicesUpdatesEnabled(bool enabled) override; void SendMessageToBrowser(const std::string& message) override; void RecordEnumeratedHistogram(const std::string& name, int sample, int boundary_value) override; void SendJsonRequest(const DispatchCallback& callback, const std::string& browser_id, const std::string& url) override; void GetPreferences(const DispatchCallback& callback) override; void SetPreference(const std::string& name, const std::string& value) override; void RemovePreference(const std::string& name) override; void ClearPreferences() override; // net::URLFetcherDelegate overrides. void OnURLFetchComplete(const net::URLFetcher* source) override; void EnableRemoteDeviceCounter(bool enable); void SendMessageAck(int request_id, const base::Value* arg1); // DevToolsAndroidBridge::DeviceCountListener override: void DeviceCountChanged(int count) override; // Forwards discovered devices to frontend. virtual void DevicesUpdated(const std::string& source, const base::ListValue& targets); void DocumentOnLoadCompletedInMainFrame(); void DidNavigateMainFrame(); void FrontendLoaded(); void JsonReceived(const DispatchCallback& callback, int result, const std::string& message); // DevToolsFileHelper callbacks. void FileSavedAs(const std::string& url); void CanceledFileSaveAs(const std::string& url); void AppendedTo(const std::string& url); void FileSystemsLoaded( const std::vector& file_systems); void FileSystemAdded(const DevToolsFileHelper::FileSystem& file_system); void IndexingTotalWorkCalculated(int request_id, const std::string& file_system_path, int total_work); void IndexingWorked(int request_id, const std::string& file_system_path, int worked); void IndexingDone(int request_id, const std::string& file_system_path); void SearchCompleted(int request_id, const std::string& file_system_path, const std::vector& file_paths); typedef base::Callback InfoBarCallback; void ShowDevToolsConfirmInfoBar(const base::string16& message, const InfoBarCallback& callback); // Extensions support. void AddDevToolsExtensionsToClient(); class FrontendWebContentsObserver; friend class FrontendWebContentsObserver; scoped_ptr frontend_contents_observer_; Profile* profile_; DevToolsAndroidBridge* android_bridge_; content::WebContents* web_contents_; scoped_ptr delegate_; scoped_refptr agent_host_; scoped_ptr frontend_host_; scoped_ptr file_helper_; scoped_refptr file_system_indexer_; typedef std::map< int, scoped_refptr > IndexingJobsMap; IndexingJobsMap indexing_jobs_; bool devices_updates_enabled_; bool frontend_loaded_; scoped_ptr remote_targets_handler_; scoped_ptr embedder_message_dispatcher_; GURL url_; using PendingRequestsMap = std::map; PendingRequestsMap pending_requests_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(DevToolsUIBindings); }; #endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_UI_BINDINGS_H_