Index: extensions/renderer/dispatcher.cc |
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc |
index fa242177fa2341141849ce945ff916f1a5f9a356..0124a43048966a4fa52a6b7bf2adcc7b3077fd13 100644 |
--- a/extensions/renderer/dispatcher.cc |
+++ b/extensions/renderer/dispatcher.cc |
@@ -271,7 +271,7 @@ void Dispatcher::DidCreateScriptContext( |
// Initialize origin permissions for content scripts, which can't be |
// initialized in |OnActivateExtension|. |
if (context_type == Feature::CONTENT_SCRIPT_CONTEXT) |
- UpdateOriginPermissions(extension); |
+ InitOriginPermissions(extension); |
{ |
scoped_ptr<ModuleSystem> module_system( |
@@ -506,7 +506,7 @@ void Dispatcher::WebKitInitialized() { |
const Extension* extension = extensions_.GetByID(*iter); |
CHECK(extension); |
- UpdateOriginPermissions(extension); |
+ InitOriginPermissions(extension); |
} |
EnableCustomElementWhiteList(); |
@@ -565,7 +565,7 @@ void Dispatcher::OnActivateExtension(const std::string& extension_id) { |
extensions::DOMActivityLogger::AttachToWorld( |
extensions::DOMActivityLogger::kMainWorldId, extension_id); |
- UpdateOriginPermissions(extension); |
+ InitOriginPermissions(extension); |
} |
UpdateActiveExtensions(); |
@@ -741,8 +741,27 @@ void Dispatcher::OnUpdatePermissions( |
scoped_refptr<const PermissionSet> withheld = |
params.withheld_permissions.ToPermissionSet(); |
+ // If webkit isn't initialized, this will be done when it finishes starting |
not at google - send to devlin
2014/07/23 01:18:54
s/webkit/blink/
though I think the comment isn't
Devlin
2014/07/23 15:41:51
Done.
|
+ // up. |
+ if (is_webkit_initialized_) { |
+ bool was_added = params.was_added; |
not at google - send to devlin
2014/07/23 01:18:54
this alias seems like overkill.
Devlin
2014/07/23 15:41:51
Done.
|
+ URLPatternSet difference; |
+ if (was_added) { |
+ URLPatternSet::CreateDifference( |
+ active->effective_hosts(), |
+ extension->permissions_data()->GetEffectiveHostPermissions(), |
+ &difference); |
+ } else { |
+ URLPatternSet::CreateDifference( |
+ extension->permissions_data()->GetEffectiveHostPermissions(), |
+ active->effective_hosts(), |
+ &difference); |
+ } |
+ |
+ UpdateOriginPermissions(extension, was_added, difference); |
+ } |
+ |
extension->permissions_data()->SetPermissions(active, withheld); |
- UpdateOriginPermissions(extension); |
UpdateBindings(extension->id()); |
} |
@@ -771,24 +790,32 @@ void Dispatcher::UpdateActiveExtensions() { |
delegate_->OnActiveExtensionsUpdated(active_extensions); |
} |
-void Dispatcher::UpdateOriginPermissions(const Extension* extension) { |
- const URLPatternSet& hosts = |
- extension->permissions_data()->GetEffectiveHostPermissions(); |
- WebSecurityPolicy::resetOriginAccessWhitelists(); |
Devlin
2014/07/22 21:56:47
This was introduced in https://codereview.chromium
not at google - send to devlin
2014/07/23 01:18:54
right... good point.
This would be such a simpler
Devlin
2014/07/23 15:41:51
But to add the new ones, we add the new ones for _
not at google - send to devlin
2014/07/23 15:45:35
I don't think so? add/remove take the origin which
Devlin
2014/07/23 16:14:01
Ahhh, I see, I misunderstood (thought you meant st
|
+void Dispatcher::InitOriginPermissions(const Extension* extension) { |
delegate_->InitOriginPermissions(extension, |
IsExtensionActive(extension->id())); |
- for (URLPatternSet::const_iterator iter = hosts.begin(); iter != hosts.end(); |
- ++iter) { |
- const char* schemes[] = { |
- url::kHttpScheme, |
- url::kHttpsScheme, |
- url::kFileScheme, |
- content::kChromeUIScheme, |
- url::kFtpScheme, |
- }; |
+ UpdateOriginPermissions( |
+ extension, |
+ true, // was added |
+ extension->permissions_data()->GetEffectiveHostPermissions()); |
+} |
+ |
+void Dispatcher::UpdateOriginPermissions( |
+ const Extension* extension, |
+ bool was_added, |
+ const URLPatternSet& patterns) { |
+ static const char* schemes[] = { |
not at google - send to devlin
2014/07/23 01:18:55
kSchemes?
Devlin
2014/07/23 15:41:51
Done.
|
+ url::kHttpScheme, |
+ url::kHttpsScheme, |
+ url::kFileScheme, |
+ content::kChromeUIScheme, |
+ url::kFtpScheme, |
+ }; |
+ for (URLPatternSet::const_iterator iter = patterns.begin(); |
+ iter != patterns.end(); ++iter) { |
for (size_t j = 0; j < arraysize(schemes); ++j) { |
if (iter->MatchesScheme(schemes[j])) { |
- WebSecurityPolicy::addOriginAccessWhitelistEntry( |
+ (was_added ? WebSecurityPolicy::addOriginAccessWhitelistEntry |
+ : WebSecurityPolicy::removeOriginAccessWhitelistEntry)( |
extension->url(), |
WebString::fromUTF8(schemes[j]), |
WebString::fromUTF8(iter->host()), |