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 <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "base/base64.h" | 9 #include "base/base64.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 3434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3445 if (CanExecuteScriptEverywhere()) | 3445 if (CanExecuteScriptEverywhere()) |
3446 return true; | 3446 return true; |
3447 | 3447 |
3448 return false; | 3448 return false; |
3449 } | 3449 } |
3450 | 3450 |
3451 // Otherwise, the valid schemes were handled by URLPattern. | 3451 // Otherwise, the valid schemes were handled by URLPattern. |
3452 return true; | 3452 return true; |
3453 } | 3453 } |
3454 | 3454 |
3455 bool Extension::HasAPIPermission( | 3455 bool Extension::HasAPIPermission(APIPermission::ID permission) const { |
3456 APIPermission::ID permission) const { | |
3457 base::AutoLock auto_lock(runtime_data_lock_); | 3456 base::AutoLock auto_lock(runtime_data_lock_); |
3458 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); | 3457 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); |
3459 } | 3458 } |
3460 | 3459 |
3461 bool Extension::HasAPIPermission( | 3460 bool Extension::HasAPIPermission(const std::string& function_name) const { |
3462 const std::string& function_name) const { | |
3463 base::AutoLock auto_lock(runtime_data_lock_); | 3461 base::AutoLock auto_lock(runtime_data_lock_); |
3464 return runtime_data_.GetActivePermissions()-> | 3462 return runtime_data_.GetActivePermissions()-> |
3465 HasAccessToFunction(function_name); | 3463 HasAccessToFunction(function_name); |
3466 } | 3464 } |
3467 | 3465 |
| 3466 bool Extension::HasAPIPermissionForTab(int tab_id, |
| 3467 APIPermission::ID permission) const { |
| 3468 base::AutoLock auto_lock(runtime_data_lock_); |
| 3469 if (runtime_data_.GetActivePermissions()->HasAPIPermission(permission)) |
| 3470 return true; |
| 3471 scoped_refptr<const PermissionSet> tab_specific_permissions = |
| 3472 runtime_data_.GetTabSpecificPermissions(tab_id); |
| 3473 return tab_specific_permissions.get() && |
| 3474 tab_specific_permissions->HasAPIPermission(permission); |
| 3475 } |
| 3476 |
3468 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { | 3477 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { |
3469 base::AutoLock auto_lock(runtime_data_lock_); | 3478 base::AutoLock auto_lock(runtime_data_lock_); |
3470 return runtime_data_.GetActivePermissions()->effective_hosts(); | 3479 return runtime_data_.GetActivePermissions()->effective_hosts(); |
3471 } | 3480 } |
3472 | 3481 |
3473 bool Extension::HasHostPermission(const GURL& url) const { | 3482 bool Extension::HasHostPermission(const GURL& url) const { |
3474 if (url.SchemeIs(chrome::kChromeUIScheme) && | 3483 if (url.SchemeIs(chrome::kChromeUIScheme) && |
3475 url.host() != chrome::kChromeUIFaviconHost && | 3484 url.host() != chrome::kChromeUIFaviconHost && |
3476 url.host() != chrome::kChromeUIThumbnailHost && | 3485 url.host() != chrome::kChromeUIThumbnailHost && |
3477 location() != Extension::COMPONENT) { | 3486 location() != Extension::COMPONENT) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3555 *error = errors::kCannotScriptGallery; | 3564 *error = errors::kCannotScriptGallery; |
3556 return false; | 3565 return false; |
3557 } | 3566 } |
3558 | 3567 |
3559 if (page_url.SchemeIs(chrome::kChromeUIScheme) && | 3568 if (page_url.SchemeIs(chrome::kChromeUIScheme) && |
3560 !CanExecuteScriptEverywhere()) | 3569 !CanExecuteScriptEverywhere()) |
3561 return false; | 3570 return false; |
3562 | 3571 |
3563 // If a tab ID is specified, try the tab-specific permissions. | 3572 // If a tab ID is specified, try the tab-specific permissions. |
3564 if (tab_id >= 0) { | 3573 if (tab_id >= 0) { |
3565 const URLPatternSet* tab_permissions = | 3574 scoped_refptr<const PermissionSet> tab_permissions = |
3566 runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3575 runtime_data_.GetTabSpecificPermissions(tab_id); |
3567 if (tab_permissions && | 3576 if (tab_permissions.get() && |
3568 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3577 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
3569 return true; | 3578 return true; |
3570 } | 3579 } |
3571 } | 3580 } |
3572 | 3581 |
3573 // If a script is specified, use its matches. | 3582 // If a script is specified, use its matches. |
3574 if (script) | 3583 if (script) |
3575 return script->MatchesURL(page_url); | 3584 return script->MatchesURL(page_url); |
3576 | 3585 |
3577 // Otherwise, see if this extension has permission to execute script | 3586 // Otherwise, see if this extension has permission to execute script |
3578 // programmatically on pages. | 3587 // programmatically on pages. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3628 } | 3637 } |
3629 } | 3638 } |
3630 | 3639 |
3631 return false; | 3640 return false; |
3632 } | 3641 } |
3633 | 3642 |
3634 bool Extension::CanCaptureVisiblePage(const GURL& page_url, | 3643 bool Extension::CanCaptureVisiblePage(const GURL& page_url, |
3635 int tab_id, | 3644 int tab_id, |
3636 std::string *error) const { | 3645 std::string *error) const { |
3637 if (tab_id >= 0) { | 3646 if (tab_id >= 0) { |
3638 const URLPatternSet* tab_permissions = | 3647 scoped_refptr<const PermissionSet> tab_permissions = |
3639 GetTabSpecificHostPermissions(tab_id); | 3648 GetTabSpecificPermissions(tab_id); |
3640 if (tab_permissions && | 3649 if (tab_permissions.get() && |
3641 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3650 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
3642 return true; | 3651 return true; |
3643 } | 3652 } |
3644 } | 3653 } |
3645 | 3654 |
3646 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) | 3655 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) |
3647 return true; | 3656 return true; |
3648 | 3657 |
3649 if (error) { | 3658 if (error) { |
3650 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, | 3659 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, |
3651 page_url.spec()); | 3660 page_url.spec()); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3790 | 3799 |
3791 bool Extension::HasContentScriptAtURL(const GURL& url) const { | 3800 bool Extension::HasContentScriptAtURL(const GURL& url) const { |
3792 for (UserScriptList::const_iterator it = content_scripts_.begin(); | 3801 for (UserScriptList::const_iterator it = content_scripts_.begin(); |
3793 it != content_scripts_.end(); ++it) { | 3802 it != content_scripts_.end(); ++it) { |
3794 if (it->MatchesURL(url)) | 3803 if (it->MatchesURL(url)) |
3795 return true; | 3804 return true; |
3796 } | 3805 } |
3797 return false; | 3806 return false; |
3798 } | 3807 } |
3799 | 3808 |
3800 const URLPatternSet* Extension::GetTabSpecificHostPermissions( | 3809 scoped_refptr<const PermissionSet> Extension::GetTabSpecificPermissions( |
3801 int tab_id) const { | 3810 int tab_id) const { |
3802 base::AutoLock auto_lock(runtime_data_lock_); | 3811 base::AutoLock auto_lock(runtime_data_lock_); |
3803 return runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3812 return runtime_data_.GetTabSpecificPermissions(tab_id); |
3804 } | 3813 } |
3805 | 3814 |
3806 void Extension::SetTabSpecificHostPermissions( | 3815 void Extension::UpdateTabSpecificPermissions( |
3807 int tab_id, | 3816 int tab_id, |
3808 const URLPatternSet& permissions) const { | 3817 const PermissionSet* permissions) const { |
3809 base::AutoLock auto_lock(runtime_data_lock_); | 3818 base::AutoLock auto_lock(runtime_data_lock_); |
3810 runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions); | 3819 runtime_data_.UpdateTabSpecificPermissions(tab_id, permissions); |
3811 } | 3820 } |
3812 | 3821 |
3813 void Extension::ClearTabSpecificHostPermissions(int tab_id) const { | 3822 void Extension::ClearTabSpecificPermissions(int tab_id) const { |
3814 base::AutoLock auto_lock(runtime_data_lock_); | 3823 base::AutoLock auto_lock(runtime_data_lock_); |
3815 runtime_data_.ClearTabSpecificHostPermissions(tab_id); | 3824 runtime_data_.ClearTabSpecificPermissions(tab_id); |
3816 } | 3825 } |
3817 | 3826 |
3818 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { | 3827 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { |
3819 if (!is_platform_app()) | 3828 if (!is_platform_app()) |
3820 return true; | 3829 return true; |
3821 | 3830 |
3822 if (!has_background_page()) { | 3831 if (!has_background_page()) { |
3823 *utf8_error = errors::kBackgroundRequiredForPlatformApps; | 3832 *utf8_error = errors::kBackgroundRequiredForPlatformApps; |
3824 return false; | 3833 return false; |
3825 } | 3834 } |
(...skipping 21 matching lines...) Expand all Loading... |
3847 scoped_refptr<const PermissionSet> | 3856 scoped_refptr<const PermissionSet> |
3848 Extension::RuntimeData::GetActivePermissions() const { | 3857 Extension::RuntimeData::GetActivePermissions() const { |
3849 return active_permissions_; | 3858 return active_permissions_; |
3850 } | 3859 } |
3851 | 3860 |
3852 void Extension::RuntimeData::SetActivePermissions( | 3861 void Extension::RuntimeData::SetActivePermissions( |
3853 const PermissionSet* active) { | 3862 const PermissionSet* active) { |
3854 active_permissions_ = active; | 3863 active_permissions_ = active; |
3855 } | 3864 } |
3856 | 3865 |
3857 const URLPatternSet* | 3866 scoped_refptr<const PermissionSet> |
3858 Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const { | 3867 Extension::RuntimeData::GetTabSpecificPermissions(int tab_id) const { |
3859 CHECK_GE(tab_id, 0); | 3868 CHECK_GE(tab_id, 0); |
3860 TabHostPermissionsMap::const_iterator it = | 3869 TabPermissionsMap::const_iterator it = tab_specific_permissions_.find(tab_id); |
3861 tab_specific_host_permissions_.find(tab_id); | 3870 return (it != tab_specific_permissions_.end()) ? it->second : NULL; |
3862 return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL; | |
3863 } | 3871 } |
3864 | 3872 |
3865 void Extension::RuntimeData::SetTabSpecificHostPermissions( | 3873 void Extension::RuntimeData::UpdateTabSpecificPermissions( |
3866 int tab_id, | 3874 int tab_id, |
3867 const URLPatternSet& hosts) { | 3875 const PermissionSet* permissions) { |
3868 CHECK_GE(tab_id, 0); | 3876 CHECK_GE(tab_id, 0); |
3869 tab_specific_host_permissions_[tab_id] = | 3877 if (tab_specific_permissions_.count(tab_id)) { |
3870 make_linked_ptr(new URLPatternSet(hosts)); | 3878 tab_specific_permissions_[tab_id] = PermissionSet::CreateUnion( |
| 3879 tab_specific_permissions_[tab_id], |
| 3880 permissions); |
| 3881 } else { |
| 3882 tab_specific_permissions_[tab_id] = permissions; |
| 3883 } |
3871 } | 3884 } |
3872 | 3885 |
3873 void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) { | 3886 void Extension::RuntimeData::ClearTabSpecificPermissions(int tab_id) { |
3874 CHECK_GE(tab_id, 0); | 3887 CHECK_GE(tab_id, 0); |
3875 tab_specific_host_permissions_.erase(tab_id); | 3888 tab_specific_permissions_.erase(tab_id); |
3876 } | 3889 } |
3877 | 3890 |
3878 UnloadedExtensionInfo::UnloadedExtensionInfo( | 3891 UnloadedExtensionInfo::UnloadedExtensionInfo( |
3879 const Extension* extension, | 3892 const Extension* extension, |
3880 extension_misc::UnloadedExtensionReason reason) | 3893 extension_misc::UnloadedExtensionReason reason) |
3881 : reason(reason), | 3894 : reason(reason), |
3882 already_disabled(false), | 3895 already_disabled(false), |
3883 extension(extension) {} | 3896 extension(extension) {} |
3884 | 3897 |
3885 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3898 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
3886 const Extension* extension, | 3899 const Extension* extension, |
3887 const PermissionSet* permissions, | 3900 const PermissionSet* permissions, |
3888 Reason reason) | 3901 Reason reason) |
3889 : reason(reason), | 3902 : reason(reason), |
3890 extension(extension), | 3903 extension(extension), |
3891 permissions(permissions) {} | 3904 permissions(permissions) {} |
3892 | 3905 |
3893 } // namespace extensions | 3906 } // namespace extensions |
OLD | NEW |