content_setting_bubble_model_unittest.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/auto_reset.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_delegate.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsTester;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingBubbleModelTest : public ChromeRenderViewHostTestHarness {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TabSpecificContentSettings::CreateForWebContents(web_contents());
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService::CreateForWebContents(web_contents());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckGeolocationBubble(size_t expected_domains,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool expect_clear_link,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool expect_reload_hint) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            NULL, web_contents(), profile(),
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            CONTENT_SETTINGS_TYPE_GEOLOCATION));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingBubbleModel::BubbleContent& bubble_content =
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content_setting_bubble_model->bubble_content();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.title.empty());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.radio_group.radio_items.empty());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.popup_items.empty());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_domains, bubble_content.domain_lists.size());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(expect_clear_link || expect_reload_hint,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bubble_content.custom_link.empty());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expect_clear_link, bubble_content.custom_link_enabled);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(bubble_content.manage_link.empty());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, ImageRadios) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     std::string());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NULL, web_contents(), profile(),
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         CONTENT_SETTINGS_TYPE_IMAGES));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Cookies) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     std::string());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NULL, web_contents(), profile(), CONTENT_SETTINGS_TYPE_COOKIES));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string title = bubble_content.title;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(title.empty());
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content.radio_group.radio_items.size());
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio1 = bubble_content.radio_group.radio_items[0];
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio2 = bubble_content.radio_group.radio_items[1];
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link.empty());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link_enabled);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->ClearCookieSpecificContentSettings();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_COOKIES);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_setting_bubble_model.reset(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NULL, web_contents(), profile(), CONTENT_SETTINGS_TYPE_COOKIES));
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content_2 =
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.title.empty());
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(title, bubble_content_2.title);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content_2.radio_group.radio_items.size());
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(bauerb): Update this once the strings have been updated.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(radio1, bubble_content_2.radio_group.radio_items[0]);
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(radio2, bubble_content_2.radio_group.radio_items[1]);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.custom_link.empty());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(bubble_content_2.custom_link_enabled);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.manage_link.empty());
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Mediastream) {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         NULL, web_contents(), profile(),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         CONTENT_SETTINGS_TYPE_MEDIASTREAM));
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, bubble_content.media_menus.size());
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, BlockedMediastream) {
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsTester::For(web_contents())->
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NavigateAndCommit(GURL("https://www.example.com"));
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = web_contents()->GetURL();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostContentSettingsMap* host_content_settings_map =
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile()->GetHostContentSettingsMap();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsPattern primary_pattern =
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingsPattern::FromURL(url);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSetting setting = CONTENT_SETTING_BLOCK;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_content_settings_map->SetContentSetting(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        primary_pattern,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::Wildcard(),
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string(),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setting);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_content_settings_map->SetContentSetting(
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        primary_pattern,
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::Wildcard(),
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string(),
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setting);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings* content_settings =
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     std::string());
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           NULL, web_contents(), profile(),
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ContentSettingBubbleModel::BubbleContent& bubble_content =
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_setting_bubble_model->bubble_content();
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test if the correct radio item is selected for the blocked mediastream
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // setting.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, bubble_content.radio_group.default_item);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that the media settings where not changed.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           NULL, web_contents(), profile(),
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Change the radio setting.
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_setting_bubble_model->OnRadioClicked(0);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that the media setting were change correctly.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removing an |InfoBarDelegate| from the |InfoBarService| does not delete
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it. Hence the |delegate| must be cleaned up after it was removed from the
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |infobar_service|.
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InfoBarService* infobar_service =
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InfoBarService::FromWebContents(web_contents());
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<InfoBarDelegate> delegate(infobar_service->infobar_at(0));
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  infobar_service->RemoveInfoBar(delegate.get());
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Plugins) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     std::string());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NULL, web_contents(), profile(),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         CONTENT_SETTINGS_TYPE_PLUGINS));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link.empty());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link_enabled);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, MultiplePlugins) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* cmd = CommandLine::ForCurrentProcess();
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::AutoReset<CommandLine> auto_reset(cmd, *cmd);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd->AppendSwitch(switches::kEnableResourceContentSettings);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* map = profile()->GetHostContentSettingsMap();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string fooPlugin = "foo";
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string barPlugin = "bar";
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigating to some sample url prevents the GetURL method from returning an
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invalid empty URL.
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsTester::For(web_contents())->
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NavigateAndCommit(GURL("http://www.example.com"));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = web_contents()->GetURL();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->AddExceptionForURL(url,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          url,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CONTENT_SETTINGS_TYPE_PLUGINS,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          fooPlugin,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CONTENT_SETTING_ALLOW);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map->AddExceptionForURL(url,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          url,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CONTENT_SETTINGS_TYPE_PLUGINS,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          barPlugin,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          CONTENT_SETTING_ASK);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     fooPlugin);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     barPlugin);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_PLUGINS));
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, bubble_content.radio_group.default_item);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model->OnRadioClicked(0);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing should have changed.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            map->GetContentSetting(url,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   url,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   CONTENT_SETTINGS_TYPE_PLUGINS,
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   fooPlugin));
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ASK,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            map->GetContentSetting(url,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   url,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   CONTENT_SETTINGS_TYPE_PLUGINS,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   barPlugin));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.reset();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both plug-ins should be click-to-play now.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            map->GetContentSetting(url,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   url,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   CONTENT_SETTINGS_TYPE_PLUGINS,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   fooPlugin));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            map->GetContentSetting(url,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   url,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   CONTENT_SETTINGS_TYPE_PLUGINS,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   barPlugin));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, PepperBroker) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings* content_settings =
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     std::string());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         NULL, web_contents(), profile(),
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         CONTENT_SETTINGS_TYPE_PPAPI_BROKER));
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string title = bubble_content.title;
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(title.empty());
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content.radio_group.radio_items.size());
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio1 = bubble_content.radio_group.radio_items[0];
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio2 = bubble_content.radio_group.radio_items[1];
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->ClearBlockedContentSettingsExceptForCookies();
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_PPAPI_BROKER);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_setting_bubble_model.reset(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NULL, web_contents(), profile(),
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          CONTENT_SETTINGS_TYPE_PPAPI_BROKER));
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content_2 =
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.title.empty());
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(title, bubble_content_2.title);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content_2.radio_group.radio_items.size());
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(radio1, bubble_content_2.radio_group.radio_items[0]);
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(radio2, bubble_content_2.radio_group.radio_items[1]);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.custom_link_enabled);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.manage_link.empty());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Geolocation) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL frame1_url("http://host1.example/");
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL frame2_url("http://host2.example:999/");
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One permitted frame, but not in the content map: requires reload.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnGeolocationPermissionSet(frame1_url, true);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, false, true);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add it to the content map, should now have a clear link.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* setting_map =
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile()->GetHostContentSettingsMap();
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setting_map->SetContentSetting(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(frame1_url),
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(page_url),
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_ALLOW);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, true, false);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the default to allow: no message needed.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_ALLOW);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, false, false);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second frame denied, but not stored in the content map: requires reload.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnGeolocationPermissionSet(frame2_url, false);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(2, false, true);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the default to block: offer a clear link for the persisted frame 1.
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_BLOCK);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(2, true, false);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, FileURL) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_url("file:///tmp/test.html");
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(GURL(file_url));
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->OnContentBlocked(
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CONTENT_SETTINGS_TYPE_IMAGES, std::string());
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_IMAGES));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title =
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content().radio_group.radio_items[0];
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(std::string::npos, title.find(file_url));
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, RegisterProtocolHandler) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->set_pending_protocol_handler(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ProtocolHandler::CreateProtocolHandler("mailto",
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("http://www.toplevel.example/"), ASCIIToUTF16("Handler")));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingRPHBubbleModel content_setting_bubble_model(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(), NULL,
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model.bubble_content();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.radio_group.radio_items.empty());
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.popup_items.empty());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.domain_lists.empty());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterExternalHandler(const std::string& protocol) OVERRIDE {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overrides in order to not register the handler with the
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ChildProcessSecurityPolicy. That has persistent and unalterable
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // side effects on other tests.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShellIntegration::DefaultWebClientObserver* observer,
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& protocol) OVERRIDE {
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VLOG(1) << "CreateShellWorker";
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ProtocolHandlerRegistry::DefaultClientObserver* CreateShellObserver(
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* registry) OVERRIDE {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterWithOSAsDefaultClient(
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& protocol,
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* registry) OVERRIDE {
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VLOG(1) << "Register With OS";
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, RPHAllow) {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry registry(profile(), new FakeDelegate());
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry.InitProtocolSettings();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler test_handler = ProtocolHandler::CreateProtocolHandler(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "mailto", GURL("http://www.toplevel.example/"),
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("Handler"));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->set_pending_protocol_handler(test_handler);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingRPHBubbleModel content_setting_bubble_model(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(), &registry,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_DEFAULT,
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "0" is the "Allow" radio button.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(0);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(handler.IsEmpty());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Handler"), handler.title());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_ALLOW,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "1" is the "Deny" radio button.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(1);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_BLOCK,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "2" is the "Ignore button.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(2);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_DEFAULT,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(registry.IsIgnored(test_handler));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "0" is the "Allow" radio button.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(0);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(handler.IsEmpty());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Handler"), handler.title());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_ALLOW,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(registry.IsIgnored(test_handler));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry.Shutdown();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
516