1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/content_settings/content_settings_base_provider.h"
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/command_line.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/logging.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/chrome_switches.h"
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "googleurl/src/gurl.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/net_util.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace {
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// True if a given content settings type requires additional resource
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// identifiers.
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenconst bool kRequiresResourceIdentifier[CONTENT_SETTINGS_NUM_TYPES] = {
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // CONTENT_SETTINGS_TYPE_COOKIES
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // CONTENT_SETTINGS_TYPE_IMAGES
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // CONTENT_SETTINGS_TYPE_JAVASCRIPT
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  true,   // CONTENT_SETTINGS_TYPE_PLUGINS
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // CONTENT_SETTINGS_TYPE_POPUPS
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // Not used for Geolocation
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  false,  // Not used for Notifications
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace
29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace content_settings {
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
32dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtendedContentSettings::ExtendedContentSettings() {}
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
34dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtendedContentSettings::ExtendedContentSettings(
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ExtendedContentSettings& rhs)
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    : content_settings(rhs.content_settings),
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_settings_for_resources(rhs.content_settings_for_resources) {
38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
40dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtendedContentSettings::~ExtendedContentSettings() {}
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenBaseProvider::BaseProvider(bool is_incognito)
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : is_incognito_(is_incognito) {
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
46dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenBaseProvider::~BaseProvider() {}
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool BaseProvider::RequiresResourceIdentifier(
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSettingsType content_type) const {
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (CommandLine::ForCurrentProcess()->HasSwitch(
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      switches::kEnableResourceContentSettings)) {
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return kRequiresResourceIdentifier[content_type];
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  } else {
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool BaseProvider::AllDefault(
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ExtendedContentSettings& settings) const {
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (size_t i = 0; i < arraysize(settings.content_settings.settings); ++i) {
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (settings.content_settings.settings[i] != CONTENT_SETTING_DEFAULT)
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return false;
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return settings.content_settings_for_resources.empty();
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
67dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenContentSetting BaseProvider::GetContentSetting(
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const GURL& requesting_url,
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const GURL& embedding_url,
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSettingsType content_type,
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ResourceIdentifier& resource_identifier) const {
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Support for embedding_patterns is not implemented yet.
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(requesting_url == embedding_url);
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!RequiresResourceIdentifier(content_type) ||
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (RequiresResourceIdentifier(content_type) && resource_identifier.empty()))
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return GetNonDefaultContentSettings(requesting_url).settings[content_type];
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Resolve content settings with resource identifier.
80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // 1. Check for pattern that exactly match the url/host
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  //     1.1 In the content-settings-map
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //     1.2 In the incognito content-settings-map
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // 3. Shorten the url subdomain by subdomain and try to find a pattern in
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  //     3.1 OTR content-settings-map
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  //     3.2 content-settings-map
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock auto_lock(lock_);
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string host(net::GetHostOrSpecFromURL(requesting_url));
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ContentSettingsTypeResourceIdentifierPair
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      requested_setting(content_type, resource_identifier);
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Check for exact matches first.
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  HostContentSettings::const_iterator i(host_content_settings_.find(host));
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (i != host_content_settings_.end() &&
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      i->second.content_settings_for_resources.find(requested_setting) !=
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      i->second.content_settings_for_resources.end()) {
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return i->second.content_settings_for_resources.find(
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        requested_setting)->second;
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If this map is not for an incognito profile, these searches will never
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // match. The additional incognito exceptions always overwrite the
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // regular ones.
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  i = incognito_settings_.find(host);
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (i != incognito_settings_.end() &&
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      i->second.content_settings_for_resources.find(requested_setting) !=
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      i->second.content_settings_for_resources.end()) {
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return i->second.content_settings_for_resources.find(
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        requested_setting)->second;
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Match patterns starting with the most concrete pattern match.
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (std::string key =
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       std::string(ContentSettingsPattern::kDomainWildcard) + host; ; ) {
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    HostContentSettings::const_iterator i(incognito_settings_.find(key));
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (i != incognito_settings_.end() &&
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        i->second.content_settings_for_resources.find(requested_setting) !=
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        i->second.content_settings_for_resources.end()) {
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return i->second.content_settings_for_resources.find(
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          requested_setting)->second;
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    i = host_content_settings_.find(key);
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (i != host_content_settings_.end() &&
124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        i->second.content_settings_for_resources.find(requested_setting) !=
125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        i->second.content_settings_for_resources.end()) {
126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return i->second.content_settings_for_resources.find(
127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          requested_setting)->second;
128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const size_t next_dot =
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        key.find('.', ContentSettingsPattern::kDomainWildcardLength);
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (next_dot == std::string::npos)
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    key.erase(ContentSettingsPattern::kDomainWildcardLength,
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              next_dot - ContentSettingsPattern::kDomainWildcardLength + 1);
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return CONTENT_SETTING_DEFAULT;
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid BaseProvider::GetAllContentSettingsRules(
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSettingsType content_type,
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ResourceIdentifier& resource_identifier,
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    Rules* content_setting_rules) const {
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(content_setting_rules);
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  content_setting_rules->clear();
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const HostContentSettings* map_to_return =
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      is_incognito_ ? &incognito_settings_ : &host_content_settings_;
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ContentSettingsTypeResourceIdentifierPair requested_setting(
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_type, resource_identifier);
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock auto_lock(lock_);
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (HostContentSettings::const_iterator i(map_to_return->begin());
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       i != map_to_return->end(); ++i) {
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSetting setting;
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (RequiresResourceIdentifier(content_type)) {
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (i->second.content_settings_for_resources.find(requested_setting) !=
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          i->second.content_settings_for_resources.end()) {
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        setting = i->second.content_settings_for_resources.find(
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen            requested_setting)->second;
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        setting = CONTENT_SETTING_DEFAULT;
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } else {
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen     setting = i->second.content_settings.settings[content_type];
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (setting != CONTENT_SETTING_DEFAULT) {
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // Use of push_back() relies on the map iterator traversing in order of
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      // ascending keys.
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_setting_rules->push_back(Rule(ContentSettingsPattern(i->first),
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                            ContentSettingsPattern(i->first),
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                            setting));
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
178dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenContentSettings BaseProvider::GetNonDefaultContentSettings(
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const GURL& url) const {
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock auto_lock(lock_);
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  const std::string host(net::GetHostOrSpecFromURL(url));
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ContentSettings output;
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j)
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    output.settings[j] = CONTENT_SETTING_DEFAULT;
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Check for exact matches first.
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  HostContentSettings::const_iterator i(host_content_settings_.find(host));
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (i != host_content_settings_.end())
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    output = i->second.content_settings;
191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If this map is not for an incognito profile, these searches will never
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // match. The additional incognito exceptions always overwrite the
194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // regular ones.
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  i = incognito_settings_.find(host);
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (i != incognito_settings_.end()) {
197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j)
198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (i->second.content_settings.settings[j] != CONTENT_SETTING_DEFAULT)
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        output.settings[j] = i->second.content_settings.settings[j];
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Match patterns starting with the most concrete pattern match.
203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (std::string key =
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       std::string(ContentSettingsPattern::kDomainWildcard) + host; ; ) {
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    HostContentSettings::const_iterator i(incognito_settings_.find(key));
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (i != incognito_settings_.end()) {
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) {
208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (output.settings[j] == CONTENT_SETTING_DEFAULT)
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          output.settings[j] = i->second.content_settings.settings[j];
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    i = host_content_settings_.find(key);
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (i != host_content_settings_.end()) {
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) {
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        if (output.settings[j] == CONTENT_SETTING_DEFAULT)
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          output.settings[j] = i->second.content_settings.settings[j];
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const size_t next_dot =
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        key.find('.', ContentSettingsPattern::kDomainWildcardLength);
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (next_dot == std::string::npos)
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    key.erase(ContentSettingsPattern::kDomainWildcardLength,
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen              next_dot - ContentSettingsPattern::kDomainWildcardLength + 1);
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return output;
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid BaseProvider::UpdateContentSettingsMap(
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ContentSettingsPattern& requesting_pattern,
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ContentSettingsPattern& embedding_pattern,
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSettingsType content_type,
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const ResourceIdentifier& resource_identifier,
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    ContentSetting content_setting) {
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string pattern_str(requesting_pattern.CanonicalizePattern());
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  HostContentSettings* content_settings_map = host_content_settings();
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ExtendedContentSettings& extended_settings =
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      (*content_settings_map)[pattern_str];
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  extended_settings.content_settings.settings[content_type] = content_setting;
241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// static
244dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenContentSetting BaseProvider::ClickToPlayFixup(ContentSettingsType content_type,
245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                              ContentSetting setting) {
246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (setting == CONTENT_SETTING_ASK &&
247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      content_type == CONTENT_SETTINGS_TYPE_PLUGINS &&
248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      !CommandLine::ForCurrentProcess()->HasSwitch(
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          switches::kEnableClickToPlay)) {
250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return CONTENT_SETTING_BLOCK;
251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return setting;
253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}  // namespace content_settings
256