mirror of
https://github.com/servo/servo.git
synced 2025-09-11 07:28:19 +01:00
Update web-platform-tests to revision 2b7dace05fc1869398ee24f84fda4c0e4c0455ae
This commit is contained in:
parent
b23125d590
commit
6c901de216
844 changed files with 19802 additions and 3093 deletions
|
@ -0,0 +1 @@
|
|||
Content-Type: text/javascript; charset=utf-8
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,227 @@
|
|||
"use strict";
|
||||
|
||||
var 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);
|
||||
this.interceptor_.oninterfacerequest =
|
||||
e => this.bindingSet_.addBinding(this, e.handle);
|
||||
this.interceptor_.start();
|
||||
|
||||
this.state_ = {
|
||||
state: {
|
||||
supportedWhiteBalanceModes: [
|
||||
media.mojom.MeteringMode.SINGLE_SHOT,
|
||||
media.mojom.MeteringMode.CONTINUOUS
|
||||
],
|
||||
currentWhiteBalanceMode: media.mojom.MeteringMode.CONTINUOUS,
|
||||
supportedExposureModes: [
|
||||
media.mojom.MeteringMode.SINGLE_SHOT,
|
||||
media.mojom.MeteringMode.CONTINUOUS
|
||||
],
|
||||
currentExposureMode: media.mojom.MeteringMode.SINGLE_SHOT,
|
||||
supportedFocusModes: [
|
||||
media.mojom.MeteringMode.MANUAL,
|
||||
media.mojom.MeteringMode.SINGLE_SHOT
|
||||
],
|
||||
currentFocusMode: media.mojom.MeteringMode.MANUAL,
|
||||
pointsOfInterest: [{
|
||||
x: 0.4,
|
||||
y: 0.6
|
||||
}],
|
||||
|
||||
exposureCompensation: {
|
||||
min: -200.0,
|
||||
max: 200.0,
|
||||
current: 33.0,
|
||||
step: 33.0
|
||||
},
|
||||
colorTemperature: {
|
||||
min: 2500.0,
|
||||
max: 6500.0,
|
||||
current: 6000.0,
|
||||
step: 1000.0
|
||||
},
|
||||
iso: {
|
||||
min: 100.0,
|
||||
max: 12000.0,
|
||||
current: 400.0,
|
||||
step: 1.0
|
||||
},
|
||||
|
||||
brightness: {
|
||||
min: 1.0,
|
||||
max: 10.0,
|
||||
current: 5.0,
|
||||
step: 1.0
|
||||
},
|
||||
contrast: {
|
||||
min: 2.0,
|
||||
max: 9.0,
|
||||
current: 5.0,
|
||||
step: 1.0
|
||||
},
|
||||
saturation: {
|
||||
min: 3.0,
|
||||
max: 8.0,
|
||||
current: 6.0,
|
||||
step: 1.0
|
||||
},
|
||||
sharpness: {
|
||||
min: 4.0,
|
||||
max: 7.0,
|
||||
current: 7.0,
|
||||
step: 1.0
|
||||
},
|
||||
|
||||
zoom: {
|
||||
min: 0.0,
|
||||
max: 10.0,
|
||||
current: 5.0,
|
||||
step: 5.0
|
||||
},
|
||||
|
||||
supportsTorch: true,
|
||||
torch: false,
|
||||
|
||||
redEyeReduction: media.mojom.RedEyeReduction.CONTROLLABLE,
|
||||
height: {
|
||||
min: 240.0,
|
||||
max: 2448.0,
|
||||
current: 240.0,
|
||||
step: 2.0
|
||||
},
|
||||
width: {
|
||||
min: 320.0,
|
||||
max: 3264.0,
|
||||
current: 320.0,
|
||||
step: 3.0
|
||||
},
|
||||
fillLightMode: [
|
||||
media.mojom.FillLightMode.AUTO, media.mojom.FillLightMode.FLASH
|
||||
],
|
||||
}
|
||||
};
|
||||
this.settings_ = null;
|
||||
this.bindingSet_ = new mojo.BindingSet(media.mojom.ImageCapture);
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.bindingSet_.closeAllBindings();
|
||||
this.interceptor_.stop();
|
||||
}
|
||||
|
||||
getPhotoState(source_id) {
|
||||
return Promise.resolve(this.state_);
|
||||
}
|
||||
|
||||
setOptions(source_id, settings) {
|
||||
this.settings_ = settings;
|
||||
if (settings.hasIso)
|
||||
this.state_.state.iso.current = settings.iso;
|
||||
if (settings.hasHeight)
|
||||
this.state_.state.height.current = settings.height;
|
||||
if (settings.hasWidth)
|
||||
this.state_.state.width.current = settings.width;
|
||||
if (settings.hasZoom)
|
||||
this.state_.state.zoom.current = settings.zoom;
|
||||
if (settings.hasFocusMode)
|
||||
this.state_.state.currentFocusMode = settings.focusMode;
|
||||
|
||||
if (settings.pointsOfInterest.length > 0) {
|
||||
this.state_.state.pointsOfInterest =
|
||||
settings.pointsOfInterest;
|
||||
}
|
||||
|
||||
if (settings.hasExposureMode)
|
||||
this.state_.state.currentExposureMode = settings.exposureMode;
|
||||
|
||||
if (settings.hasExposureCompensation) {
|
||||
this.state_.state.exposureCompensation.current =
|
||||
settings.exposureCompensation;
|
||||
}
|
||||
if (settings.hasWhiteBalanceMode) {
|
||||
this.state_.state.currentWhiteBalanceMode =
|
||||
settings.whiteBalanceMode;
|
||||
}
|
||||
if (settings.hasFillLightMode)
|
||||
this.state_.state.fillLightMode = [settings.fillLightMode];
|
||||
if (settings.hasRedEyeReduction)
|
||||
this.state_.state.redEyeReduction = settings.redEyeReduction;
|
||||
if (settings.hasColorTemperature) {
|
||||
this.state_.state.colorTemperature.current =
|
||||
settings.colorTemperature;
|
||||
}
|
||||
if (settings.hasBrightness)
|
||||
this.state_.state.brightness.current = settings.brightness;
|
||||
if (settings.hasContrast)
|
||||
this.state_.state.contrast.current = settings.contrast;
|
||||
if (settings.hasSaturation)
|
||||
this.state_.state.saturation.current = settings.saturation;
|
||||
if (settings.hasSharpness)
|
||||
this.state_.state.sharpness.current = settings.sharpness;
|
||||
|
||||
if (settings.hasTorch)
|
||||
this.state_.state.torch = settings.torch;
|
||||
|
||||
return Promise.resolve({
|
||||
success: true
|
||||
});
|
||||
}
|
||||
|
||||
takePhoto(source_id) {
|
||||
return Promise.resolve({
|
||||
blob: {
|
||||
mimeType: 'image/cat',
|
||||
data: new Array(2)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
state() {
|
||||
return this.state_.state;
|
||||
}
|
||||
|
||||
options() {
|
||||
return this.settings_;
|
||||
}
|
||||
}
|
||||
|
||||
let testInternal = {
|
||||
initialized: false,
|
||||
mockImageCapture: null
|
||||
}
|
||||
|
||||
class ImageCaptureTestChromium {
|
||||
|
||||
constructor() {
|
||||
Object.freeze(this); // Make it immutable.
|
||||
}
|
||||
|
||||
initialize() {
|
||||
if (testInternal.initialized)
|
||||
throw new Error('Call reset() before initialize().');
|
||||
|
||||
testInternal.mockImageCapture = new MockImageCapture;
|
||||
testInternal.initialized = true;
|
||||
}
|
||||
// Resets state of image capture mocks between test runs.
|
||||
async reset() {
|
||||
if (!testInternal.initialized)
|
||||
throw new Error('Call initialize() before reset().');
|
||||
testInternal.mockImageCapture.reset();
|
||||
testInternal.mockImageCapture = null;
|
||||
testInternal.initialized = false;
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 0));
|
||||
}
|
||||
mockImageCapture() {
|
||||
return testInternal.mockImageCapture;
|
||||
}
|
||||
}
|
||||
|
||||
return ImageCaptureTestChromium;
|
||||
})();
|
|
@ -0,0 +1,40 @@
|
|||
'use strict';
|
||||
|
||||
// This polyfill prepares a child context to be attached to a parent context.
|
||||
// The parent must call navigator.usb.test.attachToContext() to attach to the
|
||||
// child context.
|
||||
(() => {
|
||||
if (this.constructor.name === 'DedicatedWorkerGlobalScope' ||
|
||||
this !== window.top) {
|
||||
|
||||
// Run Chromium specific set up code.
|
||||
if (typeof MojoInterfaceInterceptor !== 'undefined') {
|
||||
let messageChannel = new MessageChannel();
|
||||
messageChannel.port1.onmessage = async (messageEvent) => {
|
||||
if (messageEvent.data.type === 'Attach') {
|
||||
messageEvent.data.interfaces.forEach(interfaceName => {
|
||||
let interfaceInterceptor =
|
||||
new MojoInterfaceInterceptor(interfaceName);
|
||||
interfaceInterceptor.oninterfacerequest =
|
||||
e => messageChannel.port1.postMessage({
|
||||
type: interfaceName,
|
||||
handle: e.handle
|
||||
}, [e.handle]);
|
||||
interfaceInterceptor.start();
|
||||
});
|
||||
|
||||
// Wait for a call to GetDevices() to ensure that the interface
|
||||
// handles are forwarded to the parent context.
|
||||
await navigator.usb.getDevices();
|
||||
messageChannel.port1.postMessage({ type: 'Complete' });
|
||||
}
|
||||
};
|
||||
|
||||
let message = { type: 'ReadyForAttachment', port: messageChannel.port2 };
|
||||
if (typeof Window !== 'undefined')
|
||||
parent.postMessage(message, '*', [messageChannel.port2]);
|
||||
else
|
||||
postMessage(message, [messageChannel.port2]);
|
||||
}
|
||||
}
|
||||
})();
|
|
@ -0,0 +1 @@
|
|||
Content-Type: text/javascript; charset=utf-8
|
|
@ -12,9 +12,23 @@ let internal = {
|
|||
|
||||
webUsbService: null,
|
||||
webUsbServiceInterceptor: null,
|
||||
webUsbServiceCrossFrameProxy: null,
|
||||
|
||||
messagePort: null,
|
||||
};
|
||||
|
||||
function getMessagePort(target) {
|
||||
return new Promise(resolve => {
|
||||
target.addEventListener('message', messageEvent => {
|
||||
if (messageEvent.data.type === 'ReadyForAttachment') {
|
||||
if (internal.messagePort === null) {
|
||||
internal.messagePort = messageEvent.data.port;
|
||||
}
|
||||
resolve();
|
||||
}
|
||||
}, {once: true});
|
||||
});
|
||||
}
|
||||
|
||||
// Converts an ECMAScript String object to an instance of
|
||||
// mojo_base.mojom.String16.
|
||||
function mojoString16ToString(string16) {
|
||||
|
@ -421,25 +435,6 @@ class FakeUSBDevice {
|
|||
}
|
||||
}
|
||||
|
||||
// A helper for forwarding MojoHandle instances from one frame to another.
|
||||
class CrossFrameHandleProxy {
|
||||
constructor(callback) {
|
||||
let {handle0, handle1} = Mojo.createMessagePipe();
|
||||
this.sender_ = handle0;
|
||||
this.receiver_ = handle1;
|
||||
this.receiver_.watch({readable: true}, () => {
|
||||
let message = this.receiver_.readMessage();
|
||||
assert_equals(message.buffer.byteLength, 0);
|
||||
assert_equals(message.handles.length, 1);
|
||||
callback(message.handles[0]);
|
||||
});
|
||||
}
|
||||
|
||||
forwardHandle(handle) {
|
||||
this.sender_.writeMessage(new ArrayBuffer, [handle]);
|
||||
}
|
||||
}
|
||||
|
||||
class USBTest {
|
||||
constructor() {
|
||||
this.onrequestdevice = undefined;
|
||||
|
@ -449,14 +444,17 @@ class USBTest {
|
|||
if (internal.initialized)
|
||||
return;
|
||||
|
||||
// Be ready to handle 'ReadyForAttachment' message from child iframes.
|
||||
if ('window' in self) {
|
||||
getMessagePort(window);
|
||||
}
|
||||
|
||||
internal.webUsbService = new FakeWebUsbService();
|
||||
internal.webUsbServiceInterceptor =
|
||||
new MojoInterfaceInterceptor(blink.mojom.WebUsbService.name);
|
||||
internal.webUsbServiceInterceptor.oninterfacerequest =
|
||||
e => internal.webUsbService.addBinding(e.handle);
|
||||
internal.webUsbServiceInterceptor.start();
|
||||
internal.webUsbServiceCrossFrameProxy = new CrossFrameHandleProxy(
|
||||
handle => internal.webUsbService.addBinding(handle));
|
||||
|
||||
// Wait for a call to GetDevices() to pass between the renderer and the
|
||||
// mock in order to establish that everything is set up.
|
||||
|
@ -464,20 +462,32 @@ class USBTest {
|
|||
internal.initialized = true;
|
||||
}
|
||||
|
||||
async attachToWindow(otherWindow) {
|
||||
// Returns a promise that is resolved when the implementation of |usb| in the
|
||||
// global scope for |context| is controlled by the current context.
|
||||
attachToContext(context) {
|
||||
if (!internal.initialized)
|
||||
throw new Error('Call initialize() before attachToWindow().');
|
||||
throw new Error('Call initialize() before attachToContext()');
|
||||
|
||||
otherWindow.webUsbServiceInterceptor =
|
||||
new otherWindow.MojoInterfaceInterceptor(
|
||||
blink.mojom.WebUsbService.name);
|
||||
otherWindow.webUsbServiceInterceptor.oninterfacerequest =
|
||||
e => internal.webUsbServiceCrossFrameProxy.forwardHandle(e.handle);
|
||||
otherWindow.webUsbServiceInterceptor.start();
|
||||
|
||||
// Wait for a call to GetDevices() to pass between the renderer and the
|
||||
// mock in order to establish that everything is set up.
|
||||
await otherWindow.navigator.usb.getDevices();
|
||||
let target = context.constructor.name === 'Worker' ? context : window;
|
||||
return getMessagePort(target).then(() => {
|
||||
return new Promise(resolve => {
|
||||
internal.messagePort.onmessage = channelEvent => {
|
||||
switch (channelEvent.data.type) {
|
||||
case blink.mojom.WebUsbService.name:
|
||||
internal.webUsbService.addBinding(channelEvent.data.handle);
|
||||
break;
|
||||
case 'Complete':
|
||||
resolve();
|
||||
break;
|
||||
}
|
||||
};
|
||||
internal.messagePort.postMessage({
|
||||
type: 'Attach' ,
|
||||
interfaces: [
|
||||
blink.mojom.WebUsbService.name,
|
||||
]});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
addFakeDevice(deviceInit) {
|
||||
|
@ -501,6 +511,9 @@ class USBTest {
|
|||
// the fact that this polyfill can do this synchronously.
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
if (internal.messagePort !== null)
|
||||
internal.messagePort.close();
|
||||
internal.messagePort = null;
|
||||
internal.webUsbService.removeAllDevices();
|
||||
resolve();
|
||||
}, 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue