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 #include "chrome/common/extensions/extension.h" | 5 #include "chrome/common/extensions/extension.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 if (!GenerateId(path_bytes, &id)) | 357 if (!GenerateId(path_bytes, &id)) |
358 return ""; | 358 return ""; |
359 return id; | 359 return id; |
360 } | 360 } |
361 | 361 |
362 Extension::Type Extension::GetType() const { | 362 Extension::Type Extension::GetType() const { |
363 if (is_theme()) | 363 if (is_theme()) |
364 return TYPE_THEME; | 364 return TYPE_THEME; |
365 if (converted_from_user_script()) | 365 if (converted_from_user_script()) |
366 return TYPE_USER_SCRIPT; | 366 return TYPE_USER_SCRIPT; |
| 367 if (is_platform_app()) |
| 368 return TYPE_PLATFORM_APP; |
367 if (is_hosted_app()) | 369 if (is_hosted_app()) |
368 return TYPE_HOSTED_APP; | 370 return TYPE_HOSTED_APP; |
369 if (is_packaged_app()) | 371 if (is_packaged_app()) |
370 return TYPE_PACKAGED_APP; | 372 return TYPE_PACKAGED_APP; |
371 return TYPE_EXTENSION; | 373 return TYPE_EXTENSION; |
372 } | 374 } |
373 | 375 |
374 // static | 376 // static |
375 GURL Extension::GetResourceURL(const GURL& extension_url, | 377 GURL Extension::GetResourceURL(const GURL& extension_url, |
376 const std::string& relative_path) { | 378 const std::string& relative_path) { |
(...skipping 2470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 } | 2849 } |
2848 } | 2850 } |
2849 | 2851 |
2850 if (permission->id() == ExtensionAPIPermission::kExperimental) { | 2852 if (permission->id() == ExtensionAPIPermission::kExperimental) { |
2851 if (!CanSpecifyExperimentalPermission()) { | 2853 if (!CanSpecifyExperimentalPermission()) { |
2852 *error = errors::kExperimentalFlagRequired; | 2854 *error = errors::kExperimentalFlagRequired; |
2853 return false; | 2855 return false; |
2854 } | 2856 } |
2855 } | 2857 } |
2856 | 2858 |
2857 if (is_hosted_app()) { | 2859 if (location_ == Extension::COMPONENT) |
2858 if (!CanSpecifyPermissionForHostedApp(permission)) { | 2860 return true; |
2859 // Some old versions of Chrome did not return errors here and we ended up | 2861 |
2860 // with extensions in the store containing bad data: crbug.com/101993. | 2862 bool supports_type = false; |
2861 // | 2863 switch (GetType()) { |
2862 // TODO(aa): Consider just being a lot looser when loading and installing | 2864 case TYPE_USER_SCRIPT: // Pass through. |
2863 // extensions. We can be strict when packing and in development mode. Then | 2865 case TYPE_EXTENSION: |
2864 // we won't have to maintain all these tricky backward compat issues: | 2866 supports_type = permission->supports_extensions(); |
2865 // crbug.com/102328. | 2867 break; |
2866 if (creation_flags_ & STRICT_ERROR_CHECKS) { | 2868 case TYPE_HOSTED_APP: |
2867 *error = ExtensionErrorUtils::FormatErrorMessage( | 2869 supports_type = permission->supports_hosted_apps(); |
2868 errors::kPermissionNotAllowed, permission->name()); | 2870 break; |
2869 } | 2871 case TYPE_PACKAGED_APP: |
2870 return false; | 2872 supports_type = permission->supports_packaged_apps(); |
2871 } | 2873 break; |
| 2874 case TYPE_PLATFORM_APP: |
| 2875 supports_type = permission->supports_platform_apps(); |
| 2876 break; |
| 2877 default: |
| 2878 supports_type = false; |
| 2879 break; |
2872 } | 2880 } |
2873 | 2881 |
2874 if (permission->is_platform_app_only()) { | 2882 if (!supports_type) { |
2875 if (!is_platform_app()) { | 2883 // We special case hosted apps because some old versions of Chrome did not |
| 2884 // return errors here and we ended up with extensions in the store |
| 2885 // containing bad data: crbug.com/101993. |
| 2886 // |
| 2887 // TODO(aa): Consider just being a lot looser when loading and installing |
| 2888 // extensions. We can be strict when packing and in development mode. Then |
| 2889 // we won't have to maintain all these tricky backward compat issues: |
| 2890 // crbug.com/102328. |
| 2891 if (!is_hosted_app() || creation_flags_ & STRICT_ERROR_CHECKS) { |
2876 *error = ExtensionErrorUtils::FormatErrorMessage( | 2892 *error = ExtensionErrorUtils::FormatErrorMessage( |
2877 errors::kPermissionNotAllowed, permission->name()); | 2893 errors::kPermissionNotAllowed, permission->name()); |
2878 return false; | |
2879 } | 2894 } |
| 2895 return false; |
2880 } | 2896 } |
2881 | 2897 |
2882 return true; | 2898 return true; |
2883 } | 2899 } |
2884 | 2900 |
2885 bool Extension::CanSpecifyComponentOnlyPermission() const { | 2901 bool Extension::CanSpecifyComponentOnlyPermission() const { |
2886 // Only COMPONENT extensions can use private APIs. | 2902 // Only COMPONENT extensions can use private APIs. |
2887 // TODO(asargent) - We want a more general purpose mechanism for this, | 2903 // TODO(asargent) - We want a more general purpose mechanism for this, |
2888 // and better error messages. (http://crbug.com/54013) | 2904 // and better error messages. (http://crbug.com/54013) |
2889 if (location_ == Extension::COMPONENT) | 2905 if (location_ == Extension::COMPONENT) |
(...skipping 20 matching lines...) Expand all Loading... |
2910 | 2926 |
2911 // We rely on the webstore to check access to experimental. This way we can | 2927 // We rely on the webstore to check access to experimental. This way we can |
2912 // whitelist extensions to have access to experimental in just the store, and | 2928 // whitelist extensions to have access to experimental in just the store, and |
2913 // not have to push a new version of the client. | 2929 // not have to push a new version of the client. |
2914 if (from_webstore()) | 2930 if (from_webstore()) |
2915 return true; | 2931 return true; |
2916 | 2932 |
2917 return false; | 2933 return false; |
2918 } | 2934 } |
2919 | 2935 |
2920 bool Extension::CanSpecifyPermissionForHostedApp( | |
2921 const ExtensionAPIPermission* permission) const { | |
2922 if (location_ == Extension::COMPONENT) | |
2923 return true; | |
2924 | |
2925 if (permission->is_hosted_app()) | |
2926 return true; | |
2927 | |
2928 return false; | |
2929 } | |
2930 | |
2931 bool Extension::CanExecuteScriptEverywhere() const { | 2936 bool Extension::CanExecuteScriptEverywhere() const { |
2932 if (location() == Extension::COMPONENT | 2937 if (location() == Extension::COMPONENT |
2933 #ifndef NDEBUG | 2938 #ifndef NDEBUG |
2934 || CommandLine::ForCurrentProcess()->HasSwitch( | 2939 || CommandLine::ForCurrentProcess()->HasSwitch( |
2935 switches::kExposePrivateExtensionApi) | 2940 switches::kExposePrivateExtensionApi) |
2936 #endif | 2941 #endif |
2937 ) | 2942 ) |
2938 return true; | 2943 return true; |
2939 | 2944 |
2940 ScriptingWhitelist* whitelist = | 2945 ScriptingWhitelist* whitelist = |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3068 already_disabled(false), | 3073 already_disabled(false), |
3069 extension(extension) {} | 3074 extension(extension) {} |
3070 | 3075 |
3071 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3076 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
3072 const Extension* extension, | 3077 const Extension* extension, |
3073 const ExtensionPermissionSet* permissions, | 3078 const ExtensionPermissionSet* permissions, |
3074 Reason reason) | 3079 Reason reason) |
3075 : reason(reason), | 3080 : reason(reason), |
3076 extension(extension), | 3081 extension(extension), |
3077 permissions(permissions) {} | 3082 permissions(permissions) {} |
OLD | NEW |