Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: chrome/browser/ui/content_settings/content_setting_bubble_model.cc

Issue 12208010: Adding device selection menus to the content setting bubble (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased and fixed the windows code Markus found. Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h" 5 #include "chrome/browser/ui/content_settings/content_setting_bubble_model.h"
6 6
7 #include "base/utf_string_conversions.h" 7 #include "base/utf_string_conversions.h"
8 #include "chrome/browser/api/infobars/infobar_service.h" 8 #include "chrome/browser/api/infobars/infobar_service.h"
9 #include "chrome/browser/content_settings/content_settings_utils.h" 9 #include "chrome/browser/content_settings/content_settings_utils.h"
10 #include "chrome/browser/content_settings/cookie_settings.h" 10 #include "chrome/browser/content_settings/cookie_settings.h"
11 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 11 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
12 #include "chrome/browser/custom_handlers/protocol_handler_registry.h" 12 #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
13 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h" 13 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
14 #include "chrome/browser/favicon/favicon_tab_helper.h" 14 #include "chrome/browser/favicon/favicon_tab_helper.h"
15 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
15 #include "chrome/browser/plugins/chrome_plugin_service_filter.h" 16 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
16 #include "chrome/browser/prefs/pref_service.h" 17 #include "chrome/browser/prefs/pref_service.h"
17 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" 19 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h"
19 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate. h" 20 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper_delegate. h"
20 #include "chrome/browser/ui/collected_cookies_infobar_delegate.h" 21 #include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
21 #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delega te.h" 22 #include "chrome/browser/ui/content_settings/content_setting_bubble_model_delega te.h"
22 #include "chrome/browser/ui/content_settings/content_setting_changed_infobar_del egate.h" 23 #include "chrome/browser/ui/content_settings/content_setting_changed_infobar_del egate.h"
23 #include "chrome/common/chrome_notification_types.h" 24 #include "chrome/common/chrome_notification_types.h"
24 #include "chrome/common/content_settings.h" 25 #include "chrome/common/content_settings.h"
(...skipping 26 matching lines...) Expand all
51 int GetIdForContentType(const ContentSettingsTypeIdEntry* entries, 52 int GetIdForContentType(const ContentSettingsTypeIdEntry* entries,
52 size_t num_entries, 53 size_t num_entries,
53 ContentSettingsType type) { 54 ContentSettingsType type) {
54 for (size_t i = 0; i < num_entries; ++i) { 55 for (size_t i = 0; i < num_entries; ++i) {
55 if (entries[i].type == type) 56 if (entries[i].type == type)
56 return entries[i].id; 57 return entries[i].id;
57 } 58 }
58 return 0; 59 return 0;
59 } 60 }
60 61
62 const content::MediaStreamDevice& GetMediaDeviceById(
63 const std::string& device_id,
64 const content::MediaStreamDevices& devices) {
65 DCHECK(!devices.empty());
66 for (content::MediaStreamDevices::const_iterator it = devices.begin();
67 it != devices.end(); ++it) {
68 if (it->id == device_id)
69 return *(it);
70 }
71
72 // A device with the |device_id| was not found. It is likely that the device
73 // has been unplugged from the OS. Return the first device as the default
74 // device.
75 return *devices.begin();
76 }
77
61 } // namespace 78 } // namespace
62 79
63 ContentSettingTitleAndLinkModel::ContentSettingTitleAndLinkModel( 80 ContentSettingTitleAndLinkModel::ContentSettingTitleAndLinkModel(
64 Delegate* delegate, 81 Delegate* delegate,
65 WebContents* web_contents, 82 WebContents* web_contents,
66 Profile* profile, 83 Profile* profile,
67 ContentSettingsType content_type) 84 ContentSettingsType content_type)
68 : ContentSettingBubbleModel(web_contents, profile, content_type), 85 : ContentSettingBubbleModel(web_contents, profile, content_type),
69 delegate_(delegate) { 86 delegate_(delegate) {
70 // Notifications do not have a bubble. 87 // Notifications do not have a bubble.
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 WebContents* web_contents, 517 WebContents* web_contents,
501 Profile* profile); 518 Profile* profile);
502 519
503 virtual ~ContentSettingMediaStreamBubbleModel(); 520 virtual ~ContentSettingMediaStreamBubbleModel();
504 521
505 private: 522 private:
506 // Sets the title of the bubble. 523 // Sets the title of the bubble.
507 void SetTitle(); 524 void SetTitle();
508 // Sets the data for the radio buttons of the bubble. 525 // Sets the data for the radio buttons of the bubble.
509 void SetRadioGroup(); 526 void SetRadioGroup();
527 // Sets the data for the media menus of the bubble.
528 void SetMediaMenus();
510 // Updates the camera and microphone setting with the passed |setting|. 529 // Updates the camera and microphone setting with the passed |setting|.
511 void UpdateSettings(ContentSetting setting); 530 void UpdateSettings(ContentSetting setting);
531 // Updates the camera and microphone default device with the passed |type|
532 // and device.
533 void UpdateDefaultDeviceForType(content::MediaStreamType type,
534 const std::string& device);
512 535
513 // ContentSettingBubbleModel implementation. 536 // ContentSettingBubbleModel implementation.
514 virtual void OnRadioClicked(int radio_index) OVERRIDE; 537 virtual void OnRadioClicked(int radio_index) OVERRIDE;
538 virtual void OnMediaMenuClicked(content::MediaStreamType type,
539 const std::string& selected_device) OVERRIDE;
515 540
516 // The index of the selected radio item. 541 // The index of the selected radio item.
517 int selected_item_; 542 int selected_item_;
518 // The content settings that are associated with the individual radio 543 // The content settings that are associated with the individual radio
519 // buttons. 544 // buttons.
520 ContentSetting radio_item_setting_[2]; 545 ContentSetting radio_item_setting_[2];
521 }; 546 };
522 547
523 ContentSettingMediaStreamBubbleModel::ContentSettingMediaStreamBubbleModel( 548 ContentSettingMediaStreamBubbleModel::ContentSettingMediaStreamBubbleModel(
524 Delegate* delegate, 549 Delegate* delegate,
525 WebContents* web_contents, 550 WebContents* web_contents,
526 Profile* profile) 551 Profile* profile)
527 : ContentSettingTitleAndLinkModel( 552 : ContentSettingTitleAndLinkModel(
528 delegate, web_contents, profile, CONTENT_SETTINGS_TYPE_MEDIASTREAM), 553 delegate, web_contents, profile, CONTENT_SETTINGS_TYPE_MEDIASTREAM),
529 selected_item_(0) { 554 selected_item_(0) {
555 DCHECK(profile);
530 // Initialize the content settings associated with the individual radio 556 // Initialize the content settings associated with the individual radio
531 // buttons. 557 // buttons.
532 radio_item_setting_[0] = CONTENT_SETTING_ASK; 558 radio_item_setting_[0] = CONTENT_SETTING_ASK;
533 radio_item_setting_[1] = CONTENT_SETTING_BLOCK; 559 radio_item_setting_[1] = CONTENT_SETTING_BLOCK;
534 560
535 SetTitle(); 561 SetTitle();
536 SetRadioGroup(); 562 SetRadioGroup();
563 SetMediaMenus();
537 } 564 }
538 565
539 ContentSettingMediaStreamBubbleModel::~ContentSettingMediaStreamBubbleModel() { 566 ContentSettingMediaStreamBubbleModel::~ContentSettingMediaStreamBubbleModel() {
567 bool media_setting_changed = false;
568 for (MediaMenuMap::const_iterator it = bubble_content().media_menus.begin();
569 it != bubble_content().media_menus.end(); ++it) {
570 if (it->second.selected_device.id != it->second.default_device.id) {
571 UpdateDefaultDeviceForType(it->first, it->second.selected_device.id);
572 media_setting_changed = true;
573 }
574 }
575
540 // Update the media settings if the radio button selection was changed. 576 // Update the media settings if the radio button selection was changed.
541 if (selected_item_ != bubble_content().radio_group.default_item) { 577 if (selected_item_ != bubble_content().radio_group.default_item) {
542 UpdateSettings(radio_item_setting_[selected_item_]); 578 UpdateSettings(radio_item_setting_[selected_item_]);
579 media_setting_changed = true;
580 }
581
582 // Trigger the reload infobar if the media setting has been changed.
583 if (media_setting_changed) {
543 ContentSettingChangedInfoBarDelegate::Create( 584 ContentSettingChangedInfoBarDelegate::Create(
544 InfoBarService::FromWebContents(web_contents()), 585 InfoBarService::FromWebContents(web_contents()),
545 IDR_INFOBAR_MEDIA_STREAM_CAMERA, 586 IDR_INFOBAR_MEDIA_STREAM_CAMERA,
546 IDS_MEDIASTREAM_SETTING_CHANGED_INFOBAR_MESSAGE); 587 IDS_MEDIASTREAM_SETTING_CHANGED_INFOBAR_MESSAGE);
547 } 588 }
548 } 589 }
549 590
550 void ContentSettingMediaStreamBubbleModel::SetTitle() { 591 void ContentSettingMediaStreamBubbleModel::SetTitle() {
551 TabSpecificContentSettings* content_settings = 592 TabSpecificContentSettings* content_settings =
552 TabSpecificContentSettings::FromWebContents(web_contents()); 593 TabSpecificContentSettings::FromWebContents(web_contents());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 ContentSettingsPattern::Wildcard(); 658 ContentSettingsPattern::Wildcard();
618 content_settings->SetContentSetting( 659 content_settings->SetContentSetting(
619 primary_pattern, secondary_pattern, 660 primary_pattern, secondary_pattern,
620 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, std::string(), setting); 661 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, std::string(), setting);
621 content_settings->SetContentSetting( 662 content_settings->SetContentSetting(
622 primary_pattern, secondary_pattern, 663 primary_pattern, secondary_pattern,
623 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, std::string(), setting); 664 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, std::string(), setting);
624 } 665 }
625 } 666 }
626 667
668 void ContentSettingMediaStreamBubbleModel::UpdateDefaultDeviceForType(
669 content::MediaStreamType type,
670 const std::string& device) {
671 PrefService* prefs = profile()->GetPrefs();
672 if (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
673 prefs->SetString(prefs::kDefaultAudioCaptureDevice, device);
674 } else {
675 DCHECK_EQ(content::MEDIA_DEVICE_VIDEO_CAPTURE, type);
676 prefs->SetString(prefs::kDefaultVideoCaptureDevice, device);
677 }
678 }
679
680 void ContentSettingMediaStreamBubbleModel::SetMediaMenus() {
681 // Add microphone menu.
682 PrefService* prefs = profile()->GetPrefs();
683 MediaCaptureDevicesDispatcher* dispatcher =
684 MediaCaptureDevicesDispatcher::GetInstance();
685 const content::MediaStreamDevices& microphones =
686 dispatcher->GetAudioCaptureDevices();
687 MediaMenu mic_menu;
688 mic_menu.label = l10n_util::GetStringUTF8(IDS_MEDIA_SELECTED_MIC_LABEL);
689 if (!microphones.empty()) {
690 std::string preferred_mic =
691 prefs->GetString(prefs::kDefaultAudioCaptureDevice);
692 mic_menu.default_device = GetMediaDeviceById(preferred_mic, microphones);
693 mic_menu.selected_device = mic_menu.default_device;
694 }
695 add_media_menu(content::MEDIA_DEVICE_AUDIO_CAPTURE, mic_menu);
696
697 // Add camera menu.
698 const content::MediaStreamDevices& cameras =
699 dispatcher->GetVideoCaptureDevices();
700 MediaMenu camera_menu;
701 camera_menu.label = l10n_util::GetStringUTF8(IDS_MEDIA_SELECTED_CAMERA_LABEL);
702 if (!cameras.empty()) {
703 std::string preferred_camera =
704 prefs->GetString(prefs::kDefaultVideoCaptureDevice);
705 camera_menu.default_device = GetMediaDeviceById(preferred_camera,
706 cameras);
707 camera_menu.selected_device = camera_menu.default_device;
708 }
709 add_media_menu(content::MEDIA_DEVICE_VIDEO_CAPTURE, camera_menu);
710 }
711
627 void ContentSettingMediaStreamBubbleModel::OnRadioClicked(int radio_index) { 712 void ContentSettingMediaStreamBubbleModel::OnRadioClicked(int radio_index) {
628 selected_item_ = radio_index; 713 selected_item_ = radio_index;
629 } 714 }
630 715
716 void ContentSettingMediaStreamBubbleModel::OnMediaMenuClicked(
717 content::MediaStreamType type, const std::string& selected_device_id) {
718 DCHECK(type == content::MEDIA_DEVICE_AUDIO_CAPTURE ||
719 type == content::MEDIA_DEVICE_VIDEO_CAPTURE);
720 DCHECK_EQ(1U, bubble_content().media_menus.count(type));
721 MediaCaptureDevicesDispatcher* dispatcher =
722 MediaCaptureDevicesDispatcher::GetInstance();
723 const content::MediaStreamDevices& devices =
724 (type == content::MEDIA_DEVICE_AUDIO_CAPTURE) ?
725 dispatcher->GetAudioCaptureDevices() :
726 dispatcher->GetVideoCaptureDevices();
727 set_selected_device(GetMediaDeviceById(selected_device_id, devices));
728 }
729
631 class ContentSettingDomainListBubbleModel 730 class ContentSettingDomainListBubbleModel
632 : public ContentSettingTitleAndLinkModel { 731 : public ContentSettingTitleAndLinkModel {
633 public: 732 public:
634 ContentSettingDomainListBubbleModel(Delegate* delegate, 733 ContentSettingDomainListBubbleModel(Delegate* delegate,
635 WebContents* web_contents, 734 WebContents* web_contents,
636 Profile* profile, 735 Profile* profile,
637 ContentSettingsType content_type); 736 ContentSettingsType content_type);
638 virtual ~ContentSettingDomainListBubbleModel() {} 737 virtual ~ContentSettingDomainListBubbleModel() {}
639 738
640 private: 739 private:
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) { 1064 if (type == content::NOTIFICATION_WEB_CONTENTS_DESTROYED) {
966 DCHECK_EQ(web_contents_, 1065 DCHECK_EQ(web_contents_,
967 content::Source<WebContents>(source).ptr()); 1066 content::Source<WebContents>(source).ptr());
968 web_contents_ = NULL; 1067 web_contents_ = NULL;
969 } else { 1068 } else {
970 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type); 1069 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
971 DCHECK_EQ(profile_, content::Source<Profile>(source).ptr()); 1070 DCHECK_EQ(profile_, content::Source<Profile>(source).ptr());
972 profile_ = NULL; 1071 profile_ = NULL;
973 } 1072 }
974 } 1073 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698