blob: 29d26a05f45d8aa7fb8de060c018f15321883296 [file] [log] [blame]
/**
* @module module/diff-page-sk
* @description <h2><code>diff-page-sk</code></h2>
*
* Page to view a specific diff between two digests. This does not include trace data.
*/
import { define } from 'elements-sk/define';
import { html } from 'lit-html';
import { jsonOrThrow } from 'common-sk/modules/jsonOrThrow';
import { stateReflector } from 'common-sk/modules/stateReflector';
import { ElementSk } from '../../../infra-sk/modules/ElementSk';
import '../digest-details-sk';
import { sendBeginTask, sendEndTask, sendFetchError } from '../common';
const template = (ele) => {
if (!ele._didInitialLoad) {
return html`<h1>Loading...</h1>`;
}
return html`
<digest-details-sk .details=${ele._leftDetails} .right=${ele._rightDetails}
.changeListID=${ele._changeListID} .crs=${ele._crs}>
</digest-details-sk>`;
};
define('diff-page-sk', class extends ElementSk {
constructor() {
super(template);
this._grouping = '';
this._leftDigest = '';
this._rightDigest = '';
this._crs = '';
this._changeListID = '';
this._leftDetails = {};
this._rightDetails = {};
this._useSQL = false;
this._didInitialLoad = false;
this._stateChanged = stateReflector(
/* getState */() => ({
// provide empty values
test: this._grouping, // TODO(kjlubick) rename test -> grouping
left: this._leftDigest,
right: this._rightDigest,
use_sql: this._useSQL,
changelist_id: this._changeListID,
crs: this._crs,
}), /* setState */(newState) => {
if (!this._connected) {
return;
}
// default values if not specified.
this._grouping = newState.test || '';
this._leftDigest = newState.left || '';
this._rightDigest = newState.right || '';
this._changeListID = newState.changelist_id || '';
this._crs = newState.crs || '';
this._useSQL = newState.use_sql || false;
this._fetch();
this._render();
},
);
// Allows us to abort fetches if we fetch again.
this._fetchController = null;
}
connectedCallback() {
super.connectedCallback();
this._render();
}
_fetch() {
if (this._fetchController) {
// Kill any outstanding requests
this._fetchController.abort();
}
// Make a fresh abort controller for each set of fetches.
// They cannot be re-used once aborted.
this._fetchController = new AbortController();
const extra = {
signal: this._fetchController.signal,
};
sendBeginTask(this);
let url = `/json/v1/diff?test=${encodeURIComponent(this._grouping)}`
+ `&left=${encodeURIComponent(this._leftDigest)}`
+ `&right=${encodeURIComponent(this._rightDigest)}`
+ `&changelist_id=${this._changeListID}&crs=${this._crs}`;
if (this._useSQL) {
url += '&use_sql=true';
}
fetch(url, extra)
.then(jsonOrThrow)
.then((obj) => {
this._leftDetails = obj.left || {};
this._rightDetails = obj.right || {};
this._didInitialLoad = true;
this._render();
sendEndTask(this);
})
.catch((e) => {
this._leftDetails = {};
this._rightDetails = {};
this._didInitialLoad = false;
this._render();
sendFetchError(this, e, 'diff-details');
});
}
});