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