Onion soup FuchsiaAudioDeviceFactory

This CL executes phases 5 on the design document [1].

[1] https://docs.google.com/document/d/19Zk6Fv1E-6QTQ2c33rpBjDNEkzlsSKvjb3hWkvZAE80/

It also adds triggers the generation of blink bindings by
//media//fuchsia/mojom.

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

Change-Id: Ic2a1ffaea1f9647d9c2c18d298fc23c58d5cc5bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2436749
Commit-Queue: Antonio Gomes (GMT-4) <tonikitoo@igalia.com>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: Sergey Ulanov <sergeyu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812057}
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index ba05139..dc2c25b 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -413,8 +413,6 @@
 
   if (is_fuchsia) {
     sources += [
-      "media/audio/fuchsia_audio_device_factory.cc",
-      "media/audio/fuchsia_audio_device_factory.h",
       "media/fuchsia_renderer_factory.cc",
       "media/fuchsia_renderer_factory.h",
       "render_view_fuchsia.cc",
diff --git a/content/renderer/renderer_main_platform_delegate.h b/content/renderer/renderer_main_platform_delegate.h
index 565dd0e..f3adc9f 100644
--- a/content/renderer/renderer_main_platform_delegate.h
+++ b/content/renderer/renderer_main_platform_delegate.h
@@ -16,7 +16,7 @@
 #include "content/public/common/main_function_params.h"
 
 #if defined(OS_FUCHSIA)
-#include "content/renderer/media/audio/fuchsia_audio_device_factory.h"
+#include "third_party/blink/public/web/modules/media/audio/fuchsia_audio_device_factory.h"
 #endif  // defined(OS_FUCHSIA)
 
 namespace content {
@@ -41,7 +41,8 @@
 #endif
 
 #if defined(OS_FUCHSIA)
-  std::unique_ptr<FuchsiaAudioDeviceFactory> fuchsia_audio_device_factory_;
+  std::unique_ptr<blink::FuchsiaAudioDeviceFactory>
+      fuchsia_audio_device_factory_;
 #endif  // defined(OS_FUCHSIA)
 
   DISALLOW_COPY_AND_ASSIGN(RendererMainPlatformDelegate);
diff --git a/content/renderer/renderer_main_platform_delegate_fuchsia.cc b/content/renderer/renderer_main_platform_delegate_fuchsia.cc
index cb84ce4..73d42ce6 100644
--- a/content/renderer/renderer_main_platform_delegate_fuchsia.cc
+++ b/content/renderer/renderer_main_platform_delegate_fuchsia.cc
@@ -12,7 +12,8 @@
 RendererMainPlatformDelegate::~RendererMainPlatformDelegate() {}
 
 void RendererMainPlatformDelegate::PlatformInitialize() {
-  fuchsia_audio_device_factory_ = std::make_unique<FuchsiaAudioDeviceFactory>();
+  fuchsia_audio_device_factory_ =
+      std::make_unique<blink::FuchsiaAudioDeviceFactory>();
 }
 
 void RendererMainPlatformDelegate::PlatformUninitialize() {
diff --git a/media/fuchsia/mojom/BUILD.gn b/media/fuchsia/mojom/BUILD.gn
index 957b6ed6..5d5a38d 100644
--- a/media/fuchsia/mojom/BUILD.gn
+++ b/media/fuchsia/mojom/BUILD.gn
@@ -7,31 +7,36 @@
 mojom("mojom") {
   sources = [ "fuchsia_media_resource_provider.mojom" ]
 
-  cpp_typemaps = [
-    {
-      types = [
-        {
-          mojom = "media.mojom.CdmRequest"
-          cpp = "::fidl::InterfaceRequest<::fuchsia::media::drm::ContentDecryptionModule>"
-          move_only = true
-        },
-        {
-          mojom = "media.mojom.AudioConsumerRequest"
-          cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioConsumer>"
-          move_only = true
-        },
-        {
-          mojom = "media.mojom.AudioCapturerRequest"
-          cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioCapturer>"
-          move_only = true
-        },
-      ]
-      traits_headers = [ "fuchsia_media_resource_provider_mojom_traits.h" ]
-      traits_public_deps = [
-        "//fuchsia/mojom:traits",
-        "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media",
-        "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media.drm",
-      ]
-    },
-  ]
+  export_class_attribute_blink = "BLINK_PLATFORM_EXPORT"
+  export_define_blink = "BLINK_PLATFORM_IMPLEMENTATION=1"
+  export_header_blink = "third_party/blink/public/platform/web_common.h"
+
+  shared_cpp_typemaps = {
+    types = [
+      {
+        mojom = "media.mojom.CdmRequest"
+        cpp = "::fidl::InterfaceRequest<::fuchsia::media::drm::ContentDecryptionModule>"
+        move_only = true
+      },
+      {
+        mojom = "media.mojom.AudioConsumerRequest"
+        cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioConsumer>"
+        move_only = true
+      },
+      {
+        mojom = "media.mojom.AudioCapturerRequest"
+        cpp = "::fidl::InterfaceRequest<::fuchsia::media::AudioCapturer>"
+        move_only = true
+      },
+    ]
+    traits_headers = [ "fuchsia_media_resource_provider_mojom_traits.h" ]
+    traits_public_deps = [
+      "//fuchsia/mojom:traits",
+      "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media",
+      "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media.drm",
+    ]
+  }
+
+  cpp_typemaps = [ shared_cpp_typemaps ]
+  blink_cpp_typemaps = [ shared_cpp_typemaps ]
 }
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 234ca9fe..96a9def 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -278,6 +278,7 @@
     "platform/websocket_handshake_throttle.h",
     "web/blink.h",
     "web/modules/autofill/web_form_element_observer.h",
+    "web/modules/media/audio/fuchsia_audio_device_factory.h",
     "web/modules/media/audio/web_audio_device_factory.h",
     "web/modules/media/audio/web_audio_input_ipc_factory.h",
     "web/modules/media/audio/web_audio_output_ipc_factory.h",
diff --git a/content/renderer/media/audio/fuchsia_audio_device_factory.h b/third_party/blink/public/web/modules/media/audio/fuchsia_audio_device_factory.h
similarity index 60%
rename from content/renderer/media/audio/fuchsia_audio_device_factory.h
rename to third_party/blink/public/web/modules/media/audio/fuchsia_audio_device_factory.h
index 2b73eeb..d1287e07 100644
--- a/content/renderer/media/audio/fuchsia_audio_device_factory.h
+++ b/third_party/blink/public/web/modules/media/audio/fuchsia_audio_device_factory.h
@@ -2,41 +2,41 @@
 // 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_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
-#define CONTENT_RENDERER_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
+#define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
 
 #include "third_party/blink/public/common/tokens/tokens.h"
 #include "third_party/blink/public/web/modules/media/audio/web_audio_device_factory.h"
 
-namespace content {
+namespace blink {
 
-class FuchsiaAudioDeviceFactory : public blink::WebAudioDeviceFactory {
+class FuchsiaAudioDeviceFactory : public WebAudioDeviceFactory {
  public:
   FuchsiaAudioDeviceFactory();
   ~FuchsiaAudioDeviceFactory() final;
 
  protected:
   scoped_refptr<media::AudioRendererSink> CreateFinalAudioRendererSink(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSinkParameters& params,
       base::TimeDelta auth_timeout) final;
 
   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) final;
 
   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) final;
 
   scoped_refptr<media::AudioCapturerSource> CreateAudioCapturerSource(
-      const blink::LocalFrameToken& frame_token,
+      const LocalFrameToken& frame_token,
       const media::AudioSourceParameters& params) final;
 };
 
-}  // namespace content
+}  // namespace blink
 
-#endif  // CONTENT_RENDERER_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIA_AUDIO_FUCHSIA_AUDIO_DEVICE_FACTORY_H_
diff --git a/third_party/blink/renderer/modules/media/BUILD.gn b/third_party/blink/renderer/modules/media/BUILD.gn
index fd6cdd07..77ea9227 100644
--- a/third_party/blink/renderer/modules/media/BUILD.gn
+++ b/third_party/blink/renderer/modules/media/BUILD.gn
@@ -19,4 +19,13 @@
     "audio/web_audio_output_ipc_factory.cc",
     "webmediaplayer_util.cc",
   ]
+
+  if (is_fuchsia) {
+    sources += [ "audio/fuchsia_audio_device_factory.cc" ]
+
+    deps = [
+      "//media/fuchsia/audio",
+      "//media/fuchsia/mojom:mojom_blink",
+    ]
+  }
 }
diff --git a/third_party/blink/renderer/modules/media/audio/DEPS b/third_party/blink/renderer/modules/media/audio/DEPS
index 00a272cf..a8cbd48 100644
--- a/third_party/blink/renderer/modules/media/audio/DEPS
+++ b/third_party/blink/renderer/modules/media/audio/DEPS
@@ -22,4 +22,8 @@
         "+base/test/test_mock_time_task_runner.h",
         "+base/threading/thread.h",
     ],
