// 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.
module crosapi.mojom;
import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "url/mojom/url.mojom";
// The type of dialog to open. The integer values intentionally do not match
// ui::SelectFileDialog::Type because there is no "none" value and kOpenFile
// is the common case.
[Stable, Extensible]
enum SelectFileDialogType {
// For opening a file.
kOpenFile = 0,
// Like kOpenFile, but allowing multiple files to open.
kOpenMultiFile = 1,
// For opening a folder.
kFolder = 2,
// Like kFolder, but the dialog UI shows it's specifically for "upload".
kUploadFolder = 3,
// Like kFolder, but folder creation is disabled.
kExistingFolder = 4,
// For saving into a file, allowing a nonexistent file to be selected.
kSaveAsFile = 5,
};
// Specifies which type of paths the caller can handle.
[Stable, Extensible]
enum AllowedPaths {
// Any type of path, whether local/native or remote/virtual.
kAnyPath,
// Set when the caller cannot handle virtual volumes (e.g. File System
// Provider [FSP] volumes like "File System for Dropbox"). When opening files,
// the dialog will create a native replica of the file and return its path.
// When saving files, the dialog will hide virtual volumes.
kNativePath,
// Set when the caller can open files via URL. For example, when opening a
// .gdoc file from Google Drive the file is "opened" by navigating to
// docs.google.com.
kAnyPathOrUrl,
};
// Information about the types of files used by the dialog.
[Stable]
struct SelectFileTypeInfo {
// The list of allowed file extensions. For example:
// { { "htm", "html" }, { "txt" } }
// Only pass more than one extension in the inner vector if the extensions
// are equivalent.
array<array<string>> extensions@0;
// Overrides the system descriptions of specified extensions. For example,
// when saving a web page, "Webpage, HTML only" is used for {"htm", "html"}
// and "Webpage, Single File" is used for {"mhtml"}. Length must match the
// length of |extensions|. If empty or if the length doesn't match then
// the system descriptions will be used.
array<mojo_base.mojom.String16> extension_description_overrides@1;
// One-based index of the file type (in the extensions list) to select by
// default. Zero means no selection. (The index is one-based for consistency
// with the C++ code and because mojo doesn't allow nullable primitive types.)
// For example, when saving a web page, we use the index of {"mhtml"} so the
// user sees "Webpage, Single File" as the default choice.
int32 default_file_type_index@2;
// Whether or not there will be a filter added for all files (*.*).
bool include_all_files@3;
// Types of paths/volumes allowed. Unrelated to file extensions.
AllowedPaths allowed_paths@4;
};
// Options for the select file dialog.
[Stable]
struct SelectFileOptions {
// Dialog type.
SelectFileDialogType type@0;
// Window title.
mojo_base.mojom.String16 title@1;
// Default path to open.
mojo_base.mojom.FilePath default_path@2;
// Optional file type configuration. In the common case for file open (Ctrl-O)
// this is null.
SelectFileTypeInfo? file_types@3;
// Internal window ID for the top-level shell window that owns the dialog.
// If provided, the dialog will be window-modal to that shell window.
// If empty, a modeless dialog will be opened on the default display.
string owning_shell_window_id@4;
// Optional URL of the caller that created the dialog.
[MinVersion=1]url.mojom.Url? caller@5;
};
// Result of the select file dialog.
[Stable, Extensible]
enum SelectFileResult {
// Everything worked.
kSuccess = 0,
// Failed because the dialog couldn't find the owning top-level window.
kInvalidShellWindow = 1,
};
// Information about the selected file or files.
[Stable]
struct SelectedFileInfo {
// Path to the file, as seen in the UI.
mojo_base.mojom.FilePath file_path@0;
// The actual local path to the selected file. This can be a snapshot file
// with a human unreadable name like /blah/.d41d8cd98f00b204e9800998ecf8427e.
// |local_path| can differ from |file_path| for drive files (e.g.
// /drive_cache/temporary/d41d8cd98f00b204e9800998ecf8427e vs.
// /special/drive/foo.txt).
mojo_base.mojom.FilePath local_path@1;
// Optional display name of the file. UTF-8 encoded. If empty, the UI should
// display the base name portion of |file_path|.
string display_name@2;
// Optional URL to access the file. If the caller can use a URL to access a
// file, |url| should be used instead of |local_path|. For example, when
// opening a .gdoc file from Google Drive the |local_path| is a placeholder
// file that should be "opened" by navigating to docs.google.com.
url.mojom.Url? url@3;
};
// Select file dialog interface. Wrapper around the C++ SelectFileDialog
// class. Called from lacros-chrome. Implemented in ash-chrome using the
// file manager dialog.
[Stable, Uuid="8c0eb5f3-4c90-4bfd-8a0f-377c99f09125"]
interface SelectFile {
// Selects one or more files. If the dialog is closed or canceled without
// selecting a file, or if there is an error, |files| will be empty.
// When saving a file or opening a single file, |file_type_index| is the
// one-based index of the selected file type from the SelectFileTypeInfo
// extension list, otherwise it is zero.
Select@0(SelectFileOptions options) =>
(SelectFileResult result,
array<SelectedFileInfo> files,
int32 file_type_index);
};