Chromium Code Reviews| Index: chrome/common/extensions/extension.cc |
| diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
| index c15bcd2624f82748e1d852396edd482c69a1b6d9..43bd5637da01fbc7f8c6e3ab32931638ebe0dc03 100644 |
| --- a/chrome/common/extensions/extension.cc |
| +++ b/chrome/common/extensions/extension.cc |
| @@ -15,10 +15,10 @@ |
| #include "base/logging.h" |
| #include "base/memory/singleton.h" |
| #include "base/stl_util.h" |
| -#include "base/string16.h" |
| #include "base/string_number_conversions.h" |
| #include "base/string_piece.h" |
| #include "base/string_util.h" |
| +#include "base/string16.h" |
| #include "base/stringprintf.h" |
| #include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| @@ -35,8 +35,8 @@ |
| #include "chrome/common/extensions/features/simple_feature_provider.h" |
| #include "chrome/common/extensions/file_browser_handler.h" |
| #include "chrome/common/extensions/manifest.h" |
| -#include "chrome/common/extensions/permissions/permissions_info.h" |
| #include "chrome/common/extensions/permissions/permission_set.h" |
| +#include "chrome/common/extensions/permissions/permissions_info.h" |
| #include "chrome/common/extensions/url_pattern_set.h" |
| #include "chrome/common/extensions/user_script.h" |
| #include "chrome/common/url_constants.h" |
| @@ -2108,6 +2108,79 @@ bool Extension::LoadWebIntentServices(string16* error) { |
| return true; |
| } |
| +bool Extension::LoadFileHandler(const std::string& handler_id, |
| + const DictionaryValue& handler_info, |
| + string16* error) { |
| + DCHECK(error); |
| + DCHECK(is_platform_app()); |
| + webkit_glue::WebIntentServiceData service; |
| + std::string value; |
| + |
| + service.action = ASCIIToUTF16("http://webintents.org/view"); |
|
benwells
2012/11/01 04:00:55
Add a TODO to create new fields to map this to and
jeremya
2012/11/01 04:21:41
Done.
|
| + |
| + const ListValue* mime_types = NULL; |
| + if (!handler_info.HasKey(keys::kFileHandlerTypes) || |
| + !handler_info.GetList(keys::kFileHandlerTypes, &mime_types) || |
| + mime_types->GetSize() == 0) { |
| + *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidFileHandlerType, handler_id); |
| + return false; |
| + } |
| + |
| + service.service_url = GetBackgroundURL(); |
| + |
| + if (handler_info.HasKey(keys::kIntentTitle) && |
| + !handler_info.GetString(keys::kFileHandlerTitle, &service.title)) { |
| + *error = ASCIIToUTF16(errors::kInvalidFileHandlerTitle); |
| + return false; |
| + } |
| + |
| + for (size_t i = 0; i < mime_types->GetSize(); ++i) { |
| + if (!mime_types->GetString(i, &service.type)) { |
| + *error = ExtensionErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidFileHandlerTypeElement, handler_id, |
| + std::string(base::IntToString(i))); |
| + return false; |
| + } |
| + intents_services_.push_back(service); |
| + } |
| + return true; |
| +} |
| + |
| +bool Extension::LoadFileHandlers(string16* error) { |
| + DCHECK(error); |
| + |
| + if (!manifest_->HasKey(keys::kFileHandlers)) |
| + return true; |
| + |
| + if (!is_platform_app()) { |
| + // XXX isn't this handled somehow by _manifest_features.json? |
|
benwells
2012/11/01 04:00:55
Should be. Feel free to remove.
jeremya
2012/11/01 04:21:41
Done.
|
| + *error = ASCIIToUTF16(errors::kInvalidFileHandlers); |
| + return false; |
| + } |
| + |
| + DictionaryValue* all_handlers = NULL; |
| + if (!manifest_->GetDictionary(keys::kFileHandlers, &all_handlers)) { |
| + *error = ASCIIToUTF16(errors::kInvalidFileHandlers); |
| + return false; |
| + } |
| + |
| + for (DictionaryValue::key_iterator iter(all_handlers->begin_keys()); |
| + iter != all_handlers->end_keys(); ++iter) { |
| + // A file handler entry is a title, optional icons, and either a list of |
|
benwells
2012/11/01 04:00:55
This isn't yet true, let's make the comment match
jeremya
2012/11/01 04:21:41
Done.
|
| + // MIME types to handle or a list of file extensions (or both). |
| + DictionaryValue* handler = NULL; |
| + if (all_handlers->GetDictionaryWithoutPathExpansion(*iter, &handler)) { |
| + if (!LoadFileHandler(*iter, *handler, error)) |
| + return false; |
| + } else { |
| + *error = ASCIIToUTF16(errors::kInvalidIntent); |
| + return false; |
| + } |
| + } |
| + return true; |
| +} |
| + |
| bool Extension::LoadExtensionFeatures(const APIPermissionSet& api_permissions, |
| string16* error) { |
| if (manifest_->HasKey(keys::kConvertedFromUserScript)) |
| @@ -2125,6 +2198,7 @@ bool Extension::LoadExtensionFeatures(const APIPermissionSet& api_permissions, |
| !LoadOmnibox(error) || |
| !LoadTextToSpeechVoices(error) || |
| !LoadIncognitoMode(error) || |
| + !LoadFileHandlers(error) || |
| !LoadContentSecurityPolicy(error)) |
| return false; |