# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Contributing to Chrome DevTools Protocol: https://goo.gle/devtools-contribution-guide-cdp

# This domain allows interacting with the browser to control PWAs.
experimental domain PWA

  # The following types are the replica of
  # https://crsrc.org/c/chrome/browser/web_applications/proto/web_app_os_integration_state.proto;drc=9910d3be894c8f142c977ba1023f30a656bc13fc;l=67
  type FileHandlerAccept extends object
    properties
      # New name of the mimetype according to
      # https://www.iana.org/assignments/media-types/media-types.xhtml
      string mediaType
      array of string fileExtensions

  type FileHandler extends object
    properties
      string action
      array of FileHandlerAccept accepts
      string displayName

  # Returns the following OS state for the given manifest id.
  command getOsAppState
    parameters
      # The id from the webapp's manifest file, commonly it's the url of the
      # site installing the webapp. See
      # https://web.dev/learn/pwa/web-app-manifest.
      string manifestId
    returns
      integer badgeCount
      array of FileHandler fileHandlers

  # Installs the given manifest identity, optionally using the given installUrlOrBundleUrl
  #
  # IWA-specific install description:
  # manifestId corresponds to isolated-app:// + web_package::SignedWebBundleId
  #
  # File installation mode:
  # The installUrlOrBundleUrl can be either file:// or http(s):// pointing
  # to a signed web bundle (.swbn). In this case SignedWebBundleId must correspond to
  # The .swbn file's signing key.
  #
  # Dev proxy installation mode:
  # installUrlOrBundleUrl must be http(s):// that serves dev mode IWA.
  # web_package::SignedWebBundleId must be of type dev proxy.
  #
  # The advantage of dev proxy mode is that all changes to IWA
  # automatically will be reflected in the running app without
  # reinstallation.
  #
  # To generate bundle id for proxy mode:
  # 1. Generate 32 random bytes.
  # 2. Add a specific suffix 0x00 at the end.
  # 3. Encode the entire sequence using Base32 without padding.
  #
  # If Chrome is not in IWA dev
  # mode, the installation will fail, regardless of the state of the allowlist.
  command install
    parameters
      string manifestId
      # The location of the app or bundle overriding the one derived from the
      # manifestId.
      optional string installUrlOrBundleUrl

  # Uninstalls the given manifest_id and closes any opened app windows.
  command uninstall
    parameters
      string manifestId

  # Launches the installed web app, or an url in the same web app instead of the
  # default start url if it is provided. Returns a page Target.TargetID which
  # can be used to attach to via Target.attachToTarget or similar APIs.
  command launch
    parameters
      string manifestId
      optional string url
    returns
      # ID of the tab target created as a result.
      Target.TargetID targetId

  # Opens one or more local files from an installed web app identified by its
  # manifestId. The web app needs to have file handlers registered to process
  # the files. The API returns one or more page Target.TargetIDs which can be
  # used to attach to via Target.attachToTarget or similar APIs.
  # If some files in the parameters cannot be handled by the web app, they will
  # be ignored. If none of the files can be handled, this API returns an error.
  # If no files are provided as the parameter, this API also returns an error.
  #
  # According to the definition of the file handlers in the manifest file, one
  # Target.TargetID may represent a page handling one or more files. The order
  # of the returned Target.TargetIDs is not guaranteed.
  #
  # TODO(crbug.com/339454034): Check the existences of the input files.
  command launchFilesInApp
    parameters
      string manifestId
      array of string files
    returns
      # IDs of the tab targets created as the result.
      array of Target.TargetID targetIds

  # Opens the current page in its web app identified by the manifest id, needs
  # to be called on a page target. This function returns immediately without
  # waiting for the app to finish loading.
  command openCurrentPageInApp
    parameters
      string manifestId

  # If user prefers opening the app in browser or an app window.
  type DisplayMode extends string
    enum
      standalone
      browser

  # Changes user settings of the web app identified by its manifestId. If the
  # app was not installed, this command returns an error. Unset parameters will
  # be ignored; unrecognized values will cause an error.
  #
  # Unlike the ones defined in the manifest files of the web apps, these
  # settings are provided by the browser and controlled by the users, they
  # impact the way the browser handling the web apps.
  #
  # See the comment of each parameter.
  command changeAppUserSettings
    parameters
      string manifestId
      # If user allows the links clicked on by the user in the app's scope, or
      # extended scope if the manifest has scope extensions and the flags
      # `DesktopPWAsLinkCapturingWithScopeExtensions` and
      # `WebAppEnableScopeExtensions` are enabled.
      #
      # Note, the API does not support resetting the linkCapturing to the
      # initial value, uninstalling and installing the web app again will reset
      # it.
      #
      # TODO(crbug.com/339453269): Setting this value on ChromeOS is not
      # supported yet.
      optional boolean linkCapturing
      optional DisplayMode displayMode
