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_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar_delegate.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/web_contents_tester.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsTester;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingBubbleModelTest : public ChromeRenderViewHostTestHarness {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewHostTestHarness::SetUp();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TabSpecificContentSettings::CreateForWebContents(web_contents());
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InfoBarService::CreateForWebContents(web_contents());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckGeolocationBubble(size_t expected_domains,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool expect_clear_link,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool expect_reload_hint) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            NULL, web_contents(), profile(),
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            CONTENT_SETTINGS_TYPE_GEOLOCATION));
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingBubbleModel::BubbleContent& bubble_content =
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content_setting_bubble_model->bubble_content();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.title.empty());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.radio_group.radio_items.empty());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(bubble_content.popup_items.empty());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_domains, bubble_content.domain_lists.size());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(expect_clear_link || expect_reload_hint,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              bubble_content.custom_link.empty());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expect_clear_link, bubble_content.custom_link_enabled);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(bubble_content.manage_link.empty());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, ImageRadios) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_IMAGES);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NULL, web_contents(), profile(),
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         CONTENT_SETTINGS_TYPE_IMAGES));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Cookies) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_COOKIES);
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)
1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, MediastreamMicAndCamera) {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string request_host = "google.com";
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL security_origin("http://" + request_host);
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap
1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      request_permissions;
12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission =
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission =
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         NULL, web_contents(), profile(),
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         CONTENT_SETTINGS_TYPE_MEDIASTREAM));
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.title,
1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_MICROPHONE_CAMERA_ALLOWED));
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[0],
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_NO_ACTION,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[1],
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_BLOCK));
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2U, bubble_content.media_menus.size());
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, BlockedMediastreamMicAndCamera) {
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsTester::For(web_contents())->
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NavigateAndCommit(GURL("https://www.example.com"));
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = web_contents()->GetURL();
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  HostContentSettingsMap* host_content_settings_map =
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile()->GetHostContentSettingsMap();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingsPattern primary_pattern =
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingsPattern::FromURL(url);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSetting setting = CONTENT_SETTING_BLOCK;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_content_settings_map->SetContentSetting(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        primary_pattern,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::Wildcard(),
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string(),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setting);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_content_settings_map->SetContentSetting(
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        primary_pattern,
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::Wildcard(),
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        std::string(),
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        setting);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings* content_settings =
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap
1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      request_permissions;
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission =
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER;
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission =
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER;
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(url, request_permissions);
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)    const ContentSettingBubbleModel::BubbleContent& bubble_content =
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_setting_bubble_model->bubble_content();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Test if the correct radio item is selected for the blocked mediastream
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // setting.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, bubble_content.radio_group.default_item);
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that the media settings where not changed.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           NULL, web_contents(), profile(),
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           CONTENT_SETTINGS_TYPE_MEDIASTREAM));
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Change the radio setting.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_setting_bubble_model->OnRadioClicked(0);
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Test that the media setting were change correctly.
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_content_settings_map->GetContentSetting(
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                url,
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                std::string()));
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  InfoBarService* infobar_service =
23834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      InfoBarService::FromWebContents(web_contents());
23934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  infobar_service->RemoveInfoBar(infobar_service->infobar_at(0));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, MediastreamMic) {
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string request_host = "google.com";
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL security_origin("http://" + request_host);
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      request_permissions;
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission =
2543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
2553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
2563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.title,
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_MICROPHONE_ACCESSED));
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[0],
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_NO_ACTION,
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[1],
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_BLOCK));
2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, bubble_content.media_menus.size());
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(content::MEDIA_DEVICE_AUDIO_CAPTURE,
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            bubble_content.media_menus.begin()->first);
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Change the microphone access.
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission =
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER;
2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content_setting_bubble_model.reset(
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.title,
2947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_MICROPHONE_BLOCKED));
2957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, new_bubble_content.radio_group.radio_items.size());
2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[0],
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_BLOCKED_MEDIASTREAM_MIC_ASK,
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[1],
3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_BLOCKED_MEDIASTREAM_MIC_NO_ACTION));
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1, new_bubble_content.radio_group.default_item);
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(new_bubble_content.custom_link.empty());
3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(new_bubble_content.custom_link_enabled);
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(new_bubble_content.manage_link.empty());
3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, new_bubble_content.media_menus.size());
3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(content::MEDIA_DEVICE_AUDIO_CAPTURE,
3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            new_bubble_content.media_menus.begin()->first);
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, MediastreamCamera) {
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
3147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string request_host = "google.com";
3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL security_origin("http://" + request_host);
32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap
3223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      request_permissions;
32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission =
3243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
3253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
3263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.title,
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_CAMERA_ACCESSED));
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[0],
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_CAMERA_NO_ACTION,
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[1],
3427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
3437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_CAMERA_BLOCK));
3447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
3457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, bubble_content.media_menus.size());
3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(content::MEDIA_DEVICE_VIDEO_CAPTURE,
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            bubble_content.media_menus.begin()->first);
3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Change the camera access.
35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission =
3543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_BLOCKED_BY_USER;
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
3577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content_setting_bubble_model.reset(
3587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
3597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
3627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.title,
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_CAMERA_BLOCKED));
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, new_bubble_content.radio_group.radio_items.size());
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[0],
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_BLOCKED_MEDIASTREAM_CAMERA_ASK,
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[1],
3717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
3727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_BLOCKED_MEDIASTREAM_CAMERA_NO_ACTION));
3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1, new_bubble_content.radio_group.default_item);
3747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(new_bubble_content.custom_link.empty());
3757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(new_bubble_content.custom_link_enabled);
3767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(new_bubble_content.manage_link.empty());
3777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, new_bubble_content.media_menus.size());
3787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(content::MEDIA_DEVICE_VIDEO_CAPTURE,
3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            new_bubble_content.media_menus.begin()->first);
3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, AccumulateMediastreamMicAndCamera) {
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Required to break dependency on BrowserMainLoop.
3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaCaptureDevicesDispatcher::GetInstance()->
3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      DisableDeviceEnumerationForTesting();
3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  std::string request_host = "google.com";
3903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL security_origin("http://" + request_host);
3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Firstly, add microphone access.
39368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaStreamDevicesController::MediaStreamTypeSettingsMap
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      request_permissions;
39568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission =
3963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
3973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
3983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
4057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.title,
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_MICROPHONE_ACCESSED));
4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
4097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[0],
4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_NO_ACTION,
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(bubble_content.radio_group.radio_items[1],
4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
4157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_BLOCK));
4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, bubble_content.radio_group.default_item);
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1U, bubble_content.media_menus.size());
4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(content::MEDIA_DEVICE_AUDIO_CAPTURE,
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            bubble_content.media_menus.begin()->first);
4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Then add camera access.
42268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  request_permissions[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission =
4233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      MediaStreamDevicesController::MEDIA_ALLOWED;
4243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  content_settings->OnMediaStreamPermissionSet(security_origin,
4253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                               request_permissions);
4267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  content_setting_bubble_model.reset(
4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          NULL, web_contents(), profile(),
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM));
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& new_bubble_content =
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.title,
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(IDS_MICROPHONE_CAMERA_ALLOWED));
4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, new_bubble_content.radio_group.radio_items.size());
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[0],
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringFUTF8(
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_NO_ACTION,
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                base::UTF8ToUTF16(request_host)));
4407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(new_bubble_content.radio_group.radio_items[1],
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            l10n_util::GetStringUTF8(
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_BLOCK));
4437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(0, new_bubble_content.radio_group.default_item);
4447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(2U, new_bubble_content.media_menus.size());
4457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Plugins) {
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PLUGINS);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NULL, web_contents(), profile(),
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         CONTENT_SETTINGS_TYPE_PLUGINS));
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, bubble_content.radio_group.radio_items.size());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link.empty());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link_enabled);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
4636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_FALSE(bubble_content.learn_more_link.empty());
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, PepperBroker) {
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings* content_settings =
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
469a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content_settings->OnContentBlocked(CONTENT_SETTINGS_TYPE_PPAPI_BROKER);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         NULL, web_contents(), profile(),
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         CONTENT_SETTINGS_TYPE_PPAPI_BROKER));
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string title = bubble_content.title;
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(title.empty());
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content.radio_group.radio_items.size());
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio1 = bubble_content.radio_group.radio_items[0];
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string radio2 = bubble_content.radio_group.radio_items[1];
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->ClearBlockedContentSettingsExceptForCookies();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_settings->OnContentAllowed(CONTENT_SETTINGS_TYPE_PPAPI_BROKER);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_setting_bubble_model.reset(
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          NULL, web_contents(), profile(),
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          CONTENT_SETTINGS_TYPE_PPAPI_BROKER));
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content_2 =
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_setting_bubble_model->bubble_content();
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.title.empty());
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(title, bubble_content_2.title);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2U, bubble_content_2.radio_group.radio_items.size());
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(radio1, bubble_content_2.radio_group.radio_items[0]);
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(radio2, bubble_content_2.radio_group.radio_items[1]);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.custom_link_enabled);
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(bubble_content_2.manage_link.empty());
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, Geolocation) {
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL frame1_url("http://host1.example/");
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL frame2_url("http://host2.example:999/");
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // One permitted frame, but not in the content map: requires reload.
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnGeolocationPermissionSet(frame1_url, true);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, false, true);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add it to the content map, should now have a clear link.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* setting_map =
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile()->GetHostContentSettingsMap();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  setting_map->SetContentSetting(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(frame1_url),
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(page_url),
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTING_ALLOW);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, true, false);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the default to allow: no message needed.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_ALLOW);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(1, false, false);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Second frame denied, but not stored in the content map: requires reload.
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->OnGeolocationPermissionSet(frame2_url, false);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(2, false, true);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change the default to block: offer a clear link for the persisted frame 1.
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_BLOCK);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckGeolocationBubble(2, true, false);
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, FileURL) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string file_url("file:///tmp/test.html");
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(GURL(file_url));
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->OnContentBlocked(
547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      CONTENT_SETTINGS_TYPE_IMAGES);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingBubbleModel::CreateContentSettingBubbleModel(
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(),
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_IMAGES));
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string title =
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model->bubble_content().radio_group.radio_items[0];
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(std::string::npos, title.find(file_url));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, RegisterProtocolHandler) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->set_pending_protocol_handler(
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ProtocolHandler::CreateProtocolHandler(
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          "mailto", GURL("http://www.toplevel.example/")));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingRPHBubbleModel content_setting_bubble_model(
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(), NULL,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingBubbleModel::BubbleContent& bubble_content =
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_setting_bubble_model.bubble_content();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.title.empty());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.radio_group.radio_items.empty());
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.popup_items.empty());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.domain_lists.empty());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(bubble_content.custom_link.empty());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.custom_link_enabled);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(bubble_content.manage_link.empty());
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDelegate : public ProtocolHandlerRegistry::Delegate {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterExternalHandler(const std::string& protocol) OVERRIDE {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Overrides in order to not register the handler with the
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ChildProcessSecurityPolicy. That has persistent and unalterable
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // side effects on other tests.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ShellIntegration::DefaultProtocolClientWorker* CreateShellWorker(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ShellIntegration::DefaultWebClientObserver* observer,
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& protocol) OVERRIDE {
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VLOG(1) << "CreateShellWorker";
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ProtocolHandlerRegistry::DefaultClientObserver* CreateShellObserver(
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* registry) OVERRIDE {
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterWithOSAsDefaultClient(
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& protocol,
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProtocolHandlerRegistry* registry) OVERRIDE {
604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VLOG(1) << "Register With OS";
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingBubbleModelTest, RPHAllow) {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandlerRegistry registry(profile(), new FakeDelegate());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry.InitProtocolSettings();
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL page_url("http://toplevel.example/");
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateAndCommit(page_url);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler test_handler = ProtocolHandler::CreateProtocolHandler(
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "mailto", GURL("http://www.toplevel.example/"));
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_settings->set_pending_protocol_handler(test_handler);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingRPHBubbleModel content_setting_bubble_model(
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          NULL, web_contents(), profile(), &registry,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_DEFAULT,
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "0" is the "Allow" radio button.
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(0);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(handler.IsEmpty());
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_ALLOW,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "1" is the "Deny" radio button.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(1);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_BLOCK,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "2" is the "Ignore button.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(2);
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler.IsEmpty());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_DEFAULT,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(registry.IsIgnored(test_handler));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "0" is the "Allow" radio button.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content_setting_bubble_model.OnRadioClicked(0);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandler handler = registry.GetHandlerFor("mailto");
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(handler.IsEmpty());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(CONTENT_SETTING_ALLOW,
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content_settings->pending_protocol_handler_setting());
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(registry.IsIgnored(test_handler));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry.Shutdown();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
671