summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/translate
diff options
context:
space:
mode:
authorhajimehoshi@chromium.org <hajimehoshi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-03 08:37:33 +0000
committerhajimehoshi@chromium.org <hajimehoshi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-03 08:37:33 +0000
commitd379025e989d937efeb24e0ad06eaa528c817c9f (patch)
tree549fa16a497e690df1ea8b22231dd54750cffd07 /chrome/renderer/translate
parent36467bbc91f44c78cedfaedc5216b911d568fc46 (diff)
downloadchromium_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.cc51
-rw-r--r--chrome/renderer/translate/translate_helper.h5
-rw-r--r--chrome/renderer/translate/translate_helper_unittest.cc31
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.