1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #include "chrome/browser/media/media_device_id_salt.h"
6 #include "base/base64.h"
7 #include "base/prefs/pref_service.h"
8 #include "base/rand_util.h"
9 #include "chrome/browser/profiles/profile_io_data.h"
10 #include "chrome/common/pref_names.h"
11 #include "content/public/browser/browser_thread.h"
13 using content::BrowserThread
;
17 std::string
CreateSalt() {
19 base::Base64Encode(base::RandBytesAsString(16), &salt
);
20 DCHECK(!salt
.empty());
26 MediaDeviceIDSalt::MediaDeviceIDSalt(PrefService
* pref_service
,
28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
31 incognito_salt_
= CreateSalt();
35 media_device_id_salt_
.Init(prefs::kMediaDeviceIdSalt
, pref_service
);
36 if (media_device_id_salt_
.GetValue().empty())
37 media_device_id_salt_
.SetValue(CreateSalt());
39 media_device_id_salt_
.MoveToThread(
40 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO
));
43 MediaDeviceIDSalt::~MediaDeviceIDSalt() {
46 void MediaDeviceIDSalt::ShutdownOnUIThread() {
47 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI
));
48 if (incognito_salt_
.empty())
49 media_device_id_salt_
.Destroy();
52 std::string
MediaDeviceIDSalt::GetSalt() const {
53 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO
));
54 if (incognito_salt_
.size())
55 return incognito_salt_
;
56 return media_device_id_salt_
.GetValue();
59 void MediaDeviceIDSalt::RegisterProfilePrefs(
60 user_prefs::PrefRegistrySyncable
* registry
) {
61 registry
->RegisterStringPref(
62 prefs::kMediaDeviceIdSalt
,
64 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF
);
67 void MediaDeviceIDSalt::Reset(PrefService
* pref_service
) {
68 pref_service
->SetString(prefs::kMediaDeviceIdSalt
,