Commit 298b5854 authored by Minoru Chikamune's avatar Minoru Chikamune Committed by Commit Bot

Migrate AudioContext to use GC mojo wrappers.

No behavior change. This CL reduces potential risks of use-after-free bugs.

Bug: 1049056
Change-Id: Ia1031c5480e0b3aaf02371befc796db1166a6d2b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2136012
Commit-Queue: Minoru Chikamune <chikamune@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Reviewed-by: default avatarHongchan Choi <hongchan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756926}
parent 1b15a303
...@@ -131,6 +131,7 @@ AudioContext::AudioContext(Document& document, ...@@ -131,6 +131,7 @@ AudioContext::AudioContext(Document& document,
base::Optional<float> sample_rate) base::Optional<float> sample_rate)
: BaseAudioContext(&document, kRealtimeContext), : BaseAudioContext(&document, kRealtimeContext),
context_id_(g_context_id++), context_id_(g_context_id++),
audio_context_manager_(document.ToExecutionContext()),
keep_alive_(PERSISTENT_FROM_HERE, this) { keep_alive_(PERSISTENT_FROM_HERE, this) {
destination_node_ = destination_node_ =
RealtimeAudioDestinationNode::Create(this, latency_hint, sample_rate); RealtimeAudioDestinationNode::Create(this, latency_hint, sample_rate);
...@@ -168,7 +169,6 @@ AudioContext::AudioContext(Document& document, ...@@ -168,7 +169,6 @@ AudioContext::AudioContext(Document& document,
destination()->GetAudioDestinationHandler()); destination()->GetAudioDestinationHandler());
base_latency_ = destination_handler.GetFramesPerBuffer() / base_latency_ = destination_handler.GetFramesPerBuffer() /
static_cast<double>(sampleRate()); static_cast<double>(sampleRate());
} }
void AudioContext::Uninitialize() { void AudioContext::Uninitialize() {
...@@ -196,6 +196,7 @@ AudioContext::~AudioContext() { ...@@ -196,6 +196,7 @@ AudioContext::~AudioContext() {
void AudioContext::Trace(Visitor* visitor) { void AudioContext::Trace(Visitor* visitor) {
visitor->Trace(close_resolver_); visitor->Trace(close_resolver_);
visitor->Trace(audio_context_manager_);
BaseAudioContext::Trace(visitor); BaseAudioContext::Trace(visitor);
} }
...@@ -606,7 +607,7 @@ void AudioContext::NotifyAudibleAudioStarted() { ...@@ -606,7 +607,7 @@ void AudioContext::NotifyAudibleAudioStarted() {
DCHECK(IsMainThread()); DCHECK(IsMainThread());
EnsureAudioContextManagerService(); EnsureAudioContextManagerService();
if (audio_context_manager_) if (audio_context_manager_.is_bound())
audio_context_manager_->AudioContextAudiblePlaybackStarted(context_id_); audio_context_manager_->AudioContextAudiblePlaybackStarted(context_id_);
} }
...@@ -697,17 +698,18 @@ void AudioContext::NotifyAudibleAudioStopped() { ...@@ -697,17 +698,18 @@ void AudioContext::NotifyAudibleAudioStopped() {
DCHECK(IsMainThread()); DCHECK(IsMainThread());
EnsureAudioContextManagerService(); EnsureAudioContextManagerService();
if (audio_context_manager_) if (audio_context_manager_.is_bound())
audio_context_manager_->AudioContextAudiblePlaybackStopped(context_id_); audio_context_manager_->AudioContextAudiblePlaybackStopped(context_id_);
} }
void AudioContext::EnsureAudioContextManagerService() { void AudioContext::EnsureAudioContextManagerService() {
if (audio_context_manager_ || !GetDocument()) if (audio_context_manager_.is_bound() || !GetDocument())
return; return;
GetDocument()->GetFrame()->GetBrowserInterfaceBroker().GetInterface( GetDocument()->GetFrame()->GetBrowserInterfaceBroker().GetInterface(
mojo::GenericPendingReceiver( mojo::GenericPendingReceiver(
audio_context_manager_.BindNewPipeAndPassReceiver())); audio_context_manager_.BindNewPipeAndPassReceiver(
GetDocument()->GetTaskRunner(TaskType::kInternalMedia))));
audio_context_manager_.set_disconnect_handler( audio_context_manager_.set_disconnect_handler(
WTF::Bind(&AudioContext::OnAudioContextManagerServiceConnectionError, WTF::Bind(&AudioContext::OnAudioContextManagerServiceConnectionError,
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_CONTEXT_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_CONTEXT_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_CONTEXT_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_CONTEXT_H_
#include "mojo/public/cpp/bindings/remote.h"
#include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom-blink.h" #include "third_party/blink/public/mojom/webaudio/audio_context_manager.mojom-blink.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
...@@ -14,6 +13,8 @@ ...@@ -14,6 +13,8 @@
#include "third_party/blink/renderer/modules/webaudio/base_audio_context.h" #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/heap/self_keep_alive.h" #include "third_party/blink/renderer/platform/heap/self_keep_alive.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
namespace blink { namespace blink {
...@@ -192,7 +193,9 @@ class MODULES_EXPORT AudioContext : public BaseAudioContext { ...@@ -192,7 +193,9 @@ class MODULES_EXPORT AudioContext : public BaseAudioContext {
double base_latency_ = 0; double base_latency_ = 0;
// AudioContextManager for reporting audibility. // AudioContextManager for reporting audibility.
mojo::Remote<mojom::blink::AudioContextManager> audio_context_manager_; HeapMojoRemote<mojom::blink::AudioContextManager,
HeapMojoWrapperMode::kWithoutContextObserver>
audio_context_manager_;
// Keeps track if the output of this destination was audible, before the // Keeps track if the output of this destination was audible, before the
// current rendering quantum. Used for recording "playback" time. // current rendering quantum. Used for recording "playback" time.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment