// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. module blink.mojom; import "mojo/public/mojom/base/file_path.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "mojo/public/mojom/base/string16.mojom"; import "mojo/public/mojom/base/time.mojom"; import "third_party/blink/public/mojom/blob/blob.mojom"; import "url/mojom/origin.mojom"; // kIDBMaxMessageSize is 128MB, originally based on // IPC::Channel::kMaximumMessageSize. The "usable" size is this value less // the overhead size. const int32 kIDBMaxMessageSize = 134217728; // kIDBMaxMessageOverhead is the size we expect to be used for the rest of // the message we will send. The "usable" size is the max size less this value. const int32 kIDBMaxMessageOverhead = 1048576; // 1MB; arbitrarily chosen. enum IDBCursorDirection { Next, NextNoDuplicate, Prev, PrevNoDuplicate, }; enum IDBDataLoss { None, Total, }; // Represents key types that hold no data and so cannot be options in the // IDBKeyData union. // TODO(jsbell): These types should be cleaned up end-to-end, leaving only the // dataful options. enum IDBDatalessKeyType { Invalid, Null, }; union IDBKeyData { array key_array; array binary; mojo_base.mojom.String16 string; double date; double number; IDBDatalessKeyType other; }; // Defined as a structure so that it can by typemapped with StructTraits. struct IDBKey { IDBKeyData data; }; // Represents WebIDBKeyPathTypeString and WebIDBKeyPathTypeArray in a key path. union IDBKeyPathData { mojo_base.mojom.String16 string; array string_array; }; struct IDBKeyPath { // A null value here corresponds to WebIDBKeyPathTypeNull. IDBKeyPathData? data; }; struct IDBKeyRange { IDBKey lower; IDBKey upper; bool lower_open; bool upper_open; }; enum IDBOperationType { Add, Put, Delete, Clear, }; enum IDBPutMode { AddOrUpdate, AddOnly, CursorUpdate, }; enum IDBTaskType { Normal, Preemptive, }; enum IDBTransactionMode { ReadOnly, ReadWrite, VersionChange, }; enum IDBStatus { OK, NotFound, Corruption, NotSupported, InvalidArgument, IOError, }; struct IDBIndexMetadata { int64 id; mojo_base.mojom.String16 name; IDBKeyPath key_path; bool unique; bool multi_entry; }; struct IDBObjectStoreMetadata { int64 id; mojo_base.mojom.String16 name; IDBKeyPath key_path; bool auto_increment; int64 max_index_id; array indexes; }; struct IDBDatabaseMetadata { int64 id; mojo_base.mojom.String16 name; int64 version; int64 max_object_store_id; array object_stores; }; struct IDBIndexKeys { int64 index_id; array index_keys; }; struct IDBFileInfo { mojo_base.mojom.FilePath path; mojo_base.mojom.String16 name; mojo_base.mojom.Time last_modified; }; struct IDBBlobInfo { blink.mojom.Blob blob; string uuid; mojo_base.mojom.String16 mime_type; int64 size; IDBFileInfo? file; }; struct IDBValue { string bits; array blob_or_file_info; }; struct IDBReturnValue { IDBValue value; IDBKey primary_key; IDBKeyPath key_path; }; struct IDBObservation { int64 object_store_id; IDBOperationType type; IDBKeyRange key_range; IDBValue? value; }; struct IDBObserverTransaction { int64 id; array scope; }; struct IDBObserverChanges { map> observation_index_map; map transaction_map; array observations; }; // The IDBCallbacks interface is used to return results for individual requests. // Some requests may return multiple results before completion, such as // UpgradeNeeded before SuccessDatabase. // // TODO(https://crbug.com/627484): Many of these could be replaced with // replies associated with particular messages. interface IDBCallbacks { Error(int32 code, mojo_base.mojom.String16 message); // Factory::GetDatabaseNames SuccessStringList(array value); // Factory::Open / DeleteDatabase Blocked(int64 existing_version); // Factory::Open UpgradeNeeded(associated IDBDatabase database, int64 old_version, IDBDataLoss data_loss, string data_loss_message, IDBDatabaseMetadata db_metadata); SuccessDatabase(associated IDBDatabase? database, IDBDatabaseMetadata metadata); // Database::OpenCursor SuccessCursor(associated IDBCursor cursor, IDBKey key, IDBKey primary_key, IDBValue? value); // Database::Get / Cursor::Advance SuccessValue(IDBReturnValue? value); // Cursor::Continue / Advance SuccessCursorContinue(IDBKey key, IDBKey primary_key, IDBValue? value); // Cursor::Prefetch SuccessCursorPrefetch(array keys, array primary_keys, array values); // Database::GetAll SuccessArray(array values); // Database::Put / Cursor::Update SuccessKey(IDBKey key); // Database::Count / DeleteRange // Factory::DeleteDatabase SuccessInteger(int64 value); // Cursor::Continue / Advance Success(); }; // The IDBDatabaseCallbacks interface is used to notification of events out of // band to individual requests. A single instance is used for the lifetime of // a database connection. interface IDBDatabaseCallbacks { ForcedClose(); VersionChange(int64 old_version, int64 new_version); Abort(int64 transaction_id, int32 code, mojo_base.mojom.String16 message); Complete(int64 transaction_id); Changes(IDBObserverChanges changes); }; interface IDBCursor { Advance(uint32 count, associated IDBCallbacks callbacks); // Avoid calling the following function "Continue" since the Mojo // Java bindings generate incorrect Java as a result. We've named // the following funciton "CursorContinue" as a workaround. CursorContinue(IDBKey key, IDBKey primary_key, associated IDBCallbacks callbacks); Prefetch(int32 count, associated IDBCallbacks callbacks); PrefetchReset(int32 used_prefetches, int32 unused_prefetches); }; interface IDBDatabase { CreateObjectStore(int64 transaction_id, int64 object_store_id, mojo_base.mojom.String16 name, IDBKeyPath key_path, bool auto_increment); DeleteObjectStore(int64 transaction_id, int64 object_store_id); RenameObjectStore(int64 transaction_id, int64 object_store_id, mojo_base.mojom.String16 new_name); CreateTransaction(int64 transaction_id, array object_store_ids, IDBTransactionMode mode); Close(); VersionChangeIgnored(); AddObserver(int64 transaction_id, int32 observer_id, bool include_transaction, bool no_records, bool values, uint16 operation_types); RemoveObservers(array observers); Get(int64 transaction_id, int64 object_store_id, int64 index_id, IDBKeyRange key_range, bool key_only, associated IDBCallbacks callbacks); GetAll(int64 transaction_id, int64 object_store_id, int64 index_id, IDBKeyRange key_range, bool key_only, int64 max_count, associated IDBCallbacks callbacks); Put(int64 transaction_id, int64 object_store_id, IDBValue value, IDBKey key, IDBPutMode mode, array index_keys, associated IDBCallbacks callbacks); SetIndexKeys(int64 transaction_id, int64 object_store_id, IDBKey primary_key, array index_keys); SetIndexesReady(int64 transaction_id, int64 object_store_id, array index_ids); OpenCursor(int64 transaction_id, int64 object_store_id, int64 index_id, IDBKeyRange key_range, IDBCursorDirection direction, bool key_only, IDBTaskType task_type, associated IDBCallbacks callbacks); Count(int64 transaction_id, int64 object_store_id, int64 index_id, IDBKeyRange key_range, associated IDBCallbacks callbacks); DeleteRange(int64 transaction_id, int64 object_store_id, IDBKeyRange key_range, associated IDBCallbacks callbacks); Clear(int64 transaction_id, int64 object_store_id, associated IDBCallbacks callbacks); CreateIndex(int64 transaction_id, int64 object_store_id, int64 index_id, mojo_base.mojom.String16 name, IDBKeyPath key_path, bool unique, bool multi_entry); DeleteIndex(int64 transaction_id, int64 object_store_id, int64 index_id); RenameIndex(int64 transaction_id, int64 object_store_id, int64 index_id, mojo_base.mojom.String16 new_name); Abort(int64 transaction_id); Commit(int64 transaction_id); }; interface IDBFactory { GetDatabaseNames(associated IDBCallbacks callbacks, url.mojom.Origin origin); Open(associated IDBCallbacks callbacks, associated IDBDatabaseCallbacks database_callbacks, url.mojom.Origin origin, mojo_base.mojom.String16 name, int64 version, int64 transaction_id); DeleteDatabase(associated IDBCallbacks callbacks, url.mojom.Origin origin, mojo_base.mojom.String16 name, bool force_close); AbortTransactionsAndCompactDatabase(url.mojom.Origin origin) => (IDBStatus status); AbortTransactionsForDatabase(url.mojom.Origin origin) => (IDBStatus status); };