1// Copyright (c) 2012 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/ui/webui/options/pepper_flash_content_settings_utils.h"
6
7#include <algorithm>
8
9#include "base/memory/scoped_ptr.h"
10
11namespace options {
12
13namespace {
14
15int CompareMediaException(const MediaException& i, const MediaException& j) {
16  return i.pattern.Compare(j.pattern);
17}
18
19bool MediaExceptionSortFunc(const MediaException& i, const MediaException& j) {
20  return CompareMediaException(i, j) < 0;
21}
22
23bool AreSettingsEqualOrIgnored(const MediaException& i,
24                               const MediaException& j,
25                               bool ignore_audio_setting,
26                               bool ignore_video_setting) {
27  return (ignore_audio_setting || i.audio_setting == j.audio_setting) &&
28         (ignore_video_setting || i.video_setting == j.video_setting);
29}
30
31}  // namespace
32
33MediaException::MediaException(const ContentSettingsPattern& in_pattern,
34                               ContentSetting in_audio_setting,
35                               ContentSetting in_video_setting)
36    : pattern(in_pattern),
37      audio_setting(in_audio_setting),
38      video_setting(in_video_setting) {
39}
40
41MediaException::~MediaException() {
42}
43
44bool MediaException::operator==(const MediaException& other) const {
45  return pattern == other.pattern &&
46         audio_setting == other.audio_setting &&
47         video_setting == other.video_setting;
48}
49
50// static
51ContentSetting PepperFlashContentSettingsUtils::FlashPermissionToContentSetting(
52    PP_Flash_BrowserOperations_Permission permission) {
53  switch (permission) {
54    case PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT:
55      return CONTENT_SETTING_DEFAULT;
56    case PP_FLASH_BROWSEROPERATIONS_PERMISSION_ALLOW:
57      return CONTENT_SETTING_ALLOW;
58    case PP_FLASH_BROWSEROPERATIONS_PERMISSION_BLOCK:
59      return CONTENT_SETTING_BLOCK;
60    case PP_FLASH_BROWSEROPERATIONS_PERMISSION_ASK:
61      return CONTENT_SETTING_ASK;
62    // No default so the compiler will warn us if a new type is added.
63  }
64  return CONTENT_SETTING_DEFAULT;
65}
66
67// static
68void PepperFlashContentSettingsUtils::FlashSiteSettingsToMediaExceptions(
69    const ppapi::FlashSiteSettings& site_settings,
70    MediaExceptions* media_exceptions) {
71  media_exceptions->clear();
72
73  scoped_ptr<ContentSettingsPattern::BuilderInterface> builder(
74      ContentSettingsPattern::CreateBuilder(false));
75  builder->WithSchemeWildcard()->WithPortWildcard();
76  for (ppapi::FlashSiteSettings::const_iterator iter = site_settings.begin();
77       iter != site_settings.end(); ++iter) {
78    builder->WithHost(iter->site);
79
80    ContentSettingsPattern pattern = builder->Build();
81    if (!pattern.IsValid())
82      continue;
83
84    ContentSetting setting = FlashPermissionToContentSetting(iter->permission);
85
86    media_exceptions->push_back(MediaException(pattern, setting, setting));
87  }
88}
89
90// static
91void PepperFlashContentSettingsUtils::SortMediaExceptions(
92    MediaExceptions* media_exceptions) {
93  std::sort(media_exceptions->begin(), media_exceptions->end(),
94            MediaExceptionSortFunc);
95}
96
97// static
98bool PepperFlashContentSettingsUtils::AreMediaExceptionsEqual(
99    ContentSetting default_setting_1,
100    const MediaExceptions& exceptions_1,
101    ContentSetting default_setting_2,
102    const MediaExceptions& exceptions_2,
103    bool ignore_audio_setting,
104    bool ignore_video_setting) {
105  MediaExceptions::const_iterator iter_1 = exceptions_1.begin();
106  MediaExceptions::const_iterator iter_2 = exceptions_2.begin();
107
108  MediaException default_exception_1(ContentSettingsPattern(),
109                                     default_setting_1,
110                                     default_setting_1);
111  MediaException default_exception_2(ContentSettingsPattern(),
112                                     default_setting_2,
113                                     default_setting_2);
114
115  while (iter_1 != exceptions_1.end() && iter_2 != exceptions_2.end()) {
116    int compare_result = CompareMediaException(*iter_1, *iter_2);
117    if (compare_result < 0) {
118      if (!AreSettingsEqualOrIgnored(*iter_1, default_exception_2,
119                                     ignore_audio_setting,
120                                     ignore_video_setting)) {
121        return false;
122      }
123      ++iter_1;
124    } else if (compare_result > 0) {
125      if (!AreSettingsEqualOrIgnored(*iter_2, default_exception_1,
126                                     ignore_audio_setting,
127                                     ignore_video_setting)) {
128        return false;
129      }
130      ++iter_2;
131    } else {
132      if (!AreSettingsEqualOrIgnored(*iter_1, *iter_2, ignore_audio_setting,
133                                     ignore_video_setting)) {
134        return false;
135      }
136      ++iter_1;
137      ++iter_2;
138    }
139  }
140
141  while (iter_1 != exceptions_1.end()) {
142    if (!AreSettingsEqualOrIgnored(*iter_1, default_exception_2,
143                                   ignore_audio_setting,
144                                   ignore_video_setting)) {
145      return false;
146    }
147    ++iter_1;
148  }
149  while (iter_2 != exceptions_2.end()) {
150    if (!AreSettingsEqualOrIgnored(*iter_2, default_exception_1,
151                                   ignore_audio_setting,
152                                   ignore_video_setting)) {
153      return false;
154    }
155    ++iter_2;
156  }
157  return true;
158}
159
160}  // namespace options
161