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 "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate.h"
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/content_settings/content_setting_bubble_model_delegate.h"
27fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "chrome/browser/ui/content_settings/media_setting_changed_infobar_delegate.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/common/chrome_switches.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/render_messages.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/render_process_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/theme_resources.h"
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "grit/ui_resources.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/base/resource/resource_bundle.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::UserMetricsAction;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content_settings::SettingInfo;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content_settings::SettingSource;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content_settings::SETTING_SOURCE_USER;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content_settings::SETTING_SOURCE_NONE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ContentSettingsTypeIdEntry {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsType type;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetIdForContentType(const ContentSettingsTypeIdEntry* entries,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        size_t num_entries,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ContentSettingsType type) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < num_entries; ++i) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entries[i].type == type)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return entries[i].id;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const content::MediaStreamDevice& GetMediaDeviceById(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& device_id,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const content::MediaStreamDevices& devices) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!devices.empty());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (content::MediaStreamDevices::const_iterator it = devices.begin();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       it != devices.end(); ++it) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it->id == device_id)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return *(it);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A device with the |device_id| was not found. It is likely that the device
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has been unplugged from the OS. Return the first device as the default
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // device.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return *devices.begin();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingTitleAndLinkModel::ContentSettingTitleAndLinkModel(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingBubbleModel(web_contents, profile, content_type),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate_(delegate) {
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Notifications do not have a bubble.
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DCHECK_NE(content_type, CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetBlockedResources();
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetTitle();
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetManageLink();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingTitleAndLinkModel::SetBlockedResources() {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* settings =
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& resources = settings->BlockedResourcesForType(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::set<std::string>::const_iterator it = resources.begin();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != resources.end(); ++it) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlockedResource(*it);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingTitleAndLinkModel::SetTitle() {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ContentSettingsTypeIdEntry kBlockedTitleIDs[] = {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_TITLE},
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_IMAGES, IDS_BLOCKED_IMAGES_TITLE},
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_JAVASCRIPT, IDS_BLOCKED_JAVASCRIPT_TITLE},
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_MESSAGE},
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_POPUPS, IDS_BLOCKED_POPUPS_TITLE},
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_MIXEDSCRIPT,
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_BLOCKED_DISPLAYING_INSECURE_CONTENT},
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        IDS_BLOCKED_PPAPI_BROKER_TITLE},
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_BLOCKED_DOWNLOAD_TITLE},
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fields as for kBlockedTitleIDs, above.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ContentSettingsTypeIdEntry
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kResourceSpecificBlockedTitleIDs[] = {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_TITLE},
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      };
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ContentSettingsTypeIdEntry kAccessedTitleIDs[] = {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_ACCESSED_COOKIES_TITLE},
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_ALLOWED_PPAPI_BROKER_TITLE},
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_ALLOWED_DOWNLOAD_TITLE},
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ContentSettingsTypeIdEntry *title_ids = kBlockedTitleIDs;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_title_ids = arraysize(kBlockedTitleIDs);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents() &&
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          web_contents())->IsContentAllowed(content_type()) &&
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !TabSpecificContentSettings::FromWebContents(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents())->IsContentBlocked(content_type())) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title_ids = kAccessedTitleIDs;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_title_ids = arraysize(kAccessedTitleIDs);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!bubble_content().resource_identifiers.empty()) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title_ids = kResourceSpecificBlockedTitleIDs;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_title_ids = arraysize(kResourceSpecificBlockedTitleIDs);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int title_id =
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetIdForContentType(title_ids, num_title_ids, content_type());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (title_id)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_title(l10n_util::GetStringUTF8(title_id));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingTitleAndLinkModel::SetManageLink() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ContentSettingsTypeIdEntry kLinkIDs[] = {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_LINK},
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_IMAGES, IDS_BLOCKED_IMAGES_LINK},
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_JAVASCRIPT, IDS_BLOCKED_JAVASCRIPT_LINK},
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_LINK},
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_POPUPS, IDS_BLOCKED_POPUPS_LINK},
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_GEOLOCATION, IDS_GEOLOCATION_BUBBLE_MANAGE_LINK},
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, IDS_LEARN_MORE},
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, IDS_HANDLERS_BUBBLE_MANAGE_LINK},
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_MEDIASTREAM, IDS_MEDIASTREAM_BUBBLE_MANAGE_LINK},
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_PPAPI_BROKER_BUBBLE_MANAGE_LINK},
1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_BLOCKED_DOWNLOADS_LINK},
1664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    {CONTENT_SETTINGS_TYPE_MIDI_SYSEX, IDS_MIDI_SYSEX_BUBBLE_MANAGE_LINK},
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_manage_link(l10n_util::GetStringUTF8(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetIdForContentType(kLinkIDs, arraysize(kLinkIDs), content_type())));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingTitleAndLinkModel::OnManageLinkClicked() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowContentSettingsPage(content_type());
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingTitleLinkAndCustomModel
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ContentSettingTitleAndLinkModel {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingTitleLinkAndCustomModel(Delegate* delegate,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        WebContents* web_contents,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Profile* profile,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        ContentSettingsType content_type);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingTitleLinkAndCustomModel() {}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetCustomLink();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnCustomLinkClicked() OVERRIDE {}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingTitleLinkAndCustomModel::ContentSettingTitleLinkAndCustomModel(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingTitleAndLinkModel(
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delegate, web_contents, profile, content_type) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCustomLink();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingTitleLinkAndCustomModel::SetCustomLink() {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const ContentSettingsTypeIdEntry kCustomIDs[] = {
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_INFO},
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_LOAD_ALL},
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_MIXEDSCRIPT, IDS_ALLOW_INSECURE_CONTENT_BUTTON},
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int custom_link_id =
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetIdForContentType(kCustomIDs, arraysize(kCustomIDs), content_type());
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (custom_link_id)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_custom_link(l10n_util::GetStringUTF8(custom_link_id));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingSingleRadioGroup
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ContentSettingTitleLinkAndCustomModel {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingSingleRadioGroup(Delegate* delegate,
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WebContents* web_contents,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Profile* profile,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ContentSettingsType content_type);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingSingleRadioGroup();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool settings_changed() const;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRadioGroup();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddException(ContentSetting setting,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const std::string& resource_identifier);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnRadioClicked(int radio_index) OVERRIDE;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting block_setting_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int selected_item_;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingSingleRadioGroup::ContentSettingSingleRadioGroup(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingTitleLinkAndCustomModel(delegate, web_contents, profile,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            content_type),
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_setting_(CONTENT_SETTING_BLOCK),
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_item_(0) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetRadioGroup();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingSingleRadioGroup::~ContentSettingSingleRadioGroup() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (settings_changed()) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting =
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selected_item_ == 0 ? CONTENT_SETTING_ALLOW : block_setting_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<std::string>& resources =
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bubble_content().resource_identifiers;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (resources.empty()) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AddException(setting, std::string());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (std::set<std::string>::const_iterator it = resources.begin();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           it != resources.end(); ++it) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AddException(setting, *it);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ContentSettingSingleRadioGroup::settings_changed() const {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return selected_item_ != bubble_content().radio_group.default_item;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialize the radio group by setting the appropriate labels for the
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content type and setting the default value based on the content setting.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingSingleRadioGroup::SetRadioGroup() {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = web_contents()->GetURL();
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 display_host;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::AppendFormattedHost(
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile()->GetPrefs()->GetString(prefs::kAcceptLanguages),
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &display_host);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (display_host.empty())
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    display_host = ASCIIToUTF16(url.spec());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::set<std::string>& resources =
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bubble_content().resource_identifiers;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TabSpecificContentSettings* content_settings =
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allowed =
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !content_settings->IsContentBlocked(content_type());
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!allowed ||
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         content_settings->IsContentAllowed(content_type()));
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RadioGroup radio_group;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.url = url;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const ContentSettingsTypeIdEntry kBlockedAllowIDs[] = {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_UNBLOCK},
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_IMAGES, IDS_BLOCKED_IMAGES_UNBLOCK},
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_JAVASCRIPT, IDS_BLOCKED_JAVASCRIPT_UNBLOCK},
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_UNBLOCK_ALL},
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_POPUPS, IDS_BLOCKED_POPUPS_UNBLOCK},
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_BLOCKED_PPAPI_BROKER_UNBLOCK},
3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_BLOCKED_DOWNLOAD_UNBLOCK},
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Fields as for kBlockedAllowIDs, above.
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const ContentSettingsTypeIdEntry kResourceSpecificBlockedAllowIDs[] = {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_UNBLOCK},
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const ContentSettingsTypeIdEntry kAllowedAllowIDs[] = {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(bauerb): The string shouldn't be "unblock" (they weren't blocked).
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_UNBLOCK},
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_ALLOWED_PPAPI_BROKER_NO_ACTION},
3117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_ALLOWED_DOWNLOAD_NO_ACTION},
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string radio_allow_label;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (allowed) {
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int resource_id = GetIdForContentType(kAllowedAllowIDs,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          arraysize(kAllowedAllowIDs),
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          content_type());
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    radio_allow_label = (content_type() == CONTENT_SETTINGS_TYPE_COOKIES) ?
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringFUTF8(resource_id, display_host) :
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF8(resource_id);
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (resources.empty()) {
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    radio_allow_label = l10n_util::GetStringFUTF8(
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetIdForContentType(kBlockedAllowIDs, arraysize(kBlockedAllowIDs),
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            content_type()),
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_host);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    radio_allow_label = l10n_util::GetStringFUTF8(
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetIdForContentType(kResourceSpecificBlockedAllowIDs,
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            arraysize(kResourceSpecificBlockedAllowIDs),
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            content_type()),
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        display_host);
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const ContentSettingsTypeIdEntry kBlockedBlockIDs[] = {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_NO_ACTION},
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_IMAGES, IDS_BLOCKED_IMAGES_NO_ACTION},
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_JAVASCRIPT, IDS_BLOCKED_JAVASCRIPT_NO_ACTION},
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PLUGINS, IDS_BLOCKED_PLUGINS_NO_ACTION},
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {CONTENT_SETTINGS_TYPE_POPUPS, IDS_BLOCKED_POPUPS_NO_ACTION},
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_BLOCKED_PPAPI_BROKER_NO_ACTION},
3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_BLOCKED_DOWNLOAD_NO_ACTION},
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const ContentSettingsTypeIdEntry kAllowedBlockIDs[] = {
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(bauerb): The string should say "block".
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_COOKIES, IDS_BLOCKED_COOKIES_NO_ACTION},
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {CONTENT_SETTINGS_TYPE_PPAPI_BROKER, IDS_ALLOWED_PPAPI_BROKER_BLOCK},
3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, IDS_ALLOWED_DOWNLOAD_BLOCK},
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string radio_block_label;
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (allowed) {
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int resource_id = GetIdForContentType(kAllowedBlockIDs,
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          arraysize(kAllowedBlockIDs),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          content_type());
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    radio_block_label = (content_type() == CONTENT_SETTINGS_TYPE_COOKIES) ?
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringUTF8(resource_id) :
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        l10n_util::GetStringFUTF8(resource_id, display_host);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    radio_block_label = l10n_util::GetStringUTF8(
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetIdForContentType(kBlockedBlockIDs, arraysize(kBlockedBlockIDs),
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            content_type()));
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.radio_items.push_back(radio_allow_label);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.radio_items.push_back(radio_block_label);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* map = profile()->GetHostContentSettingsMap();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieSettings* cookie_settings =
3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CookieSettings::Factory::GetForProfile(profile()).get();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting most_restrictive_setting;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SettingSource most_restrictive_setting_source = SETTING_SOURCE_NONE;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (resources.empty()) {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (content_type() == CONTENT_SETTINGS_TYPE_COOKIES) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      most_restrictive_setting = cookie_settings->GetCookieSetting(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, url, true, &most_restrictive_setting_source);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SettingInfo info;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Value> value(map->GetWebsiteSetting(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, url, content_type(), std::string(), &info));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      most_restrictive_setting =
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content_settings::ValueToContentSetting(value.get());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      most_restrictive_setting_source = info.source;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    most_restrictive_setting = CONTENT_SETTING_ALLOW;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::set<std::string>::const_iterator it = resources.begin();
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != resources.end(); ++it) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SettingInfo info;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_ptr<Value> value(map->GetWebsiteSetting(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          url, url, content_type(), *it, &info));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSetting setting =
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content_settings::ValueToContentSetting(value.get());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (setting == CONTENT_SETTING_BLOCK) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        most_restrictive_setting = CONTENT_SETTING_BLOCK;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        most_restrictive_setting_source = info.source;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (setting == CONTENT_SETTING_ASK) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        most_restrictive_setting = CONTENT_SETTING_ASK;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        most_restrictive_setting_source = info.source;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (most_restrictive_setting == CONTENT_SETTING_ALLOW) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radio_group.default_item = 0;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |block_setting_| is already set to |CONTENT_SETTING_BLOCK|.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radio_group.default_item = 1;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    block_setting_ = most_restrictive_setting;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (most_restrictive_setting_source != SETTING_SOURCE_USER) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_radio_group_enabled(false);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_radio_group_enabled(true);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_item_ = radio_group.default_item;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_radio_group(radio_group);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingSingleRadioGroup::AddException(
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSetting setting,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (profile()) {
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile()->GetHostContentSettingsMap()->AddExceptionForURL(
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bubble_content().radio_group.url,
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bubble_content().radio_group.url,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content_type(),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        resource_identifier,
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        setting);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingSingleRadioGroup::OnRadioClicked(int radio_index) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_item_ = radio_index;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingCookiesBubbleModel : public ContentSettingSingleRadioGroup {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingCookiesBubbleModel(Delegate* delegate,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   WebContents* web_contents,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   Profile* profile,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ContentSettingsType content_type);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingCookiesBubbleModel();
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCustomLinkClicked() OVERRIDE;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingCookiesBubbleModel::ContentSettingCookiesBubbleModel(
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingSingleRadioGroup(
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delegate, web_contents, profile, content_type) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(CONTENT_SETTINGS_TYPE_COOKIES, content_type);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_custom_link_enabled(true);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingCookiesBubbleModel::~ContentSettingCookiesBubbleModel() {
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // On some plattforms e.g. MacOS X it is possible to close a tab while the
464ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // cookies settings bubble is open. This resets the web contents to NULL.
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (settings_changed() && web_contents()) {
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CollectedCookiesInfoBarDelegate::Create(
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        InfoBarService::FromWebContents(web_contents()));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingCookiesBubbleModel::OnCustomLinkClicked() {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents())
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<TabSpecificContentSettings>(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          TabSpecificContentSettings::FromWebContents(web_contents())),
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delegate()->ShowCollectedCookiesDialog(web_contents());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingPluginBubbleModel : public ContentSettingSingleRadioGroup {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingPluginBubbleModel(Delegate* delegate,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  WebContents* web_contents,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  Profile* profile,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ContentSettingsType content_type);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingPluginBubbleModel() {}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCustomLinkClicked() OVERRIDE;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingPluginBubbleModel::ContentSettingPluginBubbleModel(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingSingleRadioGroup(
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delegate, web_contents, profile, content_type) {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(content_type, CONTENT_SETTINGS_TYPE_PLUGINS);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_custom_link_enabled(web_contents &&
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          TabSpecificContentSettings::FromWebContents(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              web_contents)->load_plugins_link_enabled());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingPluginBubbleModel::OnCustomLinkClicked() {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("ClickToPlay_LoadAll_Bubble"));
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(web_contents());
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ENABLE_PLUGINS)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host->GetProcess()->GetID());
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(bauerb): We should send the identifiers of blocked plug-ins here.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->Send(new ChromeViewMsg_LoadBlockedPlugins(host->GetRoutingID(),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  std::string()));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_custom_link_enabled(false);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_load_plugins_link_enabled(false);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingPopupBubbleModel : public ContentSettingSingleRadioGroup {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingPopupBubbleModel(Delegate* delegate,
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 WebContents* web_contents,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 Profile* profile,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ContentSettingsType content_type);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingPopupBubbleModel() {}
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetPopups();
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPopupClicked(int index) OVERRIDE;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingPopupBubbleModel::ContentSettingPopupBubbleModel(
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingSingleRadioGroup(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate, web_contents, profile, content_type) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetPopups();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingPopupBubbleModel::SetPopups() {
549558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (!CommandLine::ForCurrentProcess()->HasSwitch(
550558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          switches::kDisableBetterPopupBlocking)) {
55158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    std::map<int32, GURL> blocked_popups =
552ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        PopupBlockerTabHelper::FromWebContents(web_contents())
553ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch            ->GetBlockedPopupRequests();
55458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    for (std::map<int32, GURL>::const_iterator iter = blocked_popups.begin();
55558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch         iter != blocked_popups.end();
55658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch         ++iter) {
55758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      std::string title(iter->second.spec());
558ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      // The popup may not have a valid URL.
559ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      if (title.empty())
560ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        title = l10n_util::GetStringUTF8(IDS_TAB_LOADING_TITLE);
561ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      PopupItem popup_item(
562ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          ui::ResourceBundle::GetSharedInstance().GetImageNamed(
563ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch              IDR_DEFAULT_FAVICON),
564ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          title,
56558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch          iter->first);
566ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      add_popup(popup_item);
567ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
568ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
569ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<WebContents*> blocked_contents;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BlockedContentTabHelper::FromWebContents(web_contents())->
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetBlockedContents(&blocked_contents);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<WebContents*>::const_iterator
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i = blocked_contents.begin(); i != blocked_contents.end(); ++i) {
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string title(UTF16ToUTF8((*i)->GetTitle()));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The popup may not have committed a load yet, in which case it won't
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // have a URL or title.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (title.empty())
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      title = l10n_util::GetStringUTF8(IDS_TAB_LOADING_TITLE);
580ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    PopupItem popup_item(
581ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        FaviconTabHelper::FromWebContents(*i)->GetFavicon(), title, *i);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_popup(popup_item);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingPopupBubbleModel::OnPopupClicked(int index) {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents()) {
588558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    if (!CommandLine::ForCurrentProcess()->HasSwitch(
589558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch            switches::kDisableBetterPopupBlocking)) {
590ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      PopupBlockerTabHelper::FromWebContents(web_contents())->
591ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          ShowBlockedPopup(bubble_content().popup_items[index].popup_id);
592ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    } else {
593ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      BlockedContentTabHelper::FromWebContents(web_contents())->
594ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          LaunchForContents(bubble_content().popup_items[index].web_contents);
595ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The model of the content settings bubble for media settings.
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentSettingMediaStreamBubbleModel
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public ContentSettingTitleAndLinkModel {
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSettingMediaStreamBubbleModel(Delegate* delegate,
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       WebContents* web_contents,
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       Profile* profile);
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ContentSettingMediaStreamBubbleModel();
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the title of the bubble.
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetTitle();
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the data for the radio buttons of the bubble.
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRadioGroup();
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets the data for the media menus of the bubble.
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetMediaMenus();
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the camera and microphone setting with the passed |setting|.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateSettings(ContentSetting setting);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates the camera and microphone default device with the passed |type|
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and device.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateDefaultDeviceForType(content::MediaStreamType type,
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const std::string& device);
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ContentSettingBubbleModel implementation.
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnRadioClicked(int radio_index) OVERRIDE;
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMediaMenuClicked(content::MediaStreamType type,
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const std::string& selected_device) OVERRIDE;
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The index of the selected radio item.
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int selected_item_;
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The content settings that are associated with the individual radio
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // buttons.
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ContentSetting radio_item_setting_[2];
6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The state of the microphone and camera access.
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings::MicrophoneCameraState state_;
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSettingMediaStreamBubbleModel::ContentSettingMediaStreamBubbleModel(
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Delegate* delegate,
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebContents* web_contents,
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Profile* profile)
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : ContentSettingTitleAndLinkModel(
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          delegate, web_contents, profile, CONTENT_SETTINGS_TYPE_MEDIASTREAM),
6437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_(0),
6447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      state_(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED) {
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(profile);
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Initialize the content settings associated with the individual radio
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // buttons.
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_item_setting_[0] = CONTENT_SETTING_ASK;
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_item_setting_[1] = CONTENT_SETTING_BLOCK;
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents);
6537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  state_ = content_settings->GetMicrophoneCameraState();
6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetTitle();
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetRadioGroup();
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMediaMenus();
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSettingMediaStreamBubbleModel::~ContentSettingMediaStreamBubbleModel() {
661fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // On some platforms (e.g. MacOS X) it is possible to close a tab while the
662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // media stream bubble is open. This resets the web contents to NULL.
663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents())
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
665fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool media_setting_changed = false;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (MediaMenuMap::const_iterator it = bubble_content().media_menus.begin();
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      it != bubble_content().media_menus.end(); ++it) {
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (it->second.selected_device.id != it->second.default_device.id) {
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateDefaultDeviceForType(it->first, it->second.selected_device.id);
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      media_setting_changed = true;
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the media settings if the radio button selection was changed.
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selected_item_ != bubble_content().radio_group.default_item) {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateSettings(radio_item_setting_[selected_item_]);
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    media_setting_changed = true;
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Trigger the reload infobar if the media setting has been changed.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (media_setting_changed) {
683fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    MediaSettingChangedInfoBarDelegate::Create(
684fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch        InfoBarService::FromWebContents(web_contents()));
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::SetTitle() {
6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int title_id = 0;
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (state_) {
6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED:
6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // If neither microphone nor camera stream was accessed, then there is no
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // icon didplayed in the omnibox and no settings bubble availbale. Hence
6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      // there is no title.
6957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NOTREACHED();
6967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return;
6977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_ACCESSED:
6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_MICROPHONE_ACCESSED;
6997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::CAMERA_ACCESSED:
7017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_CAMERA_ACCESSED;
7027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED:
7047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_MICROPHONE_CAMERA_ALLOWED;
7057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_BLOCKED:
7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_MICROPHONE_BLOCKED;
7087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::CAMERA_BLOCKED:
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_CAMERA_BLOCKED;
7117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED:
7137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      title_id = IDS_MICROPHONE_CAMERA_BLOCKED;
7147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_title(l10n_util::GetStringUTF8(title_id));
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::SetRadioGroup() {
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = web_contents()->GetURL();
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RadioGroup radio_group;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_group.url = url;
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  string16 display_host_utf16;
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  net::AppendFormattedHost(
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      url,
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile()->GetPrefs()->GetString(prefs::kAcceptLanguages),
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &display_host_utf16);
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string display_host(UTF16ToUTF8(display_host_utf16));
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (display_host.empty())
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    display_host = url.spec();
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int radio_allow_label_id = 0;
7347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int radio_block_label_id = 0;
7357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  switch (state_) {
7367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED:
7377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      NOTREACHED();
7387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return;
7397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_ACCESSED:
7407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_allow_label_id = IDS_ALLOWED_MEDIASTREAM_MIC_NO_ACTION;
7417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_ALLOWED_MEDIASTREAM_MIC_BLOCK;
7427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 0;
7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::CAMERA_ACCESSED:
7457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_allow_label_id = IDS_ALLOWED_MEDIASTREAM_CAMERA_NO_ACTION;
7467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_ALLOWED_MEDIASTREAM_CAMERA_BLOCK;
7477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 0;
7487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED:
7507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_allow_label_id = IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_NO_ACTION;
7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_ALLOWED_MEDIASTREAM_MIC_AND_CAMERA_BLOCK;
7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 0;
7537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_BLOCKED:
7557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (url.SchemeIsSecure()) {
7567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_ALLOW;
7577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_item_setting_[0] = CONTENT_SETTING_ALLOW;
7587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else {
7597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_ASK;
7607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
7617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_NO_ACTION;
7637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 1;
7647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::CAMERA_BLOCKED:
7667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (url.SchemeIsSecure()) {
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_CAMERA_ALLOW;
7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_item_setting_[0] = CONTENT_SETTING_ALLOW;
7697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else {
7707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_CAMERA_ASK;
7717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_BLOCKED_MEDIASTREAM_CAMERA_NO_ACTION;
7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 1;
7757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED:
7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      if (url.SchemeIsSecure()) {
7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_AND_CAMERA_ALLOW;
7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_item_setting_[0] = CONTENT_SETTING_ALLOW;
7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      } else {
7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        radio_allow_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_AND_CAMERA_ASK;
7827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
7837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_block_label_id = IDS_BLOCKED_MEDIASTREAM_MIC_AND_CAMERA_NO_ACTION;
7857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      selected_item_ = 1;
7867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      break;
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string radio_allow_label = l10n_util::GetStringFUTF8(
7907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      radio_allow_label_id, UTF8ToUTF16(display_host));
7917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string radio_block_label =
7927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      l10n_util::GetStringUTF8(radio_block_label_id);
7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_group.default_item = selected_item_;
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_group.radio_items.push_back(radio_allow_label);
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  radio_group.radio_items.push_back(radio_block_label);
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_radio_group(radio_group);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_radio_group_enabled(true);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::UpdateSettings(
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSetting setting) {
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (profile()) {
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    HostContentSettingsMap* content_settings =
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        profile()->GetHostContentSettingsMap();
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The same patterns must be used as in other places (e.g. the infobar) in
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // order to override the existing rule. Otherwise a new rule is created.
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(markusheintz): Extract to a helper so that there is only a single
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // place to touch.
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsPattern primary_pattern =
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::FromURLNoWildcard(web_contents()->GetURL());
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ContentSettingsPattern secondary_pattern =
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ContentSettingsPattern::Wildcard();
8157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (state_ == TabSpecificContentSettings::MICROPHONE_ACCESSED ||
8167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED ||
8177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::MICROPHONE_BLOCKED ||
8187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED) {
8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_settings->SetContentSetting(
8207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          primary_pattern, secondary_pattern,
8217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, std::string(), setting);
8227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (state_ == TabSpecificContentSettings::CAMERA_ACCESSED ||
8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED ||
8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::CAMERA_BLOCKED ||
8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED) {
8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      content_settings->SetContentSetting(
8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          primary_pattern, secondary_pattern,
8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, std::string(), setting);
8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::UpdateDefaultDeviceForType(
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::MediaStreamType type,
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& device) {
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* prefs = profile()->GetPrefs();
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prefs->SetString(prefs::kDefaultAudioCaptureDevice, device);
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(content::MEDIA_DEVICE_VIDEO_CAPTURE, type);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prefs->SetString(prefs::kDefaultVideoCaptureDevice, device);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::SetMediaMenus() {
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add microphone menu.
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PrefService* prefs = profile()->GetPrefs();
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaCaptureDevicesDispatcher* dispatcher =
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MediaCaptureDevicesDispatcher::GetInstance();
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const content::MediaStreamDevices& microphones =
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dispatcher->GetAudioCaptureDevices();
8537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool show_mic_menu =
8557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (state_ == TabSpecificContentSettings::MICROPHONE_ACCESSED ||
8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED ||
8577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::MICROPHONE_BLOCKED ||
8587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED);
8597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool show_camera_menu =
8607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      (state_ == TabSpecificContentSettings::CAMERA_ACCESSED ||
8617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_ACCESSED ||
8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::CAMERA_BLOCKED ||
8637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)       state_ == TabSpecificContentSettings::MICROPHONE_CAMERA_BLOCKED);
8647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(show_mic_menu || show_camera_menu);
8657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (show_mic_menu) {
8677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MediaMenu mic_menu;
8687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    mic_menu.label = l10n_util::GetStringUTF8(IDS_MEDIA_SELECTED_MIC_LABEL);
8697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!microphones.empty()) {
8707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string preferred_mic =
8717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          prefs->GetString(prefs::kDefaultAudioCaptureDevice);
8727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      mic_menu.default_device = GetMediaDeviceById(preferred_mic, microphones);
8737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      mic_menu.selected_device = mic_menu.default_device;
8747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
8757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    add_media_menu(content::MEDIA_DEVICE_AUDIO_CAPTURE, mic_menu);
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (show_camera_menu) {
8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const content::MediaStreamDevices& cameras =
8807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        dispatcher->GetVideoCaptureDevices();
8817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    MediaMenu camera_menu;
8827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    camera_menu.label =
8837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_MEDIA_SELECTED_CAMERA_LABEL);
8847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (!cameras.empty()) {
8857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string preferred_camera =
8867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          prefs->GetString(prefs::kDefaultVideoCaptureDevice);
8877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      camera_menu.default_device =
8887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          GetMediaDeviceById(preferred_camera, cameras);
8897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      camera_menu.selected_device = camera_menu.default_device;
8907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
8917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    add_media_menu(content::MEDIA_DEVICE_VIDEO_CAPTURE, camera_menu);
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::OnRadioClicked(int radio_index) {
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_item_ = radio_index;
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ContentSettingMediaStreamBubbleModel::OnMediaMenuClicked(
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::MediaStreamType type,
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& selected_device_id) {
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(type == content::MEDIA_DEVICE_AUDIO_CAPTURE ||
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         type == content::MEDIA_DEVICE_VIDEO_CAPTURE);
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(1U, bubble_content().media_menus.count(type));
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaCaptureDevicesDispatcher* dispatcher =
9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MediaCaptureDevicesDispatcher::GetInstance();
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const content::MediaStreamDevices& devices =
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) ?
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dispatcher->GetAudioCaptureDevices() :
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          dispatcher->GetVideoCaptureDevices();
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_selected_device(GetMediaDeviceById(selected_device_id, devices));
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingDomainListBubbleModel
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ContentSettingTitleAndLinkModel {
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingDomainListBubbleModel(Delegate* delegate,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      WebContents* web_contents,
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Profile* profile,
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ContentSettingsType content_type);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingDomainListBubbleModel() {}
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MaybeAddDomainList(const std::set<std::string>& hosts, int title_id);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDomainsAndCustomLink();
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCustomLinkClicked() OVERRIDE;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingDomainListBubbleModel::ContentSettingDomainListBubbleModel(
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingTitleAndLinkModel(
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate, web_contents, profile, content_type) {
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(CONTENT_SETTINGS_TYPE_GEOLOCATION, content_type) <<
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "SetDomains currently only supports geolocation content type";
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetDomainsAndCustomLink();
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingDomainListBubbleModel::MaybeAddDomainList(
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::set<std::string>& hosts, int title_id) {
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!hosts.empty()) {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DomainList domain_list;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    domain_list.title = l10n_util::GetStringUTF8(title_id);
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    domain_list.hosts = hosts;
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    add_domain_list(domain_list);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingDomainListBubbleModel::SetDomainsAndCustomLink() {
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
954ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const ContentSettingsUsagesState& usages =
955ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      content_settings->geolocation_usages_state();
956ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ContentSettingsUsagesState::FormattedHostsPerState formatted_hosts_per_state;
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int tab_state_flags = 0;
958ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  usages.GetDetailedInfo(&formatted_hosts_per_state, &tab_state_flags);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Divide the tab's current geolocation users into sets according to their
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permission state.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_ALLOW],
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IDS_GEOLOCATION_BUBBLE_SECTION_ALLOWED);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_BLOCK],
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IDS_GEOLOCATION_BUBBLE_SECTION_DENIED);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
967ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (tab_state_flags & ContentSettingsUsagesState::TABSTATE_HAS_EXCEPTION) {
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_custom_link(l10n_util::GetStringUTF8(
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_GEOLOCATION_BUBBLE_CLEAR_LINK));
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_custom_link_enabled(true);
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (tab_state_flags &
972ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch             ContentSettingsUsagesState::TABSTATE_HAS_CHANGED) {
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_custom_link(l10n_util::GetStringUTF8(
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_GEOLOCATION_BUBBLE_REQUIRE_RELOAD_TO_CLEAR));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingDomainListBubbleModel::OnCustomLinkClicked() {
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents())
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset this embedder's entry to default for each of the requesting
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // origins currently on the page.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& embedder_url = web_contents()->GetURL();
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents());
986ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const ContentSettingsUsagesState::StateMap& state_map =
987ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      content_settings->geolocation_usages_state().state_map();
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HostContentSettingsMap* settings_map =
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile()->GetHostContentSettingsMap();
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
991ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (ContentSettingsUsagesState::StateMap::const_iterator it =
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       state_map.begin(); it != state_map.end(); ++it) {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings_map->SetContentSetting(
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingsPattern::FromURLNoWildcard(it->first),
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingsPattern::FromURLNoWildcard(embedder_url),
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CONTENT_SETTINGS_TYPE_GEOLOCATION,
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string(),
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CONTENT_SETTING_DEFAULT);
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingMixedScriptBubbleModel
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ContentSettingTitleLinkAndCustomModel {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingMixedScriptBubbleModel(Delegate* delegate,
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       WebContents* web_contents,
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Profile* profile,
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       ContentSettingsType content_type);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ContentSettingMixedScriptBubbleModel() {}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCustomLinkClicked() OVERRIDE;
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingMixedScriptBubbleModel::ContentSettingMixedScriptBubbleModel(
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingTitleLinkAndCustomModel(
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delegate, web_contents, profile, content_type) {
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(content_type, CONTENT_SETTINGS_TYPE_MIXEDSCRIPT);
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_custom_link_enabled(true);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingMixedScriptBubbleModel::OnCustomLinkClicked() {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(UserMetricsAction("MixedScript_LoadAnyway_Bubble"));
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(web_contents());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->Send(new ChromeViewMsg_SetAllowRunningInsecureContent(
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      host->GetRoutingID(), true));
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingRPHBubbleModel::ContentSettingRPHBubbleModel(
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Delegate* delegate,
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry* registry,
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ContentSettingTitleAndLinkModel(
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          delegate, web_contents, profile, content_type),
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_item_(0),
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      registry_(registry),
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_handler_(ProtocolHandler::EmptyProtocolHandler()),
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_handler_(ProtocolHandler::EmptyProtocolHandler()) {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS, content_type);
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents);
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_handler_ = content_settings->pending_protocol_handler();
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  previous_handler_ = content_settings->previous_protocol_handler();
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 protocol;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pending_handler_.protocol() == "mailto") {
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protocol = l10n_util::GetStringUTF16(
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (pending_handler_.protocol() == "webcal") {
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protocol = l10n_util::GetStringUTF16(
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME);
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    protocol = UTF8ToUTF16(pending_handler_.protocol());
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (previous_handler_.IsEmpty()) {
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_title(l10n_util::GetStringFUTF8(
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pending_handler_.title(), UTF8ToUTF16(pending_handler_.url().host()),
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protocol));
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_title(l10n_util::GetStringFUTF8(
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM_REPLACE,
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        pending_handler_.title(), UTF8ToUTF16(pending_handler_.url().host()),
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        protocol, previous_handler_.title()));
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string radio_allow_label =
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringFUTF8(IDS_REGISTER_PROTOCOL_HANDLER_ACCEPT,
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                pending_handler_.title());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string radio_deny_label =
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_REGISTER_PROTOCOL_HANDLER_DENY);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string radio_ignore_label =
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_REGISTER_PROTOCOL_HANDLER_IGNORE);
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = web_contents->GetURL();
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RadioGroup radio_group;
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.url = url;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.radio_items.push_back(radio_allow_label);
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.radio_items.push_back(radio_deny_label);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  radio_group.radio_items.push_back(radio_ignore_label);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSetting setting =
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings->pending_protocol_handler_setting();
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (setting == CONTENT_SETTING_ALLOW)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radio_group.default_item = RPH_ALLOW;
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (setting == CONTENT_SETTING_BLOCK)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radio_group.default_item = RPH_BLOCK;
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radio_group.default_item = RPH_IGNORE;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_item_ = radio_group.default_item;
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_radio_group_enabled(true);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_radio_group(radio_group);
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::OnRadioClicked(int radio_index) {
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_item_ == radio_index)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_item_ = radio_index;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (radio_index == RPH_ALLOW)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterProtocolHandler();
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (radio_index == RPH_BLOCK)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnregisterProtocolHandler();
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (radio_index == RPH_IGNORE)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IgnoreProtocolHandler();
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::OnDoneClicked() {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The user has one chance to deal with the RPH content setting UI,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then we remove it.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ClearPendingProtocolHandler();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationService::current()->Notify(
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_WEB_CONTENT_SETTINGS_CHANGED,
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<WebContents>(web_contents()),
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::NoDetails());
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::RegisterProtocolHandler() {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A no-op if the handler hasn't been ignored, but needed in case the user
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // selects sequences like register/ignore/register.
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->RemoveIgnoredHandler(pending_handler_);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnAcceptRegisterProtocolHandler(pending_handler_);
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_pending_protocol_handler_setting(CONTENT_SETTING_ALLOW);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::UnregisterProtocolHandler() {
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnDenyRegisterProtocolHandler(pending_handler_);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_pending_protocol_handler_setting(CONTENT_SETTING_BLOCK);
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearOrSetPreviousHandler();
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::IgnoreProtocolHandler() {
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnIgnoreRegisterProtocolHandler(pending_handler_);
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings::FromWebContents(web_contents())->
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_pending_protocol_handler_setting(CONTENT_SETTING_DEFAULT);
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearOrSetPreviousHandler();
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingRPHBubbleModel::ClearOrSetPreviousHandler() {
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (previous_handler_.IsEmpty()) {
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_->ClearDefault(pending_handler_.protocol());
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registry_->OnAcceptRegisterProtocolHandler(previous_handler_);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch// TODO(toyoshim): Should share as many code with geolocation as possible.
11674311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochclass ContentSettingMIDISysExBubbleModel
11684311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    : public ContentSettingTitleAndLinkModel {
11694311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch public:
11704311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ContentSettingMIDISysExBubbleModel(Delegate* delegate,
11714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                     WebContents* web_contents,
11724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                     Profile* profile,
11734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                     ContentSettingsType content_type);
11744311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual ~ContentSettingMIDISysExBubbleModel() {}
11754311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch private:
11774311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void MaybeAddDomainList(const std::set<std::string>& hosts, int title_id);
11784311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  void SetDomainsAndCustomLink();
11794311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  virtual void OnCustomLinkClicked() OVERRIDE;
11804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch};
11814311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11824311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochContentSettingMIDISysExBubbleModel::ContentSettingMIDISysExBubbleModel(
11834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    Delegate* delegate,
11844311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    WebContents* web_contents,
11854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    Profile* profile,
11864311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    ContentSettingsType content_type)
11874311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    : ContentSettingTitleAndLinkModel(
11884311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        delegate, web_contents, profile, content_type) {
11894311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  DCHECK_EQ(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, content_type);
11904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  SetDomainsAndCustomLink();
11914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
11924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
11934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid ContentSettingMIDISysExBubbleModel::MaybeAddDomainList(
11944311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    const std::set<std::string>& hosts, int title_id) {
11954311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (!hosts.empty()) {
11964311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    DomainList domain_list;
11974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    domain_list.title = l10n_util::GetStringUTF8(title_id);
11984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    domain_list.hosts = hosts;
11994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    add_domain_list(domain_list);
12004311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
12014311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
12024311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12034311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid ContentSettingMIDISysExBubbleModel::SetDomainsAndCustomLink() {
12044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TabSpecificContentSettings* content_settings =
12054311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      TabSpecificContentSettings::FromWebContents(web_contents());
12064311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const ContentSettingsUsagesState& usages_state =
12074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content_settings->midi_usages_state();
12084311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  ContentSettingsUsagesState::FormattedHostsPerState formatted_hosts_per_state;
12094311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  unsigned int tab_state_flags = 0;
12104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  usages_state.GetDetailedInfo(&formatted_hosts_per_state, &tab_state_flags);
12114311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Divide the tab's current MIDI sysex users into sets according to their
12124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // permission state.
12134311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_ALLOW],
12144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                     IDS_MIDI_SYSEX_BUBBLE_ALLOWED);
12154311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12164311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  MaybeAddDomainList(formatted_hosts_per_state[CONTENT_SETTING_BLOCK],
12174311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                     IDS_MIDI_SYSEX_BUBBLE_DENIED);
12184311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (tab_state_flags & ContentSettingsUsagesState::TABSTATE_HAS_EXCEPTION) {
12204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    set_custom_link(l10n_util::GetStringUTF8(
12214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        IDS_MIDI_SYSEX_BUBBLE_CLEAR_LINK));
12224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    set_custom_link_enabled(true);
12234311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  } else if (tab_state_flags &
12244311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch             ContentSettingsUsagesState::TABSTATE_HAS_CHANGED) {
12254311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    set_custom_link(l10n_util::GetStringUTF8(
12264311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        IDS_MIDI_SYSEX_BUBBLE_REQUIRE_RELOAD_TO_CLEAR));
12274311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
12284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
12294311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12304311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid ContentSettingMIDISysExBubbleModel::OnCustomLinkClicked() {
12314311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (!web_contents())
12324311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return;
12334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // Reset this embedder's entry to default for each of the requesting
12344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  // origins currently on the page.
12354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  TabSpecificContentSettings* content_settings =
12364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      TabSpecificContentSettings::FromWebContents(web_contents());
12374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  const ContentSettingsUsagesState::StateMap& state_map =
12384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      content_settings->midi_usages_state().state_map();
12394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  HostContentSettingsMap* settings_map =
12404311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch      profile()->GetHostContentSettingsMap();
12414311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  for (ContentSettingsUsagesState::StateMap::const_iterator it =
12434311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch       state_map.begin(); it != state_map.end(); ++it) {
12444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    settings_map->SetContentSetting(
12454311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        ContentSettingsPattern::FromURLNoWildcard(it->first),
12464311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        ContentSettingsPattern::Wildcard(),
12474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
12484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        std::string(),
12494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch        CONTENT_SETTING_DEFAULT);
12504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
12514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch}
12524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel*
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingBubbleModel::CreateContentSettingBubbleModel(
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Delegate* delegate,
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebContents* web_contents,
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Profile* profile,
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ContentSettingsType content_type) {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_COOKIES) {
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingCookiesBubbleModel(delegate, web_contents, profile,
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                content_type);
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_POPUPS) {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingPopupBubbleModel(delegate, web_contents, profile,
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              content_type);
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_GEOLOCATION) {
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingDomainListBubbleModel(delegate, web_contents,
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   profile, content_type);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM) {
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return new ContentSettingMediaStreamBubbleModel(delegate, web_contents,
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    profile);
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_PLUGINS) {
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingPluginBubbleModel(delegate, web_contents, profile,
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               content_type);
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_MIXEDSCRIPT) {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingMixedScriptBubbleModel(delegate, web_contents,
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    profile, content_type);
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (content_type == CONTENT_SETTINGS_TYPE_PROTOCOL_HANDLERS) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry* registry =
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ProtocolHandlerRegistryFactory::GetForProfile(profile);
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new ContentSettingRPHBubbleModel(delegate, web_contents, profile,
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            registry, content_type);
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  if (content_type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
12914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch    return new ContentSettingMIDISysExBubbleModel(delegate, web_contents,
12924311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch                                                  profile, content_type);
12934311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch  }
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new ContentSettingSingleRadioGroup(delegate, web_contents, profile,
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            content_type);
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::ContentSettingBubbleModel(
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      profile_(profile),
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_type_(content_type) {
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<WebContents>(web_contents));
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<Profile>(profile_));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::~ContentSettingBubbleModel() {
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::RadioGroup::RadioGroup() : default_item(0) {}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::RadioGroup::~RadioGroup() {}
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::DomainList::DomainList() {}
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::DomainList::~DomainList() {}
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::BubbleContent::BubbleContent()
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : radio_group_enabled(false),
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      custom_link_enabled(false) {
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingBubbleModel::BubbleContent::~BubbleContent() {}
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingBubbleModel::AddBlockedResource(
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier) {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bubble_content_.resource_identifiers.insert(resource_identifier);
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ContentSettingBubbleModel::Observe(
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(web_contents_,
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              content::Source<WebContents>(source).ptr());
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_ = NULL;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(profile_, content::Source<Profile>(source).ptr());
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_ = NULL;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1349