Index: chrome/browser/automation/automation_provider_observers.cc |
diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc |
index 668ca99386c8521294efb133c7439c2e8dd7f4d9..a2decb93a834c7c4c9d84e1905f4eadfc995c674 100644 |
--- a/chrome/browser/automation/automation_provider_observers.cc |
+++ b/chrome/browser/automation/automation_provider_observers.cc |
@@ -71,6 +71,7 @@ |
#include "chrome/browser/ui/webui/ntp/recently_closed_tabs_handler.h" |
#include "chrome/common/automation_messages.h" |
#include "chrome/common/chrome_notification_types.h" |
+#include "chrome/common/chrome_view_type.h" |
#include "chrome/common/content_settings_types.h" |
#include "chrome/common/extensions/extension.h" |
#include "content/browser/download/save_package.h" |
@@ -2648,14 +2649,19 @@ void InputEventAckNotificationObserver::Observe( |
} |
} |
-AllTabsStoppedLoadingObserver::AllTabsStoppedLoadingObserver( |
+AllViewsStoppedLoadingObserver::AllViewsStoppedLoadingObserver( |
AutomationProvider* automation, |
- IPC::Message* reply_message) |
+ IPC::Message* reply_message, |
+ ExtensionProcessManager* extension_process_manager) |
: automation_(automation->AsWeakPtr()), |
- reply_message_(reply_message) { |
+ reply_message_(reply_message), |
+ extension_process_manager_(extension_process_manager) { |
registrar_.Add(this, |
chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN, |
content::NotificationService::AllSources()); |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |
+ content::NotificationService::AllSources()); |
for (BrowserList::const_iterator iter = BrowserList::begin(); |
iter != BrowserList::end(); |
++iter) { |
@@ -2671,15 +2677,15 @@ AllTabsStoppedLoadingObserver::AllTabsStoppedLoadingObserver( |
CheckIfNoMorePendingLoads(); |
} |
-AllTabsStoppedLoadingObserver::~AllTabsStoppedLoadingObserver() { |
+AllViewsStoppedLoadingObserver::~AllViewsStoppedLoadingObserver() { |
} |
-void AllTabsStoppedLoadingObserver::OnFirstPendingLoad( |
+void AllViewsStoppedLoadingObserver::OnFirstPendingLoad( |
TabContents* tab_contents) { |
pending_tabs_.insert(tab_contents); |
} |
-void AllTabsStoppedLoadingObserver::OnNoMorePendingLoads( |
+void AllViewsStoppedLoadingObserver::OnNoMorePendingLoads( |
TabContents* tab_contents) { |
if (!automation_) { |
delete this; |
@@ -2696,24 +2702,31 @@ void AllTabsStoppedLoadingObserver::OnNoMorePendingLoads( |
CheckIfNoMorePendingLoads(); |
} |
-void AllTabsStoppedLoadingObserver::Observe( |
+void AllViewsStoppedLoadingObserver::Observe( |
int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
if (!automation_) { |
+ delete this; |
+ return; |
+ } |
+ if (type == chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING) { |
+ CheckIfNoMorePendingLoads(); |
+ } else if (type == chrome::NOTIFICATION_APP_MODAL_DIALOG_SHOWN) { |
AutomationJSONReply(automation_, |
reply_message_.release()).SendSuccess(NULL); |
delete this; |
} |
} |
-void AllTabsStoppedLoadingObserver::CheckIfNoMorePendingLoads() { |
+void AllViewsStoppedLoadingObserver::CheckIfNoMorePendingLoads() { |
if (!automation_) { |
delete this; |
return; |
} |
- if (pending_tabs_.empty()) { |
+ if (pending_tabs_.empty() && |
+ DidExtensionHostsStopLoading(extension_process_manager_)) { |
AutomationJSONReply(automation_, |
reply_message_.release()).SendSuccess(NULL); |
delete this; |
@@ -3054,3 +3067,35 @@ void PolicyUpdatesObserver::PostTask(content::BrowserThread::ID id, |
} |
#endif // defined(ENABLE_CONFIGURATION_POLICY) |
+ |
+ExtensionPopupObserver::ExtensionPopupObserver( |
+ AutomationProvider* automation, |
+ IPC::Message* reply_message, |
+ const std::string& extension_id) |
+ : automation_(automation->AsWeakPtr()), |
+ reply_message_(reply_message), |
+ extension_id_(extension_id) { |
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, |
+ content::NotificationService::AllSources()); |
+} |
+ |
+ExtensionPopupObserver::~ExtensionPopupObserver() { |
+} |
+ |
+void ExtensionPopupObserver::Observe( |
+ int type, |
+ const content::NotificationSource& source, |
+ const content::NotificationDetails& details) { |
+ if (!automation_) { |
+ delete this; |
+ return; |
+ } |
+ |
+ ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); |
+ if (host->extension_id() == extension_id_ && |
+ host->extension_host_type() == chrome::VIEW_TYPE_EXTENSION_POPUP) { |
+ AutomationJSONReply(automation_, reply_message_.release()) |
+ .SendSuccess(NULL); |
+ delete this; |
+ } |
+} |