Index: chrome/common/extensions/extension.h |
diff --git a/chrome/common/extensions/extension.h b/chrome/common/extensions/extension.h |
index 08e4bbb138c1d18dadb410a6afc57f1466973a5a..b96eaecb099271ea52d394965d9fbda4f9abd636 100644 |
--- a/chrome/common/extensions/extension.h |
+++ b/chrome/common/extensions/extension.h |
@@ -100,151 +100,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
bool is_public; // False if only this extension can load this plugin. |
}; |
- // Contains a subset of the extension's data that doesn't change once |
- // initialized, and therefore shareable across threads without locking. |
- struct StaticData : public base::RefCountedThreadSafe<StaticData> { |
- StaticData(); |
- |
- // 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; |
- |
- // Optional list of NPAPI plugins and associated properties. |
- std::vector<PluginInfo> plugins; |
- |
- // 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. |
- URLOverrideMap chrome_url_overrides; |
- |
- // Whether this extension uses app features. |
- bool is_app; |
- |
- // 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 type of container to launch into. |
- 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; |
- |
- protected: |
- friend class base::RefCountedThreadSafe<StaticData>; |
- ~StaticData(); |
- }; |
- |
// Contains the subset of the extension's (private) data that can be modified |
// after initialization. This class should only be accessed on the UI thread. |
struct RuntimeData { |
@@ -464,46 +319,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
// Adds an extension to the scripting whitelist. Used for testing only. |
static void SetScriptingWhitelist(const ScriptingWhitelist& whitelist); |
- const StaticData* static_data() const { return static_data_; } |
- |
- const FilePath& path() const { return static_data_->path; } |
- const GURL& url() const { return static_data_->extension_url; } |
- Location location() const { return static_data_->location; } |
- const std::string& id() const { return static_data_->id; } |
- const Version* version() const { return static_data_->version.get(); } |
- // String representation of the version number. |
- const std::string VersionString() const; |
- const std::string& name() const { return static_data_->name; } |
- const std::string& public_key() const { return static_data_->public_key; } |
- const std::string& description() const { return static_data_->description; } |
- bool converted_from_user_script() const { |
- return static_data_->converted_from_user_script; |
- } |
- const UserScriptList& content_scripts() const { |
- return static_data_->content_scripts; |
- } |
- ExtensionAction* page_action() const { |
- return static_data_->page_action.get(); |
- } |
- ExtensionAction* browser_action() const { |
- return static_data_->browser_action.get(); |
- } |
- const std::vector<PluginInfo>& plugins() const { |
- return static_data_->plugins; |
- } |
- const GURL& background_url() const { return static_data_->background_url; } |
- const GURL& options_url() const { return static_data_->options_url; } |
- const GURL& devtools_url() const { return static_data_->devtools_url; } |
- const std::vector<GURL>& toolstrips() const { |
- return static_data_->toolstrips; |
- } |
- const std::set<std::string>& api_permissions() const { |
- return static_data_->api_permissions; |
- } |
- const URLPatternList& host_permissions() const { |
- return static_data_->host_permissions; |
- } |
- |
// 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); |
@@ -513,7 +328,7 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
} |
const ExtensionExtent& GetEffectiveHostPermissions() const { |
- return static_data_->effective_host_permissions; |
+ return effective_host_permissions_; |
} |
// Whether or not the extension is allowed permission for a URL pattern from |
@@ -532,32 +347,11 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
// network, etc.) |
bool HasEffectiveAccessToAllHosts() const; |
- const GURL& update_url() const { return static_data_->update_url; } |
- |
- const ExtensionIconSet& icons() const { |
- return static_data_->icons; |
- } |
- |
// 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; |
- // Theme-related. |
- DictionaryValue* GetThemeImages() const { |
- return static_data_->theme_images.get(); |
- } |
- DictionaryValue* GetThemeColors() const { |
- return static_data_->theme_colors.get(); |
- } |
- DictionaryValue* GetThemeTints() const { |
- return static_data_->theme_tints.get(); |
- } |
- DictionaryValue* GetThemeDisplayProperties() const { |
- return static_data_->theme_display_properties.get(); |
- } |
- bool is_theme() const { return static_data_->is_theme; } |
- |
// 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; |
@@ -567,44 +361,84 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
int size, ExtensionIconSet::MatchType match_type) const; |
GURL GetIconURL(int size, ExtensionIconSet::MatchType match_type) const; |
- const DictionaryValue* manifest_value() const { |
- return static_data_->manifest_value.get(); |
- } |
- const std::string default_locale() const { |
- return static_data_->default_locale; |
- } |
+ // Gets the fully resolved absolute launch URL. |
+ GURL GetFullLaunchURL() const; |
- // Chrome URL overrides (see ExtensionOverrideUI). |
- const URLOverrideMap& GetChromeURLOverrides() const { |
- return static_data_->chrome_url_overrides; |
- } |
+ // 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 is a COMPONENT extension, or if it is |
+ // on the whitelist of extensions that can script all pages. |
+ bool CanExecuteScriptEverywhere() const; |
- const std::string omnibox_keyword() const { |
- return static_data_->omnibox_keyword; |
- } |
+ // Accessors: |
- bool is_app() const { return static_data_->is_app; } |
- const ExtensionExtent& web_extent() const { |
- return static_data_->extent; |
+ 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(); } |
+ const std::vector<PluginInfo>& plugins() const { return plugins_; } |
+ 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 std::string& launch_local_path() const { |
- return static_data_->launch_local_path; |
+ 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& launch_web_url() const { |
- return static_data_->launch_web_url; |
+ 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_; } |
+ |
+ // 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(); } |
+ 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 static_data_->launch_container; |
- } |
- int launch_width() const { return static_data_->launch_width; } |
- int launch_height() const { return static_data_->launch_height; } |
- bool incognito_split_mode() const { |
- return static_data_->incognito_split_mode; |
+ return launch_container_; |
} |
+ int launch_width() const { return launch_width_; } |
+ int launch_height() const { return launch_height_; } |
- // Gets the fully resolved absolute launch URL. |
- GURL GetFullLaunchURL() const; |
+ // 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(); |
+ } |
// Whether the background page, if any, is ready. We don't load other |
// components until then. If there is no background page, we consider it to |
@@ -619,24 +453,6 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
GetRuntimeData()->being_upgraded = value; |
} |
- // 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; |
- bool is_hosted_app() const { return is_app() && !web_extent().is_empty(); } |
- bool is_packaged_app() const { return is_app() && web_extent().is_empty(); } |
- |
- // 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; |
- |
private: |
friend class base::RefCountedThreadSafe<Extension>; |
@@ -720,16 +536,144 @@ class Extension : public base::RefCountedThreadSafe<Extension> { |
// the UI thread. |
RuntimeData* GetRuntimeData() const; |
- // Collection of extension data that doesn't change doesn't change once an |
- // Extension object has been initialized. The mutable version is valid only |
- // until InitFromValue finishes, to ensure we don't accidentally modify it |
- // post-initialization. |
- StaticData* mutable_static_data_; |
- scoped_refptr<const StaticData> static_data_; |
- |
// Runtime data. |
const RuntimeData runtime_data_; |
+ // 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_; |
+ |
+ // Optional list of NPAPI plugins and associated properties. |
+ std::vector<PluginInfo> plugins_; |
+ |
+ // 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_; |
+ |
+ // 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 type of container to launch into. |
+ 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_; |
+ |
FRIEND_TEST_ALL_PREFIXES(ExtensionTest, LoadPageActionHelper); |
FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueInvalid); |
FRIEND_TEST_ALL_PREFIXES(ExtensionTest, InitFromValueValid); |