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'; 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.receiver_ = new FaceDetectionProviderReceiver(this); this.interceptor_ = new MojoInterfaceInterceptor( FaceDetectionProvider.$interfaceName); this.interceptor_.oninterfacerequest = e => this.receiver_.$.bindHandle(e.handle); this.interceptor_.start(); } createFaceDetection(request, options) { this.mockService_ = new MockFaceDetection(request, options); } getFrameData() { return this.mockService_.bufferData_; } getMaxDetectedFaces() { return this.mockService_.maxDetectedFaces_; } getFastMode () { return this.mockService_.fastMode_; } reset() { this.mockService_ = null; this.receiver_.$.close(); this.interceptor_.stop(); } } // Class that mocks FaceDetection interface defined in // https://cs.chromium.org/chromium/src/services/shape_detection/public/mojom/facedetection.mojom class MockFaceDetection { constructor(request, options) { this.maxDetectedFaces_ = options.maxDetectedFaces; this.fastMode_ = options.fastMode; this.receiver_ = new FaceDetectionReceiver(this); this.receiver_.$.bindHandle(request.handle); } detect(bitmapData) { this.bufferData_ = new Uint32Array(getArrayBufferFromBigBuffer(bitmapData.pixelData)); return Promise.resolve({ results: [ { boundingBox: {x: 1.0, y: 1.0, width: 100.0, height: 100.0}, landmarks: [{ type: LandmarkType.EYE, locations: [{x: 4.0, y: 5.0}] }, { 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}, {x: 6.0, y: 7.0}, {x: 5.0, y: 6.0} ] }] }, { boundingBox: {x: 2.0, y: 2.0, width: 200.0, height: 200.0}, landmarks: [{ type: LandmarkType.NOSE, locations: [{x: 100.0, y: 50.0}] }, { 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}, {x: 100.0, y: 70.0}, {x: 90.0, y: 60.0}, {x: 80.0, y: 50.0} ] }] }, { boundingBox: {x: 3.0, y: 3.0, width: 300.0, height: 300.0}, landmarks: [] }, ] }); } } let testInternal = { initialized: false, MockFaceDetectionProvider: null } class FaceDetectionTestChromium { constructor() { Object.freeze(this); // Make it immutable. } initialize() { if (testInternal.initialized) throw new Error('Call reset() before initialize().'); testInternal.MockFaceDetectionProvider = new MockFaceDetectionProvider; testInternal.initialized = true; } // Resets state of face detection mocks between test runs. async reset() { if (!testInternal.initialized) throw new Error('Call initialize() before reset().'); testInternal.MockFaceDetectionProvider.reset(); testInternal.MockFaceDetectionProvider = null; testInternal.initialized = false; await new Promise(resolve => setTimeout(resolve, 0)); } MockFaceDetectionProvider() { return testInternal.MockFaceDetectionProvider; } } return FaceDetectionTestChromium; })();