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

Unified Diff: chrome/browser/media/media_stream_devices_prefs.cc

Issue 10537099: add "always allow" option to the mediastream infobar and allow user to allow/not allow acces to devi (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media/media_stream_devices_prefs.cc
diff --git a/chrome/browser/media/media_stream_devices_prefs.cc b/chrome/browser/media/media_stream_devices_prefs.cc
new file mode 100644
index 0000000000000000000000000000000000000000..fedfc3a955dc61ddcb33e9ec53b31a4b3a3f2dd7
--- /dev/null
+++ b/chrome/browser/media/media_stream_devices_prefs.cc
@@ -0,0 +1,170 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/media/media_stream_devices_prefs.h"
+
+#include "base/values.h"
+#include "chrome/browser/content_settings/content_settings_provider.h"
+#include "chrome/browser/content_settings/host_content_settings_map.h"
+#include "chrome/browser/prefs/scoped_user_pref_update.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/common/content_settings.h"
+#include "chrome/common/pref_names.h"
+
+using content::BrowserThread;
+
+MediaStreamDevicesPrefs::MediaStreamDevicesPrefs(Profile* profile)
+ : profile_(profile) {
+}
+
+void MediaStreamDevicesPrefs::RegisterUserPrefs(PrefService* user_prefs) {
+ if (!user_prefs->FindPreference(prefs::kMediaStreamAudioDevicesWhitelist))
Bernhard Bauer 2012/06/11 18:16:00 You shouldn't need to check whether the preference
+ user_prefs->RegisterDictionaryPref(
+ prefs::kMediaStreamAudioDevicesWhitelist, PrefService::UNSYNCABLE_PREF);
+ if (!user_prefs->FindPreference(prefs::kMediaStreamVideoDevicesWhitelist))
tommi (sloooow) - chröme 2012/06/11 20:59:21 {}
+ user_prefs->RegisterDictionaryPref(
+ prefs::kMediaStreamVideoDevicesWhitelist, PrefService::UNSYNCABLE_PREF);
+}
+
+std::string MediaStreamDevicesPrefs::GetAlwaysAllowedAudioDevice(
+ const GURL& origin,
+ const content::MediaStreamDevices& devices) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!origin.is_empty());
+ if (!devices.size())
+ return std::string();
+
+ return GetAlwaysAllowedDevice(prefs::kMediaStreamAudioDevicesWhitelist,
+ origin,
+ devices);
+}
+
+std::string MediaStreamDevicesPrefs::GetAlwaysAllowedVideoDevice(
+ const GURL& origin,
+ const content::MediaStreamDevices& devices) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!origin.is_empty());
+ if (!devices.size())
+ return std::string();
+
+ return GetAlwaysAllowedDevice(prefs::kMediaStreamVideoDevicesWhitelist,
+ origin,
+ devices);
+}
+
+void MediaStreamDevicesPrefs::WhitelistOriginAndDevices(
+ const GURL& origin,
+ const content::MediaStreamDevices& devices) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!origin.is_empty());
+ DCHECK(devices.size());
+ content::MediaStreamDevices::const_iterator dev = devices.begin();
+ for (; dev != devices.end(); ++dev) {
+ if (dev->type == content::MEDIA_STREAM_DEVICE_TYPE_AUDIO_CAPTURE) {
+ AddOrigin(prefs::kMediaStreamAudioDevicesWhitelist, origin, dev->name);
+ } else {
+ DCHECK_EQ(dev->type, content::MEDIA_STREAM_DEVICE_TYPE_VIDEO_CAPTURE);
+ AddOrigin(prefs::kMediaStreamVideoDevicesWhitelist, origin, dev->name);
+ }
+ }
+
+ AddExceptionToContentSettings(origin);
+}
+
+void MediaStreamDevicesPrefs::RemoveOriginFromWhitelists(
+ const GURL& origin) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ DCHECK(!origin.is_empty());
+ RemoveOrigin(prefs::kMediaStreamAudioDevicesWhitelist, origin);
+ RemoveOrigin(prefs::kMediaStreamVideoDevicesWhitelist, origin);
+}
+
+bool MediaStreamDevicesPrefs::IsMediaDeviceBlocked() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return (profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
+ CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL) == CONTENT_SETTING_BLOCK);
Bernhard Bauer 2012/06/11 18:16:00 This line is a bit awkwardly broken. You could ext
+}
+
+bool MediaStreamDevicesPrefs::IsOriginAlwaysAllowed(const GURL& origin) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return (profile_->GetHostContentSettingsMap()->GetContentSetting(
+ origin, origin, CONTENT_SETTINGS_TYPE_MEDIASTREAM,
+ NO_RESOURCE_IDENTIFIER) == CONTENT_SETTING_ALLOW);
+}
+
+void MediaStreamDevicesPrefs::AddExceptionToContentSettings(
+ const GURL& origin) {
+ ContentSettingsPattern primary_pattern =
+ ContentSettingsPattern::FromURLNoWildcard(origin);
+ profile_->GetHostContentSettingsMap()->SetContentSetting(
+ primary_pattern,
+ ContentSettingsPattern::Wildcard(),
+ CONTENT_SETTINGS_TYPE_MEDIASTREAM,
+ NO_RESOURCE_IDENTIFIER,
+ CONTENT_SETTING_ALLOW);
+}
+
+std::string MediaStreamDevicesPrefs::GetAlwaysAllowedDevice(
+ const char* pref_id,
+ const GURL& origin,
+ const content::MediaStreamDevices& devices) {
+ content::MediaStreamDevices::const_iterator dev = devices.begin();
+ for (; dev != devices.end(); ++dev) {
+ if (IsDevicePairedWithOrigin(pref_id, origin, dev->name))
Bernhard Bauer 2012/06/11 18:16:00 You could simplify this by first getting the devic
+ return dev->device_id;
+ }
+
+ return std::string();
+}
+
+bool MediaStreamDevicesPrefs::IsDevicePairedWithOrigin(
+ const char* pref_id,
+ const GURL& origin,
+ const std::string& device) {
+ const DictionaryValue* dict = profile_->GetPrefs()->GetDictionary(pref_id);
+ if (!dict || dict->empty())
Bernhard Bauer 2012/06/11 18:16:00 PrefService::GetDictionary will never return NULL
+ return false;
+
+ std::string auto_target_device;
+ if (dict->GetStringWithoutPathExpansion(origin.spec(), &auto_target_device) &&
+ auto_target_device == device) {
+ return true;
+ }
+
+ return false;
+}
+
+void MediaStreamDevicesPrefs::AddOrigin(const char* pref_id,
+ const GURL& origin,
+ const std::string& device) {
+ DictionaryPrefUpdate update(profile_->GetPrefs(), pref_id);
+ DictionaryValue* whitelist = update.Get();
+ if (!whitelist) {
Bernhard Bauer 2012/06/11 18:16:00 This will also never be NULL if the preference is
+ NOTREACHED() << "Unregistered media stream device whitelist pref "
+ << pref_id;
+ return;
+ }
+
+ whitelist->SetWithoutPathExpansion(origin.spec(),
+ Value::CreateStringValue(device));
+}
+
+void MediaStreamDevicesPrefs::RemoveOrigin(
+ const char* pref_id,
+ const GURL& origin) {
+ DictionaryPrefUpdate update(profile_->GetPrefs(), pref_id);
+ DictionaryValue* whitelist = update.Get();
+ if (!whitelist) {
+ NOTREACHED() << "Unregistered media stream device whitelist pref"
+ << pref_id;
+ return;
+ }
+
+ std::string val;
+ // Remove the origin if it is in the whitelist.
+ if (whitelist->GetStringWithoutPathExpansion(origin.spec(), &val)) {
+ whitelist->RemoveWithoutPathExpansion(origin.spec(), NULL);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698