1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/common/manifest_handlers/mime_types_handler.h"
7 #include "base/logging.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "base/values.h"
11 #include "extensions/common/constants.h"
12 #include "extensions/common/error_utils.h"
13 #include "extensions/common/manifest.h"
14 #include "extensions/common/manifest_constants.h"
16 namespace keys
= extensions::manifest_keys
;
17 namespace errors
= extensions::manifest_errors
;
21 const char* const kMIMETypeHandlersWhitelist
[] = {
22 extension_misc::kPdfExtensionId
,
23 extension_misc::kQuickOfficeComponentExtensionId
,
24 extension_misc::kQuickOfficeInternalExtensionId
,
25 extension_misc::kQuickOfficeExtensionId
,
26 extension_misc::kMimeHandlerPrivateTestExtensionId
};
28 // Stored on the Extension.
29 struct MimeTypesHandlerInfo
: public extensions::Extension::ManifestData
{
30 MimeTypesHandler handler_
;
32 MimeTypesHandlerInfo();
33 ~MimeTypesHandlerInfo() override
;
36 MimeTypesHandlerInfo::MimeTypesHandlerInfo() {
39 MimeTypesHandlerInfo::~MimeTypesHandlerInfo() {
45 std::vector
<std::string
> MimeTypesHandler::GetMIMETypeWhitelist() {
46 std::vector
<std::string
> whitelist
;
47 for (size_t i
= 0; i
< arraysize(kMIMETypeHandlersWhitelist
); ++i
)
48 whitelist
.push_back(kMIMETypeHandlersWhitelist
[i
]);
52 MimeTypesHandler::MimeTypesHandler() {
55 MimeTypesHandler::~MimeTypesHandler() {
58 void MimeTypesHandler::AddMIMEType(const std::string
& mime_type
) {
59 mime_type_set_
.insert(mime_type
);
62 bool MimeTypesHandler::CanHandleMIMEType(const std::string
& mime_type
) const {
63 return mime_type_set_
.find(mime_type
) != mime_type_set_
.end();
66 bool MimeTypesHandler::HasPlugin() const {
67 return !handler_url_
.empty();
70 base::FilePath
MimeTypesHandler::GetPluginPath() const {
71 // TODO(raymes): Storing the extension URL in a base::FilePath is really
72 // nasty. We should probably just use the extension ID as the placeholder path
74 return base::FilePath::FromUTF8Unsafe(
75 std::string(extensions::kExtensionScheme
) + "://" + extension_id_
+ "/");
79 MimeTypesHandler
* MimeTypesHandler::GetHandler(
80 const extensions::Extension
* extension
) {
81 MimeTypesHandlerInfo
* info
= static_cast<MimeTypesHandlerInfo
*>(
82 extension
->GetManifestData(keys::kMimeTypesHandler
));
84 return &info
->handler_
;
88 MimeTypesHandlerParser::MimeTypesHandlerParser() {
91 MimeTypesHandlerParser::~MimeTypesHandlerParser() {
94 bool MimeTypesHandlerParser::Parse(extensions::Extension
* extension
,
95 base::string16
* error
) {
96 const base::ListValue
* mime_types_value
= NULL
;
97 if (!extension
->manifest()->GetList(keys::kMIMETypes
,
99 *error
= base::ASCIIToUTF16(errors::kInvalidMimeTypesHandler
);
103 scoped_ptr
<MimeTypesHandlerInfo
> info(new MimeTypesHandlerInfo
);
104 info
->handler_
.set_extension_id(extension
->id());
105 for (size_t i
= 0; i
< mime_types_value
->GetSize(); ++i
) {
107 if (!mime_types_value
->GetString(i
, &filter
)) {
108 *error
= base::ASCIIToUTF16(errors::kInvalidMIMETypes
);
111 info
->handler_
.AddMIMEType(filter
);
114 std::string mime_types_handler
;
115 if (extension
->manifest()->GetString(keys::kMimeTypesHandler
,
116 &mime_types_handler
)) {
117 info
->handler_
.set_handler_url(mime_types_handler
);
120 extension
->SetManifestData(keys::kMimeTypesHandler
, info
.release());
124 const std::vector
<std::string
> MimeTypesHandlerParser::Keys() const {
125 std::vector
<std::string
> keys
;
126 keys
.push_back(keys::kMIMETypes
);
127 keys
.push_back(keys::kMimeTypesHandler
);