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

Unified Diff: chrome/common/extensions/extension.cc

Issue 10443105: Take 2 at implementing activeTab. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: empty -> is_empty Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/common/extensions/extension.h ('k') | chrome/common/extensions/extension_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« 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