Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(43)

Side by Side Diff: chrome/common/extensions/extension.cc

Issue 10815028: Make ActiveTabPermissionManager also grant the tabs permission. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: oops Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/extensions/extension_messages.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/extensions/extension_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698