// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_ #define CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_ #pragma once #include <deque> #include <map> #include <set> #include <string> #include <vector> #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/automation/automation_provider_json.h" #include "chrome/browser/automation/automation_tab_helper.h" #include "chrome/browser/bookmarks/bookmark_model_observer.h" #include "chrome/browser/browsing_data_remover.h" #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/cros/network_library.h" #endif // defined(OS_CHROMEOS) #include "chrome/browser/download/download_item.h" #include "chrome/browser/download/download_manager.h" #include "chrome/browser/history/history.h" #include "chrome/browser/history/history_types.h" #include "chrome/browser/importer/importer_data_types.h" #include "chrome/browser/importer/importer_progress_observer.h" #include "chrome/browser/password_manager/password_store_consumer.h" #include "chrome/browser/search_engines/template_url_model_observer.h" #include "chrome/browser/tabs/tab_strip_model.h" #include "chrome/common/automation_constants.h" #include "chrome/common/extensions/extension_constants.h" #include "content/browser/cancelable_request.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "content/common/notification_type.h" #include "ui/gfx/size.h" class AutocompleteEditModel; class AutomationProvider; class BalloonCollection; class Browser; class Extension; class ExtensionProcessManager; class NavigationController; class RenderViewHost; class SavePackage; class TabContents; class TranslateInfoBarDelegate; namespace history { class TopSites; } namespace IPC { class Message; } class InitialLoadObserver : public NotificationObserver { public: InitialLoadObserver(size_t tab_count, AutomationProvider* automation); virtual ~InitialLoadObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Caller owns the return value and is responsible for deleting it. // Example return value: // {'tabs': [{'start_time_ms': 1, 'stop_time_ms': 2.5}, // {'start_time_ms': 0.5, 'stop_time_ms': 3}]} // stop_time_ms values may be null if WaitForInitialLoads has not finished. // Only includes entries for the |tab_count| tabs we are monitoring. // There is no defined ordering of the return value. DictionaryValue* GetTimingInformation() const; private: class TabTime; typedef std::map<uintptr_t, TabTime> TabTimeMap; typedef std::set<uintptr_t> TabSet; void ConditionMet(); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; size_t outstanding_tab_count_; base::TimeTicks init_time_; TabTimeMap loading_tabs_; TabSet finished_tabs_; DISALLOW_COPY_AND_ASSIGN(InitialLoadObserver); }; #if defined(OS_CHROMEOS) // Watches for NetworkManager events. Because NetworkLibrary loads // asynchronously, this is used to make sure it is done before tests are run. class NetworkManagerInitObserver : public chromeos::NetworkLibrary::NetworkManagerObserver { public: explicit NetworkManagerInitObserver(AutomationProvider* automation); virtual ~NetworkManagerInitObserver(); virtual bool Init(); virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj); private: base::WeakPtr<AutomationProvider> automation_; DISALLOW_COPY_AND_ASSIGN(NetworkManagerInitObserver); }; #endif // defined(OS_CHROMEOS) // Watches for NewTabUI page loads for performance timing purposes. class NewTabUILoadObserver : public NotificationObserver { public: explicit NewTabUILoadObserver(AutomationProvider* automation); virtual ~NewTabUILoadObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; DISALLOW_COPY_AND_ASSIGN(NewTabUILoadObserver); }; class NavigationControllerRestoredObserver : public NotificationObserver { public: NavigationControllerRestoredObserver(AutomationProvider* automation, NavigationController* controller, IPC::Message* reply_message); virtual ~NavigationControllerRestoredObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: bool FinishedRestoring(); void SendDone(); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; NavigationController* controller_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(NavigationControllerRestoredObserver); }; class NavigationNotificationObserver : public NotificationObserver { public: NavigationNotificationObserver(NavigationController* controller, AutomationProvider* automation, IPC::Message* reply_message, int number_of_navigations, bool include_current_navigation, bool use_json_interface); virtual ~NavigationNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: void ConditionMet(AutomationMsg_NavigationResponseValues navigation_result); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; NavigationController* controller_; int navigations_remaining_; bool navigation_started_; bool use_json_interface_; DISALLOW_COPY_AND_ASSIGN(NavigationNotificationObserver); }; class TabStripNotificationObserver : public NotificationObserver { public: TabStripNotificationObserver(NotificationType notification, AutomationProvider* automation); virtual ~TabStripNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); virtual void ObserveTab(NavigationController* controller) = 0; protected: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; NotificationType notification_; }; class TabAppendedNotificationObserver : public TabStripNotificationObserver { public: TabAppendedNotificationObserver(Browser* parent, AutomationProvider* automation, IPC::Message* reply_message); virtual ~TabAppendedNotificationObserver(); virtual void ObserveTab(NavigationController* controller); protected: Browser* parent_; scoped_ptr<IPC::Message> reply_message_; private: DISALLOW_COPY_AND_ASSIGN(TabAppendedNotificationObserver); }; class TabClosedNotificationObserver : public TabStripNotificationObserver { public: TabClosedNotificationObserver(AutomationProvider* automation, bool wait_until_closed, IPC::Message* reply_message); virtual ~TabClosedNotificationObserver(); virtual void ObserveTab(NavigationController* controller); void set_for_browser_command(bool for_browser_command); protected: scoped_ptr<IPC::Message> reply_message_; bool for_browser_command_; private: DISALLOW_COPY_AND_ASSIGN(TabClosedNotificationObserver); }; // Notifies when the tab count reaches the target number. class TabCountChangeObserver : public TabStripModelObserver { public: TabCountChangeObserver(AutomationProvider* automation, Browser* browser, IPC::Message* reply_message, int target_tab_count); // Implementation of TabStripModelObserver. virtual void TabInsertedAt(TabContentsWrapper* contents, int index, bool foreground); virtual void TabDetachedAt(TabContentsWrapper* contents, int index); virtual void TabStripModelDeleted(); private: virtual ~TabCountChangeObserver(); // Checks if the current tab count matches our target, and if so, // sends the reply message and deletes self. void CheckTabCount(); base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; TabStripModel* tab_strip_model_; const int target_tab_count_; DISALLOW_COPY_AND_ASSIGN(TabCountChangeObserver); }; // Observes when an extension has finished installing or possible install // errors. This does not guarantee that the extension is ready for use. class ExtensionInstallNotificationObserver : public NotificationObserver { public: ExtensionInstallNotificationObserver(AutomationProvider* automation, int id, IPC::Message* reply_message); virtual ~ExtensionInstallNotificationObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: // Send |response| back to the provider's client. void SendResponse(AutomationMsg_ExtensionResponseValues response); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; int id_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(ExtensionInstallNotificationObserver); }; // Observes when an extension has been uninstalled. class ExtensionUninstallObserver : public NotificationObserver { public: ExtensionUninstallObserver(AutomationProvider* automation, IPC::Message* reply_message, const std::string& id); virtual ~ExtensionUninstallObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; std::string id_; DISALLOW_COPY_AND_ASSIGN(ExtensionUninstallObserver); }; // Observes when an extension has finished loading and is ready for use. Also // checks for possible install errors. class ExtensionReadyNotificationObserver : public NotificationObserver { public: ExtensionReadyNotificationObserver(ExtensionProcessManager* manager, AutomationProvider* automation, int id, IPC::Message* reply_message); virtual ~ExtensionReadyNotificationObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; ExtensionProcessManager* manager_; base::WeakPtr<AutomationProvider> automation_; int id_; scoped_ptr<IPC::Message> reply_message_; const Extension* extension_; DISALLOW_COPY_AND_ASSIGN(ExtensionReadyNotificationObserver); }; class ExtensionUnloadNotificationObserver : public NotificationObserver { public: ExtensionUnloadNotificationObserver(); virtual ~ExtensionUnloadNotificationObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); bool did_receive_unload_notification() { return did_receive_unload_notification_; } private: NotificationRegistrar registrar_; bool did_receive_unload_notification_; DISALLOW_COPY_AND_ASSIGN(ExtensionUnloadNotificationObserver); }; // Observes when the extensions have been fully updated. The ExtensionUpdater // service provides notifications for each extension that gets updated, but // it does not wait for the updated extensions to be installed or loaded. This // observer waits until all updated extensions have actually been loaded. class ExtensionsUpdatedObserver : public NotificationObserver { public: ExtensionsUpdatedObserver(ExtensionProcessManager* manager, AutomationProvider* automation, IPC::Message* reply_message); virtual ~ExtensionsUpdatedObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; ExtensionProcessManager* manager_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; std::set<std::string> in_progress_updates_; bool updater_finished_; DISALLOW_COPY_AND_ASSIGN(ExtensionsUpdatedObserver); }; class ExtensionTestResultNotificationObserver : public NotificationObserver { public: explicit ExtensionTestResultNotificationObserver( AutomationProvider* automation); virtual ~ExtensionTestResultNotificationObserver(); // Implementation of NotificationObserver. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // Sends a test result back to the provider's client, if there is a pending // provider message and there is a result in the queue. void MaybeSendResult(); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; // Two queues containing the test results. Although typically only // one result will be in each queue, there are cases where a queue is // needed. // For example, perhaps two events occur asynchronously and their // order of completion is not guaranteed. If the test wants to make sure // both finish before continuing, a queue is needed. The test would then // need to wait twice. std::deque<bool> results_; std::deque<std::string> messages_; DISALLOW_COPY_AND_ASSIGN(ExtensionTestResultNotificationObserver); }; // Observes when a new browser has been opened and a tab within it has stopped // loading. class BrowserOpenedNotificationObserver : public NotificationObserver { public: BrowserOpenedNotificationObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~BrowserOpenedNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); void set_for_browser_command(bool for_browser_command); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; int new_window_id_; bool for_browser_command_; DISALLOW_COPY_AND_ASSIGN(BrowserOpenedNotificationObserver); }; class BrowserClosedNotificationObserver : public NotificationObserver { public: BrowserClosedNotificationObserver(Browser* browser, AutomationProvider* automation, IPC::Message* reply_message); virtual ~BrowserClosedNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); void set_for_browser_command(bool for_browser_command); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; bool for_browser_command_; DISALLOW_COPY_AND_ASSIGN(BrowserClosedNotificationObserver); }; class BrowserCountChangeNotificationObserver : public NotificationObserver { public: BrowserCountChangeNotificationObserver(int target_count, AutomationProvider* automation, IPC::Message* reply_message); virtual ~BrowserCountChangeNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: int target_count_; NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(BrowserCountChangeNotificationObserver); }; class AppModalDialogShownObserver : public NotificationObserver { public: AppModalDialogShownObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~AppModalDialogShownObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(AppModalDialogShownObserver); }; class ExecuteBrowserCommandObserver : public NotificationObserver { public: virtual ~ExecuteBrowserCommandObserver(); static bool CreateAndRegisterObserver(AutomationProvider* automation, Browser* browser, int command, IPC::Message* reply_message); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: ExecuteBrowserCommandObserver(AutomationProvider* automation, IPC::Message* reply_message); bool Register(int command); bool GetNotificationType(int command, NotificationType::Type* type); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; NotificationType::Type notification_type_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(ExecuteBrowserCommandObserver); }; class FindInPageNotificationObserver : public NotificationObserver { public: FindInPageNotificationObserver(AutomationProvider* automation, TabContents* parent_tab, bool reply_with_json, IPC::Message* reply_message); virtual ~FindInPageNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); // The Find mechanism is over asynchronous IPC, so a search is kicked off and // we wait for notification to find out what the results are. As the user is // typing, new search requests can be issued and the Request ID helps us make // sense of whether this is the current request or an old one. The unit tests, // however, which uses this constant issues only one search at a time, so we // don't need a rolling id to identify each search. But, we still need to // specify one, so we just use a fixed one - its value does not matter. static const int kFindInPageRequestId; private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; // We will at some point (before final update) be notified of the ordinal and // we need to preserve it so we can send it later. int active_match_ordinal_; // Send reply using json automation interface. bool reply_with_json_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(FindInPageNotificationObserver); }; class DomOperationObserver : public NotificationObserver { public: DomOperationObserver(); virtual ~DomOperationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); virtual void OnDomOperationCompleted(const std::string& json) = 0; private: NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(DomOperationObserver); }; // Sends a message back to the automation client with the results of the DOM // operation. class DomOperationMessageSender : public DomOperationObserver { public: explicit DomOperationMessageSender(AutomationProvider* automation, IPC::Message* relpy_message, bool use_json_interface); virtual ~DomOperationMessageSender(); virtual void OnDomOperationCompleted(const std::string& json); private: base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; bool use_json_interface_; DISALLOW_COPY_AND_ASSIGN(DomOperationMessageSender); }; class DocumentPrintedNotificationObserver : public NotificationObserver { public: DocumentPrintedNotificationObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~DocumentPrintedNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; bool success_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(DocumentPrintedNotificationObserver); }; // Collects METRIC_EVENT_DURATION notifications and keep track of the times. class MetricEventDurationObserver : public NotificationObserver { public: MetricEventDurationObserver(); virtual ~MetricEventDurationObserver(); // Get the duration of an event. Returns -1 if we haven't seen the event. int GetEventDurationMs(const std::string& event_name); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; typedef std::map<std::string, int> EventDurationMap; EventDurationMap durations_; DISALLOW_COPY_AND_ASSIGN(MetricEventDurationObserver); }; class PageTranslatedObserver : public NotificationObserver { public: PageTranslatedObserver(AutomationProvider* automation, IPC::Message* reply_message, TabContents* tab_contents); virtual ~PageTranslatedObserver(); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(PageTranslatedObserver); }; class TabLanguageDeterminedObserver : public NotificationObserver { public: TabLanguageDeterminedObserver(AutomationProvider* automation, IPC::Message* reply_message, TabContents* tab_contents, TranslateInfoBarDelegate* translate_bar); virtual ~TabLanguageDeterminedObserver(); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; TabContents* tab_contents_; TranslateInfoBarDelegate* translate_bar_; DISALLOW_COPY_AND_ASSIGN(TabLanguageDeterminedObserver); }; class InfoBarCountObserver : public NotificationObserver { public: InfoBarCountObserver(AutomationProvider* automation, IPC::Message* reply_message, TabContents* tab_contents, size_t target_count); virtual ~InfoBarCountObserver(); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: // Checks whether the infobar count matches our target, and if so // sends the reply message and deletes itself. void CheckCount(); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; TabContents* tab_contents_; const size_t target_count_; DISALLOW_COPY_AND_ASSIGN(InfoBarCountObserver); }; #if defined(OS_CHROMEOS) // Collects LOGIN_USER_CHANGED notifications and returns // whether authentication succeeded to the automation provider. class LoginManagerObserver : public NotificationObserver { public: LoginManagerObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~LoginManagerObserver(); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(LoginManagerObserver); }; // Collects SCREEN_LOCK_STATE_CHANGED notifications and returns // whether authentication succeeded to the automation provider. class ScreenLockUnlockObserver : public NotificationObserver { public: // Set lock_screen to true to observe lock screen events, // false for unlock screen events. ScreenLockUnlockObserver(AutomationProvider* automation, IPC::Message* reply_message, bool lock_screen); virtual ~ScreenLockUnlockObserver(); // NotificationObserver interface. virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; AutomationProvider* automation_; IPC::Message* reply_message_; bool lock_screen_; DISALLOW_COPY_AND_ASSIGN(ScreenLockUnlockObserver); }; class NetworkScanObserver : public chromeos::NetworkLibrary::NetworkManagerObserver { public: NetworkScanObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~NetworkScanObserver(); // NetworkLibrary::NetworkManagerObserver implementation. virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj); private: AutomationProvider* automation_; IPC::Message* reply_message_; DISALLOW_COPY_AND_ASSIGN(NetworkScanObserver); }; // Waits for a connection success or failure for the specified // network and returns the status to the automation provider. class NetworkConnectObserver : public chromeos::NetworkLibrary::NetworkManagerObserver { public: NetworkConnectObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~NetworkConnectObserver(); virtual const chromeos::WifiNetwork* GetWifiNetwork( chromeos::NetworkLibrary* network_library) = 0; // NetworkLibrary::NetworkManagerObserver implementation. virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj); private: AutomationProvider* automation_; IPC::Message* reply_message_; DISALLOW_COPY_AND_ASSIGN(NetworkConnectObserver); }; // Waits for a connection success or failure for the specified // network and returns the status to the automation provider. class ServicePathConnectObserver : public NetworkConnectObserver { public: ServicePathConnectObserver(AutomationProvider* automation, IPC::Message* reply_message, const std::string& service_path); virtual const chromeos::WifiNetwork* GetWifiNetwork( chromeos::NetworkLibrary* network_library); private: std::string service_path_; DISALLOW_COPY_AND_ASSIGN(ServicePathConnectObserver); }; // Waits for a connection success or failure for the specified // network and returns the status to the automation provider. class SSIDConnectObserver : public NetworkConnectObserver { public: SSIDConnectObserver(AutomationProvider* automation, IPC::Message* reply_message, const std::string& ssid); virtual const chromeos::WifiNetwork* GetWifiNetwork( chromeos::NetworkLibrary* network_library); private: std::string ssid_; DISALLOW_COPY_AND_ASSIGN(SSIDConnectObserver); }; #endif // defined(OS_CHROMEOS) // Waits for the bookmark model to load. class AutomationProviderBookmarkModelObserver : BookmarkModelObserver { public: AutomationProviderBookmarkModelObserver(AutomationProvider* provider, IPC::Message* reply_message, BookmarkModel* model); virtual ~AutomationProviderBookmarkModelObserver(); virtual void Loaded(BookmarkModel* model); virtual void BookmarkModelBeingDeleted(BookmarkModel* model); virtual void BookmarkNodeMoved(BookmarkModel* model, const BookmarkNode* old_parent, int old_index, const BookmarkNode* new_parent, int new_index) {} virtual void BookmarkNodeAdded(BookmarkModel* model, const BookmarkNode* parent, int index) {} virtual void BookmarkNodeRemoved(BookmarkModel* model, const BookmarkNode* parent, int old_index, const BookmarkNode* node) {} virtual void BookmarkNodeChanged(BookmarkModel* model, const BookmarkNode* node) {} virtual void BookmarkNodeFaviconLoaded(BookmarkModel* model, const BookmarkNode* node) {} virtual void BookmarkNodeChildrenReordered(BookmarkModel* model, const BookmarkNode* node) {} private: // Reply to the automation message with the given success value, // then delete myself (which removes myself from the bookmark model // observer list). void ReplyAndDelete(bool success); base::WeakPtr<AutomationProvider> automation_provider_; scoped_ptr<IPC::Message> reply_message_; BookmarkModel* model_; DISALLOW_COPY_AND_ASSIGN(AutomationProviderBookmarkModelObserver); }; // Allows the automation provider to wait for all downloads to finish. // If any download is interrupted, it will cancel all the other downloads at // the next |OnDownloadUpdated|, and send an error when all are done. class AutomationProviderDownloadItemObserver : public DownloadItem::Observer { public: AutomationProviderDownloadItemObserver( AutomationProvider* provider, IPC::Message* reply_message, int downloads); virtual ~AutomationProviderDownloadItemObserver(); virtual void OnDownloadUpdated(DownloadItem* download); virtual void OnDownloadOpened(DownloadItem* download); private: void RemoveAndCleanupOnLastEntry(DownloadItem* download); base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; int downloads_; bool interrupted_; DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadItemObserver); }; // Allows the automation provider to wait until the download has been updated // or opened. class AutomationProviderDownloadUpdatedObserver : public DownloadItem::Observer { public: AutomationProviderDownloadUpdatedObserver( AutomationProvider* provider, IPC::Message* reply_message, bool wait_for_open); virtual ~AutomationProviderDownloadUpdatedObserver(); virtual void OnDownloadUpdated(DownloadItem* download); virtual void OnDownloadOpened(DownloadItem* download); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; bool wait_for_open_; DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadUpdatedObserver); }; // Allows the automation provider to wait until the download model has changed // (because a new download has been added or removed). class AutomationProviderDownloadModelChangedObserver : public DownloadManager::Observer { public: AutomationProviderDownloadModelChangedObserver( AutomationProvider* provider, IPC::Message* reply_message, DownloadManager* download_manager); virtual ~AutomationProviderDownloadModelChangedObserver(); virtual void ModelChanged(); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; DownloadManager* download_manager_; DISALLOW_COPY_AND_ASSIGN(AutomationProviderDownloadModelChangedObserver); }; // Allows automation provider to wait until TemplateURLModel has loaded // before looking up/returning search engine info. class AutomationProviderSearchEngineObserver : public TemplateURLModelObserver { public: AutomationProviderSearchEngineObserver( AutomationProvider* provider, IPC::Message* reply_message); virtual ~AutomationProviderSearchEngineObserver(); virtual void OnTemplateURLModelChanged(); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(AutomationProviderSearchEngineObserver); }; // Allows the automation provider to wait for history queries to finish. class AutomationProviderHistoryObserver { public: AutomationProviderHistoryObserver( AutomationProvider* provider, IPC::Message* reply_message); virtual ~AutomationProviderHistoryObserver(); void HistoryQueryComplete(HistoryService::Handle request_handle, history::QueryResults* results); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; }; // Allows the automation provider to wait for import queries to finish. class AutomationProviderImportSettingsObserver : public importer::ImporterProgressObserver { public: AutomationProviderImportSettingsObserver( AutomationProvider* provider, IPC::Message* reply_message); virtual ~AutomationProviderImportSettingsObserver(); // importer::ImporterProgressObserver: virtual void ImportStarted() OVERRIDE; virtual void ImportItemStarted(importer::ImportItem item) OVERRIDE; virtual void ImportItemEnded(importer::ImportItem item) OVERRIDE; virtual void ImportEnded() OVERRIDE; private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; }; // Allows automation provider to wait for getting passwords to finish. class AutomationProviderGetPasswordsObserver : public PasswordStoreConsumer { public: AutomationProviderGetPasswordsObserver( AutomationProvider* provider, IPC::Message* reply_message); virtual ~AutomationProviderGetPasswordsObserver(); virtual void OnPasswordStoreRequestDone( CancelableRequestProvider::Handle handle, const std::vector<webkit_glue::PasswordForm*>& result); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; }; // Allows the automation provider to wait for clearing browser data to finish. class AutomationProviderBrowsingDataObserver : public BrowsingDataRemover::Observer { public: AutomationProviderBrowsingDataObserver( AutomationProvider* provider, IPC::Message* reply_message); virtual ~AutomationProviderBrowsingDataObserver(); virtual void OnBrowsingDataRemoverDone(); private: base::WeakPtr<AutomationProvider> provider_; scoped_ptr<IPC::Message> reply_message_; }; // Allows automation provider to wait until page load after selecting an item // in the omnibox popup. class OmniboxAcceptNotificationObserver : public NotificationObserver { public: OmniboxAcceptNotificationObserver(NavigationController* controller, AutomationProvider* automation, IPC::Message* reply_message); virtual ~OmniboxAcceptNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; NavigationController* controller_; DISALLOW_COPY_AND_ASSIGN(OmniboxAcceptNotificationObserver); }; // Allows the automation provider to wait for a save package notification. class SavePackageNotificationObserver : public NotificationObserver { public: SavePackageNotificationObserver(SavePackage* save_package, AutomationProvider* automation, IPC::Message* reply_message); virtual ~SavePackageNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(SavePackageNotificationObserver); }; // This class manages taking a snapshot of a page. This requires waiting on // asynchronous callbacks and notifications. class PageSnapshotTaker : public DomOperationObserver { public: PageSnapshotTaker(AutomationProvider* automation, IPC::Message* reply_message, RenderViewHost* render_view, const FilePath& path); virtual ~PageSnapshotTaker(); // Start the process of taking a snapshot of the entire page. void Start(); private: // Overriden from DomOperationObserver. virtual void OnDomOperationCompleted(const std::string& json); // Called by the ThumbnailGenerator when the requested snapshot has been // generated. void OnSnapshotTaken(const SkBitmap& bitmap); // Helper method to send arbitrary javascript to the renderer for evaluation. void ExecuteScript(const std::wstring& javascript); // Helper method to send a response back to the client. Deletes this. void SendMessage(bool success); base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; RenderViewHost* render_view_; FilePath image_path_; bool received_width_; gfx::Size entire_page_size_; DISALLOW_COPY_AND_ASSIGN(PageSnapshotTaker); }; class NTPInfoObserver : public NotificationObserver { public: NTPInfoObserver(AutomationProvider* automation, IPC::Message* reply_message, CancelableRequestConsumer* consumer); virtual ~NTPInfoObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: void OnTopSitesLoaded(); void OnTopSitesReceived(const history::MostVisitedURLList& visited_list); base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; CancelableRequestConsumer* consumer_; CancelableRequestProvider::Handle request_; scoped_ptr<DictionaryValue> ntp_info_; history::TopSites* top_sites_; NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(NTPInfoObserver); }; // Observes when an app has been launched, as indicated by a notification that // a content load in some tab has stopped. class AppLaunchObserver : public NotificationObserver { public: AppLaunchObserver(NavigationController* controller, AutomationProvider* automation, IPC::Message* reply_message, extension_misc::LaunchContainer launch_container); virtual ~AppLaunchObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NavigationController* controller_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; NotificationRegistrar registrar_; extension_misc::LaunchContainer launch_container_; int new_window_id_; DISALLOW_COPY_AND_ASSIGN(AppLaunchObserver); }; // Allows automation provider to wait until the autocomplete edit // has received focus class AutocompleteEditFocusedObserver : public NotificationObserver { public: AutocompleteEditFocusedObserver(AutomationProvider* automation, AutocompleteEditModel* autocomplete_edit, IPC::Message* reply_message); virtual ~AutocompleteEditFocusedObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; AutocompleteEditModel* autocomplete_edit_model_; DISALLOW_COPY_AND_ASSIGN(AutocompleteEditFocusedObserver); }; // Allows the automation provider to wait until all the notification // processes are ready. class GetActiveNotificationsObserver : public NotificationObserver { public: GetActiveNotificationsObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~GetActiveNotificationsObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: void SendMessage(); AutomationJSONReply reply_; NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(GetActiveNotificationsObserver); }; // Allows the automation provider to wait for a given number of // notification balloons. class OnNotificationBalloonCountObserver { public: OnNotificationBalloonCountObserver(AutomationProvider* provider, IPC::Message* reply_message, BalloonCollection* collection, int count); void OnBalloonCollectionChanged(); private: AutomationJSONReply reply_; BalloonCollection* collection_; int count_; DISALLOW_COPY_AND_ASSIGN(OnNotificationBalloonCountObserver); }; // Allows the automation provider to wait for a RENDERER_PROCESS_CLOSED // notification. class RendererProcessClosedObserver : public NotificationObserver { public: RendererProcessClosedObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~RendererProcessClosedObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(RendererProcessClosedObserver); }; // Allows the automation provider to wait for acknowledgement that a input // event has been handled. class InputEventAckNotificationObserver : public NotificationObserver { public: InputEventAckNotificationObserver(AutomationProvider* automation, IPC::Message* reply_message, int event_type); virtual ~InputEventAckNotificationObserver(); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); private: NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; int event_type_; DISALLOW_COPY_AND_ASSIGN(InputEventAckNotificationObserver); }; // Allows the automation provider to wait for all the tabs to finish any // pending loads. This only waits for tabs that exist at the observer's // creation. Will send a message on construction if no tabs are loading // currently. class AllTabsStoppedLoadingObserver : public TabEventObserver { public: AllTabsStoppedLoadingObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual ~AllTabsStoppedLoadingObserver(); // TabEventObserver implementation. virtual void OnFirstPendingLoad(TabContents* tab_contents); virtual void OnNoMorePendingLoads(TabContents* tab_contents); private: typedef std::set<TabContents*> TabSet; // Checks if there are no pending loads. If none, it will send an automation // relpy and delete itself. void CheckIfNoMorePendingLoads(); TabSet pending_tabs_; NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(AllTabsStoppedLoadingObserver); }; // Observer used to listen for new tab creation to complete. class NewTabObserver : public NotificationObserver { public: NewTabObserver(AutomationProvider* automation, IPC::Message* reply_message); virtual void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) OVERRIDE; private: virtual ~NewTabObserver(); NotificationRegistrar registrar_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(NewTabObserver); }; // Posts a task to the PROCESS_LAUNCHER thread, once processed posts a task // back to the UI thread that notifies the provider we're done. class WaitForProcessLauncherThreadToGoIdleObserver : public base::RefCountedThreadSafe< WaitForProcessLauncherThreadToGoIdleObserver, BrowserThread::DeleteOnUIThread> { public: WaitForProcessLauncherThreadToGoIdleObserver( AutomationProvider* automation, IPC::Message* reply_message); private: friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; friend class DeleteTask<WaitForProcessLauncherThreadToGoIdleObserver>; virtual ~WaitForProcessLauncherThreadToGoIdleObserver(); // Schedules a task on the PROCESS_LAUNCHER thread to execute // |RunOnProcessLauncherThread2|. By the time the task is executed the // PROCESS_LAUNCHER thread should be some what idle. void RunOnProcessLauncherThread(); // When executed the PROCESS_LAUNCHER thread should have processed any pending // tasks. Schedules a task on the UI thread that sends the message saying // we're done. void RunOnProcessLauncherThread2(); // Sends the |reply_message_| to |automation_| indicating we're done. void RunOnUIThread(); base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; DISALLOW_COPY_AND_ASSIGN(WaitForProcessLauncherThreadToGoIdleObserver); }; #endif // CHROME_BROWSER_AUTOMATION_AUTOMATION_PROVIDER_OBSERVERS_H_