| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 #include "chrome/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "base/values.h" | 23 #include "base/values.h" |
| 24 #include "base/version.h" | 24 #include "base/version.h" |
| 25 #include "chrome/common/chrome_constants.h" | 25 #include "chrome/common/chrome_constants.h" |
| 26 #include "chrome/common/chrome_switches.h" | 26 #include "chrome/common/chrome_switches.h" |
| 27 #include "chrome/common/chrome_version_info.h" | 27 #include "chrome/common/chrome_version_info.h" |
| 28 #include "chrome/common/extensions/csp_validator.h" | 28 #include "chrome/common/extensions/csp_validator.h" |
| 29 #include "chrome/common/extensions/extension_action.h" | 29 #include "chrome/common/extensions/extension_action.h" |
| 30 #include "chrome/common/extensions/extension_error_utils.h" | 30 #include "chrome/common/extensions/extension_error_utils.h" |
| 31 #include "chrome/common/extensions/extension_manifest_constants.h" | 31 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 32 #include "chrome/common/extensions/extension_resource.h" | 32 #include "chrome/common/extensions/extension_resource.h" |
| 33 #include "chrome/common/extensions/extension_switch_utils.h" |
| 33 #include "chrome/common/extensions/feature.h" | 34 #include "chrome/common/extensions/feature.h" |
| 34 #include "chrome/common/extensions/file_browser_handler.h" | 35 #include "chrome/common/extensions/file_browser_handler.h" |
| 35 #include "chrome/common/extensions/manifest.h" | 36 #include "chrome/common/extensions/manifest.h" |
| 36 #include "chrome/common/extensions/simple_feature_provider.h" | 37 #include "chrome/common/extensions/simple_feature_provider.h" |
| 37 #include "chrome/common/extensions/user_script.h" | 38 #include "chrome/common/extensions/user_script.h" |
| 38 #include "chrome/common/url_constants.h" | 39 #include "chrome/common/url_constants.h" |
| 39 #include "crypto/sha2.h" | 40 #include "crypto/sha2.h" |
| 40 #include "googleurl/src/url_util.h" | 41 #include "googleurl/src/url_util.h" |
| 41 #include "grit/chromium_strings.h" | 42 #include "grit/chromium_strings.h" |
| 42 #include "grit/generated_resources.h" | 43 #include "grit/generated_resources.h" |
| 43 #include "grit/theme_resources.h" | 44 #include "grit/theme_resources.h" |
| 44 #include "net/base/registry_controlled_domain.h" | 45 #include "net/base/registry_controlled_domain.h" |
| 45 #include "third_party/skia/include/core/SkBitmap.h" | 46 #include "third_party/skia/include/core/SkBitmap.h" |
| 46 #include "ui/base/keycodes/keyboard_codes.h" | 47 #include "ui/base/keycodes/keyboard_codes.h" |
| 47 #include "ui/base/l10n/l10n_util.h" | 48 #include "ui/base/l10n/l10n_util.h" |
| 48 #include "ui/base/resource/resource_bundle.h" | 49 #include "ui/base/resource/resource_bundle.h" |
| 49 #include "webkit/glue/image_decoder.h" | 50 #include "webkit/glue/image_decoder.h" |
| 50 #include "webkit/glue/web_intent_service_data.h" | 51 #include "webkit/glue/web_intent_service_data.h" |
| 51 | 52 |
| 52 namespace keys = extension_manifest_keys; | 53 namespace keys = extension_manifest_keys; |
| 53 namespace values = extension_manifest_values; | 54 namespace values = extension_manifest_values; |
| 54 namespace errors = extension_manifest_errors; | 55 namespace errors = extension_manifest_errors; |
| 55 namespace info_keys = extension_info_keys; | 56 namespace info_keys = extension_info_keys; |
| 57 namespace switch_utils = extensions::switch_utils; |
| 56 | 58 |
| 57 using extensions::csp_validator::ContentSecurityPolicyIsLegal; | 59 using extensions::csp_validator::ContentSecurityPolicyIsLegal; |
| 58 using extensions::csp_validator::ContentSecurityPolicyIsSecure; | 60 using extensions::csp_validator::ContentSecurityPolicyIsSecure; |
| 59 | 61 |
| 60 namespace { | 62 namespace { |
| 61 | 63 |
| 62 const int kModernManifestVersion = 1; | 64 const int kModernManifestVersion = 1; |
| 63 const int kPEMOutputColumns = 65; | 65 const int kPEMOutputColumns = 65; |
| 64 | 66 |
| 65 const char kOverrideExtentUrlPatternFormat[] = "chrome://%s/*"; | 67 const char kOverrideExtentUrlPatternFormat[] = "chrome://%s/*"; |
| (...skipping 2039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 } | 2107 } |
| 2106 } | 2108 } |
| 2107 | 2109 |
| 2108 // If page_action_value is not NULL, then there was a valid page action. | 2110 // If page_action_value is not NULL, then there was a valid page action. |
| 2109 if (page_action_value) { | 2111 if (page_action_value) { |
| 2110 page_action_ = LoadExtensionActionHelper(page_action_value, error); | 2112 page_action_ = LoadExtensionActionHelper(page_action_value, error); |
| 2111 if (!page_action_.get()) | 2113 if (!page_action_.get()) |
| 2112 return false; // Failed to parse page action definition. | 2114 return false; // Failed to parse page action definition. |
| 2113 declared_action_type_ = ExtensionAction::TYPE_PAGE; | 2115 declared_action_type_ = ExtensionAction::TYPE_PAGE; |
| 2114 | 2116 |
| 2115 if (CommandLine::ForCurrentProcess()->HasSwitch( | 2117 // The action box changes the meaning of the page action area, so we need |
| 2116 switches::kEnableBrowserActionsForAll)) { | 2118 // to convert page actions into browser actions. |
| 2119 if (switch_utils::IsActionBoxEnabled()) { |
| 2117 browser_action_ = page_action_.Pass(); | 2120 browser_action_ = page_action_.Pass(); |
| 2118 // declared_action_type_ stays the same; that's the point. | 2121 // declared_action_type_ stays the same; that's the point. |
| 2119 } | 2122 } |
| 2120 } | 2123 } |
| 2121 | 2124 |
| 2122 return true; | 2125 return true; |
| 2123 } | 2126 } |
| 2124 | 2127 |
| 2125 bool Extension::LoadBrowserAction(string16* error) { | 2128 bool Extension::LoadBrowserAction(string16* error) { |
| 2126 if (!manifest_->HasKey(keys::kBrowserAction)) | 2129 if (!manifest_->HasKey(keys::kBrowserAction)) |
| 2127 return true; | 2130 return true; |
| 2128 DictionaryValue* browser_action_value = NULL; | 2131 DictionaryValue* browser_action_value = NULL; |
| 2129 if (!manifest_->GetDictionary(keys::kBrowserAction, &browser_action_value)) { | 2132 if (!manifest_->GetDictionary(keys::kBrowserAction, &browser_action_value)) { |
| 2130 *error = ASCIIToUTF16(errors::kInvalidBrowserAction); | 2133 *error = ASCIIToUTF16(errors::kInvalidBrowserAction); |
| 2131 return false; | 2134 return false; |
| 2132 } | 2135 } |
| 2133 | 2136 |
| 2134 browser_action_ = LoadExtensionActionHelper(browser_action_value, error); | 2137 browser_action_ = LoadExtensionActionHelper(browser_action_value, error); |
| 2135 if (!browser_action_.get()) | 2138 if (!browser_action_.get()) |
| 2136 return false; // Failed to parse browser action definition. | 2139 return false; // Failed to parse browser action definition. |
| 2137 declared_action_type_ = ExtensionAction::TYPE_BROWSER; | 2140 declared_action_type_ = ExtensionAction::TYPE_BROWSER; |
| 2138 return true; | 2141 return true; |
| 2139 } | 2142 } |
| 2140 | 2143 |
| 2141 void Extension::GenerateBrowserActionIfPossible() { | |
| 2142 // It only makes sense to generate brower actions for extensions that are | |
| 2143 // shown in chrome://extensions. | |
| 2144 if (!ShouldDisplayInExtensionSettings()) | |
| 2145 return; | |
| 2146 | |
| 2147 // Hosted and platform apps are shown in extension settings, but we don't | |
| 2148 // want to generate browser actions for those either, since they can't define | |
| 2149 // browser actions. | |
| 2150 if (is_app()) | |
| 2151 return; | |
| 2152 | |
| 2153 browser_action_.reset(new ExtensionAction(id())); | |
| 2154 browser_action_->SetTitle(ExtensionAction::kDefaultTabId, name()); | |
| 2155 } | |
| 2156 | |
| 2157 bool Extension::LoadFileBrowserHandlers(string16* error) { | 2144 bool Extension::LoadFileBrowserHandlers(string16* error) { |
| 2158 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) | 2145 if (!manifest_->HasKey(keys::kFileBrowserHandlers)) |
| 2159 return true; | 2146 return true; |
| 2160 ListValue* file_browser_handlers_value = NULL; | 2147 ListValue* file_browser_handlers_value = NULL; |
| 2161 if (!manifest_->GetList(keys::kFileBrowserHandlers, | 2148 if (!manifest_->GetList(keys::kFileBrowserHandlers, |
| 2162 &file_browser_handlers_value)) { | 2149 &file_browser_handlers_value)) { |
| 2163 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler); | 2150 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler); |
| 2164 return false; | 2151 return false; |
| 2165 } | 2152 } |
| 2166 file_browser_handlers_.reset( | 2153 file_browser_handlers_.reset( |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2907 | 2894 |
| 2908 if (!LoadSharedFeatures(api_permissions, error)) | 2895 if (!LoadSharedFeatures(api_permissions, error)) |
| 2909 return false; | 2896 return false; |
| 2910 | 2897 |
| 2911 if (!LoadExtensionFeatures(api_permissions, error)) | 2898 if (!LoadExtensionFeatures(api_permissions, error)) |
| 2912 return false; | 2899 return false; |
| 2913 | 2900 |
| 2914 if (!LoadThemeFeatures(error)) | 2901 if (!LoadThemeFeatures(error)) |
| 2915 return false; | 2902 return false; |
| 2916 | 2903 |
| 2917 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
| 2918 switches::kEnableBrowserActionsForAll) && | |
| 2919 !browser_action()) { | |
| 2920 GenerateBrowserActionIfPossible(); | |
| 2921 } | |
| 2922 | |
| 2923 if (HasMultipleUISurfaces()) { | 2904 if (HasMultipleUISurfaces()) { |
| 2924 *error = ASCIIToUTF16(errors::kOneUISurfaceOnly); | 2905 *error = ASCIIToUTF16(errors::kOneUISurfaceOnly); |
| 2925 return false; | 2906 return false; |
| 2926 } | 2907 } |
| 2927 | 2908 |
| 2928 runtime_data_.SetActivePermissions(new ExtensionPermissionSet( | 2909 runtime_data_.SetActivePermissions(new ExtensionPermissionSet( |
| 2929 this, api_permissions, host_permissions, oauth2_info_.GetScopesAsSet())); | 2910 this, api_permissions, host_permissions, oauth2_info_.GetScopesAsSet())); |
| 2930 required_permission_set_ = new ExtensionPermissionSet( | 2911 required_permission_set_ = new ExtensionPermissionSet( |
| 2931 this, api_permissions, host_permissions, oauth2_info_.GetScopesAsSet()); | 2912 this, api_permissions, host_permissions, oauth2_info_.GetScopesAsSet()); |
| 2932 optional_permission_set_ = new ExtensionPermissionSet( | 2913 optional_permission_set_ = new ExtensionPermissionSet( |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3563 already_disabled(false), | 3544 already_disabled(false), |
| 3564 extension(extension) {} | 3545 extension(extension) {} |
| 3565 | 3546 |
| 3566 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3547 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
| 3567 const Extension* extension, | 3548 const Extension* extension, |
| 3568 const ExtensionPermissionSet* permissions, | 3549 const ExtensionPermissionSet* permissions, |
| 3569 Reason reason) | 3550 Reason reason) |
| 3570 : reason(reason), | 3551 : reason(reason), |
| 3571 extension(extension), | 3552 extension(extension), |
| 3572 permissions(permissions) {} | 3553 permissions(permissions) {} |
| OLD | NEW |