chromium/chrome/browser/resources/segmentation_internals/segmentation_survey.ts

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

import {getTrustedHTML} from 'chrome://resources/js/static_types.js';
import {getRequiredElement} from 'chrome://resources/js/util.js';

import type {ClientInfo, SegmentInfo} from './segmentation_internals.mojom-webui.js';
import {SegmentationInternalsBrowserProxy} from './segmentation_internals_browser_proxy.js';

function getProxy(): SegmentationInternalsBrowserProxy {
  return SegmentationInternalsBrowserProxy.getInstance();
}

function isURLSafe(urlStr: string|undefined): boolean {
  if (urlStr === undefined) {
    return false;
  }
  const allowedList = ['https://www.google.com/search?q=chrome'];
  for (let i = 0; i < allowedList.length; ++i) {
    if (urlStr === allowedList[i]) {
      return true;
    }
  }
  return false;
}

function openSurvey(result: string|undefined) {
  try {
    const untrustedParam =
        new URL(window.location.href).searchParams.get('url');
    if (untrustedParam) {
      const untruedtURL = new URL(decodeURIComponent(untrustedParam));
      const untrustedURLStr = untruedtURL ? untruedtURL.toString() : undefined;
      if (isURLSafe(untrustedURLStr)) {
        let safeURL: string = untrustedURLStr!;
        if (result) {
          safeURL = safeURL! + '&option=' + encodeURIComponent(result);
        }
        window.location.href = safeURL;
      }
    }
  } catch (error) {
  }
  const div = getRequiredElement('client-container');
  div.innerHTML =
      getTrustedHTML`Failed to open. Please check instructions in email.`;
}

function processPredictionResult(segmentInfo: SegmentInfo) {
  const result = String(segmentInfo.predictionResult) +
      ' Timestamp: ' + String(segmentInfo.predictionTimestamp.internalValue);
  const encoded = window.btoa(result);
  openSurvey(encoded);
}

function processClientInfo(info: ClientInfo) {
  for (let i = 0; i < info.segmentInfo.length; ++i) {
    processPredictionResult(info.segmentInfo[i]!);
  }
}

function initialize() {
  const div = getRequiredElement('client-container');
  div.innerHTML = getTrustedHTML`Loading...`;
  setTimeout(() => {
    openSurvey(undefined);
  }, 1000);

  getProxy().getCallbackRouter().onClientInfoAvailable.addListener(
      (clientInfos: ClientInfo[]) => {
        for (let i = 0; i < clientInfos.length; ++i) {
          if (clientInfos[i]!.segmentationKey === 'metrics_clustering') {
            processClientInfo(clientInfos[i]!);
          }
        }
      });

  getProxy().getServiceStatus();
}

document.addEventListener('DOMContentLoaded', initialize);