blob: b06d7fd11e4d48e63bc3945c45dd78824480b6d9 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/domain_reliability/context_manager.h"
namespace domain_reliability {
DomainReliabilityContextManager::DomainReliabilityContextManager(
DomainReliabilityContext::Factory* context_factory)
: context_factory_(context_factory) {
}
DomainReliabilityContextManager::~DomainReliabilityContextManager() {
RemoveAllContexts();
}
void DomainReliabilityContextManager::RouteBeacon(
const GURL& url,
const DomainReliabilityBeacon& beacon) {
DomainReliabilityContext* context = GetContextForHost(url.host());
if (!context)
return;
context->OnBeacon(url, beacon);
}
void DomainReliabilityContextManager::ClearBeaconsInAllContexts() {
for (auto& context_entry : contexts_)
context_entry.second->ClearBeacons();
}
DomainReliabilityContext* DomainReliabilityContextManager::AddContextForConfig(
scoped_ptr<const DomainReliabilityConfig> config) {
std::string domain = config->domain;
scoped_ptr<DomainReliabilityContext> context =
context_factory_->CreateContextForConfig(config.Pass());
DomainReliabilityContext** entry = &contexts_[domain];
if (*entry)
delete *entry;
*entry = context.release();
return *entry;
}
void DomainReliabilityContextManager::RemoveAllContexts() {
STLDeleteContainerPairSecondPointers(
contexts_.begin(), contexts_.end());
contexts_.clear();
}
scoped_ptr<base::Value> DomainReliabilityContextManager::GetWebUIData() const {
scoped_ptr<base::ListValue> contexts_value(new base::ListValue());
for (const auto& context_entry : contexts_)
contexts_value->Append(context_entry.second->GetWebUIData().release());
return contexts_value.Pass();
}
DomainReliabilityContext* DomainReliabilityContextManager::GetContextForHost(
const std::string& host) {
ContextMap::const_iterator context_it;
context_it = contexts_.find(host);
if (context_it != contexts_.end())
return context_it->second;
std::string host_with_asterisk = "*." + host;
context_it = contexts_.find(host_with_asterisk);
if (context_it != contexts_.end())
return context_it->second;
size_t dot_pos = host.find('.');
if (dot_pos == std::string::npos)
return nullptr;
// TODO(ttuttle): Make sure parent is not in PSL before using.
std::string parent_with_asterisk = "*." + host.substr(dot_pos + 1);
context_it = contexts_.find(parent_with_asterisk);
if (context_it != contexts_.end())
return context_it->second;
return nullptr;
}
} // namespace domain_reliability