1 // Copyright (c) 2012 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_EXTENSIONS_API_TABS_TABS_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_TABS_TABS_API_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/compiler_specific.h" 12 #include "chrome/browser/extensions/chrome_extension_function.h" 13 #include "chrome/browser/extensions/chrome_extension_function_details.h" 14 #include "chrome/browser/ui/zoom/zoom_controller.h" 15 #include "chrome/common/extensions/api/tabs.h" 16 #include "content/public/browser/notification_observer.h" 17 #include "content/public/browser/notification_registrar.h" 18 #include "extensions/browser/api/capture_web_contents_function.h" 19 #include "extensions/browser/api/execute_code_function.h" 20 #include "extensions/common/extension_resource.h" 21 #include "extensions/common/user_script.h" 22 #include "url/gurl.h" 23 24 class GURL; 25 class SkBitmap; 26 class TabStripModel; 27 28 namespace base { 29 class DictionaryValue; 30 } 31 32 namespace content { 33 class WebContents; 34 } 35 36 namespace ui { 37 class ListSelectionModel; 38 } 39 40 namespace user_prefs { 41 class PrefRegistrySyncable; 42 } 43 44 namespace extensions { 45 46 // Converts a ZoomMode to its ZoomSettings representation. 47 void ZoomModeToZoomSettings(ZoomController::ZoomMode zoom_mode, 48 api::tabs::ZoomSettings* zoom_settings); 49 50 // Windows 51 class WindowsGetFunction : public ChromeSyncExtensionFunction { 52 virtual ~WindowsGetFunction() {} 53 virtual bool RunSync() OVERRIDE; 54 DECLARE_EXTENSION_FUNCTION("windows.get", WINDOWS_GET) 55 }; 56 class WindowsGetCurrentFunction : public ChromeSyncExtensionFunction { 57 virtual ~WindowsGetCurrentFunction() {} 58 virtual bool RunSync() OVERRIDE; 59 DECLARE_EXTENSION_FUNCTION("windows.getCurrent", WINDOWS_GETCURRENT) 60 }; 61 class WindowsGetLastFocusedFunction : public ChromeSyncExtensionFunction { 62 virtual ~WindowsGetLastFocusedFunction() {} 63 virtual bool RunSync() OVERRIDE; 64 DECLARE_EXTENSION_FUNCTION("windows.getLastFocused", WINDOWS_GETLASTFOCUSED) 65 }; 66 class WindowsGetAllFunction : public ChromeSyncExtensionFunction { 67 virtual ~WindowsGetAllFunction() {} 68 virtual bool RunSync() OVERRIDE; 69 DECLARE_EXTENSION_FUNCTION("windows.getAll", WINDOWS_GETALL) 70 }; 71 class WindowsCreateFunction : public ChromeSyncExtensionFunction { 72 virtual ~WindowsCreateFunction() {} 73 virtual bool RunSync() OVERRIDE; 74 // Returns whether the window should be created in incognito mode. 75 // |create_data| are the options passed by the extension. It may be NULL. 76 // |urls| is the list of urls to open. If we are creating an incognito window, 77 // the function will remove these urls which may not be opened in incognito 78 // mode. If window creation leads the browser into an erroneous state, 79 // |is_error| is set to true (also, error_ member variable is assigned 80 // the proper error message). 81 bool ShouldOpenIncognitoWindow( 82 const api::windows::Create::Params::CreateData* create_data, 83 std::vector<GURL>* urls, 84 bool* is_error); 85 DECLARE_EXTENSION_FUNCTION("windows.create", WINDOWS_CREATE) 86 }; 87 class WindowsUpdateFunction : public ChromeSyncExtensionFunction { 88 virtual ~WindowsUpdateFunction() {} 89 virtual bool RunSync() OVERRIDE; 90 DECLARE_EXTENSION_FUNCTION("windows.update", WINDOWS_UPDATE) 91 }; 92 class WindowsRemoveFunction : public ChromeSyncExtensionFunction { 93 virtual ~WindowsRemoveFunction() {} 94 virtual bool RunSync() OVERRIDE; 95 DECLARE_EXTENSION_FUNCTION("windows.remove", WINDOWS_REMOVE) 96 }; 97 98 // Tabs 99 class TabsGetFunction : public ChromeSyncExtensionFunction { 100 virtual ~TabsGetFunction() {} 101 virtual bool RunSync() OVERRIDE; 102 DECLARE_EXTENSION_FUNCTION("tabs.get", TABS_GET) 103 }; 104 class TabsGetCurrentFunction : public ChromeSyncExtensionFunction { 105 virtual ~TabsGetCurrentFunction() {} 106 virtual bool RunSync() OVERRIDE; 107 DECLARE_EXTENSION_FUNCTION("tabs.getCurrent", TABS_GETCURRENT) 108 }; 109 class TabsGetSelectedFunction : public ChromeSyncExtensionFunction { 110 virtual ~TabsGetSelectedFunction() {} 111 virtual bool RunSync() OVERRIDE; 112 DECLARE_EXTENSION_FUNCTION("tabs.getSelected", TABS_GETSELECTED) 113 }; 114 class TabsGetAllInWindowFunction : public ChromeSyncExtensionFunction { 115 virtual ~TabsGetAllInWindowFunction() {} 116 virtual bool RunSync() OVERRIDE; 117 DECLARE_EXTENSION_FUNCTION("tabs.getAllInWindow", TABS_GETALLINWINDOW) 118 }; 119 class TabsQueryFunction : public ChromeSyncExtensionFunction { 120 virtual ~TabsQueryFunction() {} 121 virtual bool RunSync() OVERRIDE; 122 DECLARE_EXTENSION_FUNCTION("tabs.query", TABS_QUERY) 123 }; 124 class TabsCreateFunction : public ChromeSyncExtensionFunction { 125 virtual ~TabsCreateFunction() {} 126 virtual bool RunSync() OVERRIDE; 127 DECLARE_EXTENSION_FUNCTION("tabs.create", TABS_CREATE) 128 }; 129 class TabsDuplicateFunction : public ChromeSyncExtensionFunction { 130 virtual ~TabsDuplicateFunction() {} 131 virtual bool RunSync() OVERRIDE; 132 DECLARE_EXTENSION_FUNCTION("tabs.duplicate", TABS_DUPLICATE) 133 }; 134 class TabsHighlightFunction : public ChromeSyncExtensionFunction { 135 virtual ~TabsHighlightFunction() {} 136 virtual bool RunSync() OVERRIDE; 137 bool HighlightTab(TabStripModel* tabstrip, 138 ui::ListSelectionModel* selection, 139 int *active_index, 140 int index); 141 DECLARE_EXTENSION_FUNCTION("tabs.highlight", TABS_HIGHLIGHT) 142 }; 143 class TabsUpdateFunction : public ChromeAsyncExtensionFunction { 144 public: 145 TabsUpdateFunction(); 146 147 protected: 148 virtual ~TabsUpdateFunction() {} 149 virtual bool UpdateURL(const std::string& url, 150 int tab_id, 151 bool* is_async); 152 virtual void PopulateResult(); 153 154 content::WebContents* web_contents_; 155 156 private: 157 virtual bool RunAsync() OVERRIDE; 158 void OnExecuteCodeFinished(const std::string& error, 159 const GURL& on_url, 160 const base::ListValue& script_result); 161 162 DECLARE_EXTENSION_FUNCTION("tabs.update", TABS_UPDATE) 163 }; 164 class TabsMoveFunction : public ChromeSyncExtensionFunction { 165 virtual ~TabsMoveFunction() {} 166 virtual bool RunSync() OVERRIDE; 167 bool MoveTab(int tab_id, 168 int* new_index, 169 int iteration, 170 base::ListValue* tab_values, 171 int* window_id); 172 DECLARE_EXTENSION_FUNCTION("tabs.move", TABS_MOVE) 173 }; 174 class TabsReloadFunction : public ChromeSyncExtensionFunction { 175 virtual ~TabsReloadFunction() {} 176 virtual bool RunSync() OVERRIDE; 177 DECLARE_EXTENSION_FUNCTION("tabs.reload", TABS_RELOAD) 178 }; 179 class TabsRemoveFunction : public ChromeSyncExtensionFunction { 180 virtual ~TabsRemoveFunction() {} 181 virtual bool RunSync() OVERRIDE; 182 bool RemoveTab(int tab_id); 183 DECLARE_EXTENSION_FUNCTION("tabs.remove", TABS_REMOVE) 184 }; 185 class TabsDetectLanguageFunction : public ChromeAsyncExtensionFunction, 186 public content::NotificationObserver { 187 private: 188 virtual ~TabsDetectLanguageFunction() {} 189 virtual bool RunAsync() OVERRIDE; 190 191 virtual void Observe(int type, 192 const content::NotificationSource& source, 193 const content::NotificationDetails& details) OVERRIDE; 194 void GotLanguage(const std::string& language); 195 content::NotificationRegistrar registrar_; 196 DECLARE_EXTENSION_FUNCTION("tabs.detectLanguage", TABS_DETECTLANGUAGE) 197 }; 198 class TabsCaptureVisibleTabFunction 199 : public extensions::CaptureWebContentsFunction { 200 public: 201 TabsCaptureVisibleTabFunction(); 202 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 203 204 protected: 205 virtual ~TabsCaptureVisibleTabFunction() {} 206 207 private: 208 ChromeExtensionFunctionDetails chrome_details_; 209 210 // extensions::CaptureWebContentsFunction: 211 virtual bool IsScreenshotEnabled() OVERRIDE; 212 virtual content::WebContents* GetWebContentsForID(int id) OVERRIDE; 213 virtual void OnCaptureFailure(FailureReason reason) OVERRIDE; 214 215 DECLARE_EXTENSION_FUNCTION("tabs.captureVisibleTab", TABS_CAPTUREVISIBLETAB) 216 }; 217 218 // Implement API call tabs.executeScript and tabs.insertCSS. 219 class ExecuteCodeInTabFunction : public ExecuteCodeFunction { 220 public: 221 ExecuteCodeInTabFunction(); 222 223 protected: 224 virtual ~ExecuteCodeInTabFunction(); 225 226 // ExtensionFunction: 227 virtual bool HasPermission() OVERRIDE; 228 229 // Initialize the |execute_tab_id_| and |details_| if they haven't already 230 // been. Returns whether initialization was successful. 231 virtual bool Init() OVERRIDE; 232 virtual bool CanExecuteScriptOnPage() OVERRIDE; 233 virtual ScriptExecutor* GetScriptExecutor() OVERRIDE; 234 virtual bool IsWebView() const OVERRIDE; 235 virtual const GURL& GetWebViewSrc() const OVERRIDE; 236 237 private: 238 const ChromeExtensionFunctionDetails chrome_details_; 239 240 // Id of tab which executes code. 241 int execute_tab_id_; 242 }; 243 244 class TabsExecuteScriptFunction : public ExecuteCodeInTabFunction { 245 protected: 246 virtual bool ShouldInsertCSS() const OVERRIDE; 247 248 private: 249 virtual ~TabsExecuteScriptFunction() {} 250 251 virtual void OnExecuteCodeFinished( 252 const std::string& error, 253 const GURL& on_url, 254 const base::ListValue& script_result) OVERRIDE; 255 256 DECLARE_EXTENSION_FUNCTION("tabs.executeScript", TABS_EXECUTESCRIPT) 257 }; 258 259 class TabsInsertCSSFunction : public ExecuteCodeInTabFunction { 260 private: 261 virtual ~TabsInsertCSSFunction() {} 262 263 virtual bool ShouldInsertCSS() const OVERRIDE; 264 265 DECLARE_EXTENSION_FUNCTION("tabs.insertCSS", TABS_INSERTCSS) 266 }; 267 268 class ZoomAPIFunction : public ChromeAsyncExtensionFunction { 269 protected: 270 virtual ~ZoomAPIFunction() {} 271 272 // Gets the WebContents for |tab_id| if it is specified. Otherwise get the 273 // WebContents for the active tab in the current window. Calling this function 274 // may set error_. 275 // 276 // TODO(...) many other tabs API functions use similar behavior. There should 277 // be a way to share this implementation somehow. 278 content::WebContents* GetWebContents(int tab_id); 279 }; 280 281 class TabsSetZoomFunction : public ZoomAPIFunction { 282 private: 283 virtual ~TabsSetZoomFunction() {} 284 285 virtual bool RunAsync() OVERRIDE; 286 287 DECLARE_EXTENSION_FUNCTION("tabs.setZoom", TABS_SETZOOM) 288 }; 289 290 class TabsGetZoomFunction : public ZoomAPIFunction { 291 private: 292 virtual ~TabsGetZoomFunction() {} 293 294 virtual bool RunAsync() OVERRIDE; 295 296 DECLARE_EXTENSION_FUNCTION("tabs.getZoom", TABS_GETZOOM) 297 }; 298 299 class TabsSetZoomSettingsFunction : public ZoomAPIFunction { 300 private: 301 virtual ~TabsSetZoomSettingsFunction() {} 302 303 virtual bool RunAsync() OVERRIDE; 304 305 DECLARE_EXTENSION_FUNCTION("tabs.setZoomSettings", TABS_SETZOOMSETTINGS) 306 }; 307 308 class TabsGetZoomSettingsFunction : public ZoomAPIFunction { 309 private: 310 virtual ~TabsGetZoomSettingsFunction() {} 311 312 virtual bool RunAsync() OVERRIDE; 313 314 DECLARE_EXTENSION_FUNCTION("tabs.getZoomSettings", TABS_GETZOOMSETTINGS) 315 }; 316 317 } // namespace extensions 318 319 #endif // CHROME_BROWSER_EXTENSIONS_API_TABS_TABS_API_H_ 320