983f882180
draw_image_video_element_test creates VideoElements, which the current frame is taken from when drawing to a CanvasElement. The test was waiting on the onCanPlay event of the VideoElement before drawing, although this might mean the video won't actually start playing. This fixes that issue by enabling autoplay and then awaiting the play Event. Change-Id: I100a552a1eb8e88b6b368d88e499f62f2db8e831 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143621 Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com> Commit-Queue: Srujan Gaddam <srujzs@google.com>
224 lines
8.0 KiB
Dart
224 lines
8.0 KiB
Dart
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
library canvas_rendering_context_2d_test;
|
|
|
|
import 'dart:async';
|
|
import 'dart:html';
|
|
import 'dart:math';
|
|
|
|
import 'canvas_rendering_util.dart';
|
|
import 'package:async_helper/async_helper.dart';
|
|
|
|
// These videos and base64 strings are the same video, representing 2
|
|
// frames of 8x8 red pixels.
|
|
// The videos were created with:
|
|
// convert -size 8x8 xc:red blank1.jpg
|
|
// convert -size 8x8 xc:red blank2.jpg
|
|
// avconv -f image2 -i "blank%d.jpg" -c:v libx264 small.mp4
|
|
// avconv -i small.mp4 small.webm
|
|
// python -m base64 -e small.mp4
|
|
// python -m base64 -e small.webm
|
|
var mp4VideoUrl = '/root_dart/tests/lib/html/small.mp4';
|
|
var webmVideoUrl = '/root_dart/tests/lib/html/small.webm';
|
|
var mp4VideoDataUrl =
|
|
'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAA'
|
|
'AIZnJlZQAAAsdtZGF0AAACmwYF//+X3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlID'
|
|
'EyMCByMjE1MSBhM2Y0NDA3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZW'
|
|
'Z0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG'
|
|
'9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweD'
|
|
'ExMSBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj'
|
|
'0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MCBjcW09MC'
|
|
'BkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aH'
|
|
'JlYWRzPTE4IHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZW'
|
|
'Q9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl'
|
|
'9weXJhbWlkPTAgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MCBvcG'
|
|
'VuX2dvcD0xIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MjUgc2NlbmVjdX'
|
|
'Q9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPT'
|
|
'EgY3JmPTUxLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3'
|
|
'JhdGlvPTEuMjUgYXE9MToxLjAwAIAAAAARZYiEB//3aoK5/tP9+8yeuIEAAAAHQZoi2P'
|
|
'/wgAAAAzxtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAUAABAAABAAAAAAAAAA'
|
|
'AAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA'
|
|
'AAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT/////7/AAACUHRyYWsAAA'
|
|
'BcdGtoZAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAQAAAA'
|
|
'AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAgAAAAAACRlZHRzAAAAHG'
|
|
'Vsc3QAAAAAAAAAAQAAAFAAAAABAAEAAAAAAchtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAA'
|
|
'AAAAAZAAAAAlXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSG'
|
|
'FuZGxlcgAAAAFzbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZg'
|
|
'AAAAAAAAABAAAADHVybCAAAAABAAABM3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2Yz'
|
|
'EAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAACAAIAEgAAABIAAAAAAAAAAEAAAAAAAAAAA'
|
|
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwFNQAr/4QAYZ01ACuiPyy'
|
|
'4C2QAAAwABAAADADIPEiUSAQAGaOvAZSyAAAAAGHN0dHMAAAAAAAAAAQAAAAIAAAABAA'
|
|
'AAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAAAAABAAAAAgAAAAEAAAAcc3RzYw'
|
|
'AAAAAAAAABAAAAAQAAAAEAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAK0AAAACwAAAB'
|
|
'hzdGNvAAAAAAAAAAIAAAAwAAAC5AAAAGB1ZHRhAAAAWG1ldGEAAAAAAAAAIWhkbHIAAA'
|
|
'AAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqXRvbwAAABtkYXRhAAAAAQ'
|
|
'AAAABMYXZmNTMuMjEuMQ==';
|
|
var webmVideoDataUrl =
|
|
'data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlY'
|
|
'm1Ch4ECQoWBAhhTgGcBAAAAAAAB/hFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua'
|
|
'1OsggEsTbuMU6uEHFO7a1OsggHk7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
|
|
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAA'
|
|
'EEq17GDD0JATYCLTGF2ZjUzLjIxLjFXQYtMYXZmNTMuMjEuMXOkkJatuHwTJ7cvFLSzB'
|
|
'Smxbp5EiYhAVAAAAAAAABZUrmsBAAAAAAAAR64BAAAAAAAAPteBAXPFgQGcgQAitZyDd'
|
|
'W5khoVWX1ZQOIOBASPjg4QCYloA4AEAAAAAAAASsIEIuoEIVLCBCFS6gQhUsoEDH0O2d'
|
|
'QEAAAAAAABZ54EAo72BAACA8AIAnQEqCAAIAABHCIWFiIWEiAICAnWqA/gD+gINTRgA/'
|
|
'v0hRf/kb+PnRv/I4//8WE8DijI//FRAo5WBACgAsQEAARAQABgAGFgv9AAIAAAcU7trA'
|
|
'QAAAAAAAA67jLOBALeH94EB8YIBfw==';
|
|
|
|
Future testWithThreeParams() async {
|
|
setupFunc();
|
|
|
|
video.onError.listen((_) {
|
|
throw ('URL failed to load.');
|
|
});
|
|
if (video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
|
|
video.src = webmVideoUrl;
|
|
} else if (video.canPlayType(
|
|
'video/mp4; codecs="avc1.4D401E, mp4a.40.2"', null) !=
|
|
'') {
|
|
video.src = mp4VideoUrl;
|
|
} else {
|
|
window.console.log('Video is not supported on this system.');
|
|
}
|
|
|
|
// Without user interaction, playing the video requires autoplay to be enabled
|
|
// and autoplay can only be enabled if muted. We loop the video so there is
|
|
// always an active frame that can be drawn.
|
|
video.loop = true;
|
|
video.muted = true;
|
|
video.autoplay = true;
|
|
await video.play();
|
|
context.drawImage(video, 50, 50);
|
|
|
|
expectPixelFilled(50, 50);
|
|
expectPixelFilled(54, 54);
|
|
expectPixelFilled(57, 57);
|
|
expectPixelUnfilled(58, 58);
|
|
expectPixelUnfilled(0, 0);
|
|
expectPixelUnfilled(70, 70);
|
|
tearDownFunc();
|
|
}
|
|
|
|
Future testWithFiveParams() async {
|
|
setupFunc();
|
|
|
|
video.onError.listen((_) {
|
|
throw ('URL failed to load.');
|
|
});
|
|
|
|
if (video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
|
|
video.src = webmVideoUrl;
|
|
} else if (video.canPlayType(
|
|
'video/mp4; codecs="avc1.4D401E, mp4a.40.2"', null) !=
|
|
'') {
|
|
video.src = mp4VideoUrl;
|
|
} else {
|
|
// TODO(amouravski): Better fallback?
|
|
window.console.log('Video is not supported on this system.');
|
|
}
|
|
|
|
video.loop = true;
|
|
video.muted = true;
|
|
video.autoplay = true;
|
|
await video.play();
|
|
context.drawImageToRect(video, new Rectangle(50, 50, 20, 20));
|
|
|
|
expectPixelFilled(50, 50);
|
|
expectPixelFilled(55, 55);
|
|
expectPixelFilled(59, 59);
|
|
expectPixelFilled(60, 60);
|
|
expectPixelFilled(69, 69);
|
|
expectPixelUnfilled(70, 70);
|
|
expectPixelUnfilled(0, 0);
|
|
expectPixelUnfilled(80, 80);
|
|
tearDownFunc();
|
|
}
|
|
|
|
Future testWithNineParams() async {
|
|
setupFunc();
|
|
|
|
video.onError.listen((_) {
|
|
throw ('URL failed to load.');
|
|
});
|
|
|
|
if (video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
|
|
video.src = webmVideoUrl;
|
|
} else if (video.canPlayType(
|
|
'video/mp4; codecs="avc1.4D401E, mp4a.40.2"', null) !=
|
|
'') {
|
|
video.src = mp4VideoUrl;
|
|
} else {
|
|
// TODO(amouravski): Better fallback?
|
|
window.console.log('Video is not supported on this system.');
|
|
}
|
|
|
|
video.loop = true;
|
|
video.muted = true;
|
|
video.autoplay = true;
|
|
await video.play();
|
|
context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
|
|
sourceRect: new Rectangle(2, 2, 6, 6));
|
|
|
|
expectPixelFilled(50, 50);
|
|
expectPixelFilled(55, 55);
|
|
expectPixelFilled(59, 59);
|
|
expectPixelFilled(60, 60);
|
|
expectPixelFilled(69, 69);
|
|
expectPixelUnfilled(70, 70);
|
|
expectPixelUnfilled(0, 0);
|
|
expectPixelUnfilled(80, 80);
|
|
tearDownFunc();
|
|
}
|
|
|
|
Future testDataUrlWithNineParams() async {
|
|
setupFunc();
|
|
|
|
video = new VideoElement();
|
|
canvas = new CanvasElement();
|
|
|
|
video.onError.listen((_) {
|
|
throw ('URL failed to load.');
|
|
});
|
|
|
|
if (video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') {
|
|
video.src = webmVideoDataUrl;
|
|
} else if (video.canPlayType(
|
|
'video/mp4; codecs="avc1.4D401E, mp4a.40.2"', null) !=
|
|
'') {
|
|
video.src = mp4VideoDataUrl;
|
|
} else {
|
|
// TODO(amouravski): Better fallback?
|
|
window.console.log('Video is not supported on this system.');
|
|
}
|
|
|
|
video.loop = true;
|
|
video.muted = true;
|
|
video.autoplay = true;
|
|
await video.play();
|
|
context.drawImageToRect(video, new Rectangle(50, 50, 20, 20),
|
|
sourceRect: new Rectangle(2, 2, 6, 6));
|
|
|
|
expectPixelFilled(50, 50);
|
|
expectPixelFilled(55, 55);
|
|
expectPixelFilled(59, 59);
|
|
expectPixelFilled(60, 60);
|
|
expectPixelFilled(69, 69);
|
|
expectPixelUnfilled(70, 70);
|
|
expectPixelUnfilled(0, 0);
|
|
expectPixelUnfilled(80, 80);
|
|
tearDownFunc();
|
|
}
|
|
|
|
main() {
|
|
asyncTest(() async {
|
|
await testWithThreeParams();
|
|
await testWithFiveParams();
|
|
await testWithNineParams();
|
|
await testDataUrlWithNineParams();
|
|
});
|
|
}
|