172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian 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#ifndef CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <deque>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string>
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <vector>
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/compiler_specific.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h"
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/automation/automation_provider_json.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/automation/automation_tab_helper.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/bookmarks/bookmark_model_observer.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browsing_data_remover.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS)
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/network_library.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // defined(OS_CHROMEOS)
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_item.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/download/download_manager.h"
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/history/history.h"
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/history/history_types.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/importer_data_types.h"
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/importer_progress_observer.h"
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/password_manager/password_store_consumer.h"
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_model_observer.h"
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/automation_constants.h"
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/common/extensions/extension_constants.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cancelable_request.h"
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/size.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutocompleteEditModel;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProvider;
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass BalloonCollection;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Browser;
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Extension;
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionProcessManager;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationController;
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass RenderViewHost;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SavePackage;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TranslateInfoBarDelegate;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace history {
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass TopSites;
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace IPC {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Message;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass InitialLoadObserver : public NotificationObserver {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InitialLoadObserver(size_t tab_count, AutomationProvider* automation);
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~InitialLoadObserver();
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Caller owns the return value and is responsible for deleting it.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Example return value:
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // {'tabs': [{'start_time_ms': 1, 'stop_time_ms': 2.5},
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //           {'start_time_ms': 0.5, 'stop_time_ms': 3}]}
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // stop_time_ms values may be null if WaitForInitialLoads has not finished.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Only includes entries for the |tab_count| tabs we are monitoring.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There is no defined ordering of the return value.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* GetTimingInformation() const;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class TabTime;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<uintptr_t, TabTime> TabTimeMap;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::set<uintptr_t> TabSet;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ConditionMet();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t outstanding_tab_count_;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks init_time_;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabTimeMap loading_tabs_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabSet finished_tabs_;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(InitialLoadObserver);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS)
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Watches for NetworkManager events. Because NetworkLibrary loads
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// asynchronously, this is used to make sure it is done before tests are run.
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass NetworkManagerInitObserver
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : public chromeos::NetworkLibrary::NetworkManagerObserver {
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit NetworkManagerInitObserver(AutomationProvider* automation);
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~NetworkManagerInitObserver();
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual bool Init();
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj);
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(NetworkManagerInitObserver);
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // defined(OS_CHROMEOS)
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Watches for NewTabUI page loads for performance timing purposes.
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NewTabUILoadObserver : public NotificationObserver {
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit NewTabUILoadObserver(AutomationProvider* automation);
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~NewTabUILoadObserver();
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NewTabUILoadObserver);
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationControllerRestoredObserver : public NotificationObserver {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationControllerRestoredObserver(AutomationProvider* automation,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       NavigationController* controller,
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       IPC::Message* reply_message);
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~NavigationControllerRestoredObserver();
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool FinishedRestoring();
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SendDone();
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationController* controller_;
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NavigationControllerRestoredObserver);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass NavigationNotificationObserver : public NotificationObserver {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationNotificationObserver(NavigationController* controller,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 AutomationProvider* automation,
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 IPC::Message* reply_message,
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int number_of_navigations,
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 bool include_current_navigation,
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                 bool use_json_interface);
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~NavigationNotificationObserver();
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ConditionMet(AutomationMsg_NavigationResponseValues navigation_result);
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationController* controller_;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int navigations_remaining_;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool navigation_started_;
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool use_json_interface_;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(NavigationNotificationObserver);
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabStripNotificationObserver : public NotificationObserver {
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripNotificationObserver(NotificationType notification,
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               AutomationProvider* automation);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~TabStripNotificationObserver();
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ObserveTab(NavigationController* controller) = 0;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationType notification_;
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabAppendedNotificationObserver : public TabStripNotificationObserver {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabAppendedNotificationObserver(Browser* parent,
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  AutomationProvider* automation,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  IPC::Message* reply_message);
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TabAppendedNotificationObserver();
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ObserveTab(NavigationController* controller);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* parent_;
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TabAppendedNotificationObserver);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabClosedNotificationObserver : public TabStripNotificationObserver {
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabClosedNotificationObserver(AutomationProvider* automation,
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                bool wait_until_closed,
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                IPC::Message* reply_message);
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TabClosedNotificationObserver();
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ObserveTab(NavigationController* controller);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_for_browser_command(bool for_browser_command);
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool for_browser_command_;
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(TabClosedNotificationObserver);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Notifies when the tab count reaches the target number.
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TabCountChangeObserver : public TabStripModelObserver {
2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TabCountChangeObserver(AutomationProvider* automation,
2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         Browser* browser,
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         IPC::Message* reply_message,
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         int target_tab_count);
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Implementation of TabStripModelObserver.
246201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void TabInsertedAt(TabContentsWrapper* contents,
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             int index,
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                             bool foreground);
249201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void TabDetachedAt(TabContentsWrapper* contents, int index);
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void TabStripModelDeleted();
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TabCountChangeObserver();
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Checks if the current tab count matches our target, and if so,
2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // sends the reply message and deletes self.
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void CheckTabCount();
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TabStripModel* tab_strip_model_;
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const int target_tab_count_;
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(TabCountChangeObserver);
2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Observes when an extension has finished installing or possible install
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// errors. This does not guarantee that the extension is ready for use.
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionInstallNotificationObserver : public NotificationObserver {
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionInstallNotificationObserver(AutomationProvider* automation,
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       int id,
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       IPC::Message* reply_message);
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~ExtensionInstallNotificationObserver();
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of NotificationObserver.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Send |response| back to the provider's client.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SendResponse(AutomationMsg_ExtensionResponseValues response);
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int id_;
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallNotificationObserver);
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Observes when an extension has been uninstalled.
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionUninstallObserver : public NotificationObserver {
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionUninstallObserver(AutomationProvider* automation,
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             IPC::Message* reply_message,
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const std::string& id);
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ExtensionUninstallObserver();
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Implementation of NotificationObserver.
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details);
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationRegistrar registrar_;
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string id_;
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallObserver);
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Observes when an extension has finished loading and is ready for use. Also
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// checks for possible install errors.
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionReadyNotificationObserver : public NotificationObserver {
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionReadyNotificationObserver(ExtensionProcessManager* manager,
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     AutomationProvider* automation,
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     int id,
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     IPC::Message* reply_message);
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~ExtensionReadyNotificationObserver();
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of NotificationObserver.
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionProcessManager* manager_;
33572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int id_;
33772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
338513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_;
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionReadyNotificationObserver);
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionUnloadNotificationObserver : public NotificationObserver {
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionUnloadNotificationObserver();
34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~ExtensionUnloadNotificationObserver();
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of NotificationObserver.
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool did_receive_unload_notification() {
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return did_receive_unload_notification_;
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool did_receive_unload_notification_;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionUnloadNotificationObserver);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Observes when the extensions have been fully updated.  The ExtensionUpdater
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// service provides notifications for each extension that gets updated, but
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// it does not wait for the updated extensions to be installed or loaded.  This
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// observer waits until all updated extensions have actually been loaded.
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ExtensionsUpdatedObserver : public NotificationObserver {
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionsUpdatedObserver(ExtensionProcessManager* manager,
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            AutomationProvider* automation,
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            IPC::Message* reply_message);
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ExtensionsUpdatedObserver();
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Implementation of NotificationObserver.
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details);
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationRegistrar registrar_;
382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ExtensionProcessManager* manager_;
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::set<std::string> in_progress_updates_;
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool updater_finished_;
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ExtensionsUpdatedObserver);
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionTestResultNotificationObserver : public NotificationObserver {
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ExtensionTestResultNotificationObserver(
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* automation);
39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~ExtensionTestResultNotificationObserver();
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implementation of NotificationObserver.
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sends a test result back to the provider's client, if there is a pending
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // provider message and there is a result in the queue.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MaybeSendResult();
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
40872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Two queues containing the test results. Although typically only
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one result will be in each queue, there are cases where a queue is
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // needed.
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // For example, perhaps two events occur asynchronously and their
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // order of completion is not guaranteed. If the test wants to make sure
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // both finish before continuing, a queue is needed. The test would then
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // need to wait twice.
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::deque<bool> results_;
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::deque<std::string> messages_;
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionTestResultNotificationObserver);
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Observes when a new browser has been opened and a tab within it has stopped
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// loading.
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserOpenedNotificationObserver : public NotificationObserver {
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserOpenedNotificationObserver(AutomationProvider* automation,
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    IPC::Message* reply_message);
42872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~BrowserOpenedNotificationObserver();
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_for_browser_command(bool for_browser_command);
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int new_window_id_;
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool for_browser_command_;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BrowserOpenedNotificationObserver);
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserClosedNotificationObserver : public NotificationObserver {
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserClosedNotificationObserver(Browser* browser,
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    AutomationProvider* automation,
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    IPC::Message* reply_message);
45172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~BrowserClosedNotificationObserver();
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_for_browser_command(bool for_browser_command);
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
46172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
46272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool for_browser_command_;
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BrowserClosedNotificationObserver);
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserCountChangeNotificationObserver : public NotificationObserver {
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserCountChangeNotificationObserver(int target_count,
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         AutomationProvider* automation,
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         IPC::Message* reply_message);
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~BrowserCountChangeNotificationObserver();
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int target_count_;
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
48272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(BrowserCountChangeNotificationObserver);
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AppModalDialogShownObserver : public NotificationObserver {
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialogShownObserver(AutomationProvider* automation,
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              IPC::Message* reply_message);
49272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AppModalDialogShownObserver();
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
50072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
50172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AppModalDialogShownObserver);
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExecuteBrowserCommandObserver : public NotificationObserver {
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~ExecuteBrowserCommandObserver();
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool CreateAndRegisterObserver(AutomationProvider* automation,
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        Browser* browser,
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        int command,
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        IPC::Message* reply_message);
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExecuteBrowserCommandObserver(AutomationProvider* automation,
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                IPC::Message* reply_message);
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Register(int command);
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetNotificationType(int command, NotificationType::Type* type);
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationType::Type notification_type_;
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExecuteBrowserCommandObserver);
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FindInPageNotificationObserver : public NotificationObserver {
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageNotificationObserver(AutomationProvider* automation,
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 TabContents* parent_tab,
539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 bool reply_with_json,
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 IPC::Message* reply_message);
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~FindInPageNotificationObserver();
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The Find mechanism is over asynchronous IPC, so a search is kicked off and
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we wait for notification to find out what the results are. As the user is
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // typing, new search requests can be issued and the Request ID helps us make
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // sense of whether this is the current request or an old one. The unit tests,
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // however, which uses this constant issues only one search at a time, so we
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // don't need a rolling id to identify each search. But, we still need to
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // specify one, so we just use a fixed one - its value does not matter.
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kFindInPageRequestId;
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
55872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We will at some point (before final update) be notified of the ordinal and
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we need to preserve it so we can send it later.
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int active_match_ordinal_;
562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Send reply using json automation interface.
563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool reply_with_json_;
56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(FindInPageNotificationObserver);
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DomOperationObserver : public NotificationObserver {
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
5714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DomOperationObserver();
57272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~DomOperationObserver();
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void OnDomOperationCompleted(const std::string& json) = 0;
5794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
5824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DomOperationObserver);
5844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
5854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
586ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Sends a message back to the automation client with the results of the DOM
587ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// operation.
5884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass DomOperationMessageSender : public DomOperationObserver {
5894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
590ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  explicit DomOperationMessageSender(AutomationProvider* automation,
591ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     IPC::Message* relpy_message,
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool use_json_interface);
59372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~DomOperationMessageSender();
5944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void OnDomOperationCompleted(const std::string& json);
5964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
5974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
59872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
599ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
600ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool use_json_interface_;
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(DomOperationMessageSender);
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass DocumentPrintedNotificationObserver : public NotificationObserver {
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DocumentPrintedNotificationObserver(AutomationProvider* automation,
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      IPC::Message* reply_message);
60972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~DocumentPrintedNotificationObserver();
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type, const NotificationSource& source,
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
61672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool success_;
61872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DocumentPrintedNotificationObserver);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Collects METRIC_EVENT_DURATION notifications and keep track of the times.
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MetricEventDurationObserver : public NotificationObserver {
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MetricEventDurationObserver();
627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~MetricEventDurationObserver();
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the duration of an event.  Returns -1 if we haven't seen the event.
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int GetEventDurationMs(const std::string& event_name);
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver interface.
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type, const NotificationSource& source,
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::map<std::string, int> EventDurationMap;
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EventDurationMap durations_;
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MetricEventDurationObserver);
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass PageTranslatedObserver : public NotificationObserver {
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  PageTranslatedObserver(AutomationProvider* automation,
6483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         IPC::Message* reply_message,
6493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                         TabContents* tab_contents);
650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual ~PageTranslatedObserver();
6513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // NotificationObserver interface.
6533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Observe(NotificationType type,
6543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationSource& source,
6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationDetails& details);
6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NotificationRegistrar registrar_;
65972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
66072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(PageTranslatedObserver);
6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TabLanguageDeterminedObserver : public NotificationObserver {
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TabLanguageDeterminedObserver(AutomationProvider* automation,
6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                IPC::Message* reply_message,
6693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                TabContents* tab_contents,
6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                TranslateInfoBarDelegate* translate_bar);
67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~TabLanguageDeterminedObserver();
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // NotificationObserver interface.
6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Observe(NotificationType type,
6753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationSource& source,
6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationDetails& details);
6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
6793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NotificationRegistrar registrar_;
68072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
68172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
6823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TabContents* tab_contents_;
6833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TranslateInfoBarDelegate* translate_bar_;
6843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(TabLanguageDeterminedObserver);
6863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
6873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass InfoBarCountObserver : public NotificationObserver {
6893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  InfoBarCountObserver(AutomationProvider* automation,
6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       IPC::Message* reply_message,
6923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       TabContents* tab_contents,
69372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       size_t target_count);
69472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~InfoBarCountObserver();
6953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // NotificationObserver interface.
6973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void Observe(NotificationType type,
6983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationSource& source,
6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       const NotificationDetails& details);
7003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
7023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Checks whether the infobar count matches our target, and if so
7033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // sends the reply message and deletes itself.
7043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void CheckCount();
7053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  NotificationRegistrar registrar_;
70772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
70872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
7093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TabContents* tab_contents_;
7103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
71172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const size_t target_count_;
7123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
7133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(InfoBarCountObserver);
7143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
7153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS)
71772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Collects LOGIN_USER_CHANGED notifications and returns
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// whether authentication succeeded to the automation provider.
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass LoginManagerObserver : public NotificationObserver {
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LoginManagerObserver(AutomationProvider* automation,
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       IPC::Message* reply_message);
723ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~LoginManagerObserver();
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver interface.
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type, const NotificationSource& source,
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
73172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
73272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
73372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
73472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(LoginManagerObserver);
73572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
73672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
73772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Collects SCREEN_LOCK_STATE_CHANGED notifications and returns
73872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// whether authentication succeeded to the automation provider.
73972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ScreenLockUnlockObserver : public NotificationObserver {
74072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
74172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Set lock_screen to true to observe lock screen events,
74272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // false for unlock screen events.
74372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ScreenLockUnlockObserver(AutomationProvider* automation,
74472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           IPC::Message* reply_message,
74572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           bool lock_screen);
746ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ScreenLockUnlockObserver();
74772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
74872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // NotificationObserver interface.
74972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type, const NotificationSource& source,
75072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
75172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
75272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
75372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProvider* automation_;
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  IPC::Message* reply_message_;
75672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool lock_screen_;
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ScreenLockUnlockObserver);
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
760ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
761ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass NetworkScanObserver
762ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : public chromeos::NetworkLibrary::NetworkManagerObserver {
763ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
764ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkScanObserver(AutomationProvider* automation,
765ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      IPC::Message* reply_message);
766ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
767ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~NetworkScanObserver();
768ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
769ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NetworkLibrary::NetworkManagerObserver implementation.
770ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj);
771ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
772ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
773ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationProvider* automation_;
774ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC::Message* reply_message_;
775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
776ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(NetworkScanObserver);
777ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
778ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
779ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Waits for a connection success or failure for the specified
780ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// network and returns the status to the automation provider.
781ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass NetworkConnectObserver
782ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : public chromeos::NetworkLibrary::NetworkManagerObserver {
783ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
784ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkConnectObserver(AutomationProvider* automation,
785ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         IPC::Message* reply_message);
786ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
787ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~NetworkConnectObserver();
788ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
789ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const chromeos::WifiNetwork* GetWifiNetwork(
790ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::NetworkLibrary* network_library) = 0;
791ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
792ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NetworkLibrary::NetworkManagerObserver implementation.
793ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj);
794ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
795ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
796ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutomationProvider* automation_;
797ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IPC::Message* reply_message_;
798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
799ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(NetworkConnectObserver);
800ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
801ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
802ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Waits for a connection success or failure for the specified
803ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// network and returns the status to the automation provider.
804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass ServicePathConnectObserver : public NetworkConnectObserver {
805ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
806ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ServicePathConnectObserver(AutomationProvider* automation,
807ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             IPC::Message* reply_message,
808ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const std::string& service_path);
809ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const chromeos::WifiNetwork* GetWifiNetwork(
811ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::NetworkLibrary* network_library);
812ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
813ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
814ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string service_path_;
815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
816ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(ServicePathConnectObserver);
817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
818ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
819ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Waits for a connection success or failure for the specified
820ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// network and returns the status to the automation provider.
821ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass SSIDConnectObserver : public NetworkConnectObserver {
822ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
823ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SSIDConnectObserver(AutomationProvider* automation,
824ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      IPC::Message* reply_message,
825ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      const std::string& ssid);
826ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
827ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual const chromeos::WifiNetwork* GetWifiNetwork(
828ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::NetworkLibrary* network_library);
829ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
831ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string ssid_;
832ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
833ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(SSIDConnectObserver);
834ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
835ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif  // defined(OS_CHROMEOS)
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Waits for the bookmark model to load.
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProviderBookmarkModelObserver : BookmarkModelObserver {
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderBookmarkModelObserver(AutomationProvider* provider,
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          IPC::Message* reply_message,
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          BookmarkModel* model);
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~AutomationProviderBookmarkModelObserver();
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Loaded(BookmarkModel* model);
84621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void BookmarkModelBeingDeleted(BookmarkModel* model);
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeMoved(BookmarkModel* model,
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* old_parent,
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int old_index,
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* new_parent,
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int new_index) {}
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeAdded(BookmarkModel* model,
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const BookmarkNode* parent,
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 int index) {}
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeRemoved(BookmarkModel* model,
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* parent,
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   int old_index,
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* node) {}
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChanged(BookmarkModel* model,
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const BookmarkNode* node) {}
861ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model,
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         const BookmarkNode* node) {}
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                             const BookmarkNode* node) {}
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reply to the automation message with the given success value,
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // then delete myself (which removes myself from the bookmark model
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // observer list).
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ReplyAndDelete(bool success);
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_provider_;
87372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BookmarkModel* model_;
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutomationProviderBookmarkModelObserver);
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows the automation provider to wait for all downloads to finish.
880ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// If any download is interrupted, it will cancel all the other downloads at
881ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// the next |OnDownloadUpdated|, and send an error when all are done.
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProviderDownloadItemObserver : public DownloadItem::Observer {
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderDownloadItemObserver(
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* provider,
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      IPC::Message* reply_message,
88772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      int downloads);
88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderDownloadItemObserver();
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnDownloadUpdated(DownloadItem* download);
89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void OnDownloadOpened(DownloadItem* download);
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
894ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void RemoveAndCleanupOnLastEntry(DownloadItem* download);
895ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int downloads_;
899ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool interrupted_;
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadItemObserver);
902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows the automation provider to wait until the download has been updated
9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// or opened.
9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutomationProviderDownloadUpdatedObserver
9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : public DownloadItem::Observer {
9083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
9093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AutomationProviderDownloadUpdatedObserver(
9103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      AutomationProvider* provider,
9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IPC::Message* reply_message,
91272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      bool wait_for_open);
91372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderDownloadUpdatedObserver();
9143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnDownloadUpdated(DownloadItem* download);
9163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void OnDownloadOpened(DownloadItem* download);
9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool wait_for_open_;
9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadUpdatedObserver);
9243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
9253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows the automation provider to wait until the download model has changed
9273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// (because a new download has been added or removed).
9283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutomationProviderDownloadModelChangedObserver
9293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : public DownloadManager::Observer {
9303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
9313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AutomationProviderDownloadModelChangedObserver(
9323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      AutomationProvider* provider,
9333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      IPC::Message* reply_message,
93472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      DownloadManager* download_manager);
93572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderDownloadModelChangedObserver();
9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void ModelChanged();
9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
94072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
94172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DownloadManager* download_manager_;
9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadModelChangedObserver);
9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows automation provider to wait until TemplateURLModel has loaded
9483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// before looking up/returning search engine info.
9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutomationProviderSearchEngineObserver
9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : public TemplateURLModelObserver {
9513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AutomationProviderSearchEngineObserver(
953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      AutomationProvider* provider,
95472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IPC::Message* reply_message);
95572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderSearchEngineObserver();
9563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
95721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnTemplateURLModelChanged();
9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick private:
96072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
96172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
9633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(AutomationProviderSearchEngineObserver);
9643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
966c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows the automation provider to wait for history queries to finish.
967c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProviderHistoryObserver {
968c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
969c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderHistoryObserver(
970c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* provider,
97172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IPC::Message* reply_message);
97272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderHistoryObserver();
97372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void HistoryQueryComplete(HistoryService::Handle request_handle,
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            history::QueryResults* results);
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
97872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
97972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows the automation provider to wait for import queries to finish.
983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProviderImportSettingsObserver
984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : public importer::ImporterProgressObserver {
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderImportSettingsObserver(
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* provider,
98872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IPC::Message* reply_message);
98972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderImportSettingsObserver();
99072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
991ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // importer::ImporterProgressObserver:
992ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ImportStarted() OVERRIDE;
993ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE;
994ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE;
995ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void ImportEnded() OVERRIDE;
996ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
99872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
99972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows automation provider to wait for getting passwords to finish.
1003ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AutomationProviderGetPasswordsObserver : public PasswordStoreConsumer {
1004c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderGetPasswordsObserver(
1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* provider,
100772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IPC::Message* reply_message);
100872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderGetPasswordsObserver();
1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnPasswordStoreRequestDone(
1011ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      CancelableRequestProvider::Handle handle,
1012ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::vector<webkit_glue::PasswordForm*>& result);
1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
101572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
101672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1019c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows the automation provider to wait for clearing browser data to finish.
1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutomationProviderBrowsingDataObserver
1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public BrowsingDataRemover::Observer {
1022c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutomationProviderBrowsingDataObserver(
1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AutomationProvider* provider,
102572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      IPC::Message* reply_message);
102672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutomationProviderBrowsingDataObserver();
102772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
102821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void OnBrowsingDataRemoverDone();
1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
103172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> provider_;
103272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows automation provider to wait until page load after selecting an item
1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the omnibox popup.
1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass OmniboxAcceptNotificationObserver : public NotificationObserver {
1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  OmniboxAcceptNotificationObserver(NavigationController* controller,
1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 AutomationProvider* automation,
1041c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 IPC::Message* reply_message);
104272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~OmniboxAcceptNotificationObserver();
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
105072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
105172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1052c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationController* controller_;
1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(OmniboxAcceptNotificationObserver);
1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Allows the automation provider to wait for a save package notification.
1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SavePackageNotificationObserver : public NotificationObserver {
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SavePackageNotificationObserver(SavePackage* save_package,
1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  AutomationProvider* automation,
1062c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  IPC::Message* reply_message);
106372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~SavePackageNotificationObserver();
1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
107172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
107272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SavePackageNotificationObserver);
1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// This class manages taking a snapshot of a page. This requires waiting on
10784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// asynchronous callbacks and notifications.
10794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass PageSnapshotTaker : public DomOperationObserver {
10804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
10814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  PageSnapshotTaker(AutomationProvider* automation,
10824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    IPC::Message* reply_message,
10834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    RenderViewHost* render_view,
10844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    const FilePath& path);
108572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~PageSnapshotTaker();
10864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
10874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Start the process of taking a snapshot of the entire page.
10884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void Start();
10894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
10904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
10914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Overriden from DomOperationObserver.
10924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void OnDomOperationCompleted(const std::string& json);
10934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
10944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Called by the ThumbnailGenerator when the requested snapshot has been
10954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // generated.
10964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void OnSnapshotTaken(const SkBitmap& bitmap);
10974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
10984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Helper method to send arbitrary javascript to the renderer for evaluation.
10994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void ExecuteScript(const std::wstring& javascript);
11004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
11014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Helper method to send a response back to the client. Deletes this.
11024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SendMessage(bool success);
11034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
110472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
110572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
11064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  RenderViewHost* render_view_;
11074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  FilePath image_path_;
11084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool received_width_;
11094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Size entire_page_size_;
11104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
11114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(PageSnapshotTaker);
11124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
11134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
1114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass NTPInfoObserver : public NotificationObserver {
1115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
1116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  NTPInfoObserver(AutomationProvider* automation,
1117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                  IPC::Message* reply_message,
1118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                  CancelableRequestConsumer* consumer);
111921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual ~NTPInfoObserver();
1120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void Observe(NotificationType type,
1122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationSource& source,
1123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                       const NotificationDetails& details);
1124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
1126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void OnTopSitesLoaded();
1127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void OnTopSitesReceived(const history::MostVisitedURLList& visited_list);
1128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
112972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
113072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CancelableRequestConsumer* consumer_;
1132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CancelableRequestProvider::Handle request_;
1133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_ptr<DictionaryValue> ntp_info_;
1134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  history::TopSites* top_sites_;
1135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  NotificationRegistrar registrar_;
1136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(NTPInfoObserver);
1138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
1139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Observes when an app has been launched, as indicated by a notification that
1141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// a content load in some tab has stopped.
1142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AppLaunchObserver : public NotificationObserver {
1143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public:
1144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AppLaunchObserver(NavigationController* controller,
1145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    AutomationProvider* automation,
1146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    IPC::Message* reply_message,
1147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    extension_misc::LaunchContainer launch_container);
1148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~AppLaunchObserver();
1149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Observe(NotificationType type,
1151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationSource& source,
1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const NotificationDetails& details);
1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private:
1155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NavigationController* controller_;
1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
1157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NotificationRegistrar registrar_;
1159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extension_misc::LaunchContainer launch_container_;
1160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int new_window_id_;
1161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(AppLaunchObserver);
1163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen};
1164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
11653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Allows automation provider to wait until the autocomplete edit
11663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// has received focus
11673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass AutocompleteEditFocusedObserver : public NotificationObserver {
1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
11693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AutocompleteEditFocusedObserver(AutomationProvider* automation,
11703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  AutocompleteEditModel* autocomplete_edit,
11713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                  IPC::Message* reply_message);
117272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~AutocompleteEditFocusedObserver();
1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
1175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
1177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
118072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
118172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
11823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  AutocompleteEditModel* autocomplete_edit_model_;
1183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DISALLOW_COPY_AND_ASSIGN(AutocompleteEditFocusedObserver);
1185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
1186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Allows the automation provider to wait until all the notification
118821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// processes are ready.
118921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass GetActiveNotificationsObserver : public NotificationObserver {
119021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
119121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  GetActiveNotificationsObserver(AutomationProvider* automation,
119221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                 IPC::Message* reply_message);
119372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~GetActiveNotificationsObserver();
119421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
119521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Observe(NotificationType type,
119621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationSource& source,
119721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationDetails& details);
119821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
119921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
120021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void SendMessage();
120121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
120221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  AutomationJSONReply reply_;
120321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NotificationRegistrar registrar_;
120421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
120521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DISALLOW_COPY_AND_ASSIGN(GetActiveNotificationsObserver);
120621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
120721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
1208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Allows the automation provider to wait for a given number of
1209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// notification balloons.
1210513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass OnNotificationBalloonCountObserver {
1211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch public:
1212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  OnNotificationBalloonCountObserver(AutomationProvider* provider,
1213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     IPC::Message* reply_message,
1214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     BalloonCollection* collection,
1215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                     int count);
1216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnBalloonCollectionChanged();
1218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch private:
1220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutomationJSONReply reply_;
1221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BalloonCollection* collection_;
1222513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int count_;
1223513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1224513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(OnNotificationBalloonCountObserver);
1225513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
1226513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
122721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Allows the automation provider to wait for a RENDERER_PROCESS_CLOSED
122821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// notification.
122921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass RendererProcessClosedObserver : public NotificationObserver {
123021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen public:
123121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  RendererProcessClosedObserver(AutomationProvider* automation,
123221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                IPC::Message* reply_message);
123372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~RendererProcessClosedObserver();
123421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
123521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Observe(NotificationType type,
123621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationSource& source,
123721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                       const NotificationDetails& details);
123821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
123921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen private:
124021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  NotificationRegistrar registrar_;
124172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
124272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
124321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
124421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  DISALLOW_COPY_AND_ASSIGN(RendererProcessClosedObserver);
124521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen};
124621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
124772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Allows the automation provider to wait for acknowledgement that a input
124872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// event has been handled.
124972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass InputEventAckNotificationObserver : public NotificationObserver {
125072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
125172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  InputEventAckNotificationObserver(AutomationProvider* automation,
125272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    IPC::Message* reply_message,
125372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    int event_type);
125472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~InputEventAckNotificationObserver();
125572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
125672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
125772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
125872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details);
125972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
126072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
126172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
126272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
126372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
126472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int event_type_;
126572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
126672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(InputEventAckNotificationObserver);
126772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
126872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Allows the automation provider to wait for all the tabs to finish any
1270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// pending loads. This only waits for tabs that exist at the observer's
1271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// creation. Will send a message on construction if no tabs are loading
1272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// currently.
1273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass AllTabsStoppedLoadingObserver : public TabEventObserver {
1274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public:
1275dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AllTabsStoppedLoadingObserver(AutomationProvider* automation,
1276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                IPC::Message* reply_message);
1277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~AllTabsStoppedLoadingObserver();
1278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TabEventObserver implementation.
1280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnFirstPendingLoad(TabContents* tab_contents);
1281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnNoMorePendingLoads(TabContents* tab_contents);
1282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private:
1284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  typedef std::set<TabContents*> TabSet;
1285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Checks if there are no pending loads. If none, it will send an automation
1287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // relpy and delete itself.
1288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void CheckIfNoMorePendingLoads();
1289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
1290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabSet pending_tabs_;
1291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NotificationRegistrar registrar_;
1292dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::WeakPtr<AutomationProvider> automation_;
1293dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  scoped_ptr<IPC::Message> reply_message_;
1294dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1295dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(AllTabsStoppedLoadingObserver);
1296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
1297dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
129872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Observer used to listen for new tab creation to complete.
129972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass NewTabObserver : public NotificationObserver {
130072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
130172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NewTabObserver(AutomationProvider* automation, IPC::Message* reply_message);
130272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
130372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Observe(NotificationType type,
130472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationSource& source,
130572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                       const NotificationDetails& details) OVERRIDE;
130672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
130772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
130872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~NewTabObserver();
130972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
131072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NotificationRegistrar registrar_;
131172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
131272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
131372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
131472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(NewTabObserver);
131572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
131672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
131772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Posts a task to the PROCESS_LAUNCHER thread, once processed posts a task
131872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// back to the UI thread that notifies the provider we're done.
131972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass WaitForProcessLauncherThreadToGoIdleObserver
132072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : public base::RefCountedThreadSafe<
132172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          WaitForProcessLauncherThreadToGoIdleObserver,
132272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen          BrowserThread::DeleteOnUIThread> {
132372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
132472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  WaitForProcessLauncherThreadToGoIdleObserver(
132572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      AutomationProvider* automation, IPC::Message* reply_message);
132672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
132772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
1328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
132972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  friend class DeleteTask<WaitForProcessLauncherThreadToGoIdleObserver>;
133072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
133172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual ~WaitForProcessLauncherThreadToGoIdleObserver();
133272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Schedules a task on the PROCESS_LAUNCHER thread to execute
1334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // |RunOnProcessLauncherThread2|. By the time the task is executed the
1335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // PROCESS_LAUNCHER thread should be some what idle.
133672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void RunOnProcessLauncherThread();
1337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // When executed the PROCESS_LAUNCHER thread should have processed any pending
1339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // tasks.  Schedules a task on the UI thread that sends the message saying
1340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // we're done.
1341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void RunOnProcessLauncherThread2();
1342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
1343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Sends the |reply_message_| to |automation_| indicating we're done.
134472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void RunOnUIThread();
134572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
134672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::WeakPtr<AutomationProvider> automation_;
134772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_ptr<IPC::Message> reply_message_;
134872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
134972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(WaitForProcessLauncherThreadToGoIdleObserver);
135072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
1351513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
1352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_
1353