UNPKG

webdash-readme-preview

Version:
134 lines (119 loc) 3.93 kB
<!-- @license Copyright (c) 2017 The Polymer Project Authors. All rights reserved. This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt Code distributed by Google as part of the polymer project is also subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt --> <link rel="import" href="boot.html"> <script> (function() { 'use strict'; let scheduled = false; let beforeRenderQueue = []; let afterRenderQueue = []; function schedule() { scheduled = true; // before next render requestAnimationFrame(function() { scheduled = false; flushQueue(beforeRenderQueue); // after the render setTimeout(function() { runQueue(afterRenderQueue); }); }); } function flushQueue(queue) { while (queue.length) { callMethod(queue.shift()); } } function runQueue(queue) { for (let i=0, l=queue.length; i < l; i++) { callMethod(queue.shift()); } } function callMethod(info) { const context = info[0]; const callback = info[1]; const args = info[2]; try { callback.apply(context, args); } catch(e) { setTimeout(() => { throw e; }); } } function flush() { while (beforeRenderQueue.length || afterRenderQueue.length) { flushQueue(beforeRenderQueue); flushQueue(afterRenderQueue); } scheduled = false; } /** * Module for scheduling flushable pre-render and post-render tasks. * * @namespace * @memberof Polymer * @summary Module for scheduling flushable pre-render and post-render tasks. */ Polymer.RenderStatus = { /** * Enqueues a callback which will be run before the next render, at * `requestAnimationFrame` timing. * * This method is useful for enqueuing work that requires DOM measurement, * since measurement may not be reliable in custom element callbacks before * the first render, as well as for batching measurement tasks in general. * * Tasks in this queue may be flushed by calling `Polymer.RenderStatus.flush()`. * * @memberof Polymer.RenderStatus * @param {*} context Context object the callback function will be bound to * @param {function(...*):void} callback Callback function * @param {!Array=} args An array of arguments to call the callback function with * @return {void} */ beforeNextRender: function(context, callback, args) { if (!scheduled) { schedule(); } beforeRenderQueue.push([context, callback, args]); }, /** * Enqueues a callback which will be run after the next render, equivalent * to one task (`setTimeout`) after the next `requestAnimationFrame`. * * This method is useful for tuning the first-render performance of an * element or application by deferring non-critical work until after the * first paint. Typical non-render-critical work may include adding UI * event listeners and aria attributes. * * @memberof Polymer.RenderStatus * @param {*} context Context object the callback function will be bound to * @param {function(...*):void} callback Callback function * @param {!Array=} args An array of arguments to call the callback function with * @return {void} */ afterNextRender: function(context, callback, args) { if (!scheduled) { schedule(); } afterRenderQueue.push([context, callback, args]); }, /** * Flushes all `beforeNextRender` tasks, followed by all `afterNextRender` * tasks. * * @memberof Polymer.RenderStatus * @return {void} */ flush: flush }; })(); </script>