| <!DOCTYPE html> |
| <title>Test media preloading behaviour with different conditions.</title> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script src="../../media-resources/media-file.js"></script> |
| <script> |
| var tests = [ |
| { |
| name: 'regular conditions', |
| conditions: { |
| dataSaver: false, |
| cellular: false, |
| lowEndDevice: false, |
| }, |
| expectations: { |
| default: 'metadata', |
| allowed: [ 'none', 'metadata', 'auto' ] |
| } |
| }, |
| { |
| name: 'cellular connections', |
| conditions: { |
| dataSaver: false, |
| cellular: true, |
| lowEndDevice: false, |
| }, |
| expectations: { |
| default: 'metadata', |
| allowed: [ 'none', 'metadata' ] |
| } |
| }, |
| { |
| name: 'cellular connections with Data Saver', |
| conditions: { |
| dataSaver: true, |
| cellular: true, |
| lowEndDevice: false, |
| }, |
| expectations: { |
| default: 'none', |
| allowed: [ 'none' ] |
| } |
| }, |
| { |
| name: 'Data Saver', |
| conditions: { |
| dataSaver: true, |
| cellular: false, |
| lowEndDevice: false, |
| }, |
| expectations: { |
| default: 'none', |
| allowed: [ 'none' ] |
| } |
| }, |
| { |
| name: 'low end device', |
| conditions: { |
| dataSaver: false, |
| cellular: false, |
| lowEndDevice: true, |
| }, |
| expectations: { |
| default: 'none', |
| allowed: [ 'none' ] |
| } |
| }, |
| ]; |
| |
| function checkPreloadAttribute(media, value, expected) { |
| // Use IDL attribute. |
| media.removeAttribute("preload"); |
| media.preload = value; |
| assert_equals(media.getAttribute("preload"), value); |
| assert_equals(media.preload, expected); |
| |
| // Use. content attribute. |
| media.removeAttribute("preload"); |
| media.setAttribute("preload", value); |
| assert_equals(media.preload, expected); |
| assert_equals(media.getAttribute("preload"), value); |
| } |
| |
| var asyncTests = tests.map(test => async_test('Testing autoplay behaviour for ' + test.name)); |
| |
| var currentTest = 0; |
| function runNextTest() { |
| asyncTests[currentTest].done(); |
| |
| ++currentTest; |
| if (currentTest == tests.length) |
| return; |
| |
| asyncTests[currentTest].step_func(runTest(asyncTests[currentTest], tests[currentTest])); |
| } |
| |
| function runTest(t, test) { |
| // Sanity checks for 'conditions'. |
| assert_true('dataSaver' in test.conditions); |
| assert_true('cellular' in test.conditions); |
| assert_true('lowEndDevice' in test.conditions); |
| |
| internals.setSaveDataEnabled(test.conditions.dataSaver); |
| if (test.conditions.cellular) |
| internals.setNetworkConnectionInfoOverride(true, 'cellular3g', 2.0); |
| else |
| internals.setNetworkConnectionInfoOverride(true, 'wifi', 2.0); |
| internals.settings.setForcePreloadNoneForMediaElements(test.conditions.lowEndDevice); |
| |
| t.add_cleanup(() => { |
| internals.setSaveDataEnabled(false); |
| internals.clearNetworkConnectionInfoOverride(); |
| internals.settings.setForcePreloadNoneForMediaElements(false); |
| }); |
| |
| var media = document.createElement('video'); |
| |
| // Test IDL without any value. |
| assert_equals(media.preload, test.expectations.default); |
| assert_false(media.hasAttribute('preload')); |
| |
| // Test allowed values. |
| [ 'none', 'metadata', 'auto' ].forEach(t.step_func(preload => { |
| var expected = test.expectations.allowed.includes(preload) ? preload : test.expectations.default; |
| checkPreloadAttribute(media, preload, expected); |
| })); |
| |
| // Test not allowed values. |
| [ 'default', 'foo' ].forEach(preload => { |
| checkPreloadAttribute(media, preload, test.expectations.default); |
| }); |
| |
| // Test loading events. |
| var expectedLoading = 4; |
| [ '', 'none', 'metadata', 'auto' ].forEach(preload => { |
| var media = document.createElement('video'); |
| media.preload = preload; |
| media.src = findMediaFile('video', 'resources/test'); |
| assert_equals(media.readyState, HTMLMediaElement.HAVE_NOTHING); |
| |
| switch (media.preload) { |
| case 'none': |
| media.onloadedmetadata = t.unreached_func(); |
| media.onprogress = t.unreached_func(); |
| |
| media.onsuspend = t.step_func(_ => { |
| assert_equals(media.readyState, HTMLMediaElement.HAVE_NOTHING); |
| --expectedLoading; |
| if (expectedLoading == 0) |
| runNextTest(); |
| }); |
| break; |
| case 'metadata': |
| media.onloadedmetadata = t.step_func(_ => { |
| assert_equals(media.readyState, HTMLMediaElement.HAVE_METADATA); |
| --expectedLoading; |
| if (expectedLoading == 0) |
| runNextTest(); |
| }); |
| break; |
| case 'auto': |
| if (media.readyState == HTMLMediaElement.HAVE_ENOUGH_DATA) { |
| --expectedLoading; |
| break; |
| } |
| |
| media.oncanplaythrough = t.step_func(_ => { |
| assert_equals(media.readyState, HTMLMediaElement.HAVE_ENOUGH_DATA); |
| --expectedLoading; |
| if (expectedLoading == 0) |
| runNextTest(); |
| }); |
| break; |
| } |
| }); |
| } |
| |
| asyncTests[currentTest].step_func(runTest(asyncTests[currentTest], tests[currentTest])); |
| |
| </script> |