| Index: Source/modules/webaudio/AudioNodeInput.cpp
 | 
| diff --git a/Source/modules/webaudio/AudioNodeInput.cpp b/Source/modules/webaudio/AudioNodeInput.cpp
 | 
| index e2af1dbe85189f64447f905ffc80247e72d512b7..e1abb49b6c7aa43d954ce5925e10e0d8a37c14ce 100644
 | 
| --- a/Source/modules/webaudio/AudioNodeInput.cpp
 | 
| +++ b/Source/modules/webaudio/AudioNodeInput.cpp
 | 
| @@ -33,7 +33,7 @@
 | 
|  namespace blink {
 | 
|  
 | 
|  inline AudioNodeInput::AudioNodeInput(AudioNode& node)
 | 
| -    : AudioSummingJunction(node.context())
 | 
| +    : AudioSummingJunction(node.context()->handler())
 | 
|      , m_node(node)
 | 
|  {
 | 
|      // Set to mono by default.
 | 
| @@ -47,13 +47,18 @@ AudioNodeInput* AudioNodeInput::create(AudioNode& node)
 | 
|  
 | 
|  DEFINE_TRACE(AudioNodeInput)
 | 
|  {
 | 
| +    // TODO(tkent): Oilpan: m_renderingOutputs should not be strong references.
 | 
| +    // This is a short-term workaround to avoid crashes, and causes AudioNode
 | 
| +    // leaks.
 | 
| +    AudioContext::AutoLocker locker(deferredTaskHandler());
 | 
| +    for (size_t i = 0; i < m_renderingOutputs.size(); ++i)
 | 
| +        visitor->trace(m_renderingOutputs[i]);
 | 
|      visitor->trace(m_node);
 | 
| -    AudioSummingJunction::trace(visitor);
 | 
|  }
 | 
|  
 | 
|  void AudioNodeInput::connect(AudioNodeOutput& output)
 | 
|  {
 | 
| -    ASSERT(context()->isGraphOwner());
 | 
| +    ASSERT(deferredTaskHandler().isGraphOwner());
 | 
|  
 | 
|      // Check if we're already connected to this output.
 | 
|      if (m_outputs.contains(&output))
 | 
| @@ -66,7 +71,7 @@ void AudioNodeInput::connect(AudioNodeOutput& output)
 | 
|  
 | 
|  void AudioNodeInput::disconnect(AudioNodeOutput& output)
 | 
|  {
 | 
| -    ASSERT(context()->isGraphOwner());
 | 
| +    ASSERT(deferredTaskHandler().isGraphOwner());
 | 
|  
 | 
|      // First try to disconnect from "active" connections.
 | 
|      if (m_outputs.contains(&output)) {
 | 
| @@ -92,7 +97,7 @@ void AudioNodeInput::disconnect(AudioNodeOutput& output)
 | 
|  
 | 
|  void AudioNodeInput::disable(AudioNodeOutput& output)
 | 
|  {
 | 
| -    ASSERT(context()->isGraphOwner());
 | 
| +    ASSERT(deferredTaskHandler().isGraphOwner());
 | 
|      ASSERT(m_outputs.contains(&output));
 | 
|  
 | 
|      m_disabledOutputs.add(&output);
 | 
| @@ -105,7 +110,7 @@ void AudioNodeInput::disable(AudioNodeOutput& output)
 | 
|  
 | 
|  void AudioNodeInput::enable(AudioNodeOutput& output)
 | 
|  {
 | 
| -    ASSERT(context()->isGraphOwner());
 | 
| +    ASSERT(deferredTaskHandler().isGraphOwner());
 | 
|      ASSERT(m_disabledOutputs.contains(&output));
 | 
|  
 | 
|      // Move output from disabled list to active list.
 | 
| @@ -124,8 +129,8 @@ void AudioNodeInput::didUpdate()
 | 
|  
 | 
|  void AudioNodeInput::updateInternalBus()
 | 
|  {
 | 
| -    ASSERT(context()->isAudioThread());
 | 
| -    ASSERT(context()->isGraphOwner());
 | 
| +    ASSERT(deferredTaskHandler().isAudioThread());
 | 
| +    ASSERT(deferredTaskHandler().isGraphOwner());
 | 
|  
 | 
|      unsigned numberOfInputChannels = numberOfChannels();
 | 
|  
 | 
| @@ -158,7 +163,7 @@ unsigned AudioNodeInput::numberOfChannels() const
 | 
|  
 | 
|  AudioBus* AudioNodeInput::bus()
 | 
|  {
 | 
| -    ASSERT(context()->isAudioThread());
 | 
| +    ASSERT(deferredTaskHandler().isAudioThread());
 | 
|  
 | 
|      // Handle single connection specially to allow for in-place processing.
 | 
|      if (numberOfRenderingConnections() == 1 && node().internalChannelCountMode() == AudioNode::Max)
 | 
| @@ -170,14 +175,14 @@ AudioBus* AudioNodeInput::bus()
 | 
|  
 | 
|  AudioBus* AudioNodeInput::internalSummingBus()
 | 
|  {
 | 
| -    ASSERT(context()->isAudioThread());
 | 
| +    ASSERT(deferredTaskHandler().isAudioThread());
 | 
|  
 | 
|      return m_internalSummingBus.get();
 | 
|  }
 | 
|  
 | 
|  void AudioNodeInput::sumAllConnections(AudioBus* summingBus, size_t framesToProcess)
 | 
|  {
 | 
| -    ASSERT(context()->isAudioThread());
 | 
| +    ASSERT(deferredTaskHandler().isAudioThread());
 | 
|  
 | 
|      // We shouldn't be calling this method if there's only one connection, since it's less efficient.
 | 
|      ASSERT(numberOfRenderingConnections() > 1 || node().internalChannelCountMode() != AudioNode::Max);
 | 
| @@ -204,7 +209,7 @@ void AudioNodeInput::sumAllConnections(AudioBus* summingBus, size_t framesToProc
 | 
|  
 | 
|  AudioBus* AudioNodeInput::pull(AudioBus* inPlaceBus, size_t framesToProcess)
 | 
|  {
 | 
| -    ASSERT(context()->isAudioThread());
 | 
| +    ASSERT(deferredTaskHandler().isAudioThread());
 | 
|  
 | 
|      // Handle single connection case.
 | 
|      if (numberOfRenderingConnections() == 1 && node().internalChannelCountMode() == AudioNode::Max) {
 | 
| 
 |