root/chrome/browser/translate/translate_browsertest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. infobar_service_
  2. SetUpOnMainThread
  3. SetUpCommandLine
  4. GetNonSecureURL
  5. GetSecureURL
  6. GetExistingTranslateInfoBarDelegate
  7. IN_PROC_BROWSER_TEST_F
  8. IN_PROC_BROWSER_TEST_F
  9. IN_PROC_BROWSER_TEST_F
  10. IN_PROC_BROWSER_TEST_F
  11. IN_PROC_BROWSER_TEST_F
  12. IN_PROC_BROWSER_TEST_F

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/infobars/infobar.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/translate/translate_infobar_delegate.h"
#include "chrome/browser/translate/translate_manager.h"
#include "chrome/browser/translate/translate_service.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/test_switches.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/translate/core/browser/translate_script.h"
#include "components/translate/core/common/translate_switches.h"
#include "content/public/browser/notification_service.h"
#include "content/public/test/browser_test_utils.h"
#include "net/http/http_status_code.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/spawned_test_server/spawned_test_server.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_fetcher_delegate.h"

namespace {

const base::FilePath::CharType kTranslateRoot[] =
    FILE_PATH_LITERAL("chrome/test/data/translate");
const char kNonSecurePrefix[] = "/translate/";
const char kSecurePrefix[] = "files/";
const char kFrenchTestPath[] = "fr_test.html";
const char kRefreshMetaTagTestPath[] = "refresh_meta_tag.html";
const char kRefreshMetaTagCaseInsensitiveTestPath[] =
    "refresh_meta_tag_casei.html";
const char kRefreshMetaTagAtOnloadTestPath[] =
    "refresh_meta_tag_at_onload.html";
const char kUpdateLocationTestPath[] = "update_location.html";
const char kUpdateLocationAtOnloadTestPath[] = "update_location_at_onload.html";
const char kMainScriptPath[] = "pseudo_main.js";
const char kElementMainScriptPath[] = "pseudo_element_main.js";

};  // namespace

class TranslateBrowserTest : public InProcessBrowserTest {
 public:
  TranslateBrowserTest()
      : https_server_(net::SpawnedTestServer::TYPE_HTTPS,
                      SSLOptions(SSLOptions::CERT_OK),
                      base::FilePath(kTranslateRoot)),
        infobar_service_(NULL) {}

