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

Side by Side Diff: gm/rebaseline_server/static/view.html

Issue 178253010: rebaseline_server: use new intermediate JSON format (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: incorporate Ravi's suggestions Created 6 years, 9 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
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 2
3 <html ng-app="Loader" ng-controller="Loader.Controller"> 3 <html ng-app="Loader" ng-controller="Loader.Controller">
4 4
5 <head> 5 <head>
6 <title ng-bind="windowTitle"></title> 6 <title ng-bind="windowTitle"></title>
7 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.js" ></script> 7 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.js" ></script>
8 <script src="constants.js"></script>
9 <script src="diff_viewer.js"></script>
8 <script src="loader.js"></script> 10 <script src="loader.js"></script>
9 <script src="diff_viewer.js"></script>
10 <link rel="stylesheet" href="view.css"> 11 <link rel="stylesheet" href="view.css">
11 </head> 12 </head>
12 13
13 <body> 14 <body>
14 <h2> 15 <h2>
15 Instructions, roadmap, etc. are at 16 Instructions, roadmap, etc. are at
16 <a href="http://tinyurl.com/SkiaRebaselineServer"> 17 <a href="http://tinyurl.com/SkiaRebaselineServer">
17 http://tinyurl.com/SkiaRebaselineServer 18 http://tinyurl.com/SkiaRebaselineServer
18 </a> 19 </a>
19 </h2> 20 </h2>
20 21
21 <em> 22 <em>
22 {{loadingMessage}} 23 {{loadingMessage}}
23 </em> 24 </em>
24 25
25 <div ng-hide="!categories"><!-- everything: hide until data is loaded --> 26 <div ng-hide="!extraColumnHeaders"><!-- everything: hide until data is loaded -->
26 27
27 <div class="warning-div" 28 <div class="warning-div"
28 ng-hide="!(header.isEditable && header.isExported)"> 29 ng-hide="!(header[constants.KEY__HEADER__IS_EDITABLE] && header[constan ts.KEY__HEADER__IS_EXPORTED])">
29 WARNING! These results are editable and exported, so any user 30 WARNING! These results are editable and exported, so any user
30 who can connect to this server over the network can modify them. 31 who can connect to this server over the network can modify them.
31 </div> 32 </div>
32 33
33 <div ng-hide="!(header.timeUpdated)"> 34 <div ng-hide="!(header[constants.KEY__HEADER___TIME_UPDATED])">
34 Results current as of {{localTimeString(header.timeUpdated)}} 35 Results current as of {{localTimeString(header[constants.KEY__HEADER__TIME _UPDATED])}}
35 </div> 36 </div>
36 37
37 <div><!-- tabs --> 38 <div><!-- tabs -->
38 <div class="tab-spacer" ng-repeat="tab in tabs"> 39 <div class="tab-spacer" ng-repeat="tab in tabs">
39 <div class="tab-{{tab == viewingTab}}" 40 <div class="tab-{{tab == viewingTab}}"
40 ng-click="setViewingTab(tab)"> 41 ng-click="setViewingTab(tab)">
41 &nbsp;{{tab}} ({{numResultsPerTab[tab]}})&nbsp; 42 &nbsp;{{tab}} ({{numResultsPerTab[tab]}})&nbsp;
42 </div> 43 </div>
43 <div class="tab-spacer"> 44 <div class="tab-spacer">
44 &nbsp; 45 &nbsp;
45 </div> 46 </div>
46 </div> 47 </div>
47 </div><!-- tabs --> 48 </div><!-- tabs -->
48 49
49 <div class="tab-main"><!-- main display area of selected tab --> 50 <div class="tab-main"><!-- main display area of selected tab -->
50 51
51 <br> 52 <br>
52 <!-- We only show the filters/settings table on the Unfiled tab. --> 53 <!-- We only show the filters/settings table on the Unfiled tab. -->
53 <table ng-hide="viewingTab != defaultTab" border="1"> 54 <table ng-hide="viewingTab != defaultTab" border="1">
54 <tr> 55 <tr>
55 <th colspan="4"> 56 <th colspan="4">
56 Filters 57 Filters
57 </th> 58 </th>
58 <th> 59 <th>
59 Settings 60 Settings
60 </th> 61 </th>
61 </tr> 62 </tr>
62 <tr valign="top"> 63 <tr valign="top">
63 <!-- TODO(epoger): make this an ng-repeat over resultType, config, etc? -- >
64 <td> 64 <td>
65 resultType<br> 65 resultType<br>
66 <label ng-repeat="(resultType, count) in categories['resultType'] track by $index"> 66 <label ng-repeat="(resultType, count) in extraColumnHeaders[constants.KE Y__EXTRACOLUMN__RESULT_TYPE][constants.KEY__VALUES_AND_COUNTS] track by $index">
67 <input type="checkbox" 67 <input type="checkbox"
68 name="resultTypes" 68 name="resultTypes"
69 value="{{resultType}}" 69 value="{{resultType}}"
70 ng-checked="!isValueInSet(resultType, hiddenResultTypes)" 70 ng-checked="!isValueInSet(resultType, hiddenResultTypes)"
71 ng-click="toggleValueInSet(resultType, hiddenResultTypes); setU pdatesPending(true)"> 71 ng-click="toggleValueInSet(resultType, hiddenResultTypes); setU pdatesPending(true)">
72 {{resultType}} ({{count}})<br> 72 {{resultType}} ({{count}})<br>
73 </label> 73 </label>
74 <button ng-click="hiddenResultTypes = {}; updateResults()"> 74 <button ng-click="hiddenResultTypes = {}; updateResults()">
75 all 75 all
76 </button> 76 </button>
77 <button ng-click="hiddenResultTypes = {}; toggleValuesInSet(allResultTyp es, hiddenResultTypes); updateResults()"> 77 <button ng-click="hiddenResultTypes = {}; toggleValuesInSet(allResultTyp es, hiddenResultTypes); updateResults()">
78 none 78 none
79 </button> 79 </button>
80 <button ng-click="toggleValuesInSet(allResultTypes, hiddenResultTypes); updateResults()"> 80 <button ng-click="toggleValuesInSet(allResultTypes, hiddenResultTypes); updateResults()">
81 toggle 81 toggle
82 </button> 82 </button>
83 </td> 83 </td>
84 <td ng-repeat="category in ['builder', 'test']"> 84 <td ng-repeat="category in [constants.KEY__EXTRACOLUMN__BUILDER, constants .KEY__EXTRACOLUMN__TEST]">
85 {{category}} 85 {{category}}
86 <br> 86 <br>
87 <input type="text" 87 <input type="text"
88 ng-model="categoryValueMatch[category]" 88 ng-model="categoryValueMatch[category]"
89 ng-change="setUpdatesPending(true)"/> 89 ng-change="setUpdatesPending(true)"/>
90 <br> 90 <br>
91 <button ng-click="setCategoryValueMatch(category, '')" 91 <button ng-click="setCategoryValueMatch(category, '')"
92 ng-disabled="('' == categoryValueMatch[category])"> 92 ng-disabled="('' == categoryValueMatch[category])">
93 clear (show all) 93 clear (show all)
94 </button> 94 </button>
95 </td> 95 </td>
96 <td> 96 <td>
97 config<br> 97 config<br>
98 <label ng-repeat="(config, count) in categories['config'] track by $inde x"> 98 <label ng-repeat="(config, count) in extraColumnHeaders[constants.KEY__E XTRACOLUMN__CONFIG][constants.KEY__VALUES_AND_COUNTS] track by $index">
99 <input type="checkbox" 99 <input type="checkbox"
100 name="configs" 100 name="configs"
101 value="{{config}}" 101 value="{{config}}"
102 ng-checked="!isValueInSet(config, hiddenConfigs)" 102 ng-checked="!isValueInSet(config, hiddenConfigs)"
103 ng-click="toggleValueInSet(config, hiddenConfigs); setUpdatesPe nding(true)"> 103 ng-click="toggleValueInSet(config, hiddenConfigs); setUpdatesPe nding(true)">
104 {{config}} ({{count}})<br> 104 {{config}} ({{count}})<br>
105 </label> 105 </label>
106 <button ng-click="hiddenConfigs = {}; updateResults()"> 106 <button ng-click="hiddenConfigs = {}; updateResults()">
107 all 107 all
108 </button> 108 </button>
(...skipping 29 matching lines...) Expand all
138 </tr></table></td> 138 </tr></table></td>
139 </tr> 139 </tr>
140 </table> 140 </table>
141 141
142 <p> 142 <p>
143 143
144 <!-- Submission UI that we only show in the Pending Approval tab. --> 144 <!-- Submission UI that we only show in the Pending Approval tab. -->
145 <div ng-hide="'Pending Approval' != viewingTab"> 145 <div ng-hide="'Pending Approval' != viewingTab">
146 <div style="display:inline-block"> 146 <div style="display:inline-block">
147 <button style="font-size:20px" 147 <button style="font-size:20px"
148 ng-click="submitApprovals(filteredTestData)" 148 ng-click="submitApprovals(filteredImagePairs)"
149 ng-disabled="submitPending || (filteredTestData.length == 0)"> 149 ng-disabled="submitPending || (filteredImagePairs.length == 0) ">
150 Update these {{filteredTestData.length}} expectations on the server 150 Update these {{filteredImagePairs.length}} expectations on the serve r
151 </button> 151 </button>
152 </div> 152 </div>
153 <div style="display:inline-block"> 153 <div style="display:inline-block">
154 <div style="font-size:20px" 154 <div style="font-size:20px"
155 ng-hide="!submitPending"> 155 ng-hide="!submitPending">
156 Submitting, please wait... 156 Submitting, please wait...
157 </div> 157 </div>
158 </div> 158 </div>
159 <div> 159 <div>
160 Advanced settings... 160 Advanced settings...
161 <input type="checkbox" ng-model="showSubmitAdvancedSettings"> 161 <input type="checkbox" ng-model="showSubmitAdvancedSettings">
162 show 162 show
163 <ul ng-hide="!showSubmitAdvancedSettings"> 163 <ul ng-hide="!showSubmitAdvancedSettings">
164 <li ng-repeat="setting in ['reviewed-by-human', 'ignore-failure']"> 164 <li ng-repeat="setting in [constants.KEY__EXPECTATIONS__REVIEWED, co nstants.KEY__EXPECTATIONS__IGNOREFAILURE]">
165 {{setting}} 165 {{setting}}
166 <input type="checkbox" ng-model="submitAdvancedSettings[setting]"> 166 <input type="checkbox" ng-model="submitAdvancedSettings[setting]">
167 </li> 167 </li>
168 <li ng-repeat="setting in ['bug']"> 168 <li ng-repeat="setting in ['bug']">
169 {{setting}} 169 {{setting}}
170 <input type="text" ng-model="submitAdvancedSettings[setting]"> 170 <input type="text" ng-model="submitAdvancedSettings[setting]">
171 </li> 171 </li>
172 </ul> 172 </ul>
173 </div> 173 </div>
174 </div> 174 </div>
175 175
176 <p> 176 <p>
177 177
178 <table border="0"><tr><td> <!-- table holding results header + results table --> 178 <table border="0"><tr><td> <!-- table holding results header + results table -->
179 <table border="0" width="100%"> <!-- results header --> 179 <table border="0" width="100%"> <!-- results header -->
180 <tr> 180 <tr>
181 <td> 181 <td>
182 Found {{filteredTestData.length}} matches; 182 Found {{filteredImagePairs.length}} matches;
183 <span ng-hide="filteredTestData.length <= limitedTestData.length"> 183 <span ng-hide="filteredImagePairs.length <= limitedImagePairs.length ">
184 displaying the first {{limitedTestData.length}} 184 displaying the first {{limitedImagePairs.length}}
185 </span> 185 </span>
186 <span ng-hide="filteredTestData.length > limitedTestData.length"> 186 <span ng-hide="filteredImagePairs.length > limitedImagePairs.length" >
187 displaying them all 187 displaying them all
188 </span> 188 </span>
189 <br> 189 <br>
190 (click on the column header radio buttons to re-sort by that column) 190 (click on the column header radio buttons to re-sort by that column)
191 </td> 191 </td>
192 <td align="right"> 192 <td align="right">
193 <div> 193 <div>
194 all tests shown: 194 all tests shown:
195 <button ng-click="selectAllItems()"> 195 <button ng-click="selectAllImagePairs()">
196 select 196 select
197 </button> 197 </button>
198 <button ng-click="clearAllItems()"> 198 <button ng-click="clearAllImagePairs()">
199 clear 199 clear
200 </button> 200 </button>
201 <button ng-click="toggleAllItems()"> 201 <button ng-click="toggleAllImagePairs()">
202 toggle 202 toggle
203 </button> 203 </button>
204 </div> 204 </div>
205 <div ng-repeat="otherTab in tabs"> 205 <div ng-repeat="otherTab in tabs">
206 <button ng-click="moveSelectedItemsToTab(otherTab)" 206 <button ng-click="moveSelectedImagePairsToTab(otherTab)"
207 ng-disabled="selectedItems.length == 0" 207 ng-disabled="selectedImagePairs.length == 0"
208 ng-hide="otherTab == viewingTab"> 208 ng-hide="otherTab == viewingTab">
209 move {{selectedItems.length}} selected tests to {{otherTab}} tab 209 move {{selectedImagePairs.length}} selected tests to {{otherTab} } tab
210 </button> 210 </button>
211 </div> 211 </div>
212 </td> 212 </td>
213 </tr> 213 </tr>
214 </table> <!-- results header --> 214 </table> <!-- results header -->
215 </td></tr><tr><td> 215 </td></tr><tr><td>
216 <table border="1" ng-app="diff_viewer"> <!-- results --> 216 <table border="1" ng-app="diff_viewer"> <!-- results -->
217 <tr> 217 <tr>
218 <!-- Most column headers are displayed in a common fashion... --> 218 <!-- Most column headers are displayed in a common fashion... -->
219 <th ng-repeat="categoryName in ['resultType', 'builder', 'test', 'conf ig']"> 219 <th ng-repeat="categoryName in [constants.KEY__EXTRACOLUMN__RESULT_TYP E, constants.KEY__EXTRACOLUMN__BUILDER, constants.KEY__EXTRACOLUMN__TEST, consta nts.KEY__EXTRACOLUMN__CONFIG]">
220 <input type="radio" 220 <input type="radio"
221 name="sortColumnRadio" 221 name="sortColumnRadio"
222 value="{{categoryName}}" 222 value="{{categoryName}}"
223 ng-checked="(sortColumn == categoryName)" 223 ng-checked="(sortColumnKey == categoryName)"
224 ng-click="sortResultsBy(categoryName)"> 224 ng-click="sortResultsBy(constants.KEY__EXTRA_COLUMN_VALUES, c ategoryName)">
225 {{categoryName}} 225 {{categoryName}}
226 </th> 226 </th>
227 <!-- ... but there are a few columns where we display things different ly. --> 227 <!-- ... but there are a few columns where we display things different ly. -->
228 <th> 228 <th>
229 <input type="radio" 229 <input type="radio"
230 name="sortColumnRadio" 230 name="sortColumnRadio"
231 value="bugs" 231 value="bugs"
232 ng-checked="(sortColumn == 'bugs')" 232 ng-checked="(sortColumnKey == constants.KEY__EXPECTATIONS__BU GS)"
233 ng-click="sortResultsBy('bugs')"> 233 ng-click="sortResultsBy(constants.KEY__EXPECTATIONS_DATA, con stants.KEY__EXPECTATIONS__BUGS)">
234 bugs 234 bugs
235 </th> 235 </th>
236 <th width="{{imageSize}}"> 236 <th width="{{imageSize}}">
237 <input type="radio" 237 {{imageSets[0][constants.KEY__IMAGESETS__DESCRIPTION]}}
238 name="sortColumnRadio"
239 value="expectedHashDigest"
240 ng-checked="(sortColumn == 'expectedHashDigest')"
241 ng-click="sortResultsBy('expectedHashDigest')">
242 expected image
243 </th> 238 </th>
244 <th width="{{imageSize}}"> 239 <th width="{{imageSize}}">
245 <input type="radio" 240 {{imageSets[1][constants.KEY__IMAGESETS__DESCRIPTION]}}
246 name="sortColumnRadio"
247 value="actualHashDigest"
248 ng-checked="(sortColumn == 'actualHashDigest')"
249 ng-click="sortResultsBy('actualHashDigest')">
250 actual image
251 </th> 241 </th>
252 <th width="{{imageSize}}"> 242 <th width="{{imageSize}}">
253 <input type="radio" 243 <input type="radio"
254 name="sortColumnRadio" 244 name="sortColumnRadio"
255 value="percentDifferingPixels" 245 value="percentDifferingPixels"
256 ng-checked="(sortColumn == 'percentDifferingPixels')" 246 ng-checked="(sortColumnKey == constants.KEY__DIFFERENCE_DATA_ _PERCENT_DIFF_PIXELS)"
257 ng-click="sortResultsBy('percentDifferingPixels')"> 247 ng-click="sortResultsBy(constants.KEY__DIFFERENCE_DATA, const ants.KEY__DIFFERENCE_DATA__PERCENT_DIFF_PIXELS)">
258 differing pixels in white 248 differing pixels in white
259 </th> 249 </th>
260 <th width="{{imageSize}}"> 250 <th width="{{imageSize}}">
261 <input type="radio" 251 <input type="radio"
262 name="sortColumnRadio" 252 name="sortColumnRadio"
263 value="weightedDiffMeasure" 253 value="weightedDiffMeasure"
264 ng-checked="(sortColumn == 'weightedDiffMeasure')" 254 ng-checked="(sortColumnKey == constants.KEY__DIFFERENCE_DATA_ _WEIGHTED_DIFF)"
265 ng-click="sortResultsBy('weightedDiffMeasure')"> 255 ng-click="sortResultsBy(constants.KEY__DIFFERENCE_DATA, const ants.KEY__DIFFERENCE_DATA__WEIGHTED_DIFF)">
266 perceptual difference 256 perceptual difference
267 <br> 257 <br>
268 <input type="range" ng-model="pixelDiffBgColorBrightness" 258 <input type="range" ng-model="pixelDiffBgColorBrightness"
269 ng-init="pixelDiffBgColorBrightness=64; pixelDiffBgColor=brig htnessStringToHexColor(pixelDiffBgColorBrightness)" 259 ng-init="pixelDiffBgColorBrightness=64; pixelDiffBgColor=brig htnessStringToHexColor(pixelDiffBgColorBrightness)"
270 ng-change="pixelDiffBgColor=brightnessStringToHexColor(pixelD iffBgColorBrightness)" 260 ng-change="pixelDiffBgColor=brightnessStringToHexColor(pixelD iffBgColorBrightness)"
271 title="image background brightness" 261 title="image background brightness"
272 min="0" max="255"/> 262 min="0" max="255"/>
273 </th> 263 </th>
274 <th> 264 <th>
275 <!-- item-selection checkbox column --> 265 <!-- imagepair-selection checkbox column -->
276 </th> 266 </th>
277 </tr> 267 </tr>
278 268
279 <tr ng-repeat="result in limitedTestData" ng-controller="ImageController "> 269 <tr ng-repeat="imagePair in limitedImagePairs" ng-controller="ImageContr oller">
280 <td> 270 <td>
281 {{result.resultType}} 271 {{imagePair[constants.KEY__EXTRA_COLUMN_VALUES][constants.KEY__EXTRA COLUMN__RESULT_TYPE]}}
282 <br> 272 <br>
283 <button class="show-only-button" 273 <button class="show-only-button"
284 ng-hide="viewingTab != defaultTab" 274 ng-hide="viewingTab != defaultTab"
285 ng-click="showOnlyResultType(result.resultType)" 275 ng-click="showOnlyResultType(imagePair[constants.KEY__EXTRA_ COLUMN_VALUES][constants.KEY__EXTRACOLUMN__RESULT_TYPE])"
286 title="show only results of type '{{result.resultType}}'"> 276 title="show only results of type {{imagePair[constants.KEY__ EXTRA_COLUMN_VALUES][constants.KEY__EXTRACOLUMN__RESULT_TYPE]}}">
287 show only 277 show only
288 </button> 278 </button>
289 <br> 279 <br>
290 <button class="show-all-button" 280 <button class="show-all-button"
291 ng-hide="viewingTab != defaultTab" 281 ng-hide="viewingTab != defaultTab"
292 ng-disabled="0 == setSize(hiddenResultTypes)" 282 ng-disabled="0 == setSize(hiddenResultTypes)"
293 ng-click="showAllResultTypes()" 283 ng-click="showAllResultTypes()"
294 title="show results of all types"> 284 title="show results of all types">
295 show all 285 show all
296 </button> 286 </button>
297 </td> 287 </td>
298 <td ng-repeat="categoryName in ['builder', 'test']"> 288 <td ng-repeat="categoryName in [constants.KEY__EXTRACOLUMN__BUILDER, c onstants.KEY__EXTRACOLUMN__TEST]">
299 {{result[categoryName]}} 289 {{imagePair[constants.KEY__EXTRA_COLUMN_VALUES][categoryName]}}
300 <br> 290 <br>
301 <button class="show-only-button" 291 <button class="show-only-button"
302 ng-hide="viewingTab != defaultTab" 292 ng-hide="viewingTab != defaultTab"
303 ng-disabled="result[categoryName] == categoryValueMatch[cate goryName]" 293 ng-disabled="imagePair[constants.KEY__EXTRA_COLUMN_VALUES][c ategoryName] == categoryValueMatch[categoryName]"
304 ng-click="setCategoryValueMatch(categoryName, result[categor yName])" 294 ng-click="setCategoryValueMatch(categoryName, imagePair[cons tants.KEY__EXTRA_COLUMN_VALUES][categoryName])"
305 title="show only results of {{categoryName}} '{{result[categ oryName]}}'"> 295 title="show only results of {{categoryName}} {{imagePair[con stants.KEY__EXTRA_COLUMN_VALUES][categoryName]}}">
306 show only 296 show only
307 </button> 297 </button>
308 <br> 298 <br>
309 <button class="show-all-button" 299 <button class="show-all-button"
310 ng-hide="viewingTab != defaultTab" 300 ng-hide="viewingTab != defaultTab"
311 ng-disabled="'' == categoryValueMatch[categoryName]" 301 ng-disabled="'' == categoryValueMatch[categoryName]"
312 ng-click="setCategoryValueMatch(categoryName, '')" 302 ng-click="setCategoryValueMatch(categoryName, '')"
313 title="show results of all {{categoryName}}s"> 303 title="show results of all {{categoryName}}s">
314 show all 304 show all
315 </button> 305 </button>
316 </td> 306 </td>
317 <td> 307 <td>
318 {{result.config}} 308 {{imagePair[constants.KEY__EXTRA_COLUMN_VALUES][constants.KEY__EXTRA COLUMN__CONFIG]}}
319 <br> 309 <br>
320 <button class="show-only-button" 310 <button class="show-only-button"
321 ng-hide="viewingTab != defaultTab" 311 ng-hide="viewingTab != defaultTab"
322 ng-click="showOnlyConfig(result.config)" 312 ng-click="showOnlyConfig(imagePair[constants.KEY__EXTRA_COLU MN_VALUES][constants.KEY__EXTRACOLUMN__CONFIG])"
323 title="show only results of config '{{result.config}}'"> 313 title="show only results of config {{imagePair[constants.KEY __EXTRA_COLUMN_VALUES][constants.KEY__EXTRACOLUMN__CONFIG]}}">
324 show only 314 show only
325 </button> 315 </button>
326 <br> 316 <br>
327 <button class="show-all-button" 317 <button class="show-all-button"
328 ng-hide="viewingTab != defaultTab" 318 ng-hide="viewingTab != defaultTab"
329 ng-disabled="0 == setSize(hiddenConfigs)" 319 ng-disabled="0 == setSize(hiddenConfigs)"
330 ng-click="showAllConfigs()" 320 ng-click="showAllConfigs()"
331 title="show results of all configs"> 321 title="show results of all configs">
332 show all 322 show all
333 </button> 323 </button>
334 </td> 324 </td>
335 <td> 325 <td>
336 <a ng-repeat="bug in result['bugs']" 326 <a ng-repeat="bug in imagePair[constants.KEY__EXPECTATIONS_DATA][con stants.KEY__EXPECTATIONS__BUGS]"
337 href="https://code.google.com/p/skia/issues/detail?id={{bug}}" 327 href="https://code.google.com/p/skia/issues/detail?id={{bug}}"
338 target="_blank"> 328 target="_blank">
339 {{bug}} 329 {{bug}}
340 </a> 330 </a>
341 </td> 331 </td>
342 332
343 <!-- expected image --> 333 <!-- image A -->
344 <td valign="bottom" width="{{imageSize}}"> 334 <td valign="bottom" width="{{imageSize}}">
345 <a href="http://chromium-skia-gm.commondatastorage.googleapis.com/gm /{{result.expectedHashType}}/{{result.test}}/{{result.expectedHashDigest}}.png" target="_blank">View Image</a><br/> 335 <a href="{{imageSets[0][constants.KEY__IMAGESETS__BASE_URL]}}/{{imag ePair[constants.KEY__IMAGE_A_URL]}}" target="_blank">View Image</a><br/>
346 <img-compare type="baseline" width="{{imageSize}}" 336 <img-compare type="baseline" width="{{imageSize}}"
347 src="http://chromium-skia-gm.commondatastorage.googleap is.com/gm/{{result.expectedHashType}}/{{result.test}}/{{result.expectedHashDiges t}}.png" /> 337 src="{{imageSets[0][constants.KEY__IMAGESETS__BASE_URL] }}/{{imagePair[constants.KEY__IMAGE_A_URL]}}" />
348
349 </td> 338 </td>
350 339
351 <!-- actual image --> 340 <!-- image B -->
352 <td valign="bottom" width="{{imageSize}}"> 341 <td valign="bottom" width="{{imageSize}}">
353 <a href="http://chromium-skia-gm.commondatastorage.googleapis.com/gm /{{result.actualHashType}}/{{result.test}}/{{result.actualHashDigest}}.png" targ et="_blank">View Image</a><br/> 342 <a href="{{imageSets[1][constants.KEY__IMAGESETS__BASE_URL]}}/{{imag ePair[constants.KEY__IMAGE_B_URL]}}" target="_blank">View Image</a><br/>
354 <img-compare type="test" width="{{imageSize}}" 343 <img-compare type="test" width="{{imageSize}}"
355 src="http://chromium-skia-gm.commondatastorage.googleap is.com/gm/{{result.actualHashType}}/{{result.test}}/{{result.actualHashDigest}}. png" /> 344 src="{{imageSets[1][constants.KEY__IMAGESETS__BASE_URL] }}/{{imagePair[constants.KEY__IMAGE_B_URL]}}" />
356
357 </td> 345 </td>
358 346
359 <!-- whitediffs: every differing pixel shown in white --> 347 <!-- whitediffs: every differing pixel shown in white -->
360 <td valign="bottom" width="{{imageSize}}"> 348 <td valign="bottom" width="{{imageSize}}">
361 <div ng-hide="result.expectedHashDigest == result.actualHashDigest" 349 <div ng-hide="!imagePair[constants.KEY__IS_DIFFERENT]"
362 title="{{result.numDifferingPixels | number:0}} of {{(100 * res ult.numDifferingPixels / result.percentDifferingPixels) | number:0}} pixels ({{r esult.percentDifferingPixels.toFixed(4)}}%) differ from expectation."> 350 title="{{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KE Y__DIFFERENCE_DATA__NUM_DIFF_PIXELS] | number:0}} of {{(100 * imagePair[constant s.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__NUM_DIFF_PIXELS] / image Pair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__PERCENT_DIF F_PIXELS]) | number:0}} pixels ({{imagePair[constants.KEY__DIFFERENCE_DATA][cons tants.KEY__DIFFERENCE_DATA__PERCENT_DIFF_PIXELS].toFixed(4)}}%) differ from expe ctation.">
363 351
364 {{result.percentDifferingPixels.toFixed(4)}}% 352 {{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERE NCE_DATA__PERCENT_DIFF_PIXELS].toFixed(4)}}%
365 ({{result.numDifferingPixels}}) 353 ({{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFER ENCE_DATA__NUM_DIFF_PIXELS]}})
366 <br/> 354 <br/>
367 <a href="/static/generated-images/whitediffs/{{result.expectedHash Digest}}-vs-{{result.actualHashDigest}}.png" target="_blank">View Image</a><br/> 355 <a href="/static/generated-images/whitediffs/{{getImageDiffRelativ eUrl(imagePair)}}" target="_blank">View Image</a><br/>
368 <img-compare type="differingPixelsInWhite" width="{{imageSize}}" 356 <img-compare type="differingPixelsInWhite" width="{{imageSize}}"
369 src="/static/generated-images/whitediffs/{{result.exp ectedHashDigest}}-vs-{{result.actualHashDigest}}.png" /> 357 src="/static/generated-images/whitediffs/{{getImageDi ffRelativeUrl(imagePair)}}" />
370 358
371 </div> 359 </div>
372 <div ng-hide="result.expectedHashDigest != result.actualHashDigest" 360 <div ng-hide="imagePair[constants.KEY__IS_DIFFERENT]"
373 style="text-align:center"> 361 style="text-align:center">
374 &ndash;none&ndash; 362 &ndash;none&ndash;
375 </div> 363 </div>
376 </td> 364 </td>
377 365
378 <!-- diffs: per-channel RGB deltas --> 366 <!-- diffs: per-channel RGB deltas -->
379 <td valign="bottom" width="{{imageSize}}"> 367 <td valign="bottom" width="{{imageSize}}">
380 <div ng-hide="result.expectedHashDigest == result.actualHashDigest" 368 <div ng-hide="!imagePair[constants.KEY__IS_DIFFERENT]"
381 title="Perceptual difference measure is {{result.perceptualDiff erence.toFixed(4)}}%. Maximum difference per channel: R={{result.maxDiffPerChan nel[0]}}, G={{result.maxDiffPerChannel[1]}}, B={{result.maxDiffPerChannel[2]}}"> 369 title="Perceptual difference measure is {{imagePair[constants.K EY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__PERCEPTUAL_DIFF].toFixed(4) }}%. Maximum difference per channel: R={{imagePair[constants.KEY__DIFFERENCE_DA TA][constants.KEY__DIFFERENCE_DATA__MAX_DIFF_PER_CHANNEL][0]}}, G={{imagePair[co nstants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENCE_DATA__MAX_DIFF_PER_CHANN EL][1]}}, B={{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERENC E_DATA__MAX_DIFF_PER_CHANNEL][2]}}">
382 370
383 {{result.perceptualDifference.toFixed(4)}}% 371 {{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERE NCE_DATA__PERCEPTUAL_DIFF].toFixed(4)}}%
384 {{result.maxDiffPerChannel}} 372 {{imagePair[constants.KEY__DIFFERENCE_DATA][constants.KEY__DIFFERE NCE_DATA__MAX_DIFF_PER_CHANNEL]}}
385 <br/> 373 <br/>
386 <a href="/static/generated-images/diffs/{{result.expectedHashDiges t}}-vs-{{result.actualHashDigest}}.png" target="_blank">View Image</a><br/> 374 <a href="/static/generated-images/diffs/{{getImageDiffRelativeUrl( imagePair)}}" target="_blank">View Image</a><br/>
387 <img-compare ng-style="{backgroundColor: pixelDiffBgColor}" 375 <img-compare ng-style="{backgroundColor: pixelDiffBgColor}"
388 type="differencePerPixel" width="{{imageSize}}" 376 type="differencePerPixel" width="{{imageSize}}"
389 src="/static/generated-images/diffs/{{result.expected HashDigest}}-vs-{{result.actualHashDigest}}.png" 377 src="/static/generated-images/diffs/{{getImageDiffRel ativeUrl(imagePair)}}"
390 ng-mousedown="MagnifyDraw($event, true)" 378 ng-mousedown="MagnifyDraw($event, true)"
391 ng-mousemove="MagnifyDraw($event, false)" 379 ng-mousemove="MagnifyDraw($event, false)"
392 ng-mouseup="MagnifyEnd($event)" 380 ng-mouseup="MagnifyEnd($event)"
393 ng-mouseleave="MagnifyEnd($event)" /> 381 ng-mouseleave="MagnifyEnd($event)" />
394 382
395 </div> 383 </div>
396 <div ng-hide="result.expectedHashDigest != result.actualHashDigest" 384 <div ng-hide="imagePair[constants.KEY__IS_DIFFERENT]"
397 style="text-align:center"> 385 style="text-align:center">
398 &ndash;none&ndash; 386 &ndash;none&ndash;
399 </div> 387 </div>
400 </td> 388 </td>
401 389
402 <td> 390 <td>
403 <input type="checkbox" 391 <input type="checkbox"
404 name="rowSelect" 392 name="rowSelect"
405 value="{{result.index}}" 393 value="{{imagePair.index}}"
406 ng-checked="isValueInArray(result.index, selectedItems)" 394 ng-checked="isValueInArray(imagePair.index, selectedImagePair s)"
407 ng-click="toggleValueInArray(result.index, selectedItems)"> 395 ng-click="toggleValueInArray(imagePair.index, selectedImagePa irs)">
408 </tr> 396 </tr>
409 </table> <!-- results --> 397 </table> <!-- imagePairs -->
410 </td></tr></table> <!-- table holding results header + results table --> 398 </td></tr></table> <!-- table holding results header + imagePairs table -->
411 399
412 </div><!-- main display area of selected tab --> 400 </div><!-- main display area of selected tab -->
413 </div><!-- everything: hide until data is loaded --> 401 </div><!-- everything: hide until data is loaded -->
414 402
415 <!-- TODO(epoger): Can we get the base URLs (commondatastorage and
416 issues list) from
417 https://skia.googlesource.com/buildbot/+/master/site_config/global_variab les.json ?
418 I tried importing the
419 http://skia.googlecode.com/svn/buildbot/skia_tools.js script and using
420 that to do so, but I got Access-Control-Allow-Origin errors.
421 -->
422
423 </body> 403 </body>
424 </html> 404 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698