Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Side by Side Diff: chrome/browser/extensions/extension_content_settings_api.cc

Issue 7029031: Content settings extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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/extensions/extension_content_settings_api.h"
6
7 #include "base/values.h"
8 #include "chrome/browser/content_settings/host_content_settings_map.h"
9 #include "chrome/browser/extensions/extension_service.h"
10 #include "chrome/browser/extensions/extension_content_settings_api_constants.h"
11 #include "chrome/browser/extensions/extension_content_settings_helpers.h"
12 #include "chrome/browser/extensions/extension_content_settings_store.h"
13 #include "chrome/browser/extensions/extension_preference_api_constants.h"
14 #include "chrome/browser/extensions/extension_preference_helpers.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/extensions/extension_error_utils.h"
17
18 namespace helpers = extension_content_settings_helpers;
19 namespace keys = extension_content_settings_api_constants;
20 namespace pref_helpers = extension_preference_helpers;
21 namespace pref_keys = extension_preference_api_constants;
22
23 bool ClearContentSettingsFunction::RunImpl() {
24 std::string content_type_str;
25 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &content_type_str));
26 ContentSettingsType content_type =
27 helpers::StringToContentSettingsType(content_type_str);
28 EXTENSION_FUNCTION_VALIDATE(content_type != CONTENT_SETTINGS_TYPE_DEFAULT);
29
30 DictionaryValue* details = NULL;
31 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
32
33 extension_prefs_scope::Scope scope = extension_prefs_scope::kRegular;
34 if (details->HasKey(pref_keys::kScopeKey)) {
35 std::string scope_str;
36 EXTENSION_FUNCTION_VALIDATE(details->GetString(pref_keys::kScopeKey,
37 &scope_str));
38
39 EXTENSION_FUNCTION_VALIDATE(pref_helpers::StringToScope(scope_str, &scope));
40 EXTENSION_FUNCTION_VALIDATE(
41 scope != extension_prefs_scope::kIncognitoPersistent);
42 }
43
44 bool incognito = (scope == extension_prefs_scope::kIncognitoPersistent ||
45 scope == extension_prefs_scope::kIncognitoSessionOnly);
46 if (incognito) {
47 // We don't check incognito permissions here, as an extension should be
48 // always allowed to clear its own settings.
49 } else {
50 // Incognito profiles can't access regular mode ever, they only exist in
51 // split mode.
52 if (profile()->IsOffTheRecord()) {
53 error_ = keys::kIncognitoContextError;
54 return false;
55 }
56 }
57
58 ExtensionContentSettingsStore* store =
59 profile_->GetExtensionService()->GetExtensionContentSettingsStore();
60 store->ClearContentSettingsForExtension(extension_id(), scope);
61
62 return true;
63 }
64
65 bool GetContentSettingFunction::RunImpl() {
66 std::string content_type_str;
67 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &content_type_str));
68 ContentSettingsType content_type =
69 helpers::StringToContentSettingsType(content_type_str);
70 EXTENSION_FUNCTION_VALIDATE(content_type != CONTENT_SETTINGS_TYPE_DEFAULT);
71
72 DictionaryValue* details = NULL;
73 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
74
75 std::string embedded_url_spec;
76 EXTENSION_FUNCTION_VALIDATE(
77 details->GetString(keys::kEmbeddedUrlKey, &embedded_url_spec));
78 GURL embedded_url(embedded_url_spec);
79 if (!embedded_url.is_valid()) {
80 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError,
81 embedded_url_spec);
82 return false;
83 }
84
85 std::string top_level_url_spec;
86 EXTENSION_FUNCTION_VALIDATE(
87 details->GetString(keys::kTopLevelUrlKey, &top_level_url_spec));
88 GURL top_level_url(top_level_url_spec);
89 if (!top_level_url.is_valid()) {
90 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError,
91 top_level_url_spec);
92 return false;
93 }
94
95 std::string resource_identifier;
96 if (details->HasKey(keys::kResourceIdentifierKey)) {
97 DictionaryValue* resource_identifier_dict = NULL;
98 EXTENSION_FUNCTION_VALIDATE(
99 details->GetDictionary(keys::kResourceIdentifierKey,
100 &resource_identifier_dict));
101 EXTENSION_FUNCTION_VALIDATE(
102 resource_identifier_dict->GetString(keys::kIdKey,
103 &resource_identifier));
104 }
105
106 bool incognito = false;
107 if (details->HasKey(pref_keys::kIncognitoKey)) {
108 EXTENSION_FUNCTION_VALIDATE(
109 details->GetBoolean(pref_keys::kIncognitoKey, &incognito));
110 }
111 if (incognito && !include_incognito()) {
112 error_ = pref_keys::kIncognitoErrorMessage;
113 return false;
114 }
115
116 HostContentSettingsMap* map;
117 if (incognito) {
118 if (!profile()->HasOffTheRecordProfile()) {
119 // TODO(bauerb): Allow reading incognito content settings
120 // outside of an incognito session.
121 error_ = keys::kIncognitoSessionOnlyError;
122 return false;
123 }
124 map = profile()->GetOffTheRecordProfile()->GetHostContentSettingsMap();
125 } else {
126 map = profile()->GetHostContentSettingsMap();
127 }
128
129 ContentSetting setting;
130 if (content_type == CONTENT_SETTINGS_TYPE_COOKIES) {
131 // TODO(jochen): Do we return the value for setting or for reading cookies?
132 bool setting_cookie = false;
133 setting = map->GetCookieContentSetting(embedded_url, top_level_url,
134 setting_cookie);
135 } else {
136 setting = map->GetContentSetting(top_level_url, content_type,
137 resource_identifier);
138 }
139
140 DictionaryValue* result = new DictionaryValue();
141 result->SetString(keys::kContentSettingKey,
142 helpers::ContentSettingToString(setting));
143
144 result_.reset(result);
145
146 return true;
147 }
148
149 bool SetContentSettingFunction::RunImpl() {
150 std::string content_type_str;
151 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &content_type_str));
152 ContentSettingsType content_type =
153 helpers::StringToContentSettingsType(content_type_str);
154 EXTENSION_FUNCTION_VALIDATE(content_type != CONTENT_SETTINGS_TYPE_DEFAULT);
155
156 DictionaryValue* details = NULL;
157 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
158
159 DictionaryValue* top_level_pattern_dict = NULL;
160 EXTENSION_FUNCTION_VALIDATE(
161 details->GetDictionary(keys::kTopLevelPatternKey,
162 &top_level_pattern_dict));
163 std::string top_level_pattern_str;
164 EXTENSION_FUNCTION_VALIDATE(
165 top_level_pattern_dict->GetString(keys::kPatternKey,
166 &top_level_pattern_str));
167 ContentSettingsPattern top_level_pattern =
168 ContentSettingsPattern::FromString(top_level_pattern_str);
169 EXTENSION_FUNCTION_VALIDATE(top_level_pattern.IsValid());
170
171 DictionaryValue* embedded_pattern_dict = NULL;
172 EXTENSION_FUNCTION_VALIDATE(
173 details->GetDictionary(keys::kEmbeddedPatternKey,
174 &embedded_pattern_dict));
175 std::string embedded_pattern_str;
176 EXTENSION_FUNCTION_VALIDATE(
177 embedded_pattern_dict->GetString(keys::kPatternKey,
178 &embedded_pattern_str));
179 ContentSettingsPattern embedded_pattern =
180 ContentSettingsPattern::FromString(embedded_pattern_str);
181 EXTENSION_FUNCTION_VALIDATE(embedded_pattern.IsValid());
182
183 std::string resource_identifier;
184 if (details->HasKey(keys::kResourceIdentifierKey)) {
185 DictionaryValue* resource_identifier_dict = NULL;
186 EXTENSION_FUNCTION_VALIDATE(
187 details->GetDictionary(keys::kResourceIdentifierKey,
188 &resource_identifier_dict));
189 EXTENSION_FUNCTION_VALIDATE(
190 resource_identifier_dict->GetString(keys::kIdKey,
191 &resource_identifier));
192 }
battre 2011/06/07 18:16:14 nit: newline
Bernhard Bauer 2011/06/08 14:20:16 Done.
193 std::string setting_str;
194 EXTENSION_FUNCTION_VALIDATE(
195 details->GetString(keys::kContentSettingKey, &setting_str));
196 ContentSetting setting = CONTENT_SETTING_DEFAULT;
197 EXTENSION_FUNCTION_VALIDATE(
198 helpers::StringToContentSetting(setting_str, &setting));
199 EXTENSION_FUNCTION_VALIDATE(
200 HostContentSettingsMap::IsSettingAllowedForType(setting, content_type));
201
202 extension_prefs_scope::Scope scope = extension_prefs_scope::kRegular;
battre 2011/06/07 18:16:14 Please note that the extension_prefs_scope is gone
Bernhard Bauer 2011/06/08 14:20:16 Yup, rebasing.
203 if (details->HasKey(pref_keys::kScopeKey)) {
204 std::string scope_str;
205 EXTENSION_FUNCTION_VALIDATE(details->GetString(pref_keys::kScopeKey,
206 &scope_str));
207
208 EXTENSION_FUNCTION_VALIDATE(pref_helpers::StringToScope(scope_str, &scope));
209 EXTENSION_FUNCTION_VALIDATE(
210 scope != extension_prefs_scope::kIncognitoPersistent);
211 }
212
213 bool incognito = (scope == extension_prefs_scope::kIncognitoPersistent ||
214 scope == extension_prefs_scope::kIncognitoSessionOnly);
215 if (incognito) {
216 // Regular profiles can't access incognito unless include_incognito is true.
217 if (!profile()->IsOffTheRecord() && !include_incognito()) {
218 error_ = pref_keys::kIncognitoErrorMessage;
219 return false;
220 }
221 } else {
222 // Incognito profiles can't access regular mode ever, they only exist in
223 // split mode.
224 if (profile()->IsOffTheRecord()) {
225 error_ = keys::kIncognitoContextError;
226 return false;
227 }
228 }
229
230 if (scope == extension_prefs_scope::kIncognitoSessionOnly &&
231 !profile_->HasOffTheRecordProfile()) {
232 error_ = pref_keys::kIncognitoSessionOnlyErrorMessage;
233 return false;
234 }
235
236 ExtensionContentSettingsStore* store =
237 profile_->GetExtensionService()->GetExtensionContentSettingsStore();
238 store->SetExtensionContentSetting(extension_id(), top_level_pattern,
239 embedded_pattern, content_type,
240 resource_identifier, setting, scope);
241 return true;
242 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698