| /** |
| * @license |
| * Copyright 2015 Google LLC |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| import {safeTypesBridge} from '../utils/safe-types-util'; |
| import './font-roboto-local-loader'; |
| import '../types/globals'; |
| // Sets up global Polymer variable, because plugins requires it. |
| import '../scripts/bundled-polymer'; |
| |
| /** |
| * setCancelSyntheticClickEvents is set to true by |
| * default which will cancel synthetic click events |
| * on older touch device. |
| * See https://github.com/Polymer/polymer/issues/5289 |
| */ |
| import { |
| setPassiveTouchGestures, |
| setCancelSyntheticClickEvents, |
| } from '@polymer/polymer/lib/utils/settings'; |
| setCancelSyntheticClickEvents(false); |
| setPassiveTouchGestures(true); |
| |
| import {initGerrit, initGlobalVariables} from './gr-app-global-var-init'; |
| import './gr-app-element'; |
| import {Finalizable} from '../services/registry'; |
| import { |
| DependencyError, |
| DependencyToken, |
| provide, |
| Provider, |
| } from '../models/dependency'; |
| import {installPolymerResin} from '../scripts/polymer-resin-install'; |
| |
| import { |
| createAppContext, |
| createAppDependencies, |
| Creator, |
| } from '../services/app-context-init'; |
| import {html, LitElement} from 'lit'; |
| import {customElement} from 'lit/decorators.js'; |
| import { |
| ServiceWorkerInstaller, |
| serviceWorkerInstallerToken, |
| } from '../services/service-worker-installer'; |
| import {pluginLoaderToken} from './shared/gr-js-api-interface/gr-plugin-loader'; |
| import {getAppContext} from '../services/app-context'; |
| |
| initGlobalVariables(createAppContext(), true); |
| |
| installPolymerResin(safeTypesBridge); |
| |
| @customElement('gr-app') |
| export class GrApp extends LitElement { |
| private finalizables: Finalizable[] = []; |
| |
| private serviceWorkerInstaller?: ServiceWorkerInstaller; |
| |
| override connectedCallback() { |
| super.connectedCallback(); |
| const dependencies = new Map<DependencyToken<unknown>, Provider<unknown>>(); |
| |
| const injectDependency = <T>( |
| token: DependencyToken<T>, |
| creator: Creator<T> |
| ) => { |
| let service: (T & Finalizable) | undefined = undefined; |
| dependencies.set(token, () => { |
| if (service) return service; |
| service = creator(); |
| this.finalizables.push(service); |
| return service; |
| }); |
| }; |
| |
| const resolver = <T>(token: DependencyToken<T>): T => { |
| const provider = dependencies.get(token); |
| if (provider) { |
| return provider() as T; |
| } else { |
| throw new DependencyError( |
| token, |
| 'Forgot to set up dependency for gr-app' |
| ); |
| } |
| }; |
| |
| for (const [token, creator] of createAppDependencies( |
| getAppContext(), |
| resolver |
| )) { |
| injectDependency(token, creator); |
| } |
| for (const [token, provider] of dependencies) { |
| provide(this, token, provider); |
| } |
| |
| initGerrit(resolver(pluginLoaderToken)); |
| |
| if (!this.serviceWorkerInstaller) { |
| this.serviceWorkerInstaller = resolver(serviceWorkerInstallerToken); |
| } |
| } |
| |
| override disconnectedCallback() { |
| for (const f of this.finalizables) { |
| f.finalize(); |
| } |
| this.finalizables = []; |
| super.disconnectedCallback(); |
| } |
| |
| override render() { |
| return html`<gr-app-element id="app-element"></gr-app-element>`; |
| } |
| } |
| |
| declare global { |
| interface HTMLElementTagNameMap { |
| 'gr-app': GrApp; |
| } |
| } |