Index: chrome/test/webdriver/commands/cookie_commands.cc |
diff --git a/chrome/test/webdriver/commands/cookie_commands.cc b/chrome/test/webdriver/commands/cookie_commands.cc |
index 38d4ecae2748e973fd0732273521966ff5ad98cd..c91d440c32a06ec9e5f5b6724ddc44ecf960e1a5 100644 |
--- a/chrome/test/webdriver/commands/cookie_commands.cc |
+++ b/chrome/test/webdriver/commands/cookie_commands.cc |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// 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. |
@@ -8,6 +8,7 @@ |
#include <vector> |
#include "base/scoped_ptr.h" |
+#include "base/string_split.h" |
#include "base/string_util.h" |
#include "base/values.h" |
#include "chrome/test/webdriver/cookie.h" |
@@ -15,6 +16,12 @@ |
#include "chrome/test/webdriver/session_manager.h" |
#include "chrome/test/webdriver/commands/response.h" |
+namespace { |
+// The first build number that the new automation JSON interface for setting, |
+// deleting, and getting detailed cookies is availble for. |
+const int kNewInterfaceBuildNo = 720; |
+} |
+ |
namespace webdriver { |
CookieCommand::CookieCommand(const std::vector<std::string>& path_segments, |
@@ -24,16 +31,20 @@ CookieCommand::CookieCommand(const std::vector<std::string>& path_segments, |
CookieCommand::~CookieCommand() {} |
bool CookieCommand::Init(Response* const response) { |
- if (WebDriverCommand::Init(response)) { |
- if (session_->GetURL(¤t_url_)) { |
- return true; |
- } |
+ if (!WebDriverCommand::Init(response)) |
+ return false; |
+ if (!session_->CompareBrowserVersion(kNewInterfaceBuildNo, 0, |
+ &uses_new_interface_)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to check Chrome version number", |
+ kUnknownError); |
+ return false; |
+ } |
+ if (!session_->GetURL(¤t_url_)) { |
SET_WEBDRIVER_ERROR(response, "Failed to query current page URL", |
kInternalServerError); |
return false; |
} |
- |
- return false; |
+ return true; |
} |
bool CookieCommand::DoesDelete() { |
@@ -49,35 +60,41 @@ bool CookieCommand::DoesPost() { |
} |
void CookieCommand::ExecuteGet(Response* const response) { |
- // TODO(JMikhail): Add GetJSONCookies to automation proxy since |
- // GetCookies does not return the necessary information |
- std::string cookies; |
- std::vector<std::string> tokens; |
- |
- if (!session_->GetCookies(current_url_, &cookies)) { |
- SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
- kUnknownError); |
- return; |
- } |
- |
- // Note that ';' separates cookies while ':' separates name/value pairs. |
- Tokenize(cookies, ";", &tokens); |
- scoped_ptr<ListValue> cookie_list(new ListValue()); |
- for (std::vector<std::string>::iterator i = tokens.begin(); |
- i != tokens.end(); ++i) { |
- Cookie cookie(*i); |
- if (cookie.valid()) { |
- cookie_list->Append(cookie.ToDictionary()); |
- } else { |
- LOG(ERROR) << "Failed to parse cookie: " << *i; |
- SET_WEBDRIVER_ERROR(response, "Could not get all cookies", |
- kInternalServerError); |
+ if (uses_new_interface_) { |
+ ListValue* cookies; |
+ if (!session_->GetCookies(current_url_.possibly_invalid_spec(), &cookies)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
+ kUnknownError); |
+ return; |
+ } |
+ response->SetStatus(kSuccess); |
+ response->SetValue(cookies); |
+ } else { |
+ std::string cookies; |
+ std::vector<std::string> tokens; |
+ if (!session_->GetCookiesDeprecated(current_url_, &cookies)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
+ kUnknownError); |
return; |
} |
+ // Note that ';' separates cookies while ':' separates name/value pairs. |
+ Tokenize(cookies, ";", &tokens); |
+ scoped_ptr<ListValue> cookie_list(new ListValue()); |
+ for (std::vector<std::string>::iterator i = tokens.begin(); |
+ i != tokens.end(); ++i) { |
+ Cookie cookie(*i); |
+ if (cookie.valid()) { |
+ cookie_list->Append(cookie.ToDictionary()); |
+ } else { |
+ LOG(ERROR) << "Failed to parse cookie: " << *i; |
+ SET_WEBDRIVER_ERROR(response, "Could not get all cookies", |
+ kInternalServerError); |
+ return; |
+ } |
+ } |
+ response->SetStatus(kSuccess); |
+ response->SetValue(cookie_list.release()); |
} |
- |
- response->SetStatus(kSuccess); |
- response->SetValue(cookie_list.release()); |
} |
void CookieCommand::ExecutePost(Response* const response) { |
@@ -91,52 +108,108 @@ void CookieCommand::ExecutePost(Response* const response) { |
kBadRequest); |
return; |
} |
- Cookie cookie(*cookie_dict); |
- // Make sure the cookie is formated preoperly. |
- if (!cookie.valid()) { |
- SET_WEBDRIVER_ERROR(response, "Invalid cookie", |
- kBadRequest); |
- return; |
- } |
+ if (uses_new_interface_) { |
+ std::string domain; |
+ if (cookie_dict->GetString("domain", &domain)) { |
+ std::vector<std::string> split_domain; |
+ base::SplitString(domain, ':', &split_domain); |
+ if (split_domain.size() > 2) { |
+ SET_WEBDRIVER_ERROR(response, "Cookie domain has too many colons", |
+ kInvalidCookieDomain); |
+ return; |
+ } else if (split_domain.size() == 2) { |
+ // Remove the port number. |
+ cookie_dict->SetString("domain", split_domain[0]); |
+ } |
+ } |
+ if (!session_->SetCookie(current_url_.possibly_invalid_spec(), |
+ cookie_dict)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to set cookie", |
+ kUnableToSetCookie); |
+ return; |
+ } |
+ } else { |
+ Cookie cookie(*cookie_dict); |
- if (!session_->SetCookie(current_url_, cookie.ToString())) { |
- SET_WEBDRIVER_ERROR(response, "Failed to set cookie", |
- kUnableToSetCookie); |
- return; |
- } |
+ // Make sure the cookie is formated preoperly. |
+ if (!cookie.valid()) { |
+ SET_WEBDRIVER_ERROR(response, "Invalid cookie", |
+ kBadRequest); |
+ return; |
+ } |
+ if (!session_->SetCookieDeprecated(current_url_, cookie.ToString())) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to set cookie", |
+ kUnableToSetCookie); |
+ return; |
+ } |
+ response->SetValue(new StringValue(cookie.ToString())); |
+ } |
response->SetStatus(kSuccess); |
- response->SetValue(new StringValue(cookie.ToString())); |
} |
void CookieCommand::ExecuteDelete(Response* const response) { |
- std::string cookies; |
- std::vector<std::string> tokens; |
+ if (uses_new_interface_) { |
+ ListValue* unscoped_cookies; |
+ if (!session_->GetCookies(current_url_.possibly_invalid_spec(), |
+ &unscoped_cookies)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
+ kUnknownError); |
+ return; |
+ } |
+ scoped_ptr<ListValue> cookies(unscoped_cookies); |
+ for (size_t i = 0; i < cookies->GetSize(); ++i) { |
+ DictionaryValue* cookie_dict; |
+ if (!cookies->GetDictionary(i, &cookie_dict)) { |
+ SET_WEBDRIVER_ERROR(response, "GetCookies returned non-dict type", |
+ kUnknownError); |
+ return; |
+ } |
+ std::string name; |
+ if (!cookie_dict->GetString("name", &name)) { |
+ SET_WEBDRIVER_ERROR( |
+ response, |
+ "GetCookies returned cookie with missing or invalid 'name'", |
+ kUnknownError); |
+ return; |
+ } |
+ if (!session_->DeleteCookie(current_url_.possibly_invalid_spec(), |
+ name)) { |
+ SET_WEBDRIVER_ERROR(response, "Could not delete all cookies", |
+ kUnknownError); |
+ return; |
+ } |
+ } |
+ } else { |
+ std::string cookies; |
+ std::vector<std::string> tokens; |
- if (!session_->GetCookies(current_url_, &cookies)) { |
- SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
- kUnableToSetCookie); |
- return; |
- } |
+ if (!session_->GetCookiesDeprecated(current_url_, &cookies)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to fetch cookies", |
+ kUnableToSetCookie); |
+ return; |
+ } |
- Tokenize(cookies, ":", &tokens); |
- for (std::vector<std::string>::iterator i = tokens.begin(); |
- i != tokens.end(); ++i) { |
- Cookie cookie(*i); |
- if (cookie.valid()) { |
- if (!session_->DeleteCookie(current_url_, cookie.name())) { |
- VLOG(1) << "Could not delete cookie: " << cookie.name() << "\n" |
- << "Contents of cookie: " << cookie.ToString(); |
+ Tokenize(cookies, ":", &tokens); |
+ for (std::vector<std::string>::iterator i = tokens.begin(); |
+ i != tokens.end(); ++i) { |
+ Cookie cookie(*i); |
+ if (cookie.valid()) { |
+ if (!session_->DeleteCookie(current_url_.possibly_invalid_spec(), |
+ cookie.name())) { |
+ VLOG(1) << "Could not delete cookie: " << cookie.name() << "\n" |
+ << "Contents of cookie: " << cookie.ToString(); |
+ SET_WEBDRIVER_ERROR(response, "Could not delete all cookies", |
+ kInternalServerError); |
+ return; |
+ } |
+ } else { |
+ LOG(ERROR) << "Failed to parse cookie: " << *i; |
SET_WEBDRIVER_ERROR(response, "Could not delete all cookies", |
kInternalServerError); |
return; |
} |
- } else { |
- LOG(ERROR) << "Failed to parse cookie: " << *i; |
- SET_WEBDRIVER_ERROR(response, "Could not delete all cookies", |
- kInternalServerError); |
- return; |
} |
} |
@@ -151,58 +224,55 @@ NamedCookieCommand::NamedCookieCommand( |
NamedCookieCommand::~NamedCookieCommand() {} |
bool NamedCookieCommand::Init(Response* const response) { |
- if (WebDriverCommand::Init(response)) { |
- if (!session_->GetURL(¤t_url_)) { |
- SET_WEBDRIVER_ERROR(response, "Failed to query current page URL", |
- kInternalServerError); |
- return false; |
- } |
+ if (!WebDriverCommand::Init(response)) |
+ return false; |
- // There should be at least 5 segments to match |
- // /session/:sessionId/cookie/:name |
- cookie_name_ = GetPathVariable(4); |
- if (cookie_name_ == "") { |
- SET_WEBDRIVER_ERROR(response, "No cookie name specified", |
- kBadRequest); |
- return false; |
- } |
+ if (!session_->CompareBrowserVersion(kNewInterfaceBuildNo, 0, |
+ &uses_new_interface_)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to check Chrome version number", |
+ kUnknownError); |
+ return false; |
+ } |
- return true; |
+ if (!session_->GetURL(¤t_url_)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to query current page URL", |
+ kInternalServerError); |
+ return false; |
} |
- return false; |
-} |
+ // There should be at least 5 segments to match |
+ // /session/:sessionId/cookie/:name |
+ cookie_name_ = GetPathVariable(4); |
+ if (cookie_name_ == "") { |
+ SET_WEBDRIVER_ERROR(response, "No cookie name specified", |
+ kBadRequest); |
+ return false; |
+ } |
-bool NamedCookieCommand::DoesDelete() { |
return true; |
} |
-bool NamedCookieCommand::DoesGet() { |
+bool NamedCookieCommand::DoesDelete() { |
return true; |
} |
-void NamedCookieCommand::ExecuteGet(Response* const response) { |
- std::string cookie; |
- |
- if (!session_->GetCookieByName(current_url_, cookie_name_, &cookie)) { |
- SET_WEBDRIVER_ERROR(response, "Failed to fetch cookie", |
- kUnknownError); |
- return; |
- } |
- |
- response->SetStatus(kSuccess); |
- response->SetValue(new StringValue(cookie)); |
-} |
- |
void NamedCookieCommand::ExecuteDelete(Response* const response) { |
- if (!session_->DeleteCookie(current_url_, cookie_name_)) { |
- SET_WEBDRIVER_ERROR(response, "Failed to delete cookie", |
- kUnknownError); |
- return; |
+ if (uses_new_interface_) { |
+ if (!session_->DeleteCookie(current_url_.possibly_invalid_spec(), |
+ cookie_name_)) { |
+ SET_WEBDRIVER_ERROR(response, |
+ "Failed to delete cookie", |
+ kUnknownError); |
+ return; |
+ } |
+ } else { |
+ if (!session_->DeleteCookieDeprecated(current_url_, cookie_name_)) { |
+ SET_WEBDRIVER_ERROR(response, "Failed to delete cookie", |
+ kUnknownError); |
+ return; |
+ } |
} |
- |
response->SetStatus(kSuccess); |
} |
} // namespace webdriver |
- |