diff options
author | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-17 11:29:59 +0000 |
---|---|---|
committer | joi@chromium.org <joi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-17 11:29:59 +0000 |
commit | ce98b778950f36f6c66c9256ac3699b78ac2b489 (patch) | |
tree | 1ca86c3c36318aaf4912dd20ce3e44837f662b8e | |
parent | 7e750926feb522c987f1657b148b3ba6451d9f60 (diff) | |
download | chromium_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
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_; |