2 * Copyright (C) 2011 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
27 ui.failures = ui.failures || {};
31 var kBuildingResult = 'BUILDING';
33 ui.failures.Configuration = base.extends('a', {
34 init: function(configuration)
36 if (configuration.is64bit)
37 this._addSpan('architecture', '64-bit');
38 if (configuration.version)
39 this._addSpan('version', configuration.version);
40 this._configuration = configuration;
41 this.target = '_blank';
43 _addSpan: function(className, text)
45 var span = this.appendChild(document.createElement('span'));
46 span.className = className;
47 span.textContent = text;
49 equals: function(configuration)
51 return this._configuration.is64bit == configuration.is64bit && this._configuration.version == configuration.version;
55 function cellContainsConfiguration(cell, configuration)
57 return Array.prototype.some.call(cell.children, function(configurationElement) {
58 return configurationElement.equals && configurationElement.equals(configuration);
62 function cellByBuildType(row, configuration)
64 return row.cells[configuration.debug ? 2 : 1];
67 ui.failures.FailureGrid = base.extends('table', {
70 this.className = 'failures';
71 var titles = this.createTHead().insertRow();
72 titles.insertCell().textContent = 'debug';
73 titles.insertCell().textContent = 'release';
74 titles.insertCell().textContent = 'type';
75 this._body = this.appendChild(document.createElement('tbody'));
76 this._resultRows = {};
77 // Add the BUILDING row eagerly so that it appears last.
78 this._rowByResult(kBuildingResult);
79 $(this._resultRows[kBuildingResult]).hide();
81 _rowByResult: function(result)
83 var row = this._resultRows[result];
88 row = this._resultRows[result] = this._body.insertRow(0);
89 row.className = result;
92 row.insertCell().textContent = result;
95 removeResultRows: function()
97 Object.keys(this._resultRows).forEach(function(result) {
98 var row = this._resultRows[result];
99 row.parentNode.removeChild(row);
101 this._resultRows = {};
103 add: function(resultsByBuilder)
105 Object.keys(resultsByBuilder).forEach(function(builderName) {
106 var configuration = config.kBuilders[builderName];
107 var row = this._rowByResult(resultsByBuilder[builderName].actual);
108 var cell = cellByBuildType(row, configuration);
109 if (cellContainsConfiguration(cell, configuration))
111 cell.appendChild(new ui.failures.Configuration(configuration)).href = ui.displayURLForBuilder(builderName);