summaryrefslogtreecommitdiffstats
path: root/Tools/BuildSlaveSupport
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/BuildSlaveSupport')
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/config.json10
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg6
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksLoader.js65
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParser.js40
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParserWorker.js101
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.css91
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js202
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/RecentBuildsLoader.js80
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/Utilities.js42
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js67
-rw-r--r--Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/index.html80
-rwxr-xr-xTools/BuildSlaveSupport/build.webkit.org-config/templates/root.html1
-rw-r--r--Tools/BuildSlaveSupport/test-result-archive6
-rwxr-xr-xTools/BuildSlaveSupport/win/kill-old-processes2
14 files changed, 787 insertions, 6 deletions
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/config.json b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
index 09953ab..28ff304 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/config.json
@@ -219,15 +219,19 @@
],
"schedulers": [ { "type": "AnyBranchScheduler", "name": "trunk", "change_filter": "trunk_filter", "treeStableTimer": 45.0,
- "builderNames": ["Leopard Intel Release (Build)", "Leopard Intel Debug (Build)",
- "SnowLeopard Intel Release (Build)", "SnowLeopard Intel Leaks",
- "GTK Linux 32-bit Release", "GTK Linux 32-bit Debug", "GTK Linux 64-bit Debug",
+ "builderNames": ["GTK Linux 32-bit Release", "GTK Linux 32-bit Debug", "GTK Linux 64-bit Debug",
"Qt Linux Release", "Qt Linux Release minimal", "Qt Linux ARMv7 Release",
"Qt Windows 32-bit Release", "Qt Windows 32-bit Debug",
"Chromium Win Release", "Chromium Mac Release", "Chromium Linux Release",
"Chromium Win Release (Tests)", "Chromium Mac Release (Tests)", "Chromium Linux Release (Tests)",
"WinCairo Debug (Build)", "WinCE Release (Build)", "EFL Linux Release (Build)"]
},
+ { "type": "PlatformSpecificScheduler", "platform": "mac-leopard", "branch": "trunk", "treeStableTimer": 45.0,
+ "builderNames": ["Leopard Intel Release (Build)", "Leopard Intel Debug (Build)"]
+ },
+ { "type": "PlatformSpecificScheduler", "platform": "mac-snowleopard", "branch": "trunk", "treeStableTimer": 45.0,
+ "builderNames": ["SnowLeopard Intel Release (Build)", "SnowLeopard Intel Leaks"]
+ },
{ "type": "PlatformSpecificScheduler", "platform": "win", "branch": "trunk", "treeStableTimer": 45.0,
"builderNames": ["Windows Release (Build)", "Windows Debug (Build)"]
},
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
index 7913095..1beee38 100644
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/master.cfg
@@ -145,7 +145,7 @@ class RunJavaScriptCoreTests(shell.Test):
description = ["jscore-tests running"]
descriptionDone = ["jscore-tests"]
command = ["perl", "./Tools/Scripts/run-javascriptcore-tests", WithProperties("--%(configuration)s")]
- logfiles = {'results': 'Source/JavaScriptCore/tests/mozilla/actual.html'}
+ logfiles = {'actual.html (source)': 'Source/JavaScriptCore/tests/mozilla/actual.html'}
def __init__(self, skipBuild=False, *args, **kwargs):
self.skipBuild = skipBuild
@@ -168,6 +168,9 @@ class RunJavaScriptCoreTests(shell.Test):
else:
self.regressionLine = None
+ if 'actual.html (source)' in cmd.logs:
+ self.addHTMLLog('actual.html', cmd.logs['actual.html (source)'].getText())
+
def evaluateCommand(self, cmd):
if self.regressionLine:
return FAILURE
@@ -360,6 +363,7 @@ class RunQtAPITests(shell.Test):
return [self.name]
class RunWebKitLeakTests(RunWebKitTests):
+ warnOnWarnings = True
def start(self):
self.setCommand(self.command + ["--leaks"])
return RunWebKitTests.start(self)
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksLoader.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksLoader.js
new file mode 100644
index 0000000..e559e73
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksLoader.js
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+function LeaksLoader(didCountLeaksFilesCallback, didLoadLeaksFileCallback) {
+ this._didCountLeaksFilesCallback = didCountLeaksFilesCallback;
+ this._didLoadLeaksFileCallback = didLoadLeaksFileCallback;
+}
+
+LeaksLoader.prototype = {
+ start: function(url) {
+ if (/\.txt$/.test(url))
+ this._loadLeaksFiles([url]);
+ else
+ this._loadLeaksFromResultsPage(url);
+ },
+
+ _loadLeaksFiles: function(urls) {
+ this._didCountLeaksFilesCallback(urls.length);
+
+ var self = this;
+ var pendingURLs = urls.length;
+ urls.forEach(function(url) {
+ getResource(url, function(xhr) {
+ self._didLoadLeaksFileCallback(xhr.responseText);
+ });
+ });
+ },
+
+ _loadLeaksFromResultsPage: function(url) {
+ var self = this;
+ getResource(url, function(xhr) {
+ var root = document.createElement("html");
+ root.innerHTML = xhr.responseText;
+
+ // Strip off everything after the last /.
+ var baseURL = url.substring(0, url.lastIndexOf("/") + 1);
+
+ var urls = Array.prototype.map.call(root.querySelectorAll("tr.file > td > a[href$='-leaks.txt']"), function(link) { return baseURL + link.getAttribute("href"); });
+
+ self._loadLeaksFiles(urls);
+ });
+ },
+};
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParser.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParser.js
new file mode 100644
index 0000000..bcd3800
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParser.js
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+function LeaksParser(didParseLeaksFileCallback) {
+ this._didParseLeaksFileCallback = didParseLeaksFileCallback;
+ this._worker = new Worker("LeaksParserWorker.js");
+
+ var self = this;
+ this._worker.onmessage = function(e) {
+ self._didParseLeaksFileCallback(e.data);
+ };
+}
+
+LeaksParser.prototype = {
+ addLeaksFile: function(leaksText) {
+ this._worker.postMessage(leaksText);
+ },
+};
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParserWorker.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParserWorker.js
new file mode 100644
index 0000000..c425b15
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksParserWorker.js
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+function LeaksParserWorker() {
+ this.profile = this._createNode("top level");
+}
+
+LeaksParserWorker.prototype = {
+ addLeaksFile: function(leaksText) {
+ this._incorporateLeaks(this._parseLeaks(leaksText));
+ },
+
+ _parseLeaks: function(text) {
+ var leaks = [];
+ var currentSize = 0;
+ text.split("\n").forEach(function(line) {
+ var match = /^Leak:.*\ssize=(\d+)\s/.exec(line);
+ if (match) {
+ currentSize = parseInt(match[1], 10);
+ return;
+ }
+ if (!/^\s+Call stack:/.test(line))
+ return;
+
+ // The first frame is not really a frame at all ("Call stack: thread 0xNNNNN:"), so we omit it.
+ leaks.push({ size: currentSize, stack: line.split(" | ").slice(1).map(function(str) { return str.trim(); }) });
+ currentSize = 0;
+ });
+ return leaks;
+ },
+
+ _createNode: function(functionName) {
+ return {
+ functionName: functionName,
+ selfTime: 0,
+ totalTime: 0,
+ averageTime: 0,
+ numberOfCalls: 0,
+ children: [],
+ childrenByName: {},
+ callUID: functionName,
+ };
+ },
+
+ // This function creates a fake "profile" from a set of leak stacks. "selfTime" is the number of
+ // stacks in which this function was at the top (in theory, only functions like malloc should have a
+ // non-zero selfTime). "totalTime" is the number of stacks which contain this function (and thus is
+ // the number of leaks that occurred in or beneath this function).
+ // FIXME: This is expensive! Can we parallelize it?
+ _incorporateLeaks: function(leaks) {
+ var self = this;
+ leaks.forEach(function(leak) {
+ leak.stack.reduce(function(node, frame, index, array) {
+ var childNode;
+ if (frame in node.childrenByName)
+ childNode = node.childrenByName[frame];
+ else {
+ childNode = self._createNode(frame);
+ childNode.head = self.profile;
+ node.childrenByName[frame] = childNode;
+ node.children.push(childNode);
+ }
+ if (index === array.length - 1)
+ childNode.selfTime += leak.size;
+ childNode.totalTime += leak.size;
+ ++childNode.numberOfCalls;
+ return childNode;
+ }, self.profile);
+ });
+ self.profile.totalTime = self.profile.children.reduce(function(sum, child) { return sum + child.totalTime; }, 0);
+ },
+};
+
+var parser = new LeaksParserWorker();
+
+onmessage = function(e) {
+ parser.addLeaksFile(e.data);
+ postMessage(parser.profile);
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.css b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.css
new file mode 100644
index 0000000..76d71a8
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.css
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+#url-prompt-container {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 50000;
+}
+
+#url-prompt {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ width: 400px;
+ height: 300px;
+ margin: auto;
+ background-color: white;
+ -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.8);
+ padding: 50px 0;
+ text-align: center;
+}
+
+#loading-indicator {
+ position: absolute;
+ right: 20px;
+ width: 150px;
+ margin-top: 5px;
+}
+
+#spinner {
+ float: left;
+ margin-top: -1px;
+}
+
+#loading-indicator-label {
+ margin-left: 5px;
+}
+
+#recent-builds-loading-indicator {
+ color: gray;
+}
+
+#recent-builds-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/* Inspector style overrides */
+
+.percent-time-status-bar-item {
+ /* We always show leak counts as real values, not percentages, so this button isn't useful. */
+ display: none !important;
+}
+
+.data-grid .data-container {
+ overflow-x: visible;
+ overflow-y: auto;
+}
+
+.data-grid td > div, .data-grid th > div {
+ overflow: visible;
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js
new file mode 100644
index 0000000..bd83f1a
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/LeaksViewer.js
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2011 Apple 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 LeaksViewer = {
+ loaded: function() {
+ this._loader = new LeaksLoader(this._didCountLeaksFiles.bind(this), this._didLoadLeaksFile.bind(this));
+ this._parser = new LeaksParser(this._didParseLeaksFile.bind(this));
+
+ this._loadingIndicator = document.getElementById("loading-indicator");
+ this._loadingIndicatorLabel = document.getElementById("loading-indicator-label");
+
+ this._profileView = new WebInspector.CPUProfileView({});
+ document.getElementById("main-panels").appendChild(this._profileView.element);
+ this._profileView.show();
+
+ // From WebInspector.Panel.prototype.show
+ var statusBarItems = this._profileView.statusBarItems;
+ if (statusBarItems) {
+ this._statusBarItemContainer = document.createElement("div");
+ for (var i = 0; i < statusBarItems.length; ++i)
+ this._statusBarItemContainer.appendChild(statusBarItems[i]);
+ document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
+ }
+
+ var url;
+ var match = /url=([^&]+)/.exec(location.search);
+ if (match)
+ url = decodeURIComponent(match[1]);
+
+ if (url)
+ this._loadLeaksFromURL(url)
+ else
+ this._displayURLPrompt();
+ },
+
+ get filesLeftToParse() {
+ if (!('_filesLeftToParse' in this))
+ this._filesLeftToParse = 0;
+ return this._filesLeftToParse;
+ },
+
+ set filesLeftToParse(x) {
+ if (this._filesLeftToParse === x)
+ return;
+ this._filesLeftToParse = x;
+ this._loadingStatusChanged();
+ },
+
+ get loading() {
+ return this._isLoading;
+ },
+
+ set loading(x) {
+ if (this._isLoading === x)
+ return;
+ this._isLoading = x;
+ this._loadingStatusChanged();
+ },
+
+ get url() {
+ return this._url;
+ },
+
+ set url(x) {
+ if (this._url === x)
+ return;
+
+ this._url = x;
+ this._updateTitle();
+ },
+
+ urlPromptButtonClicked: function(e) {
+ this._urlChosenFromPrompt(document.getElementById("url").value);
+ },
+
+ _didCountLeaksFiles: function(fileCount) {
+ this._fileCount = fileCount;
+ this.filesLeftToParse = fileCount;
+ },
+
+ _didLoadLeaksFile: function(leaksText) {
+ this._parser.addLeaksFile(leaksText);
+ },
+
+ _didLoadRecentBuilds: function(builds) {
+ this._recentBuilds = builds;
+ this._updateURLPrompt();
+ },
+
+ _didParseLeaksFile: function(profile) {
+ if (--this.filesLeftToParse)
+ return;
+ ProfilerAgent.profileReady(profile);
+ this.loading = false;
+ },
+
+ _displayURLPrompt: function() {
+ document.getElementById("url-prompt-container").removeStyleClass("hidden");
+ document.getElementById("url").focus();
+ var loader = new RecentBuildsLoader(this._didLoadRecentBuilds.bind(this));
+ loader.start("SnowLeopard Intel Leaks", this._numberOfRecentBuildsToLoad);
+ },
+
+ _loadLeaksFromURL: function(url) {
+ this.url = url;
+ this.loading = true;
+
+ this._loader.start(this.url);
+ },
+
+ _loadingIndicatorText: function() {
+ var text = "Loading";
+ if (this.filesLeftToParse)
+ text += " " + (this._fileCount - this.filesLeftToParse + 1) + "/" + this._fileCount + " files";
+ text += "\u2026";
+ return text;
+ },
+
+ _loadingStatusChanged: function() {
+ this._setLoadingIndicatorHidden(!this.loading);
+ this._updateLoadingIndicatorLabel();
+ this._updateTitle();
+ },
+
+ _numberOfRecentBuildsToLoad: 10,
+
+ _setLoadingIndicatorHidden: function(hidden) {
+ if (hidden)
+ this._loadingIndicator.addStyleClass("hidden");
+ else
+ this._loadingIndicator.removeStyleClass("hidden");
+ },
+
+ _updateLoadingIndicatorLabel: function() {
+ this._loadingIndicatorLabel.innerText = this._loadingIndicatorText();
+ },
+
+ _updateTitle: function() {
+ var title = "Leaks Viewer \u2014 ";
+ if (this.loading)
+ title += "(" + this._loadingIndicatorText() + ") ";
+ title += this.url;
+ document.title = title;
+ },
+
+ _updateURLPrompt: function() {
+ var recentBuildsContainer = document.getElementById("recent-builds-container");
+ recentBuildsContainer.removeChildren();
+ if (this._recentBuilds && this._recentBuilds.length) {
+ var list = document.createElement("ol");
+ list.id = "recent-builds-list";
+
+ var self = this;
+ this._recentBuilds.forEach(function(build) {
+ var link = document.createElement("a");
+ link.href = document.location.href + "?url=" + encodeURIComponent(build.url);
+ link.addEventListener("click", function(e) {
+ self._urlChosenFromPrompt(build.url);
+ e.preventDefault();
+ });
+ link.appendChild(document.createTextNode("r" + build.revision + ": " + build.leakCount + " leaks"));
+ var item = document.createElement("li");
+ item.appendChild(link);
+
+ list.appendChild(item);
+ });
+
+ recentBuildsContainer.appendChild(list);
+ } else
+ recentBuildsContainer.appendChild(document.createTextNode("No recent leaky builds found."));
+ },
+
+ _urlChosenFromPrompt: function(url) {
+ this._loadLeaksFromURL(url);
+ document.getElementById("url-prompt-container").addStyleClass("hidden");
+ },
+
+};
+
+addEventListener("load", LeaksViewer.loaded.bind(LeaksViewer));
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/RecentBuildsLoader.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/RecentBuildsLoader.js
new file mode 100644
index 0000000..c15aef2
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/RecentBuildsLoader.js
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+function RecentBuildsLoader(didLoadRecentBuildsCallback) {
+ this._didLoadRecentBuildsCallback = didLoadRecentBuildsCallback;
+}
+
+RecentBuildsLoader.prototype = {
+ start: function(builderName, maximumNumberOfBuilds) {
+ var url = this._buildbotBaseURL + "/json/builders/" + builderName + "/builds/?";
+ url += range(maximumNumberOfBuilds).map(function(n) { return "select=-" + (n + 1); }).join("&");
+ var self = this;
+ getResource(url, function(xhr) {
+ var data = JSON.parse(xhr.responseText);
+ var builds = [];
+ Object.keys(data).forEach(function(buildNumber) {
+ var build = data[buildNumber];
+
+ var buildInfo = {
+ revision: build.sourceStamp.changes[0].rev,
+ leakCount: 0,
+ url: null,
+ };
+ for (var stepIndex = 0; stepIndex < build.steps.length; ++stepIndex) {
+ var step = build.steps[stepIndex];
+ if (step.name === "layout-test") {
+ if (!("text" in step))
+ continue;
+ var strings = step.text;
+ for (var stringIndex = 0; stringIndex < strings.length; ++stringIndex) {
+ var match = /^(\d+) total leaks found!$/.exec(strings[stringIndex]);
+ if (!match)
+ continue;
+ buildInfo.leakCount = parseInt(match[1], 10);
+ break;
+ }
+ } else if (step.name === "MasterShellCommand") {
+ if (!("urls" in step))
+ return;
+ if (!("view results" in step.urls))
+ return;
+ buildInfo.url = self._buildbotBaseURL + step.urls["view results"] + "/";
+ }
+
+ if (buildInfo.leakCount && buildInfo.url) {
+ builds.push(buildInfo);
+ break;
+ }
+ }
+ });
+ // Sort descending by revision.
+ builds.sort(function(a, b) { return b.revision - a.revision; });
+ self._didLoadRecentBuildsCallback(builds);
+ });
+ },
+
+ _buildbotBaseURL: "http://build.webkit.org/",
+};
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/Utilities.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/Utilities.js
new file mode 100644
index 0000000..c44848a
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/Utilities.js
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+function getResource(url, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ // Allow a status of 0 for easier testing with local files.
+ if (this.readyState == 4 && (!this.status || this.status == 200))
+ callback(this);
+ };
+ xhr.open("GET", url);
+ xhr.send();
+}
+
+function range(n) {
+ var result = new Array(n);
+ for (var i = 0; i < n; ++i)
+ result[i] = i;
+ return result;
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js
new file mode 100644
index 0000000..b948f12
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/WebInspectorShims.js
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2011 Apple 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.
+ */
+
+// This file contains definitions that are needed to satisfy the Web Inspector JavaScript files we
+// import.
+
+var WebInspector = {
+ UIString: function(string) {
+ return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
+ },
+};
+
+var Preferences = {
+ // Setting this to false causes the "Average" and "Calls" columns to be shown.
+ samplingCPUProfiler: false,
+};
+
+var ProfilerAgent = {
+ getProfile: function(typeId, uid, callback) {
+ this._callback = callback;
+ },
+
+ profileReady: function(head) {
+ this._callback({ head: head });
+ },
+};
+
+// This function makes any required changes to objects imported from the Web Inspector JavaScript
+// files.
+function monkeyPatchInspectorObjects() {
+ var originalGetter = WebInspector.ProfileDataGridNode.prototype.__lookupGetter__("data");
+ WebInspector.ProfileDataGridNode.prototype.__defineGetter__("data", function() {
+ var data = originalGetter.call(this);
+
+ // ProfileDataGridNode formats values as milliseconds, but we are instead measuring bytes.
+ if (!this.profileView.showSelfTimeAsPercent)
+ data.self = Number.bytesToString(this.selfTime);
+ if (!this.profileView.showTotalTimeAsPercent)
+ data.total = Number.bytesToString(this.totalTime);
+ if (!this.profileView.showAverageTimeAsPercent)
+ data.average = Number.bytesToString(this.averageTime);
+
+ return data;
+ });
+}
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/index.html b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/index.html
new file mode 100644
index 0000000..3c185bc
--- /dev/null
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/LeaksViewer/index.html
@@ -0,0 +1,80 @@
+<!--
+Copyright (C) 2011 Apple 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.
+-->
+
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Leaks Viewer</title>
+ <link rel=stylesheet href="http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/inspector/front-end/inspector.css?p=80565">
+ <link rel=stylesheet href=LeaksViewer.css>
+
+ <script src=WebInspectorShims.js></script>
+
+ <!-- The order here matches inspector.html. -->
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/utilities.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/treeoutline.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/Object.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/View.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/Panel.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/DataGrid.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/SidebarTreeElement.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/StatusBarButton.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/ProfilesPanel.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/ProfileDataGridTree.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/BottomUpProfileDataGridTree.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/TopDownProfileDataGridTree.js"></script>
+ <script src="http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/ProfileView.js"></script>
+
+ <script>
+ // Now that all the Inspector files have loaded we can apply our monkey patches.
+ monkeyPatchInspectorObjects();
+ </script>
+
+ <script src=LeaksLoader.js></script>
+ <script src=LeaksParser.js></script>
+ <script src=LeaksViewer.js></script>
+ <script src=RecentBuildsLoader.js></script>
+ <script src=Utilities.js></script>
+</head>
+<body>
+ <div id=main-panels></div>
+ <div id=main-status-bar class=status-bar>
+ <div id=loading-indicator class=hidden>
+ <img id=spinner src=http://svn.webkit.org/repository/webkit/!svn/bc/80565/trunk/Source/WebCore/inspector/front-end/Images/spinner.gif>
+ <span id=loading-indicator-label>Loading&hellip;</span>
+ </div>
+ </div>
+ <div id=url-prompt-container class=hidden>
+ <div id=url-prompt>
+ <p>Enter the URL of a build results page or leaks file:</p>
+ <input id=url type=url><button onclick='LeaksViewer.urlPromptButtonClicked(event)'>Fetch leaks</button>
+ <p>Or choose a recent build:</p>
+ <div id=recent-builds-container>
+ <p id=recent-builds-loading-indicator>Loading builds&hellip;</p>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
index c6d2343..88f2e10 100755
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
+++ b/Tools/BuildSlaveSupport/build.webkit.org-config/templates/root.html
@@ -19,6 +19,7 @@
<li><a href="http://webkit-commit-queue.appspot.com/">Commit Queue Status</a> information.</li>
<li><a href="changes">ChangeSource</a> information.</li>
<li><a href="results">Test Results</a></li>
+ <li><a href="LeaksViewer">Leaks Viewer</a></li>
</ul>
</body> </html>
diff --git a/Tools/BuildSlaveSupport/test-result-archive b/Tools/BuildSlaveSupport/test-result-archive
index a4d3ca3..b34e04a 100644
--- a/Tools/BuildSlaveSupport/test-result-archive
+++ b/Tools/BuildSlaveSupport/test-result-archive
@@ -90,7 +90,11 @@ def archiveTestResults(configuration, platform, layoutTestResultsDir):
# deleting its contents, claiming "Directory not empty".
# We can safely ignore this since it was the directory contents that
# we are most interested in deleting.
- if e.errno != 90:
+ # Python in Cygwin will also sometimes throw errno 2 if a process is
+ # holding a file open. There's no point in failing to create the
+ # archive just because some other process is behaving badly. See
+ # <http://webkit.org/b/55581>.
+ if e.errno != 90 and e.errno != 2:
raise
def zipFilesRecursively(archiveFile, files):
diff --git a/Tools/BuildSlaveSupport/win/kill-old-processes b/Tools/BuildSlaveSupport/win/kill-old-processes
index 885d6fa..f7f4423 100755
--- a/Tools/BuildSlaveSupport/win/kill-old-processes
+++ b/Tools/BuildSlaveSupport/win/kill-old-processes
@@ -30,7 +30,7 @@ def main():
"svn.exe", "httpd.exe", "cl.exe", "link.exe", "midl.exe", "devenv.exe", "perl.exe",
"imagediff.exe", "imagediff_debug.exe", "jsc.exe", "jsc_debug.exe", "WebKit2WebProcess.exe",
"WebKit2WebProcess_debug.exe", "WebKitTestRunner.exe", "WebKitTestRunner_debug.exe",
- "wdiff.exe"]
+ "wdiff.exe", "LightTPD.exe"]
for task in tasksToKill:
os.system("taskkill /f /im " + task)