// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/blink/renderer/modules/webaudio/audio_node.h" #include #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" #include "third_party/blink/renderer/modules/webaudio/audio_node_input.h" #include "third_party/blink/renderer/modules/webaudio/audio_node_output.h" #include "third_party/blink/renderer/modules/webaudio/audio_node_wiring.h" #include "third_party/blink/renderer/modules/webaudio/delay_node.h" #include "third_party/blink/renderer/modules/webaudio/offline_audio_context.h" namespace blink { TEST(AudioNodeInputTest, InputDestroyedBeforeOutput) { auto page = std::make_unique(); OfflineAudioContext* context = OfflineAudioContext::Create( page->GetFrame().DomWindow(), 2, 1, 48000, ASSERT_NO_EXCEPTION); DelayNode* node1 = context->createDelay(ASSERT_NO_EXCEPTION); auto& handler1 = node1->Handler(); DelayNode* node2 = context->createDelay(ASSERT_NO_EXCEPTION); auto& handler2 = node2->Handler(); auto input = std::make_unique(handler1); auto output = std::make_unique(&handler2, 0); { BaseAudioContext::GraphAutoLocker graph_lock(context); AudioNodeWiring::Connect(*output, *input); ASSERT_TRUE(output->IsConnected()); // This should not crash. input.reset(); output->Dispose(); output.reset(); } } TEST(AudioNodeInputTest, OutputDestroyedBeforeInput) { auto page = std::make_unique(); OfflineAudioContext* context = OfflineAudioContext::Create( page->GetFrame().DomWindow(), 2, 1, 48000, ASSERT_NO_EXCEPTION); DelayNode* node1 = context->createDelay(ASSERT_NO_EXCEPTION); auto& handler1 = node1->Handler(); DelayNode* node2 = context->createDelay(ASSERT_NO_EXCEPTION); auto& handler2 = node2->Handler(); auto input = std::make_unique(handler1); auto output = std::make_unique(&handler2, 0); { BaseAudioContext::GraphAutoLocker graph_lock(context); AudioNodeWiring::Connect(*output, *input); ASSERT_TRUE(output->IsConnected()); // This should not crash. output->Dispose(); output.reset(); input.reset(); } } } // namespace blink