summaryrefslogtreecommitdiffstats
path: root/chrome/browser/automation/testing_automation_provider.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/automation/testing_automation_provider.cc')
-rw-r--r--chrome/browser/automation/testing_automation_provider.cc220
1 files changed, 219 insertions, 1 deletions
diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc
index 2a21cda..f62079b 100644
--- a/chrome/browser/automation/testing_automation_provider.cc
+++ b/chrome/browser/automation/testing_automation_provider.cc
@@ -5,11 +5,13 @@
#include "chrome/browser/automation/testing_automation_provider.h"
#include "base/command_line.h"
+#include "chrome/app/chrome_dll_resource.h"
#include "chrome/browser/automation/automation_browser_tracker.h"
#include "chrome/browser/automation/automation_provider_list.h"
#include "chrome/browser/automation/automation_provider_observers.h"
#include "chrome/browser/automation/automation_tab_tracker.h"
#include "chrome/browser/browser_window.h"
+#include "chrome/browser/login_prompt.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/net/url_request_context_getter.h"
#include "chrome/common/notification_service.h"
@@ -124,7 +126,8 @@ class DeleteCookieTask : public Task {
TestingAutomationProvider::TestingAutomationProvider(Profile* profile)
- : AutomationProvider(profile) {
+ : AutomationProvider(profile),
+ redirect_query_(0) {
BrowserList::AddObserver(this);
registrar_.Add(this, NotificationType::SESSION_END,
NotificationService::AllSources());
@@ -153,6 +156,20 @@ void TestingAutomationProvider::OnMessageReceived(
IPC_MESSAGE_HANDLER_DELAY_REPLY(
AutomationMsg_NavigateToURLBlockUntilNavigationsComplete,
NavigateToURLBlockUntilNavigationsComplete)
+ IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsync, NavigationAsync)
+ IPC_MESSAGE_HANDLER(AutomationMsg_NavigationAsyncWithDisposition,
+ NavigationAsyncWithDisposition)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_GoBack, GoBack)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_GoForward, GoForward)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_Reload, Reload)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_SetAuth, SetAuth)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_CancelAuth, CancelAuth)
+ IPC_MESSAGE_HANDLER(AutomationMsg_NeedsAuth, NeedsAuth)
+ IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_RedirectsFrom,
+ GetRedirectsFrom)
+ IPC_MESSAGE_HANDLER(AutomationMsg_BrowserWindowCount, GetBrowserWindowCount)
+ IPC_MESSAGE_HANDLER(AutomationMsg_NormalBrowserWindowCount,
+ GetNormalBrowserWindowCount)
IPC_MESSAGE_UNHANDLED(AutomationProvider::OnMessageReceived(message));
IPC_END_MESSAGE_MAP()
@@ -336,6 +353,207 @@ void TestingAutomationProvider::NavigateToURLBlockUntilNavigationsComplete(
Send(reply_message);
}
+void TestingAutomationProvider::NavigationAsync(int handle,
+ const GURL& url,
+ bool* status) {
+ NavigationAsyncWithDisposition(handle, url, CURRENT_TAB, status);
+}
+
+void TestingAutomationProvider::NavigationAsyncWithDisposition(
+ int handle,
+ const GURL& url,
+ WindowOpenDisposition disposition,
+ bool* status) {
+ *status = false;
+
+ if (tab_tracker_->ContainsHandle(handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(handle);
+
+ // Simulate what a user would do. Activate the tab and then navigate.
+ // We could allow navigating in a background tab in future.
+ Browser* browser = FindAndActivateTab(tab);
+
+ if (browser) {
+ // Don't add any listener unless a callback mechanism is desired.
+ // TODO(vibhor): Do this if such a requirement arises in future.
+ browser->OpenURL(url, GURL(), disposition, PageTransition::TYPED);
+ *status = true;
+ }
+ }
+}
+
+void TestingAutomationProvider::GoBack(int handle,
+ IPC::Message* reply_message) {
+ if (tab_tracker_->ContainsHandle(handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(handle);
+ Browser* browser = FindAndActivateTab(tab);
+ if (browser && browser->command_updater()->IsCommandEnabled(IDC_BACK)) {
+ AddNavigationStatusListener(tab, reply_message, 1, false);
+ browser->GoBack(CURRENT_TAB);
+ return;
+ }
+ }
+
+ AutomationMsg_GoBack::WriteReplyParams(
+ reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::GoForward(int handle,
+ IPC::Message* reply_message) {
+ if (tab_tracker_->ContainsHandle(handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(handle);
+ Browser* browser = FindAndActivateTab(tab);
+ if (browser && browser->command_updater()->IsCommandEnabled(IDC_FORWARD)) {
+ AddNavigationStatusListener(tab, reply_message, 1, false);
+ browser->GoForward(CURRENT_TAB);
+ return;
+ }
+ }
+
+ AutomationMsg_GoForward::WriteReplyParams(
+ reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::Reload(int handle,
+ IPC::Message* reply_message) {
+ if (tab_tracker_->ContainsHandle(handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(handle);
+ Browser* browser = FindAndActivateTab(tab);
+ if (browser && browser->command_updater()->IsCommandEnabled(IDC_RELOAD)) {
+ AddNavigationStatusListener(tab, reply_message, 1, false);
+ browser->Reload(CURRENT_TAB);
+ return;
+ }
+ }
+
+ AutomationMsg_Reload::WriteReplyParams(
+ reply_message, AUTOMATION_MSG_NAVIGATION_ERROR);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::SetAuth(int tab_handle,
+ const std::wstring& username,
+ const std::wstring& password,
+ IPC::Message* reply_message) {
+ if (tab_tracker_->ContainsHandle(tab_handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(tab_handle);
+ LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
+
+ if (iter != login_handler_map_.end()) {
+ // If auth is needed again after this, assume login has failed. This is
+ // not strictly correct, because a navigation can require both proxy and
+ // server auth, but it should be OK for now.
+ LoginHandler* handler = iter->second;
+ AddNavigationStatusListener(tab, reply_message, 1, false);
+ handler->SetAuth(username, password);
+ return;
+ }
+ }
+
+ AutomationMsg_SetAuth::WriteReplyParams(
+ reply_message, AUTOMATION_MSG_NAVIGATION_AUTH_NEEDED);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::CancelAuth(int tab_handle,
+ IPC::Message* reply_message) {
+ if (tab_tracker_->ContainsHandle(tab_handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(tab_handle);
+ LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
+
+ if (iter != login_handler_map_.end()) {
+ // If auth is needed again after this, something is screwy.
+ LoginHandler* handler = iter->second;
+ AddNavigationStatusListener(tab, reply_message, 1, false);
+ handler->CancelAuth();
+ return;
+ }
+ }
+
+ AutomationMsg_CancelAuth::WriteReplyParams(
+ reply_message, AUTOMATION_MSG_NAVIGATION_AUTH_NEEDED);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::NeedsAuth(int tab_handle, bool* needs_auth) {
+ *needs_auth = false;
+
+ if (tab_tracker_->ContainsHandle(tab_handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(tab_handle);
+ LoginHandlerMap::iterator iter = login_handler_map_.find(tab);
+
+ if (iter != login_handler_map_.end()) {
+ // The LoginHandler will be in our map IFF the tab needs auth.
+ *needs_auth = true;
+ }
+ }
+}
+
+void TestingAutomationProvider::GetRedirectsFrom(int tab_handle,
+ const GURL& source_url,
+ IPC::Message* reply_message) {
+ DCHECK(!redirect_query_) << "Can only handle one redirect query at once.";
+ if (tab_tracker_->ContainsHandle(tab_handle)) {
+ NavigationController* tab = tab_tracker_->GetResource(tab_handle);
+ HistoryService* history_service =
+ tab->profile()->GetHistoryService(Profile::EXPLICIT_ACCESS);
+
+ DCHECK(history_service) << "Tab " << tab_handle << "'s profile " <<
+ "has no history service";
+ if (history_service) {
+ DCHECK(reply_message_ == NULL);
+ reply_message_ = reply_message;
+ // Schedule a history query for redirects. The response will be sent
+ // asynchronously from the callback the history system uses to notify us
+ // that it's done: OnRedirectQueryComplete.
+ redirect_query_ = history_service->QueryRedirectsFrom(
+ source_url, &consumer_,
+ NewCallback(this,
+ &TestingAutomationProvider::OnRedirectQueryComplete));
+ return; // Response will be sent when query completes.
+ }
+ }
+
+ // Send failure response.
+ std::vector<GURL> empty;
+ AutomationMsg_RedirectsFrom::WriteReplyParams(reply_message, false, empty);
+ Send(reply_message);
+}
+
+void TestingAutomationProvider::GetBrowserWindowCount(int* window_count) {
+ *window_count = static_cast<int>(BrowserList::size());
+}
+
+void TestingAutomationProvider::GetNormalBrowserWindowCount(int* window_count) {
+ *window_count = static_cast<int>(
+ BrowserList::GetBrowserCountForType(profile_, Browser::TYPE_NORMAL));
+}
+
+// TODO(brettw) change this to accept GURLs when history supports it
+void TestingAutomationProvider::OnRedirectQueryComplete(
+ HistoryService::Handle request_handle,
+ GURL from_url,
+ bool success,
+ history::RedirectList* redirects) {
+ DCHECK(request_handle == redirect_query_);
+ DCHECK(reply_message_ != NULL);
+
+ std::vector<GURL> redirects_gurl;
+ reply_message_->WriteBool(success);
+ if (success) {
+ for (size_t i = 0; i < redirects->size(); i++)
+ redirects_gurl.push_back(redirects->at(i));
+ }
+
+ IPC::ParamTraits<std::vector<GURL> >::Write(reply_message_, redirects_gurl);
+
+ Send(reply_message_);
+ redirect_query_ = 0;
+ reply_message_ = NULL;
+}
+
void TestingAutomationProvider::OnBrowserAdded(const Browser* browser) {
}