12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/search/instant_test_utils.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search_engines/template_url_service_factory.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/search/search_tab_helper.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/variations/entropy_provider.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/result_codes.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string WrapScript(const std::string& script) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return "domAutomationController.send(" + script + ")"; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// InstantTestBase ----------------------------------------------------------- 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InstantTestBase::InstantTestBase() 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : https_test_server_( 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::SpawnedTestServer::TYPE_HTTPS, 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::BaseTestServer::SSLOptions(), 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))), 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) init_suggestions_url_(false) { 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)InstantTestBase::~InstantTestBase() {} 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantTestBase::SetupInstant(Browser* browser) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_ = browser; 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLService* service = 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLServiceFactory::GetForProfile(browser_->profile()); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::WaitForTemplateURLServiceToLoad(service); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLData data; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Necessary to use exact URL for both the main URL and the alternate URL for 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // search term extraction to work in InstantExtended. 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.short_name = base::ASCIIToUTF16("name"); 595e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) data.SetURL(instant_url_.spec() + 605e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) "q={searchTerms}&is_search&{google:omniboxStartMarginParameter}"); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.instant_url = instant_url_.spec(); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.new_tab_url = ntp_url_.spec(); 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (init_suggestions_url_) 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) data.suggestions_url = instant_url_.spec() + "#q={searchTerms}"; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.alternate_urls.push_back(instant_url_.spec() + "#q={searchTerms}"); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.search_terms_replacement_key = "strk"; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* template_url = new TemplateURL(data); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->Add(template_url); // Takes ownership of |template_url|. 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu service->SetUserSelectedDefaultSearchProvider(template_url); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantTestBase::SetInstantURL(const std::string& url) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLService* service = 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLServiceFactory::GetForProfile(browser_->profile()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::WaitForTemplateURLServiceToLoad(service); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TemplateURLData data; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.short_name = base::ASCIIToUTF16("name"); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.SetURL(url); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) data.instant_url = url; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TemplateURL* template_url = new TemplateURL(data); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) service->Add(template_url); // Takes ownership of |template_url|. 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu service->SetUserSelectedDefaultSearchProvider(template_url); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void InstantTestBase::Init(const GURL& instant_url, 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& ntp_url, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool init_suggestions_url) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instant_url_ = instant_url; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ntp_url_ = ntp_url; 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) init_suggestions_url_ = init_suggestions_url; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantTestBase::FocusOmnibox() { 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // If the omnibox already has focus, just notify SearchTabHelper. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (omnibox()->model()->has_focus()) { 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::WebContents* active_tab = 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) browser_->tab_strip_model()->GetActiveWebContents(); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SearchTabHelper::FromWebContents(active_tab)->OmniboxFocusChanged( 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_EXPLICIT); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_->window()->GetLocationBar()->FocusLocation(false); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstantTestBase::SetOmniboxText(const std::string& text) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FocusOmnibox(); 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox()->SetUserText(base::UTF8ToUTF16(text)); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void InstantTestBase::PressEnterAndWaitForNavigation() { 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::WindowedNotificationObserver nav_observer( 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::NOTIFICATION_NAV_ENTRY_COMMITTED, 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::NotificationService::AllSources()); 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) browser_->window()->GetLocationBar()->AcceptInput(); 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) nav_observer.Wait(); 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void InstantTestBase::PressEnterAndWaitForFrameLoad() { 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::WindowedNotificationObserver nav_observer( 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::NotificationService::AllSources()); 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) browser_->window()->GetLocationBar()->AcceptInput(); 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) nav_observer.Wait(); 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantTestBase::GetBoolFromJS(content::WebContents* contents, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& script, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* result) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return content::ExecuteScriptAndExtractBool( 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents, WrapScript(script), result); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantTestBase::GetIntFromJS(content::WebContents* contents, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& script, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* result) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return content::ExecuteScriptAndExtractInt( 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents, WrapScript(script), result); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantTestBase::GetStringFromJS(content::WebContents* contents, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& script, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* result) { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return content::ExecuteScriptAndExtractString( 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents, WrapScript(script), result); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantTestBase::CheckVisibilityIs(content::WebContents* contents, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expected) { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool actual = !expected; // Purposely start with a mis-match. 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We can only use ASSERT_*() in a method that returns void, hence this 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // convoluted check. 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GetBoolFromJS(contents, "!document.hidden", &actual) && 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) actual == expected; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochstd::string InstantTestBase::GetOmniboxText() { 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF16ToUTF8(omnibox()->GetText()); 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool InstantTestBase::LoadImage(content::RenderViewHost* rvh, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& image, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* loaded) { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string js_chrome = 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var img = document.createElement('img');" 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "img.onerror = function() { domAutomationController.send(false); };" 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "img.onload = function() { domAutomationController.send(true); };" 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "img.src = '" + image + "';"; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return content::ExecuteScriptAndExtractBool(rvh, js_chrome, loaded); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 InstantTestBase::GetBlueText() { 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t start = 0, end = 0; 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) omnibox()->GetSelectionBounds(&start, &end); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (start > end) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::swap(start, end); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return omnibox()->GetText().substr(start, end - start); 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 181