OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "chrome/browser/content_settings/content_settings_origin_identifier_val
ue_map.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/values.h" |
| 9 #include "googleurl/src/gurl.h" |
| 10 |
| 11 namespace content_settings { |
| 12 |
| 13 OriginIdentifierValueMap::OriginIdentifierValueMap() {} |
| 14 |
| 15 OriginIdentifierValueMap::~OriginIdentifierValueMap() { |
| 16 Clear(); |
| 17 } |
| 18 |
| 19 OriginIdentifierValueMap::const_iterator |
| 20 OriginIdentifierValueMap::GetEntryWithHighestPrecedence( |
| 21 OriginIdentifierValueMap::const_iterator first, |
| 22 OriginIdentifierValueMap::const_iterator second) const { |
| 23 // Compare requesting patterns. |
| 24 if (first->a > second->a) |
| 25 return first; |
| 26 if (second->a > first->a) |
| 27 return second; |
| 28 DCHECK(first->a == second->a); |
| 29 |
| 30 // Compare embedding patterns. |
| 31 if (first->a > second->a) |
| 32 return first; |
| 33 DCHECK(first->b < second->b); |
| 34 return second; |
| 35 } |
| 36 |
| 37 Value* OriginIdentifierValueMap::GetValue( |
| 38 const GURL& item_url, |
| 39 const GURL& top_level_frame_url, |
| 40 ContentSettingsType content_type, |
| 41 const ResourceIdentifier& resource_identifier) const { |
| 42 // Find best matching list entry. |
| 43 OriginIdentifierValueMap::const_iterator best_match = entries_.end(); |
| 44 for (OriginIdentifierValueMap::const_iterator entry = entries_.begin(); |
| 45 entry != entries_.end(); |
| 46 ++entry) { |
| 47 if (entry->a.Matches(item_url) && |
| 48 entry->b.Matches(top_level_frame_url) && |
| 49 entry->c == content_type && |
| 50 entry->d == resource_identifier) { |
| 51 if (best_match == entries_.end()) { |
| 52 best_match = entry; |
| 53 } else { |
| 54 best_match = GetEntryWithHighestPrecedence(best_match, entry); |
| 55 } |
| 56 } |
| 57 } |
| 58 if (best_match != entries_.end()) |
| 59 return best_match->e; |
| 60 return NULL; |
| 61 } |
| 62 |
| 63 void OriginIdentifierValueMap::SetValue( |
| 64 const ContentSettingsPattern& item_pattern, |
| 65 const ContentSettingsPattern& top_level_frame_pattern, |
| 66 ContentSettingsType content_type, |
| 67 const ResourceIdentifier& resource_identifier, |
| 68 Value* value) { |
| 69 OriginIdentifierValueMap::iterator list_entry = |
| 70 FindEntry(item_pattern, |
| 71 top_level_frame_pattern, |
| 72 content_type, |
| 73 resource_identifier); |
| 74 if (list_entry == entries_.end()) { |
| 75 // No matching list entry found. Add a new entry to the list. |
| 76 entries_.insert(list_entry, MakeTuple(item_pattern, |
| 77 top_level_frame_pattern, |
| 78 content_type, |
| 79 resource_identifier, |
| 80 value)); |
| 81 } else { |
| 82 // Update the list entry. |
| 83 list_entry->e = value; |
| 84 } |
| 85 } |
| 86 |
| 87 void OriginIdentifierValueMap::DeleteValue( |
| 88 const ContentSettingsPattern& item_pattern, |
| 89 const ContentSettingsPattern& top_level_frame_pattern, |
| 90 ContentSettingsType content_type, |
| 91 const ResourceIdentifier& resource_identifier) { |
| 92 OriginIdentifierValueMap::iterator entry_to_delete = |
| 93 FindEntry(item_pattern, |
| 94 top_level_frame_pattern, |
| 95 content_type, |
| 96 resource_identifier); |
| 97 if (entry_to_delete != entries_.end()) { |
| 98 delete entry_to_delete->e; |
| 99 entries_.erase(entry_to_delete); |
| 100 } |
| 101 } |
| 102 |
| 103 void OriginIdentifierValueMap::Clear() { |
| 104 // Delete all owned value objects. |
| 105 for (OriginIdentifierValueMap::iterator entry = entries_.begin(); |
| 106 entry != entries_.end(); |
| 107 ++entry) { |
| 108 delete entry->e; |
| 109 } |
| 110 entries_.clear(); |
| 111 } |
| 112 |
| 113 OriginIdentifierValueMap::iterator OriginIdentifierValueMap::DeleteValue( |
| 114 OriginIdentifierValueMap::iterator entry) { |
| 115 return entries_.erase(entry); |
| 116 } |
| 117 |
| 118 OriginIdentifierValueMap::iterator OriginIdentifierValueMap::FindEntry( |
| 119 const ContentSettingsPattern& item_pattern, |
| 120 const ContentSettingsPattern& top_level_frame_pattern, |
| 121 ContentSettingsType content_type, |
| 122 const ResourceIdentifier& resource_identifier) { |
| 123 for (OriginIdentifierValueMap::iterator entry = entries_.begin(); |
| 124 entry != entries_.end(); |
| 125 ++entry) { |
| 126 if (item_pattern == entry->a && |
| 127 top_level_frame_pattern == entry->b && |
| 128 content_type == entry->c && |
| 129 resource_identifier == entry->d) { |
| 130 return entry; |
| 131 } |
| 132 } |
| 133 return entries_.end(); |
| 134 } |
| 135 |
| 136 } // namespace content_settings |
OLD | NEW |