summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-17 11:29:59 +0000
committerjoi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-17 11:29:59 +0000
commitce98b778950f36f6c66c9256ac3699b78ac2b489 (patch)
tree1ca86c3c36318aaf4912dd20ce3e44837f662b8e
parent7e750926feb522c987f1657b148b3ba6451d9f60 (diff)
downloadchromium_src-ce98b778950f36f6c66c9256ac3699b78ac2b489.zip
chromium_src-ce98b778950f36f6c66c9256ac3699b78ac2b489.tar.gz
chromium_src-ce98b778950f36f6c66c9256ac3699b78ac2b489.tar.bz2
Merge 251024 "Allow retrieval of media device ID salt even after..."
> Allow retrieval of media device ID salt even after ResourceContext has gone away. > > TBR=willchan@chromium.org > BUG=341211 > > Review URL: https://codereview.chromium.org/143003031 TBR=joi@chromium.org Review URL: https://codereview.chromium.org/169553002 git-svn-id: svn://svn.chromium.org/chrome/branches/1750/src@251660 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc2
-rw-r--r--chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc2
-rw-r--r--chrome/browser/media/media_device_id_salt.h13
-rw-r--r--chrome/browser/profiles/profile_io_data.cc10
-rw-r--r--chrome/browser/profiles/profile_io_data.h6
-rw-r--r--content/browser/loader/resource_scheduler_unittest.cc1
-rw-r--r--content/browser/renderer_host/media/device_request_message_filter.cc12
-rw-r--r--content/browser/renderer_host/media/device_request_message_filter_unittest.cc4
-rw-r--r--content/browser/renderer_host/media/media_stream_dispatcher_host.cc9
-rw-r--r--content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc24
-rw-r--r--content/browser/renderer_host/media/media_stream_manager.cc43
-rw-r--r--content/browser/renderer_host/media/media_stream_manager.h20
-rw-r--r--content/browser/renderer_host/media/video_capture_host_unittest.cc4
-rw-r--r--content/browser/resource_context_impl.cc9
-rw-r--r--content/public/browser/media_device_id.cc9
-rw-r--r--content/public/browser/media_device_id.h7
-rw-r--r--content/public/browser/resource_context.h28
-rw-r--r--content/test/webrtc_audio_device_test.cc4
18 files changed, 119 insertions, 88 deletions
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
index 602e857..e8ab7a5 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
@@ -314,7 +314,7 @@ WebrtcAudioPrivateGetAssociatedSinkFunction::GetRawSourceIDOnIOThread(
++it) {
const std::string& id = it->unique_id;
if (content::DoesMediaDeviceIDMatchHMAC(
- context,
+ context->GetMediaDeviceIDSalt(),
security_origin,
source_id_in_origin,
id)) {
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
index e3f7c7e..904b1ad 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -132,7 +132,7 @@ class WebrtcAudioPrivateTest : public AudioWaitingExtensionTest {
enumeration_event_.Wait();
} else {
*source_id_in_origin = content::GetHMACForMediaDeviceID(
- resource_context,
+ resource_context->GetMediaDeviceIDSalt(),
origin,
raw_device_id);
enumeration_event_.Signal();
diff --git a/chrome/browser/media/media_device_id_salt.h b/chrome/browser/media/media_device_id_salt.h
index a98e3fb..46df854 100644
--- a/chrome/browser/media/media_device_id_salt.h
+++ b/chrome/browser/media/media_device_id_salt.h
@@ -7,6 +7,7 @@
#include <string>
+#include "base/memory/ref_counted.h"
#include "base/prefs/pref_member.h"
#include "components/user_prefs/pref_registry_syncable.h"
@@ -15,11 +16,12 @@ class PrefService;
// MediaDeviceIDSalt is responsible for creating and retrieving a salt string
// that is used for creating MediaSource IDs that can be cached by a web
// service. If the cache is cleared, the MediaSourceIds are invalidated.
-class MediaDeviceIDSalt {
+//
+// The class is reference counted so that it can be used in the
+// callback returned by ResourceContext::GetMediaDeviceIDSalt.
+class MediaDeviceIDSalt : public base::RefCountedThreadSafe<MediaDeviceIDSalt> {
public:
- MediaDeviceIDSalt(PrefService* pref_service,
- bool incognito);
- ~MediaDeviceIDSalt();
+ MediaDeviceIDSalt(PrefService* pref_service, bool incognito);
void ShutdownOnUIThread();
std::string GetSalt() const;
@@ -28,6 +30,9 @@ class MediaDeviceIDSalt {
static void Reset(PrefService* pref_service);
private:
+ friend class base::RefCountedThreadSafe<MediaDeviceIDSalt>;
+ ~MediaDeviceIDSalt();
+
// |incognito_salt_| is initialized in ctor on UI thread but only read
// on the IO thread.
std::string incognito_salt_;
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index a9f68c4..49aa9f0 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -478,8 +478,7 @@ void ProfileIOData::InitializeOnUIThread(Profile* profile) {
signin_allowed_.MoveToThread(io_message_loop_proxy);
}
- media_device_id_salt_.reset(new MediaDeviceIDSalt(pref_service,
- is_incognito()));
+ media_device_id_salt_ = new MediaDeviceIDSalt(pref_service, is_incognito());
#if defined(OS_CHROMEOS)
cert_verifier_ = policy::PolicyCertServiceFactory::CreateForProfile(profile);
@@ -780,8 +779,8 @@ HostContentSettingsMap* ProfileIOData::GetHostContentSettingsMap() const {
return host_content_settings_map_.get();
}
-std::string ProfileIOData::GetMediaDeviceIDSalt() const {
- return media_device_id_salt_->GetSalt();
+ResourceContext::SaltCallback ProfileIOData::GetMediaDeviceIDSalt() const {
+ return base::Bind(&MediaDeviceIDSalt::GetSalt, media_device_id_salt_);
}
void ProfileIOData::InitializeMetricsEnabledStateOnUIThread() {
@@ -919,7 +918,8 @@ bool ProfileIOData::ResourceContext::AllowContentAccess(
return setting == CONTENT_SETTING_ALLOW;
}
-std::string ProfileIOData::ResourceContext::GetMediaDeviceIDSalt() {
+ResourceContext::SaltCallback
+ProfileIOData::ResourceContext::GetMediaDeviceIDSalt() {
return io_data_->GetMediaDeviceIDSalt();
}
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h
index 5c98b26..d56b42e 100644
--- a/chrome/browser/profiles/profile_io_data.h
+++ b/chrome/browser/profiles/profile_io_data.h
@@ -176,7 +176,7 @@ class ProfileIOData {
return &signin_allowed_;
}
- std::string GetMediaDeviceIDSalt() const;
+ content::ResourceContext::SaltCallback GetMediaDeviceIDSalt() const;
net::TransportSecurityState* transport_security_state() const {
return transport_security_state_.get();
@@ -383,7 +383,7 @@ class ProfileIOData {
OVERRIDE;
virtual bool AllowMicAccess(const GURL& origin) OVERRIDE;
virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE;
- virtual std::string GetMediaDeviceIDSalt() OVERRIDE;
+ virtual SaltCallback GetMediaDeviceIDSalt() OVERRIDE;
private:
friend class ProfileIOData;
@@ -485,7 +485,7 @@ class ProfileIOData {
mutable StringListPrefMember one_click_signin_rejected_email_list_;
- mutable scoped_ptr<MediaDeviceIDSalt> media_device_id_salt_;
+ mutable scoped_refptr<MediaDeviceIDSalt> media_device_id_salt_;
// Member variables which are pointed to by the various context objects.
mutable BooleanPrefMember enable_referrers_;
diff --git a/content/browser/loader/resource_scheduler_unittest.cc b/content/browser/loader/resource_scheduler_unittest.cc
index 07dd333..fbdc72b 100644
--- a/content/browser/loader/resource_scheduler_unittest.cc
+++ b/content/browser/loader/resource_scheduler_unittest.cc
@@ -92,7 +92,6 @@ class FakeResourceContext : public ResourceContext {
virtual net::URLRequestContext* GetRequestContext() OVERRIDE { return NULL; }
virtual bool AllowMicAccess(const GURL& origin) OVERRIDE { return false; }
virtual bool AllowCameraAccess(const GURL& origin) OVERRIDE { return false; }
- virtual std::string GetMediaDeviceIDSalt() OVERRIDE { return std::string(); }
};
class FakeResourceMessageFilter : public ResourceMessageFilter {
diff --git a/content/browser/renderer_host/media/device_request_message_filter.cc b/content/browser/renderer_host/media/device_request_message_filter.cc
index 37e3bea..89e632f 100644
--- a/content/browser/renderer_host/media/device_request_message_filter.cc
+++ b/content/browser/renderer_host/media/device_request_message_filter.cc
@@ -30,7 +30,9 @@ DeviceRequestMessageFilter::DeviceRequestMessageFilter(
}
DeviceRequestMessageFilter::~DeviceRequestMessageFilter() {
- DCHECK(requests_.empty());
+ // CHECK rather than DCHECK to make sure this never happens in the
+ // wild. We want to be sure due to http://crbug.com/341211
+ CHECK(requests_.empty());
}
struct DeviceRequestMessageFilter::DeviceRequest {
@@ -134,14 +136,14 @@ void DeviceRequestMessageFilter::OnGetSources(int request_id,
const GURL& security_origin) {
// Make request to get audio devices.
const std::string& audio_label = media_stream_manager_->EnumerateDevices(
- this, -1, -1, resource_context_, -1, MEDIA_DEVICE_AUDIO_CAPTURE,
- security_origin);
+ this, -1, -1, resource_context_->GetMediaDeviceIDSalt(), -1,
+ MEDIA_DEVICE_AUDIO_CAPTURE, security_origin);
DCHECK(!audio_label.empty());
// Make request for video devices.
const std::string& video_label = media_stream_manager_->EnumerateDevices(
- this, -1, -1, resource_context_, -1, MEDIA_DEVICE_VIDEO_CAPTURE,
- security_origin);
+ this, -1, -1, resource_context_->GetMediaDeviceIDSalt(), -1,
+ MEDIA_DEVICE_VIDEO_CAPTURE, security_origin);
DCHECK(!video_label.empty());
requests_.push_back(DeviceRequest(
diff --git a/content/browser/renderer_host/media/device_request_message_filter_unittest.cc b/content/browser/renderer_host/media/device_request_message_filter_unittest.cc
index 3a9382b..95b9cd8 100644
--- a/content/browser/renderer_host/media/device_request_message_filter_unittest.cc
+++ b/content/browser/renderer_host/media/device_request_message_filter_unittest.cc
@@ -29,7 +29,7 @@ class MockMediaStreamManager : public MediaStreamManager {
std::string(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& rc,
int page_request_id,
MediaStreamType type,
const GURL& security_origin));
@@ -38,7 +38,7 @@ class MockMediaStreamManager : public MediaStreamManager {
std::string DoEnumerateDevices(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& rc,
int page_request_id,
MediaStreamType type,
const GURL& security_origin) {
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
index 8ea1617..2385f3b 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -131,7 +131,8 @@ void MediaStreamDispatcherHost::OnGenerateStream(
<< security_origin.spec() << ")";
media_stream_manager_->GenerateStream(
- this, render_process_id_, render_view_id, resource_context_,
+ this, render_process_id_, render_view_id,
+ resource_context_->GetMediaDeviceIDSalt(),
page_request_id,
components, security_origin);
}
@@ -167,7 +168,8 @@ void MediaStreamDispatcherHost::OnEnumerateDevices(
<< security_origin.spec() << ")";
media_stream_manager_->EnumerateDevices(
- this, render_process_id_, render_view_id, resource_context_,
+ this, render_process_id_, render_view_id,
+ resource_context_->GetMediaDeviceIDSalt(),
page_request_id, type, security_origin);
}
@@ -195,7 +197,8 @@ void MediaStreamDispatcherHost::OnOpenDevice(
<< security_origin.spec() << ")";
media_stream_manager_->OpenDevice(
- this, render_process_id_, render_view_id, resource_context_,
+ this, render_process_id_, render_view_id,
+ resource_context_->GetMediaDeviceIDSalt(),
page_request_id, device_id, type, security_origin);
}
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
index b8c4f25..956b0cd 100644
--- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
+++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -332,10 +332,10 @@ class MediaStreamDispatcherHostTest : public testing::Test {
physical_audio_devices_.begin();
for (; audio_it != physical_audio_devices_.end(); ++audio_it) {
if (content::DoesMediaDeviceIDMatchHMAC(
- browser_context_.GetResourceContext(),
- origin,
- devices[i].device.id,
- audio_it->unique_id)) {
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
+ origin,
+ devices[i].device.id,
+ audio_it->unique_id)) {
EXPECT_FALSE(found_match);
found_match = true;
}
@@ -344,10 +344,10 @@ class MediaStreamDispatcherHostTest : public testing::Test {
physical_video_devices_.begin();
for (; video_it != physical_video_devices_.end(); ++video_it) {
if (content::DoesMediaDeviceIDMatchHMAC(
- browser_context_.GetResourceContext(),
- origin,
- devices[i].device.id,
- video_it->id())) {
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
+ origin,
+ devices[i].device.id,
+ video_it->id())) {
EXPECT_FALSE(found_match);
found_match = true;
}
@@ -537,7 +537,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithMandatorySourceId) {
physical_audio_devices_.begin();
for (; audio_it != physical_audio_devices_.end(); ++audio_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
origin_,
audio_it->unique_id);
ASSERT_FALSE(source_id.empty());
@@ -553,7 +553,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithMandatorySourceId) {
physical_video_devices_.begin();
for (; video_it != physical_video_devices_.end(); ++video_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
origin_,
video_it->id());
ASSERT_FALSE(source_id.empty());
@@ -576,7 +576,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithOptionalSourceId) {
physical_audio_devices_.begin();
for (; audio_it != physical_audio_devices_.end(); ++audio_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
origin_,
audio_it->unique_id);
ASSERT_FALSE(source_id.empty());
@@ -592,7 +592,7 @@ TEST_F(MediaStreamDispatcherHostTest, GenerateStreamsWithOptionalSourceId) {
physical_video_devices_.begin();
for (; video_it != physical_video_devices_.end(); ++video_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
origin_,
video_it->id());
ASSERT_FALSE(source_id.empty());
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index ab61b28..f6f62fd 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -103,6 +103,11 @@ void ParseStreamType(const StreamOptions& options,
}
}
+// Needed for MediaStreamManager::GenerateStream below.
+std::string ReturnEmptySalt() {
+ return std::string();
+}
+
} // namespace
@@ -121,7 +126,7 @@ class MediaStreamManager::DeviceRequest {
const GURL& security_origin,
MediaStreamRequestType request_type,
const StreamOptions& options,
- ResourceContext* resource_context)
+ const ResourceContext::SaltCallback& salt_callback)
: requester(requester),
requesting_process_id(requesting_process_id),
requesting_view_id(requesting_view_id),
@@ -129,7 +134,7 @@ class MediaStreamManager::DeviceRequest {
security_origin(security_origin),
request_type(request_type),
options(options),
- resource_context(resource_context),
+ salt_callback(salt_callback),
state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED),
audio_type_(MEDIA_NO_SERVICE),
video_type_(MEDIA_NO_SERVICE) {
@@ -249,7 +254,7 @@ class MediaStreamManager::DeviceRequest {
const StreamOptions options;
- ResourceContext* resource_context;
+ ResourceContext::SaltCallback salt_callback;
StreamDeviceInfoArray devices;
@@ -337,7 +342,7 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
security_origin,
MEDIA_DEVICE_ACCESS,
options,
- NULL);
+ base::Bind(&ReturnEmptySalt));
const std::string& label = AddRequest(request);
@@ -357,7 +362,7 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
int page_request_id,
const StreamOptions& options,
const GURL& security_origin) {
@@ -375,7 +380,7 @@ void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
security_origin,
MEDIA_GENERATE_STREAM,
options,
- rc);
+ sc);
const std::string& label = AddRequest(request);
@@ -536,7 +541,7 @@ std::string MediaStreamManager::EnumerateDevices(
MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
int page_request_id,
MediaStreamType type,
const GURL& security_origin) {
@@ -552,7 +557,7 @@ std::string MediaStreamManager::EnumerateDevices(
security_origin,
MEDIA_ENUMERATE_DEVICES,
StreamOptions(),
- rc);
+ sc);
if (IsAudioMediaType(type))
request->SetAudioType(type);
else if (IsVideoMediaType(type))
@@ -603,7 +608,7 @@ void MediaStreamManager::DoEnumerateDevices(const std::string& label) {
void MediaStreamManager::OpenDevice(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
int page_request_id,
const std::string& device_id,
MediaStreamType type,
@@ -631,7 +636,7 @@ void MediaStreamManager::OpenDevice(MediaStreamRequester* requester,
security_origin,
MEDIA_OPEN_DEVICE,
options,
- rc);
+ sc);
const std::string& label = AddRequest(request);
// Post a task and handle the request asynchronously. The reason is that the
@@ -660,8 +665,8 @@ void MediaStreamManager::StopRemovedDevices(
for (StreamDeviceInfoArray::const_iterator old_dev_it = old_devices.begin();
old_dev_it != old_devices.end(); ++old_dev_it) {
bool device_found = false;
- for (StreamDeviceInfoArray::const_iterator new_dev_it = new_devices.begin();
- new_dev_it != new_devices.end(); ++new_dev_it) {
+ StreamDeviceInfoArray::const_iterator new_dev_it = new_devices.begin();
+ for (; new_dev_it != new_devices.end(); ++new_dev_it) {
if (old_dev_it->device.id == new_dev_it->device.id) {
device_found = true;
break;
@@ -685,7 +690,7 @@ void MediaStreamManager::StopRemovedDevice(const MediaStreamDevice& device) {
request->devices.begin();
device_it != request->devices.end(); ++device_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
- request->resource_context,
+ request->salt_callback,
request->security_origin,
device.id);
if (device_it->device.id == source_id &&
@@ -759,7 +764,7 @@ bool MediaStreamManager::GetRequestedDeviceCaptureId(
// id.
if (source_ids.size() == 1 &&
!TranslateSourceIdToDeviceId(type,
- request->resource_context,
+ request->salt_callback,
request->security_origin,
source_ids[0], device_id)) {
LOG(WARNING) << "Invalid mandatory audio " << kMediaStreamSourceInfoId
@@ -776,7 +781,7 @@ bool MediaStreamManager::GetRequestedDeviceCaptureId(
for (std::vector<std::string>::const_iterator it = source_ids.begin();
it != source_ids.end(); ++it) {
if (TranslateSourceIdToDeviceId(type,
- request->resource_context,
+ request->salt_callback,
request->security_origin,
*it,
device_id)) {
@@ -793,7 +798,7 @@ void MediaStreamManager::TranslateDeviceIdToSourceId(
if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE ||
request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE) {
device->id = content::GetHMACForMediaDeviceID(
- request->resource_context,
+ request->salt_callback,
request->security_origin,
device->id);
}
@@ -801,7 +806,7 @@ void MediaStreamManager::TranslateDeviceIdToSourceId(
bool MediaStreamManager::TranslateSourceIdToDeviceId(
MediaStreamType stream_type,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
const GURL& security_origin,
const std::string& source_id,
std::string* device_id) const {
@@ -822,7 +827,7 @@ bool MediaStreamManager::TranslateSourceIdToDeviceId(
for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin();
it != cache->devices.end();
++it) {
- if (content::DoesMediaDeviceIDMatchHMAC(rc, security_origin, source_id,
+ if (content::DoesMediaDeviceIDMatchHMAC(sc, security_origin, source_id,
it->device.id)) {
*device_id = it->device.id;
return true;
@@ -1126,7 +1131,7 @@ bool MediaStreamManager::FindExistingRequestedDeviceInfo(
DCHECK(existing_request_state);
std::string source_id = content::GetHMACForMediaDeviceID(
- new_request.resource_context,
+ new_request.salt_callback,
new_request.security_origin,
new_device_info.id);
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h
index 2c9fce4..590d241 100644
--- a/content/browser/renderer_host/media/media_stream_manager.h
+++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -35,6 +35,7 @@
#include "content/common/content_export.h"
#include "content/common/media/media_stream_options.h"
#include "content/public/browser/media_request_state.h"
+#include "content/public/browser/resource_context.h"
namespace base {
class Thread;
@@ -51,7 +52,6 @@ class FakeMediaStreamUIProxy;
class MediaStreamDeviceSettings;
class MediaStreamRequester;
class MediaStreamUIProxy;
-class ResourceContext;
class VideoCaptureManager;
// MediaStreamManager is used to generate and close new media devices, not to
@@ -97,7 +97,7 @@ class CONTENT_EXPORT MediaStreamManager
void GenerateStream(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
int page_request_id,
const StreamOptions& components,
const GURL& security_origin);
@@ -126,12 +126,12 @@ class CONTENT_EXPORT MediaStreamManager
// plug/unplug. The new device lists will be delivered via media observer to
// MediaCaptureDevicesDispatcher.
virtual std::string EnumerateDevices(MediaStreamRequester* requester,
- int render_process_id,
- int render_view_id,
- ResourceContext* rc,
- int page_request_id,
- MediaStreamType type,
- const GURL& security_origin);
+ int render_process_id,
+ int render_view_id,
+ const ResourceContext::SaltCallback& sc,
+ int page_request_id,
+ MediaStreamType type,
+ const GURL& security_origin);
// Open a device identified by |device_id|. |type| must be either
// MEDIA_DEVICE_AUDIO_CAPTURE or MEDIA_DEVICE_VIDEO_CAPTURE.
@@ -139,7 +139,7 @@ class CONTENT_EXPORT MediaStreamManager
void OpenDevice(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
int page_request_id,
const std::string& device_id,
MediaStreamType type,
@@ -309,7 +309,7 @@ class CONTENT_EXPORT MediaStreamManager
// given |source_id|, false if nothing matched it.
bool TranslateSourceIdToDeviceId(
MediaStreamType stream_type,
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& rc,
const GURL& security_origin,
const std::string& source_id,
std::string* device_id) const;
diff --git a/content/browser/renderer_host/media/video_capture_host_unittest.cc b/content/browser/renderer_host/media/video_capture_host_unittest.cc
index 551b0c2..c7ffcd5 100644
--- a/content/browser/renderer_host/media/video_capture_host_unittest.cc
+++ b/content/browser/renderer_host/media/video_capture_host_unittest.cc
@@ -300,7 +300,7 @@ class VideoCaptureHostTest : public testing::Test {
&stream_requester_,
render_process_id,
render_view_id,
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
page_request_id,
MEDIA_DEVICE_VIDEO_CAPTURE,
security_origin);
@@ -326,7 +326,7 @@ class VideoCaptureHostTest : public testing::Test {
&stream_requester_,
render_process_id,
render_view_id,
- browser_context_.GetResourceContext(),
+ browser_context_.GetResourceContext()->GetMediaDeviceIDSalt(),
page_request_id,
devices[0].device.id,
MEDIA_DEVICE_VIDEO_CAPTURE,
diff --git a/content/browser/resource_context_impl.cc b/content/browser/resource_context_impl.cc
index 9561c8d..14115a4 100644
--- a/content/browser/resource_context_impl.cc
+++ b/content/browser/resource_context_impl.cc
@@ -37,6 +37,11 @@ class NonOwningZoomData : public base::SupportsUserData::Data {
HostZoomMap* host_zoom_map_;
};
+// Used by the default implementation of GetMediaDeviceIDSalt, below.
+std::string ReturnEmptySalt() {
+ return std::string();
+}
+
} // namespace
@@ -56,8 +61,8 @@ ResourceContext::~ResourceContext() {
DetachUserDataThread();
}
-std::string ResourceContext::GetMediaDeviceIDSalt() {
- return std::string();
+ResourceContext::SaltCallback ResourceContext::GetMediaDeviceIDSalt() {
+ return base::Bind(&ReturnEmptySalt);
}
scoped_ptr<net::ClientCertStore> ResourceContext::CreateClientCertStore() {
diff --git a/content/public/browser/media_device_id.cc b/content/public/browser/media_device_id.cc
index 24709b2..65ac7e2 100644
--- a/content/public/browser/media_device_id.cc
+++ b/content/public/browser/media_device_id.cc
@@ -6,12 +6,11 @@
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
-#include "content/public/browser/resource_context.h"
#include "crypto/hmac.h"
namespace content {
-std::string GetHMACForMediaDeviceID(ResourceContext* rc,
+std::string GetHMACForMediaDeviceID(const ResourceContext::SaltCallback& sc,
const GURL& security_origin,
const std::string& raw_unique_id) {
DCHECK(security_origin.is_valid());
@@ -19,21 +18,21 @@ std::string GetHMACForMediaDeviceID(ResourceContext* rc,
crypto::HMAC hmac(crypto::HMAC::SHA256);
const size_t digest_length = hmac.DigestLength();
std::vector<uint8> digest(digest_length);
- std::string salt = rc->GetMediaDeviceIDSalt();
+ std::string salt = sc.Run();
bool result = hmac.Init(security_origin.spec()) &&
hmac.Sign(raw_unique_id + salt, &digest[0], digest.size());
DCHECK(result);
return StringToLowerASCII(base::HexEncode(&digest[0], digest.size()));
}
-bool DoesMediaDeviceIDMatchHMAC(ResourceContext* rc,
+bool DoesMediaDeviceIDMatchHMAC(const ResourceContext::SaltCallback& sc,
const GURL& security_origin,
const std::string& device_guid,
const std::string& raw_unique_id) {
DCHECK(security_origin.is_valid());
DCHECK(!raw_unique_id.empty());
std::string guid_from_raw_device_id =
- GetHMACForMediaDeviceID(rc, security_origin, raw_unique_id);
+ GetHMACForMediaDeviceID(sc, security_origin, raw_unique_id);
return guid_from_raw_device_id == device_guid;
}
diff --git a/content/public/browser/media_device_id.h b/content/public/browser/media_device_id.h
index 50a3e0c..e14809c 100644
--- a/content/public/browser/media_device_id.h
+++ b/content/public/browser/media_device_id.h
@@ -13,23 +13,22 @@
#include <string>
#include "content/common/content_export.h"
+#include "content/public/browser/resource_context.h"
#include "url/gurl.h"
namespace content {
-class ResourceContext;
-
// Generates a one-way hash of a device's unique ID usable by one
// particular security origin.
CONTENT_EXPORT std::string GetHMACForMediaDeviceID(
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
const GURL& security_origin,
const std::string& raw_unique_id);
// Convenience method to check if |device_guid| is an HMAC of
// |raw_device_id| for |security_origin|.
CONTENT_EXPORT bool DoesMediaDeviceIDMatchHMAC(
- ResourceContext* rc,
+ const ResourceContext::SaltCallback& sc,
const GURL& security_origin,
const std::string& device_guid,
const std::string& raw_unique_id);
diff --git a/content/public/browser/resource_context.h b/content/public/browser/resource_context.h
index 1308d76..58eb298 100644
--- a/content/public/browser/resource_context.h
+++ b/content/public/browser/resource_context.h
@@ -68,11 +68,29 @@ class CONTENT_EXPORT ResourceContext : public base::SupportsUserData {
// resource metadata.
virtual bool AllowCameraAccess(const GURL& origin) = 0;
- // Returns a random salt string that is used for creating media device IDs.
- // The salt should be stored in the current user profile and should be reset
- // if cookies are cleared. Returns an empty string per default.
- // TODO(perkj): Make this method pure virtual when crbug/315022 is fixed.
- virtual std::string GetMediaDeviceIDSalt();
+ // Returns a callback that can be invoked to get a random salt
+ // string that is used for creating media device IDs. The salt
+ // should be stored in the current user profile and should be reset
+ // if cookies are cleared. The default is an empty string.
+ //
+ // It is safe to hold on to the callback returned and use it without
+ // regard to the lifetime of ResourceContext, although in general
+ // you should not use it long after the profile has been destroyed.
+ //
+ // TODO(joi): We don't think it should be unnecessary to use this
+ // after ResourceContext goes away. There is likely an underying bug
+ // in the lifetime of ProfileIOData vs. ResourceProcessHost, where
+ // sometimes ProfileIOData has gone away before RPH has finished
+ // being torn down (on the IO thread). The current interface that
+ // allows using the salt object after ResourceContext has gone away
+ // was put in place to fix http://crbug.com/341211 but I intend to
+ // try to figure out how the lifetime should be fixed properly. The
+ // original interface was just a method that returns a string.
+ //
+ // TODO(perkj): Make this method pure virtual when crbug/315022 is
+ // fixed.
+ typedef base::Callback<std::string()> SaltCallback;
+ virtual SaltCallback GetMediaDeviceIDSalt();
};
} // namespace content
diff --git a/content/test/webrtc_audio_device_test.cc b/content/test/webrtc_audio_device_test.cc
index f414a82..1f30b68 100644
--- a/content/test/webrtc_audio_device_test.cc
+++ b/content/test/webrtc_audio_device_test.cc
@@ -174,10 +174,6 @@ class MockRTCResourceContext : public ResourceContext {
return false;
}
- virtual std::string GetMediaDeviceIDSalt() OVERRIDE {
- return "";
- }
-
private:
net::URLRequestContext* test_request_context_;