Commit 9349e8fc authored by skyostil's avatar skyostil Committed by Commit bot

devtools: Split Network.getCookies into Network.get{All,}Cookies

This patch splits the Network.getCookies command into
Network.getCookies, which returns the cookies for the current URL and
Network.getAllCookies, which returns all the cookies in the cookie jar.

BUG=668932,166637

Review-Url: https://codereview.chromium.org/2568503002
Cr-Commit-Position: refs/heads/master@{#438198}
parent 775abc2d
...@@ -1487,9 +1487,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, SetAndGetCookies) { ...@@ -1487,9 +1487,7 @@ IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, SetAndGetCookies) {
EXPECT_EQ("mendacious", value); EXPECT_EQ("mendacious", value);
// Then get all the cookies in the cookie jar. // Then get all the cookies in the cookie jar.
command_params.reset(new base::DictionaryValue()); SendCommand("Network.getAllCookies", nullptr, true);
command_params->SetBoolean("global", true);
SendCommand("Network.getCookies", std::move(command_params), true);
EXPECT_TRUE(result_->HasKey("cookies")); EXPECT_TRUE(result_->HasKey("cookies"));
EXPECT_TRUE(result_->GetList("cookies", &cookies)); EXPECT_TRUE(result_->GetList("cookies", &cookies));
......
...@@ -29,6 +29,7 @@ namespace protocol { ...@@ -29,6 +29,7 @@ namespace protocol {
namespace { namespace {
using GetCookiesCallback = protocol::Network::Backend::GetCookiesCallback; using GetCookiesCallback = protocol::Network::Backend::GetCookiesCallback;
using GetAllCookiesCallback = protocol::Network::Backend::GetAllCookiesCallback;
using SetCookieCallback = protocol::Network::Backend::SetCookieCallback; using SetCookieCallback = protocol::Network::Backend::SetCookieCallback;
using DeleteCookieCallback = protocol::Network::Backend::DeleteCookieCallback; using DeleteCookieCallback = protocol::Network::Backend::DeleteCookieCallback;
...@@ -145,63 +146,19 @@ void SetCookieOnIO( ...@@ -145,63 +146,19 @@ void SetCookieOnIO(
base::Bind(&CookieSetOnIO, base::Passed(std::move(callback)))); base::Bind(&CookieSetOnIO, base::Passed(std::move(callback))));
} }
class GetCookiesCommand { template <typename Callback>
class GetCookiesCommandBase {
public: public:
GetCookiesCommand( GetCookiesCommandBase(std::unique_ptr<Callback> callback)
RenderFrameHostImpl* frame_host, : callback_(std::move(callback)), request_count_(0) {}
bool global,
std::unique_ptr<GetCookiesCallback> callback)
: callback_(std::move(callback)),
request_count_(0) {
net::CookieStore::GetCookieListCallback got_cookies_callback = base::Bind(
&GetCookiesCommand::GotCookiesForURL, base::Unretained(this));
if (global) {
request_count_ = 1;
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
&GetAllCookiesOnIO,
base::Unretained(frame_host->GetSiteInstance()->GetBrowserContext()->
GetResourceContext()),
base::Unretained(frame_host->GetProcess()->GetStoragePartition()->
GetURLRequestContext()),
got_cookies_callback));
return;
}
std::queue<FrameTreeNode*> queue;
queue.push(frame_host->frame_tree_node());
while (!queue.empty()) {
FrameTreeNode* node = queue.front();
queue.pop();
// Only traverse nodes with the same local root.
if (node->current_frame_host()->IsCrossProcessSubframe())
continue;
++request_count_;
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(
&GetCookiesForURLOnIO,
base::Unretained(frame_host->GetSiteInstance()->GetBrowserContext()->
GetResourceContext()),
base::Unretained(frame_host->GetProcess()->GetStoragePartition()->
GetURLRequestContext()),
node->current_url(),
got_cookies_callback));
for (size_t i = 0; i < node->child_count(); ++i)
queue.push(node->child_at(i));
}
}
private: protected:
void GotCookiesForURL(const net::CookieList& cookie_list) { void GotCookiesForURL(const net::CookieList& cookie_list) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
for (const net::CanonicalCookie& cookie : cookie_list) { for (const net::CanonicalCookie& cookie : cookie_list) {
std::string key = base::StringPrintf( std::string key = base::StringPrintf(
"%s::%s::%s::%d", "%s::%s::%s::%d", cookie.Name().c_str(), cookie.Domain().c_str(),
cookie.Name().c_str(), cookie.Path().c_str(), cookie.IsSecure());
cookie.Domain().c_str(),
cookie.Path().c_str(),
cookie.IsSecure());
cookies_[key] = cookie; cookies_[key] = cookie;
} }
--request_count_; --request_count_;
...@@ -244,11 +201,69 @@ class GetCookiesCommand { ...@@ -244,11 +201,69 @@ class GetCookiesCommand {
callback_->sendSuccess(std::move(cookies)); callback_->sendSuccess(std::move(cookies));
} }
std::unique_ptr<GetCookiesCallback> callback_; std::unique_ptr<Callback> callback_;
int request_count_; int request_count_;
base::hash_map<std::string, net::CanonicalCookie> cookies_; base::hash_map<std::string, net::CanonicalCookie> cookies_;
}; };
class GetCookiesCommand : public GetCookiesCommandBase<GetCookiesCallback> {
public:
GetCookiesCommand(RenderFrameHostImpl* frame_host,
std::unique_ptr<GetCookiesCallback> callback)
: GetCookiesCommandBase(std::move(callback)) {
net::CookieStore::GetCookieListCallback got_cookies_callback = base::Bind(
&GetCookiesCommand::GotCookiesForURL, base::Unretained(this));
std::queue<FrameTreeNode*> queue;
queue.push(frame_host->frame_tree_node());
while (!queue.empty()) {
FrameTreeNode* node = queue.front();
queue.pop();
// Only traverse nodes with the same local root.
if (node->current_frame_host()->IsCrossProcessSubframe())
continue;
++request_count_;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&GetCookiesForURLOnIO,
base::Unretained(frame_host->GetSiteInstance()
->GetBrowserContext()
->GetResourceContext()),
base::Unretained(frame_host->GetProcess()
->GetStoragePartition()
->GetURLRequestContext()),
node->current_url(), got_cookies_callback));
for (size_t i = 0; i < node->child_count(); ++i)
queue.push(node->child_at(i));
}
}
};
class GetAllCookiesCommand
: public GetCookiesCommandBase<GetAllCookiesCallback> {
public:
GetAllCookiesCommand(RenderFrameHostImpl* frame_host,
std::unique_ptr<GetAllCookiesCallback> callback)
: GetCookiesCommandBase(std::move(callback)) {
net::CookieStore::GetCookieListCallback got_cookies_callback = base::Bind(
&GetAllCookiesCommand::GotCookiesForURL, base::Unretained(this));
request_count_ = 1;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&GetAllCookiesOnIO,
base::Unretained(frame_host->GetSiteInstance()
->GetBrowserContext()
->GetResourceContext()),
base::Unretained(frame_host->GetProcess()
->GetStoragePartition()
->GetURLRequestContext()),
got_cookies_callback));
}
};
} // namespace } // namespace
NetworkHandler::NetworkHandler() NetworkHandler::NetworkHandler()
...@@ -290,12 +305,19 @@ Response NetworkHandler::ClearBrowserCookies() { ...@@ -290,12 +305,19 @@ Response NetworkHandler::ClearBrowserCookies() {
} }
void NetworkHandler::GetCookies( void NetworkHandler::GetCookies(
Maybe<bool> global,
std::unique_ptr<GetCookiesCallback> callback) { std::unique_ptr<GetCookiesCallback> callback) {
if (!host_) if (!host_)
callback->sendFailure(Response::InternalError()); callback->sendFailure(Response::InternalError());
else else
new GetCookiesCommand(host_, global.fromMaybe(false), std::move(callback)); new GetCookiesCommand(host_, std::move(callback));
}
void NetworkHandler::GetAllCookies(
std::unique_ptr<GetAllCookiesCallback> callback) {
if (!host_)
callback->sendFailure(Response::InternalError());
else
new GetAllCookiesCommand(host_, std::move(callback));
} }
void NetworkHandler::SetCookie( void NetworkHandler::SetCookie(
......
...@@ -30,8 +30,8 @@ class NetworkHandler : public Network::Backend { ...@@ -30,8 +30,8 @@ class NetworkHandler : public Network::Backend {
Response ClearBrowserCache() override; Response ClearBrowserCache() override;
Response ClearBrowserCookies() override; Response ClearBrowserCookies() override;
void GetCookies(Maybe<bool> global, void GetCookies(std::unique_ptr<GetCookiesCallback> callback) override;
std::unique_ptr<GetCookiesCallback> callback) override; void GetAllCookies(std::unique_ptr<GetAllCookiesCallback> callback) override;
void DeleteCookie(const std::string& cookie_name, void DeleteCookie(const std::string& cookie_name,
const std::string& url, const std::string& url,
std::unique_ptr<DeleteCookieCallback> callback) override; std::unique_ptr<DeleteCookieCallback> callback) override;
......
...@@ -32,10 +32,10 @@ ...@@ -32,10 +32,10 @@
}, },
{ {
"domain": "Network", "domain": "Network",
"include": ["enable", "disable", "clearBrowserCache", "clearBrowserCookies", "getCookies", "deleteCookie", "setCookie", "canEmulateNetworkConditions"], "include": ["enable", "disable", "clearBrowserCache", "clearBrowserCookies", "getCookies", "getAllCookies", "deleteCookie", "setCookie", "canEmulateNetworkConditions"],
"include_types": ["CookieSameSite", "Cookie"], "include_types": ["CookieSameSite", "Cookie"],
"include_events": [], "include_events": [],
"async": ["getCookies", "deleteCookie", "setCookie"] "async": ["getCookies", "getAllCookies", "deleteCookie", "setCookie"]
}, },
{ {
"domain": "Page", "domain": "Page",
......
...@@ -1227,9 +1227,14 @@ ...@@ -1227,9 +1227,14 @@
}, },
{ {
"name": "getCookies", "name": "getCookies",
"parameters": [ "returns": [
{ "name": "global", "type": "boolean", "optional": true, "description": "If true, returns all cookies, otherwise only the cookies for the current URL." } { "name": "cookies", "type": "array", "items": { "$ref": "Cookie" }, "description": "Array of cookie objects." }
], ],
"description": "Returns all browser cookies for the current URL. Depending on the backend support, will return detailed cookie information in the <code>cookies</code> field.",
"experimental": true
},
{
"name": "getAllCookies",
"returns": [ "returns": [
{ "name": "cookies", "type": "array", "items": { "$ref": "Cookie" }, "description": "Array of cookie objects." } { "name": "cookies", "type": "array", "items": { "$ref": "Cookie" }, "description": "Array of cookie objects." }
], ],
......
...@@ -89,7 +89,7 @@ ...@@ -89,7 +89,7 @@
}, },
{ {
"domain": "Network", "domain": "Network",
"exclude": ["clearBrowserCache", "clearBrowserCookies", "getCookies", "deleteCookie", "setCookie", "canEmulateNetworkConditions"], "exclude": ["clearBrowserCache", "clearBrowserCookies", "getCookies", "getAllCookies", "deleteCookie", "setCookie", "canEmulateNetworkConditions"],
"async": ["getResponseBody"] "async": ["getResponseBody"]
}, },
{ {
......
...@@ -384,10 +384,8 @@ SDK.Cookies.getCookiesAsync = function(callback) { ...@@ -384,10 +384,8 @@ SDK.Cookies.getCookiesAsync = function(callback) {
} }
var barrier = new CallbackBarrier(); var barrier = new CallbackBarrier();
for (var target of SDK.targetManager.targets(SDK.Target.Capability.Network)) { for (var target of SDK.targetManager.targets(SDK.Target.Capability.Network))
var global = false; target.networkAgent().getCookies(barrier.createCallback(mycallback.bind(null, target)));
target.networkAgent().getCookies(global, barrier.createCallback(mycallback.bind(null, target)));
}
barrier.callWhenDone(callback.bind(null, allCookies)); barrier.callWhenDone(callback.bind(null, allCookies));
}; };
......
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