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