| <!DOCTYPE html> |
| <title>Task and Microtask Ordering </title> |
| <link rel=author title="Joshua Bell" href="mailto:jsbell@google.com"> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#event-loops"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/common.js"></script> |
| <style> |
| .inner { padding: 46px; width: 0; margin: 0 auto; background: #d4d4d4; } |
| .outer { padding: 25px; width: 92px; background: #f1f1f1; } |
| </style> |
| |
| <p>Click on the inner box:</p> |
| <div class="outer"> |
| <div class="inner"></div> |
| </div> |
| |
| <script> |
| |
| // Based on: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ |
| |
| log_test(function(t, log) { |
| // Let's get hold of those elements |
| var outer = document.querySelector('.outer'); |
| var inner = document.querySelector('.inner'); |
| |
| // Let's listen for attribute changes on the |
| // outer element |
| new MutationObserver(function() { |
| log('mutate'); |
| }).observe(outer, { |
| attributes: true |
| }); |
| |
| // Here's a click listener... |
| function onClick() { |
| log('click'); |
| |
| setTimeout(function() { |
| log('timeout'); |
| }, 0); |
| |
| Promise.resolve().then(function() { |
| log('promise'); |
| }); |
| |
| outer.setAttribute('data-random', Math.random()); |
| } |
| |
| // ...which we'll attach to both elements |
| inner.addEventListener('click', onClick); |
| outer.addEventListener('click', onClick); |
| }, [ |
| 'click', |
| 'promise', |
| 'mutate', |
| 'click', |
| 'promise', |
| 'mutate', |
| 'timeout', |
| 'timeout' |
| ], 'Level 1 bossfight (manual click)'); |
| |
| </script> |