| 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..f5fb427a1d9b45f0b4a48fbe330277fcf793a88c 100644
|
| --- a/chrome/browser/extensions/extension_special_storage_policy.cc
|
| +++ b/chrome/browser/extensions/extension_special_storage_policy.cc
|
| @@ -7,16 +7,36 @@
|
| #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) {
|
| + 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 +83,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 +101,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 +121,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 +132,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 +152,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 +165,7 @@ void ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() {
|
| installed_apps_.Clear();
|
| unlimited_extensions_.Clear();
|
| file_handler_extensions_.Clear();
|
| + web_intent_extensions_.Clear();
|
| }
|
| NotifyChanged();
|
| }
|
|
|