+    "fuchsia_audio_device_factory\.cc" : [
+        "+media/fuchsia/audio/fuchsia_audio_capturer_source.h",
+        "+media/fuchsia/mojom",
+    ],
 }
diff --git a/content/renderer/media/audio/fuchsia_audio_device_factory.cc b/third_party/blink/renderer/modules/media/audio/fuchsia_audio_device_factory.cc
similarity index 69%
rename from content/renderer/media/audio/fuchsia_audio_device_factory.cc
rename to third_party/blink/renderer/modules/media/audio/fuchsia_audio_device_factory.cc
index b763d8a..3043b672 100644
--- a/content/renderer/media/audio/fuchsia_audio_device_factory.cc
+++ b/third_party/blink/renderer/modules/media/audio/fuchsia_audio_device_factory.cc
@@ -2,28 +2,27 @@
 // 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/fuchsia_audio_device_factory.h"
+#include "third_party/blink/public/web/modules/media/audio/fuchsia_audio_device_factory.h"
 
 #include <fuchsia/media/cpp/fidl.h>
 
-#include "content/public/renderer/render_frame.h"
 #include "media/base/audio_renderer_sink.h"
 #include "media/fuchsia/audio/fuchsia_audio_capturer_source.h"
-#include "media/fuchsia/mojom/fuchsia_media_resource_provider.mojom.h"
+#include "media/fuchsia/mojom/fuchsia_media_resource_provider.mojom-blink.h"
 #include "media/fuchsia/mojom/fuchsia_media_resource_provider_mojom_traits.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
-#include "third_party/blink/public/web/web_frame.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
 
-namespace content {
+namespace blink {
 
 FuchsiaAudioDeviceFactory::FuchsiaAudioDeviceFactory() = default;
 FuchsiaAudioDeviceFactory::~FuchsiaAudioDeviceFactory() = default;
 
 scoped_refptr<media::AudioRendererSink>
 FuchsiaAudioDeviceFactory::CreateFinalAudioRendererSink(
-    const blink::LocalFrameToken& frame_token,
+    const LocalFrameToken& frame_token,
     const media::AudioSinkParameters& params,
     base::TimeDelta auth_timeout) {
   // Return nullptr to fallback to the default renderer implementation.
@@ -32,8 +31,8 @@
 
 scoped_refptr<media::AudioRendererSink>
 FuchsiaAudioDeviceFactory::CreateAudioRendererSink(
-    blink::WebAudioDeviceSourceType source_type,
-    const blink::LocalFrameToken& frame_token,
+    WebAudioDeviceSourceType source_type,
+    const LocalFrameToken& frame_token,
     const media::AudioSinkParameters& params) {
   // Return nullptr to fallback to the default renderer implementation.
   return nullptr;
@@ -41,8 +40,8 @@
 
 scoped_refptr<media::SwitchableAudioRendererSink>
 FuchsiaAudioDeviceFactory::CreateSwitchableAudioRendererSink(
-    blink::WebAudioDeviceSourceType source_type,
-    const blink::LocalFrameToken& frame_token,
+    WebAudioDeviceSourceType source_type,
+    const LocalFrameToken& frame_token,
     const media::AudioSinkParameters& params) {
   // Return nullptr to fallback to the default renderer implementation.
   return nullptr;
@@ -50,21 +49,16 @@
 
 scoped_refptr<media::AudioCapturerSource>
 FuchsiaAudioDeviceFactory::CreateAudioCapturerSource(
-    const blink::LocalFrameToken& frame_token,
+    const LocalFrameToken& frame_token,
     const media::AudioSourceParameters& params) {
-  blink::WebFrame* web_frame = blink::WebFrame::FromFrameToken(frame_token);
-  if (!web_frame)
-    return nullptr;
-
-  int render_frame_id = RenderFrame::GetRoutingIdForWebFrame(web_frame);
-  auto* render_frame = RenderFrame::FromRoutingID(render_frame_id);
-  if (!render_frame)
+  auto* local_frame = LocalFrame::FromFrameToken(frame_token);
+  if (!local_frame)
     return nullptr;
 
   // Connect FuchsiaMediaResourceProvider.
-  mojo::Remote<media::mojom::FuchsiaMediaResourceProvider>
+  mojo::Remote<media::mojom::blink::FuchsiaMediaResourceProvider>
       media_resource_provider;
-  render_frame->GetBrowserInterfaceBroker()->GetInterface(
+  local_frame->GetBrowserInterfaceBroker().GetInterface(
       media_resource_provider.BindNewPipeAndPassReceiver());
 
   // Connect AudioCapturer.
@@ -75,4 +69,4 @@
       std::move(capturer));
 }
 
-}  // namespace content
\ No newline at end of file
+}  // namespace blink
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 06d8f2b..e9fa69e7 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
@@ -859,6 +859,10 @@
             'base::EraseIf',
             'base::ScopedPlatformFile',
             'mojo::WrapCallbackWithDefaultInvokeIfNotRun',
+
+            # TODO(https://crrev.com/787252): Consider allowlisting fidl::*
+            # usage more broadly in Blink.
+            'fidl::InterfaceHandle',
         ]
     },
     {