| // Copyright (c) 2011 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_COMMON_EXTENSIONS_EXTENSION_H_ |
| #define CHROME_COMMON_EXTENSIONS_EXTENSION_H_ |
| #pragma once |
| |
| #include <map> |
| #include <set> |
| #include <string> |
| #include <vector> |
| |
| #include "base/file_path.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/memory/linked_ptr.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "chrome/common/extensions/extension_constants.h" |
| #include "chrome/common/extensions/extension_extent.h" |
| #include "chrome/common/extensions/extension_icon_set.h" |
| #include "chrome/common/extensions/user_script.h" |
| #include "chrome/common/extensions/url_pattern.h" |
| #include "googleurl/src/gurl.h" |
| #include "ui/gfx/size.h" |
| |
| class DictionaryValue; |
| class ExtensionAction; |
| class ExtensionResource; |
| class ExtensionSidebarDefaults; |
| class FileBrowserHandler; |
| class ListValue; |
| class SkBitmap; |
| class Version; |
| |
| // Represents a Chrome extension. |
| class Extension : public base::RefCountedThreadSafe<Extension> { |
| public: |
| typedef std::map<const std::string, GURL> URLOverrideMap; |
| typedef std::vector<std::string> ScriptingWhitelist; |
| typedef std::vector<linked_ptr<FileBrowserHandler> > FileBrowserHandlerList; |
| |
| // What an extension was loaded from. |
| // NOTE: These values are stored as integers in the preferences and used |
| // in histograms so don't remove or reorder existing items. Just append |
| // to the end. |
| enum Location { |
| INVALID, |
| INTERNAL, // A crx file from the internal Extensions directory. |
| EXTERNAL_PREF, // A crx file from an external directory (via prefs). |
| EXTERNAL_REGISTRY, // A crx file from an external directory (via eg the |
| // registry on Windows). |
| LOAD, // --load-extension. |
| COMPONENT, // An integral component of Chrome itself, which |
| // happens to be implemented as an extension. We don't |
| // show these in the management UI. |
| EXTERNAL_PREF_DOWNLOAD, // A crx file from an external directory (via |
| // prefs), installed from an update URL. |
| EXTERNAL_POLICY_DOWNLOAD, // A crx file from an external directory (via |
| // admin policies), installed from an update URL. |
| |
| NUM_LOCATIONS |
| }; |
| |
| enum State { |
| DISABLED = 0, |
| ENABLED, |
| // An external extension that the user uninstalled. We should not reinstall |
| // such extensions on startup. |
| EXTERNAL_EXTENSION_UNINSTALLED, |
| NUM_STATES |
| }; |
| |
| enum InstallType { |
| INSTALL_ERROR, |
| DOWNGRADE, |
| REINSTALL, |
| UPGRADE, |
| NEW_INSTALL |
| }; |
| |
| // NOTE: If you change this list, you should also change kIconSizes in the cc |
| // file. |
| enum Icons { |
| EXTENSION_ICON_LARGE = 128, |
| EXTENSION_ICON_MEDIUM = 48, |
| EXTENSION_ICON_SMALL = 32, |
| EXTENSION_ICON_SMALLISH = 24, |
| EXTENSION_ICON_BITTY = 16, |
| }; |
| |
| // Do not change the order of entries or remove entries in this list |
| // as this is used in UMA_HISTOGRAM_ENUMERATIONs about extensions. |
| enum Type { |
| TYPE_UNKNOWN = 0, |
| TYPE_EXTENSION, |
| TYPE_THEME, |
| TYPE_USER_SCRIPT, |
| TYPE_HOSTED_APP, |
| TYPE_PACKAGED_APP |
| }; |
| |
| // An NPAPI plugin included in the extension. |
| struct PluginInfo { |
| FilePath path; // Path to the plugin. |
| bool is_public; // False if only this extension can load this plugin. |
| }; |
| |
| // An NaCl module included in the extension. |
| struct NaClModuleInfo { |
| GURL url; |
| std::string mime_type; |
| }; |
| |
| struct TtsVoice { |
| std::string voice_name; |
| std::string locale; |
| std::string gender; |
| }; |
| |
| // When prompting the user to install or approve permissions, we display |
| // messages describing the effects of the permissions and not the permissions |
| // themselves. Each PermissionMessage represents one of the messages that is |
| // shown to the user. |
| class PermissionMessage { |
| public: |
| // Do not reorder or add new enumerations in this list. If you need to add a |
| // new enum, add it just prior to ID_ENUM_BOUNDARY and enter its l10n |
| // message in kMessageIds. |
| enum MessageId { |
| ID_UNKNOWN, |
| ID_NONE, |
| ID_BOOKMARKS, |
| ID_GEOLOCATION, |
| ID_BROWSING_HISTORY, |
| ID_TABS, |
| ID_MANAGEMENT, |
| ID_DEBUGGER, |
| ID_HOSTS_1, |
| ID_HOSTS_2, |
| ID_HOSTS_3, |
| ID_HOSTS_4_OR_MORE, |
| ID_HOSTS_ALL, |
| ID_FULL_ACCESS, |
| ID_ENUM_BOUNDARY |
| }; |
| |
| // Creates a permission message with the given |message_id| and initializes |
| // its message to the appropriate value. |
| static PermissionMessage CreateFromMessageId(MessageId message_id); |
| |
| // Creates the corresponding permission message for a list of hosts. This |
| // method exists because the hosts are presented as one message that depends |
| // on what and how many hosts there are. |
| static PermissionMessage CreateFromHostList( |
| const std::vector<std::string> hosts); |
| |
| // Gets the id of the permission message, which can be used in UMA |
| // histograms. |
| MessageId message_id() const { return message_id_; } |
| |
| // Gets a localized message describing this permission. Please note that |
| // the message will be empty for message types TYPE_NONE and TYPE_UNKNOWN. |
| const string16& message() const { return message_; } |
| |
| // Comparator to work with std::set. |
| bool operator<(const PermissionMessage& that) const { |
| return message_id_ < that.message_id_; |
| } |
| |
| private: |
| PermissionMessage(MessageId message_id, string16 message_); |
| |
| // The index of the id in the array is its enum value. The first two values |
| // are non-existent message ids to act as placeholders for "unknown" and |
| // "none". |
| // Note: Do not change the order of the items in this list since they |
| // are used in a histogram. The order must match the MessageId order. |
| static const int kMessageIds[]; |
| |
| MessageId message_id_; |
| string16 message_; |
| }; |
| |
| typedef std::vector<PermissionMessage> PermissionMessages; |
| |
| // A permission is defined by its |name| (what is used in the manifest), |
| // and the |message_id| that's used by install/update UI. |
| struct Permission { |
| const char* const name; |
| const PermissionMessage::MessageId message_id; |
| }; |
| |
| enum InitFromValueFlags { |
| NO_FLAGS = 0, |
| |
| // Usually, the id of an extension is generated by the "key" property of |
| // its manifest, but if |REQUIRE_KEY| is not set, a temporary ID will be |
| // generated based on the path. |
| REQUIRE_KEY = 1 << 0, |
| |
| // |STRICT_ERROR_CHECKS| enables extra error checking, such as |
| // checks that URL patterns do not contain ports. This error |
| // checking may find an error that a previous version of |
| // Chrome did not flag. To avoid errors in installed extensions |
| // when Chrome is upgraded, strict error checking is only enabled |
| // when loading extensions as a developer would (such as loading |
| // an unpacked extension), or when loading an extension that is |
| // tied to a specific version of Chrome (such as a component |
| // extension). Most callers will set the |STRICT_ERROR_CHECKS| bit when |
| // Extension::ShouldDoStrictErrorChecking(location) returns true. |
| STRICT_ERROR_CHECKS = 1 << 1, |
| |
| // |ALLOW_FILE_ACCESS| indicates that the user is allowing this extension |
| // to have file access. If it's not present, then permissions and content |
| // scripts that match file:/// URLs will be filtered out. |
| ALLOW_FILE_ACCESS = 1 << 2, |
| }; |
| |
| static scoped_refptr<Extension> Create(const FilePath& path, |
| Location location, |
| const DictionaryValue& value, |
| int flags, |
| std::string* error); |
| |
| // Return the update url used by gallery/webstore extensions. |
| static GURL GalleryUpdateUrl(bool secure); |
| |
| // Given two install sources, return the one which should take priority |
| // over the other. If an extension is installed from two sources A and B, |
| // its install source should be set to GetHigherPriorityLocation(A, B). |
| static Location GetHigherPriorityLocation(Location loc1, Location loc2); |
| |
| // Get's the install message id for |permission|. Returns |
| // MessageId::TYPE_NONE if none exists. |
| static PermissionMessage::MessageId GetPermissionMessageId( |
| const std::string& permission); |
| |
| // Returns the full list of permission messages that this extension |
| // should display at install time. |
| PermissionMessages GetPermissionMessages() const; |
| |
| // Returns the full list of permission messages that this extension |
| // should display at install time. The messages are returned as strings |
| // for convenience. |
| std::vector<string16> GetPermissionMessageStrings() const; |
| |
| // Returns the distinct hosts that should be displayed in the install UI |
| // for the URL patterns |list|. This discards some of the detail that is |
| // present in the manifest to make it as easy as possible to process by |
| // users. In particular we disregard the scheme and path components of |
| // URLPatterns and de-dupe the result, which includes filtering out common |
| // hosts with differing RCDs (aka Registry Controlled Domains, most of which |
| // are Top Level Domains but also include exceptions like co.uk). |
| // NOTE: when de-duping hosts the preferred RCD will be returned, given this |
| // order of preference: .com, .net, .org, first in list. |
| static std::vector<std::string> GetDistinctHostsForDisplay( |
| const URLPatternList& list); |
| |
| // Compares two URLPatternLists for security equality by returning whether |
| // the URL patterns in |new_list| contain additional distinct hosts compared |
| // to |old_list|. |
| static bool IsElevatedHostList( |
| const URLPatternList& old_list, const URLPatternList& new_list); |
| |
| // Icon sizes used by the extension system. |
| static const int kIconSizes[]; |
| |
| // Max size (both dimensions) for browser and page actions. |
| static const int kPageActionIconMaxSize; |
| static const int kBrowserActionIconMaxSize; |
| static const int kSidebarIconMaxSize; |
| |
| // Each permission is a module that the extension is permitted to use. |
| // |
| // NOTE: To add a new permission, define it here, and add an entry to |
| // Extension::kPermissions. |
| static const char kBackgroundPermission[]; |
| static const char kBookmarkPermission[]; |
| static const char kContentSettingsPermission[]; |
| static const char kContextMenusPermission[]; |
| static const char kCookiePermission[]; |
| static const char kChromeosInfoPrivatePermissions[]; |
| static const char kDebuggerPermission[]; |
| static const char kExperimentalPermission[]; |
| static const char kFileBrowserHandlerPermission[]; |
| static const char kFileBrowserPrivatePermission[]; |
| static const char kGeolocationPermission[]; |
| static const char kHistoryPermission[]; |
| static const char kIdlePermission[]; |
| static const char kManagementPermission[]; |
| static const char kNotificationPermission[]; |
| static const char kProxyPermission[]; |
| static const char kTabPermission[]; |
| static const char kUnlimitedStoragePermission[]; |
| static const char kWebstorePrivatePermission[]; |
| |
| static const Permission kPermissions[]; |
| static const size_t kNumPermissions; |
| static const char* const kHostedAppPermissionNames[]; |
| static const size_t kNumHostedAppPermissions; |
| static const char* const kComponentPrivatePermissionNames[]; |
| static const size_t kNumComponentPrivatePermissions; |
| |
| // The old name for the unlimited storage permission, which is deprecated but |
| // still accepted as meaning the same thing as kUnlimitedStoragePermission. |
| static const char kOldUnlimitedStoragePermission[]; |
| |
| // Valid schemes for web extent URLPatterns. |
| static const int kValidWebExtentSchemes; |
| |
| // Valid schemes for host permission URLPatterns. |
| static const int kValidHostPermissionSchemes; |
| |
| // Returns true if the string is one of the known hosted app permissions (see |
| // kHostedAppPermissionNames). |
| static bool IsHostedAppPermission(const std::string& permission); |
| |
| // The name of the manifest inside an extension. |
| static const FilePath::CharType kManifestFilename[]; |
| |
| // The name of locale folder inside an extension. |
| static const FilePath::CharType kLocaleFolder[]; |
| |
| // The name of the messages file inside an extension. |
| static const FilePath::CharType kMessagesFilename[]; |
| |
| #if defined(OS_WIN) |
| static const char kExtensionRegistryPath[]; |
| #endif |
| |
| // The number of bytes in a legal id. |
| static const size_t kIdSize; |
| |
| // The mimetype used for extensions. |
| static const char kMimeType[]; |
| |
| // Checks to see if the extension has a valid ID. |
| static bool IdIsValid(const std::string& id); |
| |
| // Generate an ID for an extension in the given path. |
| // Used while developing extensions, before they have a key. |
| static std::string GenerateIdForPath(const FilePath& file_name); |
| |
| // Returns true if the specified file is an extension. |
| static bool IsExtension(const FilePath& file_name); |
| |
| // Whether the |location| is external or not. |
| static inline bool IsExternalLocation(Location location) { |
| return location == Extension::EXTERNAL_PREF || |
| location == Extension::EXTERNAL_REGISTRY || |
| location == Extension::EXTERNAL_PREF_DOWNLOAD || |
| location == Extension::EXTERNAL_POLICY_DOWNLOAD; |
| } |
| |
| // Whether extensions with |location| are auto-updatable or not. |
| static inline bool IsAutoUpdateableLocation(Location location) { |
| // Only internal and external extensions can be autoupdated. |
| return location == Extension::INTERNAL || |
| IsExternalLocation(location); |
| } |
| |
| // Whether extensions with |location| can be uninstalled or not. Policy |
| // controlled extensions are silently auto-installed and updated, and cannot |
| // be disabled by the user. The same applies for internal components. |
| static inline bool UserMayDisable(Location location) { |
| return location != Extension::EXTERNAL_POLICY_DOWNLOAD && |
| location != Extension::COMPONENT; |
| } |
| |
| // Whether extensions with |location| should be loaded with strict |
| // error checking. Strict error checks may flag errors older versions |
| // of chrome did not detect. To avoid breaking installed extensions, |
| // strict checks are disabled unless the location indicates that the |
| // developer is loading the extension, or the extension is a component |
| // of chrome. |
| static inline bool ShouldDoStrictErrorChecking(Location location) { |
| return location == Extension::LOAD || |
| location == Extension::COMPONENT; |
| } |
| |
| // Unpacked extensions start off with file access since they are a developer |
| // feature. |
| static inline bool ShouldAlwaysAllowFileAccess(Location location) { |
| return location == Extension::LOAD; |
| } |
| |
| // See Type definition above. |
| Type GetType() const; |
| |
| // Returns an absolute url to a resource inside of an extension. The |
| // |extension_url| argument should be the url() from an Extension object. The |
| // |relative_path| can be untrusted user input. The returned URL will either |
| // be invalid() or a child of |extension_url|. |
| // NOTE: Static so that it can be used from multiple threads. |
| static GURL GetResourceURL(const GURL& extension_url, |
| const std::string& relative_path); |
| GURL GetResourceURL(const std::string& relative_path) const { |
| return GetResourceURL(url(), relative_path); |
| } |
| |
| // Returns an extension resource object. |relative_path| should be UTF8 |
| // encoded. |
| ExtensionResource GetResource(const std::string& relative_path) const; |
| |
| // As above, but with |relative_path| following the file system's encoding. |
| ExtensionResource GetResource(const FilePath& relative_path) const; |
| |
| // |input| is expected to be the text of an rsa public or private key. It |
| // tolerates the presence or absence of bracking header/footer like this: |
| // -----(BEGIN|END) [RSA PUBLIC/PRIVATE] KEY----- |
| // and may contain newlines. |
| static bool ParsePEMKeyBytes(const std::string& input, std::string* output); |
| |
| // Does a simple base64 encoding of |input| into |output|. |
| static bool ProducePEM(const std::string& input, std::string* output); |
| |
| // Generates an extension ID from arbitrary input. The same input string will |
| // always generate the same output ID. |
| static bool GenerateId(const std::string& input, std::string* output); |
| |
| // Expects base64 encoded |input| and formats into |output| including |
| // the appropriate header & footer. |
| static bool FormatPEMForFileOutput(const std::string& input, |
| std::string* output, |
| bool is_public); |
| |
| // Determine whether |new_extension| has increased privileges compared to |
| // its previously granted permissions, specified by |granted_apis|, |
| // |granted_extent| and |granted_full_access|. |
| static bool IsPrivilegeIncrease(const bool granted_full_access, |
| const std::set<std::string>& granted_apis, |
| const ExtensionExtent& granted_extent, |
| const Extension* new_extension); |
| |
| // Given an extension and icon size, read it if present and decode it into |
| // result. In the browser process, this will DCHECK if not called on the |
| // file thread. To easily load extension images on the UI thread, see |
| // ImageLoadingTracker. |
| static void DecodeIcon(const Extension* extension, |
| Icons icon_size, |
| scoped_ptr<SkBitmap>* result); |
| |
| // Given an icon_path and icon size, read it if present and decode it into |
| // result. In the browser process, this will DCHECK if not called on the |
| // file thread. To easily load extension images on the UI thread, see |
| // ImageLoadingTracker. |
| static void DecodeIconFromPath(const FilePath& icon_path, |
| Icons icon_size, |
| scoped_ptr<SkBitmap>* result); |
| |
| // Returns the default extension/app icon (for extensions or apps that don't |
| // have one). |
| static const SkBitmap& GetDefaultIcon(bool is_app); |
| |
| // Returns the base extension url for a given |extension_id|. |
| static GURL GetBaseURLFromExtensionId(const std::string& extension_id); |
| |
| // Returns the url prefix for the extension/apps gallery. Can be set via the |
| // --apps-gallery-url switch. The URL returned will not contain a trailing |
| // slash. Do not use this as a prefix/extent for the store. Instead see |
| // ExtensionService::GetWebStoreApp or |
| // ExtensionService::IsDownloadFromGallery |
| static std::string ChromeStoreLaunchURL(); |
| |
| // Adds an extension to the scripting whitelist. Used for testing only. |
| static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); |
| static const ScriptingWhitelist* GetScriptingWhitelist(); |
| |
| // Returns true if the extension has the specified API permission. |
| static bool HasApiPermission(const std::set<std::string>& api_permissions, |
| const std::string& function_name); |
| |
| // Whether the |effective_host_permissions| and |api_permissions| include |
| // effective access to all hosts. See the non-static version of the method |
| // for more details. |
| static bool HasEffectiveAccessToAllHosts( |
| const ExtensionExtent& effective_host_permissions, |
| const std::set<std::string>& api_permissions); |
| |
| bool HasApiPermission(const std::string& function_name) const { |
| return HasApiPermission(this->api_permissions(), function_name); |
| } |
| |
| const ExtensionExtent& GetEffectiveHostPermissions() const { |
| return effective_host_permissions_; |
| } |
| |
| // Whether or not the extension is allowed permission for a URL pattern from |
| // the manifest. http, https, and chrome://favicon/ is allowed for all |
| // extensions, while component extensions are allowed access to |
| // chrome://resources. |
| bool CanSpecifyHostPermission(const URLPattern& pattern) const; |
| |
| // Whether the extension has access to the given URL. |
| bool HasHostPermission(const GURL& url) const; |
| |
| // Whether the extension has effective access to all hosts. This is true if |
| // there is a content script that matches all hosts, if there is a host |
| // permission grants access to all hosts (like <all_urls>) or an api |
| // permission that effectively grants access to all hosts (e.g. proxy, |
| // network, etc.) |
| bool HasEffectiveAccessToAllHosts() const; |
| |
| // Whether the extension effectively has all permissions (for example, by |
| // having an NPAPI plugin). |
| bool HasFullPermissions() const; |
| |
| // Whether context menu should be shown for page and browser actions. |
| bool ShowConfigureContextMenus() const; |
| |
| // Returns the Homepage URL for this extension. If homepage_url was not |
| // specified in the manifest, this returns the Google Gallery URL. For |
| // third-party extensions, this returns a blank GURL. |
| GURL GetHomepageURL() const; |
| |
| // Returns a list of paths (relative to the extension dir) for images that |
| // the browser might load (like themes and page action icons). |
| std::set<FilePath> GetBrowserImages() const; |
| |
| // Get an extension icon as a resource or URL. |
| ExtensionResource GetIconResource( |
| int size, ExtensionIconSet::MatchType match_type) const; |
| GURL GetIconURL(int size, ExtensionIconSet::MatchType match_type) const; |
| |
| // Gets the fully resolved absolute launch URL. |
| GURL GetFullLaunchURL() const; |
| |
| // Image cache related methods. These are only valid on the UI thread and |
| // not maintained by this class. See ImageLoadingTracker for usage. The |
| // |original_size| parameter should be the size of the image at |source| |
| // before any scaling may have been done to produce the pixels in |image|. |
| void SetCachedImage(const ExtensionResource& source, |
| const SkBitmap& image, |
| const gfx::Size& original_size) const; |
| bool HasCachedImage(const ExtensionResource& source, |
| const gfx::Size& max_size) const; |
| SkBitmap GetCachedImage(const ExtensionResource& source, |
| const gfx::Size& max_size) const; |
| |
| // Returns true if this extension can execute script on a page. If a |
| // UserScript object is passed, permission to run that specific script is |
| // checked (using its matches list). Otherwise, permission to execute script |
| // programmatically is checked (using the extension's host permission). |
| // |
| // This method is also aware of certain special pages that extensions are |
| // usually not allowed to run script on. |
| bool CanExecuteScriptOnPage(const GURL& page_url, |
| const UserScript* script, |
| std::string* error) const; |
| |
| // Returns true if this extension is a COMPONENT extension, or if it is |
| // on the whitelist of extensions that can script all pages. |
| bool CanExecuteScriptEverywhere() const; |
| |
| // Returns true if this extension is allowed to obtain the contents of a |
| // page as an image. Since a page may contain sensitive information, this |
| // is restricted to the extension's host permissions as well as the |
| // extension page itself. |
| bool CanCaptureVisiblePage(const GURL& page_url, std::string* error) const; |
| |
| // Returns true if this extension updates itself using the extension |
| // gallery. |
| bool UpdatesFromGallery() const; |
| |
| // Returns true if this extension or app includes areas within |origin|. |
| bool OverlapsWithOrigin(const GURL& origin) const; |
| |
| // Accessors: |
| |
| const FilePath& path() const { return path_; } |
| const GURL& url() const { return extension_url_; } |
| Location location() const { return location_; } |
| const std::string& id() const { return id_; } |
| const Version* version() const { return version_.get(); } |
| const std::string VersionString() const; |
| const std::string& name() const { return name_; } |
| const std::string& public_key() const { return public_key_; } |
| const std::string& description() const { return description_; } |
| bool converted_from_user_script() const { |
| return converted_from_user_script_; |
| } |
| const UserScriptList& content_scripts() const { return content_scripts_; } |
| ExtensionAction* page_action() const { return page_action_.get(); } |
| ExtensionAction* browser_action() const { return browser_action_.get(); } |
| ExtensionSidebarDefaults* sidebar_defaults() const { |
| return sidebar_defaults_.get(); |
| } |
| const FileBrowserHandlerList* file_browser_handlers() const { |
| return file_browser_handlers_.get(); |
| } |
| const std::vector<PluginInfo>& plugins() const { return plugins_; } |
| const std::vector<NaClModuleInfo>& nacl_modules() const { |
| return nacl_modules_; |
| } |
| const GURL& background_url() const { return background_url_; } |
| const GURL& options_url() const { return options_url_; } |
| const GURL& devtools_url() const { return devtools_url_; } |
| const std::vector<GURL>& toolstrips() const { return toolstrips_; } |
| const std::set<std::string>& api_permissions() const { |
| return api_permissions_; |
| } |
| const URLPatternList& host_permissions() const { return host_permissions_; } |
| const GURL& update_url() const { return update_url_; } |
| const ExtensionIconSet& icons() const { return icons_; } |
| const DictionaryValue* manifest_value() const { |
| return manifest_value_.get(); |
| } |
| const std::string default_locale() const { return default_locale_; } |
| const URLOverrideMap& GetChromeURLOverrides() const { |
| return chrome_url_overrides_; |
| } |
| const std::string omnibox_keyword() const { return omnibox_keyword_; } |
| bool incognito_split_mode() const { return incognito_split_mode_; } |
| const std::vector<TtsVoice>& tts_voices() const { return tts_voices_; } |
| |
| bool wants_file_access() const { return wants_file_access_; } |
| |
| // App-related. |
| bool is_app() const { return is_app_; } |
| bool is_hosted_app() const { return is_app() && !web_extent().is_empty(); } |
| bool is_packaged_app() const { return is_app() && web_extent().is_empty(); } |
| bool is_storage_isolated() const { return is_app() && is_storage_isolated_; } |
| const ExtensionExtent& web_extent() const { return extent_; } |
| const std::string& launch_local_path() const { return launch_local_path_; } |
| const std::string& launch_web_url() const { return launch_web_url_; } |
| extension_misc::LaunchContainer launch_container() const { |
| return launch_container_; |
| } |
| int launch_width() const { return launch_width_; } |
| int launch_height() const { return launch_height_; } |
| |
| // Theme-related. |
| bool is_theme() const { return is_theme_; } |
| DictionaryValue* GetThemeImages() const { return theme_images_.get(); } |
| DictionaryValue* GetThemeColors() const {return theme_colors_.get(); } |
| DictionaryValue* GetThemeTints() const { return theme_tints_.get(); } |
| DictionaryValue* GetThemeDisplayProperties() const { |
| return theme_display_properties_.get(); |
| } |
| |
| private: |
| friend class base::RefCountedThreadSafe<Extension>; |
| |
| // We keep a cache of images loaded from extension resources based on their |
| // path and a string representation of a size that may have been used to |
| // scale it (or the empty string if the image is at its original size). |
| typedef std::pair<FilePath, std::string> ImageCacheKey; |
| typedef std::map<ImageCacheKey, SkBitmap> ImageCache; |
| |
| // Normalize the path for use by the extension. On Windows, this will make |
| // sure the drive letter is uppercase. |
| static FilePath MaybeNormalizePath(const FilePath& path); |
| |
| // Returns the distinct hosts that can be displayed in the install UI or be |
| // used for privilege comparisons. This discards some of the detail that is |
| // present in the manifest to make it as easy as possible to process by users. |
| // In particular we disregard the scheme and path components of URLPatterns |
| // and de-dupe the result, which includes filtering out common hosts with |
| // differing RCDs. If |include_rcd| is true, then the de-duped result |
| // will be the first full entry, including its RCD. So if the list was |
| // "*.google.co.uk" and "*.google.com", the returned value would just be |
| // "*.google.co.uk". Keeping the RCD in the result is useful for display |
| // purposes when you want to show the user one sample hostname from the list. |
| // If you need to compare two URLPatternLists for security equality, then set |
| // |include_rcd| to false, which will return a result like "*.google.", |
| // regardless of the order of the patterns. |
| static std::vector<std::string> GetDistinctHosts( |
| const URLPatternList& host_patterns, bool include_rcd); |
| |
| Extension(const FilePath& path, Location location); |
| ~Extension(); |
| |
| // Initialize the extension from a parsed manifest. |
| bool InitFromValue(const DictionaryValue& value, int flags, |
| std::string* error); |
| |
| // Helper function for implementing HasCachedImage/GetCachedImage. A return |
| // value of NULL means there is no matching image cached (we allow caching an |
| // empty SkBitmap). |
| SkBitmap* GetCachedImageImpl(const ExtensionResource& source, |
| const gfx::Size& max_size) const; |
| |
| // Helper method that loads a UserScript object from a |
| // dictionary in the content_script list of the manifest. |
| bool LoadUserScriptHelper(const DictionaryValue* content_script, |
| int definition_index, |
| int flags, |
| std::string* error, |
| UserScript* result); |
| |
| // Helper method that loads either the include_globs or exclude_globs list |
| // from an entry in the content_script lists of the manifest. |
| bool LoadGlobsHelper(const DictionaryValue* content_script, |
| int content_script_index, |
| const char* globs_property_name, |
| std::string* error, |
| void(UserScript::*add_method)(const std::string& glob), |
| UserScript *instance); |
| |
| // Helpers to load various chunks of the manifest. |
| bool LoadIsApp(const DictionaryValue* manifest, std::string* error); |
| bool LoadExtent(const DictionaryValue* manifest, |
| const char* key, |
| ExtensionExtent* extent, |
| const char* list_error, |
| const char* value_error, |
| URLPattern::ParseOption parse_strictness, |
| std::string* error); |
| bool LoadLaunchContainer(const DictionaryValue* manifest, std::string* error); |
| bool LoadLaunchURL(const DictionaryValue* manifest, std::string* error); |
| bool LoadAppIsolation(const DictionaryValue* manifest, std::string* error); |
| bool EnsureNotHybridApp(const DictionaryValue* manifest, std::string* error); |
| |
| // Helper method to load an ExtensionAction from the page_action or |
| // browser_action entries in the manifest. |
| ExtensionAction* LoadExtensionActionHelper( |
| const DictionaryValue* extension_action, std::string* error); |
| |
| // Helper method to load an FileBrowserHandlerList from the manifest. |
| FileBrowserHandlerList* LoadFileBrowserHandlers( |
| const ListValue* extension_actions, std::string* error); |
| // Helper method to load an FileBrowserHandler from manifest. |
| FileBrowserHandler* LoadFileBrowserHandler( |
| const DictionaryValue* file_browser_handlers, std::string* error); |
| |
| // Helper method to load an ExtensionSidebarDefaults from the sidebar manifest |
| // entry. |
| ExtensionSidebarDefaults* LoadExtensionSidebarDefaults( |
| const DictionaryValue* sidebar, std::string* error); |
| |
| // Calculates the effective host permissions from the permissions and content |
| // script petterns. |
| void InitEffectiveHostPermissions(); |
| |
| // Returns true if the extension has more than one "UI surface". For example, |
| // an extension that has a browser action and a page action. |
| bool HasMultipleUISurfaces() const; |
| |
| // Figures out if a source contains keys not associated with themes - we |
| // don't want to allow scripts and such to be bundled with themes. |
| bool ContainsNonThemeKeys(const DictionaryValue& source) const; |
| |
| // Returns true if the string is one of the known api permissions (see |
| // kPermissions). |
| bool IsAPIPermission(const std::string& permission) const; |
| |
| // Returns true if this is a component, or we are not attempting to access a |
| // component-private permission. |
| bool IsComponentOnlyPermission(const std::string& permission) const; |
| |
| // The set of unique API install messages that the extension has. |
| // NOTE: This only includes messages related to permissions declared in the |
| // "permissions" key in the manifest. Permissions implied from other features |
| // of the manifest, like plugins and content scripts are not included. |
| std::set<PermissionMessage> GetSimplePermissionMessages() const; |
| |
| // Cached images for this extension. This should only be touched on the UI |
| // thread. |
| mutable ImageCache image_cache_; |
| |
| // A persistent, globally unique ID. An extension's ID is used in things |
| // like directory structures and URLs, and is expected to not change across |
| // versions. It is generated as a SHA-256 hash of the extension's public |
| // key, or as a hash of the path in the case of unpacked extensions. |
| std::string id_; |
| |
| // The extension's human-readable name. Name is used for display purpose. It |
| // might be wrapped with unicode bidi control characters so that it is |
| // displayed correctly in RTL context. |
| // NOTE: Name is UTF-8 and may contain non-ascii characters. |
| std::string name_; |
| |
| // The absolute path to the directory the extension is stored in. |
| FilePath path_; |
| |
| // Default locale for fall back. Can be empty if extension is not localized. |
| std::string default_locale_; |
| |
| // If true, a separate process will be used for the extension in incognito |
| // mode. |
| bool incognito_split_mode_; |
| |
| // Defines the set of URLs in the extension's web content. |
| ExtensionExtent extent_; |
| |
| // The set of host permissions that the extension effectively has access to, |
| // which is a merge of host_permissions_ and all of the match patterns in |
| // any content scripts the extension has. This is used to determine which |
| // URLs have the ability to load an extension's resources via embedded |
| // chrome-extension: URLs (see extension_protocols.cc). |
| ExtensionExtent effective_host_permissions_; |
| |
| // The set of module-level APIs this extension can use. |
| std::set<std::string> api_permissions_; |
| |
| // The icons for the extension. |
| ExtensionIconSet icons_; |
| |
| // The base extension url for the extension. |
| GURL extension_url_; |
| |
| // The location the extension was loaded from. |
| Location location_; |
| |
| // The extension's version. |
| scoped_ptr<Version> version_; |
| |
| // An optional longer description of the extension. |
| std::string description_; |
| |
| // True if the extension was generated from a user script. (We show slightly |
| // different UI if so). |
| bool converted_from_user_script_; |
| |
| // Paths to the content scripts the extension contains. |
| UserScriptList content_scripts_; |
| |
| // The extension's page action, if any. |
| scoped_ptr<ExtensionAction> page_action_; |
| |
| // The extension's browser action, if any. |
| scoped_ptr<ExtensionAction> browser_action_; |
| |
| // The extension's file browser actions, if any. |
| scoped_ptr<FileBrowserHandlerList> file_browser_handlers_; |
| |
| // The extension's sidebar, if any. |
| scoped_ptr<ExtensionSidebarDefaults> sidebar_defaults_; |
| |
| // Optional list of NPAPI plugins and associated properties. |
| std::vector<PluginInfo> plugins_; |
| |
| // Optional list of NaCl modules and associated properties. |
| std::vector<NaClModuleInfo> nacl_modules_; |
| |
| // Optional URL to a master page of which a single instance should be always |
| // loaded in the background. |
| GURL background_url_; |
| |
| // Optional URL to a page for setting options/preferences. |
| GURL options_url_; |
| |
| // Optional URL to a devtools extension page. |
| GURL devtools_url_; |
| |
| // Optional list of toolstrips and associated properties. |
| std::vector<GURL> toolstrips_; |
| |
| // The public key used to sign the contents of the crx package. |
| std::string public_key_; |
| |
| // A map of resource id's to relative file paths. |
| scoped_ptr<DictionaryValue> theme_images_; |
| |
| // A map of color names to colors. |
| scoped_ptr<DictionaryValue> theme_colors_; |
| |
| // A map of color names to colors. |
| scoped_ptr<DictionaryValue> theme_tints_; |
| |
| // A map of display properties. |
| scoped_ptr<DictionaryValue> theme_display_properties_; |
| |
| // Whether the extension is a theme. |
| bool is_theme_; |
| |
| // The sites this extension has permission to talk to (using XHR, etc). |
| URLPatternList host_permissions_; |
| |
| // The homepage for this extension. Useful if it is not hosted by Google and |
| // therefore does not have a Gallery URL. |
| GURL homepage_url_; |
| |
| // URL for fetching an update manifest |
| GURL update_url_; |
| |
| // A copy of the manifest that this extension was created from. |
| scoped_ptr<DictionaryValue> manifest_value_; |
| |
| // A map of chrome:// hostnames (newtab, downloads, etc.) to Extension URLs |
| // which override the handling of those URLs. (see ExtensionOverrideUI). |
| URLOverrideMap chrome_url_overrides_; |
| |
| // Whether this extension uses app features. |
| bool is_app_; |
| |
| // Whether this extension requests isolated storage. |
| bool is_storage_isolated_; |
| |
| // The local path inside the extension to use with the launcher. |
| std::string launch_local_path_; |
| |
| // A web url to use with the launcher. Note that this might be relative or |
| // absolute. If relative, it is relative to web_origin. |
| std::string launch_web_url_; |
| |
| // The window type that an app's manifest specifies to launch into. |
| // This is not always the window type an app will open into, because |
| // users can override the way each app launches. See |
| // ExtensionPrefs::GetLaunchContainer(), which looks at a per-app pref |
| // to decide what container an app will launch in. |
| extension_misc::LaunchContainer launch_container_; |
| |
| // The default size of the container when launching. Only respected for |
| // containers like panels and windows. |
| int launch_width_; |
| int launch_height_; |
| |
| // The Omnibox keyword for this extension, or empty if there is none. |
| std::string omnibox_keyword_; |
| |
| // List of text-to-speech voices that this extension provides, if any. |
| std::vector<TtsVoice> tts_voices_; |
| |
| // Whether the extension has host permissions or user script patterns that |
| // imply access to file:/// scheme URLs (the user may not have actually |
| // granted it that access). |
| bool wants_file_access_; |
| |
| FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest, |
| UpdateExtensionPreservesLocation); |
| FRIEND_TEST_ALL_PREFIXES(ExtensionTest, LoadPageActionHelper); |
| FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueInvalid); |
| FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValid); |
| FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValidNameInRTL); |
| FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); |
| |
| DISALLOW_COPY_AND_ASSIGN(Extension); |
| }; |
| |
| typedef std::vector< scoped_refptr<const Extension> > ExtensionList; |
| typedef std::set<std::string> ExtensionIdSet; |
| |
| // Handy struct to pass core extension info around. |
| struct ExtensionInfo { |
| ExtensionInfo(const DictionaryValue* manifest, |
| const std::string& id, |
| const FilePath& path, |
| Extension::Location location); |
| ~ExtensionInfo(); |
| |
| scoped_ptr<DictionaryValue> extension_manifest; |
| std::string extension_id; |
| FilePath extension_path; |
| Extension::Location extension_location; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(ExtensionInfo); |
| }; |
| |
| // Struct used for the details of the EXTENSION_UNINSTALLED |
| // notification. |
| struct UninstalledExtensionInfo { |
| explicit UninstalledExtensionInfo(const Extension& extension); |
| ~UninstalledExtensionInfo(); |
| |
| std::string extension_id; |
| std::set<std::string> extension_api_permissions; |
| Extension::Type extension_type; |
| GURL update_url; |
| }; |
| |
| struct UnloadedExtensionInfo { |
| enum Reason { |
| DISABLE, // The extension is being disabled. |
| UPDATE, // The extension is being updated to a newer version. |
| UNINSTALL, // The extension is being uninstalled. |
| }; |
| |
| Reason reason; |
| |
| // Was the extension already disabled? |
| bool already_disabled; |
| |
| // The extension being unloaded - this should always be non-NULL. |
| const Extension* extension; |
| |
| UnloadedExtensionInfo(const Extension* extension, Reason reason); |
| }; |
| |
| #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_H_ |