| Index: Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
|
| diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
|
| deleted file mode 100644
|
| index d77e8991fbf04440c0601dd27828e6292425c617..0000000000000000000000000000000000000000
|
| --- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/base.js
|
| +++ /dev/null
|
| @@ -1,464 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2011 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions
|
| - * are met:
|
| - * 1. Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright
|
| - * notice, this list of conditions and the following disclaimer in the
|
| - * documentation and/or other materials provided with the distribution.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
| - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
| - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
| - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
| - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
| - * THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -var base = base || {};
|
| -
|
| -(function(){
|
| -
|
| -// Safari 5.1 lacks Function.prototype.bind.
|
| -if (!('bind' in Function.prototype)) {
|
| - Function.prototype.bind = function(thisObject) {
|
| - var method = this;
|
| - var boundArguments = [];
|
| - for (var i = 1; i < arguments.length; ++i) {
|
| - boundArguments.push(arguments[i]);
|
| - }
|
| - return function() {
|
| - var actualParameters = [];
|
| - for (var i = 0; i < boundArguments.length; ++i) {
|
| - actualParameters.push(boundArguments[i]);
|
| - }
|
| - for (var i = 0; i < arguments.length; ++i) {
|
| - actualParameters.push(arguments[i]);
|
| - }
|
| - return method.apply(thisObject, actualParameters);
|
| - }
|
| - }
|
| -}
|
| -
|
| -base.asInteger = function(stringOrInteger)
|
| -{
|
| - if (typeof stringOrInteger == 'string')
|
| - return parseInt(stringOrInteger);
|
| - return stringOrInteger;
|
| -};
|
| -
|
| -base.endsWith = function(string, suffix)
|
| -{
|
| - if (suffix.length > string.length)
|
| - return false;
|
| - var expectedIndex = string.length - suffix.length;
|
| - return string.lastIndexOf(suffix) == expectedIndex;
|
| -};
|
| -
|
| -base.repeatString = function(string, count)
|
| -{
|
| - return new Array(count + 1).join(string);
|
| -};
|
| -
|
| -base.joinPath = function(parent, child)
|
| -{
|
| - if (parent.length == 0)
|
| - return child;
|
| - return parent + '/' + child;
|
| -};
|
| -
|
| -base.dirName = function(path)
|
| -{
|
| - var directoryIndex = path.lastIndexOf('/');
|
| - if (directoryIndex == -1)
|
| - return path;
|
| - return path.substr(0, directoryIndex);
|
| -};
|
| -
|
| -base.trimExtension = function(url)
|
| -{
|
| - var index = url.lastIndexOf('.');
|
| - if (index == -1)
|
| - return url;
|
| - return url.substr(0, index);
|
| -}
|
| -
|
| -base.uniquifyArray = function(array)
|
| -{
|
| - var seen = {};
|
| - var result = [];
|
| - $.each(array, function(index, value) {
|
| - if (seen[value])
|
| - return;
|
| - seen[value] = true;
|
| - result.push(value);
|
| - });
|
| - return result;
|
| -};
|
| -
|
| -base.flattenArray = function(arrayOfArrays)
|
| -{
|
| - if (!arrayOfArrays.length)
|
| - return [];
|
| - return arrayOfArrays.reduce(function(left, right) {
|
| - return left.concat(right);
|
| - });
|
| -};
|
| -
|
| -base.filterDictionary = function(dictionary, predicate)
|
| -{
|
| - var result = {};
|
| -
|
| - for (var key in dictionary) {
|
| - if (predicate(key))
|
| - result[key] = dictionary[key];
|
| - }
|
| -
|
| - return result;
|
| -};
|
| -
|
| -base.mapDictionary = function(dictionary, functor)
|
| -{
|
| - var result = {};
|
| -
|
| - for (var key in dictionary) {
|
| - var value = functor(dictionary[key]);
|
| - if (typeof value !== 'undefined')
|
| - result[key] = value;
|
| - }
|
| -
|
| - return result;
|
| -};
|
| -
|
| -base.filterTree = function(tree, isLeaf, predicate)
|
| -{
|
| - var filteredTree = {};
|
| -
|
| - function walkSubtree(subtree, directory)
|
| - {
|
| - for (var childName in subtree) {
|
| - var child = subtree[childName];
|
| - var childPath = base.joinPath(directory, childName);
|
| - if (isLeaf(child)) {
|
| - if (predicate(child))
|
| - filteredTree[childPath] = child;
|
| - continue;
|
| - }
|
| - walkSubtree(child, childPath);
|
| - }
|
| - }
|
| -
|
| - walkSubtree(tree, '');
|
| - return filteredTree;
|
| -};
|
| -
|
| -base.forEachDirectory = function(pathList, callback)
|
| -{
|
| - var pathsByDirectory = {};
|
| - pathList.forEach(function(path) {
|
| - var directory = base.dirName(path);
|
| - pathsByDirectory[directory] = pathsByDirectory[directory] || [];
|
| - pathsByDirectory[directory].push(path);
|
| - });
|
| - Object.keys(pathsByDirectory).sort().forEach(function(directory) {
|
| - var paths = pathsByDirectory[directory];
|
| - callback(directory + ' (' + paths.length + ' tests)', paths);
|
| - });
|
| -};
|
| -
|
| -base.parseJSONP = function(jsonp)
|
| -{
|
| - var startIndex = jsonp.indexOf('(') + 1;
|
| - var endIndex = jsonp.lastIndexOf(')');
|
| - if (startIndex == 0 || endIndex == -1)
|
| - return {};
|
| - return JSON.parse(jsonp.substr(startIndex, endIndex - startIndex));
|
| -};
|
| -
|
| -base.RequestTracker = function(requestsInFlight, callback, args)
|
| -{
|
| - this._requestsInFlight = requestsInFlight;
|
| - this._callback = callback;
|
| - this._args = args || [];
|
| - this._tryCallback();
|
| -};
|
| -
|
| -base.RequestTracker.prototype = {
|
| - _tryCallback: function()
|
| - {
|
| - if (!this._requestsInFlight && this._callback)
|
| - this._callback.apply(null, this._args);
|
| - },
|
| - requestComplete: function()
|
| - {
|
| - --this._requestsInFlight;
|
| - this._tryCallback();
|
| - }
|
| -}
|
| -
|
| -base.callInParallel = function(functionList, callback)
|
| -{
|
| - var requestTracker = new base.RequestTracker(functionList.length, callback);
|
| -
|
| - $.each(functionList, function(index, func) {
|
| - func(function() {
|
| - requestTracker.requestComplete();
|
| - });
|
| - });
|
| -};
|
| -
|
| -base.callInSequence = function(func, argumentList, callback)
|
| -{
|
| - var nextIndex = 0;
|
| -
|
| - function callNext()
|
| - {
|
| - if (nextIndex >= argumentList.length) {
|
| - callback();
|
| - return;
|
| - }
|
| -
|
| - func(argumentList[nextIndex++], callNext);
|
| - }
|
| -
|
| - callNext();
|
| -};
|
| -
|
| -base.CallbackIterator = function(callback, listOfArgumentArrays)
|
| -{
|
| - this._callback = callback;
|
| - this._nextIndex = 0;
|
| - this._listOfArgumentArrays = listOfArgumentArrays;
|
| -};
|
| -
|
| -base.CallbackIterator.prototype.hasNext = function()
|
| -{
|
| - return this._nextIndex < this._listOfArgumentArrays.length;
|
| -};
|
| -
|
| -base.CallbackIterator.prototype.hasPrevious = function()
|
| -{
|
| - return this._nextIndex - 2 >= 0;
|
| -};
|
| -
|
| -base.CallbackIterator.prototype.callNext = function()
|
| -{
|
| - if (!this.hasNext())
|
| - return;
|
| - var args = this._listOfArgumentArrays[this._nextIndex];
|
| - this._nextIndex++;
|
| - this._callback.apply(null, args);
|
| -};
|
| -
|
| -base.CallbackIterator.prototype.callPrevious = function()
|
| -{
|
| - if (!this.hasPrevious())
|
| - return;
|
| - var args = this._listOfArgumentArrays[this._nextIndex - 2];
|
| - this._nextIndex--;
|
| - this._callback.apply(null, args);
|
| -};
|
| -
|
| -base.AsynchronousCache = function(fetch)
|
| -{
|
| - this._fetch = fetch;
|
| - this._dataCache = {};
|
| - this._callbackCache = {};
|
| -};
|
| -
|
| -base.AsynchronousCache.prototype.get = function(key, callback)
|
| -{
|
| - var self = this;
|
| -
|
| - if (self._dataCache[key]) {
|
| - // FIXME: Consider always calling callback asynchronously.
|
| - callback(self._dataCache[key]);
|
| - return;
|
| - }
|
| -
|
| - if (key in self._callbackCache) {
|
| - self._callbackCache[key].push(callback);
|
| - return;
|
| - }
|
| -
|
| - self._callbackCache[key] = [callback];
|
| -
|
| - self._fetch.call(null, key, function(data) {
|
| - self._dataCache[key] = data;
|
| -
|
| - var callbackList = self._callbackCache[key];
|
| - delete self._callbackCache[key];
|
| -
|
| - callbackList.forEach(function(cachedCallback) {
|
| - cachedCallback(data);
|
| - });
|
| - });
|
| -};
|
| -
|
| -base.AsynchronousCache.prototype.clear = function()
|
| -{
|
| - this._dataCache = {};
|
| - this._callbackCache = {};
|
| -}
|
| -
|
| -/*
|
| - Maintains a dictionary of items, tracking their updates and removing items that haven't been updated.
|
| - An "update" is a call to the "update" method.
|
| - To remove stale items, call the "remove" method. It will remove all
|
| - items that have not been been updated since the last call of "remove".
|
| -*/
|
| -base.UpdateTracker = function()
|
| -{
|
| - this._items = {};
|
| - this._updated = {};
|
| -}
|
| -
|
| -base.UpdateTracker.prototype = {
|
| - /*
|
| - Update an {key}/{item} pair. You can make the dictionary act as a set and
|
| - skip the {item}, in which case the {key} is also the {item}.
|
| - */
|
| - update: function(key, object)
|
| - {
|
| - object = object || key;
|
| - this._items[key] = object;
|
| - this._updated[key] = 1;
|
| - },
|
| - exists: function(key)
|
| - {
|
| - return !!this.get(key);
|
| - },
|
| - get: function(key)
|
| - {
|
| - return this._items[key];
|
| - },
|
| - length: function()
|
| - {
|
| - return Object.keys(this._items).length;
|
| - },
|
| - /*
|
| - Callback parameters are:
|
| - - item
|
| - - key
|
| - - updated, which is true if the item was updated after last purge() call.
|
| - */
|
| - forEach: function(callback, thisObject)
|
| - {
|
| - if (!callback)
|
| - return;
|
| -
|
| - Object.keys(this._items).sort().forEach(function(key) {
|
| - var item = this._items[key];
|
| - callback.call(thisObject || item, item, key, !!this._updated[key]);
|
| - }, this);
|
| - },
|
| - purge: function(removeCallback, thisObject) {
|
| - removeCallback = removeCallback || function() {};
|
| - this.forEach(function(item, key, updated) {
|
| - if (updated)
|
| - return;
|
| - removeCallback.call(thisObject || item, item);
|
| - delete this._items[key];
|
| - }, this);
|
| - this._updated = {};
|
| - }
|
| -}
|
| -
|
| -// Based on http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/resources/shared/js/cr/ui.js
|
| -base.extends = function(base, prototype)
|
| -{
|
| - var extended = function() {
|
| - var element = typeof base == 'string' ? document.createElement(base) : base.call(this);
|
| - extended.prototype.__proto__ = element.__proto__;
|
| - element.__proto__ = extended.prototype;
|
| - var singleton = element.init && element.init.apply(element, arguments);
|
| - if (singleton)
|
| - return singleton;
|
| - return element;
|
| - }
|
| -
|
| - extended.prototype = prototype;
|
| - return extended;
|
| -}
|
| -
|
| -function createRelativeTimeDescriptor(divisorInMilliseconds, unit)
|
| -{
|
| - return function(delta) {
|
| - var deltaInUnits = delta / divisorInMilliseconds;
|
| - return (deltaInUnits).toFixed(0) + ' ' + unit + (deltaInUnits >= 1.5 ? 's' : '') + ' ago';
|
| - }
|
| -}
|
| -
|
| -var kMinuteInMilliseconds = 60 * 1000;
|
| -var kRelativeTimeSlots = [
|
| - {
|
| - maxMilliseconds: kMinuteInMilliseconds,
|
| - describe: function(delta) { return 'Just now'; }
|
| - },
|
| - {
|
| - maxMilliseconds: 60 * kMinuteInMilliseconds,
|
| - describe: createRelativeTimeDescriptor(kMinuteInMilliseconds, 'minute')
|
| - },
|
| - {
|
| - maxMilliseconds: 24 * 60 * kMinuteInMilliseconds,
|
| - describe: createRelativeTimeDescriptor(60 * kMinuteInMilliseconds, 'hour')
|
| - },
|
| - {
|
| - maxMilliseconds: Number.MAX_VALUE,
|
| - describe: createRelativeTimeDescriptor(24 * 60 * kMinuteInMilliseconds, 'day')
|
| - }
|
| -];
|
| -
|
| -/*
|
| - Represent time as descriptive text, relative to now and gradually decreasing in precision:
|
| - delta < 1 minutes => Just Now
|
| - delta < 60 minutes => X minute[s] ago
|
| - delta < 24 hours => X hour[s] ago
|
| - delta < inf => X day[s] ago
|
| -*/
|
| -base.relativizeTime = function(time)
|
| -{
|
| - var result;
|
| - var delta = new Date().getTime() - time;
|
| - kRelativeTimeSlots.some(function(slot) {
|
| - if (delta >= slot.maxMilliseconds)
|
| - return false;
|
| -
|
| - result = slot.describe(delta);
|
| - return true;
|
| - });
|
| - return result;
|
| -}
|
| -
|
| -base.getURLParameter = function(name)
|
| -{
|
| - var match = RegExp(name + '=' + '(.+?)(&|$)').exec(location.search);
|
| - if (!match)
|
| - return null;
|
| - return decodeURI(match[1])
|
| -}
|
| -
|
| -base.underscoredBuilderName = function(builderName)
|
| -{
|
| - return builderName.replace(/[ .()]/g, '_');
|
| -}
|
| -
|
| -base.createLinkNode = function(url, textContent, opt_target)
|
| -{
|
| - var link = document.createElement('a');
|
| - link.href = url;
|
| - if (opt_target)
|
| - link.target = opt_target;
|
| - link.appendChild(document.createTextNode(textContent));
|
| - return link;
|
| -}
|
| -
|
| -})();
|
|
|