31c524cdca
BUG= http://dartbug.com/21583 R=sigmund@google.com Review URL: https://codereview.chromium.org//723393003 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@42114 260f80e4-7a28-3924-810f-c04153c831b5
98 lines
2.9 KiB
JavaScript
98 lines
2.9 KiB
JavaScript
/*
|
|
* 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);
|
|
|