| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| <link rel="import" href="/tracing/base/base.html"> |
| |
| <script> |
| 'use strict'; |
| |
| /** |
| * @fileoverview Helper code for working with Polymer. |
| */ |
| tr.exportTo('tr.ui.b', function() { |
| |
| Object.observe(Polymer.elements, clearPolymerElementCaches); |
| |
| var elementsByName = undefined; |
| var elementsThatExtend = undefined; |
| var elementSubclasses = undefined; |
| function clearPolymerElementCaches() { |
| elementsByName = {}; |
| elementsThatExtend = undefined; |
| elementSubclasses = {}; |
| } |
| |
| function buildElementMapsIfNeeded() { |
| if (elementsThatExtend !== undefined && elementsByName !== undefined) |
| return; |
| elementsByName = {}; |
| elementsThatExtend = {}; |
| Polymer.elements.forEach(function(element) { |
| if (elementsByName[element.name]) |
| throw new Error('Something is strange: dupe polymer element names'); |
| |
| elementsByName[element.name] = element; |
| |
| if (element.extends) { |
| if (elementsThatExtend[element.extends] === undefined) |
| elementsThatExtend[element.extends] = []; |
| elementsThatExtend[element.extends].push(element.name); |
| } |
| }); |
| } |
| |
| function getPolymerElementNamed(tagName) { |
| buildElementMapsIfNeeded(); |
| return elementsByName[tagName]; |
| } |
| |
| function getPolymerElementsThatSubclass(tagName) { |
| if (Polymer.waitingFor().length) { |
| throw new Error('There are unresolved polymer elements. ' + |
| 'Wait until Polymer.whenReady'); |
| } |
| |
| buildElementMapsIfNeeded(); |
| |
| var element = getPolymerElementNamed(tagName); |
| if (!element) |
| throw new Error(tagName + ' is not a polymer element'); |
| |
| if (elementSubclasses === undefined) |
| elementSubclasses = {}; |
| |
| if (elementSubclasses[tagName] === undefined) { |
| var immediateSubElements = elementsThatExtend[element.name]; |
| var allSubElements = []; |
| if (immediateSubElements !== undefined && immediateSubElements.length) { |
| immediateSubElements.forEach(function(subElement) { |
| allSubElements.push(subElement); |
| allSubElements.push.apply( |
| allSubElements, getPolymerElementsThatSubclass(subElement)); |
| }); |
| } |
| elementSubclasses[tagName] = allSubElements; |
| } |
| return elementSubclasses[tagName]; |
| } |
| |
| return { |
| getPolymerElementNamed: getPolymerElementNamed, |
| getPolymerElementsThatSubclass: getPolymerElementsThatSubclass |
| }; |
| }); |
| </script> |