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"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/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 "testing/gtest/include/gtest/gtest.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h"
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModalDialog;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationBar;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURLService;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FilePath;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NavigateParams;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopRunner;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHost;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A collections of functions designed for use with InProcessBrowserTest.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui_test_utils {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flags to indicate what to wait for in a navigation test.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// They can be ORed together.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The order in which the waits happen when more than one is selected, is:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    Browser
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    Tab
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//    Navigation
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum BrowserTestWaitFlags {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BROWSER_TEST_NONE = 0,                      // Don't wait for anything.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BROWSER_TEST_WAIT_FOR_BROWSER = 1 << 0,     // Wait for a new browser.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BROWSER_TEST_WAIT_FOR_TAB = 1 << 1,         // Wait for a new tab.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BROWSER_TEST_WAIT_FOR_NAVIGATION = 1 << 2,  // Wait for navigation to finish.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BROWSER_TEST_MASK = BROWSER_TEST_WAIT_FOR_BROWSER |
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      BROWSER_TEST_WAIT_FOR_TAB |
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      BROWSER_TEST_WAIT_FOR_NAVIGATION
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Puts the current tab title in |title|. Returns true on success.
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool GetCurrentTabTitle(const Browser* browser, base::string16* title);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Opens |url| in an incognito browser window with the incognito profile of
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |profile|, blocking until the navigation finishes. This will create a new
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser if a browser with the incognito profile does not exist. Returns the
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito window Browser.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* OpenURLOffTheRecord(Profile* profile, const GURL& url);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Performs the provided navigation process, blocking until the navigation
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finishes. May change the params in some cases (i.e. if the navigation
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// opens a new browser window). Uses chrome::Navigate.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(chrome::NavigateParams* params);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the selected tab of |browser| to |url|, blocking until the
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// navigation finishes. Simulates a POST and uses chrome::Navigate.
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void NavigateToURLWithPost(Browser* browser, const GURL& url);
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Navigates the selected tab of |browser| to |url|, blocking until the
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation finishes. Uses Browser::OpenURL --> chrome::Navigate.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURL(Browser* browser, const GURL& url);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the specified tab of |browser| to |url|, blocking until the
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation finishes.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |disposition| indicates what tab the navigation occurs in, and
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |browser_test_flags| controls what to wait for before continuing.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLWithDisposition(Browser* browser,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const GURL& url,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  WindowOpenDisposition disposition,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int browser_test_flags);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Navigates the selected tab of |browser| to |url|, blocking until the
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number of navigations specified complete.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NavigateToURLBlockUntilNavigationsComplete(Browser* browser,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const GURL& url,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int number_of_navigations);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the file path for testing a particular test.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The file for the tests is all located in
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test_root_directory/dir/<file>
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The returned path is base::FilePath format.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath GetTestFilePath(const base::FilePath& dir,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const base::FilePath& file);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the URL for testing a particular test.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HTML for the tests is all located in
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// test_root_directory/dir/<file>
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The returned path is GURL format.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL GetTestUrl(const base::FilePath& dir, const base::FilePath& file);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Generate the path of the build directory, relative to the source root.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetRelativeBuildDirectory(base::FilePath* build_dir);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until an application modal dialog is showns and returns it.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AppModalDialog* WaitForAppModalDialog();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Performs a find in the page of the specified tab. Returns the number of
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// matches found.  |ordinal| is an optional parameter which is set to the index
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the current match. |selection_rect| is an optional parameter which is set
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to the location of the current match.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int FindInPage(content::WebContents* tab,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const base::string16& search_string,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool forward,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               bool case_sensitive,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int* ordinal,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               gfx::Rect* selection_rect);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until |service| finishes loading.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForTemplateURLServiceToLoad(TemplateURLService* service);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Blocks until the |history_service|'s history finishes loading.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WaitForHistoryToLoad(HistoryService* history_service);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Download the given file and waits for the download to complete.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DownloadURL(Browser* browser, const GURL& download_url);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Send the given text to the omnibox and wait until it's updated.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SendToOmniboxAndSubmit(LocationBar* location_bar,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& input);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the first browser that is not in the specified set.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* GetBrowserNotInSet(std::set<Browser*> excluded_browsers);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Gets the size and value of the cookie string for |url| in the given tab.
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Can be called from any thread.
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid GetCookies(const GURL& url,
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                content::WebContents* contents,
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                int* value_size,
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                std::string* value);
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
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 entire page, according to the width and height
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properties of the DOM's document. Returns true on success. DOMAutomation
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// must be enabled.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TakeEntirePageSnapshot(content::RenderViewHost* rvh,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            SkBitmap* bitmap) WARN_UNUSED_RESULT;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves a snapshot of the entire screen to a file named
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChromiumSnapshotYYYYMMDDHHMMSS.png to |directory|, returning true on success.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The path to the file produced is returned in |screenshot_path| if non-NULL.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDirectory(const base::FilePath& directory,
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   base::FilePath* screenshot_path);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saves a snapshot of the entire screen as above to the current user's desktop.
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Chrome path provider must be registered prior to calling this function.
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool SaveScreenSnapshotToDesktop(base::FilePath* screenshot_path);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Configures the geolocation provider to always return the given position.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverrideGeolocation(double latitude, double longitude);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerates all history contents on the backend thread. Returns them in
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// descending order by time.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryEnumerator {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit HistoryEnumerator(Profile* profile);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~HistoryEnumerator();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL>& urls() { return urls_; }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void HistoryQueryComplete(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::Closure& quit_task,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      history::QueryResults* results);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<GURL> urls_;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::CancelableTaskTracker tracker_;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HistoryEnumerator);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui_test_utils
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_TEST_BASE_UI_TEST_UTILS_H_
312