blob: 4d907a902904465cac4467ab5456f0f52fcc28c4 [file] [log] [blame]
// 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 "device/bluetooth/public/mojom/uuid.mojom";
// Bluetooth Terminology:
//
// https://en.wikipedia.org/wiki/Bluetooth_low_energy is a good resource
// describing the Bluetooth concepts used in this file:
// Generic Attribute Profile (GATT), device, services, characteristics,
// descriptors, and UUIDs.
// Instance ID Note:
//
// Structs and parameters use 'instance_id' string values as unique identifiers
// for Bluetooth GATT object instances. UUIDs are used to refer to e.g. a type
// of service (such as a battery service), while the instance ID refers to the
// unique instance of that service (there may be more than one).
//
// Subsequent calls from and to the client code use the ids to refer to
// previously disclosed objects.
//
// Device IDs are exposed to web content, valid to persist, and have a dedicated
// type, WebBluetoothDeviceId. See comments on that struct.
//
// Service, characteristic, and descriptor IDs are simply strings not exposed to
// web content and use platform specific values. They are only used for
// comparison and not intended to be parsed by code, serialized, or exposed to
// web content.
//
// For example:
// RemoteServerGetPrimaryServices() may return a struct of type
// WebBluetoothRemoteGATTService with an instance_id of "service1".
// To retrieve characteristics of that service use that id when calling
// RemoteServiceGetCharacteristics("service1", ...).
// Result codes that can occur during Web Bluetooth execution.
// Transformed to a DOMException in Source/modules/bluetooth/BluetoothError.cpp.
//
// These errors all produce constant message strings. If a particular message
// needs a dynamic component, we should add a separate enum so type-checking the
// IPC ensures the dynamic component is passed.
enum WebBluetoothResult {
SUCCESS,
// AbortError:
// InvalidModificationError:
GATT_INVALID_ATTRIBUTE_LENGTH,
// InvalidStateError:
SERVICE_NO_LONGER_EXISTS,
CHARACTERISTIC_NO_LONGER_EXISTS,
// NetworkError:
CONNECT_ALREADY_IN_PROGRESS,
CONNECT_AUTH_CANCELED,
CONNECT_AUTH_FAILED,
CONNECT_AUTH_REJECTED,
CONNECT_AUTH_TIMEOUT,
CONNECT_UNKNOWN_ERROR,
CONNECT_UNKNOWN_FAILURE,
CONNECT_UNSUPPORTED_DEVICE,
DEVICE_NO_LONGER_IN_RANGE,
GATT_NOT_PAIRED,
GATT_OPERATION_IN_PROGRESS,
// NotFoundError:
NO_BLUETOOTH_ADAPTER,
CHOSEN_DEVICE_VANISHED,
CHOOSER_CANCELLED,
CHOOSER_NOT_SHOWN_API_GLOBALLY_DISABLED,
CHOOSER_NOT_SHOWN_API_LOCALLY_DISABLED,
CHOOSER_NOT_SHOWN_USER_DENIED_PERMISSION_TO_SCAN,
SERVICE_NOT_FOUND,
NO_SERVICES_FOUND,
CHARACTERISTIC_NOT_FOUND,
NO_CHARACTERISTICS_FOUND,
DESCRIPTOR_NOT_FOUND,
NO_DESCRIPTORS_FOUND,
WEB_BLUETOOTH_NOT_SUPPORTED,
BLUETOOTH_LOW_ENERGY_NOT_AVAILABLE,
// NotSupportedError:
GATT_UNKNOWN_ERROR,
GATT_UNKNOWN_FAILURE,
GATT_NOT_PERMITTED,
GATT_NOT_SUPPORTED,
GATT_UNTRANSLATED_ERROR_CODE,
// SecurityError:
GATT_NOT_AUTHORIZED,
BLOCKLISTED_DESCRIPTOR_UUID,
BLOCKLISTED_CHARACTERISTIC_UUID,
BLOCKLISTED_READ,
BLOCKLISTED_WRITE,
NOT_ALLOWED_TO_ACCESS_ANY_SERVICE,
NOT_ALLOWED_TO_ACCESS_SERVICE,
REQUEST_DEVICE_WITH_BLOCKLISTED_UUID,
REQUEST_DEVICE_FROM_CROSS_ORIGIN_IFRAME,
DESCRIPTOR_NO_LONGER_EXISTS,
};
struct WebBluetoothLeScanFilter {
array<bluetooth.mojom.UUID>? services;
string? name;
string? name_prefix;
};
struct WebBluetoothRequestDeviceOptions {
array<WebBluetoothLeScanFilter>? filters;
array<bluetooth.mojom.UUID> optional_services;
bool accept_all_devices;
};
struct WebBluetoothRequestLEScanOptions {
array<WebBluetoothLeScanFilter>? filters;
bool keep_repeated_devices;
bool accept_all_advertisements;
};
// Indicates if the function will return a single or multiple
// GATT objects.
enum WebBluetoothGATTQueryQuantity {
SINGLE,
MULTIPLE
};
// An identifier uniquely identifying a Bluetooth device. This identifier is
// safe to provide to web content and is unique per origin, even if referring
// to a common device. Web content may persist this identifier for future
// sessions to identify the same device.
struct WebBluetoothDeviceId {
string device_id;
};
struct WebBluetoothDevice {
WebBluetoothDeviceId id;
string? name;
};
struct WebBluetoothRemoteGATTService {
string instance_id; // See Instance ID Note above.
bluetooth.mojom.UUID uuid;
};
struct WebBluetoothRemoteGATTCharacteristic {
string instance_id; // See Instance ID Note above.
bluetooth.mojom.UUID uuid;
uint32 properties;
};
// On success, |options| contains the values used for the scan request. On
// error, |result| will indicate the failure type.
union RequestScanningStartResult {
WebBluetoothResult error_result;
WebBluetoothRequestLEScanOptions options;
};
struct WebBluetoothScanResult {
WebBluetoothDevice device;
string? name;
array<bluetooth.mojom.UUID> uuids;
bool appearance_is_set;
uint16 appearance;
bool tx_power_is_set;
uint8 tx_power;
bool rssi_is_set;
uint8 rssi;
map<uint16, array<uint8>> manufacturer_data;
map<string, array<uint8>> service_data;
};
struct WebBluetoothRemoteGATTDescriptor {
string instance_id; // See Instance ID Note above.
bluetooth.mojom.UUID uuid;
};
// Web Bluetooth Interface that Blink can use to perform
// Bluetooth GATT Operations on Bluetooth Devices.
interface WebBluetoothService {
RequestDevice(WebBluetoothRequestDeviceOptions options)
=> (WebBluetoothResult result, WebBluetoothDevice? device);
// Creates a GATT Connection to a Bluetooth Device identified by |device_id|
// if a connection to the device didn't exist already. If a GATT connection
// existed already then this function increases the ref count to keep that
// connection alive.
// Returns the result of the connection request.
RemoteServerConnect(
WebBluetoothDeviceId device_id,
associated WebBluetoothServerClient client) => (WebBluetoothResult result);
// If a GATT connection exists for Device identified by |device_id| then
// decreases the ref count for that connection.
RemoteServerDisconnect(WebBluetoothDeviceId device_id);
// Returns the Services of a GATT Device identified by |device_id|.
// If |services_uuid| is present, filters services by |services_uuid|.
// Otherwise returns all non-blocklisted services.
// If |quantity| == WebBluetoothGATTQueryQuantity::SINGLE, at most one
// service will be returned.
RemoteServerGetPrimaryServices(
WebBluetoothDeviceId device_id,
WebBluetoothGATTQueryQuantity quantity,
bluetooth.mojom.UUID? services_uuid) => (
WebBluetoothResult result,
array<WebBluetoothRemoteGATTService>? services);
// Returns the Characteristics of a GATT Service identified by
// |service_instance_id|.
// If |characteristics_uuid| is present, filters characteristics by
// |characteristics_uuid|. Otherwise returns all non-blocklisted services.
// If |quantity| == WebBluetoothGATTQueryQuantity::SINGLE, at most one
// characteristic will be returned.
RemoteServiceGetCharacteristics(
string service_instance_id,
WebBluetoothGATTQueryQuantity quantity,
bluetooth.mojom.UUID? characteristics_uuid) => (
WebBluetoothResult result,
array<WebBluetoothRemoteGATTCharacteristic>? characteristics);
// Reads the value for the characteristic identified by
// |characteristic_instance_id|. If the value is successfully read the
// callback will be run with WebBluetoothResult::SUCCESS and the
// characteristic's value. If the value is not successfully read the
// callback with be run with the corresponding error and nullptr for value.
RemoteCharacteristicReadValue(
string characteristic_instance_id) => (
WebBluetoothResult result,
array<uint8>? value);
// Writes a value to the characteristic identified by
// |characteristic_instance_id|. The callback is run with
// WebBluetoothResult::SUCCESS if the value was successfully
// written.
RemoteCharacteristicWriteValue(
string characteristic_instance_id,
array<uint8> value) => (WebBluetoothResult result);
// Starts notifications for the characteristic identified by
// |characteristic_instance_id|.
// Returns the result of the connection request.
RemoteCharacteristicStartNotifications(
string characteristic_instance_id,
associated WebBluetoothCharacteristicClient client) => (
WebBluetoothResult result);
// Stops notifications for the characteristic identified by
// |characteristic_instance_id|.
RemoteCharacteristicStopNotifications(
string characteristic_instance_id) => ();
// Returns the Descriptors of a GATT Characteristic identified by
// |characteristics_instance_id|.
// If |descriptor_uuid| is present, filters descriptors by
// |descriptor_uuid|. Otherwise returns all non-blocklisted descriptors.
// If |quantity| == WebBluetoothGATTQueryQuantity::SINGLE, at most one
// characteristic will be returned.
RemoteCharacteristicGetDescriptors(
string characteristics_instance_id,
WebBluetoothGATTQueryQuantity quantity,
bluetooth.mojom.UUID? descriptor_uuid) => (
WebBluetoothResult result,
array<WebBluetoothRemoteGATTDescriptor>? descriptors);
// Reads the value for the descriptor identified by
// |descriptor_instance_id|. If the value is successfully read the callback
// will be run with WebBluetoothResult::SUCCESS and the descriptor's value. If
// the value is not successfully read the callback with be run with the
// corresponding error and nullptr for value
RemoteDescriptorReadValue(
string descriptor_instance_id) => (
WebBluetoothResult result,
array<uint8>? value);
// Writes a value to the descriptor identified by
// |descriptor_instance_id|. The callback is run with
// WebBluetoothResult::SUCCESS if the value was successfully
// written.
RemoteDescriptorWriteValue(
string descriptor_instance_id,
array<uint8> value) => (WebBluetoothResult result);
// Starts scanning for low energy devices.
RequestScanningStart(associated WebBluetoothScanClient client,
WebBluetoothRequestLEScanOptions options) => (
RequestScanningStartResult result);
};
// Classes that implement this interface will be notified of device events.
interface WebBluetoothServerClient {
// Called when a device disconnects.
GATTServerDisconnected();
};
// Classes that implement this interface will be notified of characteristic
// events.
interface WebBluetoothCharacteristicClient {
// Called when we receive a notification for the characteristic.
RemoteCharacteristicValueChanged(array<uint8> value);
};
// Classes that implement this interface will be notified of scan
// events.
interface WebBluetoothScanClient {
// Called when we receive a notification for the characteristic.
ScanEvent(WebBluetoothScanResult result);
};