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 3420 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3431 if (CanExecuteScriptEverywhere()) | 3431 if (CanExecuteScriptEverywhere()) |
3432 return true; | 3432 return true; |
3433 | 3433 |
3434 return false; | 3434 return false; |
3435 } | 3435 } |
3436 | 3436 |
3437 // Otherwise, the valid schemes were handled by URLPattern. | 3437 // Otherwise, the valid schemes were handled by URLPattern. |
3438 return true; | 3438 return true; |
3439 } | 3439 } |
3440 | 3440 |
3441 bool Extension::HasAPIPermission( | 3441 bool Extension::HasAPIPermission(APIPermission::ID permission) const { |
3442 APIPermission::ID permission) const { | |
3443 base::AutoLock auto_lock(runtime_data_lock_); | 3442 base::AutoLock auto_lock(runtime_data_lock_); |
3444 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); | 3443 return runtime_data_.GetActivePermissions()->HasAPIPermission(permission); |
3445 } | 3444 } |
3446 | 3445 |
3447 bool Extension::HasAPIPermission( | 3446 bool Extension::HasAPIPermission(const std::string& function_name) const { |
3448 const std::string& function_name) const { | |
3449 base::AutoLock auto_lock(runtime_data_lock_); | 3447 base::AutoLock auto_lock(runtime_data_lock_); |
3450 return runtime_data_.GetActivePermissions()-> | 3448 return runtime_data_.GetActivePermissions()-> |
3451 HasAccessToFunction(function_name); | 3449 HasAccessToFunction(function_name); |
3452 } | 3450 } |
3453 | 3451 |
| 3452 bool Extension::HasAPIPermissionForTab(int tab_id, |
| 3453 APIPermission::ID permission) const { |
| 3454 base::AutoLock auto_lock(runtime_data_lock_); |
| 3455 if (runtime_data_.GetActivePermissions()->HasAPIPermission(permission)) |
| 3456 return true; |
| 3457 scoped_refptr<const PermissionSet> tab_specific_permissions = |
| 3458 runtime_data_.GetTabSpecificPermissions(tab_id); |
| 3459 return tab_specific_permissions.get() && |
| 3460 tab_specific_permissions->HasAPIPermission(permission); |
| 3461 } |
| 3462 |
3454 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { | 3463 const URLPatternSet& Extension::GetEffectiveHostPermissions() const { |
3455 base::AutoLock auto_lock(runtime_data_lock_); | 3464 base::AutoLock auto_lock(runtime_data_lock_); |
3456 return runtime_data_.GetActivePermissions()->effective_hosts(); | 3465 return runtime_data_.GetActivePermissions()->effective_hosts(); |
3457 } | 3466 } |
3458 | 3467 |
3459 bool Extension::HasHostPermission(const GURL& url) const { | 3468 bool Extension::HasHostPermission(const GURL& url) const { |
3460 if (url.SchemeIs(chrome::kChromeUIScheme) && | 3469 if (url.SchemeIs(chrome::kChromeUIScheme) && |
3461 url.host() != chrome::kChromeUIFaviconHost && | 3470 url.host() != chrome::kChromeUIFaviconHost && |
3462 url.host() != chrome::kChromeUIThumbnailHost && | 3471 url.host() != chrome::kChromeUIThumbnailHost && |
3463 location() != Extension::COMPONENT) { | 3472 location() != Extension::COMPONENT) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3541 *error = errors::kCannotScriptGallery; | 3550 *error = errors::kCannotScriptGallery; |
3542 return false; | 3551 return false; |
3543 } | 3552 } |
3544 | 3553 |
3545 if (page_url.SchemeIs(chrome::kChromeUIScheme) && | 3554 if (page_url.SchemeIs(chrome::kChromeUIScheme) && |
3546 !CanExecuteScriptEverywhere()) | 3555 !CanExecuteScriptEverywhere()) |
3547 return false; | 3556 return false; |
3548 | 3557 |
3549 // If a tab ID is specified, try the tab-specific permissions. | 3558 // If a tab ID is specified, try the tab-specific permissions. |
3550 if (tab_id >= 0) { | 3559 if (tab_id >= 0) { |
3551 const URLPatternSet* tab_permissions = | 3560 scoped_refptr<const PermissionSet> tab_permissions = |
3552 runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3561 runtime_data_.GetTabSpecificPermissions(tab_id); |
3553 if (tab_permissions && | 3562 if (tab_permissions.get() && |
3554 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3563 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
3555 return true; | 3564 return true; |
3556 } | 3565 } |
3557 } | 3566 } |
3558 | 3567 |
3559 // If a script is specified, use its matches. | 3568 // If a script is specified, use its matches. |
3560 if (script) | 3569 if (script) |
3561 return script->MatchesURL(page_url); | 3570 return script->MatchesURL(page_url); |
3562 | 3571 |
3563 // Otherwise, see if this extension has permission to execute script | 3572 // Otherwise, see if this extension has permission to execute script |
3564 // programmatically on pages. | 3573 // programmatically on pages. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3614 } | 3623 } |
3615 } | 3624 } |
3616 | 3625 |
3617 return false; | 3626 return false; |
3618 } | 3627 } |
3619 | 3628 |
3620 bool Extension::CanCaptureVisiblePage(const GURL& page_url, | 3629 bool Extension::CanCaptureVisiblePage(const GURL& page_url, |
3621 int tab_id, | 3630 int tab_id, |
3622 std::string *error) const { | 3631 std::string *error) const { |
3623 if (tab_id >= 0) { | 3632 if (tab_id >= 0) { |
3624 const URLPatternSet* tab_permissions = | 3633 scoped_refptr<const PermissionSet> tab_permissions = |
3625 GetTabSpecificHostPermissions(tab_id); | 3634 GetTabSpecificPermissions(tab_id); |
3626 if (tab_permissions && | 3635 if (tab_permissions.get() && |
3627 tab_permissions->MatchesSecurityOrigin(page_url)) { | 3636 tab_permissions->explicit_hosts().MatchesSecurityOrigin(page_url)) { |
3628 return true; | 3637 return true; |
3629 } | 3638 } |
3630 } | 3639 } |
3631 | 3640 |
3632 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) | 3641 if (HasHostPermission(page_url) || page_url.GetOrigin() == url()) |
3633 return true; | 3642 return true; |
3634 | 3643 |
3635 if (error) { | 3644 if (error) { |
3636 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, | 3645 *error = ExtensionErrorUtils::FormatErrorMessage(errors::kCannotAccessPage, |
3637 page_url.spec()); | 3646 page_url.spec()); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3776 | 3785 |
3777 bool Extension::HasContentScriptAtURL(const GURL& url) const { | 3786 bool Extension::HasContentScriptAtURL(const GURL& url) const { |
3778 for (UserScriptList::const_iterator it = content_scripts_.begin(); | 3787 for (UserScriptList::const_iterator it = content_scripts_.begin(); |
3779 it != content_scripts_.end(); ++it) { | 3788 it != content_scripts_.end(); ++it) { |
3780 if (it->MatchesURL(url)) | 3789 if (it->MatchesURL(url)) |
3781 return true; | 3790 return true; |
3782 } | 3791 } |
3783 return false; | 3792 return false; |
3784 } | 3793 } |
3785 | 3794 |
3786 const URLPatternSet* Extension::GetTabSpecificHostPermissions( | 3795 scoped_refptr<const PermissionSet> Extension::GetTabSpecificPermissions( |
3787 int tab_id) const { | 3796 int tab_id) const { |
3788 base::AutoLock auto_lock(runtime_data_lock_); | 3797 base::AutoLock auto_lock(runtime_data_lock_); |
3789 return runtime_data_.GetTabSpecificHostPermissions(tab_id); | 3798 return runtime_data_.GetTabSpecificPermissions(tab_id); |
3790 } | 3799 } |
3791 | 3800 |
3792 void Extension::SetTabSpecificHostPermissions( | 3801 void Extension::UpdateTabSpecificPermissions( |
3793 int tab_id, | 3802 int tab_id, |
3794 const URLPatternSet& permissions) const { | 3803 const PermissionSet* permissions) const { |
3795 base::AutoLock auto_lock(runtime_data_lock_); | 3804 base::AutoLock auto_lock(runtime_data_lock_); |
3796 runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions); | 3805 runtime_data_.UpdateTabSpecificPermissions(tab_id, permissions); |
3797 } | 3806 } |
3798 | 3807 |
3799 void Extension::ClearTabSpecificHostPermissions(int tab_id) const { | 3808 void Extension::ClearTabSpecificPermissions(int tab_id) const { |
3800 base::AutoLock auto_lock(runtime_data_lock_); | 3809 base::AutoLock auto_lock(runtime_data_lock_); |
3801 runtime_data_.ClearTabSpecificHostPermissions(tab_id); | 3810 runtime_data_.ClearTabSpecificPermissions(tab_id); |
3802 } | 3811 } |
3803 | 3812 |
3804 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { | 3813 bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) { |
3805 if (!is_platform_app()) | 3814 if (!is_platform_app()) |
3806 return true; | 3815 return true; |
3807 | 3816 |
3808 if (!has_background_page()) { | 3817 if (!has_background_page()) { |
3809 *utf8_error = errors::kBackgroundRequiredForPlatformApps; | 3818 *utf8_error = errors::kBackgroundRequiredForPlatformApps; |
3810 return false; | 3819 return false; |
3811 } | 3820 } |
(...skipping 21 matching lines...) Expand all Loading... |
3833 scoped_refptr<const PermissionSet> | 3842 scoped_refptr<const PermissionSet> |
3834 Extension::RuntimeData::GetActivePermissions() const { | 3843 Extension::RuntimeData::GetActivePermissions() const { |
3835 return active_permissions_; | 3844 return active_permissions_; |
3836 } | 3845 } |
3837 | 3846 |
3838 void Extension::RuntimeData::SetActivePermissions( | 3847 void Extension::RuntimeData::SetActivePermissions( |
3839 const PermissionSet* active) { | 3848 const PermissionSet* active) { |
3840 active_permissions_ = active; | 3849 active_permissions_ = active; |
3841 } | 3850 } |
3842 | 3851 |
3843 const URLPatternSet* | 3852 scoped_refptr<const PermissionSet> |
3844 Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const { | 3853 Extension::RuntimeData::GetTabSpecificPermissions(int tab_id) const { |
3845 CHECK_GE(tab_id, 0); | 3854 CHECK_GE(tab_id, 0); |
3846 TabHostPermissionsMap::const_iterator it = | 3855 TabPermissionsMap::const_iterator it = tab_specific_permissions_.find(tab_id); |
3847 tab_specific_host_permissions_.find(tab_id); | 3856 return (it != tab_specific_permissions_.end()) ? it->second : NULL; |
3848 return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL; | |
3849 } | 3857 } |
3850 | 3858 |
3851 void Extension::RuntimeData::SetTabSpecificHostPermissions( | 3859 void Extension::RuntimeData::UpdateTabSpecificPermissions( |
3852 int tab_id, | 3860 int tab_id, |
3853 const URLPatternSet& hosts) { | 3861 const PermissionSet* permissions) { |
3854 CHECK_GE(tab_id, 0); | 3862 CHECK_GE(tab_id, 0); |
3855 tab_specific_host_permissions_[tab_id] = | 3863 if (tab_specific_permissions_.count(tab_id)) { |
3856 make_linked_ptr(new URLPatternSet(hosts)); | 3864 tab_specific_permissions_[tab_id] = PermissionSet::CreateUnion( |
| 3865 tab_specific_permissions_[tab_id], |
| 3866 permissions); |
| 3867 } else { |
| 3868 tab_specific_permissions_[tab_id] = permissions; |
| 3869 } |
3857 } | 3870 } |
3858 | 3871 |
3859 void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) { | 3872 void Extension::RuntimeData::ClearTabSpecificPermissions(int tab_id) { |
3860 CHECK_GE(tab_id, 0); | 3873 CHECK_GE(tab_id, 0); |
3861 tab_specific_host_permissions_.erase(tab_id); | 3874 tab_specific_permissions_.erase(tab_id); |
3862 } | 3875 } |
3863 | 3876 |
3864 UnloadedExtensionInfo::UnloadedExtensionInfo( | 3877 UnloadedExtensionInfo::UnloadedExtensionInfo( |
3865 const Extension* extension, | 3878 const Extension* extension, |
3866 extension_misc::UnloadedExtensionReason reason) | 3879 extension_misc::UnloadedExtensionReason reason) |
3867 : reason(reason), | 3880 : reason(reason), |
3868 already_disabled(false), | 3881 already_disabled(false), |
3869 extension(extension) {} | 3882 extension(extension) {} |
3870 | 3883 |
3871 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( | 3884 UpdatedExtensionPermissionsInfo::UpdatedExtensionPermissionsInfo( |
3872 const Extension* extension, | 3885 const Extension* extension, |
3873 const PermissionSet* permissions, | 3886 const PermissionSet* permissions, |
3874 Reason reason) | 3887 Reason reason) |
3875 : reason(reason), | 3888 : reason(reason), |
3876 extension(extension), | 3889 extension(extension), |
3877 permissions(permissions) {} | 3890 permissions(permissions) {} |
3878 | 3891 |
3879 } // namespace extensions | 3892 } // namespace extensions |
OLD | NEW |