diff --git a/website/awfy.js b/website/awfy.js index 2368edb..bb61eae 100644 --- a/website/awfy.js +++ b/website/awfy.js @@ -15,6 +15,7 @@ AWFY.aggregate = null; AWFY.xhr = []; AWFY.view = 'none'; AWFY.suiteName = null; +AWFY.subtest = null; AWFY.lastHash = null; AWFY.lastRefresh = 0; @@ -58,6 +59,15 @@ AWFY.pushState = function () { vars.push('view=breakdown'); 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')) vars.push('about=1'); @@ -126,6 +136,10 @@ AWFY.displayNewGraph = function (name, graph) { display.draw(); } this.aggregate[name] = graph; + if (this.start && this.end) { + AWFY.requestZoom(display, "condensed", this.start, this.end) + display.zoomInfo.level = 'month'; + } } AWFY.drawLegend = function () { @@ -424,7 +438,9 @@ AWFY.trim = function (graph, start, end) { return { lines: lines, info: infos, 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 + '-' + year + '-' + month; - if (this.view == 'breakdown') + if (this.view == 'breakdown' || this.view == 'single') name = 'bk-' + name; files.push(name); } @@ -489,6 +505,16 @@ AWFY.requestZoom = function (display, kind, start_t, end_t) { 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 () { this.reset('overview'); @@ -498,6 +524,9 @@ AWFY.showOverview = function () { $('.graph-container').show(); this.suiteName = null; + this.subtest = null + this.start = null + this.end = null this.panes = [$('#ss-graph'), $('#kraken-graph'), $('#octane-graph') @@ -518,6 +547,9 @@ AWFY.showBreakdown = function (name) { breakdown.show(); this.suiteName = name; + this.start = null + this.end = null + this.subtest = null; this.panes = []; var total = 0; @@ -527,10 +559,19 @@ AWFY.showBreakdown = function (name) { for (var i = 0; i < suite.tests.length; i++) { var test = suite.tests[i]; var id = name + '-' + test; - $('
').html('' + id + '').appendTo(breakdown); + ( function (name, test) { + $('
').click( + (function (event) { + this.showSingle(name, test, null, null); + this.pushState(); + return false; + }).bind(this)) + .html('' + id + '') + .appendTo(breakdown); + }.bind(this) )(name, test) var div = $('
'); div.appendTo(breakdown); - div.hide(); + div.hide(); $('

').appendTo(breakdown); this.panes.push(div); @@ -551,20 +592,70 @@ AWFY.showBreakdown = function (name) { 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; + $('
').html('' + id + '').appendTo(breakdown); + var div = $('
'); + div.appendTo(breakdown); + div.hide(); + $('

').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 () { if (this.view == 'overview') { this.request(['aggregate-' + this.machineId], this.computeAggregate.bind(this)); - } else if (this.view == 'breakdown') { + } else if (this.view == 'breakdown' || this.view == 'single') { var suite = AWFYMaster.suites[this.suiteName]; var total = 0; for (var i = 0; i < suite.tests.length; i++) { var id = this.suiteName + '-' + suite.tests[i]; + if (this.view == 'single' && suite.tests[i] != this.subtest) + continue; var callback = (function (id) { return (function (received) { if (received[0]) this.computeBreakdown(received[0], id); - if (++total == suite.tests.length) + if (++total == suite.tests.length || this.view == 'single') this.drawLegend(); }).bind(this); }).bind(this)(id); @@ -639,18 +730,39 @@ AWFY.parseURL = function () { machineId = this.DEFAULT_MACHINE_ID; var view = this.queryParams['view']; - if (!view || (view != 'overview' && view != 'breakdown')) + if (!view || (view != 'overview' && view != 'breakdown' && view != 'single')) view = 'overview'; - if (view == 'breakdown') { + if (view == 'breakdown' || view == 'single') { var suiteName = this.queryParams['suite']; if (!suiteName || !AWFYMaster.suites[suiteName]) 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. if (this.view != 'none') { if (this.machineId != machineId) { this.updateMachineList(machineId); + this.updateSuiteList(machineId); } $('#breakdownlist .clicked').removeClass('clicked'); if (view == 'overview') @@ -666,7 +778,7 @@ AWFY.parseURL = function () { this.changeMachine(machineId); this.lastHash = window.location.hash; return; - } else if (view == 'breakdown') { + } else if (view == 'breakdown' || view == 'single') { if (suiteName == this.suiteName) { if (machineId != this.machineId) this.changeMachine(machineId); @@ -683,6 +795,8 @@ AWFY.parseURL = function () { this.showOverview(); else if (view == 'breakdown') this.showBreakdown(suiteName); + else if (view == 'single') + this.showSingle(suiteName, subtest, start, end); this.lastHash = window.location.hash; } @@ -702,6 +816,7 @@ AWFY.updateMachineList = function (machineId) { a.click((function (id) { return (function (event) { this.updateMachineList(parseInt(id)); + this.updateSuiteList(parseInt(id)); this.changeMachine(parseInt(id)); this.pushState(); return false; @@ -715,6 +830,56 @@ AWFY.updateMachineList = function (machineId) { } } +AWFY.updateSuiteList = function (machineId) { + var breakdown = $('#breakdownlist'); + breakdown.empty(); + + var home = $('').click( + (function (event) { + $('#breakdownlist .clicked').removeClass('clicked'); + $(event.target).addClass('clicked'); + this.showOverview(); + this.pushState(); + return false; + }).bind(this)) + .html('Overview') + .appendTo($('
  • ').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 = $('
  • '); + var 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 () { this.panes = [$('#ss-graph'), $('#kraken-graph'), @@ -737,49 +902,11 @@ AWFY.startup = function () { }).bind(this)); menu.hide(); + // Add suite information to menu var breakdown = $('#breakdownlist'); + this.updateSuiteList(this.machineId); - var home = $('').click( - (function (event) { - $('#breakdownlist .clicked').removeClass('clicked'); - $(event.target).addClass('clicked'); - this.showOverview(); - this.pushState(); - return false; - }).bind(this)) - .html('Overview') - .appendTo($('
  • ').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 = $('
  • '); - var 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); - } + // Hide it by default. $('#bkdrop').click((function (event) { if (!breakdown.is(':visible') && !$('#about').is(':visible')) { breakdown.show(); diff --git a/website/frontpage.js b/website/frontpage.js index e4c56ac..78f0103 100644 --- a/website/frontpage.js +++ b/website/frontpage.js @@ -307,6 +307,8 @@ Display.prototype.plotSelected = function (event, ranges) { var start = this.graph.timelist[from_x]; var end = this.graph.timelist[to_x]; + AWFY.trackZoom(start, end); + var prev = this.zoomInfo.prev; if (prev && this.zoomInfo.level == 'month') { // Estimate the number of datapoints we had in the old range. @@ -420,6 +422,8 @@ Display.prototype.unzoom = function () { this.plot.clearSelection(); this.detachTips(); this.zoomInfo.level = 'aggregate'; + + AWFY.trackZoom(null, null); } Display.prototype.detachTips = function () {