// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_TEST_AUTOMATION_TAB_PROXY_H_ #define CHROME_TEST_AUTOMATION_TAB_PROXY_H_ #include "build/build_config.h" // NOLINT #if defined(OS_WIN) #include <wtypes.h> // NOLINT #endif #include <string> #include <vector> #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" #include "chrome/common/automation_constants.h" #include "chrome/test/automation/automation_handle_tracker.h" #include "content/public/browser/save_page_type.h" #include "content/public/common/page_type.h" #include "content/public/common/security_style.h" #include "net/cert/cert_status_flags.h" #include "ui/base/window_open_disposition.h" #include "ui/events/keycodes/keyboard_codes.h" class BrowserProxy; class GURL; namespace IPC { class Message; } namespace base { class FilePath; class Value; } class TabProxy : public AutomationResourceProxy { public: class TabProxyDelegate { public: virtual bool OnMessageReceived(TabProxy* tab, const IPC::Message& msg) { return false; } virtual void OnChannelError(TabProxy* tab) {} protected: virtual ~TabProxyDelegate() {} }; TabProxy(AutomationMessageSender* sender, AutomationHandleTracker* tracker, int handle); // Gets the current url of the tab. bool GetCurrentURL(GURL* url) const WARN_UNUSED_RESULT; // Gets the title of the tab. bool GetTabTitle(std::wstring* title) const WARN_UNUSED_RESULT; // Gets the tabstrip index of the tab. bool GetTabIndex(int* index) const WARN_UNUSED_RESULT; // Executes a javascript in a frame's context whose xpath is provided as the // first parameter and extract the values from the resulting json string. // Examples: // jscript = "window.domAutomationController.send('string');" // will result in value = "string" // jscript = "window.domAutomationController.send(24);" // will result in value = 24 // NOTE: If this is called from a ui test, |dom_automation_enabled_| must be // set to true for these functions to work. bool ExecuteAndExtractString(const std::wstring& frame_xpath, const std::wstring& jscript, std::wstring* value) WARN_UNUSED_RESULT; bool ExecuteAndExtractBool(const std::wstring& frame_xpath, const std::wstring& jscript, bool* value) WARN_UNUSED_RESULT; bool ExecuteAndExtractInt(const std::wstring& frame_xpath, const std::wstring& jscript, int* value) WARN_UNUSED_RESULT; // Navigates to a url. This method accepts the same kinds of URL input that // can be passed to Chrome on the command line. This is a synchronous call and // hence blocks until the navigation completes. AutomationMsg_NavigationResponseValues NavigateToURL( const GURL& url) WARN_UNUSED_RESULT; // Navigates to a url. This method accepts the same kinds of URL input that // can be passed to Chrome on the command line. This is a synchronous call and // hence blocks until the |number_of_navigations| navigations complete. AutomationMsg_NavigationResponseValues NavigateToURLBlockUntilNavigationsComplete( const GURL& url, int number_of_navigations) WARN_UNUSED_RESULT; // Navigates to a url. This is an asynchronous version of NavigateToURL. // The function returns immediately after sending the LoadURL notification // to the browser. // TODO(vibhor): Add a callback if needed in future. // TODO(mpcomplete): If the navigation results in an auth challenge, the // TabProxy we attach won't know about it. See bug 666730. bool NavigateToURLAsync(const GURL& url) WARN_UNUSED_RESULT; // Equivalent to hitting the Back button. This is a synchronous call and // hence blocks until the navigation completes. AutomationMsg_NavigationResponseValues GoBack() WARN_UNUSED_RESULT; // Equivalent to hitting the Back button. This is a synchronous call and // hence blocks until the |number_of_navigations| navigations complete. AutomationMsg_NavigationResponseValues GoBackBlockUntilNavigationsComplete( int number_of_navigations) WARN_UNUSED_RESULT; // Equivalent to hitting the Forward button. This is a synchronous call and // hence blocks until the navigation completes. AutomationMsg_NavigationResponseValues GoForward() WARN_UNUSED_RESULT; // Equivalent to hitting the Forward button. This is a synchronous call and // hence blocks until the |number_of_navigations| navigations complete. AutomationMsg_NavigationResponseValues GoForwardBlockUntilNavigationsComplete( int number_of_navigations) WARN_UNUSED_RESULT; // Equivalent to hitting the Reload button. This is a synchronous call and // hence blocks until the navigation completes. AutomationMsg_NavigationResponseValues Reload() WARN_UNUSED_RESULT; // Closes the tab. This is synchronous, but does NOT block until the tab has // closed, rather it blocks until the browser has initiated the close. Use // Close(true) if you need to block until tab completely closes. // // Note that this proxy is invalid after this call. bool Close() WARN_UNUSED_RESULT; // Variant of close that allows you to specify whether you want to block // until the tab has completely closed (wait_until_closed == true) or block // until the browser has initiated the close (wait_until_closed = false). // // When a tab is closed the browser does additional work via invoke later // and may wait for messages from the renderer. Supplying a value of true to // this method waits until all processing is done. Be careful with this, // when closing the last tab it is possible for the browser to shutdown BEFORE // the tab has completely closed. In other words, this may NOT be sent for // the last tab. bool Close(bool wait_until_closed) WARN_UNUSED_RESULT; // Starts a search within the current tab. The parameter |search_string| // specifies what string to search for, |forward| specifies whether to search // in forward direction, and |match_case| specifies case sensitivity // (true=case sensitive). |find_next| specifies whether this is a new search // or a continuation of the old one. |ordinal| is an optional parameter that // returns the ordinal of the active match (also known as "the 7" part of // "7 of 9"). A return value of -1 indicates failure. int FindInPage(const std::wstring& search_string, FindInPageDirection forward, FindInPageCase match_case, bool find_next, int* ordinal); bool GetCookies(const GURL& url, std::string* cookies) WARN_UNUSED_RESULT; bool GetCookieByName(const GURL& url, const std::string& name, std::string* cookies) WARN_UNUSED_RESULT; #if defined(OS_WIN) // The functions in this block are for external tabs, hence Windows only. // The container of an externally hosted tab calls this to reflect any // accelerator keys that it did not process. This gives the tab a chance // to handle the keys bool ProcessUnhandledAccelerator(const MSG& msg) WARN_UNUSED_RESULT; // Ask the tab to set focus to either the first or last element on the page. // When the restore_focus_to_view parameter is true, the render view // associated with the current tab is informed that it is receiving focus. // For external tabs only. bool SetInitialFocus(bool reverse, bool restore_focus_to_view) WARN_UNUSED_RESULT; // Navigates to a url in an externally hosted tab. // This method accepts the same kinds of URL input that // can be passed to Chrome on the command line. This is a synchronous call and // hence blocks until the navigation completes. AutomationMsg_NavigationResponseValues NavigateInExternalTab( const GURL& url, const GURL& referrer) WARN_UNUSED_RESULT; AutomationMsg_NavigationResponseValues NavigateExternalTabAtIndex( int index) WARN_UNUSED_RESULT; // Posts a message to the external tab. void HandleMessageFromExternalHost(const std::string& message, const std::string& origin, const std::string& target); #endif // defined(OS_WIN) // Sends off an asynchronous request for printing. bool PrintAsync() WARN_UNUSED_RESULT; // Waits until the infobar count is |count|. // Returns true on success. bool WaitForInfoBarCount(size_t count) WARN_UNUSED_RESULT; // Uses the specified encoding to override encoding of the page in the tab. bool OverrideEncoding(const std::string& encoding) WARN_UNUSED_RESULT; #if defined(OS_WIN) // Resizes the tab window. // The parent_window parameter allows a parent to be specified for the window // passed in. void Reposition(HWND window, HWND window_insert_after, int left, int top, int width, int height, int flags, HWND parent_window); // Sends the selected context menu command to the chrome instance void SendContextMenuCommand(int selected_command); // To be called when the window hosting the tab has moved. void OnHostMoved(); #endif // defined(OS_WIN) // Selects all contents on the page. void SelectAll(); // Edit operations on the page. void Cut(); void Copy(); void Paste(); // These handlers issue asynchronous Reload, Stop and SaveAs notifications to // the chrome instance. void ReloadAsync(); void StopAsync(); void SaveAsAsync(); // Notify the JavaScript engine in the render to change its parameters // while performing stress testing. See // |ViewHostMsg_JavaScriptStressTestControl_Commands| in render_messages.h // for information on the arguments. void JavaScriptStressTestControl(int cmd, int param); // Calls delegates void AddObserver(TabProxyDelegate* observer); void RemoveObserver(TabProxyDelegate* observer); bool OnMessageReceived(const IPC::Message& message); void OnChannelError(); protected: virtual ~TabProxy(); // Called when tracking the first object. Used for reference counting // purposes. void FirstObjectAdded(); // Called when no longer tracking any objects. Used for reference counting // purposes. void LastObjectRemoved(); // Caller takes ownership over returned value. Returns NULL on failure. base::Value* ExecuteAndExtractValue( const std::wstring& frame_xpath, const std::wstring& jscript) WARN_UNUSED_RESULT; private: base::Lock list_lock_; // Protects the observers_list_. ObserverList<TabProxyDelegate> observers_list_; DISALLOW_COPY_AND_ASSIGN(TabProxy); }; #endif // CHROME_TEST_AUTOMATION_TAB_PROXY_H_