image-decode-path-changes.html (4826B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>HTMLImageElement.prototype.decode(), src/srcset mutation tests.</title> 5 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org"> 6 <link rel=help href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-decode"> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 10 <script> 11 "use strict"; 12 13 // src tests 14 // ------------------- 15 promise_test(function(t) { 16 var img = new Image(); 17 img.src = "/images/green.png?image-decode-path-changes-1"; 18 var promise = img.decode(); 19 img.src = "/images/green.svg?image-decode-path-changes-1"; 20 return promise_rejects_dom(t, "EncodingError", promise); 21 }, document.title + " src changes fail decode."); 22 23 promise_test(function(t) { 24 var img = new Image(); 25 img.src = "/images/green.png?image-decode-path-changes-2"; 26 var first_promise = img.decode(); 27 img.src = "/images/blue.png?image-decode-path-changes-2"; 28 var second_promise = img.decode(); 29 assert_not_equals(first_promise, second_promise); 30 return Promise.all([ 31 promise_rejects_dom(t, "EncodingError", first_promise), 32 second_promise 33 ]); 34 }, document.title + " src changes fail decode; following good png decode succeeds."); 35 36 promise_test(function(t) { 37 var img = new Image(); 38 img.src = "/images/green.png?image-decode-path-changes-3"; 39 var first_promise = img.decode(); 40 img.src = "/images/green.svg?image-decode-path-changes-3"; 41 var second_promise = img.decode(); 42 assert_not_equals(first_promise, second_promise); 43 return Promise.all([ 44 promise_rejects_dom(t, "EncodingError", first_promise), 45 second_promise 46 ]); 47 }, document.title + " src changes fail decode; following good svg decode succeeds."); 48 49 promise_test(function(t) { 50 var img = new Image(); 51 img.src = "/images/green.png?image-decode-path-changes-4"; 52 var first_promise = img.decode(); 53 img.src = "/non/existent/path.png?image-decode-path-changes-5"; 54 var second_promise = img.decode(); 55 assert_not_equals(first_promise, second_promise); 56 return Promise.all([ 57 promise_rejects_dom(t, "EncodingError", first_promise), 58 promise_rejects_dom(t, "EncodingError", second_promise) 59 ]); 60 }, document.title + " src changes fail decode; following bad decode fails."); 61 62 promise_test(function(t) { 63 return new Promise(function(resolve, reject) { 64 var img = new Image(); 65 // We wait for an onload, since the "Updating the image data" spec states 66 // that if a new microtask is scheduled, the old one is canceled so 67 // without the onload, the first decode request would be requested when the 68 // img.src is empty. With an onload, we ensure that the img.src is set and 69 // the image exists before issuing the first decode, then we verify that the 70 // src change to the same value does not prevent that request from 71 // succeeding. 72 img.onload = t.step_func(function() { 73 img.onload = null; 74 75 var first_promise = img.decode(); 76 img.src = "/images/green.png?image-decode-path-changes-6"; 77 var second_promise = img.decode(); 78 assert_not_equals(first_promise, second_promise); 79 resolve(Promise.all([first_promise, second_promise])); 80 }); 81 img.src = "/images/green.png?image-decode-path-changes-6"; 82 }); 83 }, document.title + " src changes to the same path succeed."); 84 85 // srcset tests 86 // ------------------- 87 promise_test(function(t) { 88 var img = new Image(); 89 img.srcset = "/images/green.png?image-decode-path-changes-7 100w"; 90 var promise = img.decode(); 91 img.srcset = "/images/green.svg?image-decode-path-changes-7 100w"; 92 return promise_rejects_dom(t, "EncodingError", promise); 93 }, document.title + " srcset changes fail decode."); 94 95 promise_test(function(t) { 96 var img = new Image(); 97 img.srcset = "/images/green.png?image-decode-path-changes-8 100w"; 98 var first_promise = img.decode(); 99 img.srcset = "/images/green.svg?image-decode-path-changes-8 100w"; 100 var second_promise = img.decode(); 101 assert_not_equals(first_promise, second_promise); 102 return Promise.all([ 103 promise_rejects_dom(t, "EncodingError", first_promise), 104 second_promise 105 ]); 106 }, document.title + " srcset changes fail decode; following good decode succeeds."); 107 108 promise_test(function(t) { 109 var img = new Image(); 110 img.srcset = "/images/green.png?image-decode-path-changes-9 100w"; 111 var first_promise = img.decode(); 112 img.srcset = "/non/existent/path.png?image-decode-path-changes-9 100w"; 113 var second_promise = img.decode(); 114 assert_not_equals(first_promise, second_promise); 115 return Promise.all([ 116 promise_rejects_dom(t, "EncodingError", first_promise), 117 promise_rejects_dom(t, "EncodingError", second_promise) 118 ]); 119 }, document.title + " srcset changes fail decode; following bad decode fails."); 120 121 </script>