| Index: chrome/browser/content_settings/content_settings_origin_identifier_value_map.cc
|
| diff --git a/chrome/browser/content_settings/content_settings_origin_identifier_value_map.cc b/chrome/browser/content_settings/content_settings_origin_identifier_value_map.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f7c61db3eb9be382dde1bd4fbfb6b018a0f98b07
|
| --- /dev/null
|
| +++ b/chrome/browser/content_settings/content_settings_origin_identifier_value_map.cc
|
| @@ -0,0 +1,136 @@
|
| +// Copyright (c) 2011 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 "chrome/browser/content_settings/content_settings_origin_identifier_value_map.h"
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/values.h"
|
| +#include "googleurl/src/gurl.h"
|
| +
|
| +namespace content_settings {
|
| +
|
| +OriginIdentifierValueMap::OriginIdentifierValueMap() {}
|
| +
|
| +OriginIdentifierValueMap::~OriginIdentifierValueMap() {
|
| + Clear();
|
| +}
|
| +
|
| +OriginIdentifierValueMap::const_iterator
|
| + OriginIdentifierValueMap::GetEntryWithHighestPrecedence(
|
| + OriginIdentifierValueMap::const_iterator first,
|
| + OriginIdentifierValueMap::const_iterator second) const {
|
| + // Compare requesting patterns.
|
| + if (first->a > second->a)
|
| + return first;
|
| + if (second->a > first->a)
|
| + return second;
|
| + DCHECK(first->a == second->a);
|
| +
|
| + // Compare embedding patterns.
|
| + if (first->a > second->a)
|
| + return first;
|
| + DCHECK(first->b < second->b);
|
| + return second;
|
| +}
|
| +
|
| +Value* OriginIdentifierValueMap::GetValue(
|
| + const GURL& item_url,
|
| + const GURL& top_level_frame_url,
|
| + ContentSettingsType content_type,
|
| + const ResourceIdentifier& resource_identifier) const {
|
| + // Find best matching list entry.
|
| + OriginIdentifierValueMap::const_iterator best_match = entries_.end();
|
| + for (OriginIdentifierValueMap::const_iterator entry = entries_.begin();
|
| + entry != entries_.end();
|
| + ++entry) {
|
| + if (entry->a.Matches(item_url) &&
|
| + entry->b.Matches(top_level_frame_url) &&
|
| + entry->c == content_type &&
|
| + entry->d == resource_identifier) {
|
| + if (best_match == entries_.end()) {
|
| + best_match = entry;
|
| + } else {
|
| + best_match = GetEntryWithHighestPrecedence(best_match, entry);
|
| + }
|
| + }
|
| + }
|
| + if (best_match != entries_.end())
|
| + return best_match->e;
|
| + return NULL;
|
| +}
|
| +
|
| +void OriginIdentifierValueMap::SetValue(
|
| + const ContentSettingsPattern& item_pattern,
|
| + const ContentSettingsPattern& top_level_frame_pattern,
|
| + ContentSettingsType content_type,
|
| + const ResourceIdentifier& resource_identifier,
|
| + Value* value) {
|
| + OriginIdentifierValueMap::iterator list_entry =
|
| + FindEntry(item_pattern,
|
| + top_level_frame_pattern,
|
| + content_type,
|
| + resource_identifier);
|
| + if (list_entry == entries_.end()) {
|
| + // No matching list entry found. Add a new entry to the list.
|
| + entries_.insert(list_entry, MakeTuple(item_pattern,
|
| + top_level_frame_pattern,
|
| + content_type,
|
| + resource_identifier,
|
| + value));
|
| + } else {
|
| + // Update the list entry.
|
| + list_entry->e = value;
|
| + }
|
| +}
|
| +
|
| +void OriginIdentifierValueMap::DeleteValue(
|
| + const ContentSettingsPattern& item_pattern,
|
| + const ContentSettingsPattern& top_level_frame_pattern,
|
| + ContentSettingsType content_type,
|
| + const ResourceIdentifier& resource_identifier) {
|
| + OriginIdentifierValueMap::iterator entry_to_delete =
|
| + FindEntry(item_pattern,
|
| + top_level_frame_pattern,
|
| + content_type,
|
| + resource_identifier);
|
| + if (entry_to_delete != entries_.end()) {
|
| + delete entry_to_delete->e;
|
| + entries_.erase(entry_to_delete);
|
| + }
|
| +}
|
| +
|
| +void OriginIdentifierValueMap::Clear() {
|
| + // Delete all owned value objects.
|
| + for (OriginIdentifierValueMap::iterator entry = entries_.begin();
|
| + entry != entries_.end();
|
| + ++entry) {
|
| + delete entry->e;
|
| + }
|
| + entries_.clear();
|
| +}
|
| +
|
| +OriginIdentifierValueMap::iterator OriginIdentifierValueMap::DeleteValue(
|
| + OriginIdentifierValueMap::iterator entry) {
|
| + return entries_.erase(entry);
|
| +}
|
| +
|
| +OriginIdentifierValueMap::iterator OriginIdentifierValueMap::FindEntry(
|
| + const ContentSettingsPattern& item_pattern,
|
| + const ContentSettingsPattern& top_level_frame_pattern,
|
| + ContentSettingsType content_type,
|
| + const ResourceIdentifier& resource_identifier) {
|
| + for (OriginIdentifierValueMap::iterator entry = entries_.begin();
|
| + entry != entries_.end();
|
| + ++entry) {
|
| + if (item_pattern == entry->a &&
|
| + top_level_frame_pattern == entry->b &&
|
| + content_type == entry->c &&
|
| + resource_identifier == entry->d) {
|
| + return entry;
|
| + }
|
| + }
|
| + return entries_.end();
|
| +}
|
| +
|
| +} // namespace content_settings
|
|
|