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