diff options
author | hajimehoshi@chromium.org <hajimehoshi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-03 08:37:33 +0000 |
---|---|---|
committer | hajimehoshi@chromium.org <hajimehoshi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-03 08:37:33 +0000 |
commit | d379025e989d937efeb24e0ad06eaa528c817c9f (patch) | |
tree | 549fa16a497e690df1ea8b22231dd54750cffd07 /chrome/renderer/translate | |
parent | 36467bbc91f44c78cedfaedc5216b911d568fc46 (diff) | |
download | chromium_src-d379025e989d937efeb24e0ad06eaa528c817c9f.zip chromium_src-d379025e989d937efeb24e0ad06eaa528c817c9f.tar.gz chromium_src-d379025e989d937efeb24e0ad06eaa528c817c9f.tar.bz2 |
Translate: Don't filter three-letters language code
1) Create IsValidLanguageCode instead of ResetLanguageCode because I wanted to make the logic clearer.
2) Implement IsValidLanguageCode not to filter three-letters language code like 'ceb'.
BUG=256536
TEST=unit_tests --gtest_filter=TranslateHelperTest.*
Review URL: https://chromiumcodereview.appspot.com/18135003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@209923 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer/translate')
-rw-r--r-- | chrome/renderer/translate/translate_helper.cc | 51 | ||||
-rw-r--r-- | chrome/renderer/translate/translate_helper.h | 5 | ||||
-rw-r--r-- | chrome/renderer/translate/translate_helper_unittest.cc | 31 |
3 files changed, 59 insertions, 28 deletions
diff --git a/chrome/renderer/translate/translate_helper.cc b/chrome/renderer/translate/translate_helper.cc index 34b4afe..fbc4d06 100644 --- a/chrome/renderer/translate/translate_helper.cc +++ b/chrome/renderer/translate/translate_helper.cc @@ -9,6 +9,7 @@ #include "base/logging.h" #include "base/message_loop.h" #include "base/strings/string16.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/common/chrome_constants.h" @@ -327,14 +328,41 @@ void TranslateHelper::CorrectLanguageCodeTypo(std::string* code) { } // static -void TranslateHelper::ResetInvalidLanguageCode(std::string* code) { - // Roughly check if the language code follows [a-z][a-z](-[A-Z][A-Z]). - size_t dash_index = code->find('-'); - if (!(dash_index == 2 && code->size() == 5) && - !(dash_index == std::string::npos && code->size() == 2)) { - // Reset |language| to ignore the invalid code. - *code = std::string(); +bool TranslateHelper::IsValidLanguageCode(const std::string& code) { + // Roughly check if the language code follows /[a-zA-Z]{2,3}(-[a-zA-Z]{2})?/. + // TODO(hajimehoshi): How about es-419, which is used as an Accept language? + std::vector<std::string> chunks; + base::SplitString(code, '-', &chunks); + + if (chunks.size() < 1 || 2 < chunks.size()) + return false; + + const std::string& main_code = chunks[0]; + + if (main_code.size() < 1 || 3 < main_code.size()) + return false; + + for (std::string::const_iterator it = main_code.begin(); + it != main_code.end(); ++it) { + if (!IsAsciiAlpha(*it)) + return false; } + + if (chunks.size() == 1) + return true; + + const std::string& sub_code = chunks[1]; + + if (sub_code.size() != 2) + return false; + + for (std::string::const_iterator it = sub_code.begin(); + it != sub_code.end(); ++it) { + if (!IsAsciiAlpha(*it)) + return false; + } + + return true; } // static @@ -342,11 +370,12 @@ void TranslateHelper::ApplyLanguageCodeCorrection(std::string* code) { // Correct well-known format errors. CorrectLanguageCodeTypo(code); - // Convert language code synonym firstly because sometime synonym code is in - // invalid format, e.g. 'fil'. After validation, such a 3 characters language - // gets converted to an empty string. + if (!IsValidLanguageCode(*code)) { + *code = std::string(); + return; + } + TranslateUtil::ToTranslateLanguageSynonym(code); - ResetInvalidLanguageCode(code); } // static diff --git a/chrome/renderer/translate/translate_helper.h b/chrome/renderer/translate/translate_helper.h index abef6ca..21fbcaa 100644 --- a/chrome/renderer/translate/translate_helper.h +++ b/chrome/renderer/translate/translate_helper.h @@ -87,6 +87,7 @@ class TranslateHelper : public content::RenderViewObserver { virtual double ExecuteScriptAndGetDoubleResult(const std::string& script); private: + FRIEND_TEST_ALL_PREFIXES(TranslateHelperTest, IsValidLanguageCode); FRIEND_TEST_ALL_PREFIXES(TranslateHelperTest, AdoptHtmlLang); FRIEND_TEST_ALL_PREFIXES(TranslateHelperTest, CLDAgreeWithLanguageCodeHavingCountryCode); @@ -106,8 +107,8 @@ class TranslateHelper : public content::RenderViewObserver { // Converts language code to the one used in server supporting list. static void ConvertLanguageCodeSynonym(std::string* code); - // Resets language code if the specified string is apparently invalid. - static void ResetInvalidLanguageCode(std::string* code); + // Checks if the language code's format is valid. + static bool IsValidLanguageCode(const std::string& code); // Applies a series of language code modification in proper order. static void ApplyLanguageCodeCorrection(std::string* code); diff --git a/chrome/renderer/translate/translate_helper_unittest.cc b/chrome/renderer/translate/translate_helper_unittest.cc index e1024ee..88f3b1f 100644 --- a/chrome/renderer/translate/translate_helper_unittest.cc +++ b/chrome/renderer/translate/translate_helper_unittest.cc @@ -30,32 +30,33 @@ TEST_F(TranslateHelperTest, LanguageCodeTypoCorrection) { EXPECT_EQ("ja-JP", language); } -// Tests that invalid language code is reset to empty string. -TEST_F(TranslateHelperTest, ResetInvalidLanguageCode) { +// Tests if the language codes' format is invalid. +TEST_F(TranslateHelperTest, IsValidLanguageCode) { std::string language; language = std::string("ja"); - TranslateHelper::ResetInvalidLanguageCode(&language); - EXPECT_EQ("ja", language); + EXPECT_TRUE(TranslateHelper::IsValidLanguageCode(language)); language = std::string("ja-JP"); - TranslateHelper::ResetInvalidLanguageCode(&language); - EXPECT_EQ("ja-JP", language); + EXPECT_TRUE(TranslateHelper::IsValidLanguageCode(language)); + + language = std::string("ceb"); + EXPECT_TRUE(TranslateHelper::IsValidLanguageCode(language)); + + language = std::string("ceb-XX"); + EXPECT_TRUE(TranslateHelper::IsValidLanguageCode(language)); - // Invalid because of three characters before hyphen. + // Invalid because the sub code consists of a number. language = std::string("utf-8"); - TranslateHelper::ResetInvalidLanguageCode(&language); - EXPECT_TRUE(language.empty()); + EXPECT_FALSE(TranslateHelper::IsValidLanguageCode(language)); // Invalid because of six characters after hyphen. language = std::string("ja-YUKARI"); - TranslateHelper::ResetInvalidLanguageCode(&language); - EXPECT_TRUE(language.empty()); + EXPECT_FALSE(TranslateHelper::IsValidLanguageCode(language)); - // Invalid because of three characters. - language = std::string("YMO"); - TranslateHelper::ResetInvalidLanguageCode(&language); - EXPECT_TRUE(language.empty()); + // Invalid because of four characters. + language = std::string("DHMO"); + EXPECT_FALSE(TranslateHelper::IsValidLanguageCode(language)); } // Tests that similar language table works. |