15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implements common functionality for the Chrome Extensions Cookies API.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/cookies/cookies_helpers.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/cookies/cookies_api_constants.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/cookies.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/permissions/permissions_data.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_util.h"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::api::cookies::Cookie;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::api::cookies::CookieStore;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace GetAll = extensions::api::cookies::GetAll;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace keys = cookies_api_constants;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cookies_helpers {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOriginalProfileStoreId[] = "0";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kOffTheRecordProfileStoreId[] = "1";
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ChooseProfileFromStoreId(const std::string& store_id,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Profile* profile,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool include_incognito) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_original = !profile->IsOffTheRecord();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool allow_incognito = profile->IsOffTheRecord() ||
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (include_incognito && profile->HasOffTheRecordProfile());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (store_id == kOriginalProfileStoreId && allow_original)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile->GetOriginalProfile();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (store_id == kOffTheRecordProfileStoreId && allow_incognito)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile->GetOffTheRecordProfile();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetStoreIdFromProfile(Profile* profile) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return profile->IsOffTheRecord() ?
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kOffTheRecordProfileStoreId : kOriginalProfileStoreId;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<Cookie> CreateCookie(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& canonical_cookie,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& store_id) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Cookie> cookie(new Cookie());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A cookie is a raw byte sequence. By explicitly parsing it as UTF-8, we
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // apply error correction, so the string can be safely passed to the renderer.
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cookie->name = base::UTF16ToUTF8(base::UTF8ToUTF16(canonical_cookie.Name()));
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cookie->value =
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UTF16ToUTF8(base::UTF8ToUTF16(canonical_cookie.Value()));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->domain = canonical_cookie.Domain();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->host_only = net::cookie_util::DomainIsHostOnly(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      canonical_cookie.Domain());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A non-UTF8 path is invalid, so we just replace it with an empty string.
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cookie->path = base::IsStringUTF8(canonical_cookie.Path()) ?
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      canonical_cookie.Path() : std::string();
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->secure = canonical_cookie.IsSecure();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->http_only = canonical_cookie.IsHttpOnly();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->session = !canonical_cookie.IsPersistent();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (canonical_cookie.IsPersistent()) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie->expiration_date.reset(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new double(canonical_cookie.ExpiryDate().ToDoubleT()));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie->store_id = store_id;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cookie.Pass();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<CookieStore> CreateCookieStore(Profile* profile,
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          base::ListValue* tab_ids) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(profile);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(tab_ids);
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue dict;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.SetString(keys::kIdKey, GetStoreIdFromProfile(profile));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict.Set(keys::kTabIdsKey, tab_ids);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieStore* cookie_store = new CookieStore();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool rv = CookieStore::Populate(dict, cookie_store);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(rv);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<CookieStore>(cookie_store);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookieListFromStore(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::CookieStore* cookie_store, const GURL& url,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CookieMonster::GetCookieListCallback& callback) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(cookie_store);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieMonster* monster = cookie_store->GetCookieMonster();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!url.is_empty()) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(url.is_valid());
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    monster->GetAllCookiesForURLAsync(url, callback);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    monster->GetAllCookiesAsync(callback);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetURLFromCanonicalCookie(const net::CanonicalCookie& cookie) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& domain_key = cookie.Domain();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string scheme =
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      cookie.IsSecure() ? url::kHttpsScheme : url::kHttpScheme;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string host =
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      domain_key.find('.') != 0 ? domain_key : domain_key.substr(1);
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GURL(scheme + url::kStandardSchemeSeparator + host + "/");
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMatchingCookiesToVector(const net::CookieList& all_cookies,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const GURL& url,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const GetAll::Params::Details* details,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const Extension* extension,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   LinkedCookieVec* match_vector) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CookieList::const_iterator it;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it = all_cookies.begin(); it != all_cookies.end(); ++it) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ignore any cookie whose domain doesn't match the extension's
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // host permissions.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL cookie_domain_url = GetURLFromCanonicalCookie(*it);
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!extension->permissions_data()->HasHostPermission(cookie_domain_url))
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Filter the cookie using the match filter.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookies_helpers::MatchFilter filter(details);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (filter.MatchesCookie(*it)) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      match_vector->push_back(make_linked_ptr(
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CreateCookie(*it, *details->store_id).release()));
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid AppendToTabIdList(Browser* browser, base::ListValue* tab_ids) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(browser);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(tab_ids);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* tab_strip = browser->tab_strip_model();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < tab_strip->count(); ++i) {
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    tab_ids->Append(new base::FundamentalValue(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ExtensionTabUtil::GetTabId(tab_strip->GetWebContentsAt(i))));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MatchFilter::MatchFilter(const GetAll::Params::Details* details)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : details_(details) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(details_);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MatchFilter::MatchesCookie(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::CanonicalCookie& cookie) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details_->name.get() && *details_->name != cookie.Name())
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!MatchesDomain(cookie.Domain()))
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details_->path.get() && *details_->path != cookie.Path())
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details_->secure.get() && *details_->secure != cookie.IsSecure())
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (details_->session.get() && *details_->session != !cookie.IsPersistent())
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MatchFilter::MatchesDomain(const std::string& domain) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!details_->domain.get())
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a leading '.' character to the filter domain if it doesn't exist.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (net::cookie_util::DomainIsHostOnly(*details_->domain))
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    details_->domain->insert(0, ".");
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string sub_domain(domain);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Strip any leading '.' character from the input cookie domain.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!net::cookie_util::DomainIsHostOnly(sub_domain))
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_domain = sub_domain.substr(1);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now check whether the domain argument is a subdomain of the filter domain.
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (sub_domain.insert(0, ".");
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       sub_domain.length() >= details_->domain->length();) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sub_domain == *details_->domain)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const size_t next_dot = sub_domain.find('.', 1);  // Skip over leading dot.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub_domain.erase(0, next_dot);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace cookies_helpers
2103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace extensions
211