| Index: chrome/common/extensions/extension.cc
|
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
|
| index 63fffc713e627bc3934cf9baf3ee1be38965d247..a01096bf6426023debe6e843d37faa2b6a2c537f 100644
|
| --- a/chrome/common/extensions/extension.cc
|
| +++ b/chrome/common/extensions/extension.cc
|
| @@ -3409,6 +3409,7 @@ bool Extension::HasMultipleUISurfaces() const {
|
| }
|
|
|
| bool Extension::CanExecuteScriptOnPage(const GURL& page_url,
|
| + int tab_id,
|
| const UserScript* script,
|
| std::string* error) const {
|
| base::AutoLock auto_lock(runtime_data_lock_);
|
| @@ -3431,6 +3432,16 @@ bool Extension::CanExecuteScriptOnPage(const GURL& page_url,
|
| !CanExecuteScriptEverywhere())
|
| return false;
|
|
|
| + // If a tab ID is specified, try the tab-specific permissions.
|
| + if (tab_id >= 0) {
|
| + const URLPatternSet* tab_permissions =
|
| + runtime_data_.GetTabSpecificHostPermissions(tab_id);
|
| + if (tab_permissions &&
|
| + tab_permissions->MatchesSecurityOrigin(page_url)) {
|
| + return true;
|
| + }
|
| + }
|
| +
|
| // If a script is specified, use its matches.
|
| if (script)
|
| return script->MatchesURL(page_url);
|
| @@ -3493,7 +3504,17 @@ bool Extension::CanExecuteScriptEverywhere() const {
|
| }
|
|
|
| bool Extension::CanCaptureVisiblePage(const GURL& page_url,
|
| + int tab_id,
|
| std::string *error) const {
|
| + if (tab_id >= 0) {
|
| + const URLPatternSet* tab_permissions =
|
| + GetTabSpecificHostPermissions(tab_id);
|
| + if (tab_permissions &&
|
| + tab_permissions->MatchesSecurityOrigin(page_url)) {
|
| + return true;
|
| + }
|
| + }
|
| +
|
| if (HasHostPermission(page_url) || page_url.GetOrigin() == url())
|
| return true;
|
|
|
| @@ -3669,6 +3690,24 @@ ExtensionAction* Extension::GetScriptBadge() const {
|
| return script_badge_.get();
|
| }
|
|
|
| +const URLPatternSet* Extension::GetTabSpecificHostPermissions(
|
| + int tab_id) const {
|
| + base::AutoLock auto_lock(runtime_data_lock_);
|
| + return runtime_data_.GetTabSpecificHostPermissions(tab_id);
|
| +}
|
| +
|
| +void Extension::SetTabSpecificHostPermissions(
|
| + int tab_id,
|
| + const URLPatternSet& permissions) const {
|
| + base::AutoLock auto_lock(runtime_data_lock_);
|
| + runtime_data_.SetTabSpecificHostPermissions(tab_id, permissions);
|
| +}
|
| +
|
| +void Extension::ClearTabSpecificHostPermissions(int tab_id) const {
|
| + base::AutoLock auto_lock(runtime_data_lock_);
|
| + runtime_data_.ClearTabSpecificHostPermissions(tab_id);
|
| +}
|
| +
|
| bool Extension::CheckPlatformAppFeatures(std::string* utf8_error) {
|
| if (!is_platform_app())
|
| return true;
|
| @@ -3714,6 +3753,27 @@ void Extension::RuntimeData::SetActivePermissions(
|
| active_permissions_ = active;
|
| }
|
|
|
| +const URLPatternSet*
|
| + Extension::RuntimeData::GetTabSpecificHostPermissions(int tab_id) const {
|
| + CHECK_GE(tab_id, 0);
|
| + TabHostPermissionsMap::const_iterator it =
|
| + tab_specific_host_permissions_.find(tab_id);
|
| + return (it != tab_specific_host_permissions_.end()) ? it->second.get() : NULL;
|
| +}
|
| +
|
| +void Extension::RuntimeData::SetTabSpecificHostPermissions(
|
| + int tab_id,
|
| + const URLPatternSet& hosts) {
|
| + CHECK_GE(tab_id, 0);
|
| + tab_specific_host_permissions_[tab_id] =
|
| + make_linked_ptr(new URLPatternSet(hosts));
|
| +}
|
| +
|
| +void Extension::RuntimeData::ClearTabSpecificHostPermissions(int tab_id) {
|
| + CHECK_GE(tab_id, 0);
|
| + tab_specific_host_permissions_.erase(tab_id);
|
| +}
|
| +
|
| UnloadedExtensionInfo::UnloadedExtensionInfo(
|
| const Extension* extension,
|
| extension_misc::UnloadedExtensionReason reason)
|
|
|