content_settings_utils.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_split.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_provider.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_rule.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_pattern.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "googleurl/src/gurl.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The names of the ContentSettingsType values, for use with dictionary prefs.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kTypeNames[] = {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "cookies",
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "images",
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "javascript",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "plugins",
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "popups",
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "geolocation",
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "notifications",
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "intents",
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "auto-select-certificate",
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "fullscreen",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "mouselock",
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "mixed-script",
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "media-stream",
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "register-protocol-handler",
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ppapi-broker",
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(kTypeNames) == CONTENT_SETTINGS_NUM_TYPES,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               type_names_incorrect_size);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPatternSeparator[] = ",";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content_settings {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetTypeName(ContentSettingsType type) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string(kTypeNames[type]);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreatePatternString(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& item_pattern,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& top_level_frame_pattern) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return item_pattern.ToString()
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         + std::string(kPatternSeparator)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         + top_level_frame_pattern.ToString();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PatternPair ParsePatternString(const std::string& pattern_str) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> pattern_str_list;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(pattern_str, kPatternSeparator[0], &pattern_str_list);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the |pattern_str| is an empty string then the |pattern_string_list|
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contains a single empty string. In this case the empty string will be
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // removed to signal an invalid |pattern_str|. Invalid pattern strings are
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handle by the "if"-statment below. So the order of the if statements here
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be preserved.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pattern_str_list.size() == 1) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pattern_str_list[0].empty()) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.pop_back();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.push_back("*");
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pattern_str_list.size() > 2 ||
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.size() == 0) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PatternPair(ContentSettingsPattern(),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ContentSettingsPattern());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PatternPair pattern_pair;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern_pair.first =
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString(pattern_str_list[0]);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern_pair.second =
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString(pattern_str_list[1]);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pattern_pair;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting ValueToContentSetting(const base::Value* value) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = CONTENT_SETTING_DEFAULT;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool valid = ParseContentSettingValue(value, &setting);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(valid);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return setting;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParseContentSettingValue(const base::Value* value,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ContentSetting* setting) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *setting = CONTENT_SETTING_DEFAULT;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int int_value = -1;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->GetAsInteger(&int_value))
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *setting = IntToContentSetting(int_value);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *setting != CONTENT_SETTING_DEFAULT;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValueAndPatterns(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProviderInterface* provider,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool include_incognito,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* primary_pattern,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* secondary_pattern) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (include_incognito) {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check incognito-only specific settings. It's essential that the
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |RuleIterator| gets out of scope before we get a rule iterator for the
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // normal mode.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<RuleIterator> incognito_rule_iterator(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        provider->GetRuleIterator(content_type, resource_identifier, true));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Value* value = GetContentSettingValueAndPatterns(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incognito_rule_iterator.get(), primary_url, secondary_url,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        primary_pattern, secondary_pattern);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No settings from the incognito; use the normal mode.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RuleIterator> rule_iterator(
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      provider->GetRuleIterator(content_type, resource_identifier, false));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentSettingValueAndPatterns(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rule_iterator.get(), primary_url, secondary_url,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern, secondary_pattern);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValueAndPatterns(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RuleIterator* rule_iterator,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* primary_pattern,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* secondary_pattern) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rule_iterator->HasNext()) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Rule& rule = rule_iterator->Next();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rule.primary_pattern.Matches(primary_url) &&
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.secondary_pattern.Matches(secondary_url)) {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (primary_pattern)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *primary_pattern = rule.primary_pattern;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (secondary_pattern)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *secondary_pattern = rule.secondary_pattern;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return rule.value.get()->DeepCopy();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValue(const ProviderInterface* provider,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& primary_url,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& secondary_url,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ContentSettingsType content_type,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& resource_identifier,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool include_incognito) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentSettingValueAndPatterns(provider, primary_url, secondary_url,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               content_type, resource_identifier,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               include_incognito, NULL, NULL);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting GetContentSetting(const ProviderInterface* provider,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& primary_url,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& secondary_url,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ContentSettingsType content_type,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& resource_identifier,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool include_incognito) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> value(
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentSettingValue(provider, primary_url, secondary_url,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             content_type, resource_identifier,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             include_incognito));
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ValueToContentSetting(value.get());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetRendererContentSettingRules(const HostContentSettingsMap* map,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    RendererContentSettingRules* rules) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_IMAGES, "",
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &(rules->image_rules));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_JAVASCRIPT, "",
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             &(rules->script_rules));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content_settings
196