Index: chrome/browser/automation/url_request_automation_job.cc |
=================================================================== |
--- chrome/browser/automation/url_request_automation_job.cc (revision 36629) |
+++ chrome/browser/automation/url_request_automation_job.cc (working copy) |
@@ -49,6 +49,24 @@ |
URLRequest::ProtocolFactory* URLRequestAutomationJob::old_https_factory_ |
= NULL; |
+namespace { |
+ |
+// Returns true if the cookie passed in exists in the list of cookies |
+// parsed from the HTTP response header. |
+bool IsParsedCookiePresentInCookieHeader( |
+ const net::CookieMonster::ParsedCookie& parsed_cookie, |
+ const std::vector<std::string>& header_cookies) { |
+ for (size_t i = 0; i < header_cookies.size(); ++i) { |
+ net::CookieMonster::ParsedCookie parsed_header_cookie(header_cookies[i]); |
+ if (parsed_header_cookie.Name() == parsed_cookie.Name()) |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
+} // end namespace |
+ |
URLRequestAutomationJob::URLRequestAutomationJob(URLRequest* request, int tab, |
int request_id, AutomationResourceMessageFilter* filter) |
: URLRequestJob(request), |
@@ -291,6 +309,13 @@ |
url_for_cookies, request_->first_party_for_cookies())) { |
StringTokenizer cookie_parser(response.persistent_cookies, ";"); |
+ std::vector<net::CookieMonster::CanonicalCookie> existing_cookies; |
+ net::CookieMonster* monster = ctx->cookie_store()->GetCookieMonster(); |
+ DCHECK(monster); |
+ if (monster) { |
+ monster->GetRawCookies(url_for_cookies, &existing_cookies); |
+ } |
+ |
while (cookie_parser.GetNext()) { |
std::string cookie_string = cookie_parser.token(); |
// Only allow cookies with valid name value pairs. |
@@ -298,13 +323,21 @@ |
TrimWhitespace(cookie_string, TRIM_ALL, &cookie_string); |
// Ignore duplicate cookies, i.e. cookies passed in from the host |
// browser which also exist in the response header. |
- if (!IsCookiePresentInCookieHeader(cookie_string, |
- response_cookies)) { |
- net::CookieOptions options; |
- ctx->cookie_store()->SetCookieWithOptions(url_for_cookies, |
- cookie_string, |
- options); |
+ net::CookieMonster::ParsedCookie parsed_cookie(cookie_string); |
+ std::vector<net::CookieMonster::CanonicalCookie>::const_iterator i; |
+ for (i = existing_cookies.begin(); i != existing_cookies.end(); ++i) { |
+ if ((*i).Name() == parsed_cookie.Name()) |
+ break; |
} |
+ |
+ if (i == existing_cookies.end() && |
+ !IsParsedCookiePresentInCookieHeader(parsed_cookie, |
+ response_cookies)) { |
+ net::CookieOptions options; |
+ ctx->cookie_store()->SetCookieWithOptions(url_for_cookies, |
+ cookie_string, |
+ options); |
+ } |
} |
} |
} |
@@ -449,17 +482,8 @@ |
} |
bool URLRequestAutomationJob::IsCookiePresentInCookieHeader( |
- const std::string& cookie_line, |
+ const std::string& cookie_name, |
const std::vector<std::string>& header_cookies) { |
- net::CookieMonster::ParsedCookie parsed_current_cookie(cookie_line); |
- for (size_t index = 0; index < header_cookies.size(); index++) { |
- net::CookieMonster::ParsedCookie parsed_header_cookie( |
- header_cookies[index]); |
- |
- if (parsed_header_cookie.Name() == parsed_current_cookie.Name()) |
- return true; |
- } |
- |
- return false; |
+ net::CookieMonster::ParsedCookie parsed_cookie(cookie_name); |
+ return IsParsedCookiePresentInCookieHeader(parsed_cookie, header_cookies); |
} |
- |