Home | History | Annotate | Download | only in content_settings
      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/strings/string16.h"
      6 #include "base/strings/utf_string_conversions.h"
      7 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
      8 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
      9 #include "chrome/test/base/testing_profile.h"
     10 #include "content/public/test/test_browser_thread.h"
     11 #include "net/cookies/canonical_cookie.h"
     12 #include "net/cookies/cookie_options.h"
     13 #include "net/cookies/parsed_cookie.h"
     14 #include "testing/gmock/include/gmock/gmock.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 using content::BrowserThread;
     18 
     19 namespace {
     20 
     21 class MockSiteDataObserver
     22     : public TabSpecificContentSettings::SiteDataObserver {
     23  public:
     24   explicit MockSiteDataObserver(
     25       TabSpecificContentSettings* tab_specific_content_settings)
     26       : SiteDataObserver(tab_specific_content_settings) {
     27   }
     28 
     29   virtual ~MockSiteDataObserver() {}
     30 
     31   MOCK_METHOD0(OnSiteDataAccessed, void());
     32 
     33  private:
     34   DISALLOW_COPY_AND_ASSIGN(MockSiteDataObserver);
     35 };
     36 
     37 }  // namespace
     38 
     39 class TabSpecificContentSettingsTest : public ChromeRenderViewHostTestHarness {
     40  public:
     41   virtual void SetUp() OVERRIDE {
     42     ChromeRenderViewHostTestHarness::SetUp();
     43     TabSpecificContentSettings::CreateForWebContents(web_contents());
     44   }
     45 };
     46 
     47 TEST_F(TabSpecificContentSettingsTest, BlockedContent) {
     48   TabSpecificContentSettings* content_settings =
     49       TabSpecificContentSettings::FromWebContents(web_contents());
     50   net::CookieOptions options;
     51 
     52   // Check that after initializing, nothing is blocked.
     53   EXPECT_FALSE(
     54       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
     55   EXPECT_FALSE(
     56       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
     57   EXPECT_FALSE(
     58       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
     59   EXPECT_FALSE(
     60       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
     61   EXPECT_FALSE(
     62       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
     63   EXPECT_FALSE(content_settings->IsContentBlocked(
     64       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
     65   EXPECT_FALSE(content_settings->IsContentBlocked(
     66       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
     67 
     68   // Set a cookie, block access to images, block mediastream access and block a
     69   // popup.
     70   content_settings->OnCookieChanged(GURL("http://google.com"),
     71                                     GURL("http://google.com"),
     72                                     "A=B",
     73                                     options,
     74                                     false);
     75   content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES,
     76                                      std::string());
     77   content_settings->SetPopupsBlocked(true);
     78   content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
     79                                      std::string());
     80   content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
     81                                      std::string());
     82 
     83   // Check that only the respective content types are affected.
     84   EXPECT_TRUE(content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
     85   EXPECT_FALSE(
     86       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
     87   EXPECT_FALSE(
     88       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
     89   EXPECT_FALSE(
     90       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
     91   EXPECT_TRUE(content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
     92   EXPECT_TRUE(content_settings->IsContentBlocked(
     93       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
     94   EXPECT_TRUE(content_settings->IsContentBlocked(
     95       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
     96   content_settings->OnCookieChanged(GURL("http://google.com"),
     97                                     GURL("http://google.com"),
     98                                     "A=B",
     99                                     options,
    100                                     false);
    101 
    102   // Block a cookie.
    103   content_settings->OnCookieChanged(GURL("http://google.com"),
    104                                     GURL("http://google.com"),
    105                                     "C=D",
    106                                     options,
    107                                     true);
    108   EXPECT_TRUE(
    109       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    110 
    111   // Reset blocked content settings.
    112   content_settings->ClearBlockedContentSettingsExceptForCookies();
    113   EXPECT_FALSE(
    114       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    115   EXPECT_FALSE(
    116       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    117   EXPECT_FALSE(
    118       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    119   EXPECT_TRUE(
    120       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    121   EXPECT_FALSE(
    122       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
    123   EXPECT_FALSE(content_settings->IsContentBlocked(
    124       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    125   EXPECT_FALSE(content_settings->IsContentBlocked(
    126       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    127 
    128   content_settings->ClearCookieSpecificContentSettings();
    129   EXPECT_FALSE(
    130       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    131   EXPECT_FALSE(
    132       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    133   EXPECT_FALSE(
    134       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    135   EXPECT_FALSE(
    136       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    137   EXPECT_FALSE(
    138       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
    139   EXPECT_FALSE(content_settings->IsContentBlocked(
    140       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    141   EXPECT_FALSE(content_settings->IsContentBlocked(
    142       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    143 }
    144 
    145 TEST_F(TabSpecificContentSettingsTest, BlockedFileSystems) {
    146   TabSpecificContentSettings* content_settings =
    147       TabSpecificContentSettings::FromWebContents(web_contents());
    148 
    149   // Access a file system.
    150   content_settings->OnFileSystemAccessed(GURL("http://google.com"), false);
    151   EXPECT_FALSE(
    152       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    153 
    154   // Block access to a file system.
    155   content_settings->OnFileSystemAccessed(GURL("http://google.com"), true);
    156   EXPECT_TRUE(
    157       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    158 }
    159 
    160 TEST_F(TabSpecificContentSettingsTest, AllowedContent) {
    161   TabSpecificContentSettings* content_settings =
    162       TabSpecificContentSettings::FromWebContents(web_contents());
    163   net::CookieOptions options;
    164 
    165   // Test default settings.
    166   ASSERT_FALSE(
    167       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_IMAGES));
    168   ASSERT_FALSE(
    169       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES));
    170   ASSERT_FALSE(
    171       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    172   ASSERT_FALSE(content_settings->IsContentAllowed(
    173       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    174   ASSERT_FALSE(content_settings->IsContentAllowed(
    175       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    176 
    177   // Record a cookie.
    178   content_settings->OnCookieChanged(GURL("http://google.com"),
    179                                     GURL("http://google.com"),
    180                                     "A=B",
    181                                     options,
    182                                     false);
    183   ASSERT_TRUE(
    184       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES));
    185   ASSERT_FALSE(
    186       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    187 
    188   // Record a blocked cookie.
    189   content_settings->OnCookieChanged(GURL("http://google.com"),
    190                                     GURL("http://google.com"),
    191                                     "C=D",
    192                                     options,
    193                                     true);
    194   ASSERT_TRUE(
    195       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES));
    196   ASSERT_TRUE(
    197       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    198 
    199 
    200   ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED,
    201             content_settings->GetMicrophoneCameraState());
    202 
    203   // Access microphone.
    204   content_settings->OnMicrophoneAccessed();
    205   ASSERT_TRUE(content_settings->IsContentAllowed(
    206       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    207   ASSERT_FALSE(content_settings->IsContentBlocked(
    208       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    209   ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED,
    210             content_settings->GetMicrophoneCameraState());
    211 
    212   // Allow mediastream access.
    213   content_settings->OnCameraAccessed();
    214   ASSERT_TRUE(content_settings->IsContentAllowed(
    215       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    216   ASSERT_FALSE(content_settings->IsContentBlocked(
    217       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    218   ASSERT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED,
    219             content_settings->GetMicrophoneCameraState());
    220 
    221   // Allow mediastream microphone access.
    222   content_settings->OnMicrophoneAccessBlocked();
    223   ASSERT_FALSE(content_settings->IsContentAllowed(
    224       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    225   ASSERT_TRUE(content_settings->IsContentBlocked(
    226       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    227 
    228   // Allow mediastream camera access.
    229   content_settings->OnCameraAccessBlocked();
    230   ASSERT_FALSE(content_settings->IsContentAllowed(
    231       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    232   ASSERT_TRUE(content_settings->IsContentBlocked(
    233       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    234 
    235 
    236   // Record a blocked mediastream microphone access request.
    237   content_settings->OnMicrophoneAccessBlocked();
    238   ASSERT_FALSE(content_settings->IsContentAllowed(
    239       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    240   ASSERT_TRUE(content_settings->IsContentBlocked(
    241       CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC));
    242 
    243   // Record a blocked mediastream microphone access request.
    244   content_settings->OnCameraAccessBlocked();
    245   ASSERT_FALSE(content_settings->IsContentAllowed(
    246       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    247   ASSERT_TRUE(content_settings->IsContentBlocked(
    248       CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA));
    249 }
    250 
    251 TEST_F(TabSpecificContentSettingsTest, EmptyCookieList) {
    252   TabSpecificContentSettings* content_settings =
    253       TabSpecificContentSettings::FromWebContents(web_contents());
    254 
    255   ASSERT_FALSE(
    256       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES));
    257   ASSERT_FALSE(
    258       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    259   content_settings->OnCookiesRead(GURL("http://google.com"),
    260                                   GURL("http://google.com"),
    261                                   net::CookieList(),
    262                                   true);
    263   ASSERT_FALSE(
    264       content_settings->IsContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES));
    265   ASSERT_FALSE(
    266       content_settings->IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    267 }
    268 
    269 TEST_F(TabSpecificContentSettingsTest, SiteDataObserver) {
    270   TabSpecificContentSettings* content_settings =
    271       TabSpecificContentSettings::FromWebContents(web_contents());
    272   MockSiteDataObserver mock_observer(content_settings);
    273   EXPECT_CALL(mock_observer, OnSiteDataAccessed()).Times(6);
    274 
    275   bool blocked_by_policy = false;
    276   content_settings->OnCookieChanged(GURL("http://google.com"),
    277                                     GURL("http://google.com"),
    278                                     "A=B",
    279                                     net::CookieOptions(),
    280                                     blocked_by_policy);
    281   net::CookieList cookie_list;
    282   scoped_ptr<net::CanonicalCookie> cookie(
    283       net::CanonicalCookie::Create(GURL("http://google.com"),
    284                                    "CookieName=CookieValue",
    285                                    base::Time::Now(), net::CookieOptions()));
    286 
    287   cookie_list.push_back(*cookie);
    288   content_settings->OnCookiesRead(GURL("http://google.com"),
    289                                   GURL("http://google.com"),
    290                                   cookie_list,
    291                                   blocked_by_policy);
    292   content_settings->OnFileSystemAccessed(GURL("http://google.com"),
    293                                               blocked_by_policy);
    294   content_settings->OnIndexedDBAccessed(GURL("http://google.com"),
    295                                         UTF8ToUTF16("text"),
    296                                         blocked_by_policy);
    297   content_settings->OnLocalStorageAccessed(GURL("http://google.com"),
    298                                            true,
    299                                            blocked_by_policy);
    300   content_settings->OnWebDatabaseAccessed(GURL("http://google.com"),
    301                                           UTF8ToUTF16("name"),
    302                                           UTF8ToUTF16("display_name"),
    303                                           blocked_by_policy);
    304 }
    305 
    306 TEST_F(TabSpecificContentSettingsTest, BlockThenAllowMediaAccess) {
    307   TabSpecificContentSettings* content_settings =
    308       TabSpecificContentSettings::FromWebContents(web_contents());
    309   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    310             TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED);
    311 
    312   content_settings->OnMicrophoneAccessBlocked();
    313   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    314             TabSpecificContentSettings::MICROPHONE_BLOCKED);
    315   content_settings->OnCameraAccessBlocked();
    316   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    317             TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED);
    318 
    319   // If microphone and camera have opposite settings, like one is allowed,
    320   // while the other is denied, we show the allow access in our UI.
    321   content_settings->OnMicrophoneAccessed();
    322   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    323             TabSpecificContentSettings::MICROPHONE_ACCESSED);
    324   content_settings->OnCameraAccessed();
    325   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    326             TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED);
    327 }
    328 
    329 TEST_F(TabSpecificContentSettingsTest, AllowThenBlockMediaAccess) {
    330   TabSpecificContentSettings* content_settings =
    331       TabSpecificContentSettings::FromWebContents(web_contents());
    332   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    333             TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED);
    334 
    335   content_settings->OnMicrophoneAccessed();
    336   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    337             TabSpecificContentSettings::MICROPHONE_ACCESSED);
    338   content_settings->OnCameraAccessed();
    339   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    340             TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED);
    341 
    342   // If microphone and camera have opposite settings, like one is allowed,
    343   // while the other is denied, we show the allow access in our UI.
    344   // TODO(xians): Fix the UI to show one allowed icon and one blocked icon.
    345   content_settings->OnMicrophoneAccessBlocked();
    346   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    347             TabSpecificContentSettings::CAMERA_ACCESSED);
    348   content_settings->OnCameraAccessBlocked();
    349   EXPECT_EQ(content_settings->GetMicrophoneCameraState(),
    350             TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED);
    351 }
    352