Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / content_settings / host_content_settings_map_unittest.cc
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 "base/auto_reset.h"
6 #include "base/command_line.h"
7 #include "base/json/json_reader.h"
8 #include "base/json/json_writer.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/prefs/scoped_user_pref_update.h"
12 #include "chrome/browser/content_settings/content_settings_mock_observer.h"
13 #include "chrome/browser/content_settings/cookie_settings.h"
14 #include "chrome/browser/content_settings/host_content_settings_map.h"
15 #include "chrome/browser/content_settings/mock_settings_observer.h"
16 #include "chrome/common/chrome_switches.h"
17 #include "chrome/common/pref_names.h"
18 #include "chrome/common/url_constants.h"
19 #include "chrome/test/base/testing_pref_service_syncable.h"
20 #include "chrome/test/base/testing_profile.h"
21 #include "components/content_settings/core/browser/content_settings_details.h"
22 #include "content/public/test/test_browser_thread.h"
23 #include "net/base/static_cookie_policy.h"
24 #include "testing/gtest/include/gtest/gtest.h"
25 #include "url/gurl.h"
26
27 using content::BrowserThread;
28
29 using ::testing::_;
30
31 class HostContentSettingsMapTest : public testing::Test {
32  public:
33   HostContentSettingsMapTest() : ui_thread_(BrowserThread::UI, &message_loop_) {
34   }
35
36  protected:
37   base::MessageLoop message_loop_;
38   content::TestBrowserThread ui_thread_;
39 };
40
41 TEST_F(HostContentSettingsMapTest, DefaultValues) {
42   TestingProfile profile;
43   HostContentSettingsMap* host_content_settings_map =
44       profile.GetHostContentSettingsMap();
45
46   // Check setting defaults.
47   EXPECT_EQ(CONTENT_SETTING_ALLOW,
48             host_content_settings_map->GetDefaultContentSetting(
49                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
50   host_content_settings_map->SetDefaultContentSetting(
51       CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK);
52   EXPECT_EQ(CONTENT_SETTING_BLOCK,
53             host_content_settings_map->GetDefaultContentSetting(
54                 CONTENT_SETTINGS_TYPE_IMAGES, NULL));
55   EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting(
56                 GURL(chrome::kChromeUINewTabURL),
57                 GURL(chrome::kChromeUINewTabURL),
58                 CONTENT_SETTINGS_TYPE_IMAGES,
59                 std::string()));
60   {
61     host_content_settings_map->SetDefaultContentSetting(
62         CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_ASK);
63     EXPECT_EQ(CONTENT_SETTING_ASK,
64               host_content_settings_map->GetDefaultContentSetting(
65                   CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
66   }
67   host_content_settings_map->SetDefaultContentSetting(
68       CONTENT_SETTINGS_TYPE_POPUPS, CONTENT_SETTING_ALLOW);
69   EXPECT_EQ(CONTENT_SETTING_ALLOW,
70             host_content_settings_map->GetDefaultContentSetting(
71                 CONTENT_SETTINGS_TYPE_POPUPS, NULL));
72 }
73
74 TEST_F(HostContentSettingsMapTest, IndividualSettings) {
75   TestingProfile profile;
76   HostContentSettingsMap* host_content_settings_map =
77       profile.GetHostContentSettingsMap();
78
79   // Check returning individual settings.
80   GURL host("http://example.com/");
81   ContentSettingsPattern pattern =
82        ContentSettingsPattern::FromString("[*.]example.com");
83   EXPECT_EQ(CONTENT_SETTING_ALLOW,
84             host_content_settings_map->GetContentSetting(
85                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
86   host_content_settings_map->SetContentSetting(
87       pattern,
88       ContentSettingsPattern::Wildcard(),
89       CONTENT_SETTINGS_TYPE_IMAGES,
90       std::string(),
91       CONTENT_SETTING_DEFAULT);
92   EXPECT_EQ(CONTENT_SETTING_ALLOW,
93             host_content_settings_map->GetContentSetting(
94                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
95   host_content_settings_map->SetContentSetting(
96       pattern,
97       ContentSettingsPattern::Wildcard(),
98       CONTENT_SETTINGS_TYPE_IMAGES,
99       std::string(),
100       CONTENT_SETTING_BLOCK);
101   EXPECT_EQ(CONTENT_SETTING_BLOCK,
102             host_content_settings_map->GetContentSetting(
103                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
104   EXPECT_EQ(CONTENT_SETTING_ALLOW,
105             host_content_settings_map->GetContentSetting(
106                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string()));
107
108   // Check returning all settings for a host.
109   host_content_settings_map->SetContentSetting(
110       pattern,
111       ContentSettingsPattern::Wildcard(),
112       CONTENT_SETTINGS_TYPE_IMAGES,
113       std::string(),
114       CONTENT_SETTING_DEFAULT);
115   EXPECT_EQ(CONTENT_SETTING_ALLOW,
116             host_content_settings_map->GetContentSetting(
117                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
118   host_content_settings_map->SetContentSetting(
119       pattern,
120       ContentSettingsPattern::Wildcard(),
121       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
122       std::string(),
123       CONTENT_SETTING_BLOCK);
124   EXPECT_EQ(CONTENT_SETTING_BLOCK,
125             host_content_settings_map->GetContentSetting(
126                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
127   host_content_settings_map->SetContentSetting(
128       pattern,
129       ContentSettingsPattern::Wildcard(),
130       CONTENT_SETTINGS_TYPE_PLUGINS,
131       std::string(),
132       CONTENT_SETTING_ALLOW);
133   EXPECT_EQ(CONTENT_SETTING_ALLOW,
134             host_content_settings_map->GetContentSetting(
135                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string()));
136   EXPECT_EQ(CONTENT_SETTING_BLOCK,
137             host_content_settings_map->GetContentSetting(
138                 host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string()));
139   EXPECT_EQ(CONTENT_SETTING_ASK,
140             host_content_settings_map->GetContentSetting(
141                 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
142   EXPECT_EQ(
143       CONTENT_SETTING_ASK,
144       host_content_settings_map->GetContentSetting(
145           host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string()));
146   EXPECT_EQ(CONTENT_SETTING_ASK,
147             host_content_settings_map->GetContentSetting(
148                 host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string()));
149   EXPECT_EQ(CONTENT_SETTING_ASK,
150             host_content_settings_map->GetContentSetting(
151                 host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string()));
152
153   // Check returning all hosts for a setting.
154   ContentSettingsPattern pattern2 =
155        ContentSettingsPattern::FromString("[*.]example.org");
156   host_content_settings_map->SetContentSetting(
157       pattern2,
158       ContentSettingsPattern::Wildcard(),
159       CONTENT_SETTINGS_TYPE_IMAGES,
160       std::string(),
161       CONTENT_SETTING_BLOCK);
162   host_content_settings_map->SetContentSetting(
163       pattern2,
164       ContentSettingsPattern::Wildcard(),
165       CONTENT_SETTINGS_TYPE_PLUGINS,
166       std::string(),
167       CONTENT_SETTING_BLOCK);
168   ContentSettingsForOneType host_settings;
169   host_content_settings_map->GetSettingsForOneType(
170       CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings);
171   // |host_settings| contains the default setting and an exception.
172   EXPECT_EQ(2U, host_settings.size());
173   host_content_settings_map->GetSettingsForOneType(
174       CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings);
175   // |host_settings| contains the default setting and 2 exceptions.
176   EXPECT_EQ(3U, host_settings.size());
177   host_content_settings_map->GetSettingsForOneType(
178       CONTENT_SETTINGS_TYPE_POPUPS, std::string(), &host_settings);
179   // |host_settings| contains only the default setting.
180   EXPECT_EQ(1U, host_settings.size());
181 }
182
183 TEST_F(HostContentSettingsMapTest, Clear) {
184   TestingProfile profile;
185   HostContentSettingsMap* host_content_settings_map =
186       profile.GetHostContentSettingsMap();
187
188   // Check clearing one type.
189   ContentSettingsPattern pattern =
190        ContentSettingsPattern::FromString("[*.]example.org");
191   ContentSettingsPattern pattern2 =
192       ContentSettingsPattern::FromString("[*.]example.net");
193   host_content_settings_map->SetContentSetting(
194       pattern2,
195       ContentSettingsPattern::Wildcard(),
196       CONTENT_SETTINGS_TYPE_IMAGES,
197       std::string(),
198       CONTENT_SETTING_BLOCK);
199   host_content_settings_map->SetContentSetting(
200       pattern,
201       ContentSettingsPattern::Wildcard(),
202       CONTENT_SETTINGS_TYPE_IMAGES,
203       std::string(),
204       CONTENT_SETTING_BLOCK);
205   host_content_settings_map->SetContentSetting(
206       pattern,
207       ContentSettingsPattern::Wildcard(),
208       CONTENT_SETTINGS_TYPE_PLUGINS,
209       std::string(),
210       CONTENT_SETTING_BLOCK);
211   host_content_settings_map->SetContentSetting(
212       pattern2,
213       ContentSettingsPattern::Wildcard(),
214       CONTENT_SETTINGS_TYPE_IMAGES,
215       std::string(),
216       CONTENT_SETTING_BLOCK);
217   host_content_settings_map->ClearSettingsForOneType(
218       CONTENT_SETTINGS_TYPE_IMAGES);
219   ContentSettingsForOneType host_settings;
220   host_content_settings_map->GetSettingsForOneType(
221       CONTENT_SETTINGS_TYPE_IMAGES, std::string(), &host_settings);
222   // |host_settings| contains only the default setting.
223   EXPECT_EQ(1U, host_settings.size());
224   host_content_settings_map->GetSettingsForOneType(
225       CONTENT_SETTINGS_TYPE_PLUGINS, std::string(), &host_settings);
226   // |host_settings| contains the default setting and an exception.
227   EXPECT_EQ(2U, host_settings.size());
228 }
229
230 TEST_F(HostContentSettingsMapTest, Patterns) {
231   TestingProfile profile;
232   HostContentSettingsMap* host_content_settings_map =
233       profile.GetHostContentSettingsMap();
234
235   GURL host1("http://example.com/");
236   GURL host2("http://www.example.com/");
237   GURL host3("http://example.org/");
238   ContentSettingsPattern pattern1 =
239        ContentSettingsPattern::FromString("[*.]example.com");
240   ContentSettingsPattern pattern2 =
241        ContentSettingsPattern::FromString("example.org");
242   EXPECT_EQ(CONTENT_SETTING_ALLOW,
243             host_content_settings_map->GetContentSetting(
244                 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
245   host_content_settings_map->SetContentSetting(
246       pattern1,
247       ContentSettingsPattern::Wildcard(),
248       CONTENT_SETTINGS_TYPE_IMAGES,
249       std::string(),
250       CONTENT_SETTING_BLOCK);
251   EXPECT_EQ(CONTENT_SETTING_BLOCK,
252             host_content_settings_map->GetContentSetting(
253                 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
254   EXPECT_EQ(CONTENT_SETTING_BLOCK,
255             host_content_settings_map->GetContentSetting(
256                 host2, host2, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
257   EXPECT_EQ(CONTENT_SETTING_ALLOW,
258             host_content_settings_map->GetContentSetting(
259                 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
260   host_content_settings_map->SetContentSetting(
261       pattern2,
262       ContentSettingsPattern::Wildcard(),
263       CONTENT_SETTINGS_TYPE_IMAGES,
264       std::string(),
265       CONTENT_SETTING_BLOCK);
266   EXPECT_EQ(CONTENT_SETTING_BLOCK,
267             host_content_settings_map->GetContentSetting(
268                 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
269 }
270
271 TEST_F(HostContentSettingsMapTest, Observer) {
272   TestingProfile profile;
273   HostContentSettingsMap* host_content_settings_map =
274       profile.GetHostContentSettingsMap();
275   MockSettingsObserver observer(host_content_settings_map);
276
277   ContentSettingsPattern primary_pattern =
278       ContentSettingsPattern::FromString("[*.]example.com");
279   ContentSettingsPattern secondary_pattern =
280       ContentSettingsPattern::Wildcard();
281   EXPECT_CALL(observer,
282               OnContentSettingsChanged(host_content_settings_map,
283                                        CONTENT_SETTINGS_TYPE_IMAGES,
284                                        false,
285                                        primary_pattern,
286                                        secondary_pattern,
287                                        false));
288   host_content_settings_map->SetContentSetting(
289       primary_pattern,
290       secondary_pattern,
291       CONTENT_SETTINGS_TYPE_IMAGES,
292       std::string(),
293       CONTENT_SETTING_ALLOW);
294   ::testing::Mock::VerifyAndClearExpectations(&observer);
295
296   EXPECT_CALL(observer,
297               OnContentSettingsChanged(host_content_settings_map,
298                                        CONTENT_SETTINGS_TYPE_IMAGES, false,
299                                        _, _, true));
300   host_content_settings_map->ClearSettingsForOneType(
301       CONTENT_SETTINGS_TYPE_IMAGES);
302   ::testing::Mock::VerifyAndClearExpectations(&observer);
303
304   EXPECT_CALL(observer,
305               OnContentSettingsChanged(host_content_settings_map,
306                                        CONTENT_SETTINGS_TYPE_IMAGES, false,
307                                        _, _, true));
308   host_content_settings_map->SetDefaultContentSetting(
309       CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK);
310 }
311
312 TEST_F(HostContentSettingsMapTest, ObserveDefaultPref) {
313   TestingProfile profile;
314   HostContentSettingsMap* host_content_settings_map =
315       profile.GetHostContentSettingsMap();
316
317   PrefService* prefs = profile.GetPrefs();
318
319   // Make a copy of the default pref value so we can reset it later.
320   scoped_ptr<base::Value> default_value(prefs->FindPreference(
321       prefs::kDefaultContentSettings)->GetValue()->DeepCopy());
322
323   GURL host("http://example.com");
324
325   host_content_settings_map->SetDefaultContentSetting(
326       CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK);
327   EXPECT_EQ(CONTENT_SETTING_BLOCK,
328             host_content_settings_map->GetContentSetting(
329                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
330
331   // Make a copy of the pref's new value so we can reset it later.
332   scoped_ptr<base::Value> new_value(prefs->FindPreference(
333       prefs::kDefaultContentSettings)->GetValue()->DeepCopy());
334
335   // Clearing the backing pref should also clear the internal cache.
336   prefs->Set(prefs::kDefaultContentSettings, *default_value);
337   EXPECT_EQ(CONTENT_SETTING_ALLOW,
338             host_content_settings_map->GetContentSetting(
339                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
340
341   // Reseting the pref to its previous value should update the cache.
342   prefs->Set(prefs::kDefaultContentSettings, *new_value);
343   EXPECT_EQ(CONTENT_SETTING_BLOCK,
344             host_content_settings_map->GetContentSetting(
345                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
346 }
347
348 TEST_F(HostContentSettingsMapTest, ObserveExceptionPref) {
349   TestingProfile profile;
350   HostContentSettingsMap* host_content_settings_map =
351       profile.GetHostContentSettingsMap();
352
353   PrefService* prefs = profile.GetPrefs();
354
355   // Make a copy of the default pref value so we can reset it later.
356   scoped_ptr<base::Value> default_value(prefs->FindPreference(
357       prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy());
358
359   ContentSettingsPattern pattern =
360        ContentSettingsPattern::FromString("[*.]example.com");
361   GURL host("http://example.com");
362
363   EXPECT_EQ(CONTENT_SETTING_ALLOW,
364             host_content_settings_map->GetContentSetting(
365                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
366
367   host_content_settings_map->SetContentSetting(
368       pattern,
369       ContentSettingsPattern::Wildcard(),
370       CONTENT_SETTINGS_TYPE_IMAGES,
371       std::string(),
372       CONTENT_SETTING_BLOCK);
373   EXPECT_EQ(CONTENT_SETTING_BLOCK,
374             host_content_settings_map->GetContentSetting(
375                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
376
377   // Make a copy of the pref's new value so we can reset it later.
378   scoped_ptr<base::Value> new_value(prefs->FindPreference(
379       prefs::kContentSettingsPatternPairs)->GetValue()->DeepCopy());
380
381   // Clearing the backing pref should also clear the internal cache.
382   prefs->Set(prefs::kContentSettingsPatternPairs, *default_value);
383   EXPECT_EQ(CONTENT_SETTING_ALLOW,
384             host_content_settings_map->GetContentSetting(
385                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
386
387   // Reseting the pref to its previous value should update the cache.
388   prefs->Set(prefs::kContentSettingsPatternPairs, *new_value);
389   EXPECT_EQ(CONTENT_SETTING_BLOCK,
390             host_content_settings_map->GetContentSetting(
391                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
392 }
393
394 TEST_F(HostContentSettingsMapTest, HostTrimEndingDotCheck) {
395   TestingProfile profile;
396   HostContentSettingsMap* host_content_settings_map =
397       profile.GetHostContentSettingsMap();
398   CookieSettings* cookie_settings =
399       CookieSettings::Factory::GetForProfile(&profile).get();
400
401   ContentSettingsPattern pattern =
402        ContentSettingsPattern::FromString("[*.]example.com");
403   GURL host_ending_with_dot("http://example.com./");
404
405   EXPECT_EQ(CONTENT_SETTING_ALLOW,
406             host_content_settings_map->GetContentSetting(
407                 host_ending_with_dot,
408                 host_ending_with_dot,
409                 CONTENT_SETTINGS_TYPE_IMAGES,
410                 std::string()));
411   host_content_settings_map->SetContentSetting(
412       pattern,
413       ContentSettingsPattern::Wildcard(),
414       CONTENT_SETTINGS_TYPE_IMAGES,
415       std::string(),
416       CONTENT_SETTING_DEFAULT);
417   EXPECT_EQ(
418       CONTENT_SETTING_ALLOW,
419       host_content_settings_map->GetContentSetting(host_ending_with_dot,
420                                                    host_ending_with_dot,
421                                                    CONTENT_SETTINGS_TYPE_IMAGES,
422                                                    std::string()));
423   host_content_settings_map->SetContentSetting(
424       pattern,
425       ContentSettingsPattern::Wildcard(),
426       CONTENT_SETTINGS_TYPE_IMAGES,
427       std::string(),
428       CONTENT_SETTING_BLOCK);
429   EXPECT_EQ(
430       CONTENT_SETTING_BLOCK,
431       host_content_settings_map->GetContentSetting(host_ending_with_dot,
432                                                    host_ending_with_dot,
433                                                    CONTENT_SETTINGS_TYPE_IMAGES,
434                                                    std::string()));
435
436   EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed(
437       host_ending_with_dot, host_ending_with_dot));
438   host_content_settings_map->SetContentSetting(
439       pattern,
440       ContentSettingsPattern::Wildcard(),
441       CONTENT_SETTINGS_TYPE_COOKIES,
442       std::string(),
443       CONTENT_SETTING_DEFAULT);
444   EXPECT_TRUE(cookie_settings->IsSettingCookieAllowed(
445       host_ending_with_dot, host_ending_with_dot));
446   host_content_settings_map->SetContentSetting(
447       pattern,
448       ContentSettingsPattern::Wildcard(),
449       CONTENT_SETTINGS_TYPE_COOKIES,
450       std::string(),
451       CONTENT_SETTING_BLOCK);
452   EXPECT_FALSE(cookie_settings->IsSettingCookieAllowed(
453       host_ending_with_dot, host_ending_with_dot));
454
455   EXPECT_EQ(CONTENT_SETTING_ALLOW,
456             host_content_settings_map->GetContentSetting(
457                 host_ending_with_dot,
458                 host_ending_with_dot,
459                 CONTENT_SETTINGS_TYPE_JAVASCRIPT,
460                 std::string()));
461   host_content_settings_map->SetContentSetting(
462       pattern,
463       ContentSettingsPattern::Wildcard(),
464       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
465       std::string(),
466       CONTENT_SETTING_DEFAULT);
467   EXPECT_EQ(CONTENT_SETTING_ALLOW,
468             host_content_settings_map->GetContentSetting(
469                 host_ending_with_dot,
470                 host_ending_with_dot,
471                 CONTENT_SETTINGS_TYPE_JAVASCRIPT,
472                 std::string()));
473   host_content_settings_map->SetContentSetting(
474       pattern,
475       ContentSettingsPattern::Wildcard(),
476       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
477       std::string(),
478       CONTENT_SETTING_BLOCK);
479   EXPECT_EQ(CONTENT_SETTING_BLOCK,
480             host_content_settings_map->GetContentSetting(
481                 host_ending_with_dot,
482                 host_ending_with_dot,
483                 CONTENT_SETTINGS_TYPE_JAVASCRIPT,
484                 std::string()));
485
486   EXPECT_EQ(CONTENT_SETTING_ALLOW,
487             host_content_settings_map->GetContentSetting(
488                 host_ending_with_dot,
489                 host_ending_with_dot,
490                 CONTENT_SETTINGS_TYPE_PLUGINS,
491                 std::string()));
492   host_content_settings_map->SetContentSetting(
493       pattern,
494       ContentSettingsPattern::Wildcard(),
495       CONTENT_SETTINGS_TYPE_PLUGINS,
496       std::string(),
497       CONTENT_SETTING_DEFAULT);
498   EXPECT_EQ(CONTENT_SETTING_ALLOW,
499             host_content_settings_map->GetContentSetting(
500                 host_ending_with_dot,
501                 host_ending_with_dot,
502                 CONTENT_SETTINGS_TYPE_PLUGINS,
503                 std::string()));
504   host_content_settings_map->SetContentSetting(
505       pattern,
506       ContentSettingsPattern::Wildcard(),
507       CONTENT_SETTINGS_TYPE_PLUGINS,
508       std::string(),
509       CONTENT_SETTING_BLOCK);
510   EXPECT_EQ(CONTENT_SETTING_BLOCK,
511             host_content_settings_map->GetContentSetting(
512                 host_ending_with_dot,
513                 host_ending_with_dot,
514                 CONTENT_SETTINGS_TYPE_PLUGINS,
515                 std::string()));
516
517   EXPECT_EQ(
518       CONTENT_SETTING_BLOCK,
519       host_content_settings_map->GetContentSetting(host_ending_with_dot,
520                                                    host_ending_with_dot,
521                                                    CONTENT_SETTINGS_TYPE_POPUPS,
522                                                    std::string()));
523   host_content_settings_map->SetContentSetting(
524       pattern,
525       ContentSettingsPattern::Wildcard(),
526       CONTENT_SETTINGS_TYPE_POPUPS,
527       std::string(),
528       CONTENT_SETTING_DEFAULT);
529   EXPECT_EQ(
530       CONTENT_SETTING_BLOCK,
531       host_content_settings_map->GetContentSetting(host_ending_with_dot,
532                                                    host_ending_with_dot,
533                                                    CONTENT_SETTINGS_TYPE_POPUPS,
534                                                    std::string()));
535   host_content_settings_map->SetContentSetting(
536       pattern,
537       ContentSettingsPattern::Wildcard(),
538       CONTENT_SETTINGS_TYPE_POPUPS,
539       std::string(),
540       CONTENT_SETTING_ALLOW);
541   EXPECT_EQ(
542       CONTENT_SETTING_ALLOW,
543       host_content_settings_map->GetContentSetting(host_ending_with_dot,
544                                                    host_ending_with_dot,
545                                                    CONTENT_SETTINGS_TYPE_POPUPS,
546                                                    std::string()));
547 }
548
549 TEST_F(HostContentSettingsMapTest, NestedSettings) {
550   TestingProfile profile;
551   HostContentSettingsMap* host_content_settings_map =
552       profile.GetHostContentSettingsMap();
553
554   GURL host("http://a.b.example.com/");
555   ContentSettingsPattern pattern1 =
556        ContentSettingsPattern::FromString("[*.]example.com");
557   ContentSettingsPattern pattern2 =
558        ContentSettingsPattern::FromString("[*.]b.example.com");
559   ContentSettingsPattern pattern3 =
560        ContentSettingsPattern::FromString("a.b.example.com");
561
562   host_content_settings_map->SetContentSetting(
563       pattern1,
564       ContentSettingsPattern::Wildcard(),
565       CONTENT_SETTINGS_TYPE_IMAGES,
566       std::string(),
567       CONTENT_SETTING_BLOCK);
568
569   host_content_settings_map->SetContentSetting(
570       pattern2,
571       ContentSettingsPattern::Wildcard(),
572       CONTENT_SETTINGS_TYPE_COOKIES,
573       std::string(),
574       CONTENT_SETTING_BLOCK);
575
576   host_content_settings_map->SetContentSetting(
577       pattern3,
578       ContentSettingsPattern::Wildcard(),
579       CONTENT_SETTINGS_TYPE_PLUGINS,
580       std::string(),
581       CONTENT_SETTING_BLOCK);
582   host_content_settings_map->SetDefaultContentSetting(
583       CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
584
585   EXPECT_EQ(CONTENT_SETTING_BLOCK,
586             host_content_settings_map->GetContentSetting(
587                 host, host, CONTENT_SETTINGS_TYPE_COOKIES, std::string()));
588   EXPECT_EQ(CONTENT_SETTING_BLOCK,
589             host_content_settings_map->GetContentSetting(
590                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
591   EXPECT_EQ(CONTENT_SETTING_BLOCK,
592             host_content_settings_map->GetContentSetting(
593                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
594   EXPECT_EQ(CONTENT_SETTING_BLOCK,
595             host_content_settings_map->GetContentSetting(
596                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, std::string()));
597   EXPECT_EQ(CONTENT_SETTING_BLOCK,
598             host_content_settings_map->GetContentSetting(
599                 host, host, CONTENT_SETTINGS_TYPE_POPUPS, std::string()));
600   EXPECT_EQ(CONTENT_SETTING_ASK,
601             host_content_settings_map->GetContentSetting(
602                 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
603   EXPECT_EQ(
604       CONTENT_SETTING_ASK,
605       host_content_settings_map->GetContentSetting(
606           host, host, CONTENT_SETTINGS_TYPE_NOTIFICATIONS, std::string()));
607   EXPECT_EQ(CONTENT_SETTING_ASK,
608             host_content_settings_map->GetContentSetting(
609                 host, host, CONTENT_SETTINGS_TYPE_FULLSCREEN, std::string()));
610   EXPECT_EQ(CONTENT_SETTING_ASK,
611             host_content_settings_map->GetContentSetting(
612                 host, host, CONTENT_SETTINGS_TYPE_MOUSELOCK, std::string()));
613 }
614
615 TEST_F(HostContentSettingsMapTest, OffTheRecord) {
616   TestingProfile profile;
617   HostContentSettingsMap* host_content_settings_map =
618       profile.GetHostContentSettingsMap();
619   scoped_refptr<HostContentSettingsMap> otr_map(
620       new HostContentSettingsMap(profile.GetPrefs(),
621                                  true));
622
623   GURL host("http://example.com/");
624   ContentSettingsPattern pattern =
625        ContentSettingsPattern::FromString("[*.]example.com");
626
627   EXPECT_EQ(CONTENT_SETTING_ALLOW,
628             host_content_settings_map->GetContentSetting(
629                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
630   EXPECT_EQ(CONTENT_SETTING_ALLOW,
631             otr_map->GetContentSetting(
632                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
633
634   // Changing content settings on the main map should also affect the
635   // incognito map.
636   host_content_settings_map->SetContentSetting(
637       pattern,
638       ContentSettingsPattern::Wildcard(),
639       CONTENT_SETTINGS_TYPE_IMAGES,
640       std::string(),
641       CONTENT_SETTING_BLOCK);
642   EXPECT_EQ(CONTENT_SETTING_BLOCK,
643             host_content_settings_map->GetContentSetting(
644                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
645   EXPECT_EQ(CONTENT_SETTING_BLOCK,
646             otr_map->GetContentSetting(
647                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
648
649   // Changing content settings on the incognito map should NOT affect the
650   // main map.
651   otr_map->SetContentSetting(pattern,
652                              ContentSettingsPattern::Wildcard(),
653                              CONTENT_SETTINGS_TYPE_IMAGES,
654                              std::string(),
655                              CONTENT_SETTING_ALLOW);
656   EXPECT_EQ(CONTENT_SETTING_BLOCK,
657             host_content_settings_map->GetContentSetting(
658                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
659   EXPECT_EQ(CONTENT_SETTING_ALLOW,
660             otr_map->GetContentSetting(
661                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
662
663   otr_map->ShutdownOnUIThread();
664 }
665
666 // For a single Unicode encoded pattern, check if it gets converted to punycode
667 // and old pattern gets deleted.
668 TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeOnly) {
669   TestingProfile profile;
670   PrefService* prefs = profile.GetPrefs();
671
672   // Set utf-8 data.
673   {
674     DictionaryPrefUpdate update(prefs, prefs::kContentSettingsPatternPairs);
675     base::DictionaryValue* all_settings_dictionary = update.Get();
676     ASSERT_TRUE(NULL != all_settings_dictionary);
677
678     base::DictionaryValue* dummy_payload = new base::DictionaryValue;
679     dummy_payload->SetInteger("images", CONTENT_SETTING_ALLOW);
680     all_settings_dictionary->SetWithoutPathExpansion("[*.]\xC4\x87ira.com,*",
681                                                      dummy_payload);
682   }
683   profile.GetHostContentSettingsMap();
684
685   const base::DictionaryValue* all_settings_dictionary =
686       prefs->GetDictionary(prefs::kContentSettingsPatternPairs);
687   const base::DictionaryValue* result = NULL;
688   EXPECT_FALSE(all_settings_dictionary->GetDictionaryWithoutPathExpansion(
689       "[*.]\xC4\x87ira.com,*", &result));
690   EXPECT_TRUE(all_settings_dictionary->GetDictionaryWithoutPathExpansion(
691       "[*.]xn--ira-ppa.com,*", &result));
692 }
693
694 // If both Unicode and its punycode pattern exist, make sure we don't touch the
695 // settings for the punycode, and that Unicode pattern gets deleted.
696 TEST_F(HostContentSettingsMapTest, CanonicalizeExceptionsUnicodeAndPunycode) {
697   TestingProfile profile;
698
699   scoped_ptr<base::Value> value(base::JSONReader::Read(
700       "{\"[*.]\\xC4\\x87ira.com,*\":{\"images\":1}}"));
701   profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *value);
702
703   // Set punycode equivalent, with different setting.
704   scoped_ptr<base::Value> puny_value(base::JSONReader::Read(
705       "{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}"));
706   profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *puny_value);
707
708   // Initialize the content map.
709   profile.GetHostContentSettingsMap();
710
711   const base::DictionaryValue* content_setting_prefs =
712       profile.GetPrefs()->GetDictionary(prefs::kContentSettingsPatternPairs);
713   std::string prefs_as_json;
714   base::JSONWriter::Write(content_setting_prefs, &prefs_as_json);
715   EXPECT_STREQ("{\"[*.]xn--ira-ppa.com,*\":{\"images\":2}}",
716                prefs_as_json.c_str());
717 }
718
719 // If a default-content-setting is managed, the managed value should be used
720 // instead of the default value.
721 TEST_F(HostContentSettingsMapTest, ManagedDefaultContentSetting) {
722   TestingProfile profile;
723   HostContentSettingsMap* host_content_settings_map =
724       profile.GetHostContentSettingsMap();
725   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
726
727   EXPECT_EQ(CONTENT_SETTING_ALLOW,
728             host_content_settings_map->GetDefaultContentSetting(
729                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
730
731   // Set managed-default-content-setting through the coresponding preferences.
732   prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting,
733                         new base::FundamentalValue(CONTENT_SETTING_BLOCK));
734   EXPECT_EQ(CONTENT_SETTING_BLOCK,
735             host_content_settings_map->GetDefaultContentSetting(
736                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
737
738   // Remove managed-default-content-settings-preferences.
739   prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting);
740   EXPECT_EQ(CONTENT_SETTING_ALLOW,
741             host_content_settings_map->GetDefaultContentSetting(
742                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
743
744   // Set preference to manage the default-content-setting for Plugins.
745   prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting,
746                         new base::FundamentalValue(CONTENT_SETTING_BLOCK));
747   EXPECT_EQ(CONTENT_SETTING_BLOCK,
748             host_content_settings_map->GetDefaultContentSetting(
749                 CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
750
751   // Remove the preference to manage the default-content-setting for Plugins.
752   prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting);
753   EXPECT_EQ(CONTENT_SETTING_ALLOW,
754             host_content_settings_map->GetDefaultContentSetting(
755                 CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
756 }
757
758 TEST_F(HostContentSettingsMapTest,
759        GetNonDefaultContentSettingsIfTypeManaged) {
760   TestingProfile profile;
761   HostContentSettingsMap* host_content_settings_map =
762       profile.GetHostContentSettingsMap();
763   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
764
765   // Set pattern for JavaScript setting.
766   ContentSettingsPattern pattern =
767        ContentSettingsPattern::FromString("[*.]example.com");
768   host_content_settings_map->SetContentSetting(
769       pattern,
770       ContentSettingsPattern::Wildcard(),
771       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
772       std::string(),
773       CONTENT_SETTING_BLOCK);
774
775   EXPECT_EQ(CONTENT_SETTING_ALLOW,
776             host_content_settings_map->GetDefaultContentSetting(
777                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
778
779   GURL host("http://example.com/");
780   EXPECT_EQ(CONTENT_SETTING_BLOCK,
781             host_content_settings_map->GetContentSetting(
782                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
783
784   // Set managed-default-content-setting for content-settings-type JavaScript.
785   prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting,
786                         new base::FundamentalValue(CONTENT_SETTING_ALLOW));
787   EXPECT_EQ(CONTENT_SETTING_ALLOW,
788             host_content_settings_map->GetContentSetting(
789                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
790 }
791
792 // Managed default content setting should have higher priority
793 // than user defined patterns.
794 TEST_F(HostContentSettingsMapTest,
795        ManagedDefaultContentSettingIgnoreUserPattern) {
796   TestingProfile profile;
797   HostContentSettingsMap* host_content_settings_map =
798       profile.GetHostContentSettingsMap();
799   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
800
801   // Block all JavaScript.
802   host_content_settings_map->SetDefaultContentSetting(
803       CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK);
804
805   // Set an exception to allow "[*.]example.com"
806   ContentSettingsPattern pattern =
807       ContentSettingsPattern::FromString("[*.]example.com");
808
809   host_content_settings_map->SetContentSetting(
810       pattern,
811       ContentSettingsPattern::Wildcard(),
812       CONTENT_SETTINGS_TYPE_JAVASCRIPT,
813       std::string(),
814       CONTENT_SETTING_ALLOW);
815
816   EXPECT_EQ(CONTENT_SETTING_BLOCK,
817             host_content_settings_map->GetDefaultContentSetting(
818                 CONTENT_SETTINGS_TYPE_JAVASCRIPT, NULL));
819   GURL host("http://example.com/");
820   EXPECT_EQ(CONTENT_SETTING_ALLOW,
821             host_content_settings_map->GetContentSetting(
822                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
823
824   // Set managed-default-content-settings-preferences.
825   prefs->SetManagedPref(prefs::kManagedDefaultJavaScriptSetting,
826                         new base::FundamentalValue(CONTENT_SETTING_BLOCK));
827   EXPECT_EQ(CONTENT_SETTING_BLOCK,
828             host_content_settings_map->GetContentSetting(
829                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
830
831   // Remove managed-default-content-settings-preferences.
832   prefs->RemoveManagedPref(prefs::kManagedDefaultJavaScriptSetting);
833   EXPECT_EQ(CONTENT_SETTING_ALLOW,
834             host_content_settings_map->GetContentSetting(
835                 host, host, CONTENT_SETTINGS_TYPE_JAVASCRIPT, std::string()));
836 }
837
838 // If a default-content-setting is set to managed setting, the user defined
839 // setting should be preserved.
840 TEST_F(HostContentSettingsMapTest, OverwrittenDefaultContentSetting) {
841   TestingProfile profile;
842   HostContentSettingsMap* host_content_settings_map =
843       profile.GetHostContentSettingsMap();
844   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
845
846   // Set user defined default-content-setting for Cookies.
847   host_content_settings_map->SetDefaultContentSetting(
848       CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_BLOCK);
849   EXPECT_EQ(CONTENT_SETTING_BLOCK,
850             host_content_settings_map->GetDefaultContentSetting(
851                 CONTENT_SETTINGS_TYPE_COOKIES, NULL));
852
853   // Set preference to manage the default-content-setting for Cookies.
854   prefs->SetManagedPref(prefs::kManagedDefaultCookiesSetting,
855                         new base::FundamentalValue(CONTENT_SETTING_ALLOW));
856   EXPECT_EQ(CONTENT_SETTING_ALLOW,
857             host_content_settings_map->GetDefaultContentSetting(
858                 CONTENT_SETTINGS_TYPE_COOKIES, NULL));
859
860   // Remove the preference to manage the default-content-setting for Cookies.
861   prefs->RemoveManagedPref(prefs::kManagedDefaultCookiesSetting);
862   EXPECT_EQ(CONTENT_SETTING_BLOCK,
863             host_content_settings_map->GetDefaultContentSetting(
864                 CONTENT_SETTINGS_TYPE_COOKIES, NULL));
865 }
866
867 // If a setting for a default-content-setting-type is set while the type is
868 // managed, then the new setting should be preserved and used after the
869 // default-content-setting-type is not managed anymore.
870 TEST_F(HostContentSettingsMapTest, SettingDefaultContentSettingsWhenManaged) {
871   TestingProfile profile;
872   HostContentSettingsMap* host_content_settings_map =
873       profile.GetHostContentSettingsMap();
874   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
875
876   prefs->SetManagedPref(prefs::kManagedDefaultPluginsSetting,
877                         new base::FundamentalValue(CONTENT_SETTING_ALLOW));
878   EXPECT_EQ(CONTENT_SETTING_ALLOW,
879             host_content_settings_map->GetDefaultContentSetting(
880                 CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
881
882   host_content_settings_map->SetDefaultContentSetting(
883       CONTENT_SETTINGS_TYPE_PLUGINS, CONTENT_SETTING_BLOCK);
884   EXPECT_EQ(CONTENT_SETTING_ALLOW,
885             host_content_settings_map->GetDefaultContentSetting(
886                 CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
887
888   prefs->RemoveManagedPref(prefs::kManagedDefaultPluginsSetting);
889   EXPECT_EQ(CONTENT_SETTING_BLOCK,
890             host_content_settings_map->GetDefaultContentSetting(
891                 CONTENT_SETTINGS_TYPE_PLUGINS, NULL));
892 }
893
894 TEST_F(HostContentSettingsMapTest, GetContentSetting) {
895   TestingProfile profile;
896   HostContentSettingsMap* host_content_settings_map =
897       profile.GetHostContentSettingsMap();
898
899   GURL host("http://example.com/");
900   GURL embedder("chrome://foo");
901   ContentSettingsPattern pattern =
902        ContentSettingsPattern::FromString("[*.]example.com");
903   host_content_settings_map->SetContentSetting(
904       pattern,
905       ContentSettingsPattern::Wildcard(),
906       CONTENT_SETTINGS_TYPE_IMAGES,
907       std::string(),
908       CONTENT_SETTING_BLOCK);
909   EXPECT_EQ(CONTENT_SETTING_BLOCK,
910             host_content_settings_map->GetContentSetting(
911                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
912   EXPECT_EQ(CONTENT_SETTING_ALLOW,
913             host_content_settings_map->GetContentSetting(
914                 embedder, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
915 }
916
917 TEST_F(HostContentSettingsMapTest, ShouldAllowAllContent) {
918   TestingProfile profile;
919   HostContentSettingsMap* host_content_settings_map =
920       profile.GetHostContentSettingsMap();
921
922   GURL http_host("http://example.com/");
923   GURL https_host("https://example.com/");
924   GURL embedder("chrome://foo");
925   GURL extension("chrome-extension://foo");
926   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
927                    http_host, embedder, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
928   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
929                    http_host, embedder, CONTENT_SETTINGS_TYPE_GEOLOCATION));
930   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
931                    http_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES));
932   EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent(
933                   https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES));
934   EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent(
935                   https_host, embedder, CONTENT_SETTINGS_TYPE_COOKIES));
936   EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent(
937                   embedder, http_host, CONTENT_SETTINGS_TYPE_COOKIES));
938 #if defined(ENABLE_EXTENSIONS)
939   EXPECT_TRUE(host_content_settings_map->ShouldAllowAllContent(
940                   extension, extension, CONTENT_SETTINGS_TYPE_COOKIES));
941 #else
942   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
943                    extension, extension, CONTENT_SETTINGS_TYPE_COOKIES));
944 #endif
945   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
946                    extension, extension, CONTENT_SETTINGS_TYPE_PLUGINS));
947   EXPECT_FALSE(host_content_settings_map->ShouldAllowAllContent(
948                    extension, http_host, CONTENT_SETTINGS_TYPE_COOKIES));
949 }
950
951 TEST_F(HostContentSettingsMapTest, MigrateClearOnExit) {
952   TestingProfile profile;
953   TestingPrefServiceSyncable* prefs = profile.GetTestingPrefService();
954
955   prefs->SetBoolean(prefs::kClearSiteDataOnExit, true);
956
957   scoped_ptr<base::Value> patterns(base::JSONReader::Read(
958       "{\"[*.]example.com,*\":{\"cookies\": 1},"
959       " \"[*.]other.com,*\":{\"cookies\": 2},"
960       " \"[*.]third.com,*\":{\"cookies\": 4}}"));
961   profile.GetPrefs()->Set(prefs::kContentSettingsPatternPairs, *patterns);
962
963   scoped_ptr<base::Value> defaults(base::JSONReader::Read("{\"cookies\": 1}"));
964   profile.GetPrefs()->Set(prefs::kDefaultContentSettings, *defaults);
965
966   HostContentSettingsMap* host_content_settings_map =
967       profile.GetHostContentSettingsMap();
968
969   EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY,
970             host_content_settings_map->GetDefaultContentSetting(
971                 CONTENT_SETTINGS_TYPE_COOKIES, NULL));
972   EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY,
973             host_content_settings_map->GetContentSetting(
974                 GURL("http://example.com"),
975                 GURL("http://example.com"),
976                 CONTENT_SETTINGS_TYPE_COOKIES,
977                 std::string()));
978   EXPECT_EQ(CONTENT_SETTING_BLOCK,
979             host_content_settings_map->GetContentSetting(
980                 GURL("http://other.com"),
981                 GURL("http://other.com"),
982                 CONTENT_SETTINGS_TYPE_COOKIES,
983                 std::string()));
984   EXPECT_EQ(CONTENT_SETTING_SESSION_ONLY,
985             host_content_settings_map->GetContentSetting(
986                 GURL("http://third.com"),
987                 GURL("http://third.com"),
988                 CONTENT_SETTINGS_TYPE_COOKIES,
989                 std::string()));
990 }
991
992 TEST_F(HostContentSettingsMapTest, AddContentSettingsObserver) {
993   TestingProfile profile;
994   HostContentSettingsMap* host_content_settings_map =
995       profile.GetHostContentSettingsMap();
996   content_settings::MockObserver mock_observer;
997
998   GURL host("http://example.com/");
999   ContentSettingsPattern pattern =
1000       ContentSettingsPattern::FromString("[*.]example.com");
1001   EXPECT_CALL(mock_observer,
1002               OnContentSettingChanged(pattern,
1003                                       ContentSettingsPattern::Wildcard(),
1004                                       CONTENT_SETTINGS_TYPE_IMAGES,
1005                                       ""));
1006
1007   host_content_settings_map->AddObserver(&mock_observer);
1008
1009   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1010             host_content_settings_map->GetContentSetting(
1011                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
1012   host_content_settings_map->SetContentSetting(
1013       pattern,
1014       ContentSettingsPattern::Wildcard(),
1015       CONTENT_SETTINGS_TYPE_IMAGES,
1016       std::string(),
1017       CONTENT_SETTING_DEFAULT);
1018 }
1019
1020 TEST_F(HostContentSettingsMapTest, OverrideAllowedWebsiteSetting) {
1021   TestingProfile profile;
1022   HostContentSettingsMap* host_content_settings_map =
1023       profile.GetHostContentSettingsMap();
1024   GURL host("http://example.com/");
1025   ContentSettingsPattern pattern =
1026       ContentSettingsPattern::FromString("[*.]example.com");
1027   host_content_settings_map->SetContentSetting(
1028       pattern,
1029       ContentSettingsPattern::Wildcard(),
1030       CONTENT_SETTINGS_TYPE_GEOLOCATION,
1031       std::string(),
1032       CONTENT_SETTING_ALLOW);
1033
1034   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1035             host_content_settings_map->GetContentSetting(
1036                 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
1037
1038   // Disabling should override an allowed exception.
1039   host_content_settings_map->SetContentSettingOverride(
1040       CONTENT_SETTINGS_TYPE_GEOLOCATION, false);
1041   EXPECT_EQ(CONTENT_SETTING_BLOCK,
1042             host_content_settings_map->GetContentSetting(
1043                 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
1044
1045   host_content_settings_map->SetContentSettingOverride(
1046       CONTENT_SETTINGS_TYPE_GEOLOCATION, true);
1047   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1048             host_content_settings_map->GetContentSetting(
1049                 host, host, CONTENT_SETTINGS_TYPE_GEOLOCATION, std::string()));
1050 }
1051
1052 TEST_F(HostContentSettingsMapTest, OverrideAllowedDefaultSetting) {
1053   TestingProfile profile;
1054   HostContentSettingsMap* host_content_settings_map =
1055       profile.GetHostContentSettingsMap();
1056
1057   // Check setting defaults.
1058   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1059             host_content_settings_map->GetDefaultContentSetting(
1060                 CONTENT_SETTINGS_TYPE_IMAGES, NULL));
1061
1062   GURL host("http://example.com/");
1063   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1064             host_content_settings_map->GetContentSetting(
1065                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
1066
1067   // Disabling should override an allowed default setting.
1068   host_content_settings_map->SetContentSettingOverride(
1069       CONTENT_SETTINGS_TYPE_IMAGES, false);
1070   EXPECT_EQ(CONTENT_SETTING_BLOCK,
1071             host_content_settings_map->GetContentSetting(
1072                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
1073
1074   // Enabling shouldn't override positively.
1075   host_content_settings_map->SetContentSettingOverride(
1076       CONTENT_SETTINGS_TYPE_IMAGES, true);
1077   EXPECT_EQ(CONTENT_SETTING_ALLOW,
1078             host_content_settings_map->GetContentSetting(
1079                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
1080   host_content_settings_map->SetDefaultContentSetting(
1081       CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK);
1082   EXPECT_EQ(CONTENT_SETTING_BLOCK,
1083             host_content_settings_map->GetContentSetting(
1084                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string()));
1085 }