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