chromium/chrome/browser/resources/chromeos/parent_access/parent_access_controller.ts

// 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 {PostMessageApiServer} from 'chrome://resources/ash/common/post_message_api/post_message_api_server.js';
import {PromiseResolver} from 'chrome://resources/ash/common/promise_resolver.js';

/**
 * Class that implements the Chrome side of the ParentAccess PostMessageAPI.
 */
export class ParentAccessController extends PostMessageApiServer {
  private parentAccessCallbackReceivedResolver: PromiseResolver<string>;
  private initializationErrorResolver: PromiseResolver<string>;

  constructor(
      webviewElement: Element, targetURL: string, originURLPrefix: string) {
    super(webviewElement, targetURL, originURLPrefix);

    this.parentAccessCallbackReceivedResolver = new PromiseResolver();
    this.initializationErrorResolver = new PromiseResolver();

    this.registerMethod('onParentAccessResult', (param: string[]) => {
      this.parentAccessResult(param[0]);
    });
  }

  /*
   * Returns a promise that rejects when there was an error initializing the
   * PostMessageAPI connection.
   */
  whenInitializationError(): Promise<string> {
    return this.initializationErrorResolver.promise;
  }

  override onInitializationError(origin: string) {
    this.initializationErrorResolver.reject(origin);
  }

  whenParentAccessCallbackReceived(): Promise<string> {
    return this.parentAccessCallbackReceivedResolver.promise;
  }

  /**
   * Signals to the owner that the parent access web widget completed.
   * Takes the result of the parent verification returned by the web widget. It
   * is a base64 encoded serialized proto that contains the proof of
   * verification that can be used by the handler.
   */
  private parentAccessResult(parentAccessResultProto: string) {
    this.parentAccessCallbackReceivedResolver.resolve(parentAccessResultProto);
    // Resets resolver to wait for the next callback.
    this.parentAccessCallbackReceivedResolver = new PromiseResolver();
  }
}