1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This implements a browser-side endpoint for UI automation activity. 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The client-side endpoint is implemented by AutomationProxy. 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The entire lifetime of this object should be contained within that of 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the BrowserProcess, and in particular the NotificationService that's 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// hung off of it. 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_H_ 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_H_ 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map> 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/compiler_specific.h" 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h" 233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/observer_list.h" 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string16.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autofill/field_types.h" 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/common/automation_constants.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/content_settings.h" 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h" 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h" 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_channel.h" 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/native_widget_types.h" 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/events/event.h" 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // defined(OS_WIN) 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PopupMenuWaiter; 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass TabContents; 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenstruct AutomationMsg_Find_Params; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct Reposition_Params; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct ExternalTabSettings; 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace IPC { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ChannelProxy; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutofillProfile; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationAutocompleteEditTracker; 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationBrowserTracker; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationExtensionTracker; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationResourceMessageFilter; 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationTabTracker; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationWindowTracker; 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Browser; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CreditCard; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DictionaryValue; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass DownloadItem; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Extension; 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionPortContainer; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionTestResultNotificationObserver; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExternalTabContainer; 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass FilePath; 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass InitialLoadObserver; 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass ListValue; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginHandler; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MetricEventDurationObserver; 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass NavigationController; 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationControllerRestoredObserver; 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass Profile; 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass RenderViewHost; 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TabContents; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct AutocompleteMatchData; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gfx { 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Point; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass AutomationProvider 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : public IPC::Channel::Listener, 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public IPC::Message::Sender, 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public base::SupportsWeakPtr<AutomationProvider>, 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public base::RefCountedThreadSafe<AutomationProvider, 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen BrowserThread::DeleteOnUIThread> { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit AutomationProvider(Profile* profile); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile() const { return profile_; } 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Initializes a channel for a connection to an AutomationProxy. 92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If channel_id starts with kNamedInterfacePrefix, it will act 93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // as a server, create a named IPC socket with channel_id as its 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // path, and will listen on the socket for incoming connections. 95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // If channel_id does not, it will act as a client and establish 96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // a connection on its primary IPC channel. See ipc/ipc_channel_posix.cc 97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // for more information about kPrimaryIPCChannel. 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool InitializeChannel(const std::string& channel_id) WARN_UNUSED_RESULT; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the number of tabs that we expect; when this number of tabs has 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // loaded, an AutomationMsg_InitialLoadsComplete message is sent. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetExpectedTabCount(size_t expected_tabs); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Called when the inital set of tabs has finished loading. 105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Call SetExpectedTabCount(0) to set this to true immediately. 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnInitialTabLoadsComplete(); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the ChromeOS network library has finished its first update. 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnNetworkLibraryInit(); 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the index of a particular NavigationController object 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in the given parent window. This method uses 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TabStrip::GetIndexForNavigationController to get the index. 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int GetIndexForNavigationController(const NavigationController* controller, 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Browser* parent) const; 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add or remove a non-owning reference to a tab's LoginHandler. This is for 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // when a login prompt is shown for HTTP/FTP authentication. 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(mpcomplete): The login handling is a fairly special purpose feature. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Eventually we'll probably want ways to interact with the ChromeView of the 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // login window in a generic manner, such that it can be used for anything, 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // not just logins. 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddLoginHandler(NavigationController* tab, LoginHandler* handler); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveLoginHandler(NavigationController* tab); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IPC implementations 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool Send(IPC::Message* msg); 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual void OnChannelConnected(int pid); 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual bool OnMessageReceived(const IPC::Message& msg); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnChannelError(); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message_release() { 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message = reply_message_; 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reply_message_ = NULL; 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return reply_message; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds the extension passed in to the extension tracker, and returns 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the associated handle. If the tracker already contains the extension, 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the handle is simply returned. 141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int AddExtension(const Extension* extension); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds the external tab passed in to the tab tracker. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool AddExternalTab(ExternalTabContainer* external_tab); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Get the DictionaryValue equivalent for a download item. Caller owns the 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // DictionaryValue. 1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DictionaryValue* GetDictionaryFromDownloadItem(const DownloadItem* download); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen friend class DeleteTask<AutomationProvider>; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~AutomationProvider(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Helper function to find the browser window that contains a given 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // NavigationController and activate that tab. 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Returns the Browser if found. 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Browser* FindAndActivateTab(NavigationController* contents); 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Convert a tab handle into a TabContents. If |tab| is non-NULL a pointer 1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // to the tab is also returned. Returns NULL in case of failure or if the tab 1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // is not of the TabContents type. 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TabContents* GetTabContentsForHandle(int handle, NavigationController** tab); 1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Returns the protocol version which typically is the module version. 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch virtual std::string GetProtocolVersion(); 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns the associated view for the tab handle passed in. 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Returns NULL on failure. 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch RenderViewHost* GetViewForTab(int tab_handle); 1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called on IPC message deserialization failure. Prints an error message 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // and closes the IPC channel. 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen void OnMessageDeserializationFailure(); 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<AutomationAutocompleteEditTracker> autocomplete_edit_tracker_; 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<AutomationBrowserTracker> browser_tracker_; 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<InitialLoadObserver> initial_load_observer_; 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<MetricEventDurationObserver> metric_event_duration_observer_; 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<NavigationControllerRestoredObserver> restore_tracker_; 1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<AutomationTabTracker> tab_tracker_; 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scoped_ptr<AutomationWindowTracker> window_tracker_; 1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick typedef std::map<NavigationController*, LoginHandler*> LoginHandlerMap; 1873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LoginHandlerMap login_handler_map_; 1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Profile* profile_; 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // A pointer to reply message used when we do asynchronous processing in the 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // message handler. 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(phajdan.jr): Remove |reply_message_|, it is error-prone. 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IPC::Message* reply_message_; 1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Consumer for asynchronous history queries. 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CancelableRequestConsumer consumer_; 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Sends a find request for a given query. 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SendFindRequest( 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TabContents* tab_contents, 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool with_json, 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& search_string, 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool forward, 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool match_case, 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool find_next, 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IPC::Message* reply_message); 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<AutomationResourceMessageFilter> 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick automation_resource_message_filter_; 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // True iff we should open a new automation IPC channel if it closes. 213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool reinitialize_on_channel_error_; 214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnUnhandledMessage(); 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Clear and reinitialize the automation IPC channel. 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool ReinitializeChannel(); 220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // IPC Message callbacks. 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void WindowSimulateDrag(int handle, 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::vector<gfx::Point>& drag_path, 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int flags, 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool press_escape_en_route, 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleUnused(const IPC::Message& message, int handle); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetFilteredInet(const IPC::Message& message, bool enabled); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetFilteredInetHitCount(int* hit_count); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetProxyConfig(const std::string& new_proxy_config); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Responds to the FindInPage request, retrieves the search query parameters, 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // launches an observer to listen for results and issues a StartFind request. 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleFindRequest(int handle, 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const AutomationMsg_Find_Params& params, 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnSetPageFontSize(int tab_handle, int font_size); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See browsing_data_remover.h for explanation of bitmap fields. 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void RemoveBrowsingData(int remove_mask); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Notify the JavaScript engine in the render to change its parameters 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // while performing stress testing. See 24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // |ViewHostMsg_JavaScriptStressTestControl_Commands| in render_messages.h 24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // for information on the arguments. 24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void JavaScriptStressTestControl(int handle, int cmd, int param); 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InstallExtension(const FilePath& crx_path, 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void WaitForExtensionTestResult(IPC::Message* reply_message); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void InstallExtensionAndGetHandle(const FilePath& crx_path, 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool with_ui, 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void UninstallExtension(int extension_handle, 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* success); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ReloadExtension(int extension_handle, 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void EnableExtension(int extension_handle, 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void DisableExtension(int extension_handle, 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* success); 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ExecuteExtensionActionInActiveTabAsync(int extension_handle, 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int browser_handle, 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message* reply_message); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void MoveExtensionBrowserAction(int extension_handle, int index, 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* success); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetExtensionProperty(int extension_handle, 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationMsg_ExtensionProperty type, 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* success, 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string* value); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Asynchronous request for printing the current tab. 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void PrintAsync(int tab_handle); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Uses the specified encoding to override the encoding of the page in the 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // specified tab. 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OverrideEncoding(int tab_handle, 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& encoding_name, 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* success); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Selects all contents on the page. 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SelectAll(int tab_handle); 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Edit operations on the page. 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Cut(int tab_handle); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Copy(int tab_handle); 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Paste(int tab_handle); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ReloadAsync(int tab_handle); 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StopAsync(int tab_handle); 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SaveAsAsync(int tab_handle); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the extension for the given handle. Returns NULL if there is 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // no extension for the handle. 305513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* GetExtension(int extension_handle); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the extension for the given handle, if the handle is valid and 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the associated extension is enabled. Returns NULL otherwise. 309513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* GetEnabledExtension(int extension_handle); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the extension for the given handle, if the handle is valid and 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the associated extension is disabled. Returns NULL otherwise. 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* GetDisabledExtension(int extension_handle); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Method called by the popup menu tracker when a popup menu is opened. 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NotifyPopupMenuOpened(); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The functions in this block are for use with external tabs, so they are 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Windows only. 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The container of an externally hosted tab calls this to reflect any 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // accelerator keys that it did not process. This gives the tab a chance 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to handle the keys 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ProcessUnhandledAccelerator(const IPC::Message& message, int handle, 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const MSG& msg); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetInitialFocus(const IPC::Message& message, int handle, bool reverse, 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool restore_focus_to_view); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnTabReposition(int tab_handle, 33221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const Reposition_Params& params); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnForwardContextMenuCommandToChrome(int tab_handle, int command); 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void CreateExternalTab(const ExternalTabSettings& settings, 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow* tab_container_window, 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow* tab_window, 339513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int* tab_handle, 340513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int* session_id); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ConnectExternalTab(uint64 cookie, 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool allow, 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow parent_window, 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow* tab_container_window, 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow* tab_window, 347513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int* tab_handle, 348513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int* session_id); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NavigateInExternalTab( 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int handle, const GURL& url, const GURL& referrer, 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AutomationMsg_NavigationResponseValues* status); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void NavigateExternalTabAtIndex( 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int handle, int index, AutomationMsg_NavigationResponseValues* status); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Handler for a message sent by the automation client. 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnMessageFromExternalHost(int handle, const std::string& message, 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& origin, 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& target); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnBrowserMoved(int handle); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnRunUnloadHandlers(int handle, IPC::Message* reply_message); 3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void OnSetZoomLevel(int handle, int zoom_level); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalTabContainer* GetExternalTabForHandle(int handle); 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // defined(OS_WIN) 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<IPC::ChannelProxy> channel_; 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<NotificationObserver> new_tab_ui_load_observer_; 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<NotificationObserver> find_in_page_observer_; 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ExtensionTestResultNotificationObserver> 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch extension_test_result_observer_; 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<AutomationExtensionTracker> extension_tracker_; 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // True iff connected to an AutomationProxy. 378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch bool is_connected_; 379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // True iff browser finished loading initial set of tabs. 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool initial_tab_loads_complete_; 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // True iff the Chrome OS network library finished initialization. 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool network_library_initialized_; 385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 386dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // ID of automation channel. 387dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string channel_id_; 388dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(AutomationProvider); 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_H_ 393