ui_test_utils.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_reader.h"
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/ref_counted.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/stringprintf.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/test_timeouts.h"
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_controller.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_list.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_notification_details.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_tab_helper.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/test/base/find_in_page_observer.h"
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/dom_operation_notification_details.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_item.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_manager.h"
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "content/public/browser/geolocation_provider.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_controller.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/geoposition.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h"
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h"
71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/cookies/cookie_constants.h"
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/cookies/cookie_monster.h"
73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/cookies/cookie_store.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/test/python_utils.h"
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/url_request/url_request_context.h"
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "net/url_request/url_request_context_getter.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/snapshot/test/snapshot_desktop.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h"
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::DomOperationNotificationDetails;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NativeWebKeyboardEvent;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderWidgetHost;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui_test_utils {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSnapshotBaseName[] = "ChromiumSnapshot";
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kSnapshotExtension[] = ".png";
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetSnapshotFileName(const base::FilePath& snapshot_directory) {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time::Exploded the_time;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time::Now().LocalExplode(&the_time);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string filename(base::StringPrintf("%s%04d%02d%02d%02d%02d%02d%s",
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kSnapshotBaseName, the_time.year, the_time.month, the_time.day_of_month,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      the_time.hour, the_time.minute, the_time.second, kSnapshotExtension));
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath snapshot_file = snapshot_directory.AppendASCII(filename);
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (base::PathExists(snapshot_file)) {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int index = 0;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string suffix;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath trial_file;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    do {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      suffix = base::StringPrintf(" (%d)", ++index);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      trial_file = snapshot_file.InsertBeforeExtensionASCII(suffix);
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    } while (base::PathExists(trial_file));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    snapshot_file = trial_file;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return snapshot_file;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // defined(OS_WIN)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Browser* WaitForBrowserNotInSet(std::set<Browser*> excluded_browsers) {
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Browser* new_browser = GetBrowserNotInSet(excluded_browsers);
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (new_browser == NULL) {
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    BrowserAddedObserver observer;
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    new_browser = observer.WaitForSingleNewBrowser();
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // The new browser should never be in |excluded_browsers|.
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    DCHECK(!ContainsKey(excluded_browsers, new_browser));
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return new_browser;
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool GetCurrentTabTitle(const Browser* browser, base::string16* title) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntry* last_entry = web_contents->GetController().GetActiveEntry();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!last_entry)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  title->assign(last_entry->GetTitleForDisplay(std::string()));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* OpenURLOffTheRecord(Profile* profile, const GURL& url) {
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::HostDesktopType active_desktop = chrome::GetActiveDesktop();
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::OpenURLOffTheRecord(profile, url, active_desktop);
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = chrome::FindTabbedBrowser(
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      profile->GetOffTheRecordProfile(), false, active_desktop);
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  content::TestNavigationObserver observer(
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents());
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  observer.Wait();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(chrome::NavigateParams* params) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(params);
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::WaitForLoadStop(params->target_contents);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NavigateToURLWithPost(Browser* browser, const GURL& url) {
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::NavigateParams params(browser, url,
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_FORM_SUBMIT);
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  params.uses_post = true;
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  NavigateToURL(&params);
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(Browser* browser, const GURL& url) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDisposition(browser, url, CURRENT_TAB,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               BROWSER_TEST_WAIT_FOR_NAVIGATION);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the specified tab (via |disposition|) of |browser| to |url|,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// blocking until the |number_of_navigations| specified complete.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |disposition| indicates what tab the download occurs in, and
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |browser_test_flags| controls what to wait for before continuing.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void NavigateToURLWithDispositionBlockUntilNavigationsComplete(
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int number_of_navigations,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowOpenDisposition disposition,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int browser_test_flags) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabStripModel* tab_strip = browser->tab_strip_model();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (disposition == CURRENT_TAB && tab_strip->GetActiveWebContents())
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WaitForLoadStop(tab_strip->GetActiveWebContents());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestNavigationObserver same_tab_observer(
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      tab_strip->GetActiveWebContents(),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number_of_navigations);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<Browser*> initial_browsers;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next())
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    initial_browsers.insert(*it);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver tab_added_observer(
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->OpenURL(OpenURLParams(
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      url, Referrer(), disposition, ui::PAGE_TRANSITION_TYPED, false));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_test_flags & BROWSER_TEST_WAIT_FOR_BROWSER)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser = WaitForBrowserNotInSet(initial_browsers);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_test_flags & BROWSER_TEST_WAIT_FOR_TAB)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tab_added_observer.Wait();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!(browser_test_flags & BROWSER_TEST_WAIT_FOR_NAVIGATION)) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Some other flag caused the wait prior to this.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* web_contents = NULL;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disposition == NEW_BACKGROUND_TAB) {
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We've opened up a new tab, but not selected it.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TabStripModel* tab_strip = browser->tab_strip_model();
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = tab_strip->GetWebContentsAt(tab_strip->active_index() + 1);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(web_contents != NULL)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << " Unable to wait for navigation to \"" << url.spec()
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "\" because the new tab is not available yet";
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!web_contents)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if ((disposition == CURRENT_TAB) ||
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (disposition == NEW_FOREGROUND_TAB) ||
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (disposition == SINGLETON_TAB)) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The currently selected tab is the right one.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = browser->tab_strip_model()->GetActiveWebContents();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (disposition == CURRENT_TAB) {
2344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    same_tab_observer.Wait();
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (web_contents) {
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    content::TestNavigationObserver observer(web_contents,
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                             number_of_navigations);
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    observer.Wait();
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(NULL != web_contents) << " Unable to wait for navigation to \""
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    << url.spec() << "\""
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    << " because we can't get the tab contents";
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLWithDisposition(Browser* browser,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const GURL& url,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  WindowOpenDisposition disposition,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int browser_test_flags) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDispositionBlockUntilNavigationsComplete(
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      disposition,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_test_flags);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLBlockUntilNavigationsComplete(Browser* browser,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const GURL& url,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int number_of_navigations) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateToURLWithDispositionBlockUntilNavigationsComplete(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      number_of_navigations,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CURRENT_TAB,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BROWSER_TEST_WAIT_FOR_NAVIGATION);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestFilePath(const base::FilePath& dir,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& file) {
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(chrome::DIR_TEST_DATA, &path);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return path.Append(dir).Append(file);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetTestUrl(const base::FilePath& dir, const base::FilePath& file) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::FilePathToFileURL(GetTestFilePath(dir, file));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetRelativeBuildDirectory(base::FilePath* build_dir) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is used to find the build directory so TestServer can serve
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // built files (nexes, etc).  TestServer expects a path relative to the source
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // root.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath exe_dir =
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CommandLine::ForCurrentProcess()->GetProgram().DirName();
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath src_dir;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!PathService::Get(base::DIR_SOURCE_ROOT, &src_dir))
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must first generate absolute paths to SRC and EXE and from there
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // generate a relative path.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!exe_dir.IsAbsolute())
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    exe_dir = base::MakeAbsoluteFilePath(exe_dir);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!src_dir.IsAbsolute())
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    src_dir = base::MakeAbsoluteFilePath(src_dir);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!exe_dir.IsAbsolute())
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!src_dir.IsAbsolute())
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t match, exe_size, src_size;
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<base::FilePath::StringType> src_parts, exe_parts;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine point at which src and exe diverge.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exe_dir.GetComponents(&exe_parts);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  src_dir.GetComponents(&src_parts);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exe_size = exe_parts.size();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  src_size = src_parts.size();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (match = 0; match < exe_size && match < src_size; ++match) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (exe_parts[match] != src_parts[match])
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a relative path.
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *build_dir = base::FilePath();
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t tmp_itr = match; tmp_itr < src_size; ++tmp_itr)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *build_dir = build_dir->Append(FILE_PATH_LITERAL(".."));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; match < exe_size; ++match)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *build_dir = build_dir->Append(exe_parts[match]);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppModalDialog* WaitForAppModalDialog() {
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (dialog_queue->HasActiveDialog())
327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return dialog_queue->active_dialog();
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content::Source<AppModalDialog>(observer.source()).ptr();
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int FindInPage(WebContents* tab,
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const base::string16& search_string,
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               bool forward,
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               bool match_case,
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               int* ordinal,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               gfx::Rect* selection_rect) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(tab);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  find_tab_helper->StartFinding(search_string, forward, match_case);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FindInPageNotificationObserver observer(tab);
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  observer.Wait();
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ordinal)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ordinal = observer.active_match_ordinal();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selection_rect)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *selection_rect = observer.selection_rect();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return observer.number_of_matches();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForTemplateURLServiceToLoad(TemplateURLService* service) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (service->loaded())
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> message_loop_runner =
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      new content::MessageLoopRunner;
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TemplateURLService::Subscription> subscription =
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      service->RegisterOnLoadedCallback(
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          message_loop_runner->QuitClosure());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->Load();
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  message_loop_runner->Run();
363a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(service->loaded());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForHistoryToLoad(HistoryService* history_service) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver history_loaded_observer(
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_HISTORY_LOADED,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!history_service->BackendLoaded())
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history_loaded_observer.Wait();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadURL(Browser* browser, const GURL& download_url) {
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir downloads_directory;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(downloads_directory.CreateUniqueTempDir());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser->profile()->GetPrefs()->SetFilePath(
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kDownloadDefaultDirectory, downloads_directory.path());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadManager* download_manager =
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser->profile());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content::DownloadTestObserver> observer(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content::DownloadTestObserverTerminal(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_manager, 1,
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser, download_url);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer->WaitForFinished();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendToOmniboxAndSubmit(LocationBar* location_bar,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& input) {
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  OmniboxView* omnibox = location_bar->GetOmniboxView();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  omnibox->model()->OnSetFocus(false);
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  omnibox->SetUserText(base::ASCIIToUTF16(input));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  location_bar->AcceptInput();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!omnibox->model()->autocomplete_controller()->done()) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserNotInSet(std::set<Browser*> excluded_browsers) {
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (excluded_browsers.find(*it) == excluded_browsers.end())
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return *it;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
414e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace {
415e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
416e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GetCookiesCallback(base::WaitableEvent* event,
417e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        std::string* cookies,
418e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                        const std::string& cookie_line) {
419e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  *cookies = cookie_line;
420e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  event->Signal();
421e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
422e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GetCookiesOnIOThread(
424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const GURL& url,
425e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    const scoped_refptr<net::URLRequestContextGetter>& context_getter,
426e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    base::WaitableEvent* event,
427e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    std::string* cookies) {
428e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  context_getter->GetURLRequestContext()->cookie_store()->
429e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      GetCookiesWithOptionsAsync(
430e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          url, net::CookieOptions(),
431e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch          base::Bind(&GetCookiesCallback, event, cookies));
432e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
433e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
434e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}  // namespace
435e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GetCookies(const GURL& url,
437e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                WebContents* contents,
438e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                int* value_size,
439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                std::string* value) {
440e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  *value_size = -1;
441e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (url.is_valid() && contents) {
442e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_refptr<net::URLRequestContextGetter> context_getter =
443e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        contents->GetBrowserContext()->GetRequestContextForRenderProcess(
444e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch            contents->GetRenderProcessHost()->GetID());
445e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    base::WaitableEvent event(true /* manual reset */,
446e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                              false /* not initially signaled */);
447e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    CHECK(content::BrowserThread::PostTask(
448e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        content::BrowserThread::IO, FROM_HERE,
449e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        base::Bind(&GetCookiesOnIOThread, url, context_getter, &event, value)));
450e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    event.Wait();
451e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
452e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    *value_size = static_cast<int>(value->size());
453e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
454e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
455e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WindowedTabAddedNotificationObserver::WindowedTabAddedNotificationObserver(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WindowedNotificationObserver(chrome::NOTIFICATION_TAB_ADDED, source),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      added_tab_(NULL) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WindowedTabAddedNotificationObserver::Observe(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  added_tab_ = content::Details<WebContents>(details).ptr();
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver::Observe(type, source, details);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UrlLoadObserver::UrlLoadObserver(const GURL& url,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const content::NotificationSource& source)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WindowedNotificationObserver(content::NOTIFICATION_LOAD_STOP, source),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_(url) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UrlLoadObserver::~UrlLoadObserver() {}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UrlLoadObserver::Observe(
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationController* controller =
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(source).ptr();
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (controller->GetWebContents()->GetURL() != url_)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowedNotificationObserver::Observe(type, source, details);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAddedObserver::BrowserAddedObserver()
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : notification_observer_(
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          chrome::NOTIFICATION_BROWSER_OPENED,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::NotificationService::AllSources()) {
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done(); it.Next())
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    original_browsers_.insert(*it);
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAddedObserver::~BrowserAddedObserver() {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* BrowserAddedObserver::WaitForSingleNewBrowser() {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notification_observer_.Wait();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that only a single new browser has appeared.
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(original_browsers_.size() + 1, chrome::GetTotalBrowserCount());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetBrowserNotInSet(original_browsers_);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDirectory(const base::FilePath& directory,
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::FilePath* screenshot_path) {
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool succeeded = false;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath out_path(GetSnapshotFileName(directory));
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MONITORINFO monitor_info = {};
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  monitor_info.cbSize = sizeof(monitor_info);
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HMONITOR main_monitor = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY);
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetMonitorInfo(main_monitor, &monitor_info)) {
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RECT& rect = monitor_info.rcMonitor;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<unsigned char> png_data;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect bounds(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size(rect.right - rect.left, rect.bottom - rect.top));
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (ui::GrabDesktopSnapshot(bounds, &png_data) &&
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        png_data.size() <= INT_MAX) {
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int bytes = static_cast<int>(png_data.size());
527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      int written = base::WriteFile(
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          out_path, reinterpret_cast<char*>(&png_data[0]), bytes);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      succeeded = (written == bytes);
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (succeeded && screenshot_path != NULL)
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *screenshot_path = out_path;
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return succeeded;
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDesktop(base::FilePath* screenshot_path) {
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath desktop;
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return PathService::Get(base::DIR_USER_DESKTOP, &desktop) &&
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SaveScreenSnapshotToDirectory(desktop, screenshot_path);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_WIN)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverrideGeolocation(double latitude, double longitude) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::Geoposition position;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.latitude = latitude;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.longitude = longitude;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.altitude = 0.;
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.accuracy = 0.;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  position.timestamp = base::Time::Now();
555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::GeolocationProvider::GetInstance()->OverrideLocationForTesting(
556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      position);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryEnumerator::HistoryEnumerator(Profile* profile) {
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> message_loop_runner =
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content::MessageLoopRunner;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryService* hs = HistoryServiceFactory::GetForProfile(
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile, Profile::EXPLICIT_ACCESS);
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  hs->QueryHistory(base::string16(),
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   history::QueryOptions(),
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::Bind(&HistoryEnumerator::HistoryQueryComplete,
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              base::Unretained(this),
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              message_loop_runner->QuitClosure()),
570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   &tracker_);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_loop_runner->Run();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HistoryEnumerator::~HistoryEnumerator() {}
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HistoryEnumerator::HistoryQueryComplete(
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::Closure& quit_task,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    history::QueryResults* results) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < results->size(); ++i)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    urls_.push_back((*results)[i].url());
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  quit_task.Run();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui_test_utils
585