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_EXTENSION_ACTION_EXTENSION_ACTION_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h" 10 #include "chrome/browser/extensions/extension_action.h" 11 #include "chrome/browser/extensions/extension_function.h" 12 #include "content/public/browser/notification_observer.h" 13 #include "content/public/browser/notification_registrar.h" 14 15 namespace base { 16 class DictionaryValue; 17 } 18 19 namespace content { 20 class WebContents; 21 } 22 23 namespace extensions { 24 class ExtensionPrefs; 25 class TabHelper; 26 27 class ExtensionActionAPI : public ProfileKeyedAPI { 28 public: 29 explicit ExtensionActionAPI(Profile* profile); 30 virtual ~ExtensionActionAPI(); 31 32 static bool GetBrowserActionVisibility(const ExtensionPrefs* prefs, 33 const std::string& extension_id); 34 static void SetBrowserActionVisibility(ExtensionPrefs* prefs, 35 const std::string& extension_id, 36 bool visible); 37 38 // ProfileKeyedAPI implementation. 39 static ProfileKeyedAPIFactory<ExtensionActionAPI>* GetFactoryInstance(); 40 41 private: 42 friend class ProfileKeyedAPIFactory<ExtensionActionAPI>; 43 44 // ProfileKeyedAPI implementation. 45 static const char* service_name() { return "ExtensionActionAPI"; } 46 47 DISALLOW_COPY_AND_ASSIGN(ExtensionActionAPI); 48 }; 49 50 // This class manages reading and writing browser action values from storage. 51 class ExtensionActionStorageManager 52 : public content::NotificationObserver, 53 public base::SupportsWeakPtr<ExtensionActionStorageManager> { 54 public: 55 explicit ExtensionActionStorageManager(Profile* profile); 56 virtual ~ExtensionActionStorageManager(); 57 58 private: 59 // NotificationObserver: 60 virtual void Observe(int type, 61 const content::NotificationSource& source, 62 const content::NotificationDetails& details) OVERRIDE; 63 64 // Reads/Writes the ExtensionAction's default values to/from storage. 65 void WriteToStorage(ExtensionAction* extension_action); 66 void ReadFromStorage( 67 const std::string& extension_id, scoped_ptr<base::Value> value); 68 69 Profile* profile_; 70 content::NotificationRegistrar registrar_; 71 }; 72 73 // Implementation of the browserAction, pageAction, and scriptBadge APIs. 74 // 75 // Divergent behaviour between the three is minimal (pageAction and scriptBadge 76 // have required tabIds while browserAction's are optional, they have different 77 // internal browser notification requirements, and not all functions are defined 78 // for all APIs). 79 class ExtensionActionFunction : public SyncExtensionFunction { 80 public: 81 static bool ParseCSSColorString(const std::string& color_string, 82 SkColor* result); 83 84 protected: 85 ExtensionActionFunction(); 86 virtual ~ExtensionActionFunction(); 87 virtual bool RunImpl() OVERRIDE; 88 virtual bool RunExtensionAction() = 0; 89 90 bool ExtractDataFromArguments(); 91 void NotifyChange(); 92 void NotifyBrowserActionChange(); 93 void NotifyLocationBarChange(); 94 void NotifySystemIndicatorChange(); 95 bool SetVisible(bool visible); 96 97 // Extension-related information for |tab_id_|. 98 // CHECK-fails if there is no tab. 99 extensions::TabHelper& tab_helper() const; 100 101 // All the extension action APIs take a single argument called details that 102 // is a dictionary. 103 base::DictionaryValue* details_; 104 105 // The tab id the extension action function should apply to, if any, or 106 // kDefaultTabId if none was specified. 107 int tab_id_; 108 109 // WebContents for |tab_id_| if one exists. 110 content::WebContents* contents_; 111 112 // The extension action for the current extension. 113 ExtensionAction* extension_action_; 114 }; 115 116 // 117 // Implementations of each extension action API. 118 // 119 // pageAction and browserAction bindings are created for these by extending them 120 // then declaring an EXTENSION_FUNCTION_NAME. 121 // 122 123 // show 124 class ExtensionActionShowFunction : public ExtensionActionFunction { 125 protected: 126 virtual ~ExtensionActionShowFunction() {} 127 virtual bool RunExtensionAction() OVERRIDE; 128 }; 129 130 // hide 131 class ExtensionActionHideFunction : public ExtensionActionFunction { 132 protected: 133 virtual ~ExtensionActionHideFunction() {} 134 virtual bool RunExtensionAction() OVERRIDE; 135 }; 136 137 // setIcon 138 class ExtensionActionSetIconFunction : public ExtensionActionFunction { 139 protected: 140 virtual ~ExtensionActionSetIconFunction() {} 141 virtual bool RunExtensionAction() OVERRIDE; 142 }; 143 144 // setTitle 145 class ExtensionActionSetTitleFunction : public ExtensionActionFunction { 146 protected: 147 virtual ~ExtensionActionSetTitleFunction() {} 148 virtual bool RunExtensionAction() OVERRIDE; 149 }; 150 151 // setPopup 152 class ExtensionActionSetPopupFunction : public ExtensionActionFunction { 153 protected: 154 virtual ~ExtensionActionSetPopupFunction() {} 155 virtual bool RunExtensionAction() OVERRIDE; 156 }; 157 158 // setBadgeText 159 class ExtensionActionSetBadgeTextFunction : public ExtensionActionFunction { 160 protected: 161 virtual ~ExtensionActionSetBadgeTextFunction() {} 162 virtual bool RunExtensionAction() OVERRIDE; 163 }; 164 165 // setBadgeBackgroundColor 166 class ExtensionActionSetBadgeBackgroundColorFunction 167 : public ExtensionActionFunction { 168 protected: 169 virtual ~ExtensionActionSetBadgeBackgroundColorFunction() {} 170 virtual bool RunExtensionAction() OVERRIDE; 171 }; 172 173 // getTitle 174 class ExtensionActionGetTitleFunction : public ExtensionActionFunction { 175 protected: 176 virtual ~ExtensionActionGetTitleFunction() {} 177 virtual bool RunExtensionAction() OVERRIDE; 178 }; 179 180 // getPopup 181 class ExtensionActionGetPopupFunction : public ExtensionActionFunction { 182 protected: 183 virtual ~ExtensionActionGetPopupFunction() {} 184 virtual bool RunExtensionAction() OVERRIDE; 185 }; 186 187 // getBadgeText 188 class ExtensionActionGetBadgeTextFunction : public ExtensionActionFunction { 189 protected: 190 virtual ~ExtensionActionGetBadgeTextFunction() {} 191 virtual bool RunExtensionAction() OVERRIDE; 192 }; 193 194 // getBadgeBackgroundColor 195 class ExtensionActionGetBadgeBackgroundColorFunction 196 : public ExtensionActionFunction { 197 protected: 198 virtual ~ExtensionActionGetBadgeBackgroundColorFunction() {} 199 virtual bool RunExtensionAction() OVERRIDE; 200 }; 201 202 // 203 // browserAction.* aliases for supported browserAction APIs. 204 // 205 206 class BrowserActionSetIconFunction : public ExtensionActionSetIconFunction { 207 public: 208 DECLARE_EXTENSION_FUNCTION("browserAction.setIcon", BROWSERACTION_SETICON) 209 210 protected: 211 virtual ~BrowserActionSetIconFunction() {} 212 }; 213 214 class BrowserActionSetTitleFunction : public ExtensionActionSetTitleFunction { 215 public: 216 DECLARE_EXTENSION_FUNCTION("browserAction.setTitle", BROWSERACTION_SETTITLE) 217 218 protected: 219 virtual ~BrowserActionSetTitleFunction() {} 220 }; 221 222 class BrowserActionSetPopupFunction : public ExtensionActionSetPopupFunction { 223 public: 224 DECLARE_EXTENSION_FUNCTION("browserAction.setPopup", BROWSERACTION_SETPOPUP) 225 226 protected: 227 virtual ~BrowserActionSetPopupFunction() {} 228 }; 229 230 class BrowserActionGetTitleFunction : public ExtensionActionGetTitleFunction { 231 public: 232 DECLARE_EXTENSION_FUNCTION("browserAction.getTitle", BROWSERACTION_GETTITLE) 233 234 protected: 235 virtual ~BrowserActionGetTitleFunction() {} 236 }; 237 238 class BrowserActionGetPopupFunction : public ExtensionActionGetPopupFunction { 239 public: 240 DECLARE_EXTENSION_FUNCTION("browserAction.getPopup", BROWSERACTION_GETPOPUP) 241 242 protected: 243 virtual ~BrowserActionGetPopupFunction() {} 244 }; 245 246 class BrowserActionSetBadgeTextFunction 247 : public ExtensionActionSetBadgeTextFunction { 248 public: 249 DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeText", 250 BROWSERACTION_SETBADGETEXT) 251 252 protected: 253 virtual ~BrowserActionSetBadgeTextFunction() {} 254 }; 255 256 class BrowserActionSetBadgeBackgroundColorFunction 257 : public ExtensionActionSetBadgeBackgroundColorFunction { 258 public: 259 DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeBackgroundColor", 260 BROWSERACTION_SETBADGEBACKGROUNDCOLOR) 261 262 protected: 263 virtual ~BrowserActionSetBadgeBackgroundColorFunction() {} 264 }; 265 266 class BrowserActionGetBadgeTextFunction 267 : public ExtensionActionGetBadgeTextFunction { 268 public: 269 DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeText", 270 BROWSERACTION_GETBADGETEXT) 271 272 protected: 273 virtual ~BrowserActionGetBadgeTextFunction() {} 274 }; 275 276 class BrowserActionGetBadgeBackgroundColorFunction 277 : public ExtensionActionGetBadgeBackgroundColorFunction { 278 public: 279 DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeBackgroundColor", 280 BROWSERACTION_GETBADGEBACKGROUNDCOLOR) 281 282 protected: 283 virtual ~BrowserActionGetBadgeBackgroundColorFunction() {} 284 }; 285 286 class BrowserActionEnableFunction : public ExtensionActionShowFunction { 287 public: 288 DECLARE_EXTENSION_FUNCTION("browserAction.enable", BROWSERACTION_ENABLE) 289 290 protected: 291 virtual ~BrowserActionEnableFunction() {} 292 }; 293 294 class BrowserActionDisableFunction : public ExtensionActionHideFunction { 295 public: 296 DECLARE_EXTENSION_FUNCTION("browserAction.disable", BROWSERACTION_DISABLE) 297 298 protected: 299 virtual ~BrowserActionDisableFunction() {} 300 }; 301 302 // 303 // scriptBadge.* aliases for supported scriptBadge APIs. 304 // 305 306 class ScriptBadgeSetPopupFunction : public ExtensionActionSetPopupFunction { 307 public: 308 DECLARE_EXTENSION_FUNCTION("scriptBadge.setPopup", SCRIPTBADGE_SETPOPUP) 309 310 protected: 311 virtual ~ScriptBadgeSetPopupFunction() {} 312 }; 313 314 class ScriptBadgeGetPopupFunction : public ExtensionActionGetPopupFunction { 315 public: 316 DECLARE_EXTENSION_FUNCTION("scriptBadge.getPopup", SCRIPTBADGE_GETPOPUP) 317 318 protected: 319 virtual ~ScriptBadgeGetPopupFunction() {} 320 }; 321 322 // scriptBadge.getAttention(tabId) 323 class ScriptBadgeGetAttentionFunction : public ExtensionActionFunction { 324 public: 325 DECLARE_EXTENSION_FUNCTION("scriptBadge.getAttention", 326 SCRIPTBADGE_GETATTENTION) 327 328 virtual bool RunExtensionAction() OVERRIDE; 329 330 protected: 331 virtual ~ScriptBadgeGetAttentionFunction(); 332 }; 333 334 } // namespace extensions 335 336 // 337 // pageAction.* aliases for supported pageAction APIs. 338 // 339 340 class PageActionShowFunction : public extensions::ExtensionActionShowFunction { 341 public: 342 DECLARE_EXTENSION_FUNCTION("pageAction.show", PAGEACTION_SHOW) 343 344 protected: 345 virtual ~PageActionShowFunction() {} 346 }; 347 348 class PageActionHideFunction : public extensions::ExtensionActionHideFunction { 349 public: 350 DECLARE_EXTENSION_FUNCTION("pageAction.hide", PAGEACTION_HIDE) 351 352 protected: 353 virtual ~PageActionHideFunction() {} 354 }; 355 356 class PageActionSetIconFunction 357 : public extensions::ExtensionActionSetIconFunction { 358 public: 359 DECLARE_EXTENSION_FUNCTION("pageAction.setIcon", PAGEACTION_SETICON) 360 361 protected: 362 virtual ~PageActionSetIconFunction() {} 363 }; 364 365 class PageActionSetTitleFunction 366 : public extensions::ExtensionActionSetTitleFunction { 367 public: 368 DECLARE_EXTENSION_FUNCTION("pageAction.setTitle", PAGEACTION_SETTITLE) 369 370 protected: 371 virtual ~PageActionSetTitleFunction() {} 372 }; 373 374 class PageActionSetPopupFunction 375 : public extensions::ExtensionActionSetPopupFunction { 376 public: 377 DECLARE_EXTENSION_FUNCTION("pageAction.setPopup", PAGEACTION_SETPOPUP) 378 379 protected: 380 virtual ~PageActionSetPopupFunction() {} 381 }; 382 383 class PageActionGetTitleFunction 384 : public extensions::ExtensionActionGetTitleFunction { 385 public: 386 DECLARE_EXTENSION_FUNCTION("pageAction.getTitle", PAGEACTION_GETTITLE) 387 388 protected: 389 virtual ~PageActionGetTitleFunction() {} 390 }; 391 392 class PageActionGetPopupFunction 393 : public extensions::ExtensionActionGetPopupFunction { 394 public: 395 DECLARE_EXTENSION_FUNCTION("pageAction.getPopup", PAGEACTION_GETPOPUP) 396 397 protected: 398 virtual ~PageActionGetPopupFunction() {} 399 }; 400 401 // Base class for deprecated page actions APIs 402 class PageActionsFunction : public SyncExtensionFunction { 403 protected: 404 PageActionsFunction(); 405 virtual ~PageActionsFunction(); 406 bool SetPageActionEnabled(bool enable); 407 }; 408 409 // Implement chrome.pageActions.enableForTab(). 410 class EnablePageActionsFunction : public PageActionsFunction { 411 public: 412 DECLARE_EXTENSION_FUNCTION("pageActions.enableForTab", 413 PAGEACTIONS_ENABLEFORTAB) 414 415 protected: 416 virtual ~EnablePageActionsFunction() {} 417 418 // ExtensionFunction: 419 virtual bool RunImpl() OVERRIDE; 420 }; 421 422 // Implement chrome.pageActions.disableForTab(). 423 class DisablePageActionsFunction : public PageActionsFunction { 424 public: 425 DECLARE_EXTENSION_FUNCTION("pageActions.disableForTab", 426 PAGEACTIONS_DISABLEFORTAB) 427 428 protected: 429 virtual ~DisablePageActionsFunction() {} 430 431 // ExtensionFunction: 432 virtual bool RunImpl() OVERRIDE; 433 }; 434 435 #endif // CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_ 436