| /* |
| * Copyright (c) 2014 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 |
| */ |
| |
| (function(scope) { |
| |
| /** |
| * @class Polymer |
| */ |
| |
| // imports |
| var endOfMicrotask = scope.endOfMicrotask; |
| |
| // logging |
| var log = window.WebComponents ? WebComponents.flags.log : {}; |
| |
| // inject style sheet |
| var style = document.createElement('style'); |
| style.textContent = 'template {display: none !important;} /* injected by platform.js */'; |
| var head = document.querySelector('head'); |
| head.insertBefore(style, head.firstChild); |
| |
| |
| /** |
| * Force any pending data changes to be observed before |
| * the next task. Data changes are processed asynchronously but are guaranteed |
| * to be processed, for example, before paintin. This method should rarely be |
| * needed. It does nothing when Object.observe is available; |
| * when Object.observe is not available, Polymer automatically flushes data |
| * changes approximately every 1/10 second. |
| * Therefore, `flush` should only be used when a data mutation should be |
| * observed sooner than this. |
| * |
| * @method flush |
| */ |
| // flush (with logging) |
| var flushing; |
| function flush() { |
| if (!flushing) { |
| flushing = true; |
| endOfMicrotask(function() { |
| flushing = false; |
| log.data && console.group('flush'); |
| Platform.performMicrotaskCheckpoint(); |
| log.data && console.groupEnd(); |
| }); |
| } |
| }; |
| |
| // polling dirty checker |
| // flush periodically if platform does not have object observe. |
| if (!Observer.hasObjectObserve) { |
| var FLUSH_POLL_INTERVAL = 125; |
| window.addEventListener('WebComponentsReady', function() { |
| flush(); |
| // watch document visiblity to toggle dirty-checking |
| var visibilityHandler = function() { |
| // only flush if the page is visibile |
| if (document.visibilityState === 'hidden') { |
| if (scope.flushPoll) { |
| clearInterval(scope.flushPoll); |
| } |
| } else { |
| scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL); |
| } |
| }; |
| if (typeof document.visibilityState === 'string') { |
| document.addEventListener('visibilitychange', visibilityHandler); |
| } |
| visibilityHandler(); |
| }); |
| } else { |
| // make flush a no-op when we have Object.observe |
| flush = function() {}; |
| } |
| |
| if (window.CustomElements && !CustomElements.useNative) { |
| var originalImportNode = Document.prototype.importNode; |
| Document.prototype.importNode = function(node, deep) { |
| var imported = originalImportNode.call(this, node, deep); |
| CustomElements.upgradeAll(imported); |
| return imported; |
| }; |
| } |
| |
| // exports |
| scope.flush = flush; |
| // bc |
| Platform.flush = flush; |
| |
| })(window.Polymer); |
| |