OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_H_ | 5 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_H_ |
6 #define CHROME_COMMON_EXTENSIONS_EXTENSION_H_ | 6 #define CHROME_COMMON_EXTENSIONS_EXTENSION_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 #include <string> | 11 #include <string> |
12 #include <vector> | 12 #include <vector> |
13 | 13 |
14 #include "base/file_path.h" | 14 #include "base/file_path.h" |
15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
16 #include "base/memory/linked_ptr.h" | 16 #include "base/memory/linked_ptr.h" |
17 #include "base/memory/ref_counted.h" | 17 #include "base/memory/ref_counted.h" |
18 #include "base/memory/scoped_ptr.h" | 18 #include "base/memory/scoped_ptr.h" |
19 #include "chrome/common/extensions/extension_constants.h" | 19 #include "chrome/common/extensions/extension_constants.h" |
20 #include "chrome/common/extensions/extension_icon_set.h" | 20 #include "chrome/common/extensions/extension_icon_set.h" |
21 #include "chrome/common/extensions/extension_permission_set.h" | 21 #include "chrome/common/extensions/extension_permission_set.h" |
22 #include "chrome/common/extensions/user_script.h" | 22 #include "chrome/common/extensions/user_script.h" |
23 #include "chrome/common/extensions/url_pattern.h" | 23 #include "chrome/common/extensions/url_pattern.h" |
24 #include "chrome/common/extensions/url_pattern_set.h" | 24 #include "chrome/common/extensions/url_pattern_set.h" |
25 #include "googleurl/src/gurl.h" | 25 #include "googleurl/src/gurl.h" |
26 #include "ui/gfx/size.h" | 26 #include "ui/gfx/size.h" |
27 | 27 |
28 class DictionaryValue; | |
29 class ExtensionAction; | 28 class ExtensionAction; |
30 class ExtensionResource; | 29 class ExtensionResource; |
31 class ExtensionSidebarDefaults; | 30 class ExtensionSidebarDefaults; |
32 class FileBrowserHandler; | 31 class FileBrowserHandler; |
33 class ListValue; | |
34 class SkBitmap; | 32 class SkBitmap; |
35 class Version; | 33 class Version; |
36 | 34 |
| 35 namespace base { |
| 36 class DictionaryValue; |
| 37 class ListValue; |
| 38 } |
| 39 |
37 // Represents a Chrome extension. | 40 // Represents a Chrome extension. |
38 class Extension : public base::RefCountedThreadSafe<Extension> { | 41 class Extension : public base::RefCountedThreadSafe<Extension> { |
39 public: | 42 public: |
40 typedef std::map<const std::string, GURL> URLOverrideMap; | 43 typedef std::map<const std::string, GURL> URLOverrideMap; |
41 typedef std::vector<std::string> ScriptingWhitelist; | 44 typedef std::vector<std::string> ScriptingWhitelist; |
42 typedef std::vector<linked_ptr<FileBrowserHandler> > FileBrowserHandlerList; | 45 typedef std::vector<linked_ptr<FileBrowserHandler> > FileBrowserHandlerList; |
43 | 46 |
44 // What an extension was loaded from. | 47 // What an extension was loaded from. |
45 // NOTE: These values are stored as integers in the preferences and used | 48 // NOTE: These values are stored as integers in the preferences and used |
46 // in histograms so don't remove or reorder existing items. Just append | 49 // in histograms so don't remove or reorder existing items. Just append |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 STRICT_ERROR_CHECKS = 1 << 1, | 172 STRICT_ERROR_CHECKS = 1 << 1, |
170 | 173 |
171 // |ALLOW_FILE_ACCESS| indicates that the user is allowing this extension | 174 // |ALLOW_FILE_ACCESS| indicates that the user is allowing this extension |
172 // to have file access. If it's not present, then permissions and content | 175 // to have file access. If it's not present, then permissions and content |
173 // scripts that match file:/// URLs will be filtered out. | 176 // scripts that match file:/// URLs will be filtered out. |
174 ALLOW_FILE_ACCESS = 1 << 2, | 177 ALLOW_FILE_ACCESS = 1 << 2, |
175 }; | 178 }; |
176 | 179 |
177 static scoped_refptr<Extension> Create(const FilePath& path, | 180 static scoped_refptr<Extension> Create(const FilePath& path, |
178 Location location, | 181 Location location, |
179 const DictionaryValue& value, | 182 const base::DictionaryValue& value, |
180 int flags, | 183 int flags, |
181 std::string* error); | 184 std::string* error); |
182 | 185 |
183 // In a few special circumstances, we want to create an Extension and give it | 186 // In a few special circumstances, we want to create an Extension and give it |
184 // an explicit id. Most consumers should just use the plain Create() method. | 187 // an explicit id. Most consumers should just use the plain Create() method. |
185 static scoped_refptr<Extension> CreateWithId(const FilePath& path, | 188 static scoped_refptr<Extension> CreateWithId( |
186 Location location, | 189 const FilePath& path, |
187 const DictionaryValue& value, | 190 Location location, |
188 int flags, | 191 const base::DictionaryValue& value, |
189 const std::string& explicit_id, | 192 int flags, |
190 std::string* error); | 193 const std::string& explicit_id, |
| 194 std::string* error); |
191 | 195 |
192 // Return the update url used by gallery/webstore extensions. | 196 // Return the update url used by gallery/webstore extensions. |
193 static GURL GalleryUpdateUrl(bool secure); | 197 static GURL GalleryUpdateUrl(bool secure); |
194 | 198 |
195 // Given two install sources, return the one which should take priority | 199 // Given two install sources, return the one which should take priority |
196 // over the other. If an extension is installed from two sources A and B, | 200 // over the other. If an extension is installed from two sources A and B, |
197 // its install source should be set to GetHigherPriorityLocation(A, B). | 201 // its install source should be set to GetHigherPriorityLocation(A, B). |
198 static Location GetHigherPriorityLocation(Location loc1, Location loc2); | 202 static Location GetHigherPriorityLocation(Location loc1, Location loc2); |
199 | 203 |
200 // Returns the full list of permission messages that this extension | 204 // Returns the full list of permission messages that this extension |
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 } | 484 } |
481 const GURL& background_url() const { return background_url_; } | 485 const GURL& background_url() const { return background_url_; } |
482 const GURL& options_url() const { return options_url_; } | 486 const GURL& options_url() const { return options_url_; } |
483 const GURL& devtools_url() const { return devtools_url_; } | 487 const GURL& devtools_url() const { return devtools_url_; } |
484 const std::vector<GURL>& toolstrips() const { return toolstrips_; } | 488 const std::vector<GURL>& toolstrips() const { return toolstrips_; } |
485 const ExtensionPermissionSet* permission_set() const { | 489 const ExtensionPermissionSet* permission_set() const { |
486 return permission_set_.get(); | 490 return permission_set_.get(); |
487 } | 491 } |
488 const GURL& update_url() const { return update_url_; } | 492 const GURL& update_url() const { return update_url_; } |
489 const ExtensionIconSet& icons() const { return icons_; } | 493 const ExtensionIconSet& icons() const { return icons_; } |
490 const DictionaryValue* manifest_value() const { | 494 const base::DictionaryValue* manifest_value() const { |
491 return manifest_value_.get(); | 495 return manifest_value_.get(); |
492 } | 496 } |
493 const std::string default_locale() const { return default_locale_; } | 497 const std::string default_locale() const { return default_locale_; } |
494 const URLOverrideMap& GetChromeURLOverrides() const { | 498 const URLOverrideMap& GetChromeURLOverrides() const { |
495 return chrome_url_overrides_; | 499 return chrome_url_overrides_; |
496 } | 500 } |
497 const std::string omnibox_keyword() const { return omnibox_keyword_; } | 501 const std::string omnibox_keyword() const { return omnibox_keyword_; } |
498 bool incognito_split_mode() const { return incognito_split_mode_; } | 502 bool incognito_split_mode() const { return incognito_split_mode_; } |
499 const std::vector<TtsVoice>& tts_voices() const { return tts_voices_; } | 503 const std::vector<TtsVoice>& tts_voices() const { return tts_voices_; } |
500 | 504 |
(...skipping 12 matching lines...) Expand all Loading... |
513 const std::string& launch_local_path() const { return launch_local_path_; } | 517 const std::string& launch_local_path() const { return launch_local_path_; } |
514 const std::string& launch_web_url() const { return launch_web_url_; } | 518 const std::string& launch_web_url() const { return launch_web_url_; } |
515 extension_misc::LaunchContainer launch_container() const { | 519 extension_misc::LaunchContainer launch_container() const { |
516 return launch_container_; | 520 return launch_container_; |
517 } | 521 } |
518 int launch_width() const { return launch_width_; } | 522 int launch_width() const { return launch_width_; } |
519 int launch_height() const { return launch_height_; } | 523 int launch_height() const { return launch_height_; } |
520 | 524 |
521 // Theme-related. | 525 // Theme-related. |
522 bool is_theme() const { return is_theme_; } | 526 bool is_theme() const { return is_theme_; } |
523 DictionaryValue* GetThemeImages() const { return theme_images_.get(); } | 527 base::DictionaryValue* GetThemeImages() const { return theme_images_.get(); } |
524 DictionaryValue* GetThemeColors() const {return theme_colors_.get(); } | 528 base::DictionaryValue* GetThemeColors() const {return theme_colors_.get(); } |
525 DictionaryValue* GetThemeTints() const { return theme_tints_.get(); } | 529 base::DictionaryValue* GetThemeTints() const { return theme_tints_.get(); } |
526 DictionaryValue* GetThemeDisplayProperties() const { | 530 base::DictionaryValue* GetThemeDisplayProperties() const { |
527 return theme_display_properties_.get(); | 531 return theme_display_properties_.get(); |
528 } | 532 } |
529 | 533 |
530 private: | 534 private: |
531 friend class base::RefCountedThreadSafe<Extension>; | 535 friend class base::RefCountedThreadSafe<Extension>; |
532 | 536 |
533 // We keep a cache of images loaded from extension resources based on their | 537 // We keep a cache of images loaded from extension resources based on their |
534 // path and a string representation of a size that may have been used to | 538 // path and a string representation of a size that may have been used to |
535 // scale it (or the empty string if the image is at its original size). | 539 // scale it (or the empty string if the image is at its original size). |
536 typedef std::pair<FilePath, std::string> ImageCacheKey; | 540 typedef std::pair<FilePath, std::string> ImageCacheKey; |
(...skipping 19 matching lines...) Expand all Loading... |
556 static std::vector<std::string> GetDistinctHosts( | 560 static std::vector<std::string> GetDistinctHosts( |
557 const URLPatternList& host_patterns, bool include_rcd); | 561 const URLPatternList& host_patterns, bool include_rcd); |
558 | 562 |
559 // Returns true if this extension id is from a trusted provider. | 563 // Returns true if this extension id is from a trusted provider. |
560 static bool IsTrustedId(const std::string& id); | 564 static bool IsTrustedId(const std::string& id); |
561 | 565 |
562 Extension(const FilePath& path, Location location); | 566 Extension(const FilePath& path, Location location); |
563 ~Extension(); | 567 ~Extension(); |
564 | 568 |
565 // Initialize the extension from a parsed manifest. | 569 // Initialize the extension from a parsed manifest. |
566 bool InitFromValue(const DictionaryValue& value, int flags, | 570 bool InitFromValue(const base::DictionaryValue& value, int flags, |
567 std::string* error); | 571 std::string* error); |
568 | 572 |
569 // Helper function for implementing HasCachedImage/GetCachedImage. A return | 573 // Helper function for implementing HasCachedImage/GetCachedImage. A return |
570 // value of NULL means there is no matching image cached (we allow caching an | 574 // value of NULL means there is no matching image cached (we allow caching an |
571 // empty SkBitmap). | 575 // empty SkBitmap). |
572 SkBitmap* GetCachedImageImpl(const ExtensionResource& source, | 576 SkBitmap* GetCachedImageImpl(const ExtensionResource& source, |
573 const gfx::Size& max_size) const; | 577 const gfx::Size& max_size) const; |
574 | 578 |
575 // Helper method that loads a UserScript object from a | 579 // Helper method that loads a UserScript object from a |
576 // dictionary in the content_script list of the manifest. | 580 // dictionary in the content_script list of the manifest. |
577 bool LoadUserScriptHelper(const DictionaryValue* content_script, | 581 bool LoadUserScriptHelper(const base::DictionaryValue* content_script, |
578 int definition_index, | 582 int definition_index, |
579 int flags, | 583 int flags, |
580 std::string* error, | 584 std::string* error, |
581 UserScript* result); | 585 UserScript* result); |
582 | 586 |
583 // Helper method that loads either the include_globs or exclude_globs list | 587 // Helper method that loads either the include_globs or exclude_globs list |
584 // from an entry in the content_script lists of the manifest. | 588 // from an entry in the content_script lists of the manifest. |
585 bool LoadGlobsHelper(const DictionaryValue* content_script, | 589 bool LoadGlobsHelper(const base::DictionaryValue* content_script, |
586 int content_script_index, | 590 int content_script_index, |
587 const char* globs_property_name, | 591 const char* globs_property_name, |
588 std::string* error, | 592 std::string* error, |
589 void(UserScript::*add_method)(const std::string& glob), | 593 void(UserScript::*add_method)(const std::string& glob), |
590 UserScript *instance); | 594 UserScript *instance); |
591 | 595 |
592 // Helpers to load various chunks of the manifest. | 596 // Helpers to load various chunks of the manifest. |
593 bool LoadIsApp(const DictionaryValue* manifest, std::string* error); | 597 bool LoadIsApp(const base::DictionaryValue* manifest, std::string* error); |
594 bool LoadExtent(const DictionaryValue* manifest, | 598 bool LoadExtent(const base::DictionaryValue* manifest, |
595 const char* key, | 599 const char* key, |
596 URLPatternSet* extent, | 600 URLPatternSet* extent, |
597 const char* list_error, | 601 const char* list_error, |
598 const char* value_error, | 602 const char* value_error, |
599 URLPattern::ParseOption parse_strictness, | 603 URLPattern::ParseOption parse_strictness, |
600 std::string* error); | 604 std::string* error); |
601 bool LoadLaunchContainer(const DictionaryValue* manifest, std::string* error); | 605 bool LoadLaunchContainer(const base::DictionaryValue* manifest, |
602 bool LoadLaunchURL(const DictionaryValue* manifest, std::string* error); | 606 std::string* error); |
603 bool LoadAppIsolation(const DictionaryValue* manifest, std::string* error); | 607 bool LoadLaunchURL(const base::DictionaryValue* manifest, |
604 bool EnsureNotHybridApp(const DictionaryValue* manifest, std::string* error); | 608 std::string* error); |
| 609 bool LoadAppIsolation(const base::DictionaryValue* manifest, |
| 610 std::string* error); |
| 611 bool EnsureNotHybridApp(const base::DictionaryValue* manifest, |
| 612 std::string* error); |
605 | 613 |
606 // Helper method to load an ExtensionAction from the page_action or | 614 // Helper method to load an ExtensionAction from the page_action or |
607 // browser_action entries in the manifest. | 615 // browser_action entries in the manifest. |
608 ExtensionAction* LoadExtensionActionHelper( | 616 ExtensionAction* LoadExtensionActionHelper( |
609 const DictionaryValue* extension_action, std::string* error); | 617 const base::DictionaryValue* extension_action, std::string* error); |
610 | 618 |
611 // Helper method to load an FileBrowserHandlerList from the manifest. | 619 // Helper method to load an FileBrowserHandlerList from the manifest. |
612 FileBrowserHandlerList* LoadFileBrowserHandlers( | 620 FileBrowserHandlerList* LoadFileBrowserHandlers( |
613 const ListValue* extension_actions, std::string* error); | 621 const base::ListValue* extension_actions, std::string* error); |
614 // Helper method to load an FileBrowserHandler from manifest. | 622 // Helper method to load an FileBrowserHandler from manifest. |
615 FileBrowserHandler* LoadFileBrowserHandler( | 623 FileBrowserHandler* LoadFileBrowserHandler( |
616 const DictionaryValue* file_browser_handlers, std::string* error); | 624 const base::DictionaryValue* file_browser_handlers, std::string* error); |
617 | 625 |
618 // Helper method to load an ExtensionSidebarDefaults from the sidebar manifest | 626 // Helper method to load an ExtensionSidebarDefaults from the sidebar manifest |
619 // entry. | 627 // entry. |
620 ExtensionSidebarDefaults* LoadExtensionSidebarDefaults( | 628 ExtensionSidebarDefaults* LoadExtensionSidebarDefaults( |
621 const DictionaryValue* sidebar, std::string* error); | 629 const base::DictionaryValue* sidebar, std::string* error); |
622 | 630 |
623 // Returns true if the extension has more than one "UI surface". For example, | 631 // Returns true if the extension has more than one "UI surface". For example, |
624 // an extension that has a browser action and a page action. | 632 // an extension that has a browser action and a page action. |
625 bool HasMultipleUISurfaces() const; | 633 bool HasMultipleUISurfaces() const; |
626 | 634 |
627 // Figures out if a source contains keys not associated with themes - we | 635 // Figures out if a source contains keys not associated with themes - we |
628 // don't want to allow scripts and such to be bundled with themes. | 636 // don't want to allow scripts and such to be bundled with themes. |
629 bool ContainsNonThemeKeys(const DictionaryValue& source) const; | 637 bool ContainsNonThemeKeys(const base::DictionaryValue& source) const; |
630 | 638 |
631 // Only allow the experimental API permission if the command line | 639 // Only allow the experimental API permission if the command line |
632 // flag is present. | 640 // flag is present. |
633 bool IsDisallowedExperimentalPermission( | 641 bool IsDisallowedExperimentalPermission( |
634 ExtensionAPIPermission::ID permission) const; | 642 ExtensionAPIPermission::ID permission) const; |
635 | 643 |
636 // Returns true if this is a component, or we are not attempting to access a | 644 // Returns true if this is a component, or we are not attempting to access a |
637 // component-private permission. | 645 // component-private permission. |
638 bool IsComponentOnlyPermission(const ExtensionAPIPermission* api) const; | 646 bool IsComponentOnlyPermission(const ExtensionAPIPermission* api) const; |
639 | 647 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 // Optional URL to a devtools extension page. | 730 // Optional URL to a devtools extension page. |
723 GURL devtools_url_; | 731 GURL devtools_url_; |
724 | 732 |
725 // Optional list of toolstrips and associated properties. | 733 // Optional list of toolstrips and associated properties. |
726 std::vector<GURL> toolstrips_; | 734 std::vector<GURL> toolstrips_; |
727 | 735 |
728 // The public key used to sign the contents of the crx package. | 736 // The public key used to sign the contents of the crx package. |
729 std::string public_key_; | 737 std::string public_key_; |
730 | 738 |
731 // A map of resource id's to relative file paths. | 739 // A map of resource id's to relative file paths. |
732 scoped_ptr<DictionaryValue> theme_images_; | 740 scoped_ptr<base::DictionaryValue> theme_images_; |
733 | 741 |
734 // A map of color names to colors. | 742 // A map of color names to colors. |
735 scoped_ptr<DictionaryValue> theme_colors_; | 743 scoped_ptr<base::DictionaryValue> theme_colors_; |
736 | 744 |
737 // A map of color names to colors. | 745 // A map of color names to colors. |
738 scoped_ptr<DictionaryValue> theme_tints_; | 746 scoped_ptr<base::DictionaryValue> theme_tints_; |
739 | 747 |
740 // A map of display properties. | 748 // A map of display properties. |
741 scoped_ptr<DictionaryValue> theme_display_properties_; | 749 scoped_ptr<base::DictionaryValue> theme_display_properties_; |
742 | 750 |
743 // Whether the extension is a theme. | 751 // Whether the extension is a theme. |
744 bool is_theme_; | 752 bool is_theme_; |
745 | 753 |
746 // The homepage for this extension. Useful if it is not hosted by Google and | 754 // The homepage for this extension. Useful if it is not hosted by Google and |
747 // therefore does not have a Gallery URL. | 755 // therefore does not have a Gallery URL. |
748 GURL homepage_url_; | 756 GURL homepage_url_; |
749 | 757 |
750 // URL for fetching an update manifest | 758 // URL for fetching an update manifest |
751 GURL update_url_; | 759 GURL update_url_; |
752 | 760 |
753 // A copy of the manifest that this extension was created from. | 761 // A copy of the manifest that this extension was created from. |
754 scoped_ptr<DictionaryValue> manifest_value_; | 762 scoped_ptr<base::DictionaryValue> manifest_value_; |
755 | 763 |
756 // A map of chrome:// hostnames (newtab, downloads, etc.) to Extension URLs | 764 // A map of chrome:// hostnames (newtab, downloads, etc.) to Extension URLs |
757 // which override the handling of those URLs. (see ExtensionOverrideUI). | 765 // which override the handling of those URLs. (see ExtensionOverrideUI). |
758 URLOverrideMap chrome_url_overrides_; | 766 URLOverrideMap chrome_url_overrides_; |
759 | 767 |
760 // Whether this extension uses app features. | 768 // Whether this extension uses app features. |
761 bool is_app_; | 769 bool is_app_; |
762 | 770 |
763 // Whether this extension requests isolated storage. | 771 // Whether this extension requests isolated storage. |
764 bool is_storage_isolated_; | 772 bool is_storage_isolated_; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); | 812 FRIEND_TEST_ALL_PREFIXES(TabStripModelTest, Apps); |
805 | 813 |
806 DISALLOW_COPY_AND_ASSIGN(Extension); | 814 DISALLOW_COPY_AND_ASSIGN(Extension); |
807 }; | 815 }; |
808 | 816 |
809 typedef std::vector< scoped_refptr<const Extension> > ExtensionList; | 817 typedef std::vector< scoped_refptr<const Extension> > ExtensionList; |
810 typedef std::set<std::string> ExtensionIdSet; | 818 typedef std::set<std::string> ExtensionIdSet; |
811 | 819 |
812 // Handy struct to pass core extension info around. | 820 // Handy struct to pass core extension info around. |
813 struct ExtensionInfo { | 821 struct ExtensionInfo { |
814 ExtensionInfo(const DictionaryValue* manifest, | 822 ExtensionInfo(const base::DictionaryValue* manifest, |
815 const std::string& id, | 823 const std::string& id, |
816 const FilePath& path, | 824 const FilePath& path, |
817 Extension::Location location); | 825 Extension::Location location); |
818 ~ExtensionInfo(); | 826 ~ExtensionInfo(); |
819 | 827 |
820 scoped_ptr<DictionaryValue> extension_manifest; | 828 scoped_ptr<base::DictionaryValue> extension_manifest; |
821 std::string extension_id; | 829 std::string extension_id; |
822 FilePath extension_path; | 830 FilePath extension_path; |
823 Extension::Location extension_location; | 831 Extension::Location extension_location; |
824 | 832 |
825 private: | 833 private: |
826 DISALLOW_COPY_AND_ASSIGN(ExtensionInfo); | 834 DISALLOW_COPY_AND_ASSIGN(ExtensionInfo); |
827 }; | 835 }; |
828 | 836 |
829 // Struct used for the details of the EXTENSION_UNINSTALLED | 837 // Struct used for the details of the EXTENSION_UNINSTALLED |
830 // notification. | 838 // notification. |
(...skipping 23 matching lines...) Expand all Loading... |
854 // Was the extension already disabled? | 862 // Was the extension already disabled? |
855 bool already_disabled; | 863 bool already_disabled; |
856 | 864 |
857 // The extension being unloaded - this should always be non-NULL. | 865 // The extension being unloaded - this should always be non-NULL. |
858 const Extension* extension; | 866 const Extension* extension; |
859 | 867 |
860 UnloadedExtensionInfo(const Extension* extension, Reason reason); | 868 UnloadedExtensionInfo(const Extension* extension, Reason reason); |
861 }; | 869 }; |
862 | 870 |
863 #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_H_ | 871 #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_H_ |
OLD | NEW |