Commit d10c3182 authored by Gauri Manikpure's avatar Gauri Manikpure Committed by Commit Bot

[Chromedriver] Implement Get Named Cookie command.

Bug: chromedriver:1879
Change-Id: I09672785cd3c2821755479a21856ff68ca9266db
Reviewed-on: https://chromium-review.googlesource.com/572367
Commit-Queue: Gauri Manikpure <gmanikpure@chromium.org>
Reviewed-by: default avatarJohn Budorick <jbudorick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#487243}
parent 2b4b718d
......@@ -60,6 +60,8 @@ const char* DefaultMessageForStatusCode(StatusCode code) {
return "forbidden";
case kTabCrashed:
return "tab crashed";
case kNoSuchCookie:
return "no such cookie";
default:
return "<unknown>";
}
......
......@@ -34,6 +34,7 @@ enum StatusCode {
kDisconnected,
kForbidden = 103,
kTabCrashed,
kNoSuchCookie,
};
// Represents a WebDriver status, which may be an error or ok.
......
......@@ -51,6 +51,8 @@ class UnexpectedAlertOpen(ChromeDriverException):
pass
class NoAlertOpen(ChromeDriverException):
pass
class NoSuchCookie(ChromeDriverException):
pass
def _ExceptionForLegacyResponse(response):
exception_class_map = {
......@@ -71,7 +73,8 @@ def _ExceptionForLegacyResponse(response):
27: NoAlertOpen,
28: ScriptTimeout,
32: InvalidSelector,
33: SessionNotCreatedException
33: SessionNotCreatedException,
105: NoSuchCookie
}
status = response['status']
msg = response['value']['message']
......@@ -96,7 +99,8 @@ def _ExceptionForStandardResponse(response):
'no alert open': NoAlertOpen,
'asynchronous script timeout': ScriptTimeout,
'invalid selector': InvalidSelector,
'session not created exception': SessionNotCreatedException
'session not created exception': SessionNotCreatedException,
'no such cookie': NoSuchCookie
}
error = response['error']
......@@ -399,6 +403,9 @@ class ChromeDriver(object):
def GetCookies(self):
return self.ExecuteCommand(Command.GET_COOKIES)
def GetNamedCookie(self, name):
return self.ExecuteCommand(Command.GET_NAMED_COOKIE, {'name': name})
def AddCookie(self, cookie):
self.ExecuteCommand(Command.ADD_COOKIE, {'cookie': cookie})
......
......@@ -67,6 +67,7 @@ class Command(object):
ELEMENT_EQUALS = (
_Method.GET, '/session/:sessionId/element/:id/equals/:other')
GET_COOKIES = (_Method.GET, '/session/:sessionId/cookie')
GET_NAMED_COOKIE = (_Method.GET, '/session/:sessionId/cookie/:name')
ADD_COOKIE = (_Method.POST, '/session/:sessionId/cookie')
DELETE_ALL_COOKIES = (_Method.DELETE, '/session/:sessionId/cookie')
DELETE_COOKIE = (_Method.DELETE, '/session/:sessionId/cookie/:name')
......
......@@ -299,6 +299,10 @@ HttpHandler::HttpHandler(
kGet,
"session/:sessionId/cookie",
WrapToCommand("GetCookies", base::Bind(&ExecuteGetCookies))),
CommandMapping(
kGet,
"session/:sessionId/cookie/:name",
WrapToCommand("GetNamedCookie", base::Bind(&ExecuteGetNamedCookie))),
CommandMapping(kPost,
"session/:sessionId/cookie",
WrapToCommand("AddCookie", base::Bind(&ExecuteAddCookie))),
......@@ -809,6 +813,7 @@ HttpHandler::PrepareStandardResponse(
case kNoSuchSession:
case kNoSuchElement:
case kUnknownCommand:
case kNoSuchCookie:
response.reset(new net::HttpServerResponseInfo(net::HTTP_NOT_FOUND));
break;
case kTimeout:
......
......@@ -1396,6 +1396,17 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer):
if cookie['name'] == 'x':
self.assertEquals('/chromedriver/long_url' , cookie['path'])
def testGetNamedCookie(self):
self._driver.Load(self.GetHttpUrlForFile(
'/chromedriver/empty.html'))
self._driver.AddCookie({'name': 'a', 'value': 'b'})
named_cookie = self._driver.GetNamedCookie('a')
self.assertEquals('a' , named_cookie['name'])
self.assertEquals('b' , named_cookie['value'])
self.assertRaisesRegexp(
chromedriver.NoSuchCookie, "no such cookie",
self._driver.GetNamedCookie, 'foo')
def testGetUrlOnInvalidUrl(self):
# Make sure we don't return 'data:text/html,chromewebdata' (see
# https://bugs.chromium.org/p/chromedriver/issues/detail?id=1272). RFC 6761
......
......@@ -955,6 +955,30 @@ Status ExecuteGetCookies(Session* session,
return Status(kOk);
}
Status ExecuteGetNamedCookie(Session* session,
WebView* web_view,
const base::DictionaryValue& params,
std::unique_ptr<base::Value>* value,
Timeout* timeout) {
std::string name;
if (!params.GetString("name", &name))
return Status(kUnknownError, "missing 'cookie name'");
std::list<Cookie> cookies;
Status status = GetVisibleCookies(web_view, &cookies);
if (status.IsError())
return status;
for (std::list<Cookie>::const_iterator it = cookies.begin();
it != cookies.end(); ++it) {
if (name == it->name) {
value->reset(CreateDictionaryFrom(*it)->DeepCopy());
return Status(kOk);
}
}
return Status(kNoSuchCookie);
}
Status ExecuteAddCookie(Session* session,
WebView* web_view,
const base::DictionaryValue& params,
......
......@@ -287,6 +287,13 @@ Status ExecuteGetCookies(Session* session,
std::unique_ptr<base::Value>* value,
Timeout* timeout);
// Retrieve a single cookie with the requested name.
Status ExecuteGetNamedCookie(Session* session,
WebView* web_view,
const base::DictionaryValue& params,
std::unique_ptr<base::Value>* value,
Timeout* timeout);
// Set a cookie. If the cookie path is not specified, it should be set to "/".
// If the domain is omitted, it should default to the current page's domain.
Status ExecuteAddCookie(Session* session,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment