chromium/chromeos/crosapi/mojom/app_service_types.mojom

// 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.
//
// NOTE: Future MinVersion values should take into account that MinVersion is
// scoped per struct. In the past, some of the MinVersion values in this file
// were set based on the understanding that the entire file should share a
// MinVersion counter.

module crosapi.mojom;

import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "ui/gfx/image/mojom/image.mojom";
import "url/mojom/url.mojom";

// Information about an app. See components/services/app_service/README.md.

// This struct is used to transport App data between lacros-chrome and
// ash-chrome. It is intended to be the minimal subset of apps::mojom::App
// required for this purpose, and exists to allow apps::mojom::App to not have
// to be versioned.
// See components/services/app_service/public/cpp/app_types.h for details for
// the structs in this file.
[Stable]
struct App {
  AppType app_type@0;
  string app_id@1;

  // The fields above are mandatory. Everything else below is optional.

  Readiness readiness@2;
  string? name@3;
  string? short_name@4;

  // An optional, publisher-specific ID for this app, e.g. for Android apps,
  // this field contains the Android package name, and for web apps, it
  // contains the start URL.
  string? publisher_id@5;
  string? description@6;
  string? version@7;
  array<string> additional_search_terms@8;
  IconKey? icon_key@9;
  mojo_base.mojom.Time? last_launch_time@10;
  mojo_base.mojom.Time? install_time@11;

  // Whether the app was installed by sync, policy or as a default app.
  InstallReason install_reason@12;
  OptionalBool recommendable@13;
  OptionalBool searchable@14;
  OptionalBool show_in_launcher@15;
  OptionalBool show_in_shelf@16;
  OptionalBool show_in_search@17;
  OptionalBool show_in_management@18;

  // Whether the app icon should add the notification badging.
  OptionalBool has_badge@19;

  // Paused apps cannot be launched, and any running apps that become paused
  // will be stopped. This is independent of whether or not the app is ready to
  // be launched (defined by the Readiness field).
  OptionalBool paused@20;

  // This vector stores all the intent filters defined in this app. Each
  // intent filter defines a matching criteria for whether an intent can
  // be handled by this app. One app can have multiple intent filters.
  array<IntentFilter> intent_filters@21;

  // Whether the app's display mode is in the browser or otherwise.
  [MinVersion=2]
  WindowMode window_mode@22;

  [MinVersion=7, RenamedFrom="policy_id"]
  // DEPRECATED, replaced with |policy_ids| below.
  string? deprecated_policy_id@23;

  // This vector must be treated atomically, if there is a permission
  // change, the publisher must send through the entire list of permissions.
  // Should contain no duplicate IDs.
  // If null during updates, Subscriber can assume no changes.
  // There is no guarantee that this is sorted by any criteria.
  [MinVersion=8]
  array<Permission>? permissions@24;

  [MinVersion=11]
  // Whether the app publisher allows the app to be uninstalled.
  OptionalBool allow_uninstall@25;

  [MinVersion=12]
  // kTrue if the app is able to handle intents and should be shown in intent
  // surfaces.
  OptionalBool handles_intents@26;

  [MinVersion=18, RenamedFrom="shortcuts"]
  // DEPRECATED, will be replaced by specific interfaces to update shortcuts.
  // This struct is not used in production yet, so it's safe to deprecate.
  array<REMOVED_01>? deprecated_shortcuts@27;

  [MinVersion=19]
  OptionalBool is_platform_app@28;

  [MinVersion=20]
  // IDs used for policy to identify the app.
  // For web apps, it contains the install URL(s).
  array<string>? policy_ids@29;

  // The amount of storage (in bytes) used by the app.
  [MinVersion=21]
  uint64? app_size_in_bytes@30;

  // The amount of storage (in bytes) used by the app's data.
  [MinVersion=21]
  uint64? data_size_in_bytes@31;

  [MinVersion=22]
  // Whether the app publisher allows the app to be closed.
  OptionalBool allow_close@32;

