ui_test_utils.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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)#ifndef CHROME_TEST_BASE_UI_TEST_UTILS_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_TEST_BASE_UI_TEST_UTILS_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string16.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModalDialog; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModel; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationBar; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURLService; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NavigateParams; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopRunner; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHost; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A collections of functions designed for use with InProcessBrowserTest. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui_test_utils { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags to indicate what to wait for in a navigation test. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// They can be ORed together. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The order in which the waits happen when more than one is selected, is: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tab 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigation 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BrowserTestWaitFlags { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_NONE = 0, // Don't wait for anything. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_WAIT_FOR_BROWSER = 1 << 0, // Wait for a new browser. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_WAIT_FOR_TAB = 1 << 1, // Wait for a new tab. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_WAIT_FOR_NAVIGATION = 1 << 2, // Wait for navigation to finish. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_MASK = BROWSER_TEST_WAIT_FOR_BROWSER | 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_WAIT_FOR_TAB | 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BROWSER_TEST_WAIT_FOR_NAVIGATION 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Puts the current tab title in |title|. Returns true on success. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetCurrentTabTitle(const Browser* browser, string16* title); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens |url| in an incognito browser window with the incognito profile of 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |profile|, blocking until the navigation finishes. This will create a new 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser if a browser with the incognito profile does not exist. Returns the 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito window Browser. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* OpenURLOffTheRecord(Profile* profile, const GURL& url); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Performs the provided navigation process, blocking until the navigation 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finishes. May change the params in some cases (i.e. if the navigation 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// opens a new browser window). Uses chrome::Navigate. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(chrome::NavigateParams* params); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the selected tab of |browser| to |url|, blocking until the 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation finishes. Uses Browser::OpenURL --> chrome::Navigate. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(Browser* browser, const GURL& url); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the specified tab of |browser| to |url|, blocking until the 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation finishes. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |disposition| indicates what tab the navigation occurs in, and 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |browser_test_flags| controls what to wait for before continuing. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLWithDisposition(Browser* browser, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int browser_test_flags); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the selected tab of |browser| to |url|, blocking until the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number of navigations specified complete. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLBlockUntilNavigationsComplete(Browser* browser, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int number_of_navigations); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the file path for testing a particular test. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The file for the tests is all located in 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test_root_directory/dir/<file> 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The returned path is base::FilePath format. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestFilePath(const base::FilePath& dir, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& file); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the URL for testing a particular test. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTML for the tests is all located in 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test_root_directory/dir/<file> 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The returned path is GURL format. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetTestUrl(const base::FilePath& dir, const base::FilePath& file); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the path of the build directory, relative to the source root. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetRelativeBuildDirectory(base::FilePath* build_dir); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until an application modal dialog is showns and returns it. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppModalDialog* WaitForAppModalDialog(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Performs a find in the page of the specified tab. Returns the number of 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// matches found. |ordinal| is an optional parameter which is set to the index 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the current match. |selection_rect| is an optional parameter which is set 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the location of the current match. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FindInPage(content::WebContents* tab, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string16& search_string, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool forward, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool case_sensitive, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* ordinal, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* selection_rect); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Register |observer| for the given |type| and |source| and run 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the message loop until the observer posts a quit task. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RegisterAndWait(content::NotificationObserver* observer, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until |model| finishes loading. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForBookmarkModelToLoad(BookmarkModel* model); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitForBookmarkModelToLoad(Profile* profile); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until |service| finishes loading. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForTemplateURLServiceToLoad(TemplateURLService* service); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until the |history_service|'s history finishes loading. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForHistoryToLoad(HistoryService* history_service); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download the given file and waits for the download to complete. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadURL(Browser* browser, const GURL& download_url); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send the given text to the omnibox and wait until it's updated. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendToOmniboxAndSubmit(LocationBar* location_bar, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& input); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the first browser that is not in the specified set. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserNotInSet(std::set<Browser*> excluded_browsers); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A WindowedNotificationObserver hard-wired to observe 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome::NOTIFICATION_TAB_ADDED. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowedTabAddedNotificationObserver 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::WindowedNotificationObserver { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register to listen for notifications of NOTIFICATION_TAB_ADDED from either 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a specific source, or from all sources if |source| is 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NotificationService::AllSources(). 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit WindowedTabAddedNotificationObserver( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the added tab, or NULL if no notification was observed yet. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* GetTab() { return added_tab_; } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* added_tab_; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowedTabAddedNotificationObserver); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Similar to WindowedNotificationObserver but also provides a way of retrieving 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the details associated with the notification. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note that in order to use that class the details class should be copiable, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which is the case with most notifications. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class U> 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowedNotificationObserverWithDetails 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public content::WindowedNotificationObserver { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowedNotificationObserverWithDetails( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int notification_type, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WindowedNotificationObserver(notification_type, source) {} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills |details| with the details of the notification received for |source|. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetDetailsFor(uintptr_t source, U* details) { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename std::map<uintptr_t, U>::const_iterator iter = 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_.find(source); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iter == details_.end()) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *details = iter->second; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const U* details_ptr = content::Details<U>(details).ptr(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (details_ptr) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_[source.map_key()] = *details_ptr; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver::Observe(type, source, details); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<uintptr_t, U> details_; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowedNotificationObserverWithDetails); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Notification observer which waits for navigation events and blocks until 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a specific URL is loaded. The URL must be an exact match. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UrlLoadObserver : public content::WindowedNotificationObserver { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Register to listen for notifications of the given type from either a 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specific source, or from all sources if |source| is 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NotificationService::AllSources(). 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UrlLoadObserver(const GURL& url, const content::NotificationSource& source); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~UrlLoadObserver(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver: 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(UrlLoadObserver); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convenience class for waiting for a new browser to be created. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Like WindowedNotificationObserver, this class provides a safe, non-racey 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// way to wait for a new browser to be created. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserAddedObserver { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAddedObserver(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~BrowserAddedObserver(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for a new browser to be created, and return a pointer to it. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* WaitForSingleNewBrowser(); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver notification_observer_; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<Browser*> original_browsers_; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrowserAddedObserver); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Takes a snapshot of the given render widget, rendered at |page_size|. The 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// snapshot is set to |bitmap|. Returns true on success. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TakeRenderWidgetSnapshot(content::RenderWidgetHost* rwh, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& page_size, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap* bitmap) WARN_UNUSED_RESULT; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Takes a snapshot of the entire page, according to the width and height 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properties of the DOM's document. Returns true on success. DOMAutomation 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must be enabled. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TakeEntirePageSnapshot(content::RenderViewHost* rvh, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap* bitmap) WARN_UNUSED_RESULT; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves a snapshot of the entire screen to a file named 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromiumSnapshotYYYYMMDDHHMMSS.png to |directory|, returning true on success. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The path to the file produced is returned in |screenshot_path| if non-NULL. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDirectory(const base::FilePath& directory, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* screenshot_path); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves a snapshot of the entire screen as above to the current user's desktop. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Chrome path provider must be registered prior to calling this function. 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDesktop(base::FilePath* screenshot_path); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Configures the geolocation provider to always return the given position. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverrideGeolocation(double latitude, double longitude); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerates all history contents on the backend thread. Returns them in 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descending order by time. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryEnumerator { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit HistoryEnumerator(Profile* profile); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~HistoryEnumerator(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL>& urls() { return urls_; } 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void HistoryQueryComplete( 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& quit_task, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService::Handle request_handle, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history::QueryResults* results); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<GURL> urls_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumer consumer_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HistoryEnumerator); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui_test_utils 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_TEST_BASE_UI_TEST_UTILS_H_ 319