зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1690075 [wpt PR 27429] - Migrate remaining WPT to Mojo JS modules, a=testonly
Automatic update from web-platform-tests Migrate remaining WPT to Mojo JS modules All remaining WPT using Mojo bindings are migrated to newer module-based bindings here. Support for loading older bindings variants in WPT is removed. Bug: 1004256 Change-Id: I630a6ddb0e5b89f5b7e6c538a273c3725a485aae Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2664907 Commit-Queue: Ken Rockot <rockot@google.com> Reviewed-by: Stephen McGruer <smcgruer@chromium.org> Reviewed-by: Michael Moss <mmoss@chromium.org> Reviewed-by: Alexander Cooper <alcooper@chromium.org> Cr-Commit-Position: refs/heads/master@{#849713} -- wpt-commits: e3b2fa58ec722818ab212125275f89f3c8f40d32 wpt-pr: 27429
This commit is contained in:
Родитель
b41e3b07ef
Коммит
0f36a44330
|
@ -9,14 +9,7 @@
|
|||
//
|
||||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
async function loadChromiumResources() {
|
||||
|
||||
const chromiumResources = [
|
||||
'/gen/third_party/blink/public/mojom/contacts/contacts_manager.mojom.js',
|
||||
'/gen/components/payments/mojom/payment_request_data.mojom.js',
|
||||
];
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/chromium/contacts_manager_mock.js');
|
||||
await import('/resources/chromium/contacts_manager_mock.js');
|
||||
}
|
||||
|
||||
// User Agents must provide their own implementation of `WebContacts`,
|
||||
|
|
|
@ -9,15 +9,9 @@
|
|||
//
|
||||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/string16.mojom.js',
|
||||
'/gen/services/device/public/mojom/sensor.mojom.js',
|
||||
'/gen/services/device/public/mojom/sensor_provider.mojom.js',
|
||||
];
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/testdriver.js');
|
||||
await loadScript('/resources/testdriver-vendor.js');
|
||||
await loadScript('/resources/chromium/generic_sensor_mocks.js');
|
||||
await import('/resources/chromium/generic_sensor_mocks.js');
|
||||
}
|
||||
|
||||
async function initialize_generic_sensor_tests() {
|
||||
|
|
|
@ -10,12 +10,5 @@
|
|||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/string16.mojom.js',
|
||||
'/gen/mojo/public/mojom/base/time.mojom.js',
|
||||
'/gen/third_party/blink/public/mojom/idle/idle_manager.mojom.js'
|
||||
];
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/chromium/mock-idle-detection.js');
|
||||
await import('/resources/chromium/mock-idle-detection.js');
|
||||
}
|
||||
|
|
|
@ -727,20 +727,20 @@ WEB-PLATFORM.TEST:web-bundle/subresource-loading/*.html
|
|||
# Tests that depend on resources in /gen/ in Chromium:
|
||||
# https://github.com/web-platform-tests/wpt/issues/16455
|
||||
# Please consult with ecosystem-infra@chromium.org before adding more.
|
||||
MISSING DEPENDENCY: contacts/resources/helpers.js
|
||||
MISSING DEPENDENCY: credential-management/support/otpcredential-helper.js
|
||||
MISSING DEPENDENCY: generic-sensor/resources/generic-sensor-helpers.js
|
||||
MISSING DEPENDENCY: idle-detection/resources/idle-detection-helper.js
|
||||
MISSING DEPENDENCY: mediacapture-image/resources/imagecapture-helpers.js
|
||||
MISSING DEPENDENCY: orientation-event/resources/orientation-event-helpers.js
|
||||
MISSING DEPENDENCY: resources/chromium/contacts_manager_mock.js
|
||||
MISSING DEPENDENCY: resources/chromium/web-bluetooth-test.js
|
||||
MISSING DEPENDENCY: resources/chromium/webusb-test.js
|
||||
MISSING DEPENDENCY: resources/test-only-api.js
|
||||
MISSING DEPENDENCY: screen_enumeration/resources/screenenumeration-helpers.js
|
||||
MISSING DEPENDENCY: serial/resources/automation.js
|
||||
MISSING DEPENDENCY: shape-detection/resources/shapedetection-helpers.js
|
||||
MISSING DEPENDENCY: web-nfc/resources/nfc-helpers.js
|
||||
MISSING DEPENDENCY: webxr/resources/webxr_util.js
|
||||
MISSING DEPENDENCY: resources/chromium/fake-serial.js
|
||||
MISSING DEPENDENCY: resources/chromium/generic_sensor_mocks.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-barcodedetection.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-facedetection.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-idle-detection.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-imagecapture.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-screenenumeration.js
|
||||
MISSING DEPENDENCY: resources/chromium/mock-textdetection.js
|
||||
MISSING DEPENDENCY: resources/chromium/nfc-mock.js
|
||||
MISSING DEPENDENCY: resources/chromium/webxr-test.js
|
||||
|
||||
# Tests that are false positives for using Ahem as a system font
|
||||
AHEM SYSTEM FONT: acid/acid3/test.html
|
||||
|
|
|
@ -10,11 +10,7 @@
|
|||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/media/capture/mojom/image_capture.mojom.js'
|
||||
];
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/chromium/mock-imagecapture.js');
|
||||
await import('/resources/chromium/mock-imagecapture.js');
|
||||
}
|
||||
|
||||
async function initialize_image_capture_tests() {
|
||||
|
|
|
@ -9,13 +9,7 @@
|
|||
//
|
||||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/string16.mojom.js',
|
||||
'/gen/services/device/public/mojom/sensor.mojom.js',
|
||||
'/gen/services/device/public/mojom/sensor_provider.mojom.js',
|
||||
];
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/chromium/generic_sensor_mocks.js');
|
||||
await import('/resources/chromium/generic_sensor_mocks.js');
|
||||
}
|
||||
|
||||
async function initialize_generic_sensor_tests() {
|
||||
|
|
|
@ -2,6 +2,6 @@ This directory contains Chromium-specific test resources, including mocks for
|
|||
test-only APIs implemented with
|
||||
[MojoJS](https://chromium.googlesource.com/chromium/src/+/master/mojo/public/js/README.md).
|
||||
|
||||
Please do **not** copy `*.mojom.js` into this directory. Follow this doc if you
|
||||
Please do **not** copy `*.mojom.m.js` into this directory. Follow this doc if you
|
||||
want to add new MojoJS-backed mocks:
|
||||
https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_platform_tests.md#mojojs
|
||||
|
|
|
@ -2,17 +2,17 @@
|
|||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
'use strict';
|
||||
import {ContactsManager, ContactsManagerReceiver} from '/gen/third_party/blink/public/mojom/contacts/contacts_manager.mojom.m.js';
|
||||
|
||||
const WebContactsTest = (() => {
|
||||
self.WebContactsTest = (() => {
|
||||
class MockContacts {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(blink.mojom.ContactsManager);
|
||||
this.receiver_ = new ContactsManagerReceiver(this);
|
||||
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(blink.mojom.ContactsManager.name);
|
||||
new MojoInterfaceInterceptor(ContactsManager.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.bindingSet_.addBinding(this, e.handle);
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.interceptor_.start();
|
||||
|
||||
this.selectedContacts_ = [];
|
||||
|
@ -39,7 +39,7 @@ const WebContactsTest = (() => {
|
|||
return {contacts: null};
|
||||
|
||||
const contactInfos = await Promise.all(this.selectedContacts_.map(async contact => {
|
||||
const contactInfo = new blink.mojom.ContactInfo();
|
||||
const contactInfo = {};
|
||||
if (includeNames)
|
||||
contactInfo.name = contact.name || [];
|
||||
if (includeEmails)
|
||||
|
@ -69,7 +69,7 @@ const WebContactsTest = (() => {
|
|||
}
|
||||
|
||||
reset() {
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
import {SerialPortFlushMode, SerialPortRemote, SerialReceiveError, SerialPortReceiver, SerialSendError} from '/gen/services/device/public/mojom/serial.mojom.m.js';
|
||||
import {SerialService, SerialServiceReceiver} from '/gen/third_party/blink/public/mojom/serial/serial.mojom.m.js';
|
||||
|
||||
// Implementation of an UnderlyingSource to create a ReadableStream from a Mojo
|
||||
// data pipe consumer handle.
|
||||
class DataPipeSource {
|
||||
|
@ -84,7 +87,7 @@ class DataPipeSink {
|
|||
}
|
||||
}
|
||||
|
||||
// Implementation of blink.mojom.SerialPort.
|
||||
// Implementation of device.mojom.SerialPort.
|
||||
class FakeSerialPort {
|
||||
constructor() {
|
||||
this.inputSignals_ = {
|
||||
|
@ -103,24 +106,21 @@ class FakeSerialPort {
|
|||
}
|
||||
|
||||
open(options, client) {
|
||||
if (this.binding_ !== undefined) {
|
||||
if (this.receiver_ !== undefined) {
|
||||
// Port already open.
|
||||
return null;
|
||||
}
|
||||
|
||||
let portPtr = new device.mojom.SerialPortPtr();
|
||||
this.binding_ = new mojo.Binding(
|
||||
device.mojom.SerialPort, this, mojo.makeRequest(portPtr));
|
||||
this.binding_.setConnectionErrorHandler(() => {
|
||||
this.close();
|
||||
});
|
||||
let port = new SerialPortRemote();
|
||||
this.receiver_ = new SerialPortReceiver(this);
|
||||
this.receiver_.$.bindHandle(port.$.bindNewPipeAndPassReceiver().handle);
|
||||
|
||||
this.options_ = options;
|
||||
this.client_ = client;
|
||||
// OS typically sets DTR on open.
|
||||
this.outputSignals_.dataTerminalReady = true;
|
||||
|
||||
return portPtr;
|
||||
return port;
|
||||
}
|
||||
|
||||
write(data) {
|
||||
|
@ -146,11 +146,11 @@ class FakeSerialPort {
|
|||
}
|
||||
|
||||
simulateParityError() {
|
||||
this.simulateReadError(device.mojom.SerialReceiveError.PARITY_ERROR);
|
||||
this.simulateReadError(SerialReceiveError.PARITY_ERROR);
|
||||
}
|
||||
|
||||
simulateDisconnectOnRead() {
|
||||
this.simulateReadError(device.mojom.SerialReceiveError.DISCONNECTED);
|
||||
this.simulateReadError(SerialReceiveError.DISCONNECTED);
|
||||
}
|
||||
|
||||
simulateWriteError(error) {
|
||||
|
@ -161,11 +161,11 @@ class FakeSerialPort {
|
|||
}
|
||||
|
||||
simulateSystemErrorOnWrite() {
|
||||
this.simulateWriteError(device.mojom.SerialSendError.SYSTEM_ERROR);
|
||||
this.simulateWriteError(SerialSendError.SYSTEM_ERROR);
|
||||
}
|
||||
|
||||
simulateDisconnectOnWrite() {
|
||||
this.simulateWriteError(device.mojom.SerialSendError.DISCONNECTED);
|
||||
this.simulateWriteError(SerialSendError.DISCONNECTED);
|
||||
}
|
||||
|
||||
simulateInputSignals(signals) {
|
||||
|
@ -232,13 +232,13 @@ class FakeSerialPort {
|
|||
|
||||
async flush(mode) {
|
||||
switch (mode) {
|
||||
case device.mojom.SerialPortFlushMode.kReceive:
|
||||
case SerialPortFlushMode.kReceive:
|
||||
this.writer_.abort();
|
||||
this.writer_.releaseLock();
|
||||
this.writer_ = undefined;
|
||||
this.writable_ = undefined;
|
||||
break;
|
||||
case device.mojom.SerialPortFlushMode.kTransmit:
|
||||
case SerialPortFlushMode.kTransmit:
|
||||
this.reader_.cancel();
|
||||
this.reader_ = undefined;
|
||||
this.readable_ = undefined;
|
||||
|
@ -289,11 +289,11 @@ class FakeSerialPort {
|
|||
async getPortInfo() {
|
||||
return {
|
||||
bitrate: this.options_.bitrate,
|
||||
data_bits: this.options_.data_bits,
|
||||
parity_bit: this.options_.parity_bit,
|
||||
stop_bits: this.options_.stop_bits,
|
||||
cts_flow_control: this.options_.has_cts_flow_control ?
|
||||
this.options_.cts_flow_control : false
|
||||
dataBits: this.options_.datBits,
|
||||
parityBit: this.options_.parityBit,
|
||||
stopBits: this.options_.stopBits,
|
||||
ctsFlowControl:
|
||||
this.options_.hasCtsFlowControl && this.options_.ctsFlowControl,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -307,9 +307,9 @@ class FakeSerialPort {
|
|||
}
|
||||
this.writable_ = undefined;
|
||||
|
||||
if (this.binding_) {
|
||||
this.binding_.close();
|
||||
this.binding_ = undefined;
|
||||
if (this.receiver_) {
|
||||
this.receiver_.$.close();
|
||||
this.receiver_ = undefined;
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
@ -319,9 +319,9 @@ class FakeSerialPort {
|
|||
class FakeSerialService {
|
||||
constructor() {
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(blink.mojom.SerialService.name);
|
||||
new MojoInterfaceInterceptor(SerialService.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest = e => this.bind(e.handle);
|
||||
this.bindingSet_ = new mojo.BindingSet(blink.mojom.SerialService);
|
||||
this.receiver_ = new SerialServiceReceiver(this);
|
||||
this.clients_ = [];
|
||||
this.nextToken_ = 0;
|
||||
this.reset();
|
||||
|
@ -341,7 +341,7 @@ class FakeSerialService {
|
|||
}
|
||||
|
||||
addPort(info) {
|
||||
let portInfo = new blink.mojom.SerialPortInfo();
|
||||
let portInfo = {};
|
||||
if (info?.usbVendorId !== undefined) {
|
||||
portInfo.hasUsbVendorId = true;
|
||||
portInfo.usbVendorId = info.usbVendorId;
|
||||
|
@ -352,9 +352,7 @@ class FakeSerialService {
|
|||
}
|
||||
|
||||
let token = ++this.nextToken_;
|
||||
portInfo.token = new mojoBase.mojom.UnguessableToken();
|
||||
portInfo.token.high = 0;
|
||||
portInfo.token.low = token;
|
||||
portInfo.token = {high: 0n, low: BigInt(token)};
|
||||
|
||||
let record = {
|
||||
portInfo: portInfo,
|
||||
|
@ -394,7 +392,7 @@ class FakeSerialService {
|
|||
}
|
||||
|
||||
bind(handle) {
|
||||
this.bindingSet_.addBinding(this, handle);
|
||||
this.receiver_.$.bindHandle(handle);
|
||||
}
|
||||
|
||||
async setClient(client_remote) {
|
||||
|
@ -415,7 +413,7 @@ class FakeSerialService {
|
|||
}
|
||||
|
||||
async openPort(token, options, client) {
|
||||
let record = this.ports_.get(token.low);
|
||||
let record = this.ports_.get(Number(token.low));
|
||||
if (record !== undefined) {
|
||||
return {port: record.fakePort.open(options, client)};
|
||||
} else {
|
||||
|
@ -424,4 +422,4 @@ class FakeSerialService {
|
|||
}
|
||||
}
|
||||
|
||||
fakeSerialService = new FakeSerialService();
|
||||
export const fakeSerialService = new FakeSerialService();
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
'use strict';
|
||||
import {ReportingMode, Sensor, SensorClientRemote, SensorReceiver, SensorRemote, SensorType} from '/gen/services/device/public/mojom/sensor.mojom.m.js';
|
||||
import {SensorCreationResult, SensorInitParams_READ_BUFFER_SIZE_FOR_TESTS, SensorProvider, SensorProviderReceiver} from '/gen/services/device/public/mojom/sensor_provider.mojom.m.js';
|
||||
|
||||
// A "sliding window" that iterates over |data| and returns one item at a
|
||||
// time, advancing and wrapping around as needed. |data| must be an array of
|
||||
// arrays.
|
||||
class RingBuffer {
|
||||
self.RingBuffer = class {
|
||||
constructor(data) {
|
||||
this.bufferPosition_ = 0;
|
||||
// Validate |data|'s format and deep-copy every element.
|
||||
|
@ -28,9 +29,9 @@ class RingBuffer {
|
|||
[Symbol.iterator]() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var GenericSensorTest = (() => {
|
||||
self.GenericSensorTest = (() => {
|
||||
// Default sensor frequency in default configurations.
|
||||
const DEFAULT_FREQUENCY = 5;
|
||||
|
||||
|
@ -56,11 +57,8 @@ var GenericSensorTest = (() => {
|
|||
}
|
||||
this.buffer_ = new Float64Array(rv.buffer);
|
||||
this.buffer_.fill(0);
|
||||
this.binding_ = new mojo.Binding(device.mojom.Sensor, this,
|
||||
sensorRequest);
|
||||
this.binding_.setConnectionErrorHandler(() => {
|
||||
this.reset();
|
||||
});
|
||||
this.receiver_ = new SensorReceiver(this);
|
||||
this.receiver_.$.bindHandle(sensorRequest.handle);
|
||||
}
|
||||
|
||||
// Returns default configuration.
|
||||
|
@ -120,7 +118,7 @@ var GenericSensorTest = (() => {
|
|||
this.notifyOnReadingChange_ = true;
|
||||
this.readingData_ = null;
|
||||
this.buffer_.fill(0);
|
||||
this.binding_.close();
|
||||
this.receiver_.$.close();
|
||||
}
|
||||
|
||||
// Sets fake data that is used to deliver sensor reading updates.
|
||||
|
@ -166,7 +164,7 @@ var GenericSensorTest = (() => {
|
|||
// increasing timestamp.
|
||||
this.buffer_[1] = this.timestamp_++;
|
||||
|
||||
if (this.reportingMode_ === device.mojom.ReportingMode.ON_CHANGE &&
|
||||
if (this.reportingMode_ === ReportingMode.ON_CHANGE &&
|
||||
this.notifyOnReadingChange_) {
|
||||
this.client_.sensorReadingChanged();
|
||||
}
|
||||
|
@ -197,9 +195,9 @@ var GenericSensorTest = (() => {
|
|||
class MockSensorProvider {
|
||||
constructor() {
|
||||
this.readingSizeInBytes_ =
|
||||
device.mojom.SensorInitParams.READ_BUFFER_SIZE_FOR_TESTS;
|
||||
this.sharedBufferSizeInBytes_ = this.readingSizeInBytes_ *
|
||||
(device.mojom.SensorType.MAX_VALUE + 1);
|
||||
Number(SensorInitParams_READ_BUFFER_SIZE_FOR_TESTS);
|
||||
this.sharedBufferSizeInBytes_ =
|
||||
this.readingSizeInBytes_ * (SensorType.MAX_VALUE + 1);
|
||||
const rv = Mojo.createSharedBuffer(this.sharedBufferSizeInBytes_);
|
||||
if (rv.result != Mojo.RESULT_OK) {
|
||||
throw new Error("MockSensorProvider: Failed to map shared buffer");
|
||||
|
@ -212,28 +210,26 @@ var GenericSensorTest = (() => {
|
|||
this.maxFrequency_ = 60;
|
||||
this.minFrequency_ = 1;
|
||||
this.mojomSensorType_ = new Map([
|
||||
['Accelerometer', device.mojom.SensorType.ACCELEROMETER],
|
||||
['LinearAccelerationSensor',
|
||||
device.mojom.SensorType.LINEAR_ACCELERATION],
|
||||
['GravitySensor',
|
||||
device.mojom.SensorType.GRAVITY],
|
||||
['AmbientLightSensor', device.mojom.SensorType.AMBIENT_LIGHT],
|
||||
['Gyroscope', device.mojom.SensorType.GYROSCOPE],
|
||||
['Magnetometer', device.mojom.SensorType.MAGNETOMETER],
|
||||
['Accelerometer', SensorType.ACCELEROMETER],
|
||||
['LinearAccelerationSensor', SensorType.LINEAR_ACCELERATION],
|
||||
['GravitySensor', SensorType.GRAVITY],
|
||||
['AmbientLightSensor', SensorType.AMBIENT_LIGHT],
|
||||
['Gyroscope', SensorType.GYROSCOPE],
|
||||
['Magnetometer', SensorType.MAGNETOMETER],
|
||||
['AbsoluteOrientationSensor',
|
||||
device.mojom.SensorType.ABSOLUTE_ORIENTATION_QUATERNION],
|
||||
SensorType.ABSOLUTE_ORIENTATION_QUATERNION],
|
||||
['AbsoluteOrientationEulerAngles',
|
||||
device.mojom.SensorType.ABSOLUTE_ORIENTATION_EULER_ANGLES],
|
||||
SensorType.ABSOLUTE_ORIENTATION_EULER_ANGLES],
|
||||
['RelativeOrientationSensor',
|
||||
device.mojom.SensorType.RELATIVE_ORIENTATION_QUATERNION],
|
||||
SensorType.RELATIVE_ORIENTATION_QUATERNION],
|
||||
['RelativeOrientationEulerAngles',
|
||||
device.mojom.SensorType.RELATIVE_ORIENTATION_EULER_ANGLES],
|
||||
['ProximitySensor', device.mojom.SensorType.PROXIMITY]
|
||||
SensorType.RELATIVE_ORIENTATION_EULER_ANGLES],
|
||||
['ProximitySensor', SensorType.PROXIMITY]
|
||||
]);
|
||||
this.binding_ = new mojo.Binding(device.mojom.SensorProvider, this);
|
||||
this.receiver_ = new SensorProviderReceiver(this);
|
||||
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(device.mojom.SensorProvider.name);
|
||||
new MojoInterfaceInterceptor(SensorProvider.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest = e => {
|
||||
this.bindToPipe(e.handle);
|
||||
};
|
||||
|
@ -243,25 +239,24 @@ var GenericSensorTest = (() => {
|
|||
// Returns initialized Sensor proxy to the client.
|
||||
async getSensor(type) {
|
||||
if (this.getSensorShouldFail_.get(type)) {
|
||||
return {result: device.mojom.SensorCreationResult.ERROR_NOT_AVAILABLE,
|
||||
return {result: SensorCreationResult.ERROR_NOT_AVAILABLE,
|
||||
initParams: null};
|
||||
}
|
||||
if (this.permissionsDenied_.get(type)) {
|
||||
return {result: device.mojom.SensorCreationResult.ERROR_NOT_ALLOWED,
|
||||
return {result: SensorCreationResult.ERROR_NOT_ALLOWED,
|
||||
initParams: null};
|
||||
}
|
||||
|
||||
const offset = type * this.readingSizeInBytes_;
|
||||
const reportingMode = device.mojom.ReportingMode.ON_CHANGE;
|
||||
const reportingMode = ReportingMode.ON_CHANGE;
|
||||
|
||||
const sensorPtr = new device.mojom.SensorPtr();
|
||||
const sensor = new SensorRemote();
|
||||
if (!this.activeSensors_.has(type)) {
|
||||
const mockSensor = new MockSensor(
|
||||
mojo.makeRequest(sensorPtr), this.sharedBufferHandle_, offset,
|
||||
this.readingSizeInBytes_, reportingMode);
|
||||
sensor.$.bindNewPipeAndPassReceiver(), this.sharedBufferHandle_,
|
||||
offset, this.readingSizeInBytes_, reportingMode);
|
||||
this.activeSensors_.set(type, mockSensor);
|
||||
this.activeSensors_.get(type).client_ =
|
||||
new device.mojom.SensorClientPtr();
|
||||
this.activeSensors_.get(type).client_ = new SensorClientRemote();
|
||||
}
|
||||
|
||||
const rv = this.sharedBufferHandle_.duplicateBufferHandle();
|
||||
|
@ -272,8 +267,7 @@ var GenericSensorTest = (() => {
|
|||
const defaultConfig = { frequency: DEFAULT_FREQUENCY };
|
||||
// Consider sensor traits to meet assertions in C++ code (see
|
||||
// services/device/public/cpp/generic_sensor/sensor_traits.h)
|
||||
if (type == device.mojom.SensorType.AMBIENT_LIGHT ||
|
||||
type == device.mojom.SensorType.MAGNETOMETER) {
|
||||
if (type == SensorType.AMBIENT_LIGHT || type == SensorType.MAGNETOMETER) {
|
||||
this.maxFrequency_ = Math.min(10, this.maxFrequency_);
|
||||
}
|
||||
|
||||
|
@ -283,23 +277,24 @@ var GenericSensorTest = (() => {
|
|||
// each reading return a different value that is significantly different
|
||||
// from the previous one when setSensorReading() is not called by client
|
||||
// code (e.g. run_generic_sensor_iframe_tests()).
|
||||
if (type == device.mojom.SensorType.AMBIENT_LIGHT) {
|
||||
if (type == SensorType.AMBIENT_LIGHT) {
|
||||
this.activeSensors_.get(type).setSensorReading([
|
||||
[window.performance.now() * 100],
|
||||
[(window.performance.now() + 50) * 100]
|
||||
]);
|
||||
}
|
||||
|
||||
const initParams = new device.mojom.SensorInitParams({
|
||||
sensor: sensorPtr,
|
||||
clientReceiver: mojo.makeRequest(this.activeSensors_.get(type).client_),
|
||||
const client = this.activeSensors_.get(type).client_;
|
||||
const initParams = {
|
||||
sensor,
|
||||
clientReceiver: client.$.bindNewPipeAndPassReceiver(),
|
||||
memory: rv.handle,
|
||||
bufferOffset: offset,
|
||||
bufferOffset: BigInt(offset),
|
||||
mode: reportingMode,
|
||||
defaultConfiguration: defaultConfig,
|
||||
minimumFrequency: this.minFrequency_,
|
||||
maximumFrequency: this.maxFrequency_
|
||||
});
|
||||
};
|
||||
|
||||
if (this.resolveFuncs_.has(type)) {
|
||||
for (let resolveFunc of this.resolveFuncs_.get(type)) {
|
||||
|
@ -308,16 +303,12 @@ var GenericSensorTest = (() => {
|
|||
this.resolveFuncs_.delete(type);
|
||||
}
|
||||
|
||||
return {result: device.mojom.SensorCreationResult.SUCCESS,
|
||||
initParams: initParams};
|
||||
return {result: SensorCreationResult.SUCCESS, initParams};
|
||||
}
|
||||
|
||||
// Binds object to mojo message pipe
|
||||
bindToPipe(pipe) {
|
||||
this.binding_.bind(pipe);
|
||||
this.binding_.setConnectionErrorHandler(() => {
|
||||
this.reset();
|
||||
});
|
||||
this.receiver_.$.bindHandle(pipe);
|
||||
}
|
||||
|
||||
// Mock functions
|
||||
|
@ -333,7 +324,7 @@ var GenericSensorTest = (() => {
|
|||
this.permissionsDenied_.clear();
|
||||
this.maxFrequency_ = 60;
|
||||
this.minFrequency_ = 1;
|
||||
this.binding_.close();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
"use strict";
|
||||
import {BarcodeDetectionReceiver, BarcodeFormat} from '/gen/services/shape_detection/public/mojom/barcodedetection.mojom.m.js';
|
||||
import {BarcodeDetectionProvider, BarcodeDetectionProviderReceiver} from '/gen/services/shape_detection/public/mojom/barcodedetection_provider.mojom.m.js';
|
||||
|
||||
var BarcodeDetectionTest = (() => {
|
||||
self.BarcodeDetectionTest = (() => {
|
||||
// Class that mocks BarcodeDetectionProvider interface defined in
|
||||
// https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/barcodedetection_provider.mojom
|
||||
class MockBarcodeDetectionProvider {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(
|
||||
shapeDetection.mojom.BarcodeDetectionProvider);
|
||||
this.receiver_ = new BarcodeDetectionProviderReceiver(this);
|
||||
|
||||
this.interceptor_ = new MojoInterfaceInterceptor(
|
||||
shapeDetection.mojom.BarcodeDetectionProvider.name);
|
||||
BarcodeDetectionProvider.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest = e => {
|
||||
if (this.should_close_pipe_on_request_)
|
||||
e.handle.close();
|
||||
else
|
||||
this.bindingSet_.addBinding(this, e.handle);
|
||||
this.receiver_.$.bindHandle(e.handle);
|
||||
}
|
||||
this.interceptor_.start();
|
||||
this.should_close_pipe_on_request_ = false;
|
||||
|
@ -25,13 +25,13 @@ var BarcodeDetectionTest = (() => {
|
|||
}
|
||||
|
||||
enumerateSupportedFormats() {
|
||||
return Promise.resolve({
|
||||
return {
|
||||
supportedFormats: [
|
||||
shapeDetection.mojom.BarcodeFormat.AZTEC,
|
||||
shapeDetection.mojom.BarcodeFormat.DATA_MATRIX,
|
||||
shapeDetection.mojom.BarcodeFormat.QR_CODE,
|
||||
BarcodeFormat.AZTEC,
|
||||
BarcodeFormat.DATA_MATRIX,
|
||||
BarcodeFormat.QR_CODE,
|
||||
]
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
getFrameData() {
|
||||
|
@ -45,7 +45,7 @@ var BarcodeDetectionTest = (() => {
|
|||
reset() {
|
||||
this.mockService_ = null;
|
||||
this.should_close_pipe_on_request_ = false;
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
|
||||
|
@ -60,20 +60,19 @@ var BarcodeDetectionTest = (() => {
|
|||
class MockBarcodeDetection {
|
||||
constructor(request, options) {
|
||||
this.options_ = options;
|
||||
this.binding_ =
|
||||
new mojo.Binding(shapeDetection.mojom.BarcodeDetection,
|
||||
this, request);
|
||||
this.receiver_ = new BarcodeDetectionReceiver(this);
|
||||
this.receiver_.$.bindHandle(request.handle);
|
||||
}
|
||||
|
||||
detect(bitmapData) {
|
||||
this.bufferData_ =
|
||||
new Uint32Array(getArrayBufferFromBigBuffer(bitmapData.pixelData));
|
||||
return Promise.resolve({
|
||||
return {
|
||||
results: [
|
||||
{
|
||||
rawValue : "cats",
|
||||
boundingBox: { x: 1.0, y: 1.0, width: 100.0, height: 100.0 },
|
||||
format: shapeDetection.mojom.BarcodeFormat.QR_CODE,
|
||||
format: BarcodeFormat.QR_CODE,
|
||||
cornerPoints: [
|
||||
{ x: 1.0, y: 1.0 },
|
||||
{ x: 101.0, y: 1.0 },
|
||||
|
@ -84,7 +83,7 @@ var BarcodeDetectionTest = (() => {
|
|||
{
|
||||
rawValue : "dogs",
|
||||
boundingBox: { x: 2.0, y: 2.0, width: 50.0, height: 50.0 },
|
||||
format: shapeDetection.mojom.BarcodeFormat.CODE_128,
|
||||
format: BarcodeFormat.CODE_128,
|
||||
cornerPoints: [
|
||||
{ x: 2.0, y: 2.0 },
|
||||
{ x: 52.0, y: 2.0 },
|
||||
|
@ -93,7 +92,7 @@ var BarcodeDetectionTest = (() => {
|
|||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -133,3 +132,5 @@ var BarcodeDetectionTest = (() => {
|
|||
|
||||
return BarcodeDetectionTestChromium;
|
||||
})();
|
||||
|
||||
self.BarcodeFormat = BarcodeFormat;
|
||||
|
|
|
@ -1,17 +1,17 @@
|
|||
"use strict";
|
||||
import {FaceDetectionReceiver, LandmarkType} from '/gen/services/shape_detection/public/mojom/facedetection.mojom.m.js';
|
||||
import {FaceDetectionProvider, FaceDetectionProviderReceiver} from '/gen/services/shape_detection/public/mojom/facedetection_provider.mojom.m.js';
|
||||
|
||||
var FaceDetectionTest = (() => {
|
||||
self.FaceDetectionTest = (() => {
|
||||
// Class that mocks FaceDetectionProvider interface defined in
|
||||
// https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/facedetection_provider.mojom
|
||||
class MockFaceDetectionProvider {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(
|
||||
shapeDetection.mojom.FaceDetectionProvider);
|
||||
this.receiver_ = new FaceDetectionProviderReceiver(this);
|
||||
|
||||
this.interceptor_ = new MojoInterfaceInterceptor(
|
||||
shapeDetection.mojom.FaceDetectionProvider.name);
|
||||
FaceDetectionProvider.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.bindingSet_.addBinding(this, e.handle);
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.interceptor_.start();
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ var FaceDetectionTest = (() => {
|
|||
|
||||
reset() {
|
||||
this.mockService_ = null;
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
}
|
||||
|
@ -44,9 +44,8 @@ var FaceDetectionTest = (() => {
|
|||
constructor(request, options) {
|
||||
this.maxDetectedFaces_ = options.maxDetectedFaces;
|
||||
this.fastMode_ = options.fastMode;
|
||||
this.binding_ =
|
||||
new mojo.Binding(shapeDetection.mojom.FaceDetection,
|
||||
this, request);
|
||||
this.receiver_ = new FaceDetectionReceiver(this);
|
||||
this.receiver_.$.bindHandle(request.handle);
|
||||
}
|
||||
|
||||
detect(bitmapData) {
|
||||
|
@ -57,11 +56,11 @@ var FaceDetectionTest = (() => {
|
|||
{
|
||||
boundingBox: {x: 1.0, y: 1.0, width: 100.0, height: 100.0},
|
||||
landmarks: [{
|
||||
type: shapeDetection.mojom.LandmarkType.EYE,
|
||||
type: LandmarkType.EYE,
|
||||
locations: [{x: 4.0, y: 5.0}]
|
||||
},
|
||||
{
|
||||
type: shapeDetection.mojom.LandmarkType.EYE,
|
||||
type: LandmarkType.EYE,
|
||||
locations: [
|
||||
{x: 4.0, y: 5.0}, {x: 5.0, y: 4.0}, {x: 6.0, y: 3.0},
|
||||
{x: 7.0, y: 4.0}, {x: 8.0, y: 5.0}, {x: 7.0, y: 6.0},
|
||||
|
@ -72,11 +71,11 @@ var FaceDetectionTest = (() => {
|
|||
{
|
||||
boundingBox: {x: 2.0, y: 2.0, width: 200.0, height: 200.0},
|
||||
landmarks: [{
|
||||
type: shapeDetection.mojom.LandmarkType.NOSE,
|
||||
type: LandmarkType.NOSE,
|
||||
locations: [{x: 100.0, y: 50.0}]
|
||||
},
|
||||
{
|
||||
type: shapeDetection.mojom.LandmarkType.NOSE,
|
||||
type: LandmarkType.NOSE,
|
||||
locations: [
|
||||
{x: 80.0, y: 50.0}, {x: 70.0, y: 60.0}, {x: 60.0, y: 70.0},
|
||||
{x: 70.0, y: 60.0}, {x: 80.0, y: 70.0}, {x: 90.0, y: 80.0},
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import {IdleManager, IdleManagerReceiver, ScreenIdleState as MojoScreenIdleState, UserIdleState as MojoUserIdleState} from '/gen/third_party/blink/public/mojom/idle/idle_manager.mojom.m.js';
|
||||
|
||||
/**
|
||||
* This is a testing framework that enables us to test the user idle detection
|
||||
* by intercepting the connection between the renderer and the browser and
|
||||
|
@ -35,14 +37,14 @@ class FakeIdleMonitor {
|
|||
return this;
|
||||
}
|
||||
close() {
|
||||
this.binding.close();
|
||||
this.binding.$.close();
|
||||
}
|
||||
}
|
||||
|
||||
const UserIdleState = {};
|
||||
const ScreenIdleState = {};
|
||||
self.UserIdleState = {};
|
||||
self.ScreenIdleState = {};
|
||||
|
||||
function addMonitor(threshold, monitorPtr, callback) {
|
||||
self.addMonitor = function addMonitor(threshold, monitorPtr, callback) {
|
||||
throw new Error("expected to be overriden by tests");
|
||||
}
|
||||
|
||||
|
@ -50,34 +52,31 @@ async function close() {
|
|||
interceptor.close();
|
||||
}
|
||||
|
||||
function expect(call) {
|
||||
self.expect = function(call) {
|
||||
return {
|
||||
andReturn(callback) {
|
||||
let handler = {};
|
||||
handler[call.name] = callback;
|
||||
interceptor.setHandler(handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
function intercept() {
|
||||
let result = new FakeIdleMonitor();
|
||||
|
||||
let binding = new mojo.Binding(blink.mojom.IdleManager, result);
|
||||
let interceptor = new MojoInterfaceInterceptor(blink.mojom.IdleManager.name);
|
||||
interceptor.oninterfacerequest = (e) => {
|
||||
binding.bind(e.handle);
|
||||
}
|
||||
|
||||
let binding = new IdleManagerReceiver(result);
|
||||
let interceptor = new MojoInterfaceInterceptor(IdleManager.$interfaceName);
|
||||
interceptor.oninterfacerequest = e => binding.$.bindHandle(e.handle);
|
||||
interceptor.start();
|
||||
|
||||
UserIdleState.ACTIVE = blink.mojom.UserIdleState.kActive;
|
||||
UserIdleState.IDLE = blink.mojom.UserIdleState.kIdle;
|
||||
ScreenIdleState.LOCKED = blink.mojom.ScreenIdleState.kLocked;
|
||||
ScreenIdleState.UNLOCKED = blink.mojom.ScreenIdleState.kUnlocked;
|
||||
self.UserIdleState.ACTIVE = MojoUserIdleState.kActive;
|
||||
self.UserIdleState.IDLE = MojoUserIdleState.kIdle;
|
||||
self.ScreenIdleState.LOCKED = MojoScreenIdleState.kLocked;
|
||||
self.ScreenIdleState.UNLOCKED = MojoScreenIdleState.kUnlocked;
|
||||
|
||||
result.setBinding(binding);
|
||||
return result;
|
||||
}
|
||||
|
||||
const interceptor = intercept();
|
||||
const interceptor = intercept();
|
||||
|
|
|
@ -1,34 +1,34 @@
|
|||
"use strict";
|
||||
import {FillLightMode, ImageCapture, ImageCaptureReceiver, MeteringMode, RedEyeReduction} from '/gen/media/capture/mojom/image_capture.mojom.m.js';
|
||||
|
||||
var ImageCaptureTest = (() => {
|
||||
self.ImageCaptureTest = (() => {
|
||||
// Class that mocks ImageCapture interface defined in
|
||||
// https://cs.chromium.org/chromium/src/media/capture/mojom/image_capture.mojom
|
||||
class MockImageCapture {
|
||||
constructor() {
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(media.mojom.ImageCapture.name);
|
||||
new MojoInterfaceInterceptor(ImageCapture.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.bindingSet_.addBinding(this, e.handle);
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.interceptor_.start();
|
||||
|
||||
this.state_ = {
|
||||
state: {
|
||||
supportedWhiteBalanceModes: [
|
||||
media.mojom.MeteringMode.SINGLE_SHOT,
|
||||
media.mojom.MeteringMode.CONTINUOUS
|
||||
MeteringMode.SINGLE_SHOT,
|
||||
MeteringMode.CONTINUOUS
|
||||
],
|
||||
currentWhiteBalanceMode: media.mojom.MeteringMode.CONTINUOUS,
|
||||
currentWhiteBalanceMode: MeteringMode.CONTINUOUS,
|
||||
supportedExposureModes: [
|
||||
media.mojom.MeteringMode.MANUAL,
|
||||
media.mojom.MeteringMode.SINGLE_SHOT,
|
||||
media.mojom.MeteringMode.CONTINUOUS
|
||||
MeteringMode.MANUAL,
|
||||
MeteringMode.SINGLE_SHOT,
|
||||
MeteringMode.CONTINUOUS
|
||||
],
|
||||
currentExposureMode: media.mojom.MeteringMode.MANUAL,
|
||||
currentExposureMode: MeteringMode.MANUAL,
|
||||
supportedFocusModes: [
|
||||
media.mojom.MeteringMode.MANUAL,
|
||||
media.mojom.MeteringMode.SINGLE_SHOT
|
||||
MeteringMode.MANUAL,
|
||||
MeteringMode.SINGLE_SHOT
|
||||
],
|
||||
currentFocusMode: media.mojom.MeteringMode.MANUAL,
|
||||
currentFocusMode: MeteringMode.MANUAL,
|
||||
pointsOfInterest: [{
|
||||
x: 0.4,
|
||||
y: 0.6
|
||||
|
@ -115,7 +115,7 @@ var ImageCaptureTest = (() => {
|
|||
supportsTorch: true,
|
||||
torch: false,
|
||||
|
||||
redEyeReduction: media.mojom.RedEyeReduction.CONTROLLABLE,
|
||||
redEyeReduction: RedEyeReduction.CONTROLLABLE,
|
||||
height: {
|
||||
min: 240.0,
|
||||
max: 2448.0,
|
||||
|
@ -128,18 +128,16 @@ var ImageCaptureTest = (() => {
|
|||
current: 320.0,
|
||||
step: 3.0
|
||||
},
|
||||
fillLightMode: [
|
||||
media.mojom.FillLightMode.AUTO, media.mojom.FillLightMode.FLASH
|
||||
],
|
||||
fillLightMode: [FillLightMode.AUTO, FillLightMode.FLASH],
|
||||
}
|
||||
};
|
||||
this.panTiltZoomPermissionStatus_ = null;
|
||||
this.settings_ = null;
|
||||
this.bindingSet_ = new mojo.BindingSet(media.mojom.ImageCapture);
|
||||
this.receiver_ = new ImageCaptureReceiver(this);
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,14 +1,27 @@
|
|||
'use strict'
|
||||
import {MultipleDisplays, ScreenEnumeration, ScreenEnumerationReceiver} from '/gen/third_party/blink/public/mojom/screen_enumeration/screen_enumeration.mojom.m.js';
|
||||
import {BufferFormat} from '/gen/ui/gfx/mojom/buffer_types.mojom.m.js';
|
||||
import {ColorSpaceMatrixID, ColorSpacePrimaryID, ColorSpaceRangeID, ColorSpaceTransferID} from '/gen/ui/gfx/mojom/color_space.mojom.m.js';
|
||||
import {AccelerometerSupport, Rotation, TouchSupport} from '/gen/ui/display/mojom/display.mojom.m.js';
|
||||
|
||||
var ScreenEnumerationTest = (() => {
|
||||
export const HelperTypes = {
|
||||
AccelerometerSupport,
|
||||
BufferFormat,
|
||||
ColorSpaceMatrixID,
|
||||
ColorSpacePrimaryID,
|
||||
ColorSpaceRangeID,
|
||||
ColorSpaceTransferID,
|
||||
Rotation,
|
||||
TouchSupport,
|
||||
};
|
||||
|
||||
self.ScreenEnumerationTest = (() => {
|
||||
class MockScreenEnumeration {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(blink.mojom.ScreenEnumeration);
|
||||
this.interceptor_ = new MojoInterfaceInterceptor(blink.mojom.ScreenEnumeration.name);
|
||||
this.interceptor_.oninterfacerequest = e => {
|
||||
this.bindingSet_.addBinding(this, e.handle);
|
||||
}
|
||||
this.receiver_ = new ScreenEnumerationReceiver(this);
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(ScreenEnumeration.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.reset();
|
||||
this.interceptor_.start();
|
||||
}
|
||||
|
@ -45,22 +58,22 @@ var ScreenEnumerationTest = (() => {
|
|||
|
||||
async getDisplays() {
|
||||
if (!this.success_)
|
||||
return Promise.resolve({ result: undefined, });
|
||||
let value = new blink.mojom.Displays();
|
||||
value.displays = this.displays_;
|
||||
value.internalId = this.internalId_;
|
||||
value.primaryId = this.primaryId_;
|
||||
return Promise.resolve({ result: value, });
|
||||
return {result: undefined};
|
||||
const result = {
|
||||
displays: this.displays_,
|
||||
internalId: this.internalId_,
|
||||
primaryId: this.primaryId_,
|
||||
};
|
||||
return {result};
|
||||
}
|
||||
|
||||
async hasMultipleDisplays() {
|
||||
hasMultipleDisplays() {
|
||||
if (!this.success_)
|
||||
return Promise.resolve({ result: blink.mojom.MultipleDisplays.kError });
|
||||
return Promise.resolve({
|
||||
return {result: MultipleDisplays.kError};
|
||||
return {
|
||||
result: this.displays_.length > 1
|
||||
? blink.mojom.MultipleDisplays.kTrue
|
||||
: blink.mojom.MultipleDisplays.kFalse,
|
||||
});
|
||||
? MultipleDisplays.kTrue : MultipleDisplays.kFalse,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,16 +1,15 @@
|
|||
"use strict";
|
||||
var TextDetectionTest = (() => {
|
||||
import {TextDetection, TextDetectionReceiver} from '/gen/services/shape_detection/public/mojom/textdetection.mojom.m.js';
|
||||
|
||||
self.TextDetectionTest = (() => {
|
||||
// Class that mocks TextDetection interface defined in
|
||||
// https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/textdetection.mojom
|
||||
class MockTextDetection {
|
||||
constructor() {
|
||||
this.bindingSet_ =
|
||||
new mojo.BindingSet(shapeDetection.mojom.TextDetection);
|
||||
|
||||
this.receiver_ = new TextDetectionReceiver(this);
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(shapeDetection.mojom.TextDetection.name);
|
||||
new MojoInterfaceInterceptor(TextDetection.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.bindingSet_.addBinding(this, e.handle);
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.interceptor_.start();
|
||||
}
|
||||
|
||||
|
@ -48,7 +47,7 @@ var TextDetectionTest = (() => {
|
|||
}
|
||||
|
||||
reset() {
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.receiver_.$.close();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,10 +1,9 @@
|
|||
'use strict';
|
||||
import {NDEFErrorType, NDEFRecordTypeCategory, NFC, NFCReceiver} from '/gen/services/device/public/mojom/nfc.mojom.m.js';
|
||||
|
||||
// Converts between NDEFMessageInit https://w3c.github.io/web-nfc/#dom-ndefmessage
|
||||
// and mojom.NDEFMessage structure, so that watch function can be tested.
|
||||
function toMojoNDEFMessage(message) {
|
||||
let ndefMessage = new device.mojom.NDEFMessage();
|
||||
ndefMessage.data = [];
|
||||
let ndefMessage = {data: []};
|
||||
for (let record of message.records) {
|
||||
ndefMessage.data.push(toMojoNDEFRecord(record));
|
||||
}
|
||||
|
@ -12,16 +11,16 @@ function toMojoNDEFMessage(message) {
|
|||
}
|
||||
|
||||
function toMojoNDEFRecord(record) {
|
||||
let nfcRecord = new device.mojom.NDEFRecord();
|
||||
let nfcRecord = {};
|
||||
// Simply checks the existence of ':' to decide whether it's an external
|
||||
// type or a local type. As a mock, no need to really implement the validation
|
||||
// algorithms for them.
|
||||
if (record.recordType.startsWith(':')) {
|
||||
nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kLocal;
|
||||
nfcRecord.category = NDEFRecordTypeCategory.kLocal;
|
||||
} else if (record.recordType.search(':') != -1) {
|
||||
nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kExternal;
|
||||
nfcRecord.category = NDEFRecordTypeCategory.kExternal;
|
||||
} else {
|
||||
nfcRecord.category = device.mojom.NDEFRecordTypeCategory.kStandardized;
|
||||
nfcRecord.category = NDEFRecordTypeCategory.kStandardized;
|
||||
}
|
||||
nfcRecord.recordType = record.recordType;
|
||||
nfcRecord.mediaType = record.mediaType;
|
||||
|
@ -59,7 +58,7 @@ function toByteArray(data) {
|
|||
// Compares NDEFRecords that were provided / received by the mock service.
|
||||
// TODO: Use different getters to get received record data,
|
||||
// see spec changes at https://github.com/w3c/web-nfc/pull/243.
|
||||
function compareNDEFRecords(providedRecord, receivedRecord) {
|
||||
self.compareNDEFRecords = function(providedRecord, receivedRecord) {
|
||||
assert_equals(providedRecord.recordType, receivedRecord.recordType);
|
||||
|
||||
if (providedRecord.id === undefined) {
|
||||
|
@ -93,7 +92,7 @@ function compareNDEFRecords(providedRecord, receivedRecord) {
|
|||
|
||||
// Compares NDEFWriteOptions structures that were provided to API and
|
||||
// received by the mock mojo service.
|
||||
function assertNDEFWriteOptionsEqual(provided, received) {
|
||||
self.assertNDEFWriteOptionsEqual = function(provided, received) {
|
||||
if (provided.overwrite !== undefined)
|
||||
assert_equals(provided.overwrite, !!received.overwrite);
|
||||
else
|
||||
|
@ -102,7 +101,7 @@ function assertNDEFWriteOptionsEqual(provided, received) {
|
|||
|
||||
// Compares NDEFReaderOptions structures that were provided to API and
|
||||
// received by the mock mojo service.
|
||||
function assertNDEFReaderOptionsEqual(provided, received) {
|
||||
self.assertNDEFReaderOptionsEqual = function(provided, received) {
|
||||
if (provided.url !== undefined)
|
||||
assert_equals(provided.url, received.url);
|
||||
else
|
||||
|
@ -119,24 +118,20 @@ function assertNDEFReaderOptionsEqual(provided, received) {
|
|||
}
|
||||
|
||||
function createNDEFError(type) {
|
||||
return {
|
||||
error: type != null ?
|
||||
new device.mojom.NDEFError({errorType: type, errorMessage: ''}) :
|
||||
null
|
||||
};
|
||||
return {error: (type != null ? {errorType: type, errorMessage: ''} : null)};
|
||||
}
|
||||
|
||||
var WebNFCTest = (() => {
|
||||
self.WebNFCTest = (() => {
|
||||
class MockNFC {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(device.mojom.NFC);
|
||||
this.receiver_ = new NFCReceiver(this);
|
||||
|
||||
this.interceptor_ = new MojoInterfaceInterceptor(device.mojom.NFC.name);
|
||||
this.interceptor_ = new MojoInterfaceInterceptor(NFC.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest = e => {
|
||||
if (this.should_close_pipe_on_request_)
|
||||
e.handle.close();
|
||||
else
|
||||
this.bindingSet_.addBinding(this, e.handle);
|
||||
this.receiver_.$.bindHandle(e.handle);
|
||||
}
|
||||
|
||||
this.interceptor_.start();
|
||||
|
@ -174,10 +169,10 @@ var WebNFCTest = (() => {
|
|||
} else if (this.is_formatted_tag_ && !options.overwrite) {
|
||||
// Resolves with NotAllowedError if there are NDEF records on the device
|
||||
// and overwrite is false.
|
||||
resolve(createNDEFError(device.mojom.NDEFErrorType.NOT_ALLOWED));
|
||||
resolve(createNDEFError(NDEFErrorType.NOT_ALLOWED));
|
||||
} else if (this.data_transfer_failed_) {
|
||||
// Resolves with NetworkError if data transfer fails.
|
||||
resolve(createNDEFError(device.mojom.NDEFErrorType.IO_ERROR));
|
||||
resolve(createNDEFError(NDEFErrorType.IO_ERROR));
|
||||
} else {
|
||||
resolve(createNDEFError(null));
|
||||
}
|
||||
|
@ -223,9 +218,9 @@ var WebNFCTest = (() => {
|
|||
|
||||
getHWError() {
|
||||
if (this.hw_status_ === NFCHWStatus.DISABLED)
|
||||
return createNDEFError(device.mojom.NDEFErrorType.NOT_READABLE);
|
||||
return createNDEFError(NDEFErrorType.NOT_READABLE);
|
||||
if (this.hw_status_ === NFCHWStatus.NOT_SUPPORTED)
|
||||
return createNDEFError(device.mojom.NDEFErrorType.NOT_SUPPORTED);
|
||||
return createNDEFError(NDEFErrorType.NOT_SUPPORTED);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -264,7 +259,7 @@ var WebNFCTest = (() => {
|
|||
cancelPendingPushOperation() {
|
||||
if (this.pending_promise_func_) {
|
||||
this.pending_promise_func_(
|
||||
createNDEFError(device.mojom.NDEFErrorType.OPERATION_CANCELLED));
|
||||
createNDEFError(NDEFErrorType.OPERATION_CANCELLED));
|
||||
this.pending_promise_func_ = null;
|
||||
}
|
||||
|
||||
|
@ -318,15 +313,15 @@ var WebNFCTest = (() => {
|
|||
simulateNonNDEFTagDiscovered() {
|
||||
// Notify NotSupportedError to all active readers.
|
||||
if (this.watchers_.length != 0) {
|
||||
this.client_.onError(new device.mojom.NDEFError({
|
||||
errorType: device.mojom.NDEFErrorType.NOT_SUPPORTED,
|
||||
this.client_.onError({
|
||||
errorType: NDEFErrorType.NOT_SUPPORTED,
|
||||
errorMessage: ''
|
||||
}));
|
||||
});
|
||||
}
|
||||
// Reject the pending push with NotSupportedError.
|
||||
if (this.pending_promise_func_) {
|
||||
this.pending_promise_func_(
|
||||
createNDEFError(device.mojom.NDEFErrorType.NOT_SUPPORTED));
|
||||
createNDEFError(NDEFErrorType.NOT_SUPPORTED));
|
||||
this.pending_promise_func_ = null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,13 +1,15 @@
|
|||
'use strict';
|
||||
import * as vrMojom from '/gen/device/vr/public/mojom/vr_service.mojom.m.js';
|
||||
import {GamepadHand, GamepadMapping} from '/gen/device/gamepad/public/mojom/gamepad.mojom.m.js';
|
||||
|
||||
// This polyfill library implements the WebXR Test API as specified here:
|
||||
// https://github.com/immersive-web/webxr-test-api
|
||||
|
||||
const defaultMojoFromFloor = new gfx.mojom.Transform();
|
||||
defaultMojoFromFloor.matrix = [1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, -1.65, 0, 1];
|
||||
const defaultMojoFromFloor = {
|
||||
matrix: [1, 0, 0, 0,
|
||||
0, 1, 0, 0,
|
||||
0, 0, 1, 0,
|
||||
0, -1.65, 0, 1]
|
||||
};
|
||||
const default_stage_parameters = {
|
||||
mojoFromFloor: defaultMojoFromFloor,
|
||||
bounds: null
|
||||
|
@ -44,15 +46,22 @@ function getMatrixFromTransform(transform) {
|
|||
m14, m24, m34, 1];
|
||||
}
|
||||
|
||||
function getPoseFromTransform(transform) {
|
||||
const [px, py, pz] = transform.position;
|
||||
const [ox, oy, oz, ow] = transform.orientation;
|
||||
return {
|
||||
position: {x: px, y: py, z: pz},
|
||||
orientation: {x: ox, y: oy, z: oz, w: ow},
|
||||
};
|
||||
}
|
||||
|
||||
function composeGFXTransform(fakeTransformInit) {
|
||||
const transform = new gfx.mojom.Transform();
|
||||
transform.matrix = getMatrixFromTransform(fakeTransformInit);
|
||||
return transform;
|
||||
return {matrix: getMatrixFromTransform(fakeTransformInit)};
|
||||
}
|
||||
|
||||
class ChromeXRTest {
|
||||
constructor() {
|
||||
this.mockVRService_ = new MockVRService(mojo.frameInterfaces);
|
||||
this.mockVRService_ = new MockVRService();
|
||||
}
|
||||
|
||||
simulateDeviceConnection(init_params) {
|
||||
|
@ -60,7 +69,7 @@ class ChromeXRTest {
|
|||
}
|
||||
|
||||
disconnectAllDevices() {
|
||||
this.mockVRService_.removeAllRuntimes(device);
|
||||
this.mockVRService_.removeAllRuntimes();
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
|
@ -103,13 +112,13 @@ class ChromeXRTest {
|
|||
// Mock service implements the VRService mojo interface.
|
||||
class MockVRService {
|
||||
constructor() {
|
||||
this.bindingSet_ = new mojo.BindingSet(device.mojom.VRService);
|
||||
this.receiver_ = new vrMojom.VRServiceReceiver(this);
|
||||
this.runtimes_ = [];
|
||||
|
||||
this.interceptor_ =
|
||||
new MojoInterfaceInterceptor(device.mojom.VRService.name);
|
||||
this.interceptor_.oninterfacerequest = e =>
|
||||
this.bindingSet_.addBinding(this, e.handle);
|
||||
new MojoInterfaceInterceptor(vrMojom.VRService.$interfaceName);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.receiver_.$.bindHandle(e.handle);
|
||||
this.interceptor_.start();
|
||||
}
|
||||
|
||||
|
@ -151,7 +160,7 @@ class MockVRService {
|
|||
this.client_ = client;
|
||||
}
|
||||
|
||||
requestSession(sessionOptions, was_activation) {
|
||||
requestSession(sessionOptions) {
|
||||
const requests = [];
|
||||
// Request a session from all the runtimes.
|
||||
for (let i = 0; i < this.runtimes_.length; i++) {
|
||||
|
@ -163,31 +172,21 @@ class MockVRService {
|
|||
for (let i = 0; i < results.length; i++) {
|
||||
if (results[i].session) {
|
||||
// Construct a dummy metrics recorder
|
||||
const metricsRecorderPtr = new device.mojom.XRSessionMetricsRecorderPtr();
|
||||
const metricsRecorderRequest = mojo.makeRequest(metricsRecorderPtr);
|
||||
const metricsRecorderBinding = new mojo.Binding(
|
||||
device.mojom.XRSessionMetricsRecorder, new MockXRSessionMetricsRecorder(), metricsRecorderRequest);
|
||||
const metricsRecorderPtr = new vrMojom.XRSessionMetricsRecorderRemote();
|
||||
metricsRecorderPtr.$.bindNewPipeAndPassReceiver().handle.close();
|
||||
|
||||
const success = {
|
||||
session: results[i].session,
|
||||
metricsRecorder: metricsRecorderPtr,
|
||||
};
|
||||
|
||||
return {
|
||||
result: {
|
||||
success : success,
|
||||
$tag : 0
|
||||
}
|
||||
};
|
||||
return {result: {success}};
|
||||
}
|
||||
}
|
||||
|
||||
// If there were no successful results, returns a null session.
|
||||
return {
|
||||
result: {
|
||||
failureReason : device.mojom.RequestSessionError.NO_RUNTIME_FOUND,
|
||||
$tag : 1
|
||||
}
|
||||
result: {failureReason: vrMojom.RequestSessionError.NO_RUNTIME_FOUND}
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@ -216,17 +215,22 @@ class MockVRService {
|
|||
});
|
||||
}
|
||||
|
||||
setFramesThrottled(throttled) {
|
||||
this.setFramesThrottledImpl(throttled);
|
||||
}
|
||||
|
||||
// May be overridden by specific tests.
|
||||
setFramesThrottledImpl(throttled) {}
|
||||
|
||||
// Only handles asynchronous calls to makeXrCompatible. Synchronous calls are
|
||||
// not supported in Javascript.
|
||||
makeXrCompatible() {
|
||||
if (this.runtimes_.length == 0) {
|
||||
return Promise.resolve({
|
||||
xrCompatibleResult: device.mojom.XrCompatibleResult.kNoDeviceAvailable
|
||||
});
|
||||
return {
|
||||
xrCompatibleResult: vrMojom.XrCompatibleResult.kNoDeviceAvailable
|
||||
};
|
||||
}
|
||||
return Promise.resolve({
|
||||
xrCompatibleResult: device.mojom.XrCompatibleResult.kAlreadyCompatible
|
||||
});
|
||||
return {xrCompatibleResult: vrMojom.XrCompatibleResult.kAlreadyCompatible};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -324,36 +328,36 @@ class MockRuntime {
|
|||
// Mapping from string feature names to the corresponding mojo types.
|
||||
// This is exposed as a member for extensibility.
|
||||
static featureToMojoMap = {
|
||||
'viewer': device.mojom.XRSessionFeature.REF_SPACE_VIEWER,
|
||||
'local': device.mojom.XRSessionFeature.REF_SPACE_LOCAL,
|
||||
'local-floor': device.mojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR,
|
||||
'bounded-floor': device.mojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR,
|
||||
'unbounded': device.mojom.XRSessionFeature.REF_SPACE_UNBOUNDED,
|
||||
'hit-test': device.mojom.XRSessionFeature.HIT_TEST,
|
||||
'dom-overlay': device.mojom.XRSessionFeature.DOM_OVERLAY,
|
||||
'light-estimation': device.mojom.XRSessionFeature.LIGHT_ESTIMATION,
|
||||
'anchors': device.mojom.XRSessionFeature.ANCHORS,
|
||||
'viewer': vrMojom.XRSessionFeature.REF_SPACE_VIEWER,
|
||||
'local': vrMojom.XRSessionFeature.REF_SPACE_LOCAL,
|
||||
'local-floor': vrMojom.XRSessionFeature.REF_SPACE_LOCAL_FLOOR,
|
||||
'bounded-floor': vrMojom.XRSessionFeature.REF_SPACE_BOUNDED_FLOOR,
|
||||
'unbounded': vrMojom.XRSessionFeature.REF_SPACE_UNBOUNDED,
|
||||
'hit-test': vrMojom.XRSessionFeature.HIT_TEST,
|
||||
'dom-overlay': vrMojom.XRSessionFeature.DOM_OVERLAY,
|
||||
'light-estimation': vrMojom.XRSessionFeature.LIGHT_ESTIMATION,
|
||||
'anchors': vrMojom.XRSessionFeature.ANCHORS,
|
||||
};
|
||||
|
||||
static sessionModeToMojoMap = {
|
||||
"inline": device.mojom.XRSessionMode.kInline,
|
||||
"immersive-vr": device.mojom.XRSessionMode.kImmersiveVr,
|
||||
"immersive-ar": device.mojom.XRSessionMode.kImmersiveAr,
|
||||
"inline": vrMojom.XRSessionMode.kInline,
|
||||
"immersive-vr": vrMojom.XRSessionMode.kImmersiveVr,
|
||||
"immersive-ar": vrMojom.XRSessionMode.kImmersiveAr,
|
||||
};
|
||||
|
||||
static environmentBlendModeToMojoMap = {
|
||||
"opaque": device.mojom.XREnvironmentBlendMode.kOpaque,
|
||||
"alpha-blend": device.mojom.XREnvironmentBlendMode.kAlphaBlend,
|
||||
"additive": device.mojom.XREnvironmentBlendMode.kAdditive,
|
||||
"opaque": vrMojom.XREnvironmentBlendMode.kOpaque,
|
||||
"alpha-blend": vrMojom.XREnvironmentBlendMode.kAlphaBlend,
|
||||
"additive": vrMojom.XREnvironmentBlendMode.kAdditive,
|
||||
};
|
||||
|
||||
static interactionModeToMojoMap = {
|
||||
"screen-space": device.mojom.XRInteractionMode.kScreenSpace,
|
||||
"world-space": device.mojom.XRInteractionMode.kWorldSpace,
|
||||
"screen-space": vrMojom.XRInteractionMode.kScreenSpace,
|
||||
"world-space": vrMojom.XRInteractionMode.kWorldSpace,
|
||||
};
|
||||
|
||||
constructor(fakeDeviceInit, service) {
|
||||
this.sessionClient_ = new device.mojom.XRSessionClientPtr();
|
||||
this.sessionClient_ = null;
|
||||
this.presentation_provider_ = new MockXRPresentationProvider();
|
||||
|
||||
this.pose_ = null;
|
||||
|
@ -375,11 +379,11 @@ class MockRuntime {
|
|||
// Currently active transient hit test subscriptions.
|
||||
this.transientHitTestSubscriptions_ = new Map();
|
||||
// ID of the next subscription to be assigned.
|
||||
this.next_hit_test_id_ = 1;
|
||||
this.next_hit_test_id_ = 1n;
|
||||
|
||||
this.anchor_controllers_ = new Map();
|
||||
// ID of the next anchor to be assigned.
|
||||
this.next_anchor_id_ = 1;
|
||||
this.next_anchor_id_ = 1n;
|
||||
// Anchor creation callback (initially null, can be set by tests).
|
||||
this.anchor_creation_callback_ = null;
|
||||
|
||||
|
@ -406,10 +410,10 @@ class MockRuntime {
|
|||
|
||||
// Initialize DisplayInfo first to set the defaults, then override with
|
||||
// anything from the deviceInit
|
||||
if (this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveVr)
|
||||
|| this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
if (this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveVr) ||
|
||||
this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
this.displayInfo_ = this.getImmersiveDisplayInfo();
|
||||
} else if (this.supportedModes_.includes(device.mojom.XRSessionMode.kInline)) {
|
||||
} else if (this.supportedModes_.includes(vrMojom.XRSessionMode.kInline)) {
|
||||
this.displayInfo_ = this.getNonImmersiveDisplayInfo();
|
||||
} else {
|
||||
// This should never happen!
|
||||
|
@ -458,10 +462,11 @@ class MockRuntime {
|
|||
if (blendMode in MockRuntime.environmentBlendModeToMojoMap) {
|
||||
return MockRuntime.environmentBlendModeToMojoMap[blendMode];
|
||||
} else {
|
||||
if (this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
return device.mojom.XREnvironmentBlendMode.kAdditive;
|
||||
} else if (this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveVr)) {
|
||||
return device.mojom.XREnvironmentBlendMode.kOpaque;
|
||||
if (this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
return vrMojom.XREnvironmentBlendMode.kAdditive;
|
||||
} else if (this.supportedModes_.includes(
|
||||
vrMojom.XRSessionMode.kImmersiveVr)) {
|
||||
return vrMojom.XREnvironmentBlendMode.kOpaque;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -470,7 +475,7 @@ class MockRuntime {
|
|||
if (interactionMode in MockRuntime.interactionModeToMojoMap) {
|
||||
return MockRuntime.interactionModeToMojoMap[interactionMode];
|
||||
} else {
|
||||
return device.mojom.XRInteractionMode.kWorldSpace;
|
||||
return vrMojom.XRInteractionMode.kWorldSpace;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -478,8 +483,9 @@ class MockRuntime {
|
|||
disconnect() {
|
||||
this.service_.removeRuntime(this);
|
||||
this.presentation_provider_.Close();
|
||||
if (this.sessionClient_.ptr.isBound()) {
|
||||
this.sessionClient_.ptr.reset();
|
||||
if (this.sessionClient_) {
|
||||
this.sessionClient_.$.close();
|
||||
this.sessionClient_ = null;
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
|
@ -498,7 +504,7 @@ class MockRuntime {
|
|||
}
|
||||
}
|
||||
|
||||
if (changed && this.sessionClient_.ptr.isBound()) {
|
||||
if (changed && this.sessionClient_) {
|
||||
this.sessionClient_.onChanged(this.displayInfo_);
|
||||
}
|
||||
}
|
||||
|
@ -528,16 +534,16 @@ class MockRuntime {
|
|||
let mojoState = null;
|
||||
switch (visibilityState) {
|
||||
case "visible":
|
||||
mojoState = device.mojom.XRVisibilityState.VISIBLE;
|
||||
mojoState = vrMojom.XRVisibilityState.VISIBLE;
|
||||
break;
|
||||
case "visible-blurred":
|
||||
mojoState = device.mojom.XRVisibilityState.VISIBLE_BLURRED;
|
||||
mojoState = vrMojom.XRVisibilityState.VISIBLE_BLURRED;
|
||||
break;
|
||||
case "hidden":
|
||||
mojoState = device.mojom.XRVisibilityState.HIDDEN;
|
||||
mojoState = vrMojom.XRVisibilityState.HIDDEN;
|
||||
break;
|
||||
}
|
||||
if (mojoState) {
|
||||
if (mojoState && this.sessionClient_) {
|
||||
this.sessionClient_.onVisibilityStateChanged(mojoState);
|
||||
}
|
||||
}
|
||||
|
@ -567,11 +573,9 @@ class MockRuntime {
|
|||
this.stageParameters_.bounds = this.bounds_;
|
||||
}
|
||||
|
||||
this.stageParameters_.mojoFromFloor = new gfx.mojom.Transform();
|
||||
|
||||
// floorOrigin is passed in as mojoFromFloor.
|
||||
this.stageParameters_.mojoFromFloor.matrix =
|
||||
getMatrixFromTransform(floorOrigin);
|
||||
this.stageParameters_.mojoFromFloor =
|
||||
{matrix: getMatrixFromTransform(floorOrigin)};
|
||||
|
||||
this.onStageParametersUpdated();
|
||||
}
|
||||
|
@ -707,7 +711,7 @@ class MockRuntime {
|
|||
if (feature in MockRuntime.featureToMojoMap) {
|
||||
return MockRuntime.featureToMojoMap[feature];
|
||||
} else {
|
||||
return device.mojom.XRSessionFeature.INVALID;
|
||||
return vrMojom.XRSessionFeature.INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -715,7 +719,7 @@ class MockRuntime {
|
|||
|
||||
for (let i = 0; i < supportedFeatures.length; i++) {
|
||||
const feature = convertFeatureToMojom(supportedFeatures[i]);
|
||||
if (feature !== device.mojom.XRSessionFeature.INVALID) {
|
||||
if (feature !== vrMojom.XRSessionFeature.INVALID) {
|
||||
this.supportedFeatures_.push(feature);
|
||||
}
|
||||
}
|
||||
|
@ -774,11 +778,12 @@ class MockRuntime {
|
|||
inputState: input_state,
|
||||
timeDelta: {
|
||||
// window.performance.now() is in milliseconds, so convert to microseconds.
|
||||
microseconds: window.performance.now() * 1000,
|
||||
microseconds: BigInt(Math.floor(window.performance.now() * 1000)),
|
||||
},
|
||||
frameId: this.next_frame_id_,
|
||||
bufferHolder: null,
|
||||
bufferSize: {},
|
||||
renderingTimeRatio: 0,
|
||||
stageParameters: this.stageParameters_,
|
||||
stageParametersId: this.stageParametersId_,
|
||||
};
|
||||
|
@ -794,7 +799,7 @@ class MockRuntime {
|
|||
resolve({frameData});
|
||||
};
|
||||
|
||||
if(this.sessionOptions_.mode == device.mojom.XRSessionMode.kInline) {
|
||||
if(this.sessionOptions_.mode == vrMojom.XRSessionMode.kInline) {
|
||||
// Inline sessions should not have a delay introduced since it causes them
|
||||
// to miss a vsync blink-side and delays propagation of changes that happened
|
||||
// within a rAFcb by one frame (e.g. setViewerOrigin() calls would take 2 frames
|
||||
|
@ -809,37 +814,46 @@ class MockRuntime {
|
|||
}
|
||||
|
||||
getEnvironmentIntegrationProvider(environmentProviderRequest) {
|
||||
this.environmentProviderBinding_ = new mojo.AssociatedBinding(
|
||||
device.mojom.XREnvironmentIntegrationProvider, this,
|
||||
environmentProviderRequest);
|
||||
if (this.environmentProviderReceiver_) {
|
||||
this.environmentProviderReceiver_.$.close();
|
||||
}
|
||||
this.environmentProviderReceiver_ =
|
||||
new vrMojom.XREnvironmentIntegrationProviderReceiver(this);
|
||||
this.environmentProviderReceiver_.$.bindHandle(
|
||||
environmentProviderRequest.handle);
|
||||
}
|
||||
|
||||
setInputSourceButtonListener(listener) { listener.$.close(); }
|
||||
|
||||
// Note that if getEnvironmentProvider hasn't finished running yet this will
|
||||
// be undefined. It's recommended that you allow a successful task to post
|
||||
// first before attempting to close.
|
||||
closeEnvironmentIntegrationProvider() {
|
||||
this.environmentProviderBinding_.close();
|
||||
if (this.environmentProviderReceiver_) {
|
||||
this.environmentProviderReceiver_.$.close();
|
||||
}
|
||||
}
|
||||
|
||||
closeDataProvider() {
|
||||
this.dataProviderBinding_.close();
|
||||
this.closeEnvironmentIntegrationProvider();
|
||||
this.dataProviderReceiver_.$.close();
|
||||
this.sessionOptions_ = null;
|
||||
}
|
||||
|
||||
// XREnvironmentIntegrationProvider implementation:
|
||||
subscribeToHitTest(nativeOriginInformation, entityTypes, ray) {
|
||||
if (!this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
if (!this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
// Reject outside of AR.
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0
|
||||
result : vrMojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0n
|
||||
});
|
||||
}
|
||||
|
||||
if (!this._nativeOriginKnown(nativeOriginInformation)) {
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0
|
||||
result : vrMojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0n
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -856,24 +870,24 @@ class MockRuntime {
|
|||
this.hitTestSubscriptions_.set(id, { nativeOriginInformation, entityTypes, ray, controller });
|
||||
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.SUCCESS,
|
||||
result : vrMojom.SubscribeToHitTestResult.SUCCESS,
|
||||
subscriptionId : id
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0
|
||||
result : vrMojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0n
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
subscribeToHitTestForTransientInput(profileName, entityTypes, ray){
|
||||
if (!this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
if (!this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
// Reject outside of AR.
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0
|
||||
result : vrMojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0n
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -891,13 +905,13 @@ class MockRuntime {
|
|||
this.transientHitTestSubscriptions_.set(id, { profileName, entityTypes, ray, controller });
|
||||
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.SUCCESS,
|
||||
result : vrMojom.SubscribeToHitTestResult.SUCCESS,
|
||||
subscriptionId : id
|
||||
});
|
||||
} else {
|
||||
return Promise.resolve({
|
||||
result : device.mojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0
|
||||
result : vrMojom.SubscribeToHitTestResult.FAILURE_GENERIC,
|
||||
subscriptionId : 0n
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -922,8 +936,8 @@ class MockRuntime {
|
|||
return new Promise((resolve) => {
|
||||
if(this.anchor_creation_callback_ == null) {
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0
|
||||
result : vrMojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0n
|
||||
});
|
||||
|
||||
return;
|
||||
|
@ -932,8 +946,8 @@ class MockRuntime {
|
|||
const mojoFromNativeOrigin = this._getMojoFromNativeOrigin(nativeOriginInformation);
|
||||
if(mojoFromNativeOrigin == null) {
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0
|
||||
result : vrMojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0n
|
||||
});
|
||||
|
||||
return;
|
||||
|
@ -962,22 +976,22 @@ class MockRuntime {
|
|||
anchorController.id = anchor_id;
|
||||
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.SUCCESS,
|
||||
result : vrMojom.CreateAnchorResult.SUCCESS,
|
||||
anchorId : anchor_id
|
||||
});
|
||||
} else {
|
||||
// The test has rejected anchor creation.
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0
|
||||
result : vrMojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0n
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// The test threw an error, treat anchor creation as failed.
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0
|
||||
result : vrMojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0n
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -989,21 +1003,25 @@ class MockRuntime {
|
|||
// Not supported yet.
|
||||
|
||||
resolve({
|
||||
result : device.mojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0
|
||||
result : vrMojom.CreateAnchorResult.FAILURE,
|
||||
anchorId : 0n,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
detachAnchor(anchorId) {}
|
||||
|
||||
// Utility function
|
||||
requestRuntimeSession(sessionOptions) {
|
||||
return this.runtimeSupportsSession(sessionOptions).then((result) => {
|
||||
// The JavaScript bindings convert c_style_names to camelCase names.
|
||||
const options = new device.mojom.XRPresentationTransportOptions();
|
||||
options.transportMethod =
|
||||
device.mojom.XRPresentationTransportMethod.SUBMIT_AS_MAILBOX_HOLDER;
|
||||
options.waitForTransferNotification = true;
|
||||
options.waitForRenderNotification = true;
|
||||
const options = {
|
||||
transportMethod:
|
||||
vrMojom.XRPresentationTransportMethod.SUBMIT_AS_MAILBOX_HOLDER,
|
||||
waitForTransferNotification: true,
|
||||
waitForRenderNotification: true,
|
||||
waitForGpuFence: false,
|
||||
};
|
||||
|
||||
let submit_frame_sink;
|
||||
if (result.supportsSession) {
|
||||
|
@ -1013,13 +1031,15 @@ class MockRuntime {
|
|||
transportOptions: options
|
||||
};
|
||||
|
||||
const dataProviderPtr = new device.mojom.XRFrameDataProviderPtr();
|
||||
const dataProviderRequest = mojo.makeRequest(dataProviderPtr);
|
||||
this.dataProviderBinding_ = new mojo.Binding(
|
||||
device.mojom.XRFrameDataProvider, this, dataProviderRequest);
|
||||
const dataProviderPtr = new vrMojom.XRFrameDataProviderRemote();
|
||||
this.dataProviderReceiver_ =
|
||||
new vrMojom.XRFrameDataProviderReceiver(this);
|
||||
this.dataProviderReceiver_.$.bindHandle(
|
||||
dataProviderPtr.$.bindNewPipeAndPassReceiver().handle);
|
||||
this.sessionOptions_ = sessionOptions;
|
||||
|
||||
const clientReceiver = mojo.makeRequest(this.sessionClient_);
|
||||
this.sessionClient_ = new vrMojom.XRSessionClientRemote();
|
||||
const clientReceiver = this.sessionClient_.$.bindNewPipeAndPassReceiver();
|
||||
|
||||
const enabled_features = [];
|
||||
for (let i = 0; i < sessionOptions.requiredFeatures.length; i++) {
|
||||
|
@ -1044,6 +1064,7 @@ class MockRuntime {
|
|||
displayInfo: this.displayInfo_,
|
||||
enabledFeatures: enabled_features,
|
||||
deviceConfig: {
|
||||
usesInputEventing: false,
|
||||
defaultFramebufferScale: this.defaultFramebufferScale_,
|
||||
supportsViewportScaling: true
|
||||
},
|
||||
|
@ -1066,17 +1087,17 @@ class MockRuntime {
|
|||
// Private functions - utilities:
|
||||
_nativeOriginKnown(nativeOriginInformation){
|
||||
|
||||
if (nativeOriginInformation.$tag == device.mojom.XRNativeOriginInformation.Tags.inputSourceId) {
|
||||
if (nativeOriginInformation.inputSourceId !== undefined) {
|
||||
if (!this.input_sources_.has(nativeOriginInformation.inputSourceId)) {
|
||||
// Unknown input source.
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (nativeOriginInformation.$tag == device.mojom.XRNativeOriginInformation.Tags.referenceSpaceType) {
|
||||
} else if (nativeOriginInformation.referenceSpaceType !== undefined) {
|
||||
// Bounded_floor & unbounded ref spaces are not yet supported for AR:
|
||||
if (nativeOriginInformation.referenceSpaceType == device.mojom.XRReferenceSpaceType.kUnbounded
|
||||
|| nativeOriginInformation.referenceSpaceType == device.mojom.XRReferenceSpaceType.kBoundedFlor) {
|
||||
if (nativeOriginInformation.referenceSpaceType == vrMojom.XRReferenceSpaceType.kUnbounded
|
||||
|| nativeOriginInformation.referenceSpaceType == vrMojom.XRReferenceSpaceType.kBoundedFloor) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -1091,24 +1112,21 @@ class MockRuntime {
|
|||
|
||||
// Modifies passed in frameData to add anchor information.
|
||||
_calculateAnchorInformation(frameData) {
|
||||
if (!this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
if (!this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
frameData.anchorsData = new device.mojom.XRAnchorsData();
|
||||
frameData.anchorsData.allAnchorsIds = [];
|
||||
frameData.anchorsData.updatedAnchorsData = [];
|
||||
|
||||
frameData.anchorsData = {allAnchorsIds: [], updatedAnchorsData: []};
|
||||
for(const [id, controller] of this.anchor_controllers_) {
|
||||
frameData.anchorsData.allAnchorsIds.push(id);
|
||||
|
||||
// Send the entire anchor data over if there was a change since last GetFrameData().
|
||||
if(controller.dirty) {
|
||||
const anchorData = new device.mojom.XRAnchorData();
|
||||
anchorData.id = id;
|
||||
const anchorData = {id};
|
||||
if(!controller.paused) {
|
||||
anchorData.mojoFromAnchor = XRMathHelper.decomposeRigidTransform(
|
||||
controller.getAnchorOrigin());
|
||||
anchorData.mojoFromAnchor = getPoseFromTransform(
|
||||
XRMathHelper.decomposeRigidTransform(
|
||||
controller.getAnchorOrigin()));
|
||||
}
|
||||
|
||||
controller.markProcessed();
|
||||
|
@ -1133,14 +1151,12 @@ class MockRuntime {
|
|||
|
||||
// Modifies passed in frameData to add hit test results.
|
||||
_calculateHitTestResults(frameData) {
|
||||
if (!this.supportedModes_.includes(device.mojom.XRSessionMode.kImmersiveAr)) {
|
||||
if (!this.supportedModes_.includes(vrMojom.XRSessionMode.kImmersiveAr)) {
|
||||
return;
|
||||
}
|
||||
|
||||
frameData.hitTestSubscriptionResults = new device.mojom.XRHitTestSubscriptionResultsData();
|
||||
frameData.hitTestSubscriptionResults.results = [];
|
||||
frameData.hitTestSubscriptionResults.transientInputResults = [];
|
||||
|
||||
frameData.hitTestSubscriptionResults = {results: [],
|
||||
transientInputResults: []};
|
||||
if (!this.world_) {
|
||||
return;
|
||||
}
|
||||
|
@ -1156,21 +1172,16 @@ class MockRuntime {
|
|||
);
|
||||
|
||||
const results = this._hitTestWorld(mojo_ray_origin, mojo_ray_direction, subscription.entityTypes);
|
||||
|
||||
const result = new device.mojom.XRHitTestSubscriptionResultData();
|
||||
result.subscriptionId = id;
|
||||
result.hitTestResults = results;
|
||||
|
||||
frameData.hitTestSubscriptionResults.results.push(result);
|
||||
frameData.hitTestSubscriptionResults.results.push(
|
||||
{subscriptionId: id, hitTestResults: results});
|
||||
}
|
||||
|
||||
// Transient hit test:
|
||||
const mojo_from_viewer = this._getMojoFromViewer();
|
||||
|
||||
for (const [id, subscription] of this.transientHitTestSubscriptions_) {
|
||||
const result = new device.mojom.XRHitTestTransientInputSubscriptionResultData();
|
||||
result.subscriptionId = id;
|
||||
result.inputSourceIdToHitTestResults = new Map();
|
||||
const result = {subscriptionId: id,
|
||||
inputSourceIdToHitTestResults: new Map()};
|
||||
|
||||
// Find all input sources that match the profile name:
|
||||
const matching_input_sources = Array.from(this.input_sources_.values())
|
||||
|
@ -1241,8 +1252,8 @@ class MockRuntime {
|
|||
// Returns array of XRHitResults, each entry will be decorated with the distance from the ray origin (along the ray).
|
||||
_hitTestRegion(region, origin, direction, entityTypes) {
|
||||
const regionNameToMojoEnum = {
|
||||
"point":device.mojom.EntityTypeForHitTest.POINT,
|
||||
"plane":device.mojom.EntityTypeForHitTest.PLANE,
|
||||
"point": vrMojom.EntityTypeForHitTest.POINT,
|
||||
"plane": vrMojom.EntityTypeForHitTest.PLANE,
|
||||
"mesh":null
|
||||
};
|
||||
|
||||
|
@ -1333,7 +1344,7 @@ class MockRuntime {
|
|||
return null;
|
||||
}
|
||||
|
||||
const hitResult = new device.mojom.XRHitResult();
|
||||
const hitResult = {planeId: 0n};
|
||||
hitResult.distance = distance; // Extend the object with additional information used by higher layers.
|
||||
// It will not be serialized over mojom.
|
||||
|
||||
|
@ -1359,8 +1370,8 @@ class MockRuntime {
|
|||
matrix[14] = intersection_point.z;
|
||||
matrix[15] = 1;
|
||||
|
||||
hitResult.mojoFromResult = XRMathHelper.decomposeRigidTransform(matrix);
|
||||
|
||||
hitResult.mojoFromResult = getPoseFromTransform(
|
||||
XRMathHelper.decomposeRigidTransform(matrix));
|
||||
return hitResult;
|
||||
}
|
||||
}
|
||||
|
@ -1385,28 +1396,28 @@ class MockRuntime {
|
|||
_getMojoFromNativeOrigin(nativeOriginInformation) {
|
||||
const mojo_from_viewer = this._getMojoFromViewer();
|
||||
|
||||
if (nativeOriginInformation.$tag == device.mojom.XRNativeOriginInformation.Tags.inputSourceId) {
|
||||
if (nativeOriginInformation.inputSourceId !== undefined) {
|
||||
if (!this.input_sources_.has(nativeOriginInformation.inputSourceId)) {
|
||||
return null;
|
||||
} else {
|
||||
const inputSource = this.input_sources_.get(nativeOriginInformation.inputSourceId);
|
||||
return inputSource._getMojoFromInputSource(mojo_from_viewer);
|
||||
}
|
||||
} else if (nativeOriginInformation.$tag == device.mojom.XRNativeOriginInformation.Tags.referenceSpaceType) {
|
||||
} else if (nativeOriginInformation.referenceSpaceType !== undefined) {
|
||||
switch (nativeOriginInformation.referenceSpaceType) {
|
||||
case device.mojom.XRReferenceSpaceType.kLocal:
|
||||
case vrMojom.XRReferenceSpaceType.kLocal:
|
||||
return XRMathHelper.identity();
|
||||
case device.mojom.XRReferenceSpaceType.kLocalFloor:
|
||||
case vrMojom.XRReferenceSpaceType.kLocalFloor:
|
||||
if (this.stageParameters_ == null || this.stageParameters_.mojoFromFloor == null) {
|
||||
console.warn("Standing transform not available.");
|
||||
return null;
|
||||
}
|
||||
return this.stageParameters_.mojoFromFloor.matrix;
|
||||
case device.mojom.XRReferenceSpaceType.kViewer:
|
||||
case vrMojom.XRReferenceSpaceType.kViewer:
|
||||
return mojo_from_viewer;
|
||||
case device.mojom.XRReferenceSpaceType.kBoundedFlor:
|
||||
case vrMojom.XRReferenceSpaceType.kBoundedFloor:
|
||||
return null;
|
||||
case device.mojom.XRReferenceSpaceType.kUnbounded:
|
||||
case vrMojom.XRReferenceSpaceType.kUnbounded:
|
||||
return null;
|
||||
default:
|
||||
throw new TypeError("Unrecognized XRReferenceSpaceType!");
|
||||
|
@ -1418,12 +1429,6 @@ class MockRuntime {
|
|||
}
|
||||
}
|
||||
|
||||
class MockXRSessionMetricsRecorder {
|
||||
reportFeatureUsed(feature) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
class MockXRInputSource {
|
||||
constructor(fakeInputSourceInit, id, pairedDevice) {
|
||||
this.source_id_ = id;
|
||||
|
@ -1633,9 +1638,10 @@ class MockXRInputSource {
|
|||
|
||||
// Helpers for Mojom
|
||||
getInputSourceState() {
|
||||
const input_state = new device.mojom.XRInputSourceState();
|
||||
const input_state = {};
|
||||
|
||||
input_state.sourceId = this.source_id_;
|
||||
input_state.isAuxiliary = false;
|
||||
|
||||
input_state.primaryInputPressed = this.primary_input_pressed_;
|
||||
input_state.primaryInputClicked = this.primary_input_clicked_;
|
||||
|
@ -1658,17 +1664,17 @@ class MockXRInputSource {
|
|||
input_state.emulatedPosition = this.emulated_position_;
|
||||
|
||||
if (this.desc_dirty_) {
|
||||
const input_desc = new device.mojom.XRInputSourceDescription();
|
||||
const input_desc = {};
|
||||
|
||||
switch (this.target_ray_mode_) {
|
||||
case 'gaze':
|
||||
input_desc.targetRayMode = device.mojom.XRTargetRayMode.GAZING;
|
||||
input_desc.targetRayMode = vrMojom.XRTargetRayMode.GAZING;
|
||||
break;
|
||||
case 'tracked-pointer':
|
||||
input_desc.targetRayMode = device.mojom.XRTargetRayMode.POINTING;
|
||||
input_desc.targetRayMode = vrMojom.XRTargetRayMode.POINTING;
|
||||
break;
|
||||
case 'screen':
|
||||
input_desc.targetRayMode = device.mojom.XRTargetRayMode.TAPPING;
|
||||
input_desc.targetRayMode = vrMojom.XRTargetRayMode.TAPPING;
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unhandled target ray mode ' + this.target_ray_mode_);
|
||||
|
@ -1676,13 +1682,13 @@ class MockXRInputSource {
|
|||
|
||||
switch (this.handedness_) {
|
||||
case 'left':
|
||||
input_desc.handedness = device.mojom.XRHandedness.LEFT;
|
||||
input_desc.handedness = vrMojom.XRHandedness.LEFT;
|
||||
break;
|
||||
case 'right':
|
||||
input_desc.handedness = device.mojom.XRHandedness.RIGHT;
|
||||
input_desc.handedness = vrMojom.XRHandedness.RIGHT;
|
||||
break;
|
||||
default:
|
||||
input_desc.handedness = device.mojom.XRHandedness.NONE;
|
||||
input_desc.handedness = vrMojom.XRHandedness.NONE;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1716,7 +1722,7 @@ class MockXRInputSource {
|
|||
// Since we store mojo_from_input, we need to invert it here before
|
||||
// multiplying.
|
||||
let input_from_mojo = XRMathHelper.inverse(mojo_from_input);
|
||||
input_desc.inputFromPointer = new gfx.mojom.Transform();
|
||||
input_desc.inputFromPointer = {};
|
||||
input_desc.inputFromPointer.matrix =
|
||||
XRMathHelper.mul4x4(input_from_mojo, this.mojo_from_pointer_.matrix);
|
||||
|
||||
|
@ -1745,23 +1751,23 @@ class MockXRInputSource {
|
|||
// everything to reasonable defaults that tests can override.
|
||||
const gamepad = {
|
||||
connected: true,
|
||||
id: "",
|
||||
timestamp: 0,
|
||||
id: [],
|
||||
timestamp: 0n,
|
||||
axes: [],
|
||||
buttons: [],
|
||||
mapping: "xr-standard",
|
||||
display_id: 0,
|
||||
mapping: GamepadMapping.GamepadMappingStandard,
|
||||
displayId: 0,
|
||||
};
|
||||
|
||||
switch (this.handedness_) {
|
||||
case 'left':
|
||||
gamepad.hand = device.mojom.GamepadHand.GamepadHandLeft;
|
||||
gamepad.hand = GamepadHand.GamepadHandLeft;
|
||||
break;
|
||||
case 'right':
|
||||
gamepad.hand = device.mojom.GamepadHand.GamepadHandRight;
|
||||
gamepad.hand = GamepadHand.GamepadHandRight;
|
||||
break;
|
||||
default:
|
||||
gamepad.hand = device.mojom.GamepadHand.GamepadHandNone;
|
||||
gamepad.hand = GamepadHand.GamepadHandNone;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1832,29 +1838,29 @@ class MockXRInputSource {
|
|||
// Mojo helper classes
|
||||
class MockXRPresentationProvider {
|
||||
constructor() {
|
||||
this.binding_ = new mojo.Binding(device.mojom.XRPresentationProvider, this);
|
||||
|
||||
this.receiver_ = null;
|
||||
this.submit_frame_count_ = 0;
|
||||
this.missing_frame_count_ = 0;
|
||||
}
|
||||
|
||||
bindProvider(request) {
|
||||
const providerPtr = new device.mojom.XRPresentationProviderPtr();
|
||||
const providerRequest = mojo.makeRequest(providerPtr);
|
||||
bindProvider() {
|
||||
const provider = new vrMojom.XRPresentationProviderRemote();
|
||||
|
||||
this.binding_.close();
|
||||
|
||||
this.binding_ = new mojo.Binding(
|
||||
device.mojom.XRPresentationProvider, this, providerRequest);
|
||||
|
||||
return providerPtr;
|
||||
if (this.receiver_) {
|
||||
this.receiver_.$.close();
|
||||
}
|
||||
this.receiver_ = new vrMojom.XRPresentationProviderReceiver(this);
|
||||
this.receiver_.$.bindHandle(provider.$.bindNewPipeAndPassReceiver().handle);
|
||||
return provider;
|
||||
}
|
||||
|
||||
getClientReceiver() {
|
||||
this.submitFrameClient_ = new device.mojom.XRPresentationClientPtr();
|
||||
return mojo.makeRequest(this.submitFrameClient_);
|
||||
this.submitFrameClient_ = new vrMojom.XRPresentationClientRemote();
|
||||
return this.submitFrameClient_.$.bindNewPipeAndPassReceiver();
|
||||
}
|
||||
|
||||
updateLayerBounds(frameId, leftBounds, rightBounds, sourceSize) {}
|
||||
|
||||
// XRPresentationProvider mojo implementation
|
||||
submitFrameMissing(frameId, mailboxHolder, timeWaited) {
|
||||
this.missing_frame_count_++;
|
||||
|
@ -1872,10 +1878,23 @@ class MockXRPresentationProvider {
|
|||
this.submitFrameClient_.onSubmitFrameRendered();
|
||||
}
|
||||
|
||||
submitFrameWithTextureHandle(frameId, texture) {}
|
||||
|
||||
submitFrameDrawnIntoTexture(frameId, syncToken, timeWaited) {}
|
||||
|
||||
// Utility methods
|
||||
Close() {
|
||||
this.binding_.close();
|
||||
if (this.receiver_) {
|
||||
this.receiver_.$.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Export these into the global object as a side effect of importing this
|
||||
// module.
|
||||
self.ChromeXRTest = ChromeXRTest;
|
||||
self.MockRuntime = MockRuntime;
|
||||
self.MockVRService = MockVRService;
|
||||
self.SubscribeToHitTestResult = vrMojom.SubscribeToHitTestResult;
|
||||
|
||||
navigator.xr.test = new ChromeXRTest();
|
||||
|
|
|
@ -29,72 +29,3 @@ function loadScript(path) {
|
|||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A helper for Chromium-based browsers to load Mojo JS bindings
|
||||
*
|
||||
* This is an async function that works in both workers and windows. It first
|
||||
* loads mojo_bindings.js, disables automatic dependency loading, and loads all
|
||||
* resources sequentially. The promise resolves if everything loads
|
||||
* successfully, or rejects if any exception is raised. If testharness.js is
|
||||
* used, an uncaught exception will terminate the test with a harness error
|
||||
* (unless `allow_uncaught_exception` is true), which is usually the desired
|
||||
* behaviour.
|
||||
*
|
||||
* This function also works with Blink web tests loaded from file://, in which
|
||||
* case file:// will be prepended to all '/gen/...' URLs.
|
||||
*
|
||||
* Only call this function if isChromiumBased === true.
|
||||
*
|
||||
* @param {Array.<string>} resources - A list of scripts to load: Mojo JS
|
||||
* bindings should be of the form '/gen/../*.mojom.js' or
|
||||
* '/gen/../*.mojom-lite.js' (requires `lite` to be true); the order does not
|
||||
* matter. Do not include 'mojo_bindings.js' or 'mojo_bindings_lite.js'.
|
||||
* @param {boolean=} lite - Whether the lite bindings (*.mojom-lite.js) are used
|
||||
* (default is false).
|
||||
* @returns {Promise}
|
||||
*/
|
||||
async function loadMojoResources(resources, lite = false) {
|
||||
if (!isChromiumBased) {
|
||||
throw new Error('MojoJS not enabled; start Chrome with --enable-blink-features=MojoJS,MojoJSTest');
|
||||
}
|
||||
if (resources.length == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
let genPrefix = '';
|
||||
if (self.location.pathname.includes('/web_tests/')) {
|
||||
// Blink internal web tests
|
||||
genPrefix = 'file://';
|
||||
}
|
||||
|
||||
for (const path of resources) {
|
||||
// We want to load mojo_bindings.js separately to set mojo.config.
|
||||
if (path.endsWith('/mojo_bindings.js')) {
|
||||
throw new Error('Do not load mojo_bindings.js explicitly.');
|
||||
}
|
||||
if (path.endsWith('/mojo_bindings_lite.js')) {
|
||||
throw new Error('Do not load mojo_bindings_lite.js explicitly.');
|
||||
}
|
||||
if (lite) {
|
||||
if (! /^\/gen\/.*\.mojom-lite\.js$/.test(path)) {
|
||||
throw new Error(`Unrecognized resource path: ${path}`);
|
||||
}
|
||||
} else {
|
||||
if (! /^\/gen\/.*\.mojom\.js$/.test(path)) {
|
||||
throw new Error(`Unrecognized resource path: ${path}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lite) {
|
||||
await loadScript(genPrefix + '/gen/layout_test_data/mojo/public/js/mojo_bindings_lite.js');
|
||||
} else {
|
||||
await loadScript(genPrefix + '/gen/layout_test_data/mojo/public/js/mojo_bindings.js');
|
||||
mojo.config.autoLoadMojomDeps = false;
|
||||
}
|
||||
|
||||
for (const path of resources) {
|
||||
await loadScript(genPrefix + path);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,19 +7,10 @@
|
|||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/ui/gfx/mojom/color_space.mojom.js',
|
||||
'/gen/ui/gfx/mojom/buffer_types.mojom.js',
|
||||
'/gen/ui/gfx/mojom/display_color_spaces.mojom.js',
|
||||
'/gen/ui/gfx/geometry/mojom/geometry.mojom.js',
|
||||
'/gen/ui/display/mojom/display.mojom.js',
|
||||
'/gen/third_party/blink/public/mojom/screen_enumeration/screen_enumeration.mojom.js'
|
||||
];
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/testdriver.js');
|
||||
await loadScript('/resources/testdriver-vendor.js');
|
||||
await loadScript('/resources/chromium/mock-screenenumeration.js');
|
||||
const {HelperTypes} = await import('/resources/chromium/mock-screenenumeration.js');
|
||||
self.HelperTypes = HelperTypes;
|
||||
}
|
||||
|
||||
async function initialize_screen_enumeration_tests() {
|
||||
|
@ -57,28 +48,24 @@ function screen_enumeration_test(func, name, properties) {
|
|||
function makeDisplay(id, bounds, work_area, scale_factor) {
|
||||
let myColorSpace = fillColorSpaceVector();
|
||||
let myBufferFormat = fillBufferFormatVector();
|
||||
let newDisplay = new display.mojom.Display({id: id,
|
||||
bounds: new gfx.mojom.Rect({x: bounds.x, y: bounds.y,
|
||||
width: bounds.width,
|
||||
height: bounds.height}),
|
||||
sizeInPixels: new gfx.mojom.Size({width: bounds.width,
|
||||
height: bounds.height}),
|
||||
maximumCursorSize: new gfx.mojom.Size({width: 20, height: 20}),
|
||||
workArea: new gfx.mojom.Rect({x: work_area.x, y: work_area.y,
|
||||
width: work_area.width,
|
||||
height: work_area.height}),
|
||||
deviceScaleFactor: scale_factor,
|
||||
rotation: display.mojom.Rotation.VALUE_0,
|
||||
touchSupport: display.mojom.TouchSupport.UNAVAILABLE,
|
||||
accelerometerSupport: display.mojom.AccelerometerSupport.UNAVAILABLE,
|
||||
colorSpaces: new gfx.mojom.DisplayColorSpaces({colorSpaces: myColorSpace,
|
||||
bufferFormats: myBufferFormat,
|
||||
sdrWhiteLevel: 1.0}),
|
||||
colorDepth: 10,
|
||||
depthPerComponent: 10,
|
||||
isMonochrome: true,
|
||||
displayFrequency: 120});
|
||||
return newDisplay;
|
||||
return {
|
||||
id,
|
||||
bounds,
|
||||
sizeInPixels: {width: bounds.width, height: bounds.height},
|
||||
maximumCursorSize: {width: 20, height: 20},
|
||||
workArea: work_area,
|
||||
deviceScaleFactor: scale_factor,
|
||||
rotation: HelperTypes.Rotation.VALUE_0,
|
||||
touchSupport: HelperTypes.TouchSupport.UNAVAILABLE,
|
||||
accelerometerSupport: HelperTypes.AccelerometerSupport.UNAVAILABLE,
|
||||
colorSpaces: {colorSpaces: myColorSpace,
|
||||
bufferFormats: myBufferFormat,
|
||||
sdrWhiteLevel: 1.0},
|
||||
colorDepth: 10,
|
||||
depthPerComponent: 10,
|
||||
isMonochrome: true,
|
||||
displayFrequency: 120
|
||||
};
|
||||
}
|
||||
|
||||
// Function to construct color space vector.
|
||||
|
@ -86,13 +73,14 @@ function makeDisplay(id, bounds, work_area, scale_factor) {
|
|||
function fillColorSpaceVector() {
|
||||
let colorSpaceVector = [];
|
||||
for (let i = 0; i < 6; i++) {
|
||||
let colorSpace = new gfx.mojom.ColorSpace({
|
||||
primaries: gfx.mojom.ColorSpacePrimaryID.BT709,
|
||||
transfer: gfx.mojom.ColorSpaceTransferID.BT709,
|
||||
matrix: gfx.mojom.ColorSpaceMatrixID.BT709,
|
||||
range: gfx.mojom.ColorSpaceRangeID.LIMITED,
|
||||
customPrimaryMatrix: fillCustomPrimaryMatrix(),
|
||||
transferParams: fillTransferParams()});
|
||||
let colorSpace = {
|
||||
primaries: HelperTypes.ColorSpacePrimaryID.BT709,
|
||||
transfer: HelperTypes.ColorSpaceTransferID.BT709,
|
||||
matrix: HelperTypes.ColorSpaceMatrixID.BT709,
|
||||
range: HelperTypes.ColorSpaceRangeID.LIMITED,
|
||||
customPrimaryMatrix: fillCustomPrimaryMatrix(),
|
||||
transferParams: fillTransferParams()
|
||||
};
|
||||
colorSpaceVector.push(colorSpace);
|
||||
}
|
||||
return colorSpaceVector;
|
||||
|
@ -115,12 +103,12 @@ function fillTransferParams () {
|
|||
// Function to construct buffer format vector.
|
||||
// Values are purely random but mandatory.
|
||||
function fillBufferFormatVector() {
|
||||
|
||||
let bufferFormat = [gfx.mojom.BufferFormat.RGBA_8888,
|
||||
gfx.mojom.BufferFormat.RGBA_8888,
|
||||
gfx.mojom.BufferFormat.RGBA_8888,
|
||||
gfx.mojom.BufferFormat.RGBA_8888,
|
||||
gfx.mojom.BufferFormat.RGBA_8888,
|
||||
gfx.mojom.BufferFormat.RGBA_8888];
|
||||
const BufferFormat = HelperTypes.BufferFormat;
|
||||
let bufferFormat = [BufferFormat.RGBA_8888,
|
||||
BufferFormat.RGBA_8888,
|
||||
BufferFormat.RGBA_8888,
|
||||
BufferFormat.RGBA_8888,
|
||||
BufferFormat.RGBA_8888,
|
||||
BufferFormat.RGBA_8888];
|
||||
return bufferFormat;
|
||||
}
|
||||
|
|
|
@ -11,14 +11,7 @@
|
|||
//
|
||||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/unguessable_token.mojom.js',
|
||||
'/gen/services/device/public/mojom/serial.mojom.js',
|
||||
'/gen/third_party/blink/public/mojom/serial/serial.mojom.js',
|
||||
];
|
||||
await loadMojoResources(chromiumResources);
|
||||
}
|
||||
let fakeSerialService = undefined;
|
||||
|
||||
// Returns a SerialPort instance and associated FakeSerialPort instance.
|
||||
async function getFakeSerialPort(fake) {
|
||||
|
@ -34,16 +27,14 @@ async function getFakeSerialPort(fake) {
|
|||
return { port, fakePort };
|
||||
}
|
||||
|
||||
let fakeSerialService = undefined;
|
||||
|
||||
function serial_test(func, name, properties) {
|
||||
promise_test(async (test) => {
|
||||
assert_implements(navigator.serial, 'missing navigator.serial');
|
||||
if (fakeSerialService === undefined) {
|
||||
// Try loading a polyfill for the fake serial service.
|
||||
if (isChromiumBased) {
|
||||
await loadChromiumResources();
|
||||
await loadScript('/resources/chromium/fake-serial.js');
|
||||
const fakes = await import('/resources/chromium/fake-serial.js');
|
||||
fakeSerialService = fakes.fakeSerialService;
|
||||
}
|
||||
}
|
||||
assert_implements(fakeSerialService, 'missing fakeSerialService after initialization');
|
||||
|
|
|
@ -36,8 +36,7 @@ detection_test("BarcodeDetectionTest", async (t, detectionTest) => {
|
|||
barcodeDetectionResult = await detectorWithOptions.detect(img);
|
||||
assert_array_equals(
|
||||
mock.getFormats(),
|
||||
[shapeDetection.mojom.BarcodeFormat.CODE_128,
|
||||
shapeDetection.mojom.BarcodeFormat.QR_CODE],
|
||||
[BarcodeFormat.CODE_128, BarcodeFormat.QR_CODE],
|
||||
"formats");
|
||||
|
||||
const invalidFormats = [
|
||||
|
|
|
@ -10,23 +10,9 @@
|
|||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const prefix = '/gen/services/shape_detection/public/mojom';
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/big_buffer.mojom.js',
|
||||
'/gen/skia/public/mojom/image_info.mojom.js',
|
||||
'/gen/skia/public/mojom/bitmap.mojom.js',
|
||||
'/gen/ui/gfx/geometry/mojom/geometry.mojom.js',
|
||||
`${prefix}/barcodedetection.mojom.js`,
|
||||
`${prefix}/barcodedetection_provider.mojom.js`,
|
||||
`${prefix}/facedetection.mojom.js`,
|
||||
`${prefix}/facedetection_provider.mojom.js`,
|
||||
`${prefix}/textdetection.mojom.js`,
|
||||
];
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/chromium/mock-barcodedetection.js');
|
||||
await loadScript('/resources/chromium/mock-facedetection.js');
|
||||
await loadScript('/resources/chromium/mock-textdetection.js');
|
||||
await import('/resources/chromium/mock-barcodedetection.js');
|
||||
await import('/resources/chromium/mock-facedetection.js');
|
||||
await import('/resources/chromium/mock-textdetection.js');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -81,7 +67,7 @@ function detection_test(detectionTestName, func, name, properties) {
|
|||
}
|
||||
|
||||
function getArrayBufferFromBigBuffer(bigBuffer) {
|
||||
if (bigBuffer.$tag == mojoBase.mojom.BigBuffer.Tags.bytes) {
|
||||
if (bigBuffer.bytes !== undefined) {
|
||||
return new Uint8Array(bigBuffer.bytes).buffer;
|
||||
}
|
||||
return bigBuffer.sharedMemory.bufferHandle.mapBuffer(0,
|
||||
|
|
|
@ -9,14 +9,9 @@
|
|||
// --enable-blink-features=MojoJS,MojoJSTest
|
||||
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/services/device/public/mojom/nfc.mojom.js',
|
||||
];
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
await loadScript('/resources/testdriver.js');
|
||||
await loadScript('/resources/testdriver-vendor.js');
|
||||
await loadScript('/resources/chromium/nfc-mock.js');
|
||||
await import('/resources/chromium/nfc-mock.js');
|
||||
}
|
||||
|
||||
async function initialize_nfc_tests() {
|
||||
|
|
|
@ -204,42 +204,19 @@ function forEachWebxrObject(callback) {
|
|||
|
||||
// Code for loading test API in Chromium.
|
||||
async function loadChromiumResources() {
|
||||
const chromiumResources = [
|
||||
'/gen/mojo/public/mojom/base/time.mojom.js',
|
||||
'/gen/mojo/public/mojom/base/shared_memory.mojom.js',
|
||||
'/gen/mojo/public/mojom/base/unguessable_token.mojom.js',
|
||||
'/gen/gpu/ipc/common/sync_token.mojom.js',
|
||||
'/gen/gpu/ipc/common/mailbox.mojom.js',
|
||||
'/gen/gpu/ipc/common/mailbox_holder.mojom.js',
|
||||
'/gen/ui/gfx/geometry/mojom/geometry.mojom.js',
|
||||
'/gen/ui/gfx/mojom/native_handle_types.mojom.js',
|
||||
'/gen/ui/gfx/mojom/buffer_types.mojom.js',
|
||||
'/gen/ui/gfx/mojom/color_space.mojom.js',
|
||||
'/gen/ui/gfx/mojom/display_color_spaces.mojom.js',
|
||||
'/gen/ui/gfx/mojom/gpu_fence_handle.mojom.js',
|
||||
'/gen/ui/gfx/mojom/transform.mojom.js',
|
||||
'/gen/ui/display/mojom/display.mojom.js',
|
||||
'/gen/device/gamepad/public/mojom/gamepad.mojom.js',
|
||||
'/gen/device/vr/public/mojom/vr_service.mojom.js',
|
||||
];
|
||||
await loadScript('/resources/chromium/webxr-test-math-helper.js');
|
||||
await import('/resources/chromium/webxr-test.js');
|
||||
await loadScript('/resources/testdriver.js');
|
||||
await loadScript('/resources/testdriver-vendor.js');
|
||||
|
||||
let extraResources = [
|
||||
'/resources/chromium/webxr-test-math-helper.js',
|
||||
'/resources/chromium/webxr-test.js',
|
||||
'/resources/testdriver.js',
|
||||
'/resources/testdriver-vendor.js',
|
||||
];
|
||||
// This infrastructure is also used by Chromium-specific internal tests that
|
||||
// may need additional resources (e.g. internal API extensions), this allows
|
||||
// those tests to rely on this infrastructure while ensuring that no tests
|
||||
// make it into public WPTs that rely on APIs outside of the webxr test API.
|
||||
if (typeof(additionalChromiumResources) !== 'undefined') {
|
||||
extraResources = extraResources.concat(additionalChromiumResources);
|
||||
}
|
||||
|
||||
await loadMojoResources(chromiumResources);
|
||||
for (const path of extraResources) {
|
||||
await loadScript(path);
|
||||
for (const path of additionalChromiumResources) {
|
||||
await loadScript(path);
|
||||
}
|
||||
}
|
||||
|
||||
xr_debug = navigator.xr.test.Debug;
|
||||
|
|
Загрузка…
Ссылка в новой задаче