11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/net/quota_policy_channel_id_store.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <list> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_path.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread_restrictions.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/cookies/cookie_util.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/extras/sqlite/sqlite_channel_id_store.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/quota/special_storage_policy.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "url/gurl.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciQuotaPolicyChannelIDStore::QuotaPolicyChannelIDStore( 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::FilePath& path, 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<base::SequencedTaskRunner>& background_task_runner, 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<storage::SpecialStoragePolicy>& special_storage_policy) 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : special_storage_policy_(special_storage_policy), 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci persistent_store_( 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new net::SQLiteChannelIDStore(path, background_task_runner)) { 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(background_task_runner.get()); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciQuotaPolicyChannelIDStore::~QuotaPolicyChannelIDStore() { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!special_storage_policy_.get() || 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !special_storage_policy_->HasSessionOnlyOrigins()) { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::list<std::string> session_only_server_identifiers; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::set<std::string>::iterator it = server_identifiers_.begin(); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != server_identifiers_.end(); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GURL url(net::cookie_util::CookieOriginToURL(*it, true)); 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (special_storage_policy_->IsStorageSessionOnly(url)) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_only_server_identifiers.push_back(*it); 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci persistent_store_->DeleteAllInList(session_only_server_identifiers); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid QuotaPolicyChannelIDStore::Load(const LoadedCallback& loaded_callback) { 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci persistent_store_->Load( 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&QuotaPolicyChannelIDStore::OnLoad, this, loaded_callback)); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid QuotaPolicyChannelIDStore::AddChannelID( 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const net::DefaultChannelIDStore::ChannelID& channel_id) { 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_identifiers_.insert(channel_id.server_identifier()); 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci persistent_store_->AddChannelID(channel_id); 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid QuotaPolicyChannelIDStore::DeleteChannelID( 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const net::DefaultChannelIDStore::ChannelID& channel_id) { 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_identifiers_.erase(channel_id.server_identifier()); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci persistent_store_->DeleteChannelID(channel_id); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid QuotaPolicyChannelIDStore::SetForceKeepSessionState() { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci special_storage_policy_ = NULL; 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid QuotaPolicyChannelIDStore::OnLoad( 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const LoadedCallback& loaded_callback, 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<ChannelIDVector> channel_ids) { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ChannelIDVector::const_iterator channel_id = channel_ids->begin(); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci channel_id != channel_ids->end(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++channel_id) { 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_identifiers_.insert((*channel_id)->server_identifier()); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci loaded_callback.Run(channel_ids.Pass()); 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 80