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

Unified Diff: chrome/browser/extensions/extension_special_storage_policy.cc

Issue 10834383: Chrome OS "open with" picker allowing Web Intents (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: tbarzic comments Created 8 years, 3 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
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();
}

Powered by Google App Engine
This is Rietveld 408576698