Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/devtools/protocol/network_handler.h" | 5 #include "content/browser/devtools/protocol/network_handler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 25 #include "net/cert/x509_cert_types.h" | 25 #include "net/cert/x509_cert_types.h" |
| 26 #include "net/cert/x509_certificate.h" | 26 #include "net/cert/x509_certificate.h" |
| 27 #include "net/cookies/cookie_store.h" | 27 #include "net/cookies/cookie_store.h" |
| 28 #include "net/url_request/url_request_context.h" | 28 #include "net/url_request/url_request_context.h" |
| 29 #include "net/url_request/url_request_context_getter.h" | 29 #include "net/url_request/url_request_context_getter.h" |
| 30 | 30 |
| 31 namespace content { | 31 namespace content { |
| 32 namespace devtools { | 32 namespace devtools { |
| 33 namespace network { | 33 namespace network { |
| 34 | 34 |
| 35 using Response = DevToolsProtocolClient::Response; | |
| 35 using CookieListCallback = net::CookieStore::GetCookieListCallback; | 36 using CookieListCallback = net::CookieStore::GetCookieListCallback; |
| 36 | 37 |
| 37 namespace { | 38 namespace { |
| 38 | 39 |
| 39 net::URLRequestContext* GetRequestContextOnIO( | 40 net::URLRequestContext* GetRequestContextOnIO( |
| 40 ResourceContext* resource_context, | 41 ResourceContext* resource_context, |
| 41 net::URLRequestContextGetter* context_getter, | 42 net::URLRequestContextGetter* context_getter, |
| 42 const GURL& url) { | 43 const GURL& url) { |
| 43 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 44 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 44 net::URLRequestContext* context = | 45 net::URLRequestContext* context = |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 119 BrowserThread::IO, | 120 BrowserThread::IO, |
| 120 FROM_HERE, | 121 FROM_HERE, |
| 121 base::Bind(&DeleteCookieOnIO, | 122 base::Bind(&DeleteCookieOnIO, |
| 122 base::Unretained(resource_context), | 123 base::Unretained(resource_context), |
| 123 base::Unretained(context_getter), | 124 base::Unretained(context_getter), |
| 124 url, | 125 url, |
| 125 cookie_name, | 126 cookie_name, |
| 126 callback)); | 127 callback)); |
| 127 } | 128 } |
| 128 | 129 |
| 130 void CookieSetOnIO(const base::Closure& callback, bool success) { | |
|
dgozman
2016/08/09 01:07:25
Let's send an error over protocol if !success.
allada
2016/08/10 02:46:54
Done.
| |
| 131 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 132 BrowserThread::PostTask( | |
| 133 BrowserThread::UI, | |
| 134 FROM_HERE, | |
| 135 callback); | |
| 136 } | |
| 137 | |
| 138 void SetCookieOnIO( | |
| 139 ResourceContext* resource_context, | |
| 140 net::URLRequestContextGetter* context_getter, | |
| 141 const GURL& url, const std::string& name, const std::string& value, | |
| 142 const std::string& domain, const std::string& path, bool secure, | |
| 143 bool httpOnly, net::CookieSameSite sameSite, base::Time expires, | |
| 144 const base::Closure& callback) { | |
| 145 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 146 net::URLRequestContext* request_context = | |
| 147 GetRequestContextOnIO(resource_context, context_getter, url); | |
| 148 | |
| 149 bool are_experimental_cookie_features_enabled = | |
| 150 request_context->network_delegate() | |
| 151 ->AreExperimentalCookieFeaturesEnabled(); | |
| 152 | |
| 153 request_context->cookie_store()->SetCookieWithDetailsAsync( | |
| 154 url, name, value, domain, path, | |
| 155 base::Time(), | |
| 156 expires, | |
| 157 base::Time(), | |
| 158 secure, | |
| 159 httpOnly, | |
| 160 sameSite, | |
| 161 are_experimental_cookie_features_enabled, | |
| 162 net::COOKIE_PRIORITY_DEFAULT, | |
| 163 base::Bind(&CookieSetOnIO, callback)); | |
| 164 } | |
| 165 | |
| 166 void SetCookieOnUI( | |
| 167 ResourceContext* resource_context, | |
| 168 net::URLRequestContextGetter* context_getter, | |
| 169 const GURL& url, const std::string& name, const std::string& value, | |
| 170 const std::string& domain, const std::string& path, bool secure, | |
| 171 bool httpOnly, net::CookieSameSite sameSite, base::Time expires, | |
| 172 const base::Closure& callback) { | |
| 173 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 174 BrowserThread::PostTask( | |
| 175 BrowserThread::IO, | |
| 176 FROM_HERE, | |
| 177 base::Bind(&SetCookieOnIO, | |
| 178 base::Unretained(resource_context), | |
| 179 base::Unretained(context_getter), | |
| 180 url, name, value, domain, path, secure, httpOnly, | |
| 181 sameSite, expires, callback)); | |
| 182 } | |
| 183 | |
| 129 class GetCookiesCommand { | 184 class GetCookiesCommand { |
| 130 public: | 185 public: |
| 131 explicit GetCookiesCommand( | 186 explicit GetCookiesCommand( |
| 132 RenderFrameHostImpl* frame_host, | 187 RenderFrameHostImpl* frame_host, |
| 133 const CookieListCallback& callback) | 188 const CookieListCallback& callback) |
| 134 : callback_(callback), | 189 : callback_(callback), |
| 135 request_count_(0) { | 190 request_count_(0) { |
| 136 CookieListCallback got_cookies_callback = base::Bind( | 191 CookieListCallback got_cookies_callback = base::Bind( |
| 137 &GetCookiesCommand::GotCookiesForURL, base::Unretained(this)); | 192 &GetCookiesCommand::GotCookiesForURL, base::Unretained(this)); |
| 138 | 193 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 213 | 268 |
| 214 Response NetworkHandler::ClearBrowserCookies() { | 269 Response NetworkHandler::ClearBrowserCookies() { |
| 215 if (host_) | 270 if (host_) |
| 216 GetContentClient()->browser()->ClearCookies(host_); | 271 GetContentClient()->browser()->ClearCookies(host_); |
| 217 return Response::OK(); | 272 return Response::OK(); |
| 218 } | 273 } |
| 219 | 274 |
| 220 Response NetworkHandler::GetCookies(DevToolsCommandId command_id) { | 275 Response NetworkHandler::GetCookies(DevToolsCommandId command_id) { |
| 221 if (!host_) | 276 if (!host_) |
| 222 return Response::InternalError("Could not connect to view"); | 277 return Response::InternalError("Could not connect to view"); |
| 278 | |
| 223 new GetCookiesCommand( | 279 new GetCookiesCommand( |
| 224 host_, | 280 host_, |
| 225 base::Bind(&NetworkHandler::SendGetCookiesResponse, | 281 base::Bind(&NetworkHandler::SendGetCookiesResponse, |
| 226 weak_factory_.GetWeakPtr(), | 282 weak_factory_.GetWeakPtr(), |
| 227 command_id)); | 283 command_id)); |
| 228 return Response::OK(); | 284 return Response::OK(); |
| 229 } | 285 } |
| 230 | 286 |
| 287 Response NetworkHandler::SetCookie(DevToolsCommandId command_id, | |
| 288 const std::string& url, const std::string& name, | |
| 289 const std::string& value, const std::string* domain, | |
| 290 const std::string* path, bool* secure, bool* httpOnly, | |
| 291 const std::string* sameSite, double* expires) { | |
| 292 if (!host_) | |
| 293 return Response::InternalError("Could not connect to view"); | |
| 294 | |
| 295 net::CookieSameSite sameSiteEnum = net::CookieSameSite::DEFAULT_MODE; | |
| 296 if (sameSite && *sameSite == "lax") | |
|
dgozman
2016/08/09 01:07:24
There are generated constants for all enums in pro
allada
2016/08/10 02:46:54
Done.
| |
| 297 sameSiteEnum = net::CookieSameSite::LAX_MODE; | |
| 298 else if (sameSite && *sameSite == "strict") | |
| 299 sameSiteEnum = net::CookieSameSite::STRICT_MODE; | |
| 300 | |
| 301 base::Time expirationDate; | |
| 302 if (expires) | |
| 303 expirationDate = (*expires == 0) | |
| 304 ? base::Time::UnixEpoch() | |
| 305 : base::Time::FromDoubleT(*expires); | |
| 306 | |
| 307 SetCookieOnUI( | |
| 308 host_->GetSiteInstance()->GetBrowserContext()->GetResourceContext(), | |
| 309 host_->GetProcess()->GetStoragePartition()->GetURLRequestContext(), | |
| 310 GURL(url), name, value, | |
| 311 domain ? *domain : std::string(), path ? *path : std::string(), | |
| 312 secure ? *secure : false, httpOnly ? *httpOnly : false, | |
| 313 sameSiteEnum, expirationDate, | |
| 314 base::Bind(&NetworkHandler::SendSetCookieResponse, | |
| 315 weak_factory_.GetWeakPtr(), | |
| 316 command_id)); | |
| 317 return Response::OK(); | |
| 318 } | |
| 319 | |
| 320 void NetworkHandler::SendSetCookieResponse(DevToolsCommandId command_id) { | |
| 321 client_->SendSetCookieResponse(command_id, | |
| 322 SetCookieResponse::Create()); | |
| 323 } | |
| 324 | |
| 231 void NetworkHandler::SendGetCookiesResponse( | 325 void NetworkHandler::SendGetCookiesResponse( |
| 232 DevToolsCommandId command_id, | 326 DevToolsCommandId command_id, |
| 233 const net::CookieList& cookie_list) { | 327 const net::CookieList& cookie_list) { |
| 234 std::vector<scoped_refptr<Cookie>> cookies; | 328 std::vector<scoped_refptr<Cookie>> cookies; |
| 235 for (size_t i = 0; i < cookie_list.size(); ++i) { | 329 for (size_t i = 0; i < cookie_list.size(); ++i) { |
| 236 const net::CanonicalCookie& cookie = cookie_list[i]; | 330 const net::CanonicalCookie& cookie = cookie_list[i]; |
| 237 scoped_refptr<Cookie> devtools_cookie = Cookie::Create() | 331 scoped_refptr<Cookie> devtools_cookie = Cookie::Create() |
| 238 ->set_name(cookie.Name()) | 332 ->set_name(cookie.Name()) |
| 239 ->set_value(cookie.Value()) | 333 ->set_value(cookie.Value()) |
| 240 ->set_domain(cookie.Domain()) | 334 ->set_domain(cookie.Domain()) |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 340 return Response::InternalError("Could not connect to view"); | 434 return Response::InternalError("Could not connect to view"); |
| 341 WebContents* web_contents = WebContents::FromRenderFrameHost(host_); | 435 WebContents* web_contents = WebContents::FromRenderFrameHost(host_); |
| 342 web_contents->GetDelegate()->ShowCertificateViewerInDevTools( | 436 web_contents->GetDelegate()->ShowCertificateViewerInDevTools( |
| 343 web_contents, certificate_id); | 437 web_contents, certificate_id); |
| 344 return Response::OK(); | 438 return Response::OK(); |
| 345 } | 439 } |
| 346 | 440 |
| 347 } // namespace network | 441 } // namespace network |
| 348 } // namespace devtools | 442 } // namespace devtools |
| 349 } // namespace content | 443 } // namespace content |
| OLD | NEW |