  [MinVersion=23]
  // Whether the app publisher allows the user to select app open mode.
  OptionalBool allow_window_mode_selection@33;

  [MinVersion=24]
  // An optional ID for the package that installed this app.
  PackageId? installer_package_id@34;
};

// The types of apps available in the registry.
[Stable, Extensible]
enum AppType {
  [Default] kUnknown = 0,
  kArc,           // Android app.
  kWeb,           // Web app.
  kSystemWeb,     // System web app.
  [MinVersion=1]
  kStandaloneBrowserChromeApp,     // Chrome app.
  [MinVersion=17]
  kStandaloneBrowserExtension,     // Chrome extension.
};

// Whether an app is ready to launch, i.e. installed.
[Stable, Extensible]
enum Readiness {
  [Default] kUnknown = 0,
  kReady,                // Installed and launchable.
  kDisabledByBlocklist,  // Disabled by SafeBrowsing.
  kDisabledByPolicy,     // Disabled by admin policy.
  kDisabledByUser,       // Disabled by explicit user action.
  kTerminated,           // Renderer process crashed.
  kUninstalledByUser,
  // Removed apps are purged from the registry cache and have their
  // associated memory freed. Subscribers are not notified of removed
  // apps, so publishers must set the app as uninstalled before
  // removing it.
  kRemoved,
  // This is used for all non-user initiated uninstallation.
  [MinVersion=1] kUninstalledByNonUser,
  [MinVersion=2] kDisabledByLocalSettings,  // Disabled by local settings.
};

// The reason why the app was installed.
[Stable, Extensible, RenamedFrom="crosapi.mojom.InstallSource"]
enum InstallReason {
  [Default] kUnknown = 0,
  kSystem,     // Installed with the system and is considered a part of the OS.
  kPolicy,     // Installed by policy.
  kOem,        // Installed by an OEM.
  kDefault,    // Preinstalled by default, but is not considered a system app.
  kSync,       // Installed by sync.
  kUser,       // Installed by user action.
  [MinVersion=7] kSubApp,        // Installed by the SubApp API call.
  [MinVersion=8] kKiosk,         // Installed by Kiosk on Chrome OS.
  [MinVersion=9] kCommandLine,   // Deprecated, no longer used.
};

// Augments a bool to include an 'unknown' value.
[Stable, Extensible]
enum OptionalBool {
  [Default] kUnknown = 0,
  kFalse,
  kTrue,
};

// `IconUpdateVersion` should hold a bool to specify whether the icon image is
// updated by the app when the publisher publishes the app. `IconUpdateVersion`
// should never hold a int32_t when calling OnApps to publish apps.
//
// AppRegistryCache generates an int32_t for `IconUpdateVersion` to notify
// AppService clients whether reload the icon, when merging `deltas`.
// `IconUpdateVersion` should never hold a bool in AppRegistryCache's `states_`.
//
// When the icon has a valid `resource_id`, IconUpdateVersion is
// `kInitVersion`, and never changes.
//
// When an app is added, if the icon doesn't have a valid `resource_id`,
// IconUpdateVersion is set as `kInitVersion`.
//
// If the app updates the icon image, IconUpdateVersion is set as true by a
// Publisher, and AppService increases the saved IconUpdateVersion to notify
// AppService clients to reload icons.
//
// When IconUpdateVersion is an int32_t, the exact value of the number isn't
// important, only that newer IconKey's (those that were created more recently)
// have a larger IconUpdateVersion than older IconKey's.
//
// IconUpdateVersion isn't changed if `icon_effects` is changed.
// IconUpdateVersion is increased only when the app updates, or upgrades, and
// publish a new icon image.
//
// See components/services/app_service/public/cpp/icon_types.h for details
[Stable]
union IconUpdateVersion {
  bool raw_icon_updated;
  int32 timeline;
};

[Stable]
struct IconKey {
  // A monotonically increasing number so that, after an icon update, a new
  // IconKey, one that is different in terms of field-by-field equality, can be
  // broadcast by a Publisher.
  //
  // The exact value of the number isn't important, only that newer IconKey's
  // (those that were created more recently) have a larger timeline than older
  // IconKey's.
  //
  // This is, in some sense, *a* version number, but the field is not called
  // "version", to avoid any possible confusion that it encodes *the* app's
  // version number, e.g. the "2.3.5" in "FooBar version 2.3.5 is installed".
  //
  // DEPRECATED, replaced with `update_version` below.
  [RenamedFrom="timeline"]
  uint64 deprecated_timeline;

  // A bitmask of icon post-processing effects, such as desaturation to gray
  // and rounding the corners.
  // The mask enum apps::IconEffects is defined in
  // chrome/browser/apps/app_service/app_icon/app_icon_factory.h and will remain
  // stable.
  uint32 icon_effects;

  // True when the raw icon is updated. After an icon update, a new IconKey can
  // be broadcast by a Publisher. Then the AppService icon directory should be
  // removed to fetch the new raw icon from the app.
  //
  // DEPRECATED, replaced with `update_version` below.
  [MinVersion=22, RenamedFrom="raw_icon_updated"]
  bool deprecated_raw_icon_updated;

  // The icon updated info to notify AppService clients to reload the icon.
  //
  // If the app updates the icon image, `update_version` is set as true by a
  // Publisher, and AppService increases the saved `update_version` to notify
  // AppService clients to reload icons.
  //
  // `update_version` isn't changed if `icon_effects` is changed.
  // `update_version` is increased only when the app updates, or upgrades, and
  // publish a new icon image.
  [MinVersion=23]
  IconUpdateVersion? update_version;
};

// The intent filter matching condition types.
[Stable, Extensible]
enum ConditionType {
  [Default] kScheme,  // Matches the URL scheme (e.g. https, tel).
  kAuthority,         // Matches the URL host and optionally the port
                      // (e.g. www.google.com:443).
  kPath,              // Matches the URL path (e.g. /abc/*).
  kAction,            // Matches the action type (e.g. view, send).
  kMimeType,          // Matches the top-level mime type (e.g. text/plain).
  [MinVersion=1] kFileExtension,  // Deprecated.
  [MinVersion=4] kFile            // Matches against all files.
};

// The pattern match type for intent filter pattern condition.
[Stable, Extensible]
enum PatternMatchType {
  [Default] kNone = 0,
  kLiteral,
  kPrefix,
  kGlob,
  kMimeType,
  [MinVersion=1] kFileExtension,
  [MinVersion=6] kIsDirectory,
  [MinVersion=16] kSuffix
};

// For pattern type of condition, the value match will be based on the pattern
// match type. If the match_type is kNone, then an exact match with the value
// will be required.
[Stable]
struct ConditionValue {
  string value;
  PatternMatchType match_type; // This will be None for non pattern conditions.
};

// The condition for an intent filter. It matches if the intent contains this
// condition type and the corresponding value matches with any of the
// condition_values.
[Stable]
struct Condition {
  ConditionType condition_type;
  array<ConditionValue> condition_values;
};

// An intent filter is defined by an app, and contains a list of conditions that
// an intent needs to match. If all conditions match, then this intent filter
// matches against an intent.
[Stable]
struct IntentFilter {
  array<Condition> conditions;

  // Activity which registered this filter. We only fill this field for ARC
  // share intent filters.
  string? activity_name;

  // The label shown to the user for this activity.
  string? activity_label;
};

// What caused the app to be uninstalled.
[Stable, Extensible]
enum UninstallSource {
  [Default] kUnknown = 0,
  kAppList,       // Uninstall by the user from the App List (Launcher)
  kAppManagement, // Uninstall by the user from the App Management page
  kShelf,         // Uninstall by the user from the Shelf
  kMigration,     // Uninstall by app migration.
};

