// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'chrome://resources/ash/common/cr_elements/cr_button/cr_button.js';
import 'chrome://resources/ash/common/cr_elements/cr_dialog/cr_dialog.js';
import 'chrome://resources/ash/common/cr_elements/icons.html.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import './shimless_rma_shared.css.js';
import './base_page.js';
import './icons.html.js';
import {CrDialogElement} from 'chrome://resources/ash/common/cr_elements/cr_dialog/cr_dialog.js';
import {I18nMixin} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js';
import {assert} from 'chrome://resources/js/assert.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {createCustomEvent, FATAL_HARDWARE_ERROR, FatalHardwareEvent} from './events.js';
import {getShimlessRmaService} from './mojo_interface_provider.js';
import {getTemplate} from './reimaging_provisioning_page.html.js';
import {ProvisioningError, ProvisioningObserverReceiver, ProvisioningStatus, RmadErrorCode, ShimlessRmaServiceInterface} from './shimless_rma.mojom-webui.js';
import {executeThenTransitionState, focusPageTitle} from './shimless_rma_util.js';
declare global {
interface HTMLElementEventMap {
[FATAL_HARDWARE_ERROR]: FatalHardwareEvent;
}
}
/**
* @fileoverview
* 'reimaging-provisioning-page' provisions the device then auto-transitions to
* the next page once complete.
*/
/**
* The prefix for a `ProvisioningError` displayed on the Hardware Error page.
*/
export const PROVISIONING_ERROR_CODE_PREFIX = 1000;
const ReimagingProvisioningPageBase = I18nMixin(PolymerElement);
export class ReimagingProvisioningPage extends ReimagingProvisioningPageBase {
static get is() {
return 'reimaging-provisioning-page' as const;
}
static get template() {
return getTemplate();
}
static get properties() {
return {
/**
* Set by shimless_rma.ts.
*/
allButtonsDisabled: Boolean,
status: {
type: Object,
},
shouldShowSpinner: {
type: Boolean,
value: true,
},
};
}
allButtonsDisabled: boolean;
protected status: ProvisioningStatus;
protected shouldShowSpinner: boolean;
private shimlessRmaService: ShimlessRmaServiceInterface =
getShimlessRmaService();
provisioningObserverReceiver: ProvisioningObserverReceiver =
new ProvisioningObserverReceiver(this);
constructor() {
super();
this.shimlessRmaService.observeProvisioningProgress(
this.provisioningObserverReceiver.$.bindNewPipeAndPassRemote());
}
override ready() {
super.ready();
focusPageTitle(this);
}
/**
* Implements ProvisioningObserver.onProvisioningUpdated()
*/
onProvisioningUpdated(
status: ProvisioningStatus, _progress: number,
error: ProvisioningError): void {
const isErrorStatus = status === ProvisioningStatus.kFailedBlocking ||
status === ProvisioningStatus.kFailedNonBlocking;
const isWpError = isErrorStatus && error === ProvisioningError.kWpEnabled;
if (isErrorStatus && !isWpError) {
this.dispatchEvent(createCustomEvent(FATAL_HARDWARE_ERROR, {
rmadErrorCode: RmadErrorCode.kProvisioningFailed,
fatalErrorCode: (PROVISIONING_ERROR_CODE_PREFIX + error),
}));
}
this.status = status;
// Transition to next state when provisioning is complete.
if (this.status === ProvisioningStatus.kComplete) {
this.shouldShowSpinner = false;
executeThenTransitionState(
this, () => this.shimlessRmaService.provisioningComplete());
return;
}
this.shouldShowSpinner =
isWpError || this.status === ProvisioningStatus.kInProgress;
if (isWpError) {
const dialog: CrDialogElement|null =
this.shadowRoot!.querySelector('#wpEnabledDialog');
assert(dialog);
dialog.showModal();
}
}
protected onTryAgainButtonClick(): void {
const dialog: CrDialogElement|null =
this.shadowRoot!.querySelector('#wpEnabledDialog');
assert(dialog);
dialog.close();
executeThenTransitionState(
this, () => this.shimlessRmaService.retryProvisioning());
}
}
declare global {
interface HTMLElementTagNameMap {
[ReimagingProvisioningPage.is]: ReimagingProvisioningPage;
}
}
customElements.define(ReimagingProvisioningPage.is, ReimagingProvisioningPage);