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

Unified Diff: gm/rebaseline_server/static/loader.js

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, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gm/rebaseline_server/static/constants.js ('k') | gm/rebaseline_server/static/view.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gm/rebaseline_server/static/loader.js
diff --git a/gm/rebaseline_server/static/loader.js b/gm/rebaseline_server/static/loader.js
index 9ae84d613c9444411c81a260e69bcbeac3cad9ac..ab79df8189da0a0b7b4aa120aced0edbab5be626 100644
--- a/gm/rebaseline_server/static/loader.js
+++ b/gm/rebaseline_server/static/loader.js
@@ -1,38 +1,42 @@
/*
* Loader:
* Reads GM result reports written out by results.py, and imports
- * them into $scope.categories and $scope.testData .
+ * them into $scope.extraColumnHeaders and $scope.imagePairs .
*/
var Loader = angular.module(
'Loader',
- ['diff_viewer']
+ ['ConstantsModule', 'diff_viewer']
);
-
// TODO(epoger): Combine ALL of our filtering operations (including
// truncation) into this one filter, so that runs most efficiently?
// (We would have to make sure truncation still took place after
// sorting, though.)
Loader.filter(
- 'removeHiddenItems',
- function() {
- return function(unfilteredItems, hiddenResultTypes, hiddenConfigs,
+ 'removeHiddenImagePairs',
+ function(constants) {
+ return function(unfilteredImagePairs, hiddenResultTypes, hiddenConfigs,
builderSubstring, testSubstring, viewingTab) {
- var filteredItems = [];
- for (var i = 0; i < unfilteredItems.length; i++) {
- var item = unfilteredItems[i];
+ var filteredImagePairs = [];
+ for (var i = 0; i < unfilteredImagePairs.length; i++) {
+ var imagePair = unfilteredImagePairs[i];
+ var extraColumnValues = imagePair[constants.KEY__EXTRA_COLUMN_VALUES];
// For performance, we examine the "set" objects directly rather
// than calling $scope.isValueInSet().
// Besides, I don't think we have access to $scope in here...
- if (!(true == hiddenResultTypes[item.resultType]) &&
- !(true == hiddenConfigs[item.config]) &&
- !(-1 == item.builder.indexOf(builderSubstring)) &&
- !(-1 == item.test.indexOf(testSubstring)) &&
- (viewingTab == item.tab)) {
- filteredItems.push(item);
+ if (!(true == hiddenResultTypes[extraColumnValues[
+ constants.KEY__EXTRACOLUMN__RESULT_TYPE]]) &&
+ !(true == hiddenConfigs[extraColumnValues[
+ constants.KEY__EXTRACOLUMN__CONFIG]]) &&
+ !(-1 == extraColumnValues[constants.KEY__EXTRACOLUMN__BUILDER]
+ .indexOf(builderSubstring)) &&
+ !(-1 == extraColumnValues[constants.KEY__EXTRACOLUMN__TEST]
+ .indexOf(testSubstring)) &&
+ (viewingTab == imagePair.tab)) {
+ filteredImagePairs.push(imagePair);
}
}
- return filteredItems;
+ return filteredImagePairs;
};
}
);
@@ -40,7 +44,8 @@ Loader.filter(
Loader.controller(
'Loader.Controller',
- function($scope, $http, $filter, $location, $timeout) {
+ function($scope, $http, $filter, $location, $timeout, constants) {
+ $scope.constants = constants;
$scope.windowTitle = "Loading GM Results...";
$scope.resultsToLoad = $location.search().resultsToLoad;
$scope.loadingMessage = "Loading results of type '" + $scope.resultsToLoad +
@@ -53,26 +58,33 @@ Loader.controller(
*/
$http.get("/results/" + $scope.resultsToLoad).success(
function(data, status, header, config) {
- if (data.header.resultsStillLoading) {
+ var dataHeader = data[constants.KEY__HEADER];
+ if (dataHeader[constants.KEY__HEADER__IS_STILL_LOADING]) {
$scope.loadingMessage =
"Server is still loading results; will retry at " +
- $scope.localTimeString(data.header.timeNextUpdateAvailable);
+ $scope.localTimeString(dataHeader[
+ constants.KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE]);
$timeout(
function(){location.reload();},
- (data.header.timeNextUpdateAvailable * 1000) - new Date().getTime());
+ (dataHeader[constants.KEY__HEADER__TIME_NEXT_UPDATE_AVAILABLE]
+ * 1000) - new Date().getTime());
} else {
$scope.loadingMessage = "Processing data, please wait...";
- $scope.header = data.header;
- $scope.categories = data.categories;
- $scope.testData = data.testData;
- $scope.sortColumn = 'weightedDiffMeasure';
+ $scope.header = dataHeader;
+ $scope.extraColumnHeaders = data[constants.KEY__EXTRACOLUMNHEADERS];
+ $scope.imagePairs = data[constants.KEY__IMAGEPAIRS];
+ $scope.imageSets = data[constants.KEY__IMAGESETS];
+ $scope.sortColumnSubdict = constants.KEY__DIFFERENCE_DATA;
+ $scope.sortColumnKey = constants.KEY__DIFFERENCE_DATA__WEIGHTED_DIFF;
$scope.showTodos = false;
$scope.showSubmitAdvancedSettings = false;
$scope.submitAdvancedSettings = {};
- $scope.submitAdvancedSettings['reviewed-by-human'] = true;
- $scope.submitAdvancedSettings['ignore-failure'] = false;
+ $scope.submitAdvancedSettings[
+ constants.KEY__EXPECTATIONS__REVIEWED] = true;
+ $scope.submitAdvancedSettings[
+ constants.KEY__EXPECTATIONS__IGNOREFAILURE] = false;
$scope.submitAdvancedSettings['bug'] = '';
// Create the list of tabs (lists into which the user can file each
@@ -80,7 +92,7 @@ Loader.controller(
$scope.tabs = [
'Unfiled', 'Hidden'
];
- if (data.header.isEditable) {
+ if (dataHeader[constants.KEY__HEADER__IS_EDITABLE]) {
$scope.tabs = $scope.tabs.concat(
['Pending Approval']);
}
@@ -92,26 +104,32 @@ Loader.controller(
for (var i = 0; i < $scope.tabs.length; i++) {
$scope.numResultsPerTab[$scope.tabs[i]] = 0;
}
- $scope.numResultsPerTab[$scope.defaultTab] = $scope.testData.length;
+ $scope.numResultsPerTab[$scope.defaultTab] = $scope.imagePairs.length;
// Add index and tab fields to all records.
- for (var i = 0; i < $scope.testData.length; i++) {
- $scope.testData[i].index = i;
- $scope.testData[i].tab = $scope.defaultTab;
+ for (var i = 0; i < $scope.imagePairs.length; i++) {
+ $scope.imagePairs[i].index = i;
+ $scope.imagePairs[i].tab = $scope.defaultTab;
}
// Arrays within which the user can toggle individual elements.
- $scope.selectedItems = [];
+ $scope.selectedImagePairs = [];
// Sets within which the user can toggle individual elements.
- $scope.hiddenResultTypes = {
- 'failure-ignored': true,
- 'no-comparison': true,
- 'succeeded': true,
- };
- $scope.allResultTypes = Object.keys(data.categories['resultType']);
+ $scope.hiddenResultTypes = {};
+ $scope.hiddenResultTypes[
+ constants.KEY__RESULT_TYPE__FAILUREIGNORED] = true;
+ $scope.hiddenResultTypes[
+ constants.KEY__RESULT_TYPE__NOCOMPARISON] = true;
+ $scope.hiddenResultTypes[
+ constants.KEY__RESULT_TYPE__SUCCEEDED] = true;
+ $scope.allResultTypes = Object.keys(
+ $scope.extraColumnHeaders[constants.KEY__EXTRACOLUMN__RESULT_TYPE]
+ [constants.KEY__VALUES_AND_COUNTS]);
$scope.hiddenConfigs = {};
- $scope.allConfigs = Object.keys(data.categories['config']);
+ $scope.allConfigs = Object.keys(
+ $scope.extraColumnHeaders[constants.KEY__EXTRACOLUMN__CONFIG]
+ [constants.KEY__VALUES_AND_COUNTS]);
// Associative array of partial string matches per category.
$scope.categoryValueMatch = {};
@@ -142,12 +160,12 @@ Loader.controller(
/**
* Select all currently showing tests.
*/
- $scope.selectAllItems = function() {
- var numItemsShowing = $scope.limitedTestData.length;
- for (var i = 0; i < numItemsShowing; i++) {
- var index = $scope.limitedTestData[i].index;
- if (!$scope.isValueInArray(index, $scope.selectedItems)) {
- $scope.toggleValueInArray(index, $scope.selectedItems);
+ $scope.selectAllImagePairs = function() {
+ var numImagePairsShowing = $scope.limitedImagePairs.length;
+ for (var i = 0; i < numImagePairsShowing; i++) {
+ var index = $scope.limitedImagePairs[i].index;
+ if (!$scope.isValueInArray(index, $scope.selectedImagePairs)) {
+ $scope.toggleValueInArray(index, $scope.selectedImagePairs);
}
}
}
@@ -155,12 +173,12 @@ Loader.controller(
/**
* Deselect all currently showing tests.
*/
- $scope.clearAllItems = function() {
- var numItemsShowing = $scope.limitedTestData.length;
- for (var i = 0; i < numItemsShowing; i++) {
- var index = $scope.limitedTestData[i].index;
- if ($scope.isValueInArray(index, $scope.selectedItems)) {
- $scope.toggleValueInArray(index, $scope.selectedItems);
+ $scope.clearAllImagePairs = function() {
+ var numImagePairsShowing = $scope.limitedImagePairs.length;
+ for (var i = 0; i < numImagePairsShowing; i++) {
+ var index = $scope.limitedImagePairs[i].index;
+ if ($scope.isValueInArray(index, $scope.selectedImagePairs)) {
+ $scope.toggleValueInArray(index, $scope.selectedImagePairs);
}
}
}
@@ -168,11 +186,11 @@ Loader.controller(
/**
* Toggle selection of all currently showing tests.
*/
- $scope.toggleAllItems = function() {
- var numItemsShowing = $scope.limitedTestData.length;
- for (var i = 0; i < numItemsShowing; i++) {
- var index = $scope.limitedTestData[i].index;
- $scope.toggleValueInArray(index, $scope.selectedItems);
+ $scope.toggleAllImagePairs = function() {
+ var numImagePairsShowing = $scope.limitedImagePairs.length;
+ for (var i = 0; i < numImagePairsShowing; i++) {
+ var index = $scope.limitedImagePairs[i].index;
+ $scope.toggleValueInArray(index, $scope.selectedImagePairs);
}
}
@@ -192,33 +210,33 @@ Loader.controller(
}
/**
- * Move the items in $scope.selectedItems to a different tab,
- * and then clear $scope.selectedItems.
+ * Move the imagePairs in $scope.selectedImagePairs to a different tab,
+ * and then clear $scope.selectedImagePairs.
*
* @param newTab (string): name of the tab to move the tests to
*/
- $scope.moveSelectedItemsToTab = function(newTab) {
- $scope.moveItemsToTab($scope.selectedItems, newTab);
- $scope.selectedItems = [];
+ $scope.moveSelectedImagePairsToTab = function(newTab) {
+ $scope.moveImagePairsToTab($scope.selectedImagePairs, newTab);
+ $scope.selectedImagePairs = [];
$scope.updateResults();
}
/**
- * Move a subset of $scope.testData to a different tab.
+ * Move a subset of $scope.imagePairs to a different tab.
*
- * @param itemIndices (array of ints): indices into $scope.testData
+ * @param imagePairIndices (array of ints): indices into $scope.imagePairs
* indicating which test results to move
* @param newTab (string): name of the tab to move the tests to
*/
- $scope.moveItemsToTab = function(itemIndices, newTab) {
- var itemIndex;
- var numItems = itemIndices.length;
- for (var i = 0; i < numItems; i++) {
- itemIndex = itemIndices[i];
- $scope.numResultsPerTab[$scope.testData[itemIndex].tab]--;
- $scope.testData[itemIndex].tab = newTab;
+ $scope.moveImagePairsToTab = function(imagePairIndices, newTab) {
+ var imagePairIndex;
+ var numImagePairs = imagePairIndices.length;
+ for (var i = 0; i < numImagePairs; i++) {
+ imagePairIndex = imagePairIndices[i];
+ $scope.numResultsPerTab[$scope.imagePairs[imagePairIndex].tab]--;
+ $scope.imagePairs[imagePairIndex].tab = newTab;
}
- $scope.numResultsPerTab[newTab] += numItems;
+ $scope.numResultsPerTab[newTab] += numImagePairs;
}
@@ -277,14 +295,16 @@ Loader.controller(
'resultsToLoad': $scope.queryParameters.copiers.simple,
'displayLimitPending': $scope.queryParameters.copiers.simple,
'imageSizePending': $scope.queryParameters.copiers.simple,
- 'sortColumn': $scope.queryParameters.copiers.simple,
-
- 'builder': $scope.queryParameters.copiers.categoryValueMatch,
- 'test': $scope.queryParameters.copiers.categoryValueMatch,
+ 'sortColumnSubdict': $scope.queryParameters.copiers.simple,
+ 'sortColumnKey': $scope.queryParameters.copiers.simple,
'hiddenResultTypes': $scope.queryParameters.copiers.set,
'hiddenConfigs': $scope.queryParameters.copiers.set,
};
+ $scope.queryParameters.map[constants.KEY__EXTRACOLUMN__BUILDER] =
+ $scope.queryParameters.copiers.categoryValueMatch;
+ $scope.queryParameters.map[constants.KEY__EXTRACOLUMN__TEST] =
+ $scope.queryParameters.copiers.categoryValueMatch;
// Loads all parameters into $scope from the URL query string;
// any which are not found within the URL will keep their current value.
@@ -339,7 +359,7 @@ Loader.controller(
$scope.displayLimit = $scope.displayLimitPending;
// TODO(epoger): Every time we apply a filter, AngularJS creates
// another copy of the array. Is there a way we can filter out
- // the items as they are displayed, rather than storing multiple
+ // the imagePairs as they are displayed, rather than storing multiple
// array copies? (For better performance.)
if ($scope.viewingTab == $scope.defaultTab) {
@@ -347,32 +367,34 @@ Loader.controller(
// TODO(epoger): Until we allow the user to reverse sort order,
// there are certain columns we want to sort in a different order.
var doReverse = (
- ($scope.sortColumn == 'percentDifferingPixels') ||
- ($scope.sortColumn == 'weightedDiffMeasure'));
+ ($scope.sortColumnKey ==
+ constants.KEY__DIFFERENCE_DATA__PERCENT_DIFF_PIXELS) ||
+ ($scope.sortColumnKey ==
+ constants.KEY__DIFFERENCE_DATA__WEIGHTED_DIFF));
- $scope.filteredTestData =
+ $scope.filteredImagePairs =
$filter("orderBy")(
- $filter("removeHiddenItems")(
- $scope.testData,
+ $filter("removeHiddenImagePairs")(
+ $scope.imagePairs,
$scope.hiddenResultTypes,
$scope.hiddenConfigs,
$scope.categoryValueMatch.builder,
$scope.categoryValueMatch.test,
$scope.viewingTab
),
- $scope.sortColumn, doReverse);
- $scope.limitedTestData = $filter("limitTo")(
- $scope.filteredTestData, $scope.displayLimit);
+ $scope.getSortColumnValue, doReverse);
+ $scope.limitedImagePairs = $filter("limitTo")(
+ $scope.filteredImagePairs, $scope.displayLimit);
} else {
- $scope.filteredTestData =
+ $scope.filteredImagePairs =
$filter("orderBy")(
$filter("filter")(
- $scope.testData,
+ $scope.imagePairs,
{tab: $scope.viewingTab},
true
),
- $scope.sortColumn);
- $scope.limitedTestData = $scope.filteredTestData;
+ $scope.getSortColumnValue);
+ $scope.limitedImagePairs = $scope.filteredImagePairs;
}
$scope.imageSize = $scope.imageSizePending;
$scope.setUpdatesPending(false);
@@ -382,14 +404,33 @@ Loader.controller(
/**
* Re-sort the displayed results.
*
- * @param sortColumn (string): name of the column to sort on
+ * @param subdict (string): which subdictionary
+ * (constants.KEY__DIFFERENCE_DATA, constants.KEY__EXPECTATIONS_DATA,
+ * constants.KEY__EXTRA_COLUMN_VALUES) the sort column key is within
+ * @param key (string): sort by value associated with this key in subdict
*/
- $scope.sortResultsBy = function(sortColumn) {
- $scope.sortColumn = sortColumn;
+ $scope.sortResultsBy = function(subdict, key) {
+ $scope.sortColumnSubdict = subdict;
+ $scope.sortColumnKey = key;
$scope.updateResults();
}
/**
+ * For a particular ImagePair, return the value of the column we are
+ * sorting on (according to $scope.sortColumnSubdict and
+ * $scope.sortColumnKey).
+ *
+ * @param imagePair: imagePair to get a column value out of.
+ */
+ $scope.getSortColumnValue = function(imagePair) {
+ if ($scope.sortColumnSubdict in imagePair) {
+ return imagePair[$scope.sortColumnSubdict][$scope.sortColumnKey];
+ } else {
+ return undefined;
+ }
+ }
+
+ /**
* Set $scope.categoryValueMatch[name] = value, and update results.
*
* @param name
@@ -456,10 +497,13 @@ Loader.controller(
* Tell the server that the actual results of these particular tests
* are acceptable.
*
- * @param testDataSubset an array of test results, most likely a subset of
- * $scope.testData (perhaps with some modifications)
+ * TODO(epoger): This assumes that the original expectations are in
+ * imageSetA, and the actuals are in imageSetB.
+ *
+ * @param imagePairsSubset an array of test results, most likely a subset of
+ * $scope.imagePairs (perhaps with some modifications)
*/
- $scope.submitApprovals = function(testDataSubset) {
+ $scope.submitApprovals = function(imagePairsSubset) {
$scope.submitPending = true;
// Convert bug text field to null or 1-item array.
@@ -476,30 +520,40 @@ Loader.controller(
// result type, RenderModeMismatch')
var encounteredComparisonConfig = false;
- var newResults = [];
- for (var i = 0; i < testDataSubset.length; i++) {
- var actualResult = testDataSubset[i];
- var expectedResult = {
- builder: actualResult['builder'],
- test: actualResult['test'],
- config: actualResult['config'],
- expectedHashType: actualResult['actualHashType'],
- expectedHashDigest: actualResult['actualHashDigest'],
- };
- if (0 == expectedResult.config.indexOf('comparison-')) {
+ var updatedExpectations = [];
+ for (var i = 0; i < imagePairsSubset.length; i++) {
+ var imagePair = imagePairsSubset[i];
+ var updatedExpectation = {};
+ updatedExpectation[constants.KEY__EXPECTATIONS_DATA] =
+ imagePair[constants.KEY__EXPECTATIONS_DATA];
+ updatedExpectation[constants.KEY__EXTRA_COLUMN_VALUES] =
+ imagePair[constants.KEY__EXTRA_COLUMN_VALUES];
+ updatedExpectation[constants.KEY__NEW_IMAGE_URL] =
+ imagePair[constants.KEY__IMAGE_B_URL];
+ if (0 == updatedExpectation[constants.KEY__EXTRA_COLUMN_VALUES]
+ [constants.KEY__EXTRACOLUMN__CONFIG]
+ .indexOf('comparison-')) {
encounteredComparisonConfig = true;
}
// Advanced settings...
- expectedResult['reviewed-by-human'] =
- $scope.submitAdvancedSettings['reviewed-by-human'];
- if (true == $scope.submitAdvancedSettings['ignore-failure']) {
+ if (null == updatedExpectation[constants.KEY__EXPECTATIONS_DATA]) {
+ updatedExpectation[constants.KEY__EXPECTATIONS_DATA] = {};
+ }
+ updatedExpectation[constants.KEY__EXPECTATIONS_DATA]
+ [constants.KEY__EXPECTATIONS__REVIEWED] =
+ $scope.submitAdvancedSettings[
+ constants.KEY__EXPECTATIONS__REVIEWED];
+ if (true == $scope.submitAdvancedSettings[
+ constants.KEY__EXPECTATIONS__IGNOREFAILURE]) {
// if it's false, don't send it at all (just keep the default)
- expectedResult['ignore-failure'] = true;
+ updatedExpectation[constants.KEY__EXPECTATIONS_DATA]
+ [constants.KEY__EXPECTATIONS__IGNOREFAILURE] = true;
}
- expectedResult['bugs'] = bugs;
+ updatedExpectation[constants.KEY__EXPECTATIONS_DATA]
+ [constants.KEY__EXPECTATIONS__BUGS] = bugs;
- newResults.push(expectedResult);
+ updatedExpectations.push(updatedExpectation);
}
if (encounteredComparisonConfig) {
alert("Approval failed -- you cannot approve results with config " +
@@ -507,21 +561,24 @@ Loader.controller(
$scope.submitPending = false;
return;
}
+ var modificationData = {};
+ modificationData[constants.KEY__EDITS__MODIFICATIONS] =
+ updatedExpectations;
+ modificationData[constants.KEY__EDITS__OLD_RESULTS_HASH] =
+ $scope.header[constants.KEY__HEADER__DATAHASH];
+ modificationData[constants.KEY__EDITS__OLD_RESULTS_TYPE] =
+ $scope.header[constants.KEY__HEADER__TYPE];
$http({
method: "POST",
url: "/edits",
- data: {
- oldResultsType: $scope.header.type,
- oldResultsHash: $scope.header.dataHash,
- modifications: newResults
- }
+ data: modificationData
}).success(function(data, status, headers, config) {
- var itemIndicesToMove = [];
- for (var i = 0; i < testDataSubset.length; i++) {
- itemIndicesToMove.push(testDataSubset[i].index);
+ var imagePairIndicesToMove = [];
+ for (var i = 0; i < imagePairsSubset.length; i++) {
+ imagePairIndicesToMove.push(imagePairsSubset[i].index);
}
- $scope.moveItemsToTab(itemIndicesToMove,
- "HackToMakeSureThisItemDisappears");
+ $scope.moveImagePairsToTab(imagePairIndicesToMove,
+ "HackToMakeSureThisImagePairDisappears");
$scope.updateResults();
alert("New baselines submitted successfully!\n\n" +
"You still need to commit the updated expectations files on " +
@@ -682,5 +739,23 @@ Loader.controller(
return $scope.hexColorString(v, v, v);
}
+ /**
+ * Returns the last path component of image diff URL for a given ImagePair.
+ *
+ * Depending on which diff this is (whitediffs, pixeldiffs, etc.) this
+ * will be relative to different base URLs.
+ *
+ * We must keep this function in sync with _get_difference_locator() in
+ * ../imagediffdb.py
+ *
+ * @param imagePair: ImagePair to generate image diff URL for
+ */
+ $scope.getImageDiffRelativeUrl = function(imagePair) {
+ var before =
+ imagePair[constants.KEY__IMAGE_A_URL] + "-vs-" +
+ imagePair[constants.KEY__IMAGE_B_URL];
+ return before.replace(/[^\w\-]/g, "_") + ".png";
+ }
+
}
);
« no previous file with comments | « gm/rebaseline_server/static/constants.js ('k') | gm/rebaseline_server/static/view.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698