| Index: expectations/gm/loader.js | 
| diff --git a/expectations/gm/loader.js b/expectations/gm/loader.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..c5d8a7c8c19b4124d391265495f7fc262f5864c1 | 
| --- /dev/null | 
| +++ b/expectations/gm/loader.js | 
| @@ -0,0 +1,52 @@ | 
| +/* | 
| + * GMExpectedResultsLoader: | 
| + * Reads an expected-results.json file, and imports its data into $scope. | 
| + */ | 
| +var GMExpectedResultsLoader = angular.module( | 
| +    'GMExpectedResultsLoader', | 
| +    [], | 
| +    function($httpProvider) { | 
| +      /* Override transformResponse so that the numeric checksums are interpreted as | 
| +       * strings instead, since Javascript cannot handle 64-bit integers. */ | 
| +      $httpProvider.defaults.transformResponse = function(data, headersGetter) { | 
| +        return JSON.parse(data.replace(/\s(\d+)\s/g, " \"$1\" ")); | 
| +      } | 
| +    } | 
| +); | 
| +GMExpectedResultsLoader.controller( | 
| +    'GMExpectedResultsLoader.Controller', | 
| +    function($scope, $http) { | 
| +      /* When the changePlatformPath function is called, download expected-results.json | 
| +       * from the desired platform directory. | 
| +       * | 
| +       * When the JSON is received, predigest it and return it to the frontend as | 
| +       * $scope.gmExpectedResults . | 
| +       */ | 
| +      $scope.changePlatformPath = function() { | 
| +        $http.get($scope.platformPath + "/expected-results.json").success( | 
| +            function(response) { | 
| +              var jsonResults = []; | 
| +              var imageNameRegex = /^(.+)_([^_]+).png/; | 
| +              angular.forEach(response['expected-results'], function(imageExpectations, imageName) { | 
| +                var matched = imageNameRegex.exec(imageName); | 
| +		var allowedImages = []; | 
| +		angular.forEach(imageExpectations['allowed-digests'], function(allowedDigest, key) { | 
| +		  var thisImage = { | 
| +		    hashType: allowedDigest[0], hashValue: allowedDigest[1] | 
| +		  }; | 
| +		  allowedImages.push(thisImage); | 
| +		}); | 
| +                var thisResult = { | 
| +                  test: matched[1], config: matched[2], | 
| +		  allowedImages: allowedImages, | 
| +		  bugs: imageExpectations['bugs'], | 
| +		  reviewedByHuman: imageExpectations['reviewed-by-human'] | 
| +		}; | 
| +                jsonResults.push(thisResult); | 
| +              }); | 
| +              $scope.gmExpectedResults = jsonResults; | 
| +            } | 
| +         ); | 
| +      }; | 
| +    } | 
| +); | 
|  |