3 Copyright (c) 2014 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
18 /** Platform, package, object property, and Event support. */
19 this.tv = (function() {
21 console.warn('Base was multiply initialized. First init wins.');
26 * Builds an object structure for the provided namespace path,
27 * ensuring that names that already exist are not overwritten. For
29 * 'a.b.c' -> a = {};a.b={};a.b.c={};
30 * @param {string} name Name of the object that this file defines.
31 * @param {*=} opt_object The object to expose at the end of the path.
32 * @param {Object=} opt_objectToExportTo The object to add the path to;
33 * default is {@code global}.
36 function exportPath(name, opt_object, opt_objectToExportTo) {
37 var parts = name.split('.');
38 var cur = opt_objectToExportTo || global;
40 for (var part; parts.length && (part = parts.shift());) {
41 if (!parts.length && opt_object !== undefined) {
42 // last part and we have an object; use it
43 cur[part] = opt_object;
44 } else if (part in cur) {
53 var panicElement = undefined;
54 var rawPanicMessages = [];
55 function showPanicElementIfNeeded() {
59 var panicOverlay = document.createElement('div');
60 panicOverlay.style.backgroundColor = 'white';
61 panicOverlay.style.border = '3px solid red';
62 panicOverlay.style.boxSizing = 'border-box';
63 panicOverlay.style.color = 'black';
64 panicOverlay.style.display = '-webkit-flex';
65 panicOverlay.style.height = '100%';
66 panicOverlay.style.left = 0;
67 panicOverlay.style.padding = '8px';
68 panicOverlay.style.position = 'fixed';
69 panicOverlay.style.top = 0;
70 panicOverlay.style.webkitFlexDirection = 'column';
71 panicOverlay.style.width = '100%';
73 panicElement = document.createElement('div');
74 panicElement.style.webkitFlex = '1 1 auto';
75 panicElement.style.overflow = 'auto';
76 panicOverlay.appendChild(panicElement);
79 setTimeout(function() {
80 document.body.appendChild(panicOverlay);
83 document.body.appendChild(panicOverlay);
87 function showPanic(panicTitle, panicDetails) {
89 if (panicDetails instanceof Error)
90 panicDetails = panicDetails.stack;
92 showPanicElementIfNeeded();
93 var panicMessageEl = document.createElement('div');
94 panicMessageEl.innerHTML =
95 '<h2 id="message"></h2>' +
96 '<pre id="details"></pre>';
97 panicMessageEl.querySelector('#message').textContent = panicTitle;
98 panicMessageEl.querySelector('#details').textContent = panicDetails;
99 panicElement.appendChild(panicMessageEl);
101 rawPanicMessages.push({
103 details: panicDetails
107 function hasPanic() {
108 return rawPanicMessages.length !== 0;
110 function getPanicText() {
111 return rawPanicMessages.map(function(msg) {
116 function exportTo(namespace, fn) {
117 var obj = exportPath(namespace);
120 for (var propertyName in exports) {
121 // Maybe we should check the prototype chain here? The current usage
122 // pattern is always using an object literal so we only care about own
124 var propertyDescriptor = Object.getOwnPropertyDescriptor(exports,
126 if (propertyDescriptor)
127 Object.defineProperty(obj, propertyName, propertyDescriptor);
131 var pendingCallbacks = [];
132 var polymerReadyFired = false;
133 function onPolymerReady(callback) {
134 pendingCallbacks.push(callback);
135 if (polymerReadyFired)
136 scheduleRunPendingCallbacks_();
139 var runScheduled = false;
140 function scheduleRunPendingCallbacks_() {
144 // TODO(nduca): I have no idea why magicDelay is needed. :'(
146 setTimeout(runPendingCallbacks_, magicDelay);
149 function runPendingCallbacks_() {
150 runScheduled = false;
151 var pending = pendingCallbacks.slice();
152 pendingCallbacks = [];
154 pending.forEach(function(cb) {
160 * Initialization which must be deferred until run-time.
162 function initialize() {
163 if (!window._TRACE_VIEWER_IS_COMPILED) {
165 window.navigator.appVersion.match(/Chrome\/(\d+)\./)[1], 10);
167 var msg = 'A Chrome version of 36 or higher is required for ' +
168 'trace-viewer development. Please upgrade your version of Chrome ' +
170 showPanic('Invalid Chrome version', msg);
176 tv.isMac = /Mac/.test(navigator.platform);
177 tv.isWindows = /Win/.test(navigator.platform);
178 tv.isChromeOS = /CrOS/.test(navigator.userAgent);
179 tv.isLinux = /Linux/.test(navigator.userAgent);
181 addEventListener('polymer-ready', function() {
182 polymerReadyFired = true;
183 scheduleRunPendingCallbacks_();
188 initialize: initialize,
191 showPanic: showPanic,
193 getPanicText: getPanicText,
194 onPolymerReady: onPolymerReady