// Information about whether an app is accessing some capability, e.g. camera,
// microphone.
[Stable]
struct CapabilityAccess {
  string app_id;

  // Whether the app is accessing camera.
  OptionalBool camera;

  // Whether the app is accessing microphone.
  OptionalBool microphone;
};

[Stable, Extensible]
enum IconType {
  // Sentinel value used in error cases.
  [Default] kUnknown,
  // Icon as an uncompressed gfx::ImageSkia with no standard Chrome OS mask.
  kUncompressed,
  // Icon as compressed bytes in PNG format with no standard Chrome OS mask.
  kCompressed,
  // Icon as an uncompressed gfx::ImageSkia with the standard Chrome OS mask
  // applied. This is the default suggested icon type.
  kStandard,
};

// The icon value for each app.
[Stable]
struct IconValue {
  // The icon format and whether it uses Chrome OS mask.
  IconType icon_type@0;
  // The uncompressed icon data in gfx::ImageSkia format.
  gfx.mojom.ImageSkia? uncompressed@1;
  // The compressed icon data in PNG format.
  array<uint8>? compressed@2;
  // Whether this icon data is a placeholder icon.
  bool is_placeholder_icon@3;
  // Whether this icon is a maskable icon. Per
  // https://www.w3.org/TR/appmanifest/#icon-masks, we apply a white background
  // for the maskable icon in its safe zone, and clear the standard icon effect,
  // apply the mask to the icon without shrinking it.
  [MinVersion=21] bool is_maskable_icon@4;
};

// MenuItems are used to populate context menus.
[Stable]
struct MenuItems {
  array<MenuItem> items@0;
};

// The context menu model for each app. For web apps currently it's the info
// for shortcut items.
[Stable]
struct MenuItem {
  string label@0;                      // The string label, may be empty.
  gfx.mojom.ImageSkia? image@1;        // The image icon, may be null.
  [MinVersion=3]string? id@2;          // The id of the item.
};

[Stable, Extensible]
// The mode that the app will be opened in (e.g. standalone window or browser
// tab).
enum WindowMode {
  [Default] kUnknown = 0,
  // Opens in a standalone window
  kWindow,
  // Opens in the default web browser
  kBrowser,
  // Opens in a tabbed app window
  kTabbedWindow,
};

// Metadata for a single file shared through an intent.
[Stable]
struct IntentFile {
  // The file path of the file to share.
  mojo_base.mojom.FilePath file_path@0;

  // File MIME type.
  [MinVersion=15] string? mime_type@1;
};

// Action and resource handling request. This should
// be kept in sync with ConvertIntentToValue and ConvertValueToIntent in
// components/services/app_service/public/cpp/intent_util.*
[Stable]
struct Intent {
  string action@0;       // Intent action. e.g. view, send.
  url.mojom.Url? url@1;  // The URL of the intent. e.g. https://www.google.com/.
  string? mime_type@2;   // MIME type. e.g. text/plain, image/*.
  string? share_text@3;  // Text to share. e.g. Share link to other app.
  string? share_title@4; // Title for the share.
  // The files to view or share.
  [MinVersion=5] array<IntentFile>? files@5;
  // The activity for the app to launch.
  [MinVersion=13] string? activity_name@6;
  [MinVersion=14] string? data@7;
  [MinVersion=15] bool? ui_bypassed@8; // Whether or not the user saw the UI.
  [MinVersion=15] map<string, string>? extras@9;  // Optional string extras.
};

[Stable, Extensible]
enum LaunchResultState {
  [Default] kFailed,
  kFailedDirectoryNotShared,
  kSuccess,
};

// The result from launching an app.
[Stable]
struct LaunchResult {
  // The id to represent which instance the app is launched in. Deprecated: use
  // `instance_ids`.
  mojo_base.mojom.UnguessableToken instance_id@0;
  // The IDs that represent the instances the app is launched in.
  [MinVersion=1] array<mojo_base.mojom.UnguessableToken>? instance_ids@1;
  [MinVersion=2] LaunchResultState state@2;
};

