Chromium Code Reviews| 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..81d2a7f9a009eab6f82f282c5fc2273b28c5bf9e |
| --- /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 { |
| + |
| +typedef OriginIdentifierValueMap::EntryList::const_iterator ConstEntryIterator; |
|
Bernhard Bauer
2011/05/24 14:21:29
This is already defined in the header?
markusheintz_
2011/05/26 13:22:13
Done.
|
| + |
| +typedef OriginIdentifierValueMap::EntryList::iterator EntryIterator; |
| + |
| +OriginIdentifierValueMap::OriginIdentifierValueMap() {} |
| + |
| +OriginIdentifierValueMap::~OriginIdentifierValueMap() { |
| + Clear(); |
| +} |
| + |
| +ConstEntryIterator OriginIdentifierValueMap::ReturnEntryWithHighestPrecedence( |
| + ConstEntryIterator first, |
| + ConstEntryIterator second) const { |
| + // Compare requesting patterns. |
| + if (first->a.Compare(second->a) == ContentSettingsPattern::PREDECESSOR) |
| + return first; |
| + if (second->a.Compare(first->a) == ContentSettingsPattern::PREDECESSOR) |
| + return second; |
| + DCHECK(first->a == second->a); |
| + |
| + // Compare embedding patterns. |
| + if (first->a.Compare(second->a) == ContentSettingsPattern::PREDECESSOR) |
| + return first; |
| + DCHECK(first->b.Compare(second->b) == ContentSettingsPattern::PREDECESSOR); |
| + 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. |
| + ConstEntryIterator best_match = entries_.end(); |
| + for (ConstEntryIterator 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 = ReturnEntryWithHighestPrecedence(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) { |
| + EntryIterator 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. |
| + list_entry = entries_.insert(list_entry, MakeTuple(item_pattern, |
|
Bernhard Bauer
2011/05/24 14:21:29
aaaand the assignment to list_entry is not necessa
markusheintz_
2011/05/26 13:22:13
Done
|
| + 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) { |
| + EntryIterator 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 (EntryIterator entry = entries_.begin(); |
| + entry != entries_.end(); |
| + ++entry) { |
| + delete entry->e; |
| + } |
| + entries_.clear(); |
| +} |
| + |
| +EntryIterator OriginIdentifierValueMap::DeleteValue(EntryIterator entry) { |
| + return entries_.erase(entry); |
| +} |
| + |
| +EntryIterator OriginIdentifierValueMap::FindEntry( |
| + const ContentSettingsPattern& item_pattern, |
| + const ContentSettingsPattern& top_level_frame_pattern, |
| + ContentSettingsType content_type, |
| + const ResourceIdentifier& resource_identifier) { |
| + for (EntryIterator 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 |