Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "extensions/common/message_bundle.h" | 5 #include "extensions/common/message_bundle.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| 13 #include "base/i18n/rtl.h" | 14 #include "base/i18n/rtl.h" |
| 14 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/memory/ptr_util.h" | |
| 15 #include "base/strings/string_util.h" | 17 #include "base/strings/string_util.h" |
| 16 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 17 #include "base/values.h" | 19 #include "base/values.h" |
| 18 #include "extensions/common/error_utils.h" | 20 #include "extensions/common/error_utils.h" |
| 19 #include "extensions/common/extension_l10n_util.h" | 21 #include "extensions/common/extension_l10n_util.h" |
| 20 #include "extensions/common/manifest_constants.h" | 22 #include "extensions/common/manifest_constants.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 22 | 24 |
| 23 namespace extensions { | 25 namespace extensions { |
| 24 | 26 |
| 25 namespace errors = manifest_errors; | 27 namespace errors = manifest_errors; |
| 26 | 28 |
| 27 class MessageBundleTest : public testing::Test { | 29 class MessageBundleTest : public testing::Test { |
| 28 protected: | 30 protected: |
| 29 enum BadDictionary { | 31 enum BadDictionary { |
| 30 INVALID_NAME, | 32 INVALID_NAME, |
| 31 NAME_NOT_A_TREE, | 33 NAME_NOT_A_TREE, |
| 32 EMPTY_NAME_TREE, | 34 EMPTY_NAME_TREE, |
| 33 MISSING_MESSAGE, | 35 MISSING_MESSAGE, |
| 34 PLACEHOLDER_NOT_A_TREE, | 36 PLACEHOLDER_NOT_A_TREE, |
| 35 EMPTY_PLACEHOLDER_TREE, | 37 EMPTY_PLACEHOLDER_TREE, |
| 36 CONTENT_MISSING, | 38 CONTENT_MISSING, |
| 37 MESSAGE_PLACEHOLDER_DOESNT_MATCH, | 39 MESSAGE_PLACEHOLDER_DOESNT_MATCH, |
| 38 }; | 40 }; |
| 39 | 41 |
| 40 // Helper method for dictionary building. | 42 // Helper method for dictionary building. |
| 41 void SetDictionary(const std::string& name, | 43 void SetDictionary(const std::string& name, |
|
Devlin
2017/06/02 15:38:49
This method seems a little unnecessary now. It'd
jdoerrie
2017/06/06 12:40:23
Done.
| |
| 42 base::DictionaryValue* subtree, | 44 std::unique_ptr<base::DictionaryValue> subtree, |
| 43 base::DictionaryValue* target) { | 45 base::DictionaryValue* target) { |
| 44 target->Set(name, static_cast<base::Value*>(subtree)); | 46 target->Set(name, std::move(subtree)); |
| 45 } | 47 } |
| 46 | 48 |
| 47 void CreateContentTree(const std::string& name, | 49 void CreateContentTree(const std::string& name, |
| 48 const std::string& content, | 50 const std::string& content, |
| 49 base::DictionaryValue* dict) { | 51 base::DictionaryValue* dict) { |
| 50 base::DictionaryValue* content_tree = new base::DictionaryValue; | 52 auto content_tree = base::MakeUnique<base::DictionaryValue>(); |
| 51 content_tree->SetString(MessageBundle::kContentKey, content); | 53 content_tree->SetString(MessageBundle::kContentKey, content); |
| 52 SetDictionary(name, content_tree, dict); | 54 SetDictionary(name, std::move(content_tree), dict); |
| 53 } | 55 } |
| 54 | 56 |
| 55 void CreatePlaceholdersTree(base::DictionaryValue* dict) { | 57 void CreatePlaceholdersTree(base::DictionaryValue* dict) { |
| 56 base::DictionaryValue* placeholders_tree = new base::DictionaryValue; | 58 auto placeholders_tree = base::MakeUnique<base::DictionaryValue>(); |
| 57 CreateContentTree("a", "A", placeholders_tree); | 59 CreateContentTree("a", "A", placeholders_tree.get()); |
| 58 CreateContentTree("b", "B", placeholders_tree); | 60 CreateContentTree("b", "B", placeholders_tree.get()); |
| 59 CreateContentTree("c", "C", placeholders_tree); | 61 CreateContentTree("c", "C", placeholders_tree.get()); |
| 60 SetDictionary(MessageBundle::kPlaceholdersKey, | 62 SetDictionary(MessageBundle::kPlaceholdersKey, std::move(placeholders_tree), |
| 61 placeholders_tree, | |
| 62 dict); | 63 dict); |
| 63 } | 64 } |
| 64 | 65 |
| 65 void CreateMessageTree(const std::string& name, | 66 void CreateMessageTree(const std::string& name, |
| 66 const std::string& message, | 67 const std::string& message, |
| 67 bool create_placeholder_subtree, | 68 bool create_placeholder_subtree, |
| 68 base::DictionaryValue* dict) { | 69 base::DictionaryValue* dict) { |
| 69 base::DictionaryValue* message_tree = new base::DictionaryValue; | 70 auto message_tree = base::MakeUnique<base::DictionaryValue>(); |
| 70 if (create_placeholder_subtree) | 71 if (create_placeholder_subtree) |
| 71 CreatePlaceholdersTree(message_tree); | 72 CreatePlaceholdersTree(message_tree.get()); |
| 72 message_tree->SetString(MessageBundle::kMessageKey, message); | 73 message_tree->SetString(MessageBundle::kMessageKey, message); |
| 73 SetDictionary(name, message_tree, dict); | 74 SetDictionary(name, std::move(message_tree), dict); |
| 74 } | 75 } |
| 75 | 76 |
| 76 std::unique_ptr<base::DictionaryValue> CreateGoodDictionary() { | 77 std::unique_ptr<base::DictionaryValue> CreateGoodDictionary() { |
| 77 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 78 auto dict = base::MakeUnique<base::DictionaryValue>(); |
| 78 CreateMessageTree("n1", "message1 $a$ $b$", true, dict.get()); | 79 CreateMessageTree("n1", "message1 $a$ $b$", true, dict.get()); |
| 79 CreateMessageTree("n2", "message2 $c$", true, dict.get()); | 80 CreateMessageTree("n2", "message2 $c$", true, dict.get()); |
| 80 CreateMessageTree("n3", "message3", false, dict.get()); | 81 CreateMessageTree("n3", "message3", false, dict.get()); |
| 81 return dict; | 82 return dict; |
| 82 } | 83 } |
| 83 | 84 |
| 84 std::unique_ptr<base::DictionaryValue> CreateBadDictionary( | 85 std::unique_ptr<base::DictionaryValue> CreateBadDictionary( |
| 85 enum BadDictionary what_is_bad) { | 86 enum BadDictionary what_is_bad) { |
| 86 std::unique_ptr<base::DictionaryValue> dict = CreateGoodDictionary(); | 87 std::unique_ptr<base::DictionaryValue> dict = CreateGoodDictionary(); |
| 87 // Now remove/break things. | 88 // Now remove/break things. |
| 88 switch (what_is_bad) { | 89 switch (what_is_bad) { |
| 89 case INVALID_NAME: | 90 case INVALID_NAME: |
| 90 CreateMessageTree("n 5", "nevermind", false, dict.get()); | 91 CreateMessageTree("n 5", "nevermind", false, dict.get()); |
| 91 break; | 92 break; |
| 92 case NAME_NOT_A_TREE: | 93 case NAME_NOT_A_TREE: |
| 93 dict->SetString("n4", "whatever"); | 94 dict->SetString("n4", "whatever"); |
| 94 break; | 95 break; |
| 95 case EMPTY_NAME_TREE: { | 96 case EMPTY_NAME_TREE: { |
| 96 base::DictionaryValue* empty_tree = new base::DictionaryValue; | 97 auto empty_tree = base::MakeUnique<base::DictionaryValue>(); |
| 97 SetDictionary("n4", empty_tree, dict.get()); | 98 SetDictionary("n4", std::move(empty_tree), dict.get()); |
| 98 } | 99 } |
|
Devlin
2017/06/02 15:38:48
broken before, but can we fix this brace?
jdoerrie
2017/06/06 12:40:23
Done, inlined empty_tree so braces are not necessa
| |
| 99 break; | 100 break; |
| 100 case MISSING_MESSAGE: | 101 case MISSING_MESSAGE: |
| 101 dict->Remove("n1.message", NULL); | 102 dict->Remove("n1.message", NULL); |
| 102 break; | 103 break; |
| 103 case PLACEHOLDER_NOT_A_TREE: | 104 case PLACEHOLDER_NOT_A_TREE: |
| 104 dict->SetString("n1.placeholders", "whatever"); | 105 dict->SetString("n1.placeholders", "whatever"); |
| 105 break; | 106 break; |
| 106 case EMPTY_PLACEHOLDER_TREE: { | 107 case EMPTY_PLACEHOLDER_TREE: { |
| 107 base::DictionaryValue* empty_tree = new base::DictionaryValue; | 108 auto empty_tree = base::MakeUnique<base::DictionaryValue>(); |
| 108 SetDictionary("n1.placeholders", empty_tree, dict.get()); | 109 SetDictionary("n1.placeholders", std::move(empty_tree), dict.get()); |
| 109 } | 110 } |
| 110 break; | 111 break; |
| 111 case CONTENT_MISSING: | 112 case CONTENT_MISSING: |
| 112 dict->Remove("n1.placeholders.a.content", NULL); | 113 dict->Remove("n1.placeholders.a.content", NULL); |
| 113 break; | 114 break; |
| 114 case MESSAGE_PLACEHOLDER_DOESNT_MATCH: | 115 case MESSAGE_PLACEHOLDER_DOESNT_MATCH: |
| 115 base::DictionaryValue* value; | 116 base::DictionaryValue* value; |
| 116 dict->Remove("n1.placeholders.a", NULL); | 117 dict->Remove("n1.placeholders.a", NULL); |
| 117 dict->GetDictionary("n1.placeholders", &value); | 118 dict->GetDictionary("n1.placeholders", &value); |
| 118 CreateContentTree("x", "X", value); | 119 CreateContentTree("x", "X", value); |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 420 messages.insert(std::make_pair("message_name", "message_value")); | 421 messages.insert(std::make_pair("message_name", "message_value")); |
| 421 (*GetExtensionToL10nMessagesMap())[extension_id] = messages; | 422 (*GetExtensionToL10nMessagesMap())[extension_id] = messages; |
| 422 | 423 |
| 423 L10nMessagesMap* map = GetL10nMessagesMap(extension_id); | 424 L10nMessagesMap* map = GetL10nMessagesMap(extension_id); |
| 424 ASSERT_TRUE(NULL != map); | 425 ASSERT_TRUE(NULL != map); |
| 425 EXPECT_EQ(1U, map->size()); | 426 EXPECT_EQ(1U, map->size()); |
| 426 EXPECT_EQ("message_value", (*map)["message_name"]); | 427 EXPECT_EQ("message_value", (*map)["message_name"]); |
| 427 } | 428 } |
| 428 | 429 |
| 429 } // namespace extensions | 430 } // namespace extensions |
| OLD | NEW |