// Enumeration of app launch sources.
[Stable, Extensible]
enum LaunchSource {
  [Default] kUnknown = 0,
  kFromAppListGrid,              // Grid of apps, not the search box.
  kFromAppListGridContextMenu,   // Grid of apps; context menu.
  kFromAppListQuery,             // Query-dependent results (larger icons).
  kFromAppListQueryContextMenu,  // Query-dependent results; context menu.
  kFromAppListRecommendation,    // Query-less recommendations (smaller
                                 // icons).
  kFromParentalControls,         // Parental Controls Settings Section and
                                 // Per App time notification.
  kFromShelf,                    // Shelf.
  kFromFileManager,              // FileManager.
  kFromLink,                     // Left-clicking on links in the browser.
  kFromOmnibox,                  // Enter URL in the Omnibox in the
                                 // browser.
  kFromChromeInternal,           // Chrome internal call.
  kFromKeyboard,                 // Keyboard shortcut for opening app.
  kFromOtherApp,                 // Clicking link in another app or webui.
  kFromMenu,                     // Menu.
  kFromInstalledNotification,    // Installed notification
  kFromTest,                     // Test
  kFromArc,                      // Arc.
  kFromSharesheet,               // Sharesheet.
  kFromReleaseNotesNotification, // Release Notes Notification.
  kFromFullRestore,              // Full restore.
  kFromSmartTextContextMenu,     // Smart text selection context menu.
  kFromDiscoverTabNotification,  // Discover Tab Notification.
  [MinVersion=10] kFromManagementApi,            // Management API.
  [MinVersion=10] kFromKiosk,                    // Kiosk.
  [MinVersion=10] kFromNewTabPage,               // New tab page.
  [MinVersion=10] kFromIntentUrl,                // Intent Url.
  [MinVersion=10] kFromOsLogin,                  // Run on OS login.
  [MinVersion=10] kFromProtocolHandler,          // Protocol handler.
  [MinVersion=10] kFromUrlHandler,               // Url handler.
  [MinVersion=11] kFromSysTrayCalendar,          // System Tray Calendar.
  [MinVersion=12] kFromInstaller,                // Installation UI.
  [MinVersion=13] kFromFirstRun,                 // First Run.
  [MinVersion=14] kFromWelcomeTour,              // Welcome Tour.
  [MinVersion=15] kFromFocusMode,                // Focus Mode panel.
  [MinVersion=16] kFromSparky,                   // Sparky.
};

[Stable, Extensible]
// The container type to launch the application in.
enum LaunchContainer {
  [Default] kLaunchContainerNone, // No specified container
  kLaunchContainerWindow,         // Window container
  kLaunchContainerTab,            // Tab container
};

[Stable, Extensible]
// Controls how a tab is opened in a window.
enum WindowOpenDisposition {
  [Default] kUnknown,
  kCurrentTab,
  kNewForegroundTab,
  kNewBackgroundTab,
  kNewWindow,
  [MinVersion=1] kNewPopup,
};

[Stable]
// The parameters to launch an app.
struct LaunchParams {
  string app_id@0;               // The app id of the app.
  LaunchSource launch_source@1;  // The app launch source.
  Intent? intent@2;              // The intent the app will launch with.
  // The container the app will launch in.
  [MinVersion=14]LaunchContainer container@3;
  // How the tab opened in a window if app is opened in tab.
  [MinVersion=14]WindowOpenDisposition disposition@4;
  // An id that indicates which display the app should be launched in.
  [MinVersion=15]int64 display_id@5;
};

[Stable]
struct Permission {
  PermissionType permission_type@0;
  PermissionValue value@1;
  // If the permission is managed by an enterprise policy.
  bool is_managed@2;
};

