translate_browsertest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/command_line.h"
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/translate/translate_infobar_delegate.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/translate/translate_service.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/test_switches.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "components/translate/core/browser/translate_manager.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/browser/translate_script.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/translate_switches.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/notification_service.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/http/http_status_code.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
26b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/test_url_fetcher_factory.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const base::FilePath::CharType kTranslateRoot[] =
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data/translate");
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kNonSecurePrefix[] = "/translate/";
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kSecurePrefix[] = "files/";
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kFrenchTestPath[] = "fr_test.html";
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kRefreshMetaTagTestPath[] = "refresh_meta_tag.html";
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kRefreshMetaTagCaseInsensitiveTestPath[] =
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    "refresh_meta_tag_casei.html";
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kRefreshMetaTagAtOnloadTestPath[] =
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    "refresh_meta_tag_at_onload.html";
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kUpdateLocationTestPath[] = "update_location.html";
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kUpdateLocationAtOnloadTestPath[] = "update_location_at_onload.html";
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kMainScriptPath[] = "pseudo_main.js";
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kElementMainScriptPath[] = "pseudo_element_main.js";
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};  // namespace
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TranslateBrowserTest : public InProcessBrowserTest {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TranslateBrowserTest()
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : https_server_(net::SpawnedTestServer::TYPE_HTTPS,
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      SSLOptions(SSLOptions::CERT_OK),
543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                      base::FilePath(kTranslateRoot)),
553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        infobar_service_(NULL) {}
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    TranslateService::SetUseInfobar(true);
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
613240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(https_server_.Start());
633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // Setup alternate security origin for testing in order to allow XHR against
643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    // local test server. Note that this flag shows a confirm infobar in tests.
653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    GURL base_url = GetSecureURL("");
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    command_line->AppendSwitchASCII(
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        translate::switches::kTranslateSecurityOrigin,
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base_url.GetOrigin().spec());
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL GetNonSecureURL(const std::string& path) const {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string prefix(kNonSecurePrefix);
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return embedded_test_server()->GetURL(prefix + path);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL GetSecureURL(const std::string& path) const {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string prefix(kSecurePrefix);
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return https_server_.GetURL(prefix + path);
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* GetExistingTranslateInfoBarDelegate() {
833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!infobar_service_) {
843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      content::WebContents* web_contents =
853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch          browser()->tab_strip_model()->GetActiveWebContents();
863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      if (web_contents)
873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        infobar_service_ = InfoBarService::FromWebContents(web_contents);
883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!infobar_service_) {
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ADD_FAILURE() << "infobar service is not available";
913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      return NULL;
923240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
933240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
943240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    TranslateInfoBarDelegate* delegate = NULL;
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    for (size_t i = 0; i < infobar_service_->infobar_count(); ++i) {
963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // Check if the shown infobar is a confirm infobar coming from the
973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // |kTranslateSecurityOrigin| flag specified in SetUpCommandLine().
983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // This infobar appears in all tests of TranslateBrowserTest and can be
993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // ignored here.
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (infobar_service_->infobar_at(i)->delegate()->
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              AsConfirmInfoBarDelegate()) {
1023240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        continue;
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      }
1043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      TranslateInfoBarDelegate* translate =
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          infobar_service_->infobar_at(i)->delegate()->
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              AsTranslateInfoBarDelegate();
1083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      if (translate) {
1093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        EXPECT_FALSE(delegate) << "multiple infobars are shown unexpectedly";
1103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        delegate = translate;
1113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch        continue;
1123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      }
1133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      // Other infobar should not be shown.
1153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      EXPECT_TRUE(delegate);
1163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    }
1173240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    return delegate;
1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  }
1193240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_server_;
1223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  InfoBarService* infobar_service_;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef net::SpawnedTestServer::SSLOptions SSLOptions;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TranslateBrowserTest);
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochIN_PROC_BROWSER_TEST_F(TranslateBrowserTest, TranslateInIsolatedWorld) {
130558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
131558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
133558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
134558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
135558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  net::TestURLFetcherFactory factory;
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
1403240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
1413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Setup infobar observer.
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WindowedNotificationObserver infobar(
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Setup page title observer.
1493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  content::WebContents* web_contents =
1503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
1513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  ASSERT_TRUE(web_contents);
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Visit non-secure page which is going to be translated.
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GetNonSecureURL(kFrenchTestPath));
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wait for Chrome Translate infobar.
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  infobar.Wait();
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Perform Chrome Translate.
1623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(translate);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  translate->Translate();
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Hook URLFetcher for element.js.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL script1_url = GetSecureURL(kMainScriptPath);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL script2_url = GetSecureURL(kElementMainScriptPath);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string element_js = "main_script_url = '" + script1_url.spec() + "';\n";
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  element_js += "element_main_script_url = '" + script2_url.spec() + "';\n";
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  element_js +=
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "google = { 'translate' : { 'TranslateService' : function() { return {\n"
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "  isAvailable: function() {\n"
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "    cr.googleTranslate.onLoadJavascript(main_script_url);\n"
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "    return true;\n"
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "  },\n"
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "  translatePage: function(sl, tl, cb) {\n"
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "    cb(1, true);\n"
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "  }\n"
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "} } } };\n"
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "cr.googleTranslate.onTranslateElementLoad();\n";
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  net::TestURLFetcher* fetcher =
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      factory.GetFetcherByID(TranslateScript::kFetcherId);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(fetcher);
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::URLRequestStatus status;
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  status.set_status(net::URLRequestStatus::SUCCESS);
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fetcher->set_status(status);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fetcher->set_url(fetcher->GetOriginalURL());
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fetcher->set_response_code(net::HTTP_OK);
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fetcher->SetResponseString(element_js);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fetcher->delegate()->OnURLFetchComplete(fetcher);
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, IgnoreRefreshMetaTag) {
199558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
202558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
204558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
2093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
2103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
2113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Setup page title observer.
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents =
21390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
21490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(web_contents);
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
21790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Visit a test page.
21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(
22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser(),
22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNonSecureURL(kRefreshMetaTagTestPath));
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
2293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBrowserTest,
23390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       IgnoreRefreshMetaTagInCaseInsensitive) {
234558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
235558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
237558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2423240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
2443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
2453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
2463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Setup page title observer.
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents =
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(web_contents);
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Visit a test page.
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(
25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser(),
25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNonSecureURL(kRefreshMetaTagCaseInsensitiveTestPath));
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
2643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, IgnoreRefreshMetaTagAtOnload) {
268558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
274eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2763240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2773240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
2783240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
2793240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
2803240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Setup page title observer.
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents =
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(web_contents);
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Visit a test page.
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser(),
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNonSecureURL(kRefreshMetaTagAtOnloadTestPath));
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
294a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2963240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
2973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
2983240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, UpdateLocation) {
302558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
304a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
306558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
307558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
3113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
3123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
3133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
3143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Setup page title observer.
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents =
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(web_contents);
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Visit a test page.
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser(),
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNonSecureURL(kUpdateLocationTestPath));
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3303240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
3313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
3323240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TranslateBrowserTest, UpdateLocationAtOnload) {
336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
338a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
339558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
3453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  TranslateInfoBarDelegate* translate = GetExistingTranslateInfoBarDelegate();
3463240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
3473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
3483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Setup page title observer.
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::WebContents* web_contents =
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(web_contents);
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TitleWatcher watcher(web_contents, base::ASCIIToUTF16("PASS"));
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  watcher.AlsoWaitForTitle(base::ASCIIToUTF16("FAIL"));
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Visit a test page.
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      browser(),
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GetNonSecureURL(kUpdateLocationAtOnloadTestPath));
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Wait for the page title is changed after the test finished.
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 result = watcher.WaitAndGetTitle();
362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("PASS", base::UTF16ToASCII(result));
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  // Check if there is no Translate infobar.
3653240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  translate = GetExistingTranslateInfoBarDelegate();
3663240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch  EXPECT_FALSE(translate);
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
368