| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handle
r.h" | 5 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handle
r.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/string_number_conversions.h" | 8 #include "base/strings/string_number_conversions.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 const std::string& extension_id, | 134 const std::string& extension_id, |
| 135 const base::DictionaryValue* file_browser_handler, | 135 const base::DictionaryValue* file_browser_handler, |
| 136 base::string16* error) { | 136 base::string16* error) { |
| 137 scoped_ptr<FileBrowserHandler> result(new FileBrowserHandler()); | 137 scoped_ptr<FileBrowserHandler> result(new FileBrowserHandler()); |
| 138 result->set_extension_id(extension_id); | 138 result->set_extension_id(extension_id); |
| 139 | 139 |
| 140 std::string handler_id; | 140 std::string handler_id; |
| 141 // Read the file action |id| (mandatory). | 141 // Read the file action |id| (mandatory). |
| 142 if (!file_browser_handler->HasKey(keys::kPageActionId) || | 142 if (!file_browser_handler->HasKey(keys::kPageActionId) || |
| 143 !file_browser_handler->GetString(keys::kPageActionId, &handler_id)) { | 143 !file_browser_handler->GetString(keys::kPageActionId, &handler_id)) { |
| 144 *error = ASCIIToUTF16(errors::kInvalidPageActionId); | 144 *error = base::ASCIIToUTF16(errors::kInvalidPageActionId); |
| 145 return NULL; | 145 return NULL; |
| 146 } | 146 } |
| 147 result->set_id(handler_id); | 147 result->set_id(handler_id); |
| 148 | 148 |
| 149 // Read the page action title from |default_title| (mandatory). | 149 // Read the page action title from |default_title| (mandatory). |
| 150 std::string title; | 150 std::string title; |
| 151 if (!file_browser_handler->HasKey(keys::kPageActionDefaultTitle) || | 151 if (!file_browser_handler->HasKey(keys::kPageActionDefaultTitle) || |
| 152 !file_browser_handler->GetString(keys::kPageActionDefaultTitle, &title)) { | 152 !file_browser_handler->GetString(keys::kPageActionDefaultTitle, &title)) { |
| 153 *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); | 153 *error = base::ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); |
| 154 return NULL; | 154 return NULL; |
| 155 } | 155 } |
| 156 result->set_title(title); | 156 result->set_title(title); |
| 157 | 157 |
| 158 // Initialize access permissions (optional). | 158 // Initialize access permissions (optional). |
| 159 const base::ListValue* access_list_value = NULL; | 159 const base::ListValue* access_list_value = NULL; |
| 160 if (file_browser_handler->HasKey(keys::kFileAccessList)) { | 160 if (file_browser_handler->HasKey(keys::kFileAccessList)) { |
| 161 if (!file_browser_handler->GetList(keys::kFileAccessList, | 161 if (!file_browser_handler->GetList(keys::kFileAccessList, |
| 162 &access_list_value) || | 162 &access_list_value) || |
| 163 access_list_value->empty()) { | 163 access_list_value->empty()) { |
| 164 *error = ASCIIToUTF16(errors::kInvalidFileAccessList); | 164 *error = base::ASCIIToUTF16(errors::kInvalidFileAccessList); |
| 165 return NULL; | 165 return NULL; |
| 166 } | 166 } |
| 167 for (size_t i = 0; i < access_list_value->GetSize(); ++i) { | 167 for (size_t i = 0; i < access_list_value->GetSize(); ++i) { |
| 168 std::string access; | 168 std::string access; |
| 169 if (!access_list_value->GetString(i, &access) || | 169 if (!access_list_value->GetString(i, &access) || |
| 170 result->AddFileAccessPermission(access)) { | 170 result->AddFileAccessPermission(access)) { |
| 171 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 171 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 172 errors::kInvalidFileAccessValue, base::IntToString(i)); | 172 errors::kInvalidFileAccessValue, base::IntToString(i)); |
| 173 return NULL; | 173 return NULL; |
| 174 } | 174 } |
| 175 } | 175 } |
| 176 } | 176 } |
| 177 if (!result->ValidateFileAccessPermissions()) { | 177 if (!result->ValidateFileAccessPermissions()) { |
| 178 *error = ASCIIToUTF16(errors::kInvalidFileAccessList); | 178 *error = base::ASCIIToUTF16(errors::kInvalidFileAccessList); |
| 179 return NULL; | 179 return NULL; |
| 180 } | 180 } |
| 181 | 181 |
| 182 // Initialize file filters (mandatory, unless "create" access is specified, | 182 // Initialize file filters (mandatory, unless "create" access is specified, |
| 183 // in which case is ignored). The list can be empty. | 183 // in which case is ignored). The list can be empty. |
| 184 if (!result->HasCreateAccessPermission()) { | 184 if (!result->HasCreateAccessPermission()) { |
| 185 const base::ListValue* file_filters = NULL; | 185 const base::ListValue* file_filters = NULL; |
| 186 if (!file_browser_handler->HasKey(keys::kFileFilters) || | 186 if (!file_browser_handler->HasKey(keys::kFileFilters) || |
| 187 !file_browser_handler->GetList(keys::kFileFilters, &file_filters)) { | 187 !file_browser_handler->GetList(keys::kFileFilters, &file_filters)) { |
| 188 *error = ASCIIToUTF16(errors::kInvalidFileFiltersList); | 188 *error = base::ASCIIToUTF16(errors::kInvalidFileFiltersList); |
| 189 return NULL; | 189 return NULL; |
| 190 } | 190 } |
| 191 for (size_t i = 0; i < file_filters->GetSize(); ++i) { | 191 for (size_t i = 0; i < file_filters->GetSize(); ++i) { |
| 192 std::string filter; | 192 std::string filter; |
| 193 if (!file_filters->GetString(i, &filter)) { | 193 if (!file_filters->GetString(i, &filter)) { |
| 194 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( | 194 *error = extensions::ErrorUtils::FormatErrorMessageUTF16( |
| 195 errors::kInvalidFileFilterValue, base::IntToString(i)); | 195 errors::kInvalidFileFilterValue, base::IntToString(i)); |
| 196 return NULL; | 196 return NULL; |
| 197 } | 197 } |
| 198 StringToLowerASCII(&filter); | 198 StringToLowerASCII(&filter); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 224 result->AddPattern(pattern); | 224 result->AddPattern(pattern); |
| 225 } | 225 } |
| 226 } | 226 } |
| 227 | 227 |
| 228 std::string default_icon; | 228 std::string default_icon; |
| 229 // Read the file browser action |default_icon| (optional). | 229 // Read the file browser action |default_icon| (optional). |
| 230 if (file_browser_handler->HasKey(keys::kPageActionDefaultIcon)) { | 230 if (file_browser_handler->HasKey(keys::kPageActionDefaultIcon)) { |
| 231 if (!file_browser_handler->GetString( | 231 if (!file_browser_handler->GetString( |
| 232 keys::kPageActionDefaultIcon, &default_icon) || | 232 keys::kPageActionDefaultIcon, &default_icon) || |
| 233 default_icon.empty()) { | 233 default_icon.empty()) { |
| 234 *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); | 234 *error = base::ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| 235 return NULL; | 235 return NULL; |
| 236 } | 236 } |
| 237 result->set_icon_path(default_icon); | 237 result->set_icon_path(default_icon); |
| 238 } | 238 } |
| 239 | 239 |
| 240 return result.release(); | 240 return result.release(); |
| 241 } | 241 } |
| 242 | 242 |
| 243 // Loads FileBrowserHandlers from |extension_actions| into a list in |result|. | 243 // Loads FileBrowserHandlers from |extension_actions| into a list in |result|. |
| 244 bool LoadFileBrowserHandlers( | 244 bool LoadFileBrowserHandlers( |
| 245 const std::string& extension_id, | 245 const std::string& extension_id, |
| 246 const base::ListValue* extension_actions, | 246 const base::ListValue* extension_actions, |
| 247 FileBrowserHandler::List* result, | 247 FileBrowserHandler::List* result, |
| 248 base::string16* error) { | 248 base::string16* error) { |
| 249 for (base::ListValue::const_iterator iter = extension_actions->begin(); | 249 for (base::ListValue::const_iterator iter = extension_actions->begin(); |
| 250 iter != extension_actions->end(); | 250 iter != extension_actions->end(); |
| 251 ++iter) { | 251 ++iter) { |
| 252 if (!(*iter)->IsType(base::Value::TYPE_DICTIONARY)) { | 252 if (!(*iter)->IsType(base::Value::TYPE_DICTIONARY)) { |
| 253 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler); | 253 *error = base::ASCIIToUTF16(errors::kInvalidFileBrowserHandler); |
| 254 return false; | 254 return false; |
| 255 } | 255 } |
| 256 scoped_ptr<FileBrowserHandler> action( | 256 scoped_ptr<FileBrowserHandler> action( |
| 257 LoadFileBrowserHandler( | 257 LoadFileBrowserHandler( |
| 258 extension_id, | 258 extension_id, |
| 259 reinterpret_cast<base::DictionaryValue*>(*iter), error)); | 259 reinterpret_cast<base::DictionaryValue*>(*iter), error)); |
| 260 if (!action.get()) | 260 if (!action.get()) |
| 261 return false; // Failed to parse file browser action definition. | 261 return false; // Failed to parse file browser action definition. |
| 262 result->push_back(linked_ptr<FileBrowserHandler>(action.release())); | 262 result->push_back(linked_ptr<FileBrowserHandler>(action.release())); |
| 263 } | 263 } |
| 264 return true; | 264 return true; |
| 265 } | 265 } |
| 266 | 266 |
| 267 } // namespace | 267 } // namespace |
| 268 | 268 |
| 269 bool FileBrowserHandlerParser::Parse(extensions::Extension* extension, | 269 bool FileBrowserHandlerParser::Parse(extensions::Extension* extension, |
| 270 base::string16* error) { | 270 base::string16* error) { |
| 271 const base::ListValue* file_browser_handlers_value = NULL; | 271 const base::ListValue* file_browser_handlers_value = NULL; |
| 272 if (!extension->manifest()->GetList(keys::kFileBrowserHandlers, | 272 if (!extension->manifest()->GetList(keys::kFileBrowserHandlers, |
| 273 &file_browser_handlers_value)) { | 273 &file_browser_handlers_value)) { |
| 274 *error = ASCIIToUTF16(errors::kInvalidFileBrowserHandler); | 274 *error = base::ASCIIToUTF16(errors::kInvalidFileBrowserHandler); |
| 275 return false; | 275 return false; |
| 276 } | 276 } |
| 277 scoped_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo); | 277 scoped_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo); |
| 278 if (!LoadFileBrowserHandlers(extension->id(), | 278 if (!LoadFileBrowserHandlers(extension->id(), |
| 279 file_browser_handlers_value, | 279 file_browser_handlers_value, |
| 280 &info->file_browser_handlers, | 280 &info->file_browser_handlers, |
| 281 error)) { | 281 error)) { |
| 282 return false; // Failed to parse file browser actions definition. | 282 return false; // Failed to parse file browser actions definition. |
| 283 } | 283 } |
| 284 | 284 |
| 285 extension->SetManifestData(keys::kFileBrowserHandlers, info.release()); | 285 extension->SetManifestData(keys::kFileBrowserHandlers, info.release()); |
| 286 return true; | 286 return true; |
| 287 } | 287 } |
| 288 | 288 |
| 289 const std::vector<std::string> FileBrowserHandlerParser::Keys() const { | 289 const std::vector<std::string> FileBrowserHandlerParser::Keys() const { |
| 290 return SingleKey(keys::kFileBrowserHandlers); | 290 return SingleKey(keys::kFileBrowserHandlers); |
| 291 } | 291 } |
| OLD | NEW |