// The types of permissions in App Service.
[Stable, Extensible]
enum PermissionType {
  [Default] kUnknown              = 0,
  kCamera                         = 1,
  kLocation                       = 2,
  kMicrophone                     = 3,
  kNotifications                  = 4,
  [MinVersion=9] kContacts        = 5,
  [MinVersion=9] kStorage         = 6,
  [MinVersion=10] kFileHandling   = 7,
};

[Stable]
enum TriState {
  kAllow,
  kBlock,
  kAsk,
};

[Stable]
union PermissionValue {
  bool bool_value;
  TriState tristate_value;
};

// Represents changes which have been made to the preferred apps list, both
// adding new filters and removing existing filters. The map is keyed by
// |app_id|, and the value is the list of the filters that is added/removed
// for that |app_id|.
[Stable]
struct PreferredAppChanges {
  map<string, array<IntentFilter>> added_filters;
  map<string, array<IntentFilter>> removed_filters;
};

// Represents the entry of the preferred apps list.
[Stable]
struct PreferredApp {
  IntentFilter intent_filter;
  string app_id;
};

[Stable, Extensible]
enum PackageIdType {
  [Default] kUnknown = 0,
  kWeb = 1,
  kArc = 2,
};

// A globally unique stable identifier for an installable app package.
[Stable]
struct PackageId {
  // The app type of the package.
  PackageIdType package_type;

  // A platform-specific unique ID for the package. For example, for
  // PackageIdType::kArc, the identifier will be the package name. Must be
  // non-empty.
  string identifier;
};

// Information about an app shortcut.

// This struct is used to transport App Shortcut data between lacros-chrome and
// ash-chrome. It is intended to be the minimal subset of apps::Shortcut
// required for this purpose.
//
// See components/services/app_service/public/cpp/shortcut/shortcut.h for
// details for the structs in this file.
[Stable]
struct AppShortcut {
  // 'host_app_id' and 'local_id' should not be changeable after creation.
  // The host app of the shortcut.
  string host_app_id@0;

  // The locally unique identifier for the shortcut within an app. This id would
  // be used to launch the shortcut or load shortcut icon from the app.
  string local_id@1;

  // Name of the shortcut.
  string? name@2;

  // Represents what icon should be loaded for this shortcut, icon key will
  // change if the icon has been updated from the publisher.
  IconKey? icon_key@3;

  // Whether the shortcut publisher allows the shortcut to be removed by user.
  [MinVersion=1] bool? allow_removal@4;
};

// DEPRECATED
[Stable, RenamedFrom="crosapi.mojom.Shortcut"]
struct REMOVED_01 {
  // DEPRECATED
  string shortcut_id@0;

  // DEPRECATED
  string name@1;

  // DEPRECATED
  uint8 position@2;
};

// Controller registration result in App Service.
[Stable, Extensible]
enum ControllerRegistrationResult {
  [Default] kSuccess              = 0,
  kFailed                         = 1,
};


// Represents parameters for installing an app.
// Next version: 2
[Stable]
struct InstallAppParams {
  // Represents the origin of the installation.
  // Next version: 3
  [Stable, Extensible]
  enum Surface {
    [Default] kUnknown = 0,
    kAppInstallUriUnknown = 1,
    [MinVersion=1] kAppInstallUriShowoff = 2,
    [MinVersion=1] kAppInstallUriMall = 3,
    [MinVersion=1] kAppInstallUriGetit = 4,
    [MinVersion=1] kAppInstallUriLauncher = 5,
    [MinVersion=2] kAppInstallUriPeripherals = 6,
  };
  Surface surface@0;

  // Represents which package_id to fetch from Almanac to be installed.
  string? serialized_package_id@1;

  // Instance ID of a parent window to anchor the app install dialog to. If not
  // provided or a corresponding window is not found, the app install dialog is
  // created without anchoring to a parent.
  [MinVersion=1] mojo_base.mojom.UnguessableToken? window_id@2;
};

// Represents the result of an InstallApp() request.
// Currently empty but will be extended with fields as needed.
[Stable]
struct AppInstallResult {
};