1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_TEST_BASE_UI_TEST_UTILS_H_
6 #define CHROME_TEST_BASE_UI_TEST_UTILS_H_
14 #include "base/basictypes.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/strings/string16.h"
17 #include "chrome/browser/history/history_service.h"
18 #include "content/public/browser/notification_details.h"
19 #include "content/public/browser/notification_observer.h"
20 #include "content/public/browser/notification_registrar.h"
21 #include "content/public/browser/notification_source.h"
22 #include "content/public/test/test_utils.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24 #include "ui/base/window_open_disposition.h"
25 #include "ui/events/keycodes/keyboard_codes.h"
26 #include "ui/gfx/native_widget_types.h"
32 class TemplateURLService
;
43 struct NavigateParams
;
54 // A collections of functions designed for use with InProcessBrowserTest.
55 namespace ui_test_utils
{
57 // Flags to indicate what to wait for in a navigation test.
58 // They can be ORed together.
59 // The order in which the waits happen when more than one is selected, is:
63 enum BrowserTestWaitFlags
{
64 BROWSER_TEST_NONE
= 0, // Don't wait for anything.
65 BROWSER_TEST_WAIT_FOR_BROWSER
= 1 << 0, // Wait for a new browser.
66 BROWSER_TEST_WAIT_FOR_TAB
= 1 << 1, // Wait for a new tab.
67 BROWSER_TEST_WAIT_FOR_NAVIGATION
= 1 << 2, // Wait for navigation to finish.
69 BROWSER_TEST_MASK
= BROWSER_TEST_WAIT_FOR_BROWSER
|
70 BROWSER_TEST_WAIT_FOR_TAB
|
71 BROWSER_TEST_WAIT_FOR_NAVIGATION
74 // Puts the current tab title in |title|. Returns true on success.
75 bool GetCurrentTabTitle(const Browser
* browser
, base::string16
* title
);
77 // Opens |url| in an incognito browser window with the incognito profile of
78 // |profile|, blocking until the navigation finishes. This will create a new
79 // browser if a browser with the incognito profile does not exist. Returns the
80 // incognito window Browser.
81 Browser
* OpenURLOffTheRecord(Profile
* profile
, const GURL
& url
);
83 // Performs the provided navigation process, blocking until the navigation
84 // finishes. May change the params in some cases (i.e. if the navigation
85 // opens a new browser window). Uses chrome::Navigate.
86 void NavigateToURL(chrome::NavigateParams
* params
);
88 // Navigates the selected tab of |browser| to |url|, blocking until the
89 // navigation finishes. Simulates a POST and uses chrome::Navigate.
90 void NavigateToURLWithPost(Browser
* browser
, const GURL
& url
);
92 // Navigates the selected tab of |browser| to |url|, blocking until the
93 // navigation finishes. Uses Browser::OpenURL --> chrome::Navigate.
94 void NavigateToURL(Browser
* browser
, const GURL
& url
);
96 // Navigates the specified tab of |browser| to |url|, blocking until the
97 // navigation finishes.
98 // |disposition| indicates what tab the navigation occurs in, and
99 // |browser_test_flags| controls what to wait for before continuing.
100 void NavigateToURLWithDisposition(Browser
* browser
,
102 WindowOpenDisposition disposition
,
103 int browser_test_flags
);
105 // Navigates the selected tab of |browser| to |url|, blocking until the
106 // number of navigations specified complete.
107 void NavigateToURLBlockUntilNavigationsComplete(Browser
* browser
,
109 int number_of_navigations
);
111 // Navigates the specified tab (via |disposition|) of |browser| to |url|,
112 // blocking until the |number_of_navigations| specified complete.
113 // |disposition| indicates what tab the download occurs in, and
114 // |browser_test_flags| controls what to wait for before continuing.
115 void NavigateToURLWithDispositionBlockUntilNavigationsComplete(
118 int number_of_navigations
,
119 WindowOpenDisposition disposition
,
120 int browser_test_flags
);
122 // Generate the file path for testing a particular test.
123 // The file for the tests is all located in
124 // test_root_directory/dir/<file>
125 // The returned path is base::FilePath format.
126 base::FilePath
GetTestFilePath(const base::FilePath
& dir
,
127 const base::FilePath
& file
);
129 // Generate the URL for testing a particular test.
130 // HTML for the tests is all located in
131 // test_root_directory/dir/<file>
132 // The returned path is GURL format.
133 GURL
GetTestUrl(const base::FilePath
& dir
, const base::FilePath
& file
);
135 // Generate the path of the build directory, relative to the source root.
136 bool GetRelativeBuildDirectory(base::FilePath
* build_dir
);
138 // Blocks until an application modal dialog is showns and returns it.
139 app_modal::AppModalDialog
* WaitForAppModalDialog();
141 // Performs a find in the page of the specified tab. Returns the number of
142 // matches found. |ordinal| is an optional parameter which is set to the index
143 // of the current match. |selection_rect| is an optional parameter which is set
144 // to the location of the current match.
145 int FindInPage(content::WebContents
* tab
,
146 const base::string16
& search_string
,
150 gfx::Rect
* selection_rect
);
152 // Blocks until |service| finishes loading.
153 void WaitForTemplateURLServiceToLoad(TemplateURLService
* service
);
155 // Blocks until the |history_service|'s history finishes loading.
156 void WaitForHistoryToLoad(HistoryService
* history_service
);
158 // Download the given file and waits for the download to complete.
159 void DownloadURL(Browser
* browser
, const GURL
& download_url
);
161 // Send the given text to the omnibox and wait until it's updated.
162 void SendToOmniboxAndSubmit(LocationBar
* location_bar
,
163 const std::string
& input
);
165 // Gets the first browser that is not in the specified set.
166 Browser
* GetBrowserNotInSet(std::set
<Browser
*> excluded_browsers
);
168 // Gets the size and value of the cookie string for |url| in the given tab.
169 // Can be called from any thread.
170 void GetCookies(const GURL
& url
,
171 content::WebContents
* contents
,
175 // A WindowedNotificationObserver hard-wired to observe
176 // chrome::NOTIFICATION_TAB_ADDED.
177 class WindowedTabAddedNotificationObserver
178 : public content::WindowedNotificationObserver
{
180 // Register to listen for notifications of NOTIFICATION_TAB_ADDED from either
181 // a specific source, or from all sources if |source| is
182 // NotificationService::AllSources().
183 explicit WindowedTabAddedNotificationObserver(
184 const content::NotificationSource
& source
);
186 // Returns the added tab, or NULL if no notification was observed yet.
187 content::WebContents
* GetTab() { return added_tab_
; }
189 void Observe(int type
,
190 const content::NotificationSource
& source
,
191 const content::NotificationDetails
& details
) override
;
194 content::WebContents
* added_tab_
;
196 DISALLOW_COPY_AND_ASSIGN(WindowedTabAddedNotificationObserver
);
199 // Similar to WindowedNotificationObserver but also provides a way of retrieving
200 // the details associated with the notification.
201 // Note that in order to use that class the details class should be copiable,
202 // which is the case with most notifications.
204 class WindowedNotificationObserverWithDetails
205 : public content::WindowedNotificationObserver
{
207 WindowedNotificationObserverWithDetails(
208 int notification_type
,
209 const content::NotificationSource
& source
)
210 : content::WindowedNotificationObserver(notification_type
, source
) {}
212 // Fills |details| with the details of the notification received for |source|.
213 bool GetDetailsFor(uintptr_t source
, U
* details
) {
214 typename
std::map
<uintptr_t, U
>::const_iterator iter
=
215 details_
.find(source
);
216 if (iter
== details_
.end())
218 *details
= iter
->second
;
222 virtual void Observe(int type
,
223 const content::NotificationSource
& source
,
224 const content::NotificationDetails
& details
) override
{
225 const U
* details_ptr
= content::Details
<U
>(details
).ptr();
227 details_
[source
.map_key()] = *details_ptr
;
228 content::WindowedNotificationObserver::Observe(type
, source
, details
);
232 std::map
<uintptr_t, U
> details_
;
234 DISALLOW_COPY_AND_ASSIGN(WindowedNotificationObserverWithDetails
);
237 // Notification observer which waits for navigation events and blocks until
238 // a specific URL is loaded. The URL must be an exact match.
239 class UrlLoadObserver
: public content::WindowedNotificationObserver
{
241 // Register to listen for notifications of the given type from either a
242 // specific source, or from all sources if |source| is
243 // NotificationService::AllSources().
244 UrlLoadObserver(const GURL
& url
, const content::NotificationSource
& source
);
245 ~UrlLoadObserver() override
;
247 // content::NotificationObserver:
248 void Observe(int type
,
249 const content::NotificationSource
& source
,
250 const content::NotificationDetails
& details
) override
;
255 DISALLOW_COPY_AND_ASSIGN(UrlLoadObserver
);
258 // Convenience class for waiting for a new browser to be created.
259 // Like WindowedNotificationObserver, this class provides a safe, non-racey
260 // way to wait for a new browser to be created.
261 class BrowserAddedObserver
{
263 BrowserAddedObserver();
264 ~BrowserAddedObserver();
266 // Wait for a new browser to be created, and return a pointer to it.
267 Browser
* WaitForSingleNewBrowser();
270 content::WindowedNotificationObserver notification_observer_
;
271 std::set
<Browser
*> original_browsers_
;
273 DISALLOW_COPY_AND_ASSIGN(BrowserAddedObserver
);
276 // Configures the geolocation provider to always return the given position.
277 void OverrideGeolocation(double latitude
, double longitude
);
279 // Enumerates all history contents on the backend thread. Returns them in
280 // descending order by time.
281 class HistoryEnumerator
{
283 explicit HistoryEnumerator(Profile
* profile
);
284 ~HistoryEnumerator();
286 std::vector
<GURL
>& urls() { return urls_
; }
289 void HistoryQueryComplete(
290 const base::Closure
& quit_task
,
291 history::QueryResults
* results
);
293 std::vector
<GURL
> urls_
;
295 base::CancelableTaskTracker tracker_
;
297 DISALLOW_COPY_AND_ASSIGN(HistoryEnumerator
);
300 } // namespace ui_test_utils
302 #endif // CHROME_TEST_BASE_UI_TEST_UTILS_H_