Commit b1435685 authored by Jeremy Roman's avatar Jeremy Roman Committed by Commit Bot

Fix BaseAudioContext::TraceWrappers to reach the EventTarget data.

Previously it was not invoking EventTargetWithInlineData's wrapper-tracing
method, so this was getting lost in the override. This bug was previously
hidden by the redundant tracing of event listeners which was removed in
r491479: https://chromium.googlesource.com/chromium/src/+/d68025ec

A layout test for this case has been added.

Bug: 756611
Change-Id: I98c8dc49eef3b49c20788a55ca2843521051cd5e
Reviewed-on: https://chromium-review.googlesource.com/627421
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarRaymond Toy <rtoy@chromium.org>
Cr-Commit-Position: refs/heads/master@{#496511}
parent 2ffc647a
<!DOCTYPE html>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/audit-util.js"></script>
<script src="../resources/audit.js"></script>
<script id="layout-test-code">
let audit = Audit.createTaskRunner();
let sampleRate = 48000;
let renderSeconds = 1;
let renderFrames = sampleRate * renderSeconds;
let contextChannels = 2;
// Event listeners should not be garbage-collected prematurely.
// The test passes if it does not time out waiting for oncomplete.
audit.define('event-listener-gc', (task, should) => {
let context = new OfflineAudioContext(contextChannels, renderFrames, sampleRate);
let buffer = context.createBuffer(contextChannels, renderFrames, sampleRate);
buffer.getChannelData(0).fill(1);
buffer.getChannelData(1).fill(2);
let source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start();
context.oncomplete = () => task.done();
context.startRendering();
// Run a full GC. This should not collect the event listener.
if (window.GCController)
window.GCController.collectAll();
});
audit.run();
</script>
...@@ -1007,6 +1007,8 @@ DEFINE_TRACE(BaseAudioContext) { ...@@ -1007,6 +1007,8 @@ DEFINE_TRACE(BaseAudioContext) {
} }
DEFINE_TRACE_WRAPPERS(BaseAudioContext) { DEFINE_TRACE_WRAPPERS(BaseAudioContext) {
EventTargetWithInlineData::TraceWrappers(visitor);
// Inform V8's GC that we have references to these objects so they // Inform V8's GC that we have references to these objects so they
// don't get collected until we're done with them. // don't get collected until we're done with them.
for (auto callback : success_callbacks_) { for (auto callback : success_callbacks_) {
......
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