@@ -120,16 +120,14 @@ void main() {
120
120
controllerCompleter.complete (controller);
121
121
},
122
122
javascriptMode: JavascriptMode .unrestricted,
123
- // TODO(iskakaushik): Remove this when collection literals makes it to stable.
124
- // ignore: prefer_collection_literals
125
- javascriptChannels: < JavascriptChannel > [
123
+ javascriptChannels: < JavascriptChannel > {
126
124
JavascriptChannel (
127
125
name: 'Echo' ,
128
126
onMessageReceived: (JavascriptMessage message) {
129
127
messagesReceived.add (message.message);
130
128
},
131
129
),
132
- ]. toSet () ,
130
+ } ,
133
131
onPageStarted: (String url) {
134
132
pageStarted.complete (null );
135
133
},
@@ -180,16 +178,14 @@ void main() {
180
178
onWebViewCreated: (WebViewController controller) {
181
179
controllerCompleter.complete (controller);
182
180
},
183
- // TODO(iskakaushik): Remove this when collection literals makes it to stable.
184
- // ignore: prefer_collection_literals
185
- javascriptChannels: < JavascriptChannel > [
181
+ javascriptChannels: < JavascriptChannel > {
186
182
JavascriptChannel (
187
183
name: 'Resize' ,
188
184
onMessageReceived: (JavascriptMessage message) {
189
185
resizeCompleter.complete (true );
190
186
},
191
187
),
192
- ]. toSet () ,
188
+ } ,
193
189
onPageStarted: (String url) {
194
190
pageStarted.complete (null );
195
191
},
@@ -327,7 +323,218 @@ void main() {
327
323
expect (customUserAgent2, defaultPlatformUserAgent);
328
324
});
329
325
330
- group ('Media playback policy' , () {
326
+ group ('Video playback policy' , () {
327
+ String videoTestBase64;
328
+ setUpAll (() async {
329
+ final ByteData videoData =
330
+ await rootBundle.load ('assets/sample_video.mp4' );
331
+ final String base64VideoData =
332
+ base64Encode (Uint8List .view (videoData.buffer));
333
+ final String videoTest = '''
334
+ <!DOCTYPE html><html>
335
+ <head><title>Video auto play</title>
336
+ <script type="text/javascript">
337
+ function play() {
338
+ var video = document.getElementById("video");
339
+ video.play();
340
+ }
341
+ function isPaused() {
342
+ var video = document.getElementById("video");
343
+ return video.paused;
344
+ }
345
+ function isFullScreen() {
346
+ var video = document.getElementById("video");
347
+ return video.webkitDisplayingFullscreen;
348
+ }
349
+ </script>
350
+ </head>
351
+ <body onload="play();">
352
+ <video controls playsinline autoplay id="video">
353
+ <source src="data:video/mp4;charset=utf-8;base64,$base64VideoData ">
354
+ </video>
355
+ </body>
356
+ </html>
357
+ ''' ;
358
+ videoTestBase64 = base64Encode (const Utf8Encoder ().convert (videoTest));
359
+ });
360
+
361
+ test ('Auto media playback' , () async {
362
+ Completer <WebViewController > controllerCompleter =
363
+ Completer <WebViewController >();
364
+ Completer <void > pageLoaded = Completer <void >();
365
+
366
+ await pumpWidget (
367
+ Directionality (
368
+ textDirection: TextDirection .ltr,
369
+ child: WebView (
370
+ key: GlobalKey (),
371
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
372
+ onWebViewCreated: (WebViewController controller) {
373
+ controllerCompleter.complete (controller);
374
+ },
375
+ javascriptMode: JavascriptMode .unrestricted,
376
+ onPageFinished: (String url) {
377
+ pageLoaded.complete (null );
378
+ },
379
+ initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy .always_allow,
380
+ ),
381
+ ),
382
+ );
383
+ WebViewController controller = await controllerCompleter.future;
384
+ await pageLoaded.future;
385
+
386
+ String isPaused = await controller.evaluateJavascript ('isPaused();' );
387
+ expect (isPaused, _webviewBool (false ));
388
+
389
+ controllerCompleter = Completer <WebViewController >();
390
+ pageLoaded = Completer <void >();
391
+
392
+ // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy
393
+ await pumpWidget (
394
+ Directionality (
395
+ textDirection: TextDirection .ltr,
396
+ child: WebView (
397
+ key: GlobalKey (),
398
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
399
+ onWebViewCreated: (WebViewController controller) {
400
+ controllerCompleter.complete (controller);
401
+ },
402
+ javascriptMode: JavascriptMode .unrestricted,
403
+ onPageFinished: (String url) {
404
+ pageLoaded.complete (null );
405
+ },
406
+ initialMediaPlaybackPolicy:
407
+ AutoMediaPlaybackPolicy .require_user_action_for_all_media_types,
408
+ ),
409
+ ),
410
+ );
411
+
412
+ controller = await controllerCompleter.future;
413
+ await pageLoaded.future;
414
+
415
+ isPaused = await controller.evaluateJavascript ('isPaused();' );
416
+ expect (isPaused, _webviewBool (true ));
417
+ });
418
+
419
+ test ('Changes to initialMediaPlaybackPolicy are ignored' , () async {
420
+ final Completer <WebViewController > controllerCompleter =
421
+ Completer <WebViewController >();
422
+ Completer <void > pageLoaded = Completer <void >();
423
+
424
+ final GlobalKey key = GlobalKey ();
425
+ await pumpWidget (
426
+ Directionality (
427
+ textDirection: TextDirection .ltr,
428
+ child: WebView (
429
+ key: key,
430
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
431
+ onWebViewCreated: (WebViewController controller) {
432
+ controllerCompleter.complete (controller);
433
+ },
434
+ javascriptMode: JavascriptMode .unrestricted,
435
+ onPageFinished: (String url) {
436
+ pageLoaded.complete (null );
437
+ },
438
+ initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy .always_allow,
439
+ ),
440
+ ),
441
+ );
442
+ final WebViewController controller = await controllerCompleter.future;
443
+ await pageLoaded.future;
444
+
445
+ String isPaused = await controller.evaluateJavascript ('isPaused();' );
446
+ expect (isPaused, _webviewBool (false ));
447
+
448
+ pageLoaded = Completer <void >();
449
+
450
+ await pumpWidget (
451
+ Directionality (
452
+ textDirection: TextDirection .ltr,
453
+ child: WebView (
454
+ key: key,
455
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
456
+ onWebViewCreated: (WebViewController controller) {
457
+ controllerCompleter.complete (controller);
458
+ },
459
+ javascriptMode: JavascriptMode .unrestricted,
460
+ onPageFinished: (String url) {
461
+ pageLoaded.complete (null );
462
+ },
463
+ initialMediaPlaybackPolicy:
464
+ AutoMediaPlaybackPolicy .require_user_action_for_all_media_types,
465
+ ),
466
+ ),
467
+ );
468
+
469
+ await controller.reload ();
470
+
471
+ await pageLoaded.future;
472
+
473
+ isPaused = await controller.evaluateJavascript ('isPaused();' );
474
+ expect (isPaused, _webviewBool (false ));
475
+ });
476
+
477
+ test ('Video plays inline when allowsInlineMediaPlayback is true' , () async {
478
+ Completer <WebViewController > controllerCompleter =
479
+ Completer <WebViewController >();
480
+ Completer <void > pageLoaded = Completer <void >();
481
+
482
+ await pumpWidget (
483
+ Directionality (
484
+ textDirection: TextDirection .ltr,
485
+ child: WebView (
486
+ key: GlobalKey (),
487
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
488
+ onWebViewCreated: (WebViewController controller) {
489
+ controllerCompleter.complete (controller);
490
+ },
491
+ javascriptMode: JavascriptMode .unrestricted,
492
+ onPageFinished: (String url) {
493
+ pageLoaded.complete (null );
494
+ },
495
+ initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy .always_allow,
496
+ allowsInlineMediaPlayback: true ,
497
+ ),
498
+ ),
499
+ );
500
+ WebViewController controller = await controllerCompleter.future;
501
+ await pageLoaded.future;
502
+
503
+ String isFullScreen =
504
+ await controller.evaluateJavascript ('isFullScreen();' );
505
+ expect (isFullScreen, _webviewBool (false ));
506
+
507
+ controllerCompleter = Completer <WebViewController >();
508
+ pageLoaded = Completer <void >();
509
+
510
+ await pumpWidget (
511
+ Directionality (
512
+ textDirection: TextDirection .ltr,
513
+ child: WebView (
514
+ key: GlobalKey (),
515
+ initialUrl: 'data:text/html;charset=utf-8;base64,$videoTestBase64 ' ,
516
+ onWebViewCreated: (WebViewController controller) {
517
+ controllerCompleter.complete (controller);
518
+ },
519
+ javascriptMode: JavascriptMode .unrestricted,
520
+ onPageFinished: (String url) {
521
+ pageLoaded.complete (null );
522
+ },
523
+ initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy .always_allow,
524
+ allowsInlineMediaPlayback: false ,
525
+ ),
526
+ ),
527
+ );
528
+
529
+ controller = await controllerCompleter.future;
530
+ await pageLoaded.future;
531
+
532
+ isFullScreen = await controller.evaluateJavascript ('isFullScreen();' );
533
+ expect (isFullScreen, _webviewBool (true ));
534
+ });
535
+ });
536
+
537
+ group ('Audio playback policy' , () {
331
538
String audioTestBase64;
332
539
setUpAll (() async {
333
540
final ByteData audioData =
0 commit comments