Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: chrome/test/webdriver/webdriver_session.cc

Issue 8806030: Add commands to Chrome WebDriver for installing and manipulating extensions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/webdriver/webdriver_session.h ('k') | chrome/test/webdriver/webdriver_util.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/webdriver/webdriver_session.cc
diff --git a/chrome/test/webdriver/webdriver_session.cc b/chrome/test/webdriver/webdriver_session.cc
index 9ea256dd61bf410ea1e6a82e4ec83698e11fc80c..54427511402702156b568b5972db7762098f70c6 100644
--- a/chrome/test/webdriver/webdriver_session.cc
+++ b/chrome/test/webdriver/webdriver_session.cc
@@ -43,15 +43,11 @@
namespace webdriver {
-FrameId::FrameId(int window_id, const FramePath& frame_path)
- : window_id(window_id),
- frame_path(frame_path) {
-}
+FrameId::FrameId() {}
-FrameId& FrameId::operator=(const FrameId& other) {
- window_id = other.window_id;
- frame_path = other.frame_path;
- return *this;
+FrameId::FrameId(const WebViewId& view_id, const FramePath& frame_path)
+ : view_id(view_id),
+ frame_path(frame_path) {
}
Session::Options::Options()
@@ -64,7 +60,7 @@ Session::Options::~Options() {
Session::Session(const Options& options)
: id_(GenerateRandomID()),
- current_target_(FrameId(0, FramePath())),
+ current_target_(FrameId(WebViewId(), FramePath())),
thread_(id_.c_str()),
async_script_timeout_(0),
implicit_wait_(0),
@@ -115,7 +111,7 @@ Error* Session::AfterExecuteCommand() {
Error* error = NULL;
if (!options_.load_async) {
LOG(INFO) << "Waiting for the page to stop loading";
- error = WaitForAllTabsToStopLoading();
+ error = WaitForAllViewsToStopLoading();
LOG(INFO) << "Done waiting for the page to stop loading";
}
return error;
@@ -277,7 +273,7 @@ Error* Session::DragAndDropFilePaths(
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::DragAndDropFilePaths,
- current_target_.window_id,
+ current_target_.view_id,
location,
paths,
&error));
@@ -285,19 +281,23 @@ Error* Session::DragAndDropFilePaths(
}
Error* Session::NavigateToURL(const std::string& url) {
+ if (!current_target_.view_id.IsTab()) {
+ return new Error(kUnknownError,
+ "The current target does not support navigation");
+ }
Error* error = NULL;
if (options_.load_async) {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::NavigateToURLAsync,
- current_target_.window_id,
+ current_target_.view_id,
url,
&error));
} else {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::NavigateToURL,
- current_target_.window_id,
+ current_target_.view_id,
url,
&error));
}
@@ -305,31 +305,43 @@ Error* Session::NavigateToURL(const std::string& url) {
}
Error* Session::GoForward() {
+ if (!current_target_.view_id.IsTab()) {
+ return new Error(kUnknownError,
+ "The current target does not support navigation");
+ }
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::GoForward,
- current_target_.window_id,
+ current_target_.view_id,
&error));
return error;
}
Error* Session::GoBack() {
+ if (!current_target_.view_id.IsTab()) {
+ return new Error(kUnknownError,
+ "The current target does not support navigation");
+ }
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::GoBack,
- current_target_.window_id,
+ current_target_.view_id,
&error));
return error;
}
Error* Session::Reload() {
+ if (!current_target_.view_id.IsTab()) {
+ return new Error(kUnknownError,
+ "The current target does not support navigation");
+ }
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::Reload,
- current_target_.window_id,
+ current_target_.view_id,
&error));
return error;
}
@@ -350,7 +362,7 @@ Error* Session::GetTitle(std::string* tab_title) {
" else"
" return document.URL;"
"}";
- return ExecuteScriptAndParse(FrameId(current_target_.window_id, FramePath()),
+ return ExecuteScriptAndParse(FrameId(current_target_.view_id, FramePath()),
kGetTitleScript,
"getTitle",
new ListValue(),
@@ -363,7 +375,7 @@ Error* Session::MouseMoveAndClick(const Point& location,
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseClick,
- current_target_.window_id,
+ current_target_.view_id,
location,
button,
&error));
@@ -377,7 +389,7 @@ Error* Session::MouseMove(const Point& location) {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseMove,
- current_target_.window_id,
+ current_target_.view_id,
location,
&error));
if (!error)
@@ -391,7 +403,7 @@ Error* Session::MouseDrag(const Point& start,
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseDrag,
- current_target_.window_id,
+ current_target_.view_id,
start,
end,
&error));
@@ -409,7 +421,7 @@ Error* Session::MouseButtonDown() {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseButtonDown,
- current_target_.window_id,
+ current_target_.view_id,
mouse_position_,
&error));
return error;
@@ -420,7 +432,7 @@ Error* Session::MouseButtonUp() {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseButtonUp,
- current_target_.window_id,
+ current_target_.view_id,
mouse_position_,
&error));
return error;
@@ -431,7 +443,7 @@ Error* Session::MouseDoubleClick() {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::MouseDoubleClick,
- current_target_.window_id,
+ current_target_.view_id,
mouse_position_,
&error));
return error;
@@ -472,61 +484,63 @@ Error* Session::SetCookie(const std::string& url,
return error;
}
-Error* Session::GetWindowIds(std::vector<int>* window_ids) {
+Error* Session::GetViews(std::vector<WebViewInfo>* views) {
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
- &Automation::GetTabIds,
- window_ids,
+ &Automation::GetViews,
+ views,
&error));
return error;
}
-Error* Session::SwitchToWindow(const std::string& name) {
- int switch_to_id = 0;
- int name_no = 0;
- if (base::StringToInt(name, &name_no)) {
- Error* error = NULL;
- bool does_exist = false;
+Error* Session::SwitchToView(const std::string& id_or_name) {
+ Error* error = NULL;
+ bool does_exist = false;
+
+ WebViewId new_view;
+ StringToWebViewId(id_or_name, &new_view);
+ if (new_view.IsValid()) {
RunSessionTask(NewRunnableMethod(
automation_.get(),
- &Automation::DoesTabExist,
- name_no,
+ &Automation::DoesViewExist,
+ new_view,
&does_exist,
&error));
if (error)
return error;
- if (does_exist)
- switch_to_id = name_no;
}
- if (!switch_to_id) {
- std::vector<int> window_ids;
- Error* error = GetWindowIds(&window_ids);
+ if (!does_exist) {
+ // See if any of the tab window names match |name|.
+ std::vector<WebViewInfo> views;
+ Error* error = GetViews(&views);
if (error)
return error;
- // See if any of the window names match |name|.
- for (size_t i = 0; i < window_ids.size(); ++i) {
+ for (size_t i = 0; i < views.size(); ++i) {
+ if (!views[i].view_id.IsTab())
+ continue;
std::string window_name;
Error* error = ExecuteScriptAndParse(
- FrameId(window_ids[i], FramePath()),
+ FrameId(views[i].view_id, FramePath()),
"function() { return window.name; }",
"getWindowName",
new ListValue(),
CreateDirectValueParser(&window_name));
if (error)
return error;
- if (name == window_name) {
- switch_to_id = window_ids[i];
+ if (id_or_name == window_name) {
+ new_view = views[i].view_id;
+ does_exist = true;
break;
}
}
}
- if (!switch_to_id)
+ if (!does_exist)
return new Error(kNoSuchWindow);
frame_elements_.clear();
- current_target_ = FrameId(switch_to_id, FramePath());
+ current_target_ = FrameId(new_view, FramePath());
return NULL;
}
@@ -611,7 +625,7 @@ Error* Session::SwitchToTopFrameIfCurrentFrameInvalid() {
// This code should not execute script in any frame before making sure the
// frame element is valid, otherwise the automation hangs until a timeout.
for (size_t i = 0; i < frame_elements_.size(); ++i) {
- FrameId frame_id(current_target_.window_id, frame_path);
+ FrameId frame_id(current_target_.view_id, frame_path);
scoped_ptr<Error> error(ExecuteScriptAndParse(
frame_id,
"function(){ }",
@@ -632,14 +646,14 @@ Error* Session::CloseWindow() {
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
- &Automation::CloseTab,
- current_target_.window_id,
+ &Automation::CloseView,
+ current_target_.view_id,
&error));
if (!error) {
- std::vector<int> window_ids;
- scoped_ptr<Error> error(GetWindowIds(&window_ids));
- if (error.get() || window_ids.empty()) {
+ std::vector<WebViewInfo> views;
+ scoped_ptr<Error> error(GetViews(&views));
+ if (error.get() || views.empty()) {
// The automation connection will soon be closed, if not already,
// because we supposedly just closed the last window. Terminate the
// session.
@@ -780,7 +794,7 @@ Error* Session::GetElementRegionInView(
frame_path.IsSubframe();
frame_path = frame_path.Parent()) {
// Find the frame element for the current frame path.
- FrameId frame_id(current_target_.window_id, frame_path.Parent());
+ FrameId frame_id(current_target_.view_id, frame_path.Parent());
ElementId frame_element;
error = FindElement(
frame_id, ElementId(""),
@@ -988,13 +1002,13 @@ Error* Session::GetAttribute(const ElementId& element,
CreateDirectValueParser(value));
}
-Error* Session::WaitForAllTabsToStopLoading() {
+Error* Session::WaitForAllViewsToStopLoading() {
if (!automation_.get())
return NULL;
Error* error = NULL;
RunSessionTask(NewRunnableMethod(
automation_.get(),
- &Automation::WaitForAllTabsToStopLoading,
+ &Automation::WaitForAllViewsToStopLoading,
&error));
return error;
}
@@ -1009,24 +1023,77 @@ Error* Session::InstallExtensionDeprecated(const FilePath& path) {
return error;
}
-Error* Session::GetInstalledExtensions(
- std::vector<std::string>* extension_ids) {
+Error* Session::InstallExtension(
+ const FilePath& path, std::string* extension_id) {
Error* error = NULL;
RunSessionTask(base::Bind(
- &Automation::GetInstalledExtensions,
+ &Automation::InstallExtension,
base::Unretained(automation_.get()),
- extension_ids,
+ path,
+ extension_id,
&error));
return error;
}
-Error* Session::InstallExtension(
- const FilePath& path, std::string* extension_id) {
+Error* Session::GetExtensionsInfo(base::ListValue* extensions_list) {
Error* error = NULL;
RunSessionTask(base::Bind(
- &Automation::InstallExtension,
+ &Automation::GetExtensionsInfo,
+ base::Unretained(automation_.get()),
+ extensions_list,
+ &error));
+ return error;
+}
+
+Error* Session::IsPageActionVisible(
+ const WebViewId& tab_id,
+ const std::string& extension_id,
+ bool* is_visible) {
+ if (!tab_id.IsTab()) {
+ return new Error(
+ kUnknownError,
+ "The current target does not support page actions. Switch to a tab.");
+ }
+ Error* error = NULL;
+ RunSessionTask(base::Bind(
+ &Automation::IsPageActionVisible,
+ base::Unretained(automation_.get()),
+ tab_id,
+ extension_id,
+ is_visible,
+ &error));
+ return error;
+}
+
+Error* Session::SetExtensionState(
+ const std::string& extension_id, bool enable) {
+ Error* error = NULL;
+ RunSessionTask(base::Bind(
+ &Automation::SetExtensionState,
+ base::Unretained(automation_.get()),
+ extension_id,
+ enable,
+ &error));
+ return error;
+}
+
+Error* Session::ClickExtensionButton(
+ const std::string& extension_id, bool browser_action) {
+ Error* error = NULL;
+ RunSessionTask(base::Bind(
+ &Automation::ClickExtensionButton,
+ base::Unretained(automation_.get()),
+ extension_id,
+ browser_action,
+ &error));
+ return error;
+}
+
+Error* Session::UninstallExtension(const std::string& extension_id) {
+ Error* error = NULL;
+ RunSessionTask(base::Bind(
+ &Automation::UninstallExtension,
base::Unretained(automation_.get()),
- path,
extension_id,
&error));
return error;
@@ -1104,15 +1171,15 @@ void Session::InitOnSessionThread(const Automation::BrowserOptions& options,
if (*error)
return;
- std::vector<int> tab_ids;
- automation_->GetTabIds(&tab_ids, error);
+ std::vector<WebViewInfo> views;
+ automation_->GetViews(&views, error);
if (*error)
return;
- if (tab_ids.empty()) {
- *error = new Error(kUnknownError, "No tab ids after initialization");
+ if (views.empty()) {
+ *error = new Error(kUnknownError, "No view ids after initialization");
return;
}
- current_target_ = FrameId(tab_ids[0], FramePath());
+ current_target_ = FrameId(views[0].view_id, FramePath());
}
void Session::TerminateOnSessionThread() {
@@ -1129,7 +1196,7 @@ Error* Session::ExecuteScriptAndParseValue(const FrameId& frame_id,
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::ExecuteScript,
- frame_id.window_id,
+ frame_id.view_id,
frame_id.frame_path,
script,
&response_json,
@@ -1186,13 +1253,14 @@ void Session::SendKeysOnSessionThread(const string16& keys, Error** error) {
if (key_events[i].type != automation::kRawKeyDownType)
continue;
automation_->SendNativeKeyEvent(
- current_target_.window_id,
+ current_target_.view_id,
key_events[i].key_code,
key_events[i].modifiers,
error);
} else {
automation_->SendWebKeyEvent(
- current_target_.window_id, key_events[i], error);
+ current_target_.view_id,
+ key_events[i], error);
}
if (*error) {
std::string details = base::StringPrintf(
@@ -1437,6 +1505,10 @@ Error* Session::GetElementRegionInViewHelper(
}
Error* Session::GetScreenShot(std::string* png) {
+ if (!current_target_.view_id.IsTab()) {
+ return new Error(kUnknownError,
+ "The current target does not support screenshot");
+ }
Error* error = NULL;
ScopedTempDir screenshots_dir;
if (!screenshots_dir.CreateUniqueTempDir()) {
@@ -1448,7 +1520,7 @@ Error* Session::GetScreenShot(std::string* png) {
RunSessionTask(NewRunnableMethod(
automation_.get(),
&Automation::CaptureEntirePageAsPNG,
- current_target_.window_id,
+ current_target_.view_id,
path,
&error));
if (error)
« no previous file with comments | « chrome/test/webdriver/webdriver_session.h ('k') | chrome/test/webdriver/webdriver_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698