Commit a323adbf authored by Tricia Crichton's avatar Tricia Crichton Committed by Commit Bot

[ChromeDriver] make GetCookies aware of frame

Pass currentFrameId to cookie operations where missing so that Cookie
operations run against the current execution context. This conforms with
WebDriver spec. This cl will affect only cases where the main context url and the frame URL are different.

Bug: chromedriver:3153
Change-Id: Idc4d14628ec5c00e153a3e75e38e3648cdc226a9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1987078Reviewed-by: default avatarJohn Chen <johnchen@chromium.org>
Commit-Queue: Tricia Crichton <triciac@chromium.org>
Cr-Commit-Position: refs/heads/master@{#734211}
parent 739383c2
...@@ -1914,6 +1914,29 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer): ...@@ -1914,6 +1914,29 @@ class ChromeDriverTest(ChromeDriverBaseTestWithWebServer):
self._driver.DeleteAllCookies() self._driver.DeleteAllCookies()
self.assertEquals(0, len(self._driver.GetCookies())) self.assertEquals(0, len(self._driver.GetCookies()))
def testCookieForFrame(self):
# Frame must have separate url than outer context for Cookies to be distinct
# the cross_domain_iframe with site-per-process fakes the needed setup
self._driver = self.CreateDriver(chrome_switches=['--site-per-process'])
self._driver.Load(self.GetHttpUrlForFile(
'/chromedriver/cross_domain_iframe.html'))
self._driver.AddCookie({'name': 'outer', 'value': 'main context'})
frame = self._driver.FindElement('tag name', 'iframe')
self._driver.SwitchToFrame(frame)
self.assertTrue(self.WaitForCondition(
lambda: 'outer.html' in
self._driver.ExecuteScript('return window.location.href')))
self._driver.AddCookie({'name': 'inner', 'value': 'frame context'})
cookies = self._driver.GetCookies()
self.assertEquals(1, len(cookies))
self.assertEquals('inner', cookies[0]['name'])
self._driver.SwitchToMainFrame()
cookies = self._driver.GetCookies()
self.assertEquals(1, len(cookies))
self.assertEquals('outer', cookies[0]['name'])
def testGetUrlOnInvalidUrl(self): def testGetUrlOnInvalidUrl(self):
# Make sure we don't return 'chrome-error://chromewebdata/' (see # Make sure we don't return 'chrome-error://chromewebdata/' (see
# https://bugs.chromium.org/p/chromedriver/issues/detail?id=1272). RFC 6761 # https://bugs.chromium.org/p/chromedriver/issues/detail?id=1272). RFC 6761
......
...@@ -251,10 +251,12 @@ std::unique_ptr<base::DictionaryValue> CreateDictionaryFrom( ...@@ -251,10 +251,12 @@ std::unique_ptr<base::DictionaryValue> CreateDictionaryFrom(
return dict; return dict;
} }
Status GetVisibleCookies(WebView* web_view, Status GetVisibleCookies(Session* session,
WebView* web_view,
std::list<Cookie>* cookies) { std::list<Cookie>* cookies) {
std::string current_page_url; std::string current_page_url;
Status status = GetUrl(web_view, std::string(), &current_page_url); Status status =
GetUrl(web_view, session->GetCurrentFrameId(), &current_page_url);
if (status.IsError()) if (status.IsError())
return status; return status;
std::unique_ptr<base::ListValue> internal_cookies; std::unique_ptr<base::ListValue> internal_cookies;
...@@ -1820,7 +1822,7 @@ Status ExecuteGetCookies(Session* session, ...@@ -1820,7 +1822,7 @@ Status ExecuteGetCookies(Session* session,
std::unique_ptr<base::Value>* value, std::unique_ptr<base::Value>* value,
Timeout* timeout) { Timeout* timeout) {
std::list<Cookie> cookies; std::list<Cookie> cookies;
Status status = GetVisibleCookies(web_view, &cookies); Status status = GetVisibleCookies(session, web_view, &cookies);
if (status.IsError()) if (status.IsError())
return status; return status;
std::unique_ptr<base::ListValue> cookie_list(new base::ListValue()); std::unique_ptr<base::ListValue> cookie_list(new base::ListValue());
...@@ -1842,7 +1844,7 @@ Status ExecuteGetNamedCookie(Session* session, ...@@ -1842,7 +1844,7 @@ Status ExecuteGetNamedCookie(Session* session,
return Status(kInvalidArgument, "missing 'cookie name'"); return Status(kInvalidArgument, "missing 'cookie name'");
std::list<Cookie> cookies; std::list<Cookie> cookies;
Status status = GetVisibleCookies(web_view, &cookies); Status status = GetVisibleCookies(session, web_view, &cookies);
if (status.IsError()) if (status.IsError())
return status; return status;
...@@ -1940,7 +1942,7 @@ Status ExecuteDeleteCookie(Session* session, ...@@ -1940,7 +1942,7 @@ Status ExecuteDeleteCookie(Session* session,
return status; return status;
std::list<Cookie> cookies; std::list<Cookie> cookies;
status = GetVisibleCookies(web_view, &cookies); status = GetVisibleCookies(session, web_view, &cookies);
if (status.IsError()) if (status.IsError())
return status; return status;
...@@ -1961,7 +1963,7 @@ Status ExecuteDeleteAllCookies(Session* session, ...@@ -1961,7 +1963,7 @@ Status ExecuteDeleteAllCookies(Session* session,
std::unique_ptr<base::Value>* value, std::unique_ptr<base::Value>* value,
Timeout* timeout) { Timeout* timeout) {
std::list<Cookie> cookies; std::list<Cookie> cookies;
Status status = GetVisibleCookies(web_view, &cookies); Status status = GetVisibleCookies(session, web_view, &cookies);
if (status.IsError()) if (status.IsError())
return status; return status;
......
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