1 /* 2 * Copyright (C) 2011 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 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. 12 * 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. 24 */ 25 26 var ui = ui || {}; 27 ui.failures = ui.failures || {}; 28 29 (function(){ 30 31 var kBuildingResult = 'BUILDING'; 32 33 ui.failures.Builder = base.extends('a', { 34 init: function(builderName, failures) 35 { 36 var platformBuilders = config.currentBuilders(); 37 var configuration = platformBuilders[builderName]; 38 if (configuration) { 39 if (configuration.version) 40 this._addSpan('version', configuration.version); 41 if (configuration.is64bit) 42 this._addSpan('architecture', '64-bit'); 43 this._configuration = configuration; 44 } else 45 this._addSpan('version', builderName); 46 47 this.className = 'failing-builder'; 48 this.target = '_blank'; 49 this.href = ui.displayURLForBuilder(builderName); 50 if (failures) 51 this._addSpan('failures', ' ' + failures.join(', ')); 52 }, 53 _addSpan: function(className, text) 54 { 55 var span = this.appendChild(document.createElement('span')); 56 span.className = className; 57 span.textContent = text; 58 }, 59 equals: function(configuration) 60 { 61 return this._configuration && this._configuration.is64bit == configuration.is64bit && this._configuration.version == configuration.version; 62 } 63 }); 64 65 function cellContainsConfiguration(cell, configuration) 66 { 67 return Array.prototype.some.call(cell.children, function(configurationElement) { 68 return configurationElement.equals && configurationElement.equals(configuration); 69 }); 70 } 71 72 function cellByBuildType(row, configuration) 73 { 74 return row.cells[configuration.debug ? 2 : 1]; 75 } 76 77 ui.failures.FailureGrid = base.extends('table', { 78 init: function() 79 { 80 this.className = 'failures'; 81 var titles = this.createTHead().insertRow(); 82 titles.insertCell().textContent = 'debug'; 83 titles.insertCell().textContent = 'release'; 84 titles.insertCell().textContent = 'type'; 85 this._body = this.appendChild(document.createElement('tbody')); 86 this._reset(); 87 }, 88 _rowByResult: function(result) 89 { 90 var row = this._resultRows[result]; 91 $(row).show(); 92 if (row) 93 return row; 94 95 row = this._resultRows[result] = this._body.insertRow(0); 96 row.className = result; 97 row.insertCell(); 98 row.insertCell(); 99 var titleCell = row.insertCell(); 100 titleCell.appendChild(document.createElement('span')).textContent = result; 101 return row; 102 }, 103 update: function(resultsByBuilder) 104 { 105 if (this._pendingReset) 106 this._reset(); 107 108 if (!resultsByBuilder) 109 return; 110 111 Object.keys(resultsByBuilder).forEach(function(builderName) { 112 var configuration = config.kPlatforms[config.currentPlatform].builders[builderName]; 113 if (!configuration) 114 throw "Unknown builder name: " + builderName; 115 var row = this._rowByResult(resultsByBuilder[builderName].actual); 116 var cell = cellByBuildType(row, configuration); 117 if (cellContainsConfiguration(cell, configuration)) 118 return; 119 cell.appendChild(new ui.failures.Builder(builderName)); 120 }, this); 121 }, 122 purge: function() 123 { 124 this._pendingReset = true; 125 }, 126 _reset: function() 127 { 128 this._pendingReset = false; 129 this._resultRows = {}; 130 $(this._body).empty(); 131 // Add the BUILDING row eagerly so that it appears last. 132 this._rowByResult(kBuildingResult); 133 $(this._resultRows[kBuildingResult]).hide(); 134 } 135 }); 136 137 ui.failures.ListItem = base.extends('li', { 138 init: function(groupName, failingTestsList) 139 { 140 this._failingTestsList = failingTestsList; 141 this.appendChild(new ui.actions.List([ 142 new ui.actions.Examine().makeDefault(), 143 ])); 144 var label = this.appendChild(document.createElement('label')) 145 label.textContent = failingTestsList.length == 1 ? failingTestsList[0] : groupName; 146 }, 147 }); 148 149 ui.failures.List = base.extends('ul', { 150 init: function() 151 { 152 this.className = 'failures'; 153 this.textContent = 'Loading...'; 154 } 155 }); 156 157 })(); 158