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) |