text: // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #include "chrome/browser/tab_contents/tab_specific_content_settings.h"
  
  #include "chrome/test/testing_profile.h"
  #include "net/base/cookie_options.h"
  #include "testing/gtest/include/gtest/gtest.h"
  
  namespace {
  class TestContentSettingsDelegate
      : public TabSpecificContentSettings::Delegate {
   public:
    TestContentSettingsDelegate()
        : settings_changed_(false), content_blocked_(false) {}
    virtual ~TestContentSettingsDelegate() {}
  
    void Reset() { settings_changed_ = content_blocked_ = false; }
  
    bool SettingsChanged() { return settings_changed_; }
  
    bool ContentBlocked() { return content_blocked_; }
  
    // TabSpecificContentSettings::Delegate implementation.
    virtual void OnContentSettingsAccessed(bool content_was_blocked) {
      settings_changed_ = true;
      content_blocked_ = content_was_blocked;
    }
  
   private:
    bool settings_changed_;
    bool content_blocked_;
  
    DISALLOW_COPY_AND_ASSIGN(TestContentSettingsDelegate);
  };
  }  // namespace
  
  TEST(TabSpecificContentSettingsTest, BlockedContent) {
    TestContentSettingsDelegate test_delegate;
    TestingProfile profile;
    TabSpecificContentSettings content_settings(&test_delegate, &profile);
    net::CookieOptions options;
  
    // Check that after initializing, nothing is blocked.
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
  
    // Set a cookie, block access to images, block a popup.
    content_settings.OnCookieChanged(
        GURL("http://google.com"), "A=B", options, false);
    EXPECT_TRUE(test_delegate.SettingsChanged());
    EXPECT_FALSE(test_delegate.ContentBlocked());
    test_delegate.Reset();
    content_settings.OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES,
                                      std::string());
    EXPECT_TRUE(test_delegate.SettingsChanged());
    EXPECT_TRUE(test_delegate.ContentBlocked());
    test_delegate.Reset();
    content_settings.SetPopupsBlocked(true);
    EXPECT_TRUE(test_delegate.SettingsChanged());
    EXPECT_TRUE(test_delegate.ContentBlocked());
    test_delegate.Reset();
  
    // Check that only the respective content types are affected.
    EXPECT_TRUE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    EXPECT_TRUE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
    content_settings.OnCookieChanged(
        GURL("http://google.com"), "A=B", options, false);
  
    // Block a cookie.
    content_settings.OnCookieChanged(
        GURL("http://google.com"), "C=D", options, true);
    EXPECT_TRUE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
  
    // Reset blocked content settings.
    content_settings.ClearBlockedContentSettingsExceptForCookies();
    EXPECT_TRUE(test_delegate.SettingsChanged());
    EXPECT_FALSE(test_delegate.ContentBlocked());
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    EXPECT_TRUE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
  
    content_settings.ClearCookieSpecificContentSettings();
    EXPECT_TRUE(test_delegate.SettingsChanged());
    EXPECT_FALSE(test_delegate.ContentBlocked());
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_JAVASCRIPT));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS));
    EXPECT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    EXPECT_FALSE(content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_POPUPS));
  }
  
  TEST(TabSpecificContentSettingsTest, AllowedContent) {
    TestContentSettingsDelegate test_delegate;
    TestingProfile profile;
    TabSpecificContentSettings content_settings(&test_delegate, &profile);
    net::CookieOptions options;
  
    ASSERT_FALSE(
        content_settings.IsContentAccessed(CONTENT_SETTINGS_TYPE_IMAGES));
    ASSERT_FALSE(
        content_settings.IsContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES));
    ASSERT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    content_settings.OnCookieChanged(
        GURL("http://google.com"), "A=B", options, false);
    ASSERT_TRUE(
        content_settings.IsContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES));
    ASSERT_FALSE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
    content_settings.OnCookieChanged(
        GURL("http://google.com"), "C=D", options, true);
    ASSERT_TRUE(
        content_settings.IsContentAccessed(CONTENT_SETTINGS_TYPE_COOKIES));
    ASSERT_TRUE(
        content_settings.IsContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES));
  }
  