1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/views/translate/translate_bubble_view.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/command_line.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/chrome_notification_types.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/translate/translate_browser_test_utils.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/language_detection_details.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_details.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TranslateBubbleViewBrowserTest : public InProcessBrowserTest {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TranslateBubbleViewBrowserTest() {}
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~TranslateBubbleViewBrowserTest() {}
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // We can't Init() until PathService has been initialized. This happens
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // very late in the test fixture setup process.
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    dynamic_data_scope.Init();
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    InProcessBrowserTest::SetUpOnMainThread();
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test::ScopedCLDDynamicDataHarness dynamic_data_scope;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TranslateBubbleViewBrowserTest);
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBubbleViewBrowserTest,
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       CloseBrowserWithoutTranslating) {
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show a French page and wait until the bubble is shown.
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WebContents* current_web_contents =
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::Source<content::WebContents> source(current_web_contents);
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      LanguageDetectionDetails>
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  source);
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL french_url = ui_test_utils::GetTestUrl(
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), french_url);
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fr_language_detected_signal.Wait();
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(TranslateBubbleView::IsShowing());
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Close the window without translating.
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::CloseWindow(browser());
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBubbleViewBrowserTest,
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       CloseLastTabWithoutTranslating) {
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Show a French page and wait until the bubble is shown.
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WebContents* current_web_contents =
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::Source<content::WebContents> source(current_web_contents);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      LanguageDetectionDetails>
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  source);
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL french_url = ui_test_utils::GetTestUrl(
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), french_url);
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fr_language_detected_signal.Wait();
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(TranslateBubbleView::IsShowing());
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Close the tab without translating.
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::CloseWebContents(browser(), current_web_contents, false);
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBubbleViewBrowserTest,
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       CloseAnotherTabWithoutTranslating) {
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int active_index = browser()->tab_strip_model()->active_index();
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Open another tab to load a French page on background.
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int french_index = active_index + 1;
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GURL french_url = ui_test_utils::GetTestUrl(
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      base::FilePath(), base::FilePath(FILE_PATH_LITERAL("french_page.html")));
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(browser(), french_url, french_index, false);
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(active_index, browser()->tab_strip_model()->active_index());
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Wait until the language is detected.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WebContents* web_contents =
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      browser()->tab_strip_model()->GetWebContentsAt(french_index);
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::Source<content::WebContents> source(web_contents);
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      LanguageDetectionDetails>
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  source);
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fr_language_detected_signal.Wait();
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The bubble is not shown because the tab is not activated.
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Close the French page tab immediately.
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::CloseWebContents(browser(), web_contents, false);
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(active_index, browser()->tab_strip_model()->active_index());
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_FALSE(TranslateBubbleView::IsShowing());
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Close the last tab.
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::CloseWebContents(browser(),
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           browser()->tab_strip_model()->GetActiveWebContents(),
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           false);
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
121