Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(152)

Side by Side Diff: chrome/browser/translate/translate_manager_unittest.cc

Issue 186063007: Move TranslateManager unit tests out of the browser_tests target. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: translatetests: fixandroid Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/translate/translate_manager_browsertest.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 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 "chrome/browser/translate/translate_manager.h" 5 #include "chrome/browser/translate/translate_manager.h"
6 6
7 #include <algorithm>
8 #include <set>
9 #include <vector>
10
11 #include "base/memory/scoped_ptr.h"
12 #include "base/prefs/pref_change_registrar.h"
13 #include "base/prefs/pref_service.h"
14 #include "base/strings/stringprintf.h"
15 #include "chrome/app/chrome_command_ids.h"
16 #include "chrome/browser/chrome_notification_types.h"
17 #include "chrome/browser/extensions/test_extension_system.h"
18 #include "chrome/browser/infobars/infobar.h"
19 #include "chrome/browser/infobars/infobar_service.h"
20 #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
21 #include "chrome/browser/translate/translate_infobar_delegate.h"
22 #include "chrome/browser/translate/translate_manager.h"
23 #include "chrome/browser/translate/translate_service.h"
24 #include "chrome/browser/translate/translate_tab_helper.h"
25 #include "chrome/browser/ui/translate/translate_bubble_factory.h"
26 #include "chrome/browser/ui/translate/translate_bubble_model.h"
27 #include "chrome/browser/ui/translate/translate_bubble_model_impl.h"
28 #include "chrome/common/chrome_switches.h"
29 #include "chrome/common/pref_names.h"
30 #include "chrome/common/render_messages.h"
31 #include "chrome/common/url_constants.h"
32 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
33 #include "chrome/test/base/testing_browser_process.h"
34 #include "chrome/test/base/testing_profile.h"
35 #include "components/translate/core/browser/translate_accept_languages.h"
36 #include "components/translate/core/browser/translate_download_manager.h"
37 #include "components/translate/core/browser/translate_language_list.h"
38 #include "components/translate/core/browser/translate_prefs.h"
39 #include "components/translate/core/browser/translate_script.h"
40 #include "components/translate/core/common/language_detection_details.h"
41 #include "components/translate/core/common/translate_pref_names.h"
42 #include "content/public/browser/navigation_details.h"
43 #include "content/public/browser/navigation_entry.h"
44 #include "content/public/browser/notification_details.h"
45 #include "content/public/browser/notification_registrar.h"
46 #include "content/public/browser/web_contents.h"
7 #include "content/public/common/url_constants.h" 47 #include "content/public/common/url_constants.h"
48 #include "content/public/test/mock_render_process_host.h"
49 #include "content/public/test/test_renderer_host.h"
50 #include "net/url_request/test_url_fetcher_factory.h"
51 #include "net/url_request/url_fetcher_delegate.h"
52 #include "testing/gmock/include/gmock/gmock.h"
8 #include "testing/gtest/include/gtest/gtest.h" 53 #include "testing/gtest/include/gtest/gtest.h"
54 #include "third_party/WebKit/public/web/WebContextMenuData.h"
9 #include "url/gurl.h" 55 #include "url/gurl.h"
10 56
11 #if defined(OS_CHROMEOS) 57 #if defined(OS_CHROMEOS)
12 #include "chrome/browser/chromeos/file_manager/app_id.h" 58 #include "chrome/browser/chromeos/file_manager/app_id.h"
13 #include "extensions/common/constants.h" 59 #include "extensions/common/constants.h"
14 #endif 60 #endif
15 61
16 typedef testing::Test TranslateManagerTest; 62 typedef testing::Test TranslateManagerTest;
17 63
18 TEST_F(TranslateManagerTest, CheckTranslatableURL) { 64 TEST_F(TranslateManagerTest, CheckTranslatableURL) {
(...skipping 17 matching lines...) Expand all
36 EXPECT_FALSE(TranslateManager::IsTranslatableURL(filemanager_url)); 82 EXPECT_FALSE(TranslateManager::IsTranslatableURL(filemanager_url));
37 #endif 83 #endif
38 84
39 std::string ftp = std::string(content::kFtpScheme) + "://google.com/pub"; 85 std::string ftp = std::string(content::kFtpScheme) + "://google.com/pub";
40 GURL ftp_url = GURL(ftp); 86 GURL ftp_url = GURL(ftp);
41 EXPECT_FALSE(TranslateManager::IsTranslatableURL(ftp_url)); 87 EXPECT_FALSE(TranslateManager::IsTranslatableURL(ftp_url));
42 88
43 GURL right_url = GURL("http://www.tamurayukari.com/"); 89 GURL right_url = GURL("http://www.tamurayukari.com/");
44 EXPECT_TRUE(TranslateManager::IsTranslatableURL(right_url)); 90 EXPECT_TRUE(TranslateManager::IsTranslatableURL(right_url));
45 } 91 }
92
93 #if !defined(OS_ANDROID)
hajimehoshi 2014/03/04 02:35:57 Is it possible to execute these tests on Android?
danakj 2014/03/04 15:39:23 No, RenderViewContextMenu does not get compiled in
94
95 // An observer that keeps track of whether a navigation entry was committed.
96 class NavEntryCommittedObserver : public content::NotificationObserver {
97 public:
98 explicit NavEntryCommittedObserver(content::WebContents* web_contents) {
99 registrar_.Add(this,
100 content::NOTIFICATION_NAV_ENTRY_COMMITTED,
101 content::Source<content::NavigationController>(
102 &web_contents->GetController()));
103 }
104
105 virtual void Observe(int type,
106 const content::NotificationSource& source,
107 const content::NotificationDetails& details) OVERRIDE {
108 DCHECK(type == content::NOTIFICATION_NAV_ENTRY_COMMITTED);
109 details_ =
110 *(content::Details<content::LoadCommittedDetails>(details).ptr());
111 }
112
113 const content::LoadCommittedDetails& load_committed_details() const {
114 return details_;
115 }
116
117 private:
118 content::LoadCommittedDetails details_;
119 content::NotificationRegistrar registrar_;
120
121 DISALLOW_COPY_AND_ASSIGN(NavEntryCommittedObserver);
122 };
123
124 class TranslateManagerRenderViewHostTest
125 : public ChromeRenderViewHostTestHarness,
126 public content::NotificationObserver {
127 public:
128 TranslateManagerRenderViewHostTest()
129 : pref_callback_(
130 base::Bind(&TranslateManagerRenderViewHostTest::OnPreferenceChanged,
131 base::Unretained(this))) {}
132
133 // Simulates navigating to a page and getting the page contents and language
134 // for that navigation.
135 void SimulateNavigation(const GURL& url,
136 const std::string& lang,
137 bool page_translatable) {
138 NavigateAndCommit(url);
139 SimulateOnTranslateLanguageDetermined(lang, page_translatable);
140 }
141
142 void SimulateOnTranslateLanguageDetermined(const std::string& lang,
143 bool page_translatable) {
144 LanguageDetectionDetails details;
145 details.adopted_language = lang;
146 content::RenderViewHostTester::TestOnMessageReceived(
147 rvh(),
148 ChromeViewHostMsg_TranslateLanguageDetermined(
149 0, details, page_translatable));
150 }
151
152 void SimulateOnPageTranslated(int routing_id,
153 const std::string& source_lang,
154 const std::string& target_lang,
155 TranslateErrors::Type error) {
156 content::RenderViewHostTester::TestOnMessageReceived(
157 rvh(),
158 ChromeViewHostMsg_PageTranslated(
159 routing_id, 0, source_lang, target_lang, error));
160 }
161
162 void SimulateOnPageTranslated(const std::string& source_lang,
163 const std::string& target_lang) {
164 SimulateOnPageTranslated(
165 0, source_lang, target_lang, TranslateErrors::NONE);
166 }
167
168 bool GetTranslateMessage(int* page_id,
169 std::string* original_lang,
170 std::string* target_lang) {
171 const IPC::Message* message = process()->sink().GetFirstMessageMatching(
172 ChromeViewMsg_TranslatePage::ID);
173 if (!message)
174 return false;
175 Tuple4<int, std::string, std::string, std::string> translate_param;
176 ChromeViewMsg_TranslatePage::Read(message, &translate_param);
177 if (page_id)
178 *page_id = translate_param.a;
179 // Ignore translate_param.b which is the script injected in the page.
180 if (original_lang)
181 *original_lang = translate_param.c;
182 if (target_lang)
183 *target_lang = translate_param.d;
184 return true;
185 }
186
187 InfoBarService* infobar_service() {
188 return InfoBarService::FromWebContents(web_contents());
189 }
190
191 // Returns the translate infobar if there is 1 infobar and it is a translate
192 // infobar.
193 TranslateInfoBarDelegate* GetTranslateInfoBar() {
194 return (infobar_service()->infobar_count() == 1)
195 ? infobar_service()
196 ->infobar_at(0)
197 ->delegate()
198 ->AsTranslateInfoBarDelegate()
199 : NULL;
200 }
201
202 // If there is 1 infobar and it is a translate infobar, closes it and returns
203 // true. Returns false otherwise.
204 bool CloseTranslateInfoBar() {
205 InfoBarDelegate* infobar = GetTranslateInfoBar();
206 if (!infobar)
207 return false;
208 infobar->InfoBarDismissed(); // Simulates closing the infobar.
209 infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
210 return true;
211 }
212
213 // Checks whether |infobar| has been removed and clears the removed infobar
214 // list.
215 bool CheckInfoBarRemovedAndReset(InfoBarDelegate* delegate) {
216 bool found = removed_infobars_.count(delegate) != 0;
217 removed_infobars_.clear();
218 return found;
219 }
220
221 void ExpireTranslateScriptImmediately() {
222 TranslateDownloadManager::GetInstance()->SetTranslateScriptExpirationDelay(
223 0);
224 }
225
226 // If there is 1 infobar and it is a translate infobar, deny translation and
227 // returns true. Returns false otherwise.
228 bool DenyTranslation() {
229 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
230 if (!infobar)
231 return false;
232 infobar->TranslationDeclined();
233 infobar_service()->RemoveInfoBar(infobar_service()->infobar_at(0));
234 return true;
235 }
236
237 void ReloadAndWait(bool successful_reload) {
238 NavEntryCommittedObserver nav_observer(web_contents());
239 if (successful_reload)
240 Reload();
241 else
242 FailedReload();
243
244 // Ensures it is really handled a reload.
245 const content::LoadCommittedDetails& nav_details =
246 nav_observer.load_committed_details();
247 EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
248 EXPECT_EQ(content::NAVIGATION_TYPE_EXISTING_PAGE, nav_details.type);
249
250 // The TranslateManager class processes the navigation entry committed
251 // notification in a posted task; process that task.
252 base::MessageLoop::current()->RunUntilIdle();
253 }
254
255 virtual void Observe(int type,
256 const content::NotificationSource& source,
257 const content::NotificationDetails& details) {
258 DCHECK_EQ(chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED, type);
259 removed_infobars_.insert(
260 content::Details<InfoBar::RemovedDetails>(details)->first->delegate());
261 }
262
263 MOCK_METHOD1(OnPreferenceChanged, void(const std::string&));
264
265 protected:
266 virtual void SetUp() {
267 TranslateService::Initialize();
268 TranslateService::SetUseInfobar(true);
269
270 // Clears the translate script so it is fetched everytime and sets the
271 // expiration delay to a large value by default (in case it was zeroed in a
272 // previous test).
273 TranslateDownloadManager* download_manager =
274 TranslateDownloadManager::GetInstance();
275 download_manager->ClearTranslateScriptForTesting();
276 download_manager->SetTranslateScriptExpirationDelay(60 * 60 * 1000);
277
278 ChromeRenderViewHostTestHarness::SetUp();
279 InfoBarService::CreateForWebContents(web_contents());
280 TranslateTabHelper::CreateForWebContents(web_contents());
281 TranslateManager* manager =
282 TranslateTabHelper::GetManagerFromWebContents(web_contents());
283 manager->set_translate_max_reload_attemps(0);
284
285 notification_registrar_.Add(
286 this,
287 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
288 content::Source<InfoBarService>(infobar_service()));
289 }
290
291 virtual void TearDown() {
292 process()->sink().ClearMessages();
293
294 notification_registrar_.Remove(
295 this,
296 chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED,
297 content::Source<InfoBarService>(infobar_service()));
298
299 ChromeRenderViewHostTestHarness::TearDown();
300 }
301
302 void SetApplicationLocale(const std::string& locale) {
303 g_browser_process->SetApplicationLocale(locale);
304 TranslateDownloadManager::GetInstance()->set_application_locale(
305 g_browser_process->GetApplicationLocale());
306 }
307
308 void SimulateTranslateScriptURLFetch(bool success) {
309 net::TestURLFetcher* fetcher =
310 url_fetcher_factory_.GetFetcherByID(TranslateScript::kFetcherId);
311 ASSERT_TRUE(fetcher);
312 net::URLRequestStatus status;
313 status.set_status(success ? net::URLRequestStatus::SUCCESS
314 : net::URLRequestStatus::FAILED);
315 fetcher->set_url(fetcher->GetOriginalURL());
316 fetcher->set_status(status);
317 fetcher->set_response_code(success ? 200 : 500);
318 fetcher->delegate()->OnURLFetchComplete(fetcher);
319 }
320
321 void SimulateSupportedLanguagesURLFetch(
322 bool success,
323 const std::vector<std::string>& languages,
324 bool use_alpha_languages,
325 const std::vector<std::string>& alpha_languages) {
326 net::URLRequestStatus status;
327 status.set_status(success ? net::URLRequestStatus::SUCCESS
328 : net::URLRequestStatus::FAILED);
329
330 std::string data;
331 if (success) {
332 data =
333 base::StringPrintf("%s{\"sl\": {\"bla\": \"bla\"}, \"%s\": {",
334 TranslateLanguageList::kLanguageListCallbackName,
335 TranslateLanguageList::kTargetLanguagesKey);
336 const char* comma = "";
337 for (size_t i = 0; i < languages.size(); ++i) {
338 data += base::StringPrintf(
339 "%s\"%s\": \"UnusedFullName\"", comma, languages[i].c_str());
340 if (i == 0)
341 comma = ",";
342 }
343
344 if (use_alpha_languages) {
345 data += base::StringPrintf("},\"%s\": {",
346 TranslateLanguageList::kAlphaLanguagesKey);
347 comma = "";
348 for (size_t i = 0; i < alpha_languages.size(); ++i) {
349 data += base::StringPrintf(
350 "%s\"%s\": 1", comma, alpha_languages[i].c_str());
351 if (i == 0)
352 comma = ",";
353 }
354 }
355
356 data += "}})";
357 }
358 net::TestURLFetcher* fetcher =
359 url_fetcher_factory_.GetFetcherByID(TranslateLanguageList::kFetcherId);
360 ASSERT_TRUE(fetcher != NULL);
361 fetcher->set_url(fetcher->GetOriginalURL());
362 fetcher->set_status(status);
363 fetcher->set_response_code(success ? 200 : 500);
364 fetcher->SetResponseString(data);
365 fetcher->delegate()->OnURLFetchComplete(fetcher);
366 }
367
368 void SetPrefObserverExpectation(const char* path) {
369 EXPECT_CALL(*this, OnPreferenceChanged(std::string(path)));
370 }
371
372 PrefChangeRegistrar::NamedChangeCallback pref_callback_;
373
374 private:
375 content::NotificationRegistrar notification_registrar_;
376 net::TestURLFetcherFactory url_fetcher_factory_;
377
378 // The infobars that have been removed.
379 // WARNING: the pointers point to deleted objects, use only for comparison.
380 std::set<InfoBarDelegate*> removed_infobars_;
381
382 DISALLOW_COPY_AND_ASSIGN(TranslateManagerRenderViewHostTest);
383 };
384
385 class MockTranslateBubbleFactory : public TranslateBubbleFactory {
386 public:
387 MockTranslateBubbleFactory() {}
388
389 virtual void ShowImplementation(BrowserWindow* window,
390 content::WebContents* web_contents,
391 TranslateTabHelper::TranslateStep step,
392 TranslateErrors::Type error_type) OVERRIDE {
393 if (model_) {
394 model_->SetViewState(
395 TranslateBubbleModelImpl::TranslateStepToViewState(step));
396 return;
397 }
398
399 TranslateTabHelper* translate_tab_helper =
400 TranslateTabHelper::FromWebContents(web_contents);
401 std::string source_language =
402 translate_tab_helper->GetLanguageState().original_language();
403 std::string target_language = TranslateDownloadManager::GetLanguageCode(
404 g_browser_process->GetApplicationLocale());
405 scoped_ptr<TranslateUIDelegate> ui_delegate(new TranslateUIDelegate(
406 web_contents, source_language, target_language));
407 model_.reset(new TranslateBubbleModelImpl(step, ui_delegate.Pass()));
408 }
409
410 TranslateBubbleModel* model() { return model_.get(); }
411
412 private:
413 scoped_ptr<TranslateBubbleModel> model_;
414
415 DISALLOW_COPY_AND_ASSIGN(MockTranslateBubbleFactory);
416 };
417
418 namespace {
419
420 class TestRenderViewContextMenu : public RenderViewContextMenu {
421 public:
422 static TestRenderViewContextMenu* CreateContextMenu(
423 content::WebContents* web_contents) {
424 content::ContextMenuParams params;
425 params.media_type = blink::WebContextMenuData::MediaTypeNone;
426 params.x = 0;
427 params.y = 0;
428 params.has_image_contents = true;
429 params.media_flags = 0;
430 params.spellcheck_enabled = false;
431 params.is_editable = false;
432 params.page_url = web_contents->GetController().GetActiveEntry()->GetURL();
433 #if defined(OS_MACOSX)
434 params.writing_direction_default = 0;
435 params.writing_direction_left_to_right = 0;
436 params.writing_direction_right_to_left = 0;
437 #endif // OS_MACOSX
438 params.edit_flags = blink::WebContextMenuData::CanTranslate;
439 return new TestRenderViewContextMenu(web_contents->GetMainFrame(), params);
440 }
441
442 bool IsItemPresent(int id) {
443 return menu_model_.GetIndexOfCommandId(id) != -1;
444 }
445
446 virtual void PlatformInit() OVERRIDE {}
447 virtual void PlatformCancel() OVERRIDE {}
448 virtual bool GetAcceleratorForCommandId(int command_id,
449 ui::Accelerator* accelerator)
450 OVERRIDE {
451 return false;
452 }
453
454 private:
455 TestRenderViewContextMenu(content::RenderFrameHost* render_frame_host,
456 const content::ContextMenuParams& params)
457 : RenderViewContextMenu(render_frame_host, params) {}
458
459 DISALLOW_COPY_AND_ASSIGN(TestRenderViewContextMenu);
460 };
461
462 } // namespace
463
464 TEST_F(TranslateManagerRenderViewHostTest, NormalTranslate) {
465 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
466
467 // We should have an infobar.
468 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
469 ASSERT_TRUE(infobar != NULL);
470 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
471
472 // Simulate clicking translate.
473 process()->sink().ClearMessages();
474 infobar->Translate();
475
476 // The "Translating..." infobar should be showing.
477 infobar = GetTranslateInfoBar();
478 ASSERT_TRUE(infobar != NULL);
479 EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
480
481 // Simulate the translate script being retrieved (it only needs to be done
482 // once in the test as it is cached).
483 SimulateTranslateScriptURLFetch(true);
484
485 // Test that we sent the right message to the renderer.
486 int page_id = 0;
487 std::string original_lang, target_lang;
488 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
489 EXPECT_EQ("fr", original_lang);
490 EXPECT_EQ("en", target_lang);
491
492 // Simulate the render notifying the translation has been done.
493 SimulateOnPageTranslated("fr", "en");
494
495 // The after translate infobar should be showing.
496 infobar = GetTranslateInfoBar();
497 ASSERT_TRUE(infobar != NULL);
498 EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
499
500 // Simulate changing the original language and translating.
501 process()->sink().ClearMessages();
502 std::string new_original_lang = infobar->language_code_at(0);
503 infobar->UpdateOriginalLanguageIndex(0);
504 infobar->Translate();
505 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
506 EXPECT_EQ(new_original_lang, original_lang);
507 EXPECT_EQ("en", target_lang);
508 // Simulate the render notifying the translation has been done.
509 SimulateOnPageTranslated(new_original_lang, "en");
510 infobar = GetTranslateInfoBar();
511 ASSERT_TRUE(infobar != NULL);
512
513 // Simulate changing the target language and translating.
514 process()->sink().ClearMessages();
515 std::string new_target_lang = infobar->language_code_at(1);
516 infobar->UpdateTargetLanguageIndex(1);
517 infobar->Translate();
518 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
519 EXPECT_EQ(new_original_lang, original_lang);
520 EXPECT_EQ(new_target_lang, target_lang);
521 // Simulate the render notifying the translation has been done.
522 SimulateOnPageTranslated(new_original_lang, new_target_lang);
523 infobar = GetTranslateInfoBar();
524 ASSERT_TRUE(infobar != NULL);
525 EXPECT_EQ(new_target_lang, infobar->target_language_code());
526
527 // Reloading should trigger translation iff Always Translate is on.
528 ReloadAndWait(true);
529 infobar = GetTranslateInfoBar();
530 ASSERT_TRUE(infobar != NULL);
531 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
532 infobar->UpdateTargetLanguageIndex(1);
533 infobar->ToggleAlwaysTranslate();
534 ReloadAndWait(true);
535 infobar = GetTranslateInfoBar();
536 ASSERT_TRUE(infobar != NULL);
537 EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
538 EXPECT_EQ(new_target_lang, infobar->target_language_code());
539 }
540
541 TEST_F(TranslateManagerRenderViewHostTest, TranslateScriptNotAvailable) {
542 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
543
544 // We should have an infobar.
545 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
546 ASSERT_TRUE(infobar != NULL);
547 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
548
549 // Simulate clicking translate.
550 process()->sink().ClearMessages();
551 infobar->Translate();
552 SimulateTranslateScriptURLFetch(false);
553
554 // We should not have sent any message to translate to the renderer.
555 EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
556
557 // And we should have an error infobar showing.
558 infobar = GetTranslateInfoBar();
559 ASSERT_TRUE(infobar != NULL);
560 EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
561 }
562
563 // Ensures we deal correctly with pages for which the browser does not recognize
564 // the language (the translate server may or not detect the language).
565 TEST_F(TranslateManagerRenderViewHostTest, TranslateUnknownLanguage) {
566 // Simulate navigating to a page ("und" is the string returned by the CLD for
567 // languages it does not recognize).
568 SimulateNavigation(GURL("http://www.google.mys"), "und", true);
569
570 // We should not have an infobar as we don't know the language.
571 ASSERT_TRUE(GetTranslateInfoBar() == NULL);
572
573 // Translate the page anyway throught the context menu.
574 scoped_ptr<TestRenderViewContextMenu> menu(
575 TestRenderViewContextMenu::CreateContextMenu(web_contents()));
576 menu->Init();
577 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
578
579 // To test that bug #49018 if fixed, make sure we deal correctly with errors.
580 // Simulate a failure to fetch the translate script.
581 SimulateTranslateScriptURLFetch(false);
582 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
583 ASSERT_TRUE(infobar != NULL);
584 EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
585 EXPECT_TRUE(infobar->is_error());
586 infobar->MessageInfoBarButtonPressed();
587 SimulateTranslateScriptURLFetch(true); // This time succeed.
588
589 // Simulate the render notifying the translation has been done, the server
590 // having detected the page was in a known and supported language.
591 SimulateOnPageTranslated("fr", "en");
592
593 // The after translate infobar should be showing.
594 infobar = GetTranslateInfoBar();
595 ASSERT_TRUE(infobar != NULL);
596 EXPECT_EQ(TranslateTabHelper::AFTER_TRANSLATE, infobar->translate_step());
597 EXPECT_EQ("fr", infobar->original_language_code());
598 EXPECT_EQ("en", infobar->target_language_code());
599
600 // Let's run the same steps but this time the server detects the page is
601 // already in English.
602 SimulateNavigation(GURL("http://www.google.com"), "und", true);
603 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
604 menu->Init();
605 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
606 SimulateOnPageTranslated(1, "en", "en", TranslateErrors::IDENTICAL_LANGUAGES);
607 infobar = GetTranslateInfoBar();
608 ASSERT_TRUE(infobar != NULL);
609 EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
610 EXPECT_EQ(TranslateErrors::IDENTICAL_LANGUAGES, infobar->error_type());
611
612 // Let's run the same steps again but this time the server fails to detect the
613 // page's language (it returns an empty string).
614 SimulateNavigation(GURL("http://www.google.com"), "und", true);
615 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
616 menu->Init();
617 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
618 SimulateOnPageTranslated(
619 2, std::string(), "en", TranslateErrors::UNKNOWN_LANGUAGE);
620 infobar = GetTranslateInfoBar();
621 ASSERT_TRUE(infobar != NULL);
622 EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
623 EXPECT_EQ(TranslateErrors::UNKNOWN_LANGUAGE, infobar->error_type());
624 }
625
626 // Tests that we show/don't show an info-bar for the languages.
627 TEST_F(TranslateManagerRenderViewHostTest, TestLanguages) {
628 std::vector<std::string> languages;
629 languages.push_back("en");
630 languages.push_back("ja");
631 languages.push_back("fr");
632 languages.push_back("ht");
633 languages.push_back("xx");
634 languages.push_back("zh");
635 languages.push_back("zh-CN");
636 languages.push_back("und");
637
638 GURL url("http://www.google.com");
639 for (size_t i = 0; i < languages.size(); ++i) {
640 std::string lang = languages[i];
641 SCOPED_TRACE(::testing::Message() << "Iteration " << i
642 << " language=" << lang);
643
644 // We should not have a translate infobar.
645 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
646 ASSERT_TRUE(infobar == NULL);
647
648 SimulateNavigation(url, lang, true);
649
650 // Verify we have/don't have an info-bar as expected.
651 infobar = GetTranslateInfoBar();
652 bool expected =
653 TranslateDownloadManager::IsSupportedLanguage(lang) && lang != "en";
654 EXPECT_EQ(expected, infobar != NULL);
655
656 if (infobar != NULL)
657 EXPECT_TRUE(CloseTranslateInfoBar());
658 }
659 }
660
661 // Test the fetching of languages from the translate server
662 TEST_F(TranslateManagerRenderViewHostTest, FetchLanguagesFromTranslateServer) {
663 std::vector<std::string> server_languages;
664 // A list of languages to fake being returned by the translate server.
665 server_languages.push_back("aa");
666 server_languages.push_back("ak");
667 server_languages.push_back("ab");
668 server_languages.push_back("en-CA");
669 server_languages.push_back("zh");
670 server_languages.push_back("yi");
671 server_languages.push_back("fr-FR");
672 server_languages.push_back("xx");
673
674 std::vector<std::string> alpha_languages;
675 alpha_languages.push_back("aa");
676 alpha_languages.push_back("yi");
677
678 // First, get the default languages list. Note that calling
679 // GetSupportedLanguages() invokes RequestLanguageList() internally.
680 std::vector<std::string> default_supported_languages;
681 TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
682 // To make sure we got the defaults and don't confuse them with the mocks.
683 ASSERT_NE(default_supported_languages.size(), server_languages.size());
684
685 // Check that we still get the defaults until the URLFetch has completed.
686 std::vector<std::string> current_supported_languages;
687 TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
688 EXPECT_EQ(default_supported_languages, current_supported_languages);
689
690 // Also check that it didn't change if we failed the URL fetch.
691 SimulateSupportedLanguagesURLFetch(
692 false, std::vector<std::string>(), true, std::vector<std::string>());
693 current_supported_languages.clear();
694 TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
695 EXPECT_EQ(default_supported_languages, current_supported_languages);
696
697 // Now check that we got the appropriate set of languages from the server.
698 SimulateSupportedLanguagesURLFetch(
699 true, server_languages, true, alpha_languages);
700 current_supported_languages.clear();
701 TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
702 // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
703 EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
704 // Not sure we need to guarantee the order of languages, so we find them.
705 for (size_t i = 0; i < server_languages.size(); ++i) {
706 const std::string& lang = server_languages[i];
707 if (lang == "xx")
708 continue;
709 EXPECT_NE(current_supported_languages.end(),
710 std::find(current_supported_languages.begin(),
711 current_supported_languages.end(),
712 lang));
713 bool is_alpha =
714 std::find(alpha_languages.begin(), alpha_languages.end(), lang) !=
715 alpha_languages.end();
716 EXPECT_EQ(TranslateDownloadManager::IsAlphaLanguage(lang), is_alpha);
717 }
718 }
719
720 // Test the fetching of languages from the translate server without 'al'
721 // parameter.
722 TEST_F(TranslateManagerRenderViewHostTest,
723 FetchLanguagesFromTranslateServerWithoutAlpha) {
724 std::vector<std::string> server_languages;
725 server_languages.push_back("aa");
726 server_languages.push_back("ak");
727 server_languages.push_back("ab");
728 server_languages.push_back("en-CA");
729 server_languages.push_back("zh");
730 server_languages.push_back("yi");
731 server_languages.push_back("fr-FR");
732 server_languages.push_back("xx");
733
734 std::vector<std::string> alpha_languages;
735 alpha_languages.push_back("aa");
736 alpha_languages.push_back("yi");
737
738 // call GetSupportedLanguages to call RequestLanguageList internally.
739 std::vector<std::string> default_supported_languages;
740 TranslateDownloadManager::GetSupportedLanguages(&default_supported_languages);
741
742 SimulateSupportedLanguagesURLFetch(
743 true, server_languages, false, alpha_languages);
744
745 std::vector<std::string> current_supported_languages;
746 TranslateDownloadManager::GetSupportedLanguages(&current_supported_languages);
747
748 // "xx" can't be displayed in the Translate inforbar, so this is eliminated.
749 EXPECT_EQ(server_languages.size() - 1, current_supported_languages.size());
750
751 for (size_t i = 0; i < server_languages.size(); ++i) {
752 const std::string& lang = server_languages[i];
753 if (lang == "xx")
754 continue;
755 EXPECT_NE(current_supported_languages.end(),
756 std::find(current_supported_languages.begin(),
757 current_supported_languages.end(),
758 lang));
759 EXPECT_FALSE(TranslateDownloadManager::IsAlphaLanguage(lang));
760 }
761 }
762
763 // Tests auto-translate on page.
764 TEST_F(TranslateManagerRenderViewHostTest, AutoTranslateOnNavigate) {
765 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
766
767 // Simulate the user translating.
768 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
769 ASSERT_TRUE(infobar != NULL);
770 infobar->Translate();
771 // Simulate the translate script being retrieved.
772 SimulateTranslateScriptURLFetch(true);
773 SimulateOnPageTranslated("fr", "en");
774
775 // Now navigate to a new page in the same language.
776 process()->sink().ClearMessages();
777 SimulateNavigation(GURL("http://news.google.fr"), "fr", true);
778
779 // This should have automatically triggered a translation.
780 int page_id = 0;
781 std::string original_lang, target_lang;
782 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
783 EXPECT_EQ(1, page_id);
784 EXPECT_EQ("fr", original_lang);
785 EXPECT_EQ("en", target_lang);
786
787 // Now navigate to a page in a different language.
788 process()->sink().ClearMessages();
789 SimulateNavigation(GURL("http://news.google.es"), "es", true);
790
791 // This should not have triggered a translate.
792 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
793 }
794
795 // Tests that multiple OnPageContents do not cause multiple infobars.
796 TEST_F(TranslateManagerRenderViewHostTest, MultipleOnPageContents) {
797 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
798
799 // Simulate clicking 'Nope' (don't translate).
800 EXPECT_TRUE(DenyTranslation());
801 EXPECT_EQ(0U, infobar_service()->infobar_count());
802
803 // Send a new PageContents, we should not show an infobar.
804 SimulateOnTranslateLanguageDetermined("fr", true);
805 EXPECT_EQ(0U, infobar_service()->infobar_count());
806
807 // Do the same steps but simulate closing the infobar this time.
808 SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
809 EXPECT_TRUE(CloseTranslateInfoBar());
810 EXPECT_EQ(0U, infobar_service()->infobar_count());
811 SimulateOnTranslateLanguageDetermined("fr", true);
812 EXPECT_EQ(0U, infobar_service()->infobar_count());
813 }
814
815 // Test that reloading the page brings back the infobar if the
816 // reload succeeded and does not bring it back the reload fails.
817 TEST_F(TranslateManagerRenderViewHostTest, Reload) {
818 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
819
820 EXPECT_TRUE(CloseTranslateInfoBar());
821
822 // Reload should bring back the infobar if the reload succeeds.
823 ReloadAndWait(true);
824 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
825 EXPECT_TRUE(CloseTranslateInfoBar());
826
827 // ...But not show it if the reload fails.
828 ReloadAndWait(false);
829 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
830
831 // If we set reload attempts to a high value, we will not see the infobar
832 // immediately.
833 TranslateManager* manager =
834 TranslateTabHelper::GetManagerFromWebContents(web_contents());
835 manager->set_translate_max_reload_attemps(100);
836 ReloadAndWait(true);
837 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
838 }
839
840 // Test that reloading the page by way of typing again the URL in the
841 // location bar brings back the infobar.
842 TEST_F(TranslateManagerRenderViewHostTest, ReloadFromLocationBar) {
843 GURL url("http://www.google.fr");
844 SimulateNavigation(url, "fr", true);
845
846 EXPECT_TRUE(CloseTranslateInfoBar());
847
848 // Create a pending navigation and simulate a page load. That should be the
849 // equivalent of typing the URL again in the location bar.
850 NavEntryCommittedObserver nav_observer(web_contents());
851 web_contents()->GetController().LoadURL(
852 url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string());
853 rvh_tester()->SendNavigate(0, url);
854
855 // Test that we are really getting a same page navigation, the test would be
856 // useless if it was not the case.
857 const content::LoadCommittedDetails& nav_details =
858 nav_observer.load_committed_details();
859 EXPECT_TRUE(nav_details.entry != NULL); // There was a navigation.
860 EXPECT_EQ(content::NAVIGATION_TYPE_SAME_PAGE, nav_details.type);
861
862 // The TranslateManager class processes the navigation entry committed
863 // notification in a posted task; process that task.
864 base::MessageLoop::current()->RunUntilIdle();
865 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
866 }
867
868 // Tests that a closed translate infobar does not reappear when navigating
869 // in-page.
870 TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInPageNavigation) {
871 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
872
873 EXPECT_TRUE(CloseTranslateInfoBar());
874
875 // Navigate in page, no infobar should be shown.
876 SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
877 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
878
879 // Navigate out of page, a new infobar should show.
880 SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
881 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
882 }
883
884 // Tests that a closed translate infobar does not reappear when navigating
885 // in a subframe. (http://crbug.com/48215)
886 TEST_F(TranslateManagerRenderViewHostTest, CloseInfoBarInSubframeNavigation) {
887 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
888
889 EXPECT_TRUE(CloseTranslateInfoBar());
890
891 // Simulate a sub-frame auto-navigating.
892 rvh_tester()->SendNavigateWithTransition(
893 1, GURL("http://pub.com"), content::PAGE_TRANSITION_AUTO_SUBFRAME);
894 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
895
896 // Simulate the user navigating in a sub-frame.
897 rvh_tester()->SendNavigateWithTransition(
898 2, GURL("http://pub.com"), content::PAGE_TRANSITION_MANUAL_SUBFRAME);
899 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
900
901 // Navigate out of page, a new infobar should show.
902 SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
903 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
904 }
905
906 // Tests that denying translation is sticky when navigating in page.
907 TEST_F(TranslateManagerRenderViewHostTest, DenyTranslateInPageNavigation) {
908 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
909
910 // Simulate clicking 'Nope' (don't translate).
911 EXPECT_TRUE(DenyTranslation());
912
913 // Navigate in page, no infobar should be shown.
914 SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
915 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
916
917 // Navigate out of page, a new infobar should show.
918 SimulateNavigation(GURL("http://www.google.fr/foot"), "fr", true);
919 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
920 }
921
922 // Tests that after translating and closing the infobar, the infobar does not
923 // return when navigating in page.
924 TEST_F(TranslateManagerRenderViewHostTest,
925 TranslateCloseInfoBarInPageNavigation) {
926 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
927
928 // Simulate the user translating.
929 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
930 ASSERT_TRUE(infobar != NULL);
931 infobar->Translate();
932 // Simulate the translate script being retrieved.
933 SimulateTranslateScriptURLFetch(true);
934 SimulateOnPageTranslated("fr", "en");
935
936 EXPECT_TRUE(CloseTranslateInfoBar());
937
938 // Navigate in page, no infobar should be shown.
939 SimulateNavigation(GURL("http://www.google.fr/#ref1"), "fr", true);
940 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
941
942 // Navigate out of page, a new infobar should show.
943 // Note that we navigate to a page in a different language so we don't trigger
944 // the auto-translate feature (it would translate the page automatically and
945 // the before translate inforbar would not be shown).
946 SimulateNavigation(GURL("http://www.google.de"), "de", true);
947 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
948 }
949
950 // Tests that the after translate the infobar still shows when navigating
951 // in-page.
952 TEST_F(TranslateManagerRenderViewHostTest, TranslateInPageNavigation) {
953 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
954
955 // Simulate the user translating.
956 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
957 ASSERT_TRUE(infobar != NULL);
958 infobar->Translate();
959 SimulateTranslateScriptURLFetch(true);
960 SimulateOnPageTranslated("fr", "en");
961 // The after translate infobar is showing.
962 infobar = GetTranslateInfoBar();
963 ASSERT_TRUE(infobar != NULL);
964
965 // Navigate out of page, a new infobar should show.
966 // See note in TranslateCloseInfoBarInPageNavigation test on why it is
967 // important to navigate to a page in a different language for this test.
968 SimulateNavigation(GURL("http://www.google.de"), "de", true);
969 // The old infobar is gone.
970 EXPECT_TRUE(CheckInfoBarRemovedAndReset(infobar));
971 // And there is a new one.
972 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
973 }
974
975 // Tests that no translate infobar is shown when navigating to a page in an
976 // unsupported language.
977 TEST_F(TranslateManagerRenderViewHostTest, CLDReportsUnsupportedPageLanguage) {
978 // Simulate navigating to a page and getting an unsupported language.
979 SimulateNavigation(GURL("http://www.google.com"), "qbz", true);
980
981 // No info-bar should be shown.
982 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
983 }
984
985 // Tests that we deal correctly with unsupported languages returned by the
986 // server.
987 // The translation server might return a language we don't support.
988 TEST_F(TranslateManagerRenderViewHostTest, ServerReportsUnsupportedLanguage) {
989 SimulateNavigation(GURL("http://mail.google.fr"), "fr", true);
990 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
991 ASSERT_TRUE(infobar != NULL);
992 process()->sink().ClearMessages();
993 infobar->Translate();
994 SimulateTranslateScriptURLFetch(true);
995 // Simulate the render notifying the translation has been done, but it
996 // reports a language we don't support.
997 SimulateOnPageTranslated("qbz", "en");
998
999 // An error infobar should be showing to report that we don't support this
1000 // language.
1001 infobar = GetTranslateInfoBar();
1002 ASSERT_TRUE(infobar != NULL);
1003 EXPECT_EQ(TranslateTabHelper::TRANSLATE_ERROR, infobar->translate_step());
1004
1005 // This infobar should have a button (so the string should not be empty).
1006 ASSERT_FALSE(infobar->GetMessageInfoBarButtonText().empty());
1007
1008 // Pressing the button on that infobar should revert to the original language.
1009 process()->sink().ClearMessages();
1010 infobar->MessageInfoBarButtonPressed();
1011 const IPC::Message* message = process()->sink().GetFirstMessageMatching(
1012 ChromeViewMsg_RevertTranslation::ID);
1013 EXPECT_TRUE(message != NULL);
1014 // And it should have removed the infobar.
1015 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
1016 }
1017
1018 // Tests that no translate infobar is shown and context menu is disabled, when
1019 // Chrome is in a language that the translate server does not support.
1020 TEST_F(TranslateManagerRenderViewHostTest, UnsupportedUILanguage) {
1021 std::string original_lang = g_browser_process->GetApplicationLocale();
1022 SetApplicationLocale("qbz");
1023
1024 // Make sure that the accept language list only contains unsupported languages
1025 Profile* profile =
1026 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1027 PrefService* prefs = profile->GetPrefs();
1028 prefs->SetString(prefs::kAcceptLanguages, "qbz");
1029
1030 // Simulate navigating to a page in a language supported by the translate
1031 // server.
1032 SimulateNavigation(GURL("http://www.google.com"), "en", true);
1033
1034 // No info-bar should be shown.
1035 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
1036
1037 // And the context menu option should be disabled too.
1038 scoped_ptr<TestRenderViewContextMenu> menu(
1039 TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1040 menu->Init();
1041 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1042 EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1043
1044 SetApplicationLocale(original_lang);
1045 }
1046
1047 // Tests that the first supported accept language is selected
1048 TEST_F(TranslateManagerRenderViewHostTest, TranslateAcceptLanguage) {
1049 // Set locate to non-existant language
1050 std::string original_lang = g_browser_process->GetApplicationLocale();
1051 SetApplicationLocale("qbz");
1052
1053 // Set Qbz and French as the only accepted languages
1054 Profile* profile =
1055 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1056 PrefService* prefs = profile->GetPrefs();
1057 prefs->SetString(prefs::kAcceptLanguages, "qbz,fr");
1058
1059 // Go to a German page
1060 SimulateNavigation(GURL("http://google.de"), "de", true);
1061
1062 // Expect the infobar to pop up
1063 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1064
1065 // Set Qbz and English-US as the only accepted languages to test the country
1066 // code removal code which was causing a crash as filed in Issue 90106,
1067 // a crash caused by a language with a country code that wasn't recognized.
1068 prefs->SetString(prefs::kAcceptLanguages, "qbz,en-us");
1069
1070 // Go to a German page
1071 SimulateNavigation(GURL("http://google.de"), "de", true);
1072
1073 // Expect the infobar to pop up
1074 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1075 }
1076
1077 // Tests that the translate enabled preference is honored.
1078 TEST_F(TranslateManagerRenderViewHostTest, TranslateEnabledPref) {
1079 // Make sure the pref allows translate.
1080 Profile* profile =
1081 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1082 PrefService* prefs = profile->GetPrefs();
1083 prefs->SetBoolean(prefs::kEnableTranslate, true);
1084
1085 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1086
1087 // An infobar should be shown.
1088 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1089 EXPECT_TRUE(infobar != NULL);
1090
1091 // Disable translate.
1092 prefs->SetBoolean(prefs::kEnableTranslate, false);
1093
1094 // Navigate to a new page, that should close the previous infobar.
1095 GURL url("http://www.youtube.fr");
1096 NavigateAndCommit(url);
1097 infobar = GetTranslateInfoBar();
1098 EXPECT_TRUE(infobar == NULL);
1099
1100 // Simulate getting the page contents and language, that should not trigger
1101 // a translate infobar.
1102 SimulateOnTranslateLanguageDetermined("fr", true);
1103 infobar = GetTranslateInfoBar();
1104 EXPECT_TRUE(infobar == NULL);
1105 }
1106
1107 // Tests the "Never translate <language>" pref.
1108 TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateLanguagePref) {
1109 GURL url("http://www.google.fr");
1110 SimulateNavigation(url, "fr", true);
1111
1112 // An infobar should be shown.
1113 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1114
1115 // Select never translate this language.
1116 Profile* profile =
1117 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1118 PrefService* prefs = profile->GetPrefs();
1119 PrefChangeRegistrar registrar;
1120 registrar.Init(prefs);
1121 registrar.Add(TranslatePrefs::kPrefTranslateBlockedLanguages, pref_callback_);
1122 scoped_ptr<TranslatePrefs> translate_prefs(
1123 TranslateTabHelper::CreateTranslatePrefs(prefs));
1124 EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
1125 TranslateAcceptLanguages* accept_languages =
1126 TranslateTabHelper::GetTranslateAcceptLanguages(profile);
1127 EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1128 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
1129 translate_prefs->BlockLanguage("fr");
1130 EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
1131 EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
1132 EXPECT_FALSE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1133
1134 EXPECT_TRUE(CloseTranslateInfoBar());
1135
1136 // Navigate to a new page also in French.
1137 SimulateNavigation(GURL("http://wwww.youtube.fr"), "fr", true);
1138
1139 // There should not be a translate infobar.
1140 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
1141
1142 // Remove the language from the blacklist.
1143 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateBlockedLanguages);
1144 translate_prefs->UnblockLanguage("fr");
1145 EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
1146 EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
1147 EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1148
1149 // Navigate to a page in French.
1150 SimulateNavigation(url, "fr", true);
1151
1152 // There should be a translate infobar.
1153 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1154 }
1155
1156 // Tests the "Never translate this site" pref.
1157 TEST_F(TranslateManagerRenderViewHostTest, NeverTranslateSitePref) {
1158 GURL url("http://www.google.fr");
1159 std::string host(url.host());
1160 SimulateNavigation(url, "fr", true);
1161
1162 // An infobar should be shown.
1163 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1164
1165 // Select never translate this site.
1166 Profile* profile =
1167 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1168 PrefService* prefs = profile->GetPrefs();
1169 PrefChangeRegistrar registrar;
1170 registrar.Init(prefs);
1171 registrar.Add(TranslatePrefs::kPrefTranslateSiteBlacklist, pref_callback_);
1172 scoped_ptr<TranslatePrefs> translate_prefs(
1173 TranslateTabHelper::CreateTranslatePrefs(prefs));
1174 EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
1175 TranslateAcceptLanguages* accept_languages =
1176 TranslateTabHelper::GetTranslateAcceptLanguages(profile);
1177 EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1178 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
1179 translate_prefs->BlacklistSite(host);
1180 EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(host));
1181 EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1182
1183 EXPECT_TRUE(CloseTranslateInfoBar());
1184
1185 // Navigate to a new page also on the same site.
1186 SimulateNavigation(GURL("http://www.google.fr/hello"), "fr", true);
1187
1188 // There should not be a translate infobar.
1189 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
1190
1191 // Remove the site from the blacklist.
1192 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateSiteBlacklist);
1193 translate_prefs->RemoveSiteFromBlacklist(host);
1194 EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(host));
1195 EXPECT_TRUE(translate_prefs->CanTranslateLanguage(accept_languages, "fr"));
1196
1197 // Navigate to a page in French.
1198 SimulateNavigation(url, "fr", true);
1199
1200 // There should be a translate infobar.
1201 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1202 }
1203
1204 // Tests the "Always translate this language" pref.
1205 TEST_F(TranslateManagerRenderViewHostTest, AlwaysTranslateLanguagePref) {
1206 // Select always translate French to English.
1207 Profile* profile =
1208 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1209 PrefService* prefs = profile->GetPrefs();
1210 PrefChangeRegistrar registrar;
1211 registrar.Init(prefs);
1212 registrar.Add(TranslatePrefs::kPrefTranslateWhitelists, pref_callback_);
1213 scoped_ptr<TranslatePrefs> translate_prefs(
1214 TranslateTabHelper::CreateTranslatePrefs(prefs));
1215 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
1216 translate_prefs->WhitelistLanguagePair("fr", "en");
1217
1218 // Load a page in French.
1219 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1220
1221 // It should have triggered an automatic translation to English.
1222
1223 // The translating infobar should be showing.
1224 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1225 ASSERT_TRUE(infobar != NULL);
1226 EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
1227 SimulateTranslateScriptURLFetch(true);
1228 int page_id = 0;
1229 std::string original_lang, target_lang;
1230 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1231 EXPECT_EQ("fr", original_lang);
1232 EXPECT_EQ("en", target_lang);
1233 process()->sink().ClearMessages();
1234
1235 // Try another language, it should not be autotranslated.
1236 SimulateNavigation(GURL("http://www.google.es"), "es", true);
1237 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1238 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1239 EXPECT_TRUE(CloseTranslateInfoBar());
1240
1241 // Let's switch to incognito mode, it should not be autotranslated in that
1242 // case either.
1243 TestingProfile* test_profile =
1244 static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
1245 test_profile->ForceIncognito(true);
1246 SimulateNavigation(GURL("http://www.youtube.fr"), "fr", true);
1247 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1248 EXPECT_TRUE(GetTranslateInfoBar() != NULL);
1249 EXPECT_TRUE(CloseTranslateInfoBar());
1250 test_profile->ForceIncognito(false); // Get back to non incognito.
1251
1252 // Now revert the always translate pref and make sure we go back to expected
1253 // behavior, which is show a "before translate" infobar.
1254 SetPrefObserverExpectation(TranslatePrefs::kPrefTranslateWhitelists);
1255 translate_prefs->RemoveLanguagePairFromWhitelist("fr", "en");
1256 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1257 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1258 infobar = GetTranslateInfoBar();
1259 ASSERT_TRUE(infobar != NULL);
1260 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
1261 }
1262
1263 // Context menu.
1264 TEST_F(TranslateManagerRenderViewHostTest, ContextMenu) {
1265 // Blacklist www.google.fr and French for translation.
1266 GURL url("http://www.google.fr");
1267 Profile* profile =
1268 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1269 scoped_ptr<TranslatePrefs> translate_prefs(
1270 TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
1271 translate_prefs->BlockLanguage("fr");
1272 translate_prefs->BlacklistSite(url.host());
1273 EXPECT_TRUE(translate_prefs->IsBlockedLanguage("fr"));
1274 EXPECT_TRUE(translate_prefs->IsSiteBlacklisted(url.host()));
1275
1276 // Simulate navigating to a page in French. The translate menu should show but
1277 // should only be enabled when the page language has been received.
1278 NavigateAndCommit(url);
1279 scoped_ptr<TestRenderViewContextMenu> menu(
1280 TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1281 menu->Init();
1282 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1283 EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1284
1285 // Simulate receiving the language.
1286 SimulateOnTranslateLanguageDetermined("fr", true);
1287 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1288 menu->Init();
1289 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1290 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1291
1292 // Use the menu to translate the page.
1293 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
1294
1295 // That should have triggered a translation.
1296 // The "translating..." infobar should be showing.
1297 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1298 ASSERT_TRUE(infobar != NULL);
1299 EXPECT_EQ(TranslateTabHelper::TRANSLATING, infobar->translate_step());
1300 SimulateTranslateScriptURLFetch(true);
1301 int page_id = 0;
1302 std::string original_lang, target_lang;
1303 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1304 EXPECT_EQ("fr", original_lang);
1305 EXPECT_EQ("en", target_lang);
1306 process()->sink().ClearMessages();
1307
1308 // This should also have reverted the blacklisting of this site and language.
1309 EXPECT_FALSE(translate_prefs->IsBlockedLanguage("fr"));
1310 EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(url.host()));
1311
1312 // Let's simulate the page being translated.
1313 SimulateOnPageTranslated("fr", "en");
1314
1315 // The translate menu should now be disabled.
1316 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1317 menu->Init();
1318 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1319 EXPECT_FALSE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1320
1321 // Test that selecting translate in the context menu WHILE the page is being
1322 // translated does nothing (this could happen if autotranslate kicks-in and
1323 // the user selects the menu while the translation is being performed).
1324 SimulateNavigation(GURL("http://www.google.es"), "es", true);
1325 infobar = GetTranslateInfoBar();
1326 ASSERT_TRUE(infobar != NULL);
1327 infobar->Translate();
1328 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1329 process()->sink().ClearMessages();
1330 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1331 menu->Init();
1332 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1333 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
1334 // No message expected since the translation should have been ignored.
1335 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1336
1337 // Now test that selecting translate in the context menu AFTER the page has
1338 // been translated does nothing.
1339 SimulateNavigation(GURL("http://www.google.de"), "de", true);
1340 infobar = GetTranslateInfoBar();
1341 ASSERT_TRUE(infobar != NULL);
1342 infobar->Translate();
1343 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1344 process()->sink().ClearMessages();
1345 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1346 menu->Init();
1347 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1348 SimulateOnPageTranslated("de", "en");
1349 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
1350 // No message expected since the translation should have been ignored.
1351 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1352
1353 // Test that the translate context menu is enabled when the page is in an
1354 // unknown language.
1355 SimulateNavigation(url, "und", true);
1356 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1357 menu->Init();
1358 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1359 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1360
1361 // Test that the translate context menu is enabled even if the page is in an
1362 // unsupported language.
1363 SimulateNavigation(url, "qbz", true);
1364 menu.reset(TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1365 menu->Init();
1366 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1367 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1368 }
1369
1370 // Tests that an extra always/never translate button is shown on the "before
1371 // translate" infobar when the translation is accepted/declined 3 times,
1372 // only when not in incognito mode.
1373 TEST_F(TranslateManagerRenderViewHostTest, BeforeTranslateExtraButtons) {
1374 Profile* profile =
1375 Profile::FromBrowserContext(web_contents()->GetBrowserContext());
1376 scoped_ptr<TranslatePrefs> translate_prefs(
1377 TranslateTabHelper::CreateTranslatePrefs(profile->GetPrefs()));
1378 translate_prefs->ResetTranslationAcceptedCount("fr");
1379 translate_prefs->ResetTranslationDeniedCount("fr");
1380 translate_prefs->ResetTranslationAcceptedCount("de");
1381 translate_prefs->ResetTranslationDeniedCount("de");
1382
1383 // We'll do 4 times in incognito mode first to make sure the button is not
1384 // shown in that case, then 4 times in normal mode.
1385 TranslateInfoBarDelegate* infobar;
1386 TestingProfile* test_profile =
1387 static_cast<TestingProfile*>(web_contents()->GetBrowserContext());
1388 static_cast<extensions::TestExtensionSystem*>(
1389 extensions::ExtensionSystem::Get(test_profile))->CreateProcessManager();
1390 test_profile->ForceIncognito(true);
1391 for (int i = 0; i < 8; ++i) {
1392 SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode="
1393 << test_profile->IsOffTheRecord());
1394 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1395 infobar = GetTranslateInfoBar();
1396 ASSERT_TRUE(infobar != NULL);
1397 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
1398 if (i < 7) {
1399 EXPECT_FALSE(infobar->ShouldShowAlwaysTranslateShortcut());
1400 infobar->Translate();
1401 process()->sink().ClearMessages();
1402 } else {
1403 EXPECT_TRUE(infobar->ShouldShowAlwaysTranslateShortcut());
1404 }
1405 if (i == 3)
1406 test_profile->ForceIncognito(false);
1407 }
1408 // Simulate the user pressing "Always translate French".
1409 infobar->AlwaysTranslatePageLanguage();
1410 EXPECT_TRUE(translate_prefs->IsLanguagePairWhitelisted("fr", "en"));
1411 // Simulate the translate script being retrieved (it only needs to be done
1412 // once in the test as it is cached).
1413 SimulateTranslateScriptURLFetch(true);
1414 // That should have triggered a page translate.
1415 int page_id = 0;
1416 std::string original_lang, target_lang;
1417 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1418 process()->sink().ClearMessages();
1419
1420 // Now test that declining the translation causes a "never translate" button
1421 // to be shown (in non incognito mode only).
1422 test_profile->ForceIncognito(true);
1423 for (int i = 0; i < 8; ++i) {
1424 SCOPED_TRACE(::testing::Message() << "Iteration " << i << " incognito mode="
1425 << test_profile->IsOffTheRecord());
1426 SimulateNavigation(GURL("http://www.google.de"), "de", true);
1427 infobar = GetTranslateInfoBar();
1428 ASSERT_TRUE(infobar != NULL);
1429 EXPECT_EQ(TranslateTabHelper::BEFORE_TRANSLATE, infobar->translate_step());
1430 if (i < 7) {
1431 EXPECT_FALSE(infobar->ShouldShowNeverTranslateShortcut());
1432 infobar->TranslationDeclined();
1433 } else {
1434 EXPECT_TRUE(infobar->ShouldShowNeverTranslateShortcut());
1435 }
1436 if (i == 3)
1437 test_profile->ForceIncognito(false);
1438 }
1439 // Simulate the user pressing "Never translate French".
1440 infobar->NeverTranslatePageLanguage();
1441 EXPECT_TRUE(translate_prefs->IsBlockedLanguage("de"));
1442 // No translation should have occured and the infobar should be gone.
1443 EXPECT_FALSE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1444 process()->sink().ClearMessages();
1445 ASSERT_TRUE(GetTranslateInfoBar() == NULL);
1446 }
1447
1448 // Tests that we don't show a translate infobar when a page instructs that it
1449 // should not be translated.
1450 TEST_F(TranslateManagerRenderViewHostTest, NonTranslatablePage) {
1451 SimulateNavigation(GURL("http://mail.google.fr"), "fr", false);
1452
1453 // We should not have an infobar.
1454 EXPECT_TRUE(GetTranslateInfoBar() == NULL);
1455
1456 // The context menu is enabled to allow users to force translation.
1457 scoped_ptr<TestRenderViewContextMenu> menu(
1458 TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1459 menu->Init();
1460 EXPECT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_TRANSLATE));
1461 EXPECT_TRUE(menu->IsCommandIdEnabled(IDC_CONTENT_CONTEXT_TRANSLATE));
1462 }
1463
1464 // Tests that the script is expired and refetched as expected.
1465 TEST_F(TranslateManagerRenderViewHostTest, ScriptExpires) {
1466 ExpireTranslateScriptImmediately();
1467
1468 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1469 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1470 ASSERT_TRUE(infobar != NULL);
1471 process()->sink().ClearMessages();
1472 infobar->Translate();
1473 SimulateTranslateScriptURLFetch(true);
1474 SimulateOnPageTranslated("fr", "en");
1475
1476 // A task should have been posted to clear the script, run it.
1477 base::MessageLoop::current()->RunUntilIdle();
1478
1479 // Do another navigation and translation.
1480 SimulateNavigation(GURL("http://www.google.es"), "es", true);
1481 infobar = GetTranslateInfoBar();
1482 ASSERT_TRUE(infobar != NULL);
1483 process()->sink().ClearMessages();
1484 infobar->Translate();
1485 // If we don't simulate the URL fetch, the TranslateManager should be waiting
1486 // for the script and no message should have been sent to the renderer.
1487 EXPECT_TRUE(process()->sink().GetFirstMessageMatching(
1488 ChromeViewMsg_TranslatePage::ID) == NULL);
1489 // Now simulate the URL fetch.
1490 SimulateTranslateScriptURLFetch(true);
1491 // Now the message should have been sent.
1492 int page_id = 0;
1493 std::string original_lang, target_lang;
1494 EXPECT_TRUE(GetTranslateMessage(&page_id, &original_lang, &target_lang));
1495 EXPECT_EQ("es", original_lang);
1496 EXPECT_EQ("en", target_lang);
1497 }
1498
1499 TEST_F(TranslateManagerRenderViewHostTest, DownloadsAndHistoryNotTranslated) {
1500 ASSERT_FALSE(
1501 TranslateManager::IsTranslatableURL(GURL(chrome::kChromeUIDownloadsURL)));
1502 ASSERT_FALSE(
1503 TranslateManager::IsTranslatableURL(GURL(chrome::kChromeUIHistoryURL)));
1504 }
1505
1506 #if defined(USE_AURA)
1507
1508 TEST_F(TranslateManagerRenderViewHostTest, BubbleNormalTranslate) {
1509 // Prepare for the bubble
1510 TranslateService::SetUseInfobar(false);
1511 MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
1512 scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
1513 TranslateBubbleFactory::SetFactory(factory);
1514
1515 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1516
1517 // Check the bubble exists instead of the infobar.
1518 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1519 ASSERT_TRUE(infobar == NULL);
1520 TranslateBubbleModel* bubble = factory->model();
1521 ASSERT_TRUE(bubble != NULL);
1522 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
1523 bubble->GetViewState());
1524
1525 // Simulate clicking translate.
1526 process()->sink().ClearMessages();
1527 bubble->Translate();
1528
1529 // Check the bubble shows "Translating...".
1530 bubble = factory->model();
1531 ASSERT_TRUE(bubble != NULL);
1532 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
1533 bubble->GetViewState());
1534
1535 // Simulate the translate script being retrieved (it only needs to be done
1536 // once in the test as it is cached).
1537 SimulateTranslateScriptURLFetch(true);
1538
1539 // Simulate the render notifying the translation has been done.
1540 SimulateOnPageTranslated("fr", "en");
1541
1542 // Check the bubble shows "Translated."
1543 bubble = factory->model();
1544 ASSERT_TRUE(bubble != NULL);
1545 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE,
1546 bubble->GetViewState());
1547 }
1548
1549 TEST_F(TranslateManagerRenderViewHostTest, BubbleTranslateScriptNotAvailable) {
1550 // Prepare for the bubble
1551 TranslateService::SetUseInfobar(false);
1552 MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
1553 scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
1554 TranslateBubbleFactory::SetFactory(factory);
1555
1556 SimulateNavigation(GURL("http://www.google.fr"), "fr", true);
1557
1558 // Check the bubble exists instead of the infobar.
1559 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1560 ASSERT_TRUE(infobar == NULL);
1561 TranslateBubbleModel* bubble = factory->model();
1562 ASSERT_TRUE(bubble != NULL);
1563 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE,
1564 bubble->GetViewState());
1565
1566 // Simulate clicking translate.
1567 process()->sink().ClearMessages();
1568 bubble->Translate();
1569 SimulateTranslateScriptURLFetch(false);
1570
1571 // We should not have sent any message to translate to the renderer.
1572 EXPECT_FALSE(GetTranslateMessage(NULL, NULL, NULL));
1573
1574 // And we should have an error infobar showing.
1575 bubble = factory->model();
1576 ASSERT_TRUE(bubble != NULL);
1577 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_ERROR, bubble->GetViewState());
1578 }
1579
1580 TEST_F(TranslateManagerRenderViewHostTest, BubbleUnknownLanguage) {
1581 // Prepare for the bubble
1582 TranslateService::SetUseInfobar(false);
1583 MockTranslateBubbleFactory* factory = new MockTranslateBubbleFactory;
1584 scoped_ptr<TranslateBubbleFactory> factory_ptr(factory);
1585 TranslateBubbleFactory::SetFactory(factory);
1586
1587 // Simulate navigating to a page ("und" is the string returned by the CLD for
1588 // languages it does not recognize).
1589 SimulateNavigation(GURL("http://www.google.mys"), "und", true);
1590
1591 // We should not have a bubble as we don't know the language.
1592 ASSERT_TRUE(factory->model() == NULL);
1593
1594 // Translate the page anyway throught the context menu.
1595 scoped_ptr<TestRenderViewContextMenu> menu(
1596 TestRenderViewContextMenu::CreateContextMenu(web_contents()));
1597 menu->Init();
1598 menu->ExecuteCommand(IDC_CONTENT_CONTEXT_TRANSLATE, 0);
1599
1600 // Check the bubble exists instead of the infobar.
1601 TranslateInfoBarDelegate* infobar = GetTranslateInfoBar();
1602 ASSERT_TRUE(infobar == NULL);
1603 TranslateBubbleModel* bubble = factory->model();
1604 ASSERT_TRUE(bubble != NULL);
1605 EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_TRANSLATING,
1606 bubble->GetViewState());
1607 }
1608
1609 #endif // defined(USE_AURA)
1610 #endif // !defined(OS_ANDROID)
OLDNEW
« no previous file with comments | « chrome/browser/translate/translate_manager_browsertest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698