  virtual void SetUpOnMainThread() OVERRIDE {
    TranslateService::SetUseInfobar(true);
  }

  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
    ASSERT_TRUE(https_server_.Start());
    // Setup alternate security origin for testing in order to allow XHR against
    // local test server. Note that this flag shows a confirm infobar in tests.
    GURL base_url = GetSecureURL("");
    command_line->AppendSwitchASCII(
        translate::switches::kTranslateSecurityOrigin,
        base_url.GetOrigin().spec());
  }

 protected:
  GURL GetNonSecureURL(const std::string& path) const {
    std::string prefix(kNonSecurePrefix);
    return embedded_test_server()->GetURL(prefix + path);
  }

  GURL GetSecureURL(const std::string& path) const {
    std::string prefix(kSecurePrefix);
    return https_server_.GetURL(prefix + path);
  }

  TranslateInfoBarDelegate* GetExistingTranslateInfoBarDelegate() {
    if (!infobar_service_) {
      content::WebContents* web_contents =
          browser()->tab_strip_model()->GetActiveWebContents();
      if (web_contents)
        infobar_service_ = InfoBarService::FromWebContents(web_contents);
    }
    if (!infobar_service_) {
      ADD_FAILURE() << "infobar service is not available";
      return NULL;
    }

    TranslateInfoBarDelegate* delegate = NULL;
    InfoBarManager* infobar_manager = infobar_service_->infobar_manager();
    for (size_t i = 0; i < infobar_manager->infobar_count(); ++i) {
      // Check if the shown infobar is a confirm infobar coming from the
      // |kTranslateSecurityOrigin| flag specified in SetUpCommandLine().
      // This infobar appears in all tests of TranslateBrowserTest and can be
      // ignored here.
      ConfirmInfoBarDelegate* confirm = infobar_manager->infobar_at(i)
          ->delegate()->AsConfirmInfoBarDelegate();
      if (confirm)
        continue;

      TranslateInfoBarDelegate* translate = infobar_manager->infobar_at(i)
          ->delegate()->AsTranslateInfoBarDelegate();
      if (translate) {
        EXPECT_FALSE(delegate) << "multiple infobars are shown unexpectedly";
        delegate = translate;
        continue;
      }

      // Other infobar should not be shown.
      EXPECT_TRUE(delegate);
    }
    return delegate;
  }

 private:
  net::SpawnedTestServer https_server_;
  InfoBarService* infobar_service_;

  typedef net::SpawnedTestServer::SSLOptions SSLOptions;

  DISALLOW_COPY_AND_ASSIGN(TranslateBrowserTest);
};

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, TranslateInIsolatedWorld) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  net::TestURLFetcherFactory factory;
  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup infobar observer.
  content::WindowedNotificationObserver infobar(
      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
      content::NotificationService::AllSources());

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit non-secure page which is going to be translated.
  ui_test_utils::NavigateToURL(browser(), GetNonSecureURL(kFrenchTestPath));

  // Wait for Chrome Translate infobar.
  infobar.Wait();

  // Perform Chrome Translate.
  translate = GetExistingTranslateInfoBarDelegate();
  ASSERT_TRUE(translate);
  translate->Translate();

  // Hook URLFetcher for element.js.
  GURL script1_url = GetSecureURL(kMainScriptPath);
  GURL script2_url = GetSecureURL(kElementMainScriptPath);
  std::string element_js = "main_script_url = '" + script1_url.spec() + "';\n";
  element_js += "element_main_script_url = '" + script2_url.spec() + "';\n";
  element_js +=
    "google = { 'translate' : { 'TranslateService' : function() { return {\n"
    "  isAvailable: function() {\n"
    "    cr.googleTranslate.onLoadJavascript(main_script_url);\n"
    "    return true;\n"
    "  },\n"
    "  translatePage: function(sl, tl, cb) {\n"
    "    cb(1, true);\n"
    "  }\n"
    "} } } };\n"
    "cr.googleTranslate.onTranslateElementLoad();\n";
  net::TestURLFetcher* fetcher =
      factory.GetFetcherByID(TranslateScript::kFetcherId);
  ASSERT_TRUE(fetcher);
  net::URLRequestStatus status;
  status.set_status(net::URLRequestStatus::SUCCESS);
  fetcher->set_status(status);
  fetcher->set_url(fetcher->GetOriginalURL());
  fetcher->set_response_code(net::HTTP_OK);
  fetcher->SetResponseString(element_js);
  fetcher->delegate()->OnURLFetchComplete(fetcher);

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
}

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, IgnoreRefreshMetaTag) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit a test page.
  ui_test_utils::NavigateToURL(
      browser(),
      GetNonSecureURL(kRefreshMetaTagTestPath));

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));

  // Check if there is no Translate infobar.
  translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);
}

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest,
                       IgnoreRefreshMetaTagInCaseInsensitive) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit a test page.
  ui_test_utils::NavigateToURL(
      browser(),
      GetNonSecureURL(kRefreshMetaTagCaseInsensitiveTestPath));

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));

  // Check if there is no Translate infobar.
  translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);
}

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, IgnoreRefreshMetaTagAtOnload) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit a test page.
  ui_test_utils::NavigateToURL(
      browser(),
      GetNonSecureURL(kRefreshMetaTagAtOnloadTestPath));

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));

  // Check if there is no Translate infobar.
  translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);
}

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, UpdateLocation) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit a test page.
  ui_test_utils::NavigateToURL(
      browser(),
      GetNonSecureURL(kUpdateLocationTestPath));

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));

  // Check if there is no Translate infobar.
  translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);
}

IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, UpdateLocationAtOnload) {
#if defined(OS_WIN) && defined(USE_ASH)
  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
    return;
#endif

  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());

  // Check if there is no Translate infobar.
  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);

  // Setup page title observer.
  content::WebContents* web_contents =
      browser()->tab_strip_model()->GetActiveWebContents();
  ASSERT_TRUE(web_contents);
  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));

  // Visit a test page.
  ui_test_utils::NavigateToURL(
      browser(),
      GetNonSecureURL(kUpdateLocationAtOnloadTestPath));

  // Wait for the page title is changed after the test finished.
  const base::string16 result = watcher.WaitAndGetTitle();
  EXPECT_EQ("PASS", base::UTF16ToASCII(result));

  // Check if there is no Translate infobar.
  translate = GetExistingTranslateInfoBarDelegate();
  EXPECT_FALSE(translate);
}

/* [<][>][^][v][top][bottom][index][help] */