diff options
Diffstat (limited to 'chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html')
-rw-r--r-- | chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html new file mode 100644 index 00000000000..151f74ebc05 --- /dev/null +++ b/chromium/third_party/catapult/third_party/polymer2/bower_components/polymer/lib/utils/render-status.html @@ -0,0 +1,133 @@ +<!-- +@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> |