Onion soup AudioDeviceFactory, AudioRendererMixerManager

... and AudioRendererSinkCacheImpl

Most files got moved to blink/renderer/modules/media/audio, but
audio_device_factory.h. This one is used by Pepper and fuchsia code
as well as //chromecast, so it has made it to the Blink public API
at blink/public/web/modules/media/audio/.
The 'Web' prefix will be added in a follow up.

More details:

 1/ AudioRendererMixerManager was a RenderThreadImpl variable, so a
 renderer process level scoped. As part of this CL, DEFINE_STATIC_LOCAL
 was used in the newly added GetInstance() method.
 All references to AudioRendererMixerManager were removed from
 //content.

 2/ AudioRendererSinkCacheImpl::ObserveFrame was instantiated in
 RenderFrameImpl::Initialize. It used to inherit from
 RenderFrameObserver and deleted itself from its OnDestruct() override.
 As part of this CL, it now inherits from Supplement<LocalFrame> and
 get installed by ModulesInitializer::InstallSupplements().
 It also inherits from ExecutionContextLifecycleObserver so its
 existing functionality is kept.

 3/ @audio_renderer_sink_cache_test.cc, base::test::TestEnvironment
 was replaced by base::TestMockTimeTaskRunner.

 4/ blink::Platform::GetHungRendererDelay() was added to supply
 content::kHungRendererDelay.

BUG=787252
R=guidou@chromium.org, haraken@chromium.org
TBR=spang@chromium.org

Change-Id: I3ccfe526632ec5156cc346d6b868287fc45a0a23
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2414551
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Commit-Queue: Antonio Gomes (GMT-4) <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#808960}
diff --git a/chromecast/media/DEPS b/chromecast/media/DEPS
index 4ba981c..4bd50854 100644
--- a/chromecast/media/DEPS
+++ b/chromecast/media/DEPS
@@ -4,7 +4,6 @@
   "+content/public/test/browser_task_environment.h",
   "+content/public/test/test_browser_thread.h",
   "+content/public/test/test_utils.h",
-  "+content/renderer/media/audio/audio_device_factory.h",
   "+media/audio",
   "+media/base",
   "+media/cdm",
@@ -18,6 +17,7 @@
   "+services/service_manager/public",
   "+third_party/blink/public/common/tokens/tokens.h",
   "+third_party/blink/public/platform/audio/web_audio_device_source_type.h",
+  "+third_party/blink/public/web/modules/media/audio/audio_device_factory.h",
   "+third_party/blink/public/web/modules/media/audio/web_audio_output_ipc_factory.h",
   "+third_party/widevine/cdm/buildflags.h",
   "+third_party/widevine/cdm/widevine_cdm_common.h",
diff --git a/chromecast/media/audio/cast_audio_device_factory.cc b/chromecast/media/audio/cast_audio_device_factory.cc
index f8d2bb9..2936865 100644
--- a/chromecast/media/audio/cast_audio_device_factory.cc
+++ b/chromecast/media/audio/cast_audio_device_factory.cc
@@ -91,8 +91,7 @@
   return device;
 }
 
-CastAudioDeviceFactory::CastAudioDeviceFactory()
-    : content::AudioDeviceFactory() {
+CastAudioDeviceFactory::CastAudioDeviceFactory() : blink::AudioDeviceFactory() {
   DVLOG(1) << "Register CastAudioDeviceFactory";
 }
 
diff --git a/chromecast/media/audio/cast_audio_device_factory.h b/chromecast/media/audio/cast_audio_device_factory.h
index 1675bfa..8344d75 100644
--- a/chromecast/media/audio/cast_audio_device_factory.h
+++ b/chromecast/media/audio/cast_audio_device_factory.h
@@ -8,10 +8,10 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "media/audio/audio_sink_parameters.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/platform/audio/web_audio_device_source_type.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 
 namespace media {
 class AudioCapturerSource;
@@ -22,7 +22,7 @@
 namespace chromecast {
 namespace media {
 
-class CastAudioDeviceFactory : public content::AudioDeviceFactory {
+class CastAudioDeviceFactory : public blink::AudioDeviceFactory {
  public:
   CastAudioDeviceFactory();
   ~CastAudioDeviceFactory() final;
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 54f2588..f99ff5c 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -129,12 +129,6 @@
     "media/android/stream_texture_factory.h",
     "media/android/stream_texture_wrapper_impl.cc",
     "media/android/stream_texture_wrapper_impl.h",
-    "media/audio/audio_device_factory.cc",
-    "media/audio/audio_device_factory.h",
-    "media/audio/audio_renderer_mixer_manager.cc",
-    "media/audio/audio_renderer_mixer_manager.h",
-    "media/audio/audio_renderer_sink_cache_impl.cc",
-    "media/audio/audio_renderer_sink_cache_impl.h",
     "media/audio_decoder.cc",
     "media/audio_decoder.h",
     "media/batching_media_log.cc",
diff --git a/content/renderer/media/audio/fuchsia_audio_device_factory.h b/content/renderer/media/audio/fuchsia_audio_device_factory.h
index df5ed13..b2c1d54 100644
--- a/content/renderer/media/audio/fuchsia_audio_device_factory.h
+++ b/content/renderer/media/audio/fuchsia_audio_device_factory.h
@@ -5,12 +5,12 @@
 #ifndef CONTENT_RENDERER_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
 #define CONTENT_RENDERER_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
 
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 
 namespace content {
 
-class FuchsiaAudioDeviceFactory : public AudioDeviceFactory {
+class FuchsiaAudioDeviceFactory : public blink::AudioDeviceFactory {
  public:
   FuchsiaAudioDeviceFactory();
   ~FuchsiaAudioDeviceFactory() final;
diff --git a/content/renderer/media/audio/mock_audio_device_factory.h b/content/renderer/media/audio/mock_audio_device_factory.h
index 0e213bc..19bc40d 100644
--- a/content/renderer/media/audio/mock_audio_device_factory.h
+++ b/content/renderer/media/audio/mock_audio_device_factory.h
@@ -7,11 +7,11 @@
 
 #include <string>
 
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "media/base/audio_capturer_source.h"
 #include "media/base/audio_renderer_sink.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 
 namespace content {
 
@@ -35,7 +35,7 @@
 // Creates one MockCapturerSource instance for unit testing. This replaces the
 // need for unit tests to open a real platform audio output. Instantiating this
 // class sets the global content::AudioDeviceFactory implementation to |this|.
-class MockAudioDeviceFactory : public AudioDeviceFactory {
+class MockAudioDeviceFactory : public blink::AudioDeviceFactory {
  public:
   MockAudioDeviceFactory();
   ~MockAudioDeviceFactory() override;
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
index 4f1a3a8..62e7696 100644
--- a/content/renderer/media/media_factory.cc
+++ b/content/renderer/media/media_factory.cc
@@ -21,7 +21,6 @@
 #include "content/public/common/content_client.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_frame_media_playback_options.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/media/batching_media_log.h"
 #include "content/renderer/media/inspector_media_event_handler.h"
 #include "content/renderer/media/media_interface_factory.h"
@@ -57,6 +56,7 @@
 #include "third_party/blink/public/platform/web_surface_layer_bridge.h"
 #include "third_party/blink/public/platform/web_video_frame_submitter.h"
 #include "third_party/blink/public/web/blink.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "url/origin.h"
@@ -373,7 +373,7 @@
     return nullptr;
 
   scoped_refptr<media::SwitchableAudioRendererSink> audio_renderer_sink =
-      AudioDeviceFactory::NewSwitchableAudioRendererSink(
+      blink::AudioDeviceFactory::NewSwitchableAudioRendererSink(
           blink::WebAudioDeviceSourceType::kMediaElement,
           render_frame_->GetWebFrame()->GetLocalFrameToken(),
           media::AudioSinkParameters(/*session_id=*/base::UnguessableToken(),
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc
index 4b3a687..9328972 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl.cc
+++ b/content/renderer/media/renderer_webaudiodevice_impl.cc
@@ -16,16 +16,17 @@
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_thread_impl.h"
 #include "media/base/audio_timestamp_helper.h"
 #include "media/base/limits.h"
 #include "media/base/silent_sink_suspender.h"
 #include "third_party/blink/public/platform/audio/web_audio_device_source_type.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/public/web/web_view.h"
 
+using blink::AudioDeviceFactory;
 using blink::WebAudioDevice;
 using blink::WebAudioLatencyHint;
 using blink::WebLocalFrame;
diff --git a/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
index 5dd6633b..6092035 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
+++ b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
@@ -9,7 +9,6 @@
 #include "base/test/task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "media/base/audio_capturer_source.h"
 #include "media/base/limits.h"
 #include "media/base/mock_audio_renderer_sink.h"
@@ -17,6 +16,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 
 using testing::_;
 
@@ -63,7 +63,7 @@
 
 class RendererWebAudioDeviceImplTest
     : public blink::WebAudioDevice::RenderCallback,
-      public AudioDeviceFactory,
+      public blink::AudioDeviceFactory,
       public testing::Test {
  protected:
   RendererWebAudioDeviceImplTest() {}
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc
index de5fe546..e1d22677 100644
--- a/content/renderer/pepper/pepper_plugin_instance_impl.cc
+++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -27,7 +27,6 @@
 #include "content/common/frame_messages.h"
 #include "content/public/common/content_constants.h"
 #include "content/public/renderer/content_renderer_client.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/pepper/event_conversion.h"
 #include "content/renderer/pepper/fullscreen_container.h"
 #include "content/renderer/pepper/gfx_conversion.h"
@@ -107,6 +106,7 @@
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/web_url_error.h"
 #include "third_party/blink/public/platform/web_url_request.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/public/web/web_document_loader.h"
 #include "third_party/blink/public/web/web_frame_widget.h"
@@ -2516,7 +2516,7 @@
 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate(
     PP_Instance instance) {
   return render_frame()
-             ? AudioDeviceFactory::GetOutputDeviceInfo(
+             ? blink::AudioDeviceFactory::GetOutputDeviceInfo(
                    render_frame()->GetWebFrame()->GetLocalFrameToken(),
                    media::AudioSinkParameters())
                    .output_params()
@@ -2527,7 +2527,7 @@
 uint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize(
     PP_Instance instance) {
   return render_frame()
-             ? AudioDeviceFactory::GetOutputDeviceInfo(
+             ? blink::AudioDeviceFactory::GetOutputDeviceInfo(
                    render_frame()->GetWebFrame()->GetLocalFrameToken(),
                    media::AudioSinkParameters())
                    .output_params()
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index b1f5e0c4..3f94641e 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -107,8 +107,6 @@
 #include "content/renderer/loader/web_url_loader_impl.h"
 #include "content/renderer/loader/web_url_request_util.h"
 #include "content/renderer/loader/web_worker_fetch_context_impl.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
-#include "content/renderer/media/audio/audio_renderer_sink_cache_impl.h"
 #include "content/renderer/media/media_permission_dispatcher.h"
 #include "content/renderer/mhtml_handle_writer.h"
 #include "content/renderer/mojo/blink_interface_registry_impl.h"
@@ -185,6 +183,7 @@
 #include "third_party/blink/public/platform/web_url_response.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/blink/public/web/blink.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/modules/media/audio/web_audio_output_ipc_factory.h"
 #include "third_party/blink/public/web/modules/media/webmediaplayer_util.h"
 #include "third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h"
@@ -2049,8 +2048,6 @@
                                   GetBrowserInterfaceBroker());
   }
 
-  AudioRendererSinkCacheImpl::ObserveFrame(this);
-
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
   if (command_line.HasSwitch(switches::kDomAutomationController))
@@ -6496,12 +6493,14 @@
       std::move(receiver), GetTaskRunner(blink::TaskType::kInternalDefault));
 }
 
+// TODO(https://crbug.com/787252): Move this method to Blink, and eliminate
+// the plumbing logic through blink::WebLocalFrameClient.
 void RenderFrameImpl::CheckIfAudioSinkExistsAndIsAuthorized(
     const blink::WebString& sink_id,
     blink::WebSetSinkIdCompleteCallback completion_callback) {
   std::move(
       blink::ConvertToOutputDeviceStatusCB(std::move(completion_callback)))
-      .Run(AudioDeviceFactory::GetOutputDeviceInfo(
+      .Run(blink::AudioDeviceFactory::GetOutputDeviceInfo(
                GetWebFrame()->GetLocalFrameToken(),
                media::AudioSinkParameters(base::UnguessableToken(),
                                           sink_id.Utf8()))
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 671d685..9fef15fc 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -77,7 +77,6 @@
 #include "content/renderer/categorized_worker_pool.h"
 #include "content/renderer/effective_connection_type_helper.h"
 #include "content/renderer/loader/resource_dispatcher.h"
-#include "content/renderer/media/audio/audio_renderer_mixer_manager.h"
 #include "content/renderer/media/gpu/gpu_video_accelerator_factories_impl.h"
 #include "content/renderer/media/render_media_client.h"
 #include "content/renderer/net_info_helper.h"
@@ -1249,14 +1248,6 @@
 
 #endif
 
-AudioRendererMixerManager* RenderThreadImpl::GetAudioRendererMixerManager() {
-  if (!audio_renderer_mixer_manager_) {
-    audio_renderer_mixer_manager_ = AudioRendererMixerManager::Create();
-  }
-
-  return audio_renderer_mixer_manager_.get();
-}
-
 base::WaitableEvent* RenderThreadImpl::GetShutdownEvent() {
   return ChildProcess::current()->GetShutDownEvent();
 }
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index 0c3b3d0..9e67e7d 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -100,7 +100,6 @@
 
 namespace content {
 class AgentSchedulingGroup;
-class AudioRendererMixerManager;
 class CategorizedWorkerPool;
 class GpuVideoAcceleratorFactoriesImpl;
 class RenderThreadObserver;
@@ -294,11 +293,6 @@
   scoped_refptr<viz::ContextProviderCommandBuffer>
   SharedMainThreadContextProvider();
 
-  // AudioRendererMixerManager instance which manages renderer side mixer
-  // instances shared based on configured audio parameters.  Lazily created on
-  // first call.
-  AudioRendererMixerManager* GetAudioRendererMixerManager();
-
   class UnfreezableMessageFilter : public IPC::MessageFilter {
    public:
     explicit UnfreezableMessageFilter(RenderThreadImpl* render_thread_impl);
@@ -584,8 +578,6 @@
 
   scoped_refptr<viz::RasterContextProvider> shared_worker_context_provider_;
 
-  std::unique_ptr<AudioRendererMixerManager> audio_renderer_mixer_manager_;
-
   HistogramCustomizer histogram_customizer_;
 
   std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 715de43..da6477c 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -65,7 +65,6 @@
 #include "content/renderer/history_serialization.h"
 #include "content/renderer/internal_document_state_data.h"
 #include "content/renderer/loader/request_extra_data.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_frame_proxy.h"
 #include "content/renderer/render_process.h"
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index dc5b1fd..96a17ee 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -31,6 +31,7 @@
 #include "build/build_config.h"
 #include "components/url_formatter/url_formatter.h"
 #include "content/child/child_process.h"
+#include "content/common/content_constants_internal.h"
 #include "content/common/frame_messages.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
@@ -42,7 +43,6 @@
 #include "content/renderer/loader/child_url_loader_factory_bundle.h"
 #include "content/renderer/loader/resource_dispatcher.h"
 #include "content/renderer/loader/web_url_loader_impl.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/media/audio_decoder.h"
 #include "content/renderer/media/renderer_webaudiodevice_impl.h"
 #include "content/renderer/render_frame_impl.h"
@@ -88,6 +88,7 @@
 #include "third_party/blink/public/platform/web_url_loader_factory.h"
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/sqlite/sqlite3.h"
 #include "ui/base/ui_base_switches.h"
@@ -121,6 +122,7 @@
 
 namespace {
 
+// TODO(https://crbug.com/787252): Move this method and its callers to Blink.
 media::AudioParameters GetAudioHardwareParams() {
   blink::WebLocalFrame* const web_frame =
       blink::WebLocalFrame::FrameForCurrentContext();
@@ -128,7 +130,7 @@
   if (!render_frame)
     return media::AudioParameters::UnavailableDeviceParams();
 
-  return AudioDeviceFactory::GetOutputDeviceInfo(
+  return blink::AudioDeviceFactory::GetOutputDeviceInfo(
              render_frame->GetWebFrame()->GetLocalFrameToken(),
              media::AudioSinkParameters())
       .output_params();
@@ -458,6 +460,10 @@
   return GetAudioHardwareParams().channels();
 }
 
+base::TimeDelta RendererBlinkPlatformImpl::GetHungRendererDelay() {
+  return kHungRendererDelay;
+}
+
 std::unique_ptr<WebAudioDevice> RendererBlinkPlatformImpl::CreateAudioDevice(
     unsigned input_channels,
     unsigned channels,
@@ -490,7 +496,7 @@
 RendererBlinkPlatformImpl::NewAudioCapturerSource(
     blink::WebLocalFrame* web_frame,
     const media::AudioSourceParameters& params) {
-  return AudioDeviceFactory::NewAudioCapturerSource(
+  return blink::AudioDeviceFactory::NewAudioCapturerSource(
       web_frame->GetLocalFrameToken(), params);
 }
 
@@ -524,14 +530,14 @@
     blink::WebAudioDeviceSourceType source_type,
     blink::WebLocalFrame* web_frame,
     const media::AudioSinkParameters& params) {
-  return AudioDeviceFactory::NewAudioRendererSink(
+  return blink::AudioDeviceFactory::NewAudioRendererSink(
       source_type, web_frame->GetLocalFrameToken(), params);
 }
 
 media::AudioLatency::LatencyType
 RendererBlinkPlatformImpl::GetAudioSourceLatencyType(
     blink::WebAudioDeviceSourceType source_type) {
-  return AudioDeviceFactory::GetSourceLatencyType(source_type);
+  return blink::AudioDeviceFactory::GetSourceLatencyType(source_type);
 }
 
 base::Optional<std::string>
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index cfced91..30af7f4 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -121,6 +121,7 @@
   double AudioHardwareSampleRate() override;
   size_t AudioHardwareBufferSize() override;
   unsigned AudioHardwareOutputChannels() override;
+  base::TimeDelta GetHungRendererDelay() override;
 
   std::unique_ptr<blink::WebAudioDevice> CreateAudioDevice(
       unsigned input_channels,
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index f8f88b2..6c2f5a5 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2045,8 +2045,6 @@
     "../renderer/loader/test_request_peer.h",
     "../renderer/loader/url_loader_client_impl_unittest.cc",
     "../renderer/loader/web_url_loader_impl_unittest.cc",
-    "../renderer/media/audio/audio_renderer_mixer_manager_unittest.cc",
-    "../renderer/media/audio/audio_renderer_sink_cache_unittest.cc",
     "../renderer/media/audio/mock_audio_device_factory.cc",
     "../renderer/media/audio/mock_audio_device_factory.h",
     "../renderer/media/batching_media_log_unittest.cc",
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 4366635..121f651 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -277,6 +277,7 @@
     "platform/websocket_handshake_throttle.h",
     "web/blink.h",
     "web/modules/autofill/web_form_element_observer.h",
+    "web/modules/media/audio/audio_device_factory.h",
     "web/modules/media/audio/audio_renderer_sink_cache.h",
     "web/modules/media/audio/web_audio_input_ipc_factory.h",
     "web/modules/media/audio/web_audio_output_ipc_factory.h",
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index abfcd20b..4c05fb9 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -191,6 +191,7 @@
   virtual double AudioHardwareSampleRate() { return 0; }
   virtual size_t AudioHardwareBufferSize() { return 0; }
   virtual unsigned AudioHardwareOutputChannels() { return 0; }
+  virtual base::TimeDelta GetHungRendererDelay() { return base::TimeDelta(); }
 
   // SavableResource ----------------------------------------------------
 
diff --git a/third_party/blink/public/web/modules/media/DEPS b/third_party/blink/public/web/modules/media/DEPS
index 5604de1..105fd89 100644
--- a/third_party/blink/public/web/modules/media/DEPS
+++ b/third_party/blink/public/web/modules/media/DEPS
@@ -1,4 +1,6 @@
 include_rules = [
+    "+media/audio/audio_sink_parameters.h",
+    "+media/audio/audio_source_parameters.h",
     "+media/base/audio_renderer_sink.h",
     "+media/base/eme_constants.h",
     "+media/base/pipeline_status.h",
diff --git a/content/renderer/media/audio/audio_device_factory.h b/third_party/blink/public/web/modules/media/audio/audio_device_factory.h
similarity index 78%
rename from content/renderer/media/audio/audio_device_factory.h
rename to third_party/blink/public/web/modules/media/audio/audio_device_factory.h
index 7b752d9..baa5084 100644
--- a/content/renderer/media/audio/audio_device_factory.h
+++ b/third_party/blink/public/web/modules/media/audio/audio_device_factory.h
@@ -2,21 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
-#define CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
+#define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
 
 #include <string>
 
 #include "base/callback.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "content/common/content_export.h"
+#include "base/memory/scoped_refptr.h"
 #include "media/audio/audio_sink_parameters.h"
 #include "media/audio/audio_source_parameters.h"
 #include "media/base/audio_latency.h"
 #include "media/base/output_device_info.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/platform/audio/web_audio_device_source_type.h"
+#include "third_party/blink/public/platform/web_common.h"
 
 namespace media {
 class AudioRendererSink;
@@ -24,18 +24,20 @@
 class AudioCapturerSource;
 }  // namespace media
 
-namespace content {
+namespace blink {
 
 // A factory for creating AudioRendererSinks and AudioCapturerSources. There is
 // a global factory function that can be installed for the purposes of testing
 // to provide specialized implementations.
 // TODO(olka): rename it, probably split it into AudioRendererSinkFactory and
 // AudioCapturerSourceFactory.
-class CONTENT_EXPORT AudioDeviceFactory {
+//
+// TODO(https://crrev.com/787252): Add a 'Web' prefix to the class name.
+class BLINK_MODULES_EXPORT AudioDeviceFactory {
  public:
   // Maps the source type to the audio latency it requires.
   static media::AudioLatency::LatencyType GetSourceLatencyType(
-      blink::WebAudioDeviceSourceType source);
+      WebAudioDeviceSourceType source);
 
   // Creates a sink for AudioRendererMixer. |frame_token| refers to the
   // RenderFrame containing the entity producing the audio. Note: These sinks do
@@ -43,7 +45,7 @@
   // required to use the GetOutputDeviceInfoAsync() API. As such they are
   // configured with no authorization timeout value.
   static scoped_refptr<media::AudioRendererSink> NewAudioRendererMixerSink(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params);
 
   // Creates an AudioRendererSink bound to an AudioOutputDevice.
@@ -52,29 +54,29 @@
   // TODO(olka): merge it with NewRestartableOutputDevice() as soon as
   // AudioOutputDevice is fixed to be restartable.
   static scoped_refptr<media::AudioRendererSink> NewAudioRendererSink(
-      blink::WebAudioDeviceSourceType source_type,
-      const blink::LocalFrameToken& frame_token,
+      WebAudioDeviceSourceType source_type,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params);
 
   // Creates a SwitchableAudioRendererSink bound to an AudioOutputDevice
   // Basing on |source_type| and build configuration, audio played out through
   // the sink goes to AOD directly or can be mixed with other audio before that.
   static scoped_refptr<media::SwitchableAudioRendererSink>
-  NewSwitchableAudioRendererSink(blink::WebAudioDeviceSourceType source_type,
-                                 const blink::LocalFrameToken& frame_token,
+  NewSwitchableAudioRendererSink(WebAudioDeviceSourceType source_type,
+                                 const LocalFrameToken& frame_token,
                                  const media::AudioSinkParameters& params);
 
   // A helper to get device info in the absence of AudioOutputDevice.
   // Must be called on renderer thread only.
   static media::OutputDeviceInfo GetOutputDeviceInfo(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params);
 
   // Creates an AudioCapturerSource using the currently registered factory.
   // |frame_token| refers to the RenderFrame containing the entity
   // consuming the audio.
   static scoped_refptr<media::AudioCapturerSource> NewAudioCapturerSource(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSourceParameters& params);
 
  protected:
@@ -90,23 +92,23 @@
   // output device. |auth_timeout| is the authorization timeout allowed for the
   // underlying AudioOutputDevice instance; a timeout of zero means no timeout.
   virtual scoped_refptr<media::AudioRendererSink> CreateFinalAudioRendererSink(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params,
       base::TimeDelta auth_timeout) = 0;
 
   virtual scoped_refptr<media::AudioRendererSink> CreateAudioRendererSink(
-      blink::WebAudioDeviceSourceType source_type,
-      const blink::LocalFrameToken& frame_token,
+      WebAudioDeviceSourceType source_type,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params) = 0;
 
   virtual scoped_refptr<media::SwitchableAudioRendererSink>
   CreateSwitchableAudioRendererSink(
-      blink::WebAudioDeviceSourceType source_type,
-      const blink::LocalFrameToken& frame_token,
+      WebAudioDeviceSourceType source_type,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params) = 0;
 
   virtual scoped_refptr<media::AudioCapturerSource> CreateAudioCapturerSource(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSourceParameters& params) = 0;
 
  private:
@@ -115,13 +117,13 @@
   static AudioDeviceFactory* factory_;
 
   static scoped_refptr<media::AudioRendererSink> NewFinalAudioRendererSink(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params,
       base::TimeDelta auth_timeout);
 
   DISALLOW_COPY_AND_ASSIGN(AudioDeviceFactory);
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_AUDIO_DEVICE_FACTORY_H_
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 244cbcf..5046242 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -325,6 +325,8 @@
     "manifest/manifest_manager_unittest.cc",
     "manifest/manifest_parser_unittest.cc",
     "manifest/manifest_type_converters_unittest.cc",
+    "media/audio/audio_renderer_mixer_manager_test.cc",
+    "media/audio/audio_renderer_sink_cache_test.cc",
     "media/audio/mojo_audio_input_ipc_test.cc",
     "media/audio/mojo_audio_output_ipc_test.cc",
     "media/audio/web_audio_output_ipc_factory_test.cc",
diff --git a/third_party/blink/renderer/modules/media/BUILD.gn b/third_party/blink/renderer/modules/media/BUILD.gn
index 5751044..ebfa34c4 100644
--- a/third_party/blink/renderer/modules/media/BUILD.gn
+++ b/third_party/blink/renderer/modules/media/BUILD.gn
@@ -6,6 +6,11 @@
 
 blink_modules_sources("media") {
   sources = [
+    "audio/audio_device_factory.cc",
+    "audio/audio_renderer_mixer_manager.cc",
+    "audio/audio_renderer_mixer_manager.h",
+    "audio/audio_renderer_sink_cache_impl.cc",
+    "audio/audio_renderer_sink_cache_impl.h",
     "audio/mojo_audio_input_ipc.cc",
     "audio/mojo_audio_input_ipc.h",
     "audio/mojo_audio_output_ipc.cc",
diff --git a/third_party/blink/renderer/modules/media/audio/DEPS b/third_party/blink/renderer/modules/media/audio/DEPS
index 81d44df..00a272cf 100644
--- a/third_party/blink/renderer/modules/media/audio/DEPS
+++ b/third_party/blink/renderer/modules/media/audio/DEPS
@@ -1,7 +1,16 @@
 include_rules = [
+    "+base/unguessable_token.h",
+    "+base/threading/platform_thread.h",
     "+media/audio",
-    "+media/base/audio_parameters.h",
+    "+media/base",
     "+media/mojo",
+
+    # TODO(https://crbug.com/787252): Replace this use by a Blink singleton
+    # construction.
+    "+base/no_destructor.h",
+
+    # TODO(https://crbug.com/787252): Replace the use by WTF::HashMap.
+    "+base/containers/flat_map.h",
 ]
 
 specific_include_rules = {
@@ -10,6 +19,7 @@
         "+base/run_loop.h",
         "+base/test/bind_test_util.h",
         "+base/test/gtest_util.h",
+        "+base/test/test_mock_time_task_runner.h",
         "+base/threading/thread.h",
     ],
 }
diff --git a/content/renderer/media/audio/audio_device_factory.cc b/third_party/blink/renderer/modules/media/audio/audio_device_factory.cc
similarity index 88%
rename from content/renderer/media/audio/audio_device_factory.cc
rename to third_party/blink/renderer/modules/media/audio/audio_device_factory.cc
index 24321a5..b910b91 100644
--- a/content/renderer/media/audio/audio_device_factory.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_device_factory.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/audio/audio_device_factory.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 
 #include <algorithm>
 
@@ -15,20 +15,17 @@
 #include "base/task/thread_pool.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
-#include "content/common/content_constants_internal.h"
-#include "content/renderer/media/audio/audio_renderer_mixer_manager.h"
-#include "content/renderer/media/audio/audio_renderer_sink_cache_impl.h"
-#include "content/renderer/render_frame_impl.h"
-#include "content/renderer/render_thread_impl.h"
 #include "media/audio/audio_input_device.h"
 #include "media/audio/audio_output_device.h"
 #include "media/base/audio_renderer_mixer_input.h"
-#include "media/base/media_switches.h"
-#include "third_party/blink/public/mojom/media/renderer_audio_input_stream_factory.mojom.h"
+#include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/modules/media/audio/web_audio_input_ipc_factory.h"
 #include "third_party/blink/public/web/modules/media/audio/web_audio_output_ipc_factory.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h"
+#include "third_party/blink/renderer/platform/wtf/wtf.h"
 
-namespace content {
+namespace blink {
 
 // static
 AudioDeviceFactory* AudioDeviceFactory::factory_ = nullptr;
@@ -51,7 +48,8 @@
 base::TimeDelta GetDefaultAuthTimeout() {
   // Set authorization request timeout at 80% of renderer hung timeout,
   // but no more than kMaxAuthorizationTimeout.
-  return std::min(kHungRendererDelay * 8 / 10, kMaxAuthorizationTimeout);
+  return std::min(Platform::Current()->GetHungRendererDelay() * 8 / 10,
+                  kMaxAuthorizationTimeout);
 }
 
 scoped_refptr<media::AudioOutputDevice> NewOutputDevice(
@@ -79,11 +77,9 @@
     blink::WebAudioDeviceSourceType source_type,
     const blink::LocalFrameToken& frame_token,
     const media::AudioSinkParameters& params) {
-  RenderThreadImpl* render_thread = RenderThreadImpl::current();
-  DCHECK(render_thread) << "RenderThreadImpl is not instantiated, or "
-                        << "GetOutputDeviceInfo() is called on a wrong thread ";
+  DCHECK(IsMainThread()) << __func__ << "() is called on a wrong thread.";
   DCHECK(!params.processing_id.has_value());
-  return render_thread->GetAudioRendererMixerManager()->CreateInput(
+  return AudioRendererMixerManager::GetInstance().CreateInput(
       frame_token, params.session_id, params.device_id,
       AudioDeviceFactory::GetSourceLatencyType(source_type));
 }
@@ -192,14 +188,14 @@
 media::OutputDeviceInfo AudioDeviceFactory::GetOutputDeviceInfo(
     const blink::LocalFrameToken& frame_token,
     const media::AudioSinkParameters& params) {
-  DCHECK(RenderThreadImpl::current())
-      << "RenderThreadImpl is not instantiated, or "
-      << "GetOutputDeviceInfo() is called on a wrong thread ";
-
+  DCHECK(IsMainThread()) << __func__ << "() is called on a wrong thread.";
   constexpr base::TimeDelta kDeleteTimeout =
       base::TimeDelta::FromMilliseconds(5000);
 
   // There's one process wide instance that lives on the render thread.
+  //
+  // TODO(crbug.com/787252): Replace the use of base::ThreadPool below by
+  // worker_pool::PostTask().
   static base::NoDestructor<AudioRendererSinkCacheImpl> cache(
       base::ThreadPool::CreateSequencedTaskRunner(
           {base::TaskPriority::BEST_EFFORT,
@@ -236,4 +232,4 @@
   return NewOutputDevice(frame_token, params, auth_timeout);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/media/audio/audio_renderer_mixer_manager.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
similarity index 94%
rename from content/renderer/media/audio/audio_renderer_mixer_manager.cc
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
index c905d5b..491f09c 100644
--- a/content/renderer/media/audio/audio_renderer_mixer_manager.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/audio/audio_renderer_mixer_manager.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h"
 
 #include <algorithm>
 #include <limits>
@@ -16,10 +16,11 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "build/build_config.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/audio_renderer_mixer.h"
 #include "media/base/audio_renderer_mixer_input.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
+#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
 namespace {
 
@@ -102,7 +103,7 @@
 
 }  // namespace
 
-namespace content {
+namespace blink {
 
 AudioRendererMixerManager::AudioRendererMixerManager(
     CreateSinkCB create_sink_cb)
@@ -117,9 +118,11 @@
 }
 
 // static
-std::unique_ptr<AudioRendererMixerManager> AudioRendererMixerManager::Create() {
-  return base::WrapUnique(new AudioRendererMixerManager(
-      base::BindRepeating(&AudioDeviceFactory::NewAudioRendererMixerSink)));
+AudioRendererMixerManager& AudioRendererMixerManager::GetInstance() {
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(
+      AudioRendererMixerManager, instance,
+      (base::BindRepeating(&AudioDeviceFactory::NewAudioRendererMixerSink)));
+  return instance;
 }
 
 scoped_refptr<media::AudioRendererMixerInput>
@@ -244,4 +247,4 @@
 
 AudioRendererMixerManager::MixerKey::~MixerKey() = default;
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/media/audio/audio_renderer_mixer_manager.h b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h
similarity index 89%
rename from content/renderer/media/audio/audio_renderer_mixer_manager.h
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h
index 076ea10..fe3a7388 100644
--- a/content/renderer/media/audio/audio_renderer_mixer_manager.h
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
-#define CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
 
 #include <bitset>
 #include <map>
@@ -14,7 +14,6 @@
 #include "base/macros.h"
 #include "base/synchronization/lock.h"
 #include "base/unguessable_token.h"
-#include "content/common/content_export.h"
 #include "media/audio/audio_device_description.h"
 #include "media/audio/audio_sink_parameters.h"
 #include "media/base/audio_latency.h"
@@ -22,14 +21,15 @@
 #include "media/base/audio_renderer_mixer_pool.h"
 #include "media/base/output_device_info.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/platform/web_common.h"
 
 namespace media {
 class AudioRendererMixer;
 class AudioRendererMixerInput;
 class AudioRendererSink;
-}
+}  // namespace media
 
-namespace content {
+namespace blink {
 
 // Manages sharing of an AudioRendererMixer among AudioRendererMixerInputs based
 // on their AudioParameters configuration.  Inputs with the same AudioParameters
@@ -40,12 +40,15 @@
 //
 // There should only be one instance of AudioRendererMixerManager per render
 // thread.
-class CONTENT_EXPORT AudioRendererMixerManager
+class BLINK_MODULES_EXPORT AudioRendererMixerManager
     : public media::AudioRendererMixerPool {
  public:
   ~AudioRendererMixerManager() final;
 
-  static std::unique_ptr<AudioRendererMixerManager> Create();
+  // AudioRendererMixerManager instance which manages renderer side mixer
+  // instances shared based on configured audio parameters. Lazily created on
+  // first call.
+  static AudioRendererMixerManager& GetInstance();
 
   // Creates an AudioRendererMixerInput with the proper callbacks necessary to
   // retrieve an AudioRendererMixer instance from AudioRendererMixerManager.
@@ -66,7 +69,7 @@
   void ReturnMixer(media::AudioRendererMixer* mixer) final;
 
   // media::AudioRendererMixerPool look-alikes, with strongly typed tokens.
-  // Clients in content/ should use these functions.
+  // Clients in blink/ should use these functions.
   media::AudioRendererMixer* GetMixer(
       const blink::LocalFrameToken& source_frame_token,
       const media::AudioParameters& input_params,
@@ -92,7 +95,7 @@
 
   // media::AudioRendererMixerPool implementation. This interface faces
   // code in media/ which uses untyped tokens, and is kept private so that
-  // content/ clients prefer to use the strongly-typed-token variants.
+  // blink/ clients prefer to use the strongly-typed-token variants.
   media::AudioRendererMixer* GetMixer(
       const base::UnguessableToken& source_frame_token,
       const media::AudioParameters& input_params,
@@ -173,6 +176,6 @@
   DISALLOW_COPY_AND_ASSIGN(AudioRendererMixerManager);
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_MIXER_MANAGER_H_
diff --git a/content/renderer/media/audio/audio_renderer_mixer_manager_unittest.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager_test.cc
similarity index 95%
rename from content/renderer/media/audio/audio_renderer_mixer_manager_unittest.cc
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager_test.cc
index c26fe50..8cbbd2b 100644
--- a/content/renderer/media/audio/audio_renderer_mixer_manager_unittest.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager_test.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/audio/audio_renderer_mixer_manager.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_mixer_manager.h"
 
 #include <memory>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/notreached.h"
-#include "base/test/task_environment.h"
+#include "base/run_loop.h"
 #include "build/build_config.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/audio_parameters.h"
@@ -22,7 +22,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace content {
+namespace blink {
 
 namespace {
 const int kSampleRate = 48000;
@@ -37,8 +37,8 @@
 const char kMatchedDeviceId[] = "matched-device-id";
 const char kNonexistentDeviceId[] = "nonexistent-device-id";
 
-const blink::LocalFrameToken kFrameToken;
-const blink::LocalFrameToken kAnotherFrameToken;
+const LocalFrameToken kFrameToken;
+const LocalFrameToken kAnotherFrameToken;
 }  // namespace
 
 using media::AudioLatency;
@@ -74,12 +74,11 @@
   }
 
   enum class SinkUseState { kExistingSink, kNewSink };
-  media::AudioRendererMixer* GetMixer(
-      const blink::LocalFrameToken& source_frame_token,
-      const media::AudioParameters& params,
-      AudioLatency::LatencyType latency,
-      const std::string& device_id,
-      SinkUseState sink_state) {
+  media::AudioRendererMixer* GetMixer(const LocalFrameToken& source_frame_token,
+                                      const media::AudioParameters& params,
+                                      AudioLatency::LatencyType latency,
+                                      const std::string& device_id,
+                                      SinkUseState sink_state) {
     auto sink = GetSink(
         source_frame_token,
         media::AudioSinkParameters(base::UnguessableToken(), device_id));
@@ -95,7 +94,7 @@
   }
 
   scoped_refptr<media::AudioRendererMixerInput> CreateInputHelper(
-      const blink::LocalFrameToken& source_frame_token,
+      const LocalFrameToken& source_frame_token,
       const base::UnguessableToken& session_id,
       const std::string& device_id,
       media::AudioLatency::LatencyType latency,
@@ -105,7 +104,7 @@
                                        device_id, latency);
     input->GetOutputDeviceInfoAsync(
         base::DoNothing());  // Primes input, needed for tests.
-    task_env_.RunUntilIdle();
+    base::RunLoop().RunUntilIdle();
     input->Initialize(params, callback);
     return input;
   }
@@ -115,7 +114,7 @@
 
  protected:
   scoped_refptr<media::MockAudioRendererSink> GetSink(
-      const blink::LocalFrameToken& source_frame_token,
+      const LocalFrameToken& source_frame_token,
       const media::AudioSinkParameters& params) {
     if ((params.device_id == kDefaultDeviceId) ||
         (params.device_id == kAnotherDeviceId)) {
@@ -138,13 +137,12 @@
     return nullptr;
   }
 
-  base::test::TaskEnvironment task_env_;
   std::unique_ptr<AudioRendererMixerManager> manager_;
   scoped_refptr<media::MockAudioRendererSink> mock_sink_;
 
  private:
   scoped_refptr<media::AudioRendererSink> GetPlainSink(
-      const blink::LocalFrameToken& source_frame_token,
+      const LocalFrameToken& source_frame_token,
       const media::AudioSinkParameters& params) {
     return GetSink(source_frame_token, params);
   }
@@ -202,9 +200,7 @@
   EXPECT_EQ(mixer_count(), 0);
 
   media::AudioParameters params1(AudioParameters::AUDIO_PCM_LINEAR,
-                                 kChannelLayout,
-                                 kSampleRate,
-                                 kBufferSize);
+                                 kChannelLayout, kSampleRate, kBufferSize);
   media::AudioRendererMixer* mixer1 =
       GetMixer(kFrameToken, params1, AudioLatency::LATENCY_PLAYBACK,
                kDefaultDeviceId, SinkUseState::kNewSink);
@@ -214,8 +210,7 @@
   // Different sample rates, formats, bit depths, and buffer sizes should not
   // result in a different mixer.
   media::AudioParameters params2(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                 kChannelLayout,
-                                 kSampleRate * 2,
+                                 kChannelLayout, kSampleRate * 2,
                                  kBufferSize * 2);
   media::AudioRendererMixer* mixer2 =
       GetMixer(kFrameToken, params2, AudioLatency::LATENCY_PLAYBACK,
@@ -227,8 +222,7 @@
 
   // Modify some parameters that do matter: channel layout
   media::AudioParameters params3(AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                 kAnotherChannelLayout,
-                                 kSampleRate,
+                                 kAnotherChannelLayout, kSampleRate,
                                  kBufferSize);
   ASSERT_NE(params3.channel_layout(), params1.channel_layout());
   media::AudioRendererMixer* mixer3 =
@@ -789,4 +783,4 @@
   ReturnMixer(mixer);
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.cc
similarity index 81%
rename from content/renderer/media/audio/audio_renderer_sink_cache_impl.cc
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.cc
index 15d1eb3..4e752ca 100644
--- a/content/renderer/media/audio/audio_renderer_sink_cache_impl.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/audio/audio_renderer_sink_cache_impl.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h"
 
 #include <algorithm>
 #include <memory>
@@ -16,47 +16,62 @@
 #include "base/synchronization/lock.h"
 #include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_frame_observer.h"
-#include "content/renderer/media/audio/audio_device_factory.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/audio_renderer_sink.h"
+#include "third_party/blink/public/web/modules/media/audio/audio_device_factory.h"
 #include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/platform/supplementable.h"
 
-namespace content {
+namespace blink {
 
 AudioRendererSinkCacheImpl* AudioRendererSinkCacheImpl::instance_ = nullptr;
 
-class AudioRendererSinkCacheImpl::FrameObserver : public RenderFrameObserver {
+class AudioRendererSinkCacheImpl::FrameObserver final
+    : public GarbageCollected<AudioRendererSinkCacheImpl::FrameObserver>,
+      public Supplement<LocalFrame>,
+      public ExecutionContextLifecycleObserver {
  public:
-  explicit FrameObserver(content::RenderFrame* render_frame)
-      : RenderFrameObserver(render_frame) {}
-  ~FrameObserver() override {}
+  static const char kSupplementName[];
+  static FrameObserver* From(LocalFrame& frame) {
+    return Supplement<LocalFrame>::From<FrameObserver>(frame);
+  }
+
+  explicit FrameObserver(LocalFrame& frame)
+      : Supplement<LocalFrame>(frame),
+        ExecutionContextLifecycleObserver(frame.DomWindow()) {}
+  ~FrameObserver() { DCHECK(dropped_frame_cached_); }
+
+  void Trace(Visitor* visitor) const final {
+    Supplement<LocalFrame>::Trace(visitor);
+    ExecutionContextLifecycleObserver::Trace(visitor);
+  }
+
+  // ExecutionContextLifecycleObserver implementation.
+  void ContextDestroyed() override { DropFrameCache(); }
 
  private:
-  // content::RenderFrameObserver implementation:
-  void DidCommitProvisionalLoad(ui::PageTransition transition) override {
-    DropFrameCache();
-  }
-
-  void OnDestruct() override {
-    DropFrameCache();
-    delete this;
-  }
-
   void DropFrameCache() {
+    dropped_frame_cached_ = true;
+
     if (!AudioRendererSinkCacheImpl::instance_)
       return;
-    if (!render_frame())
+    if (!GetSupplementable())
       return;
-    blink::LocalFrameToken frame_token =
-        render_frame()->GetWebFrame()->GetLocalFrameToken();
+
+    LocalFrameToken frame_token = GetSupplementable()->GetLocalFrameToken();
     AudioRendererSinkCacheImpl::instance_->DropSinksForFrame(frame_token);
   }
 
+  bool dropped_frame_cached_ = false;
   DISALLOW_COPY_AND_ASSIGN(FrameObserver);
 };
 
+const char AudioRendererSinkCacheImpl::FrameObserver::kSupplementName[] =
+    "AudioRendererSinkCacheImpl::FrameObserver";
+
 namespace {
 
 enum GetOutputDeviceInfoCacheUtilization {
@@ -83,15 +98,19 @@
 
 // Cached sink data.
 struct AudioRendererSinkCacheImpl::CacheEntry {
-  blink::LocalFrameToken source_frame_token;
+  LocalFrameToken source_frame_token;
   std::string device_id;
   scoped_refptr<media::AudioRendererSink> sink;  // Sink instance
   bool used;                                     // True if in use by a client.
 };
 
 // static
-void AudioRendererSinkCacheImpl::ObserveFrame(RenderFrame* frame) {
-  new AudioRendererSinkCacheImpl::FrameObserver(frame);
+void AudioRendererSinkCacheImpl::InstallFrameObserver(LocalFrame& frame) {
+  if (AudioRendererSinkCacheImpl::FrameObserver::From(frame))
+    return;
+  Supplement<LocalFrame>::ProvideTo(
+      frame,
+      MakeGarbageCollected<AudioRendererSinkCacheImpl::FrameObserver>(frame));
 }
 
 AudioRendererSinkCacheImpl::AudioRendererSinkCacheImpl(
@@ -107,8 +126,8 @@
 
 AudioRendererSinkCacheImpl::~AudioRendererSinkCacheImpl() {
   // We just release all the cached sinks here. Stop them first.
-  // We can stop all the sinks, no matter they are used or not, since everything
-  // is being destroyed anyways.
+  // We can stop all the sinks, no matter they are used or not, since
+  // everything is being destroyed anyways.
   for (auto& entry : cache_)
     entry.sink->Stop();
 
@@ -117,7 +136,7 @@
 }
 
 media::OutputDeviceInfo AudioRendererSinkCacheImpl::GetSinkInfo(
-    const blink::LocalFrameToken& source_frame_token,
+    const LocalFrameToken& source_frame_token,
     const base::UnguessableToken& session_id,
     const std::string& device_id) {
   TRACE_EVENT_BEGIN2("audio", "AudioRendererSinkCacheImpl::GetSinkInfo",
@@ -171,13 +190,13 @@
 
   TRACE_EVENT_END1("audio", "AudioRendererSinkCacheImpl::GetSinkInfo", "result",
                    "Cache miss");
-  // |sink| is ref-counted, so it's ok if it is removed from cache before we get
-  // here.
+  // |sink| is ref-counted, so it's ok if it is removed from cache before we
+  // get here.
   return sink->GetOutputDeviceInfo();
 }
 
 scoped_refptr<media::AudioRendererSink> AudioRendererSinkCacheImpl::GetSink(
-    const blink::LocalFrameToken& source_frame_token,
+    const LocalFrameToken& source_frame_token,
     const std::string& device_id) {
   UMA_HISTOGRAM_BOOLEAN("Media.Audio.Render.SinkCache.UsedForSinkCreation",
                         true);
@@ -285,7 +304,7 @@
 
 AudioRendererSinkCacheImpl::CacheContainer::iterator
 AudioRendererSinkCacheImpl::FindCacheEntry_Locked(
-    const blink::LocalFrameToken& source_frame_token,
+    const LocalFrameToken& source_frame_token,
     const std::string& device_id,
     bool unused_only) {
   return std::find_if(
@@ -297,8 +316,8 @@
           return false;
         if (media::AudioDeviceDescription::IsDefaultDevice(device_id) &&
             media::AudioDeviceDescription::IsDefaultDevice(val.device_id)) {
-          // Both device IDs represent the same default device => do not compare
-          // them;
+          // Both device IDs represent the same default device => do not
+          // compare them;
           return true;
         }
         return val.device_id == device_id;
@@ -306,7 +325,7 @@
 }
 
 void AudioRendererSinkCacheImpl::CacheOrStopUnusedSink(
-    const blink::LocalFrameToken& source_frame_token,
+    const LocalFrameToken& source_frame_token,
     const std::string& device_id,
     scoped_refptr<media::AudioRendererSink> sink) {
   if (!SinkIsHealthy(sink.get())) {
@@ -329,7 +348,7 @@
 }
 
 void AudioRendererSinkCacheImpl::DropSinksForFrame(
-    const blink::LocalFrameToken& source_frame_token) {
+    const LocalFrameToken& source_frame_token) {
   base::AutoLock auto_lock(cache_lock_);
   base::EraseIf(cache_, [source_frame_token](const CacheEntry& val) {
     if (val.source_frame_token == source_frame_token) {
@@ -340,8 +359,8 @@
   });
 }
 
-int AudioRendererSinkCacheImpl::GetCacheSizeForTesting() {
+size_t AudioRendererSinkCacheImpl::GetCacheSizeForTesting() {
   return cache_.size();
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/content/renderer/media/audio/audio_renderer_sink_cache_impl.h b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h
similarity index 74%
rename from content/renderer/media/audio/audio_renderer_sink_cache_impl.h
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h
index f2ba401..38ee44a6 100644
--- a/content/renderer/media/audio/audio_renderer_sink_cache_impl.h
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
-#define CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
 
 #include "third_party/blink/public/web/modules/media/audio/audio_renderer_sink_cache.h"
 
@@ -14,33 +14,29 @@
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
-#include "content/common/content_export.h"
 #include "media/audio/audio_sink_parameters.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/renderer/modules/modules_export.h"
 
-namespace content {
+namespace blink {
 
-class RenderFrame;
+class LocalFrame;
 
 // AudioRendererSinkCache implementation.
-class CONTENT_EXPORT AudioRendererSinkCacheImpl
-    : public blink::AudioRendererSinkCache {
+class MODULES_EXPORT AudioRendererSinkCacheImpl
+    : public AudioRendererSinkCache {
  public:
   class FrameObserver;
 
   // Callback to be used for AudioRendererSink creation
   using CreateSinkCallback =
       base::RepeatingCallback<scoped_refptr<media::AudioRendererSink>(
-          const blink::LocalFrameToken& frame_token,
+          const LocalFrameToken& frame_token,
           const media::AudioSinkParameters& params)>;
 
   // If called, the cache will drop sinks belonging to the specified frame on
   // navigation.
-  //
-  // TODO(https://crbug.com/787252): Move the declaration back to
-  // AudioRendererSinkCache when this header moves to
-  // blink/renderer/modules/media/audio.
-  static void ObserveFrame(RenderFrame* frame);
+  static void InstallFrameObserver(LocalFrame& frame);
 
   // |cleanup_task_runner| will be used to delete sinks when they are unused,
   // AudioRendererSinkCacheImpl must outlive any tasks posted to it. Since
@@ -53,12 +49,11 @@
   ~AudioRendererSinkCacheImpl() final;
 
   // AudioRendererSinkCache implementation:
-  media::OutputDeviceInfo GetSinkInfo(
-      const blink::LocalFrameToken& source_frame_token,
-      const base::UnguessableToken& session_id,
-      const std::string& device_id) final;
+  media::OutputDeviceInfo GetSinkInfo(const LocalFrameToken& source_frame_token,
+                                      const base::UnguessableToken& session_id,
+                                      const std::string& device_id) final;
   scoped_refptr<media::AudioRendererSink> GetSink(
-      const blink::LocalFrameToken& source_frame_token,
+      const LocalFrameToken& source_frame_token,
       const std::string& device_id) final;
   void ReleaseSink(const media::AudioRendererSink* sink_ptr) final;
 
@@ -81,18 +76,18 @@
                   bool force_delete_used);
 
   CacheContainer::iterator FindCacheEntry_Locked(
-      const blink::LocalFrameToken& source_frame_token,
+      const LocalFrameToken& source_frame_token,
       const std::string& device_id,
       bool unused_only);
 
-  void CacheOrStopUnusedSink(const blink::LocalFrameToken& source_frame_token,
+  void CacheOrStopUnusedSink(const LocalFrameToken& source_frame_token,
                              const std::string& device_id,
                              scoped_refptr<media::AudioRendererSink> sink);
 
-  void DropSinksForFrame(const blink::LocalFrameToken& source_frame_token);
+  void DropSinksForFrame(const LocalFrameToken& source_frame_token);
 
   // To avoid publishing CacheEntry structure in the header.
-  int GetCacheSizeForTesting();
+  size_t GetCacheSizeForTesting();
 
   // Global instance, set in constructor and unset in destructor.
   static AudioRendererSinkCacheImpl* instance_;
@@ -118,6 +113,6 @@
   DISALLOW_COPY_AND_ASSIGN(AudioRendererSinkCacheImpl);
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIA_AUDIO_AUDIO_RENDERER_SINK_CACHE_IMPL_H_
diff --git a/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_test.cc
similarity index 88%
rename from content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc
rename to third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_test.cc
index 58289b6e..7220d31 100644
--- a/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc
+++ b/third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_test.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/audio/audio_renderer_sink_cache_impl.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h"
 
 #include <utility>
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/check.h"
-#include "base/test/task_environment.h"
+#include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/thread.h"
 #include "media/audio/audio_device_description.h"
 #include "media/base/audio_parameters.h"
@@ -17,14 +17,14 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace content {
+namespace blink {
 
 namespace {
 const char* const kDefaultDeviceId =
     media::AudioDeviceDescription::kDefaultDeviceId;
 const char kAnotherDeviceId[] = "another-device-id";
 const char kUnhealthyDeviceId[] = "i-am-sick";
-const blink::LocalFrameToken kFrameToken;
+const LocalFrameToken kFrameToken;
 constexpr base::TimeDelta kDeleteTimeout =
     base::TimeDelta::FromMilliseconds(500);
 }  // namespace
@@ -32,18 +32,22 @@
 class AudioRendererSinkCacheTest : public testing::Test {
  public:
   AudioRendererSinkCacheTest()
-      : task_env_(base::test::TaskEnvironment::TimeSource::MOCK_TIME,
-                  base::test::TaskEnvironment::ThreadPoolExecutionMode::QUEUED),
+      : task_runner_(base::MakeRefCounted<base::TestMockTimeTaskRunner>(
+            base::Time::Now(),
+            base::TimeTicks::Now())),
+        task_runner_context_(
+            std::make_unique<base::TestMockTimeTaskRunner::ScopedContext>(
+                task_runner_)),
         cache_(std::make_unique<AudioRendererSinkCacheImpl>(
-            task_env_.GetMainThreadTaskRunner(),
+            task_runner_,
             base::BindRepeating(&AudioRendererSinkCacheTest::CreateSink,
                                 base::Unretained(this)),
             kDeleteTimeout)) {}
   ~AudioRendererSinkCacheTest() override {
-    task_env_.FastForwardUntilNoTasksRemain();
+    task_runner_->FastForwardUntilNoTasksRemain();
   }
 
-  void GetSink(const blink::LocalFrameToken& frame_token,
+  void GetSink(const LocalFrameToken& frame_token,
                const std::string& device_id,
                media::AudioRendererSink** sink) {
     *sink = cache_->GetSink(frame_token, device_id).get();
@@ -51,17 +55,17 @@
 
  protected:
   int sink_count() {
-    DCHECK(task_env_.GetMainThreadTaskRunner()->BelongsToCurrentThread());
+    DCHECK(task_runner_->BelongsToCurrentThread());
     return cache_->GetCacheSizeForTesting();
   }
 
   scoped_refptr<media::AudioRendererSink> CreateSink(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params) {
     return new testing::NiceMock<media::MockAudioRendererSink>(
         params.device_id, (params.device_id == kUnhealthyDeviceId)
-                       ? media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL
-                       : media::OUTPUT_DEVICE_STATUS_OK);
+                              ? media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL
+                              : media::OUTPUT_DEVICE_STATUS_OK);
   }
 
   void ExpectNotToStop(media::AudioRendererSink* sink) {
@@ -85,11 +89,16 @@
     e.Wait();
   }
 
-  void DropSinksForFrame(const blink::LocalFrameToken& frame_token) {
+  void DropSinksForFrame(const LocalFrameToken& frame_token) {
     cache_->DropSinksForFrame(frame_token);
   }
 
-  base::test::TaskEnvironment task_env_;
+  scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
+  // Ensure all things run on |task_runner_| instead of the default task
+  // runner initialized by blink_unittests.
+  std::unique_ptr<base::TestMockTimeTaskRunner::ScopedContext>
+      task_runner_context_;
+
   std::unique_ptr<AudioRendererSinkCacheImpl> cache_;
 
  private:
@@ -194,7 +203,7 @@
 
   // Wait for garbage collection. Doesn't actually sleep, just advances the mock
   // clock.
-  task_env_.FastForwardBy(kDeleteTimeout);
+  task_runner_->FastForwardBy(kDeleteTimeout);
 
   // All the sinks should be garbage-collected by now.
   EXPECT_EQ(0, sink_count());
@@ -212,7 +221,7 @@
   // Wait less than garbage collection timeout.
   base::TimeDelta wait_a_bit =
       kDeleteTimeout - base::TimeDelta::FromMilliseconds(1);
-  task_env_.FastForwardBy(wait_a_bit);
+  task_runner_->FastForwardBy(wait_a_bit);
 
   // Sink is not deleted yet.
   EXPECT_EQ(1, sink_count());
@@ -224,7 +233,7 @@
   EXPECT_EQ(1, sink_count());
 
   // Wait more to hit garbage collection timeout.
-  task_env_.FastForwardBy(kDeleteTimeout);
+  task_runner_->FastForwardBy(kDeleteTimeout);
 
   // The sink is still in place.
   EXPECT_EQ(1, sink_count());
@@ -251,10 +260,10 @@
 
   cache_.reset();  // Destruct first so there's only one cache at a time.
   cache_ = std::make_unique<AudioRendererSinkCacheImpl>(
-      task_env_.GetMainThreadTaskRunner(),
+      task_runner_,
       base::BindRepeating(
           [](scoped_refptr<media::AudioRendererSink> sink,
-             const blink::LocalFrameToken& frame_token,
+             const LocalFrameToken& frame_token,
              const media::AudioSinkParameters& params) {
             EXPECT_EQ(kFrameToken, frame_token);
             EXPECT_TRUE(params.session_id.is_empty());
@@ -279,10 +288,10 @@
 
   cache_.reset();  // Destruct first so there's only one cache at a time.
   cache_ = std::make_unique<AudioRendererSinkCacheImpl>(
-      task_env_.GetMainThreadTaskRunner(),
+      task_runner_,
       base::BindRepeating(
           [](scoped_refptr<media::AudioRendererSink> sink,
-             const blink::LocalFrameToken& frame_token,
+             const LocalFrameToken& frame_token,
              const media::AudioSinkParameters& params) {
             EXPECT_EQ(kFrameToken, frame_token);
             EXPECT_TRUE(!params.session_id.is_empty());
@@ -324,7 +333,7 @@
       kFrameToken, base::UnguessableToken(), kAnotherDeviceId);
   EXPECT_EQ(1, sink_count());  // This sink is scheduled for deletion now.
 
-  task_env_.FastForwardBy(kDeleteTimeout);
+  task_runner_->FastForwardBy(kDeleteTimeout);
 
   // Nothing crashed and the second sink deleted on schedule.
   EXPECT_EQ(0, sink_count());
@@ -372,7 +381,7 @@
   // Release the sink on the second thread.
   PostAndWaitUntilDone(
       thread2,
-      base::BindOnce(&blink::AudioRendererSinkCache::ReleaseSink,
+      base::BindOnce(&AudioRendererSinkCache::ReleaseSink,
                      base::Unretained(cache_.get()), base::RetainedRef(sink)));
 
   EXPECT_EQ(0, sink_count());
@@ -397,7 +406,7 @@
   scoped_refptr<media::AudioRendererSink> sink1 =
       cache_->GetSink(kFrameToken, "device1").get();
   scoped_refptr<media::AudioRendererSink> another_sink =
-      cache_->GetSink(blink::LocalFrameToken(), "device1").get();
+      cache_->GetSink(LocalFrameToken(), "device1").get();
   scoped_refptr<media::AudioRendererSink> sink2 =
       cache_->GetSink(kFrameToken, "device2").get();
   EXPECT_EQ(3, sink_count());
@@ -410,4 +419,4 @@
               Stop());
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/modules_initializer.cc b/third_party/blink/renderer/modules/modules_initializer.cc
index a3b1c92..40237c58 100644
--- a/third_party/blink/renderer/modules/modules_initializer.cc
+++ b/third_party/blink/renderer/modules/modules_initializer.cc
@@ -62,6 +62,7 @@
 #include "third_party/blink/renderer/modules/launch/file_handling_expiry_impl.h"
 #include "third_party/blink/renderer/modules/launch/web_launch_service_impl.h"
 #include "third_party/blink/renderer/modules/manifest/manifest_manager.h"
+#include "third_party/blink/renderer/modules/media/audio/audio_renderer_sink_cache_impl.h"
 #include "third_party/blink/renderer/modules/media_controls/media_controls_impl.h"
 #include "third_party/blink/renderer/modules/mediasource/media_source_registry_impl.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_client.h"
@@ -187,6 +188,7 @@
   DCHECK(WebLocalFrameImpl::FromFrame(&frame)->Client());
   InspectorAccessibilityAgent::ProvideTo(&frame);
   ImageDownloaderImpl::ProvideTo(frame);
+  AudioRendererSinkCacheImpl::InstallFrameObserver(frame);
 }
 
 MediaControls* ModulesInitializer::CreateMediaControls(
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 8f40f367..36c0cb6 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -845,8 +845,13 @@
             # once the directory is fully Onion soup'ed.
             'base::Bind.*',
             'base::Unretained',
-            'mojo::WrapCallbackWithDefaultInvokeIfNotRun',
+            'base::NoDestructor',
+            'base::flat_map',
+            'base::AutoLock',
+            'base::Lock',
+            'base::EraseIf',
             'base::ScopedPlatformFile',
+            'mojo::WrapCallbackWithDefaultInvokeIfNotRun',
         ]
     },
     {