Fix #25: Make it possible to link to a single test (+specific date range)
This commit is contained in:
Родитель
8e674dfa8b
Коммит
3f860cb954
227
website/awfy.js
227
website/awfy.js
|
@ -15,6 +15,7 @@ AWFY.aggregate = null;
|
||||||
AWFY.xhr = [];
|
AWFY.xhr = [];
|
||||||
AWFY.view = 'none';
|
AWFY.view = 'none';
|
||||||
AWFY.suiteName = null;
|
AWFY.suiteName = null;
|
||||||
|
AWFY.subtest = null;
|
||||||
AWFY.lastHash = null;
|
AWFY.lastHash = null;
|
||||||
AWFY.lastRefresh = 0;
|
AWFY.lastRefresh = 0;
|
||||||
|
|
||||||
|
@ -58,6 +59,15 @@ AWFY.pushState = function () {
|
||||||
vars.push('view=breakdown');
|
vars.push('view=breakdown');
|
||||||
vars.push('suite=' + this.suiteName);
|
vars.push('suite=' + this.suiteName);
|
||||||
}
|
}
|
||||||
|
if (this.view == 'single') {
|
||||||
|
vars.push('view=single');
|
||||||
|
vars.push('suite=' + this.suiteName);
|
||||||
|
vars.push('subtest=' + this.subtest);
|
||||||
|
if (this.start && this.end) {
|
||||||
|
vars.push('start='+this.start);
|
||||||
|
vars.push('end='+this.end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($('#about').is(':visible'))
|
if ($('#about').is(':visible'))
|
||||||
vars.push('about=1');
|
vars.push('about=1');
|
||||||
|
@ -126,6 +136,10 @@ AWFY.displayNewGraph = function (name, graph) {
|
||||||
display.draw();
|
display.draw();
|
||||||
}
|
}
|
||||||
this.aggregate[name] = graph;
|
this.aggregate[name] = graph;
|
||||||
|
if (this.start && this.end) {
|
||||||
|
AWFY.requestZoom(display, "condensed", this.start, this.end)
|
||||||
|
display.zoomInfo.level = 'month';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AWFY.drawLegend = function () {
|
AWFY.drawLegend = function () {
|
||||||
|
@ -424,7 +438,9 @@ AWFY.trim = function (graph, start, end) {
|
||||||
return { lines: lines,
|
return { lines: lines,
|
||||||
info: infos,
|
info: infos,
|
||||||
timelist: timelist,
|
timelist: timelist,
|
||||||
direction: graph.direction
|
direction: graph.direction,
|
||||||
|
start: start,
|
||||||
|
end: end
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +492,7 @@ AWFY.requestZoom = function (display, kind, start_t, end_t) {
|
||||||
this.machineId + '-' +
|
this.machineId + '-' +
|
||||||
year + '-' +
|
year + '-' +
|
||||||
month;
|
month;
|
||||||
if (this.view == 'breakdown')
|
if (this.view == 'breakdown' || this.view == 'single')
|
||||||
name = 'bk-' + name;
|
name = 'bk-' + name;
|
||||||
files.push(name);
|
files.push(name);
|
||||||
}
|
}
|
||||||
|
@ -489,6 +505,16 @@ AWFY.requestZoom = function (display, kind, start_t, end_t) {
|
||||||
this.request(files, zoom.bind(this));
|
this.request(files, zoom.bind(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AWFY.trackZoom = function (start, end) {
|
||||||
|
// Only track in single modus
|
||||||
|
if (this.view != 'single')
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
this.pushState();
|
||||||
|
}
|
||||||
|
|
||||||
AWFY.showOverview = function () {
|
AWFY.showOverview = function () {
|
||||||
this.reset('overview');
|
this.reset('overview');
|
||||||
|
|
||||||
|
@ -498,6 +524,9 @@ AWFY.showOverview = function () {
|
||||||
$('.graph-container').show();
|
$('.graph-container').show();
|
||||||
|
|
||||||
this.suiteName = null;
|
this.suiteName = null;
|
||||||
|
this.subtest = null
|
||||||
|
this.start = null
|
||||||
|
this.end = null
|
||||||
this.panes = [$('#ss-graph'),
|
this.panes = [$('#ss-graph'),
|
||||||
$('#kraken-graph'),
|
$('#kraken-graph'),
|
||||||
$('#octane-graph')
|
$('#octane-graph')
|
||||||
|
@ -518,6 +547,9 @@ AWFY.showBreakdown = function (name) {
|
||||||
breakdown.show();
|
breakdown.show();
|
||||||
|
|
||||||
this.suiteName = name;
|
this.suiteName = name;
|
||||||
|
this.start = null
|
||||||
|
this.end = null
|
||||||
|
this.subtest = null;
|
||||||
this.panes = [];
|
this.panes = [];
|
||||||
|
|
||||||
var total = 0;
|
var total = 0;
|
||||||
|
@ -527,10 +559,19 @@ AWFY.showBreakdown = function (name) {
|
||||||
for (var i = 0; i < suite.tests.length; i++) {
|
for (var i = 0; i < suite.tests.length; i++) {
|
||||||
var test = suite.tests[i];
|
var test = suite.tests[i];
|
||||||
var id = name + '-' + test;
|
var id = name + '-' + test;
|
||||||
$('<div></div>').html('<b>' + id + '</b>').appendTo(breakdown);
|
( function (name, test) {
|
||||||
|
$('<div></div>').click(
|
||||||
|
(function (event) {
|
||||||
|
this.showSingle(name, test, null, null);
|
||||||
|
this.pushState();
|
||||||
|
return false;
|
||||||
|
}).bind(this))
|
||||||
|
.html('<b><a href="#">' + id + '</a></b>')
|
||||||
|
.appendTo(breakdown);
|
||||||
|
}.bind(this) )(name, test)
|
||||||
var div = $('<div id="' + id + '-graph" class="graph"></div>');
|
var div = $('<div id="' + id + '-graph" class="graph"></div>');
|
||||||
div.appendTo(breakdown);
|
div.appendTo(breakdown);
|
||||||
div.hide();
|
div.hide();
|
||||||
$('<br><br>').appendTo(breakdown);
|
$('<br><br>').appendTo(breakdown);
|
||||||
|
|
||||||
this.panes.push(div);
|
this.panes.push(div);
|
||||||
|
@ -551,20 +592,70 @@ AWFY.showBreakdown = function (name) {
|
||||||
this.lastRefresh = Date.now();
|
this.lastRefresh = Date.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AWFY.showSingle = function (name, subtest, start, end) {
|
||||||
|
this.reset('single');
|
||||||
|
|
||||||
|
// Clear the breakdown view.
|
||||||
|
var breakdown = $('#breakdown');
|
||||||
|
breakdown.empty()
|
||||||
|
|
||||||
|
$('.graph-container').hide();
|
||||||
|
breakdown.show();
|
||||||
|
|
||||||
|
this.suiteName = name;
|
||||||
|
this.subtest = subtest;
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
this.panes = [];
|
||||||
|
|
||||||
|
var total = 0;
|
||||||
|
|
||||||
|
// Create a div for each sub-test.
|
||||||
|
var suite = AWFYMaster.suites[name];
|
||||||
|
for (var i = 0; i < suite.tests.length; i++) {
|
||||||
|
var test = suite.tests[i];
|
||||||
|
if (subtest != test)
|
||||||
|
continue;
|
||||||
|
var id = name + '-' + test;
|
||||||
|
$('<div></div>').html('<b>' + id + '</b>').appendTo(breakdown);
|
||||||
|
var div = $('<div id="' + id + '-graph" class="graph"></div>');
|
||||||
|
div.appendTo(breakdown);
|
||||||
|
div.hide();
|
||||||
|
$('<br><br>').appendTo(breakdown);
|
||||||
|
|
||||||
|
this.panes.push(div);
|
||||||
|
|
||||||
|
var callback = (function (id) {
|
||||||
|
return (function (received) {
|
||||||
|
if (received[0])
|
||||||
|
this.computeBreakdown(received[0], id);
|
||||||
|
this.drawLegend();
|
||||||
|
}).bind(this);
|
||||||
|
}).bind(this)(id);
|
||||||
|
|
||||||
|
// Fire off an XHR request for each test.
|
||||||
|
var file = 'bk-aggregate-' + id + '-' + this.machineId;
|
||||||
|
this.request([file], callback);
|
||||||
|
}
|
||||||
|
this.lastRefresh = Date.now();
|
||||||
|
}
|
||||||
|
|
||||||
AWFY.requestRedraw = function () {
|
AWFY.requestRedraw = function () {
|
||||||
if (this.view == 'overview') {
|
if (this.view == 'overview') {
|
||||||
this.request(['aggregate-' + this.machineId],
|
this.request(['aggregate-' + this.machineId],
|
||||||
this.computeAggregate.bind(this));
|
this.computeAggregate.bind(this));
|
||||||
} else if (this.view == 'breakdown') {
|
} else if (this.view == 'breakdown' || this.view == 'single') {
|
||||||
var suite = AWFYMaster.suites[this.suiteName];
|
var suite = AWFYMaster.suites[this.suiteName];
|
||||||
var total = 0;
|
var total = 0;
|
||||||
for (var i = 0; i < suite.tests.length; i++) {
|
for (var i = 0; i < suite.tests.length; i++) {
|
||||||
var id = this.suiteName + '-' + suite.tests[i];
|
var id = this.suiteName + '-' + suite.tests[i];
|
||||||
|
if (this.view == 'single' && suite.tests[i] != this.subtest)
|
||||||
|
continue;
|
||||||
var callback = (function (id) {
|
var callback = (function (id) {
|
||||||
return (function (received) {
|
return (function (received) {
|
||||||
if (received[0])
|
if (received[0])
|
||||||
this.computeBreakdown(received[0], id);
|
this.computeBreakdown(received[0], id);
|
||||||
if (++total == suite.tests.length)
|
if (++total == suite.tests.length || this.view == 'single')
|
||||||
this.drawLegend();
|
this.drawLegend();
|
||||||
}).bind(this);
|
}).bind(this);
|
||||||
}).bind(this)(id);
|
}).bind(this)(id);
|
||||||
|
@ -639,18 +730,39 @@ AWFY.parseURL = function () {
|
||||||
machineId = this.DEFAULT_MACHINE_ID;
|
machineId = this.DEFAULT_MACHINE_ID;
|
||||||
|
|
||||||
var view = this.queryParams['view'];
|
var view = this.queryParams['view'];
|
||||||
if (!view || (view != 'overview' && view != 'breakdown'))
|
if (!view || (view != 'overview' && view != 'breakdown' && view != 'single'))
|
||||||
view = 'overview';
|
view = 'overview';
|
||||||
if (view == 'breakdown') {
|
if (view == 'breakdown' || view == 'single') {
|
||||||
var suiteName = this.queryParams['suite'];
|
var suiteName = this.queryParams['suite'];
|
||||||
if (!suiteName || !AWFYMaster.suites[suiteName])
|
if (!suiteName || !AWFYMaster.suites[suiteName])
|
||||||
view = 'overview';
|
view = 'overview';
|
||||||
}
|
}
|
||||||
|
var start = null;
|
||||||
|
var end = null;
|
||||||
|
if (view == 'single') {
|
||||||
|
var subtest = this.queryParams['subtest'];
|
||||||
|
var suite = AWFYMaster.suites[suiteName];
|
||||||
|
var found = false;
|
||||||
|
for (var i = 0; i < suite.tests.length; i++) {
|
||||||
|
var test = suite.tests[i];
|
||||||
|
if (subtest != test)
|
||||||
|
continue;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!subtest || !found) {
|
||||||
|
view = 'breakdown';
|
||||||
|
} else {
|
||||||
|
start = (this.queryParams['start'])?parseInt(this.queryParams['start']):null;
|
||||||
|
end = (this.queryParams['end'])?parseInt(this.queryParams['end']):null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure the menus are up to date.
|
// Make sure the menus are up to date.
|
||||||
if (this.view != 'none') {
|
if (this.view != 'none') {
|
||||||
if (this.machineId != machineId) {
|
if (this.machineId != machineId) {
|
||||||
this.updateMachineList(machineId);
|
this.updateMachineList(machineId);
|
||||||
|
this.updateSuiteList(machineId);
|
||||||
}
|
}
|
||||||
$('#breakdownlist .clicked').removeClass('clicked');
|
$('#breakdownlist .clicked').removeClass('clicked');
|
||||||
if (view == 'overview')
|
if (view == 'overview')
|
||||||
|
@ -666,7 +778,7 @@ AWFY.parseURL = function () {
|
||||||
this.changeMachine(machineId);
|
this.changeMachine(machineId);
|
||||||
this.lastHash = window.location.hash;
|
this.lastHash = window.location.hash;
|
||||||
return;
|
return;
|
||||||
} else if (view == 'breakdown') {
|
} else if (view == 'breakdown' || view == 'single') {
|
||||||
if (suiteName == this.suiteName) {
|
if (suiteName == this.suiteName) {
|
||||||
if (machineId != this.machineId)
|
if (machineId != this.machineId)
|
||||||
this.changeMachine(machineId);
|
this.changeMachine(machineId);
|
||||||
|
@ -683,6 +795,8 @@ AWFY.parseURL = function () {
|
||||||
this.showOverview();
|
this.showOverview();
|
||||||
else if (view == 'breakdown')
|
else if (view == 'breakdown')
|
||||||
this.showBreakdown(suiteName);
|
this.showBreakdown(suiteName);
|
||||||
|
else if (view == 'single')
|
||||||
|
this.showSingle(suiteName, subtest, start, end);
|
||||||
|
|
||||||
this.lastHash = window.location.hash;
|
this.lastHash = window.location.hash;
|
||||||
}
|
}
|
||||||
|
@ -702,6 +816,7 @@ AWFY.updateMachineList = function (machineId) {
|
||||||
a.click((function (id) {
|
a.click((function (id) {
|
||||||
return (function (event) {
|
return (function (event) {
|
||||||
this.updateMachineList(parseInt(id));
|
this.updateMachineList(parseInt(id));
|
||||||
|
this.updateSuiteList(parseInt(id));
|
||||||
this.changeMachine(parseInt(id));
|
this.changeMachine(parseInt(id));
|
||||||
this.pushState();
|
this.pushState();
|
||||||
return false;
|
return false;
|
||||||
|
@ -715,6 +830,56 @@ AWFY.updateMachineList = function (machineId) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AWFY.updateSuiteList = function (machineId) {
|
||||||
|
var breakdown = $('#breakdownlist');
|
||||||
|
breakdown.empty();
|
||||||
|
|
||||||
|
var home = $('<a href="#" id="suite-overview"></a>').click(
|
||||||
|
(function (event) {
|
||||||
|
$('#breakdownlist .clicked').removeClass('clicked');
|
||||||
|
$(event.target).addClass('clicked');
|
||||||
|
this.showOverview();
|
||||||
|
this.pushState();
|
||||||
|
return false;
|
||||||
|
}).bind(this))
|
||||||
|
.html('Overview')
|
||||||
|
.appendTo($('<li></li>').appendTo(breakdown));
|
||||||
|
if (this.view == 'overview')
|
||||||
|
home.addClass('clicked');
|
||||||
|
|
||||||
|
var suites = [];
|
||||||
|
for (var i=0; i < AWFYMaster.machines[machineId].suites.length; i++) {
|
||||||
|
var name = AWFYMaster.machines[machineId].suites[i];
|
||||||
|
if (AWFYMaster.suites[name])
|
||||||
|
suites.push([name, AWFYMaster.suites[name]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
suites.sort(function (a, b) {
|
||||||
|
return a[1].sort_order - b[1].sort_order;
|
||||||
|
});
|
||||||
|
|
||||||
|
for (var i = 0; i < suites.length; i++) {
|
||||||
|
var name = suites[i][0];
|
||||||
|
var suite = suites[i][1];
|
||||||
|
var li = $('<li></li>');
|
||||||
|
var a = $('<a href="#" id="suite-' + name + '"></a>');
|
||||||
|
a.click((function (name) {
|
||||||
|
return (function(event) {
|
||||||
|
$('#breakdownlist .clicked').removeClass('clicked');
|
||||||
|
$(event.target).addClass('clicked');
|
||||||
|
this.showBreakdown(name);
|
||||||
|
this.pushState();
|
||||||
|
return false;
|
||||||
|
}).bind(this);
|
||||||
|
}).bind(this)(name));
|
||||||
|
if ((this.view == 'breakdown' || this.view == 'single') && this.suiteName == name)
|
||||||
|
a.addClass('clicked');
|
||||||
|
a.html(suite.description);
|
||||||
|
a.appendTo(li);
|
||||||
|
li.appendTo(breakdown);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
AWFY.startup = function () {
|
AWFY.startup = function () {
|
||||||
this.panes = [$('#ss-graph'),
|
this.panes = [$('#ss-graph'),
|
||||||
$('#kraken-graph'),
|
$('#kraken-graph'),
|
||||||
|
@ -737,49 +902,11 @@ AWFY.startup = function () {
|
||||||
}).bind(this));
|
}).bind(this));
|
||||||
menu.hide();
|
menu.hide();
|
||||||
|
|
||||||
|
// Add suite information to menu
|
||||||
var breakdown = $('#breakdownlist');
|
var breakdown = $('#breakdownlist');
|
||||||
|
this.updateSuiteList(this.machineId);
|
||||||
|
|
||||||
var home = $('<a href="#" id="suite-overview"></a>').click(
|
// Hide it by default.
|
||||||
(function (event) {
|
|
||||||
$('#breakdownlist .clicked').removeClass('clicked');
|
|
||||||
$(event.target).addClass('clicked');
|
|
||||||
this.showOverview();
|
|
||||||
this.pushState();
|
|
||||||
return false;
|
|
||||||
}).bind(this))
|
|
||||||
.html('Overview')
|
|
||||||
.appendTo($('<li></li>').appendTo(breakdown));
|
|
||||||
if (this.view == 'overview')
|
|
||||||
home.addClass('clicked');
|
|
||||||
|
|
||||||
var suites = [];
|
|
||||||
for (var name in AWFYMaster.suites)
|
|
||||||
suites.push([name, AWFYMaster.suites[name]]);
|
|
||||||
|
|
||||||
suites.sort(function (a, b) {
|
|
||||||
return a[1].sort_order - b[1].sort_order;
|
|
||||||
});
|
|
||||||
|
|
||||||
for (var i = 0; i < suites.length; i++) {
|
|
||||||
var name = suites[i][0];
|
|
||||||
var suite = suites[i][1];
|
|
||||||
var li = $('<li></li>');
|
|
||||||
var a = $('<a href="#" id="suite-' + name + '"></a>');
|
|
||||||
a.click((function (name) {
|
|
||||||
return (function(event) {
|
|
||||||
$('#breakdownlist .clicked').removeClass('clicked');
|
|
||||||
$(event.target).addClass('clicked');
|
|
||||||
this.showBreakdown(name);
|
|
||||||
this.pushState();
|
|
||||||
return false;
|
|
||||||
}).bind(this);
|
|
||||||
}).bind(this)(name));
|
|
||||||
if (this.view == 'breakdown' && this.suiteName == name)
|
|
||||||
a.addClass('clicked');
|
|
||||||
a.html(suite.description);
|
|
||||||
a.appendTo(li);
|
|
||||||
li.appendTo(breakdown);
|
|
||||||
}
|
|
||||||
$('#bkdrop').click((function (event) {
|
$('#bkdrop').click((function (event) {
|
||||||
if (!breakdown.is(':visible') && !$('#about').is(':visible')) {
|
if (!breakdown.is(':visible') && !$('#about').is(':visible')) {
|
||||||
breakdown.show();
|
breakdown.show();
|
||||||
|
|
|
@ -307,6 +307,8 @@ Display.prototype.plotSelected = function (event, ranges) {
|
||||||
var start = this.graph.timelist[from_x];
|
var start = this.graph.timelist[from_x];
|
||||||
var end = this.graph.timelist[to_x];
|
var end = this.graph.timelist[to_x];
|
||||||
|
|
||||||
|
AWFY.trackZoom(start, end);
|
||||||
|
|
||||||
var prev = this.zoomInfo.prev;
|
var prev = this.zoomInfo.prev;
|
||||||
if (prev && this.zoomInfo.level == 'month') {
|
if (prev && this.zoomInfo.level == 'month') {
|
||||||
// Estimate the number of datapoints we had in the old range.
|
// Estimate the number of datapoints we had in the old range.
|
||||||
|
@ -420,6 +422,8 @@ Display.prototype.unzoom = function () {
|
||||||
this.plot.clearSelection();
|
this.plot.clearSelection();
|
||||||
this.detachTips();
|
this.detachTips();
|
||||||
this.zoomInfo.level = 'aggregate';
|
this.zoomInfo.level = 'aggregate';
|
||||||
|
|
||||||
|
AWFY.trackZoom(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
Display.prototype.detachTips = function () {
|
Display.prototype.detachTips = function () {
|
||||||
|
|
Загрузка…
Ссылка в новой задаче