content_settings_utils.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
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"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/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"
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/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)  "auto-select-certificate",
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "fullscreen",
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "mouselock",
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "mixed-script",
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "media-stream",
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "media-stream-mic",
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "media-stream-camera",
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "register-protocol-handler",
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "ppapi-broker",
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  "multiple-automatic-downloads",
43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  "midi-sysex",
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  "save-password",
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  "metro-switch-to-desktop",
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#elif defined(OS_ANDROID) || defined(OS_CHROMEOS)
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  "protected-media-identifier",
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(arraysize(kTypeNames) == CONTENT_SETTINGS_NUM_TYPES,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               type_names_incorrect_size);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPatternSeparator[] = ",";
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content_settings {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string GetTypeName(ContentSettingsType type) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string(kTypeNames[type]);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CreatePatternString(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& item_pattern,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsPattern& top_level_frame_pattern) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return item_pattern.ToString()
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         + std::string(kPatternSeparator)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         + top_level_frame_pattern.ToString();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PatternPair ParsePatternString(const std::string& pattern_str) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> pattern_str_list;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::SplitString(pattern_str, kPatternSeparator[0], &pattern_str_list);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the |pattern_str| is an empty string then the |pattern_string_list|
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contains a single empty string. In this case the empty string will be
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // removed to signal an invalid |pattern_str|. Invalid pattern strings are
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handle by the "if"-statment below. So the order of the if statements here
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be preserved.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pattern_str_list.size() == 1) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pattern_str_list[0].empty()) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.pop_back();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.push_back("*");
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pattern_str_list.size() > 2 ||
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pattern_str_list.size() == 0) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PatternPair(ContentSettingsPattern(),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ContentSettingsPattern());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PatternPair pattern_pair;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern_pair.first =
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString(pattern_str_list[0]);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern_pair.second =
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString(pattern_str_list[1]);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pattern_pair;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting ValueToContentSetting(const base::Value* value) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting = CONTENT_SETTING_DEFAULT;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool valid = ParseContentSettingValue(value, &setting);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(valid);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return setting;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ParseContentSettingValue(const base::Value* value,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              ContentSetting* setting) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *setting = CONTENT_SETTING_DEFAULT;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int int_value = -1;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value->GetAsInteger(&int_value))
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *setting = IntToContentSetting(int_value);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *setting != CONTENT_SETTING_DEFAULT;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValueAndPatterns(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ProviderInterface* provider,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool include_incognito,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* primary_pattern,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* secondary_pattern) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (include_incognito) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check incognito-only specific settings. It's essential that the
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |RuleIterator| gets out of scope before we get a rule iterator for the
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // normal mode.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<RuleIterator> incognito_rule_iterator(
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        provider->GetRuleIterator(content_type, resource_identifier, true));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Value* value = GetContentSettingValueAndPatterns(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        incognito_rule_iterator.get(), primary_url, secondary_url,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        primary_pattern, secondary_pattern);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (value)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return value;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No settings from the incognito; use the normal mode.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RuleIterator> rule_iterator(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      provider->GetRuleIterator(content_type, resource_identifier, false));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentSettingValueAndPatterns(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rule_iterator.get(), primary_url, secondary_url,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      primary_pattern, secondary_pattern);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValueAndPatterns(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RuleIterator* rule_iterator,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& secondary_url,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* primary_pattern,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsPattern* secondary_pattern) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rule_iterator->HasNext()) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Rule& rule = rule_iterator->Next();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (rule.primary_pattern.Matches(primary_url) &&
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rule.secondary_pattern.Matches(secondary_url)) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (primary_pattern)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *primary_pattern = rule.primary_pattern;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (secondary_pattern)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *secondary_pattern = rule.secondary_pattern;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return rule.value.get()->DeepCopy();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Value* GetContentSettingValue(const ProviderInterface* provider,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& primary_url,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const GURL& secondary_url,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ContentSettingsType content_type,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    const std::string& resource_identifier,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool include_incognito) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetContentSettingValueAndPatterns(provider, primary_url, secondary_url,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               content_type, resource_identifier,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               include_incognito, NULL, NULL);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting GetContentSetting(const ProviderInterface* provider,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& primary_url,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const GURL& secondary_url,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ContentSettingsType content_type,
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& resource_identifier,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 bool include_incognito) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> value(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetContentSettingValue(provider, primary_url, secondary_url,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             content_type, resource_identifier,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             include_incognito));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ValueToContentSetting(value.get());
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetRendererContentSettingRules(const HostContentSettingsMap* map,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    RendererContentSettingRules* rules) {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  map->GetSettingsForOneType(
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &(rules->image_rules));
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  map->GetSettingsForOneType(
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string(), &(rules->script_rules));
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content_settings
205