haikuwebkit/LayoutTests/fast/mediastream/media-stream-wrapper-collec...

68 lines
2.0 KiB
HTML
Raw Permalink Normal View History

fast/mediastream/MediaStream-page-muted.html times out and asserts https://bugs.webkit.org/show_bug.cgi?id=170355 <rdar://problem/31376041> Source/WebCore: MediaStream and MediaStreamTrack need to prevent JS wrapper collection while it is possible to fire an event or event listeners won't be notified. Reviewed by Chris Dumez. Test: fast/mediastream/media-stream-wrapper-collected.html * Modules/mediastream/MediaStream.cpp: (WebCore::MediaStream::MediaStream): Initialize ActiveDOMObject. (WebCore::MediaStream::stop): New. (WebCore::MediaStream::activeDOMObjectName): Ditto. (WebCore::MediaStream::canSuspendForDocumentSuspension): Ditto. (WebCore::MediaStream::hasPendingActivity): Ditto, prevent collection if there are registered event listeners. (WebCore::MediaStream::contextDestroyed): Deleted. * Modules/mediastream/MediaStream.h: * Modules/mediastream/MediaStream.idl: * Modules/mediastream/MediaStreamTrack.cpp: (WebCore::MediaStreamTrack::hasPendingActivity): Prevent collection if there are registered event listeners. * Modules/mediastream/MediaStreamTrack.h: * testing/Internals.cpp: (WebCore::Internals::removeMediaStreamTrack): stream.removeTrack doesn't generate a 'removetrack' event, so call private method that does. * testing/Internals.h: * testing/Internals.idl: LayoutTests: Reviewed by Chris Dumez. * fast/mediastream/media-stream-wrapper-collected-expected.txt: Added. * fast/mediastream/media-stream-wrapper-collected.html: Added. Canonical link: https://commits.webkit.org/190008@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@217985 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-06-09 16:14:27 +00:00
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>MediaStreamTrack with event listener should not be collected.</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
if (window.testRunner)
testRunner.setUserMediaPermission(true);
function forceGC()
{
if (window.GCController)
return GCController.collect();
// Force garbage collection
for (var ndx = 0; ndx < 99000; ndx++)
var str = new String("1234");
}
promise_test((test) => {
return navigator.mediaDevices.getUserMedia({ video: true })
.then((stream) => {
promise_test((test) => {
return new Promise((resolve, reject) => {
let track = stream.getVideoTracks()[0];
track.onmute = (evt) => {
if (window.internals)
internals.setMediaStreamTrackMuted(track, false);
}
track.onunmute = resolve;
forceGC();
if (window.internals)
internals.setMediaStreamTrackMuted(track, true);
setTimeout(() => reject("Track muted state did not change in .5 second"), 500);
});
}, "Test track");
promise_test((test) => {
return new Promise((resolve, reject) => {
stream.onremovetrack = resolve;
forceGC();
if (window.internals)
window.internals.removeMediaStreamTrack(stream, stream.getVideoTracks()[0]);
setTimeout(() => reject("stream.onremovetrack did not fire in .5 second"), 500);
});
}, "Test stream");
});
}, "Create stream");
</script>
</head>
<body>
</body>
</html>