| Index: tools/callstats.html
|
| diff --git a/tools/callstats.html b/tools/callstats.html
|
| index f5d1228e70c78cde46d59ae865594a745b7f63b1..741b9ef07811d1033167bec009d847415b094448 100644
|
| --- a/tools/callstats.html
|
| +++ b/tools/callstats.html
|
| @@ -348,9 +348,48 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| });
|
| }
|
|
|
| + window.addEventListener('popstate', (event) => {
|
| + popHistoryState(event.state);
|
| + });
|
| +
|
| + function popHistoryState(state) {
|
| + if (!state.version) return false;
|
| + if (!versions) return false;
|
| + var version = versions.getByName(state.version);
|
| + if (!version) return false;
|
| + var page = version.get(state.page);
|
| + if (!page) return false;
|
| + if (!state.entry) {
|
| + showPage(page);
|
| + } else {
|
| + var entry = page.get(state.entry);
|
| + if (!entry) {
|
| + showPage(page);
|
| + } else {
|
| + showEntry(entry);
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + function pushHistoryState() {
|
| + var selection = selectedEntry ? selectedEntry : selectedPage;
|
| + if (!selection) return;
|
| + var state = selection.urlParams();
|
| + // Don't push a history state if it didn't change.
|
| + if (JSON.stringify(window.history.state) === JSON.stringify(state)) return;
|
| + var params = "?";
|
| + for (var pairs of Object.entries(state)) {
|
| + params += encodeURIComponent(pairs[0]) + "="
|
| + + encodeURIComponent(pairs[1]) + "&";
|
| + }
|
| + window.history.pushState(state, selection.toString(), params);
|
| + }
|
| +
|
| function showPage(firstPage) {
|
| var changeSelectedEntry = selectedEntry !== undefined
|
| && selectedEntry.page === selectedPage;
|
| + pushHistoryState();
|
| selectedPage = firstPage;
|
| selectedPage.sort();
|
| showPageInColumn(firstPage, 0);
|
| @@ -367,6 +406,7 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| showEntryDetail(selectedPage.getEntry(selectedEntry));
|
| }
|
| showImpactList(selectedPage);
|
| + pushHistoryState();
|
| }
|
|
|
| function showPageInColumn(page, columnIndex) {
|
| @@ -491,6 +531,11 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| });
|
| }
|
|
|
| + function showEntry(entry) {
|
| + selectedEntry = entry;
|
| + selectEntry(entry, true);
|
| + }
|
| +
|
| function selectEntry(entry, updateSelectedPage) {
|
| if (updateSelectedPage) {
|
| entry = selectedPage.version.getEntry(entry);
|
| @@ -533,6 +578,7 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| showPageDetails(entry);
|
| showImpactList(entry.page);
|
| showGraphs(entry.page);
|
| + pushHistoryState();
|
| }
|
|
|
| function showVersionDetails(entry) {
|
| @@ -1046,12 +1092,26 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| handleLoadJSON(JSON.parse(text));
|
| }
|
|
|
| + function getStateFromParams() {
|
| + var query = window.location.search.substr(1);
|
| + var result = {};
|
| + query.split("&").forEach((part) => {
|
| + var item = part.split("=");
|
| + var key = decodeURIComponent(item[0])
|
| + result[key] = decodeURIComponent(item[1]);
|
| + });
|
| + return result;
|
| + }
|
| +
|
| function handleLoadJSON(json) {
|
| + var state = getStateFromParams();
|
| pages = new Pages();
|
| versions = Versions.fromJSON(json);
|
| initialize()
|
| showPage(versions.versions[0].pages[0]);
|
| - selectEntry(selectedPage.total);
|
| + if (!popHistoryState(state)) {
|
| + selectEntry(selectedPage.total);
|
| + }
|
| }
|
|
|
| function handleToggleGroup(event) {
|
| @@ -1188,7 +1248,10 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| }
|
| get(index) {
|
| return this.versions[index]
|
| - };
|
| + }
|
| + getByName(name) {
|
| + return this.versions.find((each) => each.name == name);
|
| + }
|
| forEach(f) {
|
| this.versions.forEach(f);
|
| }
|
| @@ -1381,6 +1444,12 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| });
|
| this.version = version;
|
| }
|
| + toString() {
|
| + return this.version.name + ": " + this.name;
|
| + }
|
| + urlParams() {
|
| + return { version: this.version.name, page: this.name};
|
| + }
|
| add(entry) {
|
| // Ignore accidentally added Group entries.
|
| if (entry.name.startsWith(GroupedEntry.prefix)) return;
|
| @@ -1474,6 +1543,11 @@ code is governed by a BSD-style license that can be found in the LICENSE file.
|
| this.parent = undefined;
|
| this.isTotal = false;
|
| }
|
| + urlParams() {
|
| + var params = this.page.urlParams();
|
| + params.entry = this.name;
|
| + return params;
|
| + }
|
| getCompareWithBaseline(value, property) {
|
| if (baselineVersion == undefined) return value;
|
| var baselineEntry = baselineVersion.getEntry(this);
|
|
|