Merge "Nearly convert <gr-rest-api-interface> element to a simple class"

This commit is contained in:
Ben Rohlfs
2021-01-26 10:06:08 +00:00
committed by Gerrit Code Review
32 changed files with 68 additions and 82 deletions

View File

@@ -75,7 +75,7 @@ export class GrGroupAuditLog extends ListViewMixin(
} }
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService

View File

@@ -18,6 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-group-audit-log.js'; import './gr-group-audit-log.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {stubRestApi} from '../../../test/test-utils.js';
import {addListenerForTest} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-group-audit-log'); const basicFixture = fixtureFromElement('gr-group-audit-log');
@@ -84,7 +85,7 @@ suite('gr-group-audit-log tests', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -139,7 +139,7 @@ export class GrGroupMembers extends GestureEventListeners(
const promises: Promise<void>[] = []; const promises: Promise<void>[] = [];
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService

View File

@@ -18,7 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-group-members.js'; import './gr-group-members.js';
import {dom, flush} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {dom, flush} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {stubBaseUrl, stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubBaseUrl, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-group-members'); const basicFixture = fixtureFromElement('gr-group-members');
@@ -352,7 +352,7 @@ suite('gr-group-members tests', () => {
.callsFake((group, errFn) => { .callsFake((group, errFn) => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -148,7 +148,7 @@ export class GrGroup extends GestureEventListeners(
const promises: Promise<unknown>[] = []; const promises: Promise<unknown>[] = [];
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService

View File

@@ -18,6 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-group.js'; import './gr-group.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {stubRestApi} from '../../../test/test-utils.js';
import {addListenerForTest} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-group'); const basicFixture = fixtureFromElement('gr-group');
@@ -216,7 +217,7 @@ suite('gr-group tests', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -95,7 +95,7 @@ export class GrPluginList extends ListViewMixin(
_getPlugins(filter: string, pluginsPerPage: number, offset?: number) { _getPlugins(filter: string, pluginsPerPage: number, offset?: number) {
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService
.getPlugins(filter, pluginsPerPage, offset, errFn) .getPlugins(filter, pluginsPerPage, offset, errFn)

View File

@@ -18,7 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-plugin-list.js'; import './gr-plugin-list.js';
import 'lodash/lodash.js'; import 'lodash/lodash.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-plugin-list'); const basicFixture = fixtureFromElement('gr-plugin-list');
@@ -155,7 +155,7 @@ suite('gr-plugin-list tests', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -151,7 +151,7 @@ export class GrRepoAccess extends GestureEventListeners(
_reload(repo: RepoName) { _reload(repo: RepoName) {
const errFn = (response?: Response | null) => { const errFn = (response?: Response | null) => {
firePageError(this, response); firePageError(response);
}; };
this._editing = false; this._editing = false;

View File

@@ -20,7 +20,7 @@ import './gr-repo-access.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
import {toSortedPermissionsArray} from '../../../utils/access-util.js'; import {toSortedPermissionsArray} from '../../../utils/access-util.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-repo-access'); const basicFixture = fixtureFromElement('gr-repo-access');
@@ -242,7 +242,7 @@ suite('gr-repo-access tests', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -106,7 +106,7 @@ export class GrRepoCommands extends GestureEventListeners(
// Do not process the error, if the component is not attached to the DOM // Do not process the error, if the component is not attached to the DOM
// anymore, which at least in tests can happen. // anymore, which at least in tests can happen.
if (!this.isConnected) return; if (!this.isConnected) return;
firePageError(this, response); firePageError(response);
}; };
this.restApiService.getProjectConfig(this.repo, errFn).then(config => { this.restApiService.getProjectConfig(this.repo, errFn).then(config => {

View File

@@ -18,7 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-repo-commands.js'; import './gr-repo-commands.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-repo-commands'); const basicFixture = fixtureFromElement('gr-repo-commands');
@@ -121,7 +121,7 @@ suite('gr-repo-commands tests', () => {
stubRestApi('getProjectConfig').callsFake((repo, errFn) => { stubRestApi('getProjectConfig').callsFake((repo, errFn) => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -59,7 +59,7 @@ export class GrRepoDashboards extends GestureEventListeners(
} }
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService

View File

@@ -18,7 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-repo-dashboards.js'; import './gr-repo-dashboards.js';
import {GerritNav} from '../../core/gr-navigation/gr-navigation.js'; import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-repo-dashboards'); const basicFixture = fixtureFromElement('gr-repo-dashboards');
@@ -128,7 +128,7 @@ suite('gr-repo-dashboards tests', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -181,7 +181,7 @@ export class GrRepoDetailList extends ListViewMixin(
this._items = []; this._items = [];
flush(); flush();
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
if (detailType === RepoDetailView.BRANCHES) { if (detailType === RepoDetailView.BRANCHES) {

View File

@@ -20,7 +20,7 @@ import './gr-repo-detail-list.js';
import 'lodash/lodash.js'; import 'lodash/lodash.js';
import {page} from '../../../utils/page-wrapper-utils.js'; import {page} from '../../../utils/page-wrapper-utils.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-repo-detail-list'); const basicFixture = fixtureFromElement('gr-repo-detail-list');
@@ -293,7 +293,7 @@ suite('gr-repo-detail-list', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });
@@ -488,7 +488,7 @@ suite('gr-repo-detail-list', () => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -171,7 +171,7 @@ export class GrRepo extends GestureEventListeners(
const promises = []; const promises = [];
const errFn: ErrorCallback = response => { const errFn: ErrorCallback = response => {
firePageError(this, response); firePageError(response);
}; };
promises.push( promises.push(

View File

@@ -18,7 +18,7 @@
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-repo.js'; import './gr-repo.js';
import {PolymerElement} from '@polymer/polymer/polymer-element.js'; import {PolymerElement} from '@polymer/polymer/polymer-element.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-repo'); const basicFixture = fixtureFromElement('gr-repo');
@@ -235,7 +235,7 @@ suite('gr-repo tests', () => {
stubRestApi('getProjectConfig').callsFake((repo, errFn) => { stubRestApi('getProjectConfig').callsFake((repo, errFn) => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.deepEqual(e.detail.response, response); assert.deepEqual(e.detail.response, response);
done(); done();
}); });

View File

@@ -172,7 +172,7 @@ export class GrDashboardView extends GestureEventListeners(
dashboard: DashboardId dashboard: DashboardId
): Promise<UserDashboard | undefined> { ): Promise<UserDashboard | undefined> {
const errFn = (response?: Response | null) => { const errFn = (response?: Response | null) => {
firePageError(this, response); firePageError(response);
}; };
return this.restApiService return this.restApiService
.getDashboard(project, dashboard, errFn) .getDashboard(project, dashboard, errFn)

View File

@@ -23,7 +23,7 @@ import {GerritView} from '../../../services/router/router-model.js';
import {changeIsOpen} from '../../../utils/change-util.js'; import {changeIsOpen} from '../../../utils/change-util.js';
import {ChangeStatus} from '../../../constants/constants.js'; import {ChangeStatus} from '../../../constants/constants.js';
import {createAccountWithId} from '../../../test/test-data-generators.js'; import {createAccountWithId} from '../../../test/test-data-generators.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-dashboard-view'); const basicFixture = fixtureFromElement('gr-dashboard-view');
@@ -377,7 +377,7 @@ suite('gr-dashboard-view tests', () => {
async (project, dashboard, errFn) => { async (project, dashboard, errFn) => {
errFn(response); errFn(response);
}); });
element.addEventListener('page-error', e => { addListenerForTest(document, 'page-error', e => {
assert.strictEqual(e.detail.response, response); assert.strictEqual(e.detail.response, response);
paramsChangedPromise.then(done); paramsChangedPromise.then(done);
}); });

View File

@@ -1855,7 +1855,7 @@ export class GrChangeView extends KeyboardShortcutMixin(
} }
_handleGetChangeDetailError(response?: Response | null) { _handleGetChangeDetailError(response?: Response | null) {
firePageError(this, response); firePageError(response);
} }
_getLoggedIn() { _getLoggedIn() {

View File

@@ -65,6 +65,7 @@ import {
} from '../../gr-app-types'; } from '../../gr-app-types';
import {LocationChangeEventDetail} from '../../../types/events'; import {LocationChangeEventDetail} from '../../../types/events';
import {GerritView, updateState} from '../../../services/router/router-model'; import {GerritView, updateState} from '../../../services/router/router-model';
import {firePageError} from '../../../utils/event-util';
const RoutePattern = { const RoutePattern = {
ROOT: '/', ROOT: '/',
@@ -1777,9 +1778,7 @@ export class GrRouter extends GestureEventListeners(
// Note: the app's 404 display is tightly-coupled with catching 404 // Note: the app's 404 display is tightly-coupled with catching 404
// network responses, so we simulate a 404 response status to display it. // network responses, so we simulate a 404 response status to display it.
// TODO: Decouple the gr-app error view from network responses. // TODO: Decouple the gr-app error view from network responses.
this._appElement().dispatchEvent( firePageError(new Response('', {status: 404}));
new CustomEvent('page-error', {detail: {response: {status: 404}}})
);
} }
} }

View File

@@ -22,6 +22,7 @@ import {GerritNav} from '../gr-navigation/gr-navigation.js';
import {stubBaseUrl} from '../../../test/test-utils.js'; import {stubBaseUrl} from '../../../test/test-utils.js';
import {_testOnly_RoutePattern} from './gr-router.js'; import {_testOnly_RoutePattern} from './gr-router.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {stubRestApi} from '../../../test/test-utils.js';
import {addListenerForTest} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-router'); const basicFixture = fixtureFromElement('gr-router');
@@ -664,13 +665,11 @@ suite('gr-router tests', () => {
}); });
test('_handleDefaultRoute on first load', () => { test('_handleDefaultRoute on first load', () => {
const appElementStub = {dispatchEvent: sinon.stub()}; const spy = sinon.spy();
element._appElement = () => appElementStub; addListenerForTest(document, 'page-error', spy);
element._handleDefaultRoute(); element._handleDefaultRoute();
assert.isTrue(appElementStub.dispatchEvent.calledOnce); assert.isTrue(spy.calledOnce);
assert.equal( assert.equal(spy.lastCall.args[0].detail.response.status, 404);
appElementStub.dispatchEvent.lastCall.args[0].detail.response.status,
404);
}); });
test('_handleDefaultRoute after internal navigation', () => { test('_handleDefaultRoute after internal navigation', () => {
@@ -684,8 +683,6 @@ suite('gr-router tests', () => {
sinon.stub(page, 'base'); sinon.stub(page, 'base');
element._startRouter(); element._startRouter();
const appElementStub = {dispatchEvent: sinon.stub()};
element._appElement = () => appElementStub;
element._handleDefaultRoute(); element._handleDefaultRoute();
onExit('', () => {}); // we left page; onExit('', () => {}); // we left page;

View File

@@ -609,7 +609,7 @@ export class GrDiffHost extends GestureEventListeners(
return; return;
} }
firePageError(this, response); firePageError(response);
} }
/** /**

View File

@@ -25,7 +25,7 @@ import {Side, CommentSide} from '../../../constants/constants.js';
import {createChange} from '../../../test/test-data-generators.js'; import {createChange} from '../../../test/test-data-generators.js';
import {FILE} from '../gr-diff/gr-diff-line.js'; import {FILE} from '../gr-diff/gr-diff-line.js';
import {CoverageType} from '../../../types/types.js'; import {CoverageType} from '../../../types/types.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
import {createDefaultDiffPrefs} from '../../../constants/constants.js'; import {createDefaultDiffPrefs} from '../../../constants/constants.js';
const basicFixture = fixtureFromElement('gr-diff-host'); const basicFixture = fixtureFromElement('gr-diff-host');
@@ -296,13 +296,9 @@ suite('gr-diff-host tests', () => {
setup(() => { setup(() => {
serverErrorStub = sinon.stub(); serverErrorStub = sinon.stub();
document.addEventListener('server-error', serverErrorStub); addListenerForTest(document, 'server-error', serverErrorStub);
pageErrorStub = sinon.stub(); pageErrorStub = sinon.stub();
element.addEventListener('page-error', pageErrorStub); addListenerForTest(document, 'page-error', pageErrorStub);
});
teardown(() => {
document.removeEventListener('server-error', serverErrorStub);
}); });
test('page error on HTTP-409', () => { test('page error on HTTP-409', () => {
@@ -313,7 +309,10 @@ suite('gr-diff-host tests', () => {
}); });
test('server error on non-HTTP-409', () => { test('server error on non-HTTP-409', () => {
element._handleGetDiffError({status: 500}); element._handleGetDiffError({
status: 500,
text: () => Promise.resolve(''),
});
assert.isFalse(serverErrorStub.called); assert.isFalse(serverErrorStub.called);
assert.isTrue(pageErrorStub.calledOnce); assert.isTrue(pageErrorStub.calledOnce);
assert.isNotOk(element._errorMessage); assert.isNotOk(element._errorMessage);

View File

@@ -210,7 +210,7 @@ export class GrAppElement extends KeyboardShortcutMixin(
created() { created() {
super.created(); super.created();
this._bindKeyboardShortcuts(); this._bindKeyboardShortcuts();
this.addEventListener(EventType.PAGE_ERROR, e => { document.addEventListener(EventType.PAGE_ERROR, e => {
this._handlePageError(e); this._handlePageError(e);
}); });
this.addEventListener(EventType.TITLE_CHANGE, e => { this.addEventListener(EventType.TITLE_CHANGE, e => {

View File

@@ -19,6 +19,7 @@ import '../../../test/common-test-setup-karma.js';
import './gr-js-api-interface.js'; import './gr-js-api-interface.js';
import {GrPluginActionContext} from './gr-plugin-action-context.js'; import {GrPluginActionContext} from './gr-plugin-action-context.js';
import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js';
import {addListenerForTest} from '../../../test/test-utils.js';
const pluginApi = _testOnly_initGerritPluginApi(); const pluginApi = _testOnly_initGerritPluginApi();
@@ -137,7 +138,7 @@ suite('gr-plugin-action-context tests', () => {
send: sendStub, send: sendStub,
}); });
const errorStub = sinon.stub(); const errorStub = sinon.stub();
document.addEventListener('show-alert', errorStub); addListenerForTest(document, 'show-alert', errorStub);
instance.call(); instance.call();
await flush(); await flush();
assert.isTrue(errorStub.calledOnce); assert.isTrue(errorStub.calledOnce);

View File

@@ -22,7 +22,7 @@ import {_testOnly_resetPluginLoader} from './gr-plugin-loader.js';
import {resetPlugins, stubBaseUrl} from '../../../test/test-utils.js'; import {resetPlugins, stubBaseUrl} from '../../../test/test-utils.js';
import {_testOnly_flushPreinstalls} from './gr-gerrit.js'; import {_testOnly_flushPreinstalls} from './gr-gerrit.js';
import {_testOnly_initGerritPluginApi} from './gr-gerrit.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js';
import {stubRestApi} from '../../../test/test-utils.js'; import {addListenerForTest, stubRestApi} from '../../../test/test-utils.js';
const basicFixture = fixtureFromElement('gr-js-api-interface'); const basicFixture = fixtureFromElement('gr-js-api-interface');
@@ -149,7 +149,7 @@ suite('gr-plugin-loader tests', () => {
]; ];
const alertStub = sinon.stub(); const alertStub = sinon.stub();
document.addEventListener('show-alert', alertStub); addListenerForTest(document, 'show-alert', alertStub);
sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => { sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => {
pluginApi.install(() => { pluginApi.install(() => {
@@ -177,7 +177,7 @@ suite('gr-plugin-loader tests', () => {
]; ];
const alertStub = sinon.stub(); const alertStub = sinon.stub();
document.addEventListener('show-alert', alertStub); addListenerForTest(document, 'show-alert', alertStub);
sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => { sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => {
pluginApi.install(() => { pluginApi.install(() => {
@@ -210,7 +210,7 @@ suite('gr-plugin-loader tests', () => {
]; ];
const alertStub = sinon.stub(); const alertStub = sinon.stub();
document.addEventListener('show-alert', alertStub); addListenerForTest(document, 'show-alert', alertStub);
sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => { sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => {
pluginApi.install(() => { pluginApi.install(() => {
@@ -236,7 +236,7 @@ suite('gr-plugin-loader tests', () => {
]; ];
const alertStub = sinon.stub(); const alertStub = sinon.stub();
document.addEventListener('show-alert', alertStub); addListenerForTest(document, 'show-alert', alertStub);
sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => { sinon.stub(pluginLoader, '_loadJsPlugin').callsFake( url => {
pluginApi.install(() => { pluginApi.install(() => {

View File

@@ -16,8 +16,6 @@
*/ */
/* NB: Order is important, because of namespaced classes. */ /* NB: Order is important, because of namespaced classes. */
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners';
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin';
import {PolymerElement} from '@polymer/polymer/polymer-element'; import {PolymerElement} from '@polymer/polymer/polymer-element';
import {GrEtagDecorator} from './gr-etag-decorator'; import {GrEtagDecorator} from './gr-etag-decorator';
import { import {
@@ -41,7 +39,7 @@ import {
listChangesOptionsToHex, listChangesOptionsToHex,
} from '../../../utils/change-util'; } from '../../../utils/change-util';
import {assertNever, hasOwnProperty} from '../../../utils/common-util'; import {assertNever, hasOwnProperty} from '../../../utils/common-util';
import {customElement, property} from '@polymer/decorators'; import {customElement} from '@polymer/decorators';
import {AuthRequestInit, AuthService} from '../../../services/gr-auth/gr-auth'; import {AuthRequestInit, AuthService} from '../../../services/gr-auth/gr-auth';
import { import {
AccountCapabilityInfo, AccountCapabilityInfo,
@@ -297,22 +295,16 @@ declare global {
} }
@customElement('gr-rest-api-interface') @customElement('gr-rest-api-interface')
export class GrRestApiInterface export class GrRestApiInterface extends PolymerElement
extends GestureEventListeners(LegacyElementMixin(PolymerElement))
implements RestApiService { implements RestApiService {
@property({type: Object})
readonly _cache = siteBasedCache; // Shared across instances. readonly _cache = siteBasedCache; // Shared across instances.
@property({type: Object})
readonly _sharedFetchPromises = fetchPromisesCache; // Shared across instances. readonly _sharedFetchPromises = fetchPromisesCache; // Shared across instances.
@property({type: Object})
readonly _pendingRequests = pendingRequest; // Shared across instances. readonly _pendingRequests = pendingRequest; // Shared across instances.
@property({type: Object})
readonly _etags = grEtagDecorator; // Shared across instances. readonly _etags = grEtagDecorator; // Shared across instances.
@property({type: Object})
readonly _projectLookup = projectLookup; // Shared across instances. readonly _projectLookup = projectLookup; // Shared across instances.
// The value is set in created, before any other actions // The value is set in created, before any other actions
@@ -3067,8 +3059,7 @@ export class GrRestApiInterface
return Promise.resolve(project); return Promise.resolve(project);
} }
const onError = (response?: Response | null) => const onError = (response?: Response | null) => firePageError(response);
firePageError(this, response);
return this.getChange(changeNum, onError).then(change => { return this.getChange(changeNum, onError).then(change => {
if (!change || !change.project) { if (!change || !change.project) {

View File

@@ -16,8 +16,7 @@
*/ */
import '../../../test/common-test-setup-karma.js'; import '../../../test/common-test-setup-karma.js';
import './gr-rest-api-interface.js'; import {addListenerForTest, mockPromise} from '../../../test/test-utils.js';
import {mockPromise} from '../../../test/test-utils.js';
import {GrReviewerUpdatesParser} from './gr-reviewer-updates-parser.js'; import {GrReviewerUpdatesParser} from './gr-reviewer-updates-parser.js';
import {ListChangesOption} from '../../../utils/change-util.js'; import {ListChangesOption} from '../../../utils/change-util.js';
import {appContext} from '../../../services/app-context.js'; import {appContext} from '../../../services/app-context.js';
@@ -28,8 +27,7 @@ import {
readResponsePayload, readResponsePayload,
} from './gr-rest-apis/gr-rest-api-helper.js'; } from './gr-rest-apis/gr-rest-api-helper.js';
import {JSON_PREFIX} from './gr-rest-apis/gr-rest-api-helper.js'; import {JSON_PREFIX} from './gr-rest-apis/gr-rest-api-helper.js';
import {GrRestApiInterface} from './gr-rest-api-interface.js';
const basicFixture = fixtureFromElement('gr-rest-api-interface');
suite('gr-rest-api-interface tests', () => { suite('gr-rest-api-interface tests', () => {
let element; let element;
@@ -53,7 +51,7 @@ suite('gr-rest-api-interface tests', () => {
// fake auth // fake auth
sinon.stub(appContext.authService, 'authCheck') sinon.stub(appContext.authService, 'authCheck')
.returns(Promise.resolve(true)); .returns(Promise.resolve(true));
element = basicFixture.instantiate(); element = new GrRestApiInterface();
element._projectLookup = {}; element._projectLookup = {};
}); });
@@ -267,7 +265,7 @@ suite('gr-rest-api-interface tests', () => {
const getResponseObjectStub = sinon.stub(element, 'getResponseObject'); const getResponseObjectStub = sinon.stub(element, 'getResponseObject');
window.fetch.returns(Promise.resolve({ok: false})); window.fetch.returns(Promise.resolve({ok: false}));
const serverErrorEventPromise = new Promise(resolve => { const serverErrorEventPromise = new Promise(resolve => {
document.addEventListener('server-error', resolve); addListenerForTest(document, 'server-error', resolve);
}); });
return Promise.all([element._restApiHelper.fetchJSON({}).then(response => { return Promise.all([element._restApiHelper.fetchJSON({}).then(response => {
@@ -1253,7 +1251,7 @@ suite('gr-rest-api-interface tests', () => {
test('getFileContent suppresses 404s', () => { test('getFileContent suppresses 404s', () => {
const res = {status: 404}; const res = {status: 404};
const spy = sinon.spy(); const spy = sinon.spy();
document.addEventListener('server-error', spy); addListenerForTest(document, 'server-error', spy);
sinon.stub(appContext.authService, 'fetch').returns(Promise.resolve(res)); sinon.stub(appContext.authService, 'fetch').returns(Promise.resolve(res));
sinon.stub(element, '_changeBaseURL').returns(Promise.resolve('')); sinon.stub(element, '_changeBaseURL').returns(Promise.resolve(''));
return element.getFileContent('1', 'tst/path', '1') return element.getFileContent('1', 'tst/path', '1')
@@ -1306,7 +1304,7 @@ suite('gr-rest-api-interface tests', () => {
test('_logCall only reports requests with anonymized URLss', () => { test('_logCall only reports requests with anonymized URLss', () => {
sinon.stub(Date, 'now').returns(200); sinon.stub(Date, 'now').returns(200);
const handler = sinon.stub(); const handler = sinon.stub();
document.addEventListener('gr-rpc-log', handler); addListenerForTest(document, 'gr-rpc-log', handler);
element._restApiHelper._logCall({url: 'url'}, 100, 200); element._restApiHelper._logCall({url: 'url'}, 100, 200);
assert.isFalse(handler.called); assert.isFalse(handler.called);
@@ -1320,14 +1318,13 @@ suite('gr-rest-api-interface tests', () => {
test('ported comment errors do not trigger error dialog', () => { test('ported comment errors do not trigger error dialog', () => {
const change = createChange(); const change = createChange();
const handler = sinon.stub(); const handler = sinon.stub();
document.addEventListener('server-error', handler); addListenerForTest(document, 'server-error', handler);
sinon.stub(element._restApiHelper, 'fetchJSON').returns(Promise.resolve({ sinon.stub(element._restApiHelper, 'fetchJSON').returns(Promise.resolve({
ok: false})); ok: false}));
element.getPortedComments(change._number, CURRENT); element.getPortedComments(change._number, CURRENT);
assert.isFalse(handler.called); assert.isFalse(handler.called);
document.removeEventListener('server-error', handler);
}); });
test('ported drafts are not requested user is not logged in', () => { test('ported drafts are not requested user is not logged in', () => {

View File

@@ -40,7 +40,7 @@ export interface PageErrorEventDetail {
export type PageErrorEvent = CustomEvent<PageErrorEventDetail>; export type PageErrorEvent = CustomEvent<PageErrorEventDetail>;
declare global { declare global {
interface HTMLElementEventMap { interface DocumentEventMap {
'page-error': PageErrorEvent; 'page-error': PageErrorEvent;
} }
} }

View File

@@ -46,8 +46,8 @@ export function fireAlert(target: EventTarget, message: string) {
); );
} }
export function firePageError(target: EventTarget, response?: Response | null) { export function firePageError(response?: Response | null) {
target.dispatchEvent( document.dispatchEvent(
new CustomEvent(EventType.PAGE_ERROR, { new CustomEvent(EventType.PAGE_ERROR, {
detail: {response}, detail: {response},
composed: true, composed: true,