Files
polymer/lib/utils/render-status.js
Peter Burns 658d1cf742 Fix a grab bag of closure compiler warnings.
This fixes all warnings in about half of the remaining files with warnings.
2018-08-16 14:23:55 -07:00

119 lines
3.3 KiB
JavaScript

/**
@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
*/
/**
* Module for scheduling flushable pre-render and post-render tasks.
*
* @summary Module for scheduling flushable pre-render and post-render tasks.
*/
import './boot.js';
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;
});
}
}
/**
* Flushes all `beforeNextRender` tasks, followed by all `afterNextRender`
* tasks.
*
* @return {void}
*/
export function flush() {
while (beforeRenderQueue.length || afterRenderQueue.length) {
flushQueue(beforeRenderQueue);
flushQueue(afterRenderQueue);
}
scheduled = false;
}
/**
* 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 `flush()`.
*
* @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}
*/
export function beforeNextRender(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.
*
* @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}
*/
export function afterNextRender(context, callback, args) {
if (!scheduled) {
schedule();
}
afterRenderQueue.push([context, callback, args]);
}