chromium/ui/file_manager/file_manager/common/js/script_loader.ts

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {getSanitizedScriptUrl} from './trusted_script_url_policy_util.js';

/**
 * @fileoverview Script loader allows loading scripts at the desired time.
 */

export interface ScriptParams {
  type?: string;
  defer?: boolean;
}

/**
 * Used to load scripts at a runtime. Typical use:
 *
 * await new ScriptLoader('its_time.js').load();
 *
 * Optional parameters may be also specified:
 *
 * await new ScriptLoader('its_time.js', {type: 'module'}).load();
 */
export class ScriptLoader {
  private type_: string|undefined;
  private defer_: boolean|undefined;

  /**
   * Creates a loader that loads the script specified by |src| once the load
   * method is called. Optional |params| can specify other script attributes.
   */
  constructor(private src_: string, params: ScriptParams = {}) {
    this.type_ = params.type;
    this.defer_ = params.defer;
  }

  async load(): Promise<string> {
    return new Promise((resolve, reject) => {
      const script = document.createElement('script');
      if (this.type_ !== undefined) {
        script.type = this.type_;
      }
      if (this.defer_ !== undefined) {
        script.defer = this.defer_;
      }
      script.onload = () => resolve(this.src_);
      script.onerror = (error) => reject(error);
      script.src = getSanitizedScriptUrl(this.src_) as unknown as string;
      document.head.append(script);
    });
  }
}