Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: pkg/web_components/lib/platform.concat.js

Issue 617483002: update platform.js to get memory leak fixes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « pkg/web_components/lib/platform.js ('k') | pkg/web_components/lib/platform.concat.js.map » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /** 1 /**
2 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved. 2 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
3 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt 3 * This code may only be used under the BSD style license found at http://polyme r.github.io/LICENSE.txt
4 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt 4 * The complete set of authors may be found at http://polymer.github.io/AUTHORS. txt
5 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt 5 * The complete set of contributors may be found at http://polymer.github.io/CON TRIBUTORS.txt
6 * Code distributed by Google as part of the polymer project is also 6 * Code distributed by Google as part of the polymer project is also
7 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt 7 * subject to an additional IP rights grant found at http://polymer.github.io/PA TENTS.txt
8 */ 8 */
9 9
10 window.Platform = window.Platform || {}; 10 window.Platform = window.Platform || {};
(...skipping 2299 matching lines...) Expand 10 before | Expand all | Expand 10 after
2310 'use strict'; 2310 'use strict';
2311 2311
2312 var setEndOfMicrotask = scope.setEndOfMicrotask 2312 var setEndOfMicrotask = scope.setEndOfMicrotask
2313 var wrapIfNeeded = scope.wrapIfNeeded 2313 var wrapIfNeeded = scope.wrapIfNeeded
2314 var wrappers = scope.wrappers; 2314 var wrappers = scope.wrappers;
2315 2315
2316 var registrationsTable = new WeakMap(); 2316 var registrationsTable = new WeakMap();
2317 var globalMutationObservers = []; 2317 var globalMutationObservers = [];
2318 var isScheduled = false; 2318 var isScheduled = false;
2319 2319
2320 function scheduleCallback() { 2320 function scheduleCallback(observer) {
2321 if (observer.scheduled_)
2322 return;
2323
2324 observer.scheduled_ = true;
2325 globalMutationObservers.push(observer);
2326
2321 if (isScheduled) 2327 if (isScheduled)
2322 return; 2328 return;
2323 setEndOfMicrotask(notifyObservers); 2329 setEndOfMicrotask(notifyObservers);
2324 isScheduled = true; 2330 isScheduled = true;
2325 } 2331 }
2326 2332
2327 // http://dom.spec.whatwg.org/#mutation-observers 2333 // http://dom.spec.whatwg.org/#mutation-observers
2328 function notifyObservers() { 2334 function notifyObservers() {
2329 isScheduled = false; 2335 isScheduled = false;
2330 2336
2331 while (globalMutationObservers.length) { 2337 while (globalMutationObservers.length) {
2332 var notifyList = globalMutationObservers; 2338 var notifyList = globalMutationObservers;
2333 globalMutationObservers = []; 2339 globalMutationObservers = [];
2334 2340
2335 // Deliver changes in birth order of the MutationObservers. 2341 // Deliver changes in birth order of the MutationObservers.
2336 notifyList.sort(function(x, y) { return x.uid_ - y.uid_; }); 2342 notifyList.sort(function(x, y) { return x.uid_ - y.uid_; });
2337 2343
2338 for (var i = 0; i < notifyList.length; i++) { 2344 for (var i = 0; i < notifyList.length; i++) {
2339 var mo = notifyList[i]; 2345 var mo = notifyList[i];
2346 mo.scheduled_ = false;
2340 var queue = mo.takeRecords(); 2347 var queue = mo.takeRecords();
2341 removeTransientObserversFor(mo); 2348 removeTransientObserversFor(mo);
2342 if (queue.length) { 2349 if (queue.length) {
2343 mo.callback_(queue, mo); 2350 mo.callback_(queue, mo);
2344 } 2351 }
2345 } 2352 }
2346 } 2353 }
2347 } 2354 }
2348 2355
2349 2356
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2445 // true, or type is "characterData" and options's characterDataOldValue 2452 // true, or type is "characterData" and options's characterDataOldValue
2446 // is true, set the paired string of registered observer's observer in 2453 // is true, set the paired string of registered observer's observer in
2447 // interested observers to oldValue. 2454 // interested observers to oldValue.
2448 if (type === 'attributes' && options.attributeOldValue || 2455 if (type === 'attributes' && options.attributeOldValue ||
2449 type === 'characterData' && options.characterDataOldValue) { 2456 type === 'characterData' && options.characterDataOldValue) {
2450 associatedStrings[observer.uid_] = data.oldValue; 2457 associatedStrings[observer.uid_] = data.oldValue;
2451 } 2458 }
2452 } 2459 }
2453 } 2460 }
2454 2461
2455 var anyObserversEnqueued = false;
2456
2457 // 4. 2462 // 4.
2458 for (var uid in interestedObservers) { 2463 for (var uid in interestedObservers) {
2459 var observer = interestedObservers[uid]; 2464 var observer = interestedObservers[uid];
2460 var record = new MutationRecord(type, target); 2465 var record = new MutationRecord(type, target);
2461 2466
2462 // 2. 2467 // 2.
2463 if ('name' in data && 'namespace' in data) { 2468 if ('name' in data && 'namespace' in data) {
2464 record.attributeName = data.name; 2469 record.attributeName = data.name;
2465 record.attributeNamespace = data.namespace; 2470 record.attributeNamespace = data.namespace;
2466 } 2471 }
(...skipping 12 matching lines...) Expand all
2479 2484
2480 // 6. 2485 // 6.
2481 if (data.nextSibling) 2486 if (data.nextSibling)
2482 record.nextSibling = data.nextSibling; 2487 record.nextSibling = data.nextSibling;
2483 2488
2484 // 7. 2489 // 7.
2485 if (associatedStrings[uid] !== undefined) 2490 if (associatedStrings[uid] !== undefined)
2486 record.oldValue = associatedStrings[uid]; 2491 record.oldValue = associatedStrings[uid];
2487 2492
2488 // 8. 2493 // 8.
2489 if (!observer.records_.length) { 2494 scheduleCallback(observer);
2490 globalMutationObservers.push(observer);
2491 anyObserversEnqueued = true;
2492 }
2493 observer.records_.push(record); 2495 observer.records_.push(record);
2494 } 2496 }
2495
2496 if (anyObserversEnqueued)
2497 scheduleCallback();
2498 } 2497 }
2499 2498
2500 var slice = Array.prototype.slice; 2499 var slice = Array.prototype.slice;
2501 2500
2502 /** 2501 /**
2503 * @param {!Object} options 2502 * @param {!Object} options
2504 * @constructor 2503 * @constructor
2505 */ 2504 */
2506 function MutationObserverOptions(options) { 2505 function MutationObserverOptions(options) {
2507 this.childList = !!options.childList; 2506 this.childList = !!options.childList;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2550 /** 2549 /**
2551 * The class that maps to the DOM MutationObserver interface. 2550 * The class that maps to the DOM MutationObserver interface.
2552 * @param {Function} callback. 2551 * @param {Function} callback.
2553 * @constructor 2552 * @constructor
2554 */ 2553 */
2555 function MutationObserver(callback) { 2554 function MutationObserver(callback) {
2556 this.callback_ = callback; 2555 this.callback_ = callback;
2557 this.nodes_ = []; 2556 this.nodes_ = [];
2558 this.records_ = []; 2557 this.records_ = [];
2559 this.uid_ = ++uidCounter; 2558 this.uid_ = ++uidCounter;
2559 this.scheduled_ = false;
2560 } 2560 }
2561 2561
2562 MutationObserver.prototype = { 2562 MutationObserver.prototype = {
2563 constructor: MutationObserver, 2563 constructor: MutationObserver,
2564 2564
2565 // http://dom.spec.whatwg.org/#dom-mutationobserver-observe 2565 // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
2566 observe: function(target, options) { 2566 observe: function(target, options) {
2567 target = wrapIfNeeded(target); 2567 target = wrapIfNeeded(target);
2568 2568
2569 var newOptions = new MutationObserverOptions(options); 2569 var newOptions = new MutationObserverOptions(options);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2635 * Adds a transient observer on node. The transient observer gets removed 2635 * Adds a transient observer on node. The transient observer gets removed
2636 * next time we deliver the change records. 2636 * next time we deliver the change records.
2637 * @param {Node} node 2637 * @param {Node} node
2638 */ 2638 */
2639 addTransientObserver: function(node) { 2639 addTransientObserver: function(node) {
2640 // Don't add transient observers on the target itself. We already have all 2640 // Don't add transient observers on the target itself. We already have all
2641 // the required listeners set up on the target. 2641 // the required listeners set up on the target.
2642 if (node === this.target) 2642 if (node === this.target)
2643 return; 2643 return;
2644 2644
2645 // Make sure we remove transient observers at the end of microtask, even
2646 // if we didn't get any change records.
2647 scheduleCallback(this.observer);
2648
2645 this.transientObservedNodes.push(node); 2649 this.transientObservedNodes.push(node);
2646 var registrations = registrationsTable.get(node); 2650 var registrations = registrationsTable.get(node);
2647 if (!registrations) 2651 if (!registrations)
2648 registrationsTable.set(node, registrations = []); 2652 registrationsTable.set(node, registrations = []);
2649 2653
2650 // We know that registrations does not contain this because we already 2654 // We know that registrations does not contain this because we already
2651 // checked if node === this.target. 2655 // checked if node === this.target.
2652 registrations.push(this); 2656 registrations.push(this);
2653 }, 2657 },
2654 2658
(...skipping 8711 matching lines...) Expand 10 before | Expand all | Expand 10 after
11366 // watch all unwatched roots... 11370 // watch all unwatched roots...
11367 var root = node.shadowRoot; 11371 var root = node.shadowRoot;
11368 while (root) { 11372 while (root) {
11369 watchRoot(root); 11373 watchRoot(root);
11370 root = root.olderShadowRoot; 11374 root = root.olderShadowRoot;
11371 } 11375 }
11372 } 11376 }
11373 } 11377 }
11374 11378
11375 function watchRoot(root) { 11379 function watchRoot(root) {
11376 if (!root.__watched) { 11380 observe(root);
11377 observe(root);
11378 root.__watched = true;
11379 }
11380 } 11381 }
11381 11382
11382 function handler(mutations) { 11383 function handler(mutations) {
11383 // 11384 //
11384 if (logFlags.dom) { 11385 if (logFlags.dom) {
11385 var mx = mutations[0]; 11386 var mx = mutations[0];
11386 if (mx && mx.type === 'childList' && mx.addedNodes) { 11387 if (mx && mx.type === 'childList' && mx.addedNodes) {
11387 if (mx.addedNodes) { 11388 if (mx.addedNodes) {
11388 var d = mx.addedNodes[0]; 11389 var d = mx.addedNodes[0];
11389 while (d && d !== document && !d.host) { 11390 while (d && d !== document && !d.host) {
(...skipping 24 matching lines...) Expand all
11414 return; 11415 return;
11415 } 11416 }
11416 removedNode(n); 11417 removedNode(n);
11417 }); 11418 });
11418 } 11419 }
11419 //logFlags.dom && console.groupEnd(); 11420 //logFlags.dom && console.groupEnd();
11420 }); 11421 });
11421 logFlags.dom && console.groupEnd(); 11422 logFlags.dom && console.groupEnd();
11422 }; 11423 };
11423 11424
11424 var observer = new MutationObserver(handler); 11425 function takeRecords(node) {
11426 // If the optional node is not supplied, assume we mean the whole document.
11427 if (node === undefined) node = document;
11425 11428
11426 function takeRecords() { 11429 // Find the root of the tree, which will be an Document or ShadowRoot.
11427 // TODO(sjmiles): ask Raf why we have to call handler ourselves 11430 while (node.parentNode) {
11428 handler(observer.takeRecords()); 11431 node = node.parentNode;
11429 takeMutations(); 11432 }
11433
11434 var observer = node.__observer;
11435 if (observer) {
11436 handler(observer.takeRecords());
11437 takeMutations();
11438 }
11430 } 11439 }
11431 11440
11432 var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach); 11441 var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
11433 11442
11434 function observe(inRoot) { 11443 function observe(inRoot) {
11444 if (inRoot.__observer) return;
11445
11446 // For each ShadowRoot, we create a new MutationObserver, so the root can be
11447 // garbage collected once all references to the `inRoot` node are gone.
11448 var observer = new MutationObserver(handler);
11435 observer.observe(inRoot, {childList: true, subtree: true}); 11449 observer.observe(inRoot, {childList: true, subtree: true});
11450 inRoot.__observer = observer;
11436 } 11451 }
11437 11452
11438 function observeDocument(doc) { 11453 function observeDocument(doc) {
11439 observe(doc); 11454 observe(doc);
11440 } 11455 }
11441 11456
11442 function upgradeDocument(doc) { 11457 function upgradeDocument(doc) {
11443 logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').po p()); 11458 logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').po p());
11444 addedNode(doc); 11459 addedNode(doc);
11445 logFlags.dom && console.groupEnd(); 11460 logFlags.dom && console.groupEnd();
(...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after
12330 // exports 12345 // exports
12331 12346
12332 scope.marshal = marshal; 12347 scope.marshal = marshal;
12333 // `module` confuses commonjs detectors 12348 // `module` confuses commonjs detectors
12334 scope.modularize = module; 12349 scope.modularize = module;
12335 scope.using = using; 12350 scope.using = using;
12336 12351
12337 })(window); 12352 })(window);
12338 12353
12339 //# sourceMappingURL=platform.concat.js.map 12354 //# sourceMappingURL=platform.concat.js.map
OLDNEW
« no previous file with comments | « pkg/web_components/lib/platform.js ('k') | pkg/web_components/lib/platform.concat.js.map » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698