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