xgraph-adapter/Tests/WebViewer/Static/bower_components/polymer/lib/utils/render-status.html

134 lines
3.8 KiB
HTML

<!--
@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>