Make build.webkit.org/dashboard work with changeset_show_files=location
[WebKit-https.git] / Tools / BuildSlaveSupport / build.webkit.org-config / public_html / dashboard / Scripts / Utilities.js
1 /*
2  * Copyright (C) 2013, 2014 Apple 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 JSON.LoadError = "JSONLoadError";
27 JSON.ParseError = "JSONParseError";
28
29 // JSON.load() may be called using the following forms:
30 //
31 // JSON.load("http://www.apple.com", function() {/* success */})
32 // OR
33 // JSON.load("http://www.apple.com", function() {/* success */}, {withCredentials: true, ...})
34 // OR
35 // JSON.load("http://www.apple.com", function() {/* success */}, function() {/* failure */})
36 // OR
37 // JSON.load("http://www.apple.com", function() {/* success */}, function() {/* failure */}, {withCredentials: true, ...})
38 JSON.load = function(url, successCallback, failureCallback, options)
39 {
40     console.assert(url);
41
42     if (!(successCallback instanceof Function))
43         return;
44
45     if (failureCallback && typeof failureCallback === "object")
46         options = failureCallback;
47
48     if (!(failureCallback instanceof Function))
49         failureCallback = function() { };
50
51     if (typeof options !== "object")
52         options = {};
53
54     var request = new XMLHttpRequest;
55     request.onreadystatechange = function() {
56         if (this.readyState !== 4)
57             return;
58
59         // Don't consider a status of 0 to be a load error for easier testing with local files.
60         var loadErrorOccurred = this.status !== 0 && this.status !== 200;
61         if (loadErrorOccurred) {
62             failureCallback({errorType: JSON.LoadError, error: this.statusText, errorHTTPCode: this.status});
63             return;
64         }
65
66         try {
67             var responseText = request.responseText;
68             if (options.hasOwnProperty("jsonpCallbackName"))
69                 responseText = responseText.replace(new RegExp("^" + options.jsonpCallbackName + "\\((.*)\\);?$"), "$1");
70             var data = JSON.parse(responseText);
71         } catch (e) {
72             var data = {errorType: JSON.ParseError, error: e.message};
73             failureCallback(data);
74             return;
75         }
76
77         successCallback(data);
78     };
79
80     request.open("GET", url);
81     if (options.hasOwnProperty("withCredentials"))
82         request.withCredentials = options.withCredentials;
83     request.send();
84 };
85
86 function loadXML(url, callback, options) {
87     console.assert(url);
88
89     if (!(callback instanceof Function))
90         return;
91
92     var request = new XMLHttpRequest;
93     request.onreadystatechange = function() {
94         if (this.readyState !== 4)
95             return;
96
97         // Allow a status of 0 for easier testing with local files.
98         if (!this.status || this.status === 200)
99             callback(request.responseXML);
100     };
101
102     request.open("GET", url);
103     if ((typeof options === "object") && options.hasOwnProperty("withCredentials"))
104         request.withCredentials = options.withCredentials;
105     request.send();
106 };
107
108 Node.prototype.isAncestor = function(node)
109 {
110     if (!node)
111         return false;
112
113     var currentNode = node.parentNode;
114     while (currentNode) {
115         if (this === currentNode)
116             return true;
117         currentNode = currentNode.parentNode;
118     }
119
120     return false;
121 }
122
123 Node.prototype.isDescendant = function(descendant)
124 {
125     return !!descendant && descendant.isAncestor(this);
126 }
127
128 Node.prototype.isSelfOrAncestor = function(node)
129 {
130     return !!node && (node === this || this.isAncestor(node));
131 }
132
133 Node.prototype.isSelfOrDescendant = function(node)
134 {
135     return !!node && (node === this || this.isDescendant(node));
136 }
137
138 Element.prototype.removeChildren = function()
139 {
140     // This has been tested to be the fastest removal method.
141     if (this.firstChild)
142         this.textContent = "";
143 };
144
145 DOMTokenList.prototype.contains = function(string)
146 {
147     for (var i = 0, end = this.length; i < end; ++i) {
148         if (this.item(i) === string)
149             return true;
150     }
151     return false;
152 }
153
154 Array.prototype.contains = function(value)
155 {
156     return this.indexOf(value) >= 0;
157 };
158
159 Array.prototype.findFirst = function(predicate)
160 {
161     for (var i = 0; i < this.length; ++i) {
162         if (predicate(this[i]))
163             return this[i];
164     }
165
166     return null;
167 };
168
169 String.prototype.contains = function(substring)
170 {
171     return this.indexOf(substring) >= 0;
172 };
173
174 String.prototype.startsWith = function(substring)
175 {
176     return this.lastIndexOf(substring, 0) === 0;
177 }