// 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/content_setting_bubble_model.h" #include "base/auto_reset.h" #include "base/command_line.h" #include "chrome/browser/content_settings/host_content_settings_map.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/geolocation/geolocation_content_settings_map.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/testing_profile.h" #include "content/browser/browser_thread.h" #include "content/browser/renderer_host/test_render_view_host.h" #include "content/browser/tab_contents/test_tab_contents.h" #include "testing/gtest/include/gtest/gtest.h" class ContentSettingBubbleModelTest : public RenderViewHostTestHarness { protected: ContentSettingBubbleModelTest() : ui_thread_(BrowserThread::UI, MessageLoop::current()) { } void CheckGeolocationBubble(size_t expected_domains, bool expect_clear_link, bool expect_reload_hint) { scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_GEOLOCATION)); const ContentSettingBubbleModel::BubbleContent& bubble_content = content_setting_bubble_model->bubble_content(); EXPECT_TRUE(bubble_content.title.empty()); EXPECT_TRUE(bubble_content.radio_group.radio_items.empty()); EXPECT_TRUE(bubble_content.popup_items.empty()); EXPECT_EQ(expected_domains, bubble_content.domain_lists.size()); EXPECT_NE(expect_clear_link || expect_reload_hint, bubble_content.custom_link.empty()); EXPECT_EQ(expect_clear_link, bubble_content.custom_link_enabled); EXPECT_FALSE(bubble_content.manage_link.empty()); } BrowserThread ui_thread_; }; TEST_F(ContentSettingBubbleModelTest, ImageRadios) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES, std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_IMAGES)); const ContentSettingBubbleModel::BubbleContent& bubble_content = content_setting_bubble_model->bubble_content(); EXPECT_FALSE(bubble_content.title.empty()); EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size()); EXPECT_EQ(0, bubble_content.radio_group.default_item); EXPECT_TRUE(bubble_content.custom_link.empty()); EXPECT_FALSE(bubble_content.manage_link.empty()); } TEST_F(ContentSettingBubbleModelTest, Cookies) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES, std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_COOKIES)); const ContentSettingBubbleModel::BubbleContent& bubble_content = content_setting_bubble_model->bubble_content(); EXPECT_FALSE(bubble_content.title.empty()); EXPECT_FALSE(bubble_content.radio_group.radio_items.empty()); EXPECT_FALSE(bubble_content.custom_link.empty()); EXPECT_TRUE(bubble_content.custom_link_enabled); EXPECT_FALSE(bubble_content.manage_link.empty()); } TEST_F(ContentSettingBubbleModelTest, Plugins) { TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS, std::string()); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_PLUGINS)); const ContentSettingBubbleModel::BubbleContent& bubble_content = content_setting_bubble_model->bubble_content(); EXPECT_FALSE(bubble_content.title.empty()); EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size()); EXPECT_FALSE(bubble_content.custom_link.empty()); EXPECT_TRUE(bubble_content.custom_link_enabled); EXPECT_FALSE(bubble_content.manage_link.empty()); } TEST_F(ContentSettingBubbleModelTest, MultiplePlugins) { CommandLine* cmd = CommandLine::ForCurrentProcess(); AutoReset<CommandLine> auto_reset(cmd, *cmd); cmd->AppendSwitch(switches::kEnableResourceContentSettings); cmd->AppendSwitch(switches::kEnableClickToPlay); HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); std::string fooPlugin = "foo"; std::string barPlugin = "bar"; GURL url = contents()->GetURL(); map->AddExceptionForURL(url, CONTENT_SETTINGS_TYPE_PLUGINS, fooPlugin, CONTENT_SETTING_ALLOW); map->AddExceptionForURL(url, CONTENT_SETTINGS_TYPE_PLUGINS, barPlugin, CONTENT_SETTING_ASK); TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS, fooPlugin); content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS, barPlugin); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_PLUGINS)); const ContentSettingBubbleModel::BubbleContent& bubble_content = content_setting_bubble_model->bubble_content(); EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size()); EXPECT_EQ(1, bubble_content.radio_group.default_item); content_setting_bubble_model->OnRadioClicked(0); // Nothing should have changed. EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(url, CONTENT_SETTINGS_TYPE_PLUGINS, fooPlugin)); EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(url, CONTENT_SETTINGS_TYPE_PLUGINS, barPlugin)); content_setting_bubble_model.reset(); // Both plug-ins should be click-to-play now. EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(url, CONTENT_SETTINGS_TYPE_PLUGINS, fooPlugin)); EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(url, CONTENT_SETTINGS_TYPE_PLUGINS, barPlugin)); } TEST_F(ContentSettingBubbleModelTest, Geolocation) { const GURL page_url("http://toplevel.example/"); const GURL frame1_url("http://host1.example/"); const GURL frame2_url("http://host2.example:999/"); NavigateAndCommit(page_url); TabSpecificContentSettings* content_settings = contents()->GetTabSpecificContentSettings(); // One permitted frame, but not in the content map: requires reload. content_settings->OnGeolocationPermissionSet(frame1_url, true); CheckGeolocationBubble(1, false, true); // Add it to the content map, should now have a clear link. GeolocationContentSettingsMap* setting_map = profile_->GetGeolocationContentSettingsMap(); setting_map->SetContentSetting(frame1_url, page_url, CONTENT_SETTING_ALLOW); CheckGeolocationBubble(1, true, false); // Change the default to allow: no message needed. setting_map->SetDefaultContentSetting(CONTENT_SETTING_ALLOW); CheckGeolocationBubble(1, false, false); // Second frame denied, but not stored in the content map: requires reload. content_settings->OnGeolocationPermissionSet(frame2_url, false); CheckGeolocationBubble(2, false, true); // Change the default to block: offer a clear link for the persisted frame 1. setting_map->SetDefaultContentSetting(CONTENT_SETTING_BLOCK); CheckGeolocationBubble(2, true, false); } TEST_F(ContentSettingBubbleModelTest, FileURL) { std::string file_url("file:///tmp/test.html"); NavigateAndCommit(GURL(file_url)); scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model( ContentSettingBubbleModel::CreateContentSettingBubbleModel( contents(), profile_.get(), CONTENT_SETTINGS_TYPE_IMAGES)); std::string title = content_setting_bubble_model->bubble_content().radio_group.radio_items[0]; ASSERT_NE(std::string::npos, title.find(file_url)); }