Index: chrome/renderer/translate/translate_script_browsertest.cc |
diff --git a/chrome/renderer/translate/translate_script_browsertest.cc b/chrome/renderer/translate/translate_script_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eef8e0817ed90cb4a359475c1fe49e93394ec30d |
--- /dev/null |
+++ b/chrome/renderer/translate/translate_script_browsertest.cc |
@@ -0,0 +1,236 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/common/translate/translate_errors.h" |
+#include "chrome/test/base/chrome_render_view_test.h" |
+#include "grit/browser_resources.h" |
+#include "third_party/WebKit/public/web/WebFrame.h" |
+#include "third_party/WebKit/public/web/WebScriptSource.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+using WebKit::WebFrame; |
+using WebKit::WebScriptSource; |
+ |
+namespace { |
+ |
+// JavaScript code to set runtime test flags. |
+const char kThrowInitializationError[] = "throwInitializationError = true"; |
+const char kThrowUnexpectedScriptError[] = "throwUnexpectedScriptError = true"; |
+const char kCallbackReturnBooleanError[] = "callbackReturnBooleanError = true"; |
+const char kCallbackReturnNumberError[] = "callbackReturnNumberError = true"; |
+const char kSetCallbackErrorCode[] = "callbackErrorCode = "; |
+ |
+// JavaScript code to check if any error happens. |
+const char kError[] = "cr.googleTranslate.error"; |
+ |
+// JavaScript code to get error code. |
+const char kErrorCode[] = "cr.googleTranslate.errorCode"; |
+ |
+// JavaScript code to check if the library is ready. |
+const char kLibReady[] = "cr.googleTranslate.libReady"; |
+ |
+// JavaScript code to perform translation. |
+const char kTranslate[] = "cr.googleTranslate.translate('auto', 'en')"; |
+ |
+// JavaScript code to mimic element.js provided by a translate server. |
+const char kElementJs[] = |
+ "translateApiKey = '';" |
+ "google = {};" |
+ "google.translate = {};" |
+ "google.translate.TranslateService = function() {" |
+ " if (window['throwInitializationError']) {" |
+ " throw 'API initialization error';" |
+ " }" |
+ " return {" |
+ " isAvailable: function() { return true; }," |
+ " restore: function() {}," |
+ " translatePage: function(originalLang, targetLang, cb) {" |
+ " if (window['throwUnexpectedScriptError']) {" |
+ " throw 'all your base are belong to us';" |
+ " }" |
+ " if (window['callbackReturnBooleanError']) {" |
+ " cb(0, false, true);" |
+ " }" |
+ " if (window['callbackReturnNumberError']) {" |
+ " cb(0, false, callbackErrorCode);" |
+ " }" |
+ " }" |
+ " };" |
+ "};" |
+ "cr.googleTranslate.onTranslateElementLoad();"; |
+ |
+}; // namespace |
+ |
+// This class is for testing resource/translate.js works and reports errors |
+// correctly. |
+class TranslateScriptBrowserTest : public ChromeRenderViewTest { |
+ public: |
+ TranslateScriptBrowserTest() {} |
+ |
+ protected: |
+ void InjectElementLibrary() { |
+ std::string script; |
+ base::StringPiece translate_js = ResourceBundle::GetSharedInstance(). |
+ GetRawDataResource(IDR_TRANSLATE_JS); |
+ translate_js.CopyToString(&script); |
+ script += kElementJs; |
+ ExecuteScript(script); |
+ } |
+ |
+ void ExecuteScript(const std::string& script) { |
+ WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
+ GetMainFrame()->executeScript(source); |
+ } |
+ |
+ bool Error() { |
hajimehoshi
2013/09/09 06:17:42
GetError?
Takashi Toyoshima
2013/09/09 10:07:51
Done.
Maybe you may want to say applying the same
|
+ return ExecuteScriptAndGetBoolResult(kError); |
+ } |
+ |
+ double ErrorCode() { |
+ return ExecuteScriptAndGetNumberResult(kErrorCode); |
+ } |
+ |
+ bool IsLibReady() { |
+ return ExecuteScriptAndGetBoolResult(kLibReady); |
+ } |
+ |
+ private: |
+ virtual void SetUp() OVERRIDE { |
+ ChromeRenderViewTest::SetUp(); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ ChromeRenderViewTest::TearDown(); |
+ } |
+ |
+ double ExecuteScriptAndGetNumberResult(const std::string& script) { |
+ WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
+ v8::HandleScope handle_scope; |
+ v8::Handle<v8::Value> result = |
+ GetMainFrame()->executeScriptAndReturnValue(source); |
+ if (result.IsEmpty() || !result->IsNumber()) { |
+ NOTREACHED(); |
+ return 0.0; |
hajimehoshi
2013/09/09 06:17:42
(optional) Why don't you use NAN at cmath?
Takashi Toyoshima
2013/09/09 10:07:51
It sounds good, but for now I'll keep it as 0.0 an
|
+ } |
+ return result->NumberValue(); |
+ } |
+ |
+ bool ExecuteScriptAndGetBoolResult(const std::string& script) { |
+ WebScriptSource source = WebScriptSource(ASCIIToUTF16(script)); |
+ v8::HandleScope handle_scope; |
+ v8::Handle<v8::Value> result = |
+ GetMainFrame()->executeScriptAndReturnValue(source); |
+ if (result.IsEmpty() || !result->IsBoolean()) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ return result->BooleanValue(); |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TranslateScriptBrowserTest); |
+}; |
+ |
+// Test if onTranslateElementLoad() succeeds to initialize the element library. |
+TEST_F(TranslateScriptBrowserTest, ElementLoadSuccess) { |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+} |
+ |
+// Test if onTranslateElementLoad() fails to initialize the element library and |
+// report the right error code. |
+TEST_F(TranslateScriptBrowserTest, ElementLoadFailure) { |
+ ExecuteScript(kThrowInitializationError); |
+ |
+ InjectElementLibrary(); |
+ EXPECT_FALSE(IsLibReady()); |
+ EXPECT_TRUE(Error()); |
+ EXPECT_EQ(TranslateErrors::INITIALIZATION_ERROR, ErrorCode()); |
+} |
+ |
+// Test if cr.googleTranslate.translate() works. |
+TEST_F(TranslateScriptBrowserTest, TranslateSuccess) { |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+ |
+ ExecuteScript(kTranslate); |
+ |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+} |
+ |
+// Test if cr.googleTranslate.translate() handles library exception correctly. |
+TEST_F(TranslateScriptBrowserTest, TranslateFail) { |
+ ExecuteScript(kThrowUnexpectedScriptError); |
+ |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+ |
+ ExecuteScript(kTranslate); |
+ |
+ EXPECT_TRUE(Error()); |
+ EXPECT_EQ(TranslateErrors::UNEXPECTED_SCRIPT_ERROR, ErrorCode()); |
+} |
+ |
+// Test if onTranslateProgress callback handles boolean type error correctly. |
+// Remove this test once server side changes the API to return a number. |
+TEST_F(TranslateScriptBrowserTest, CallbackGetBooleanError) { |
+ ExecuteScript(kCallbackReturnBooleanError); |
+ |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+ |
+ ExecuteScript(kTranslate); |
+ |
+ EXPECT_TRUE(Error()); |
+ EXPECT_EQ(TranslateErrors::TRANSLATION_ERROR, ErrorCode()); |
+} |
+ |
+// Test if onTranslateProgress callback handles number type error correctly and |
+// converts it to the proper error code. |
+TEST_F(TranslateScriptBrowserTest, CallbackGetNumberError1) { |
+ ExecuteScript(kCallbackReturnNumberError); |
+ std::string setError(kSetCallbackErrorCode); |
+ setError += "1"; |
hajimehoshi
2013/09/09 06:17:42
This is a little uneasy to read. How about create
Takashi Toyoshima
2013/09/09 10:07:51
Done.
|
+ ExecuteScript(setError); |
+ |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+ |
+ ExecuteScript(kTranslate); |
+ |
+ EXPECT_TRUE(Error()); |
+ EXPECT_EQ(TranslateErrors::TRANSLATION_ERROR, ErrorCode()); |
+} |
+ |
+// Test if onTranslateProgress callback handles number type error correctly and |
+// converts it to the proper error code. |
+TEST_F(TranslateScriptBrowserTest, CallbackGetNumberError2) { |
+ ExecuteScript(kCallbackReturnNumberError); |
+ std::string setError(kSetCallbackErrorCode); |
+ setError += "2"; |
+ ExecuteScript(setError); |
+ |
+ InjectElementLibrary(); |
+ EXPECT_TRUE(IsLibReady()); |
+ EXPECT_FALSE(Error()); |
+ EXPECT_EQ(TranslateErrors::NONE, ErrorCode()); |
+ |
+ ExecuteScript(kTranslate); |
+ |
+ EXPECT_TRUE(Error()); |
+ EXPECT_EQ(TranslateErrors::UNSUPPORTED_LANGUAGE, ErrorCode()); |
+} |
+ |
+// TODO(toyoshim): Add test for onLoadJavaScript. |