Chromium Code Reviews| Index: chrome/browser/extensions/extension_special_storage_policy.cc |
| diff --git a/chrome/browser/extensions/extension_special_storage_policy.cc b/chrome/browser/extensions/extension_special_storage_policy.cc |
| index 3d78c1628910d6407f04571b721a136bc921b2c2..2a9aeb3c5e96199181d9151d5b395c117bafa514 100644 |
| --- a/chrome/browser/extensions/extension_special_storage_policy.cc |
| +++ b/chrome/browser/extensions/extension_special_storage_policy.cc |
| @@ -7,16 +7,35 @@ |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/stl_util.h" |
| +#include "base/utf_string_conversions.h" |
| #include "chrome/browser/content_settings/cookie_settings.h" |
| +#include "chrome/browser/intents/web_intents_util.h" |
| #include "chrome/common/content_settings.h" |
| #include "chrome/common/content_settings_types.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/url_constants.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "webkit/glue/web_intent_service_data.h" |
| using content::BrowserThread; |
| using extensions::APIPermission; |
| +namespace { |
| + |
| +// Does the specified extension support the passed Web Intent, |action|? |
| +bool ExtensionSupportsIntentAction(const extensions::Extension* extension, |
| + const std::string& action) { |
|
tbarzic
2012/09/19 15:45:13
nit:
args should be vertically aligned
thorogood
2012/09/20 00:48:17
Done.
|
| + for (std::vector<webkit_glue::WebIntentServiceData>::const_iterator i = |
| + extension->intents_services().begin(); |
| + i != extension->intents_services().end(); ++i) { |
| + if (UTF16ToUTF8(i->action) == action) |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +} // namespace |
| + |
| ExtensionSpecialStoragePolicy::ExtensionSpecialStoragePolicy( |
| CookieSettings* cookie_settings) |
| : cookie_settings_(cookie_settings) {} |
| @@ -63,7 +82,8 @@ bool ExtensionSpecialStoragePolicy::HasSessionOnlyOrigins() { |
| bool ExtensionSpecialStoragePolicy::IsFileHandler( |
| const std::string& extension_id) { |
| base::AutoLock locker(lock_); |
| - return file_handler_extensions_.ContainsExtension(extension_id); |
| + return web_intent_extensions_.ContainsExtension(extension_id) || |
| + file_handler_extensions_.ContainsExtension(extension_id); |
| } |
| bool ExtensionSpecialStoragePolicy::NeedsProtection( |
| @@ -80,11 +100,14 @@ const ExtensionSet* ExtensionSpecialStoragePolicy::ExtensionsProtectingOrigin( |
| void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| const extensions::Extension* extension) { |
| DCHECK(extension); |
| + const bool supports_intent_view = ExtensionSupportsIntentAction( |
| + extension, web_intents::kActionView); |
| if (!NeedsProtection(extension) && |
| !extension->HasAPIPermission( |
| APIPermission::kUnlimitedStorage) && |
| !extension->HasAPIPermission( |
| - APIPermission::kFileBrowserHandler)) { |
| + APIPermission::kFileBrowserHandler) && |
| + !supports_intent_view) { |
| return; |
| } |
| { |
| @@ -97,9 +120,10 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| if (extension->HasAPIPermission(APIPermission::kUnlimitedStorage)) |
| unlimited_extensions_.Add(extension); |
| if (extension->HasAPIPermission( |
| - APIPermission::kFileBrowserHandler)) { |
| + APIPermission::kFileBrowserHandler)) |
| file_handler_extensions_.Add(extension); |
| - } |
| + if (supports_intent_view) |
| + web_intent_extensions_.Add(extension); |
| } |
| NotifyChanged(); |
| } |
| @@ -107,11 +131,14 @@ void ExtensionSpecialStoragePolicy::GrantRightsForExtension( |
| void ExtensionSpecialStoragePolicy::RevokeRightsForExtension( |
| const extensions::Extension* extension) { |
| DCHECK(extension); |
| + const bool supports_intent_view = ExtensionSupportsIntentAction( |
| + extension, web_intents::kActionView); |
| if (!NeedsProtection(extension) && |
| !extension->HasAPIPermission( |
| APIPermission::kUnlimitedStorage) && |
| !extension->HasAPIPermission( |
| - APIPermission::kFileBrowserHandler)) { |
| + APIPermission::kFileBrowserHandler) && |
| + !supports_intent_view) { |
| return; |
| } |
| { |
| @@ -124,6 +151,8 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForExtension( |
| unlimited_extensions_.Remove(extension); |
| if (extension->HasAPIPermission(APIPermission::kFileBrowserHandler)) |
| file_handler_extensions_.Remove(extension); |
| + if (supports_intent_view) |
| + web_intent_extensions_.Remove(extension); |
| } |
| NotifyChanged(); |
| } |
| @@ -135,6 +164,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() { |
| installed_apps_.Clear(); |
| unlimited_extensions_.Clear(); |
| file_handler_extensions_.Clear(); |
| + web_intent_extensions_.Clear(); |
| } |
| NotifyChanged(); |
| } |