| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 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. | |
| 4 | |
| 5 #include "chrome/common/extensions/api/extension_action/page_action_handler.h" | |
| 6 | |
| 7 #include "base/strings/utf_string_conversions.h" | |
| 8 #include "base/values.h" | |
| 9 #include "chrome/common/extensions/extension_constants.h" | |
| 10 #include "chrome/grit/generated_resources.h" | |
| 11 #include "extensions/common/extension.h" | |
| 12 #include "extensions/common/file_util.h" | |
| 13 #include "extensions/common/manifest_constants.h" | |
| 14 | |
| 15 namespace extensions { | |
| 16 | |
| 17 namespace keys = manifest_keys; | |
| 18 namespace errors = manifest_errors; | |
| 19 | |
| 20 PageActionHandler::PageActionHandler() { | |
| 21 } | |
| 22 | |
| 23 PageActionHandler::~PageActionHandler() { | |
| 24 } | |
| 25 | |
| 26 bool PageActionHandler::Parse(Extension* extension, base::string16* error) { | |
| 27 scoped_ptr<ActionInfo> page_action_info; | |
| 28 const base::DictionaryValue* page_action_value = NULL; | |
| 29 | |
| 30 if (extension->manifest()->HasKey(keys::kPageActions)) { | |
| 31 const base::ListValue* list_value = NULL; | |
| 32 if (!extension->manifest()->GetList(keys::kPageActions, &list_value)) { | |
| 33 *error = base::ASCIIToUTF16(errors::kInvalidPageActionsList); | |
| 34 return false; | |
| 35 } | |
| 36 | |
| 37 size_t list_value_length = list_value->GetSize(); | |
| 38 | |
| 39 if (list_value_length == 0u) { | |
| 40 // A list with zero items is allowed, and is equivalent to not having | |
| 41 // a page_actions key in the manifest. Don't set |page_action_value|. | |
| 42 } else if (list_value_length == 1u) { | |
| 43 if (!list_value->GetDictionary(0, &page_action_value)) { | |
| 44 *error = base::ASCIIToUTF16(errors::kInvalidPageAction); | |
| 45 return false; | |
| 46 } | |
| 47 } else { // list_value_length > 1u. | |
| 48 *error = base::ASCIIToUTF16(errors::kInvalidPageActionsListSize); | |
| 49 return false; | |
| 50 } | |
| 51 } else if (extension->manifest()->HasKey(keys::kPageAction)) { | |
| 52 if (!extension->manifest()->GetDictionary(keys::kPageAction, | |
| 53 &page_action_value)) { | |
| 54 *error = base::ASCIIToUTF16(errors::kInvalidPageAction); | |
| 55 return false; | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 // An extension cannot have both browser and page actions. | |
| 60 if (extension->manifest()->HasKey(keys::kBrowserAction)) { | |
| 61 *error = base::ASCIIToUTF16(errors::kOneUISurfaceOnly); | |
| 62 return false; | |
| 63 } | |
| 64 | |
| 65 // If page_action_value is not NULL, then there was a valid page action. | |
| 66 if (page_action_value) { | |
| 67 page_action_info = ActionInfo::Load(extension, page_action_value, error); | |
| 68 if (!page_action_info) | |
| 69 return false; // Failed to parse page action definition. | |
| 70 } | |
| 71 ActionInfo::SetPageActionInfo(extension, page_action_info.release()); | |
| 72 | |
| 73 return true; | |
| 74 } | |
| 75 | |
| 76 bool PageActionHandler::Validate(const Extension* extension, | |
| 77 std::string* error, | |
| 78 std::vector<InstallWarning>* warnings) const { | |
| 79 const extensions::ActionInfo* action = | |
| 80 extensions::ActionInfo::GetPageActionInfo(extension); | |
| 81 if (action && !action->default_icon.empty() && | |
| 82 !file_util::ValidateExtensionIconSet( | |
| 83 action->default_icon, | |
| 84 extension, | |
| 85 IDS_EXTENSION_LOAD_ICON_FOR_PAGE_ACTION_FAILED, | |
| 86 error)) { | |
| 87 return false; | |
| 88 } | |
| 89 return true; | |
| 90 } | |
| 91 | |
| 92 const std::vector<std::string> PageActionHandler::Keys() const { | |
| 93 std::vector<std::string> keys; | |
| 94 keys.push_back(keys::kPageAction); | |
| 95 keys.push_back(keys::kPageActions); | |
| 96 return keys; | |
| 97 } | |
| 98 | |
| 99 } // namespace extensions | |
| OLD | NEW |