Commit 47d87292 authored by Reilly Grant's avatar Reilly Grant Committed by Commit Bot

Switch the Shape Detection LayoutTests to the new Mojo JS bindings

This change switches the Shape Detection Mojo interface JS bindings to
the new style and updates the LayoutTests accordingly. The Skia Mojo
interfaces are also switched to generating the new binding style while
the ui/gfx/geometry interfaces must still generated both as a
temporary step while some code has not yet been updated.

These tests demonstrate how the DCHECK in ~MojoWatcher is invalid and
so it is removed.

Bug: 699569
Cq-Include-Trybots: master.tryserver.chromium.mac:mac_optional_gpu_tests_rel
Change-Id: Ic83ac9bd50072eae8461edc0b85cd4bcae147358
Reviewed-on: https://chromium-review.googlesource.com/560646
Commit-Queue: Reilly Grant <reillyg@chromium.org>
Reviewed-by: default avatarMiguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#485049}
parent a39d6098
...@@ -17,7 +17,4 @@ mojom("interfaces") { ...@@ -17,7 +17,4 @@ mojom("interfaces") {
"//skia/public/interfaces", "//skia/public/interfaces",
"//ui/gfx/geometry/mojo", "//ui/gfx/geometry/mojo",
] ]
# TODO(crbug.com/699569): Convert to use the new JS bindings.
use_new_js_bindings = false
} }
...@@ -9,9 +9,6 @@ mojom("interfaces") { ...@@ -9,9 +9,6 @@ mojom("interfaces") {
"bitmap.mojom", "bitmap.mojom",
"image_filter.mojom", "image_filter.mojom",
] ]
# TODO(crbug.com/699569): Convert to use the new JS bindings.
use_new_js_bindings = false
} }
mojom("test_interfaces") { mojom("test_interfaces") {
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
...@@ -9,36 +13,23 @@ ...@@ -9,36 +13,23 @@
function detectShapeForCanvas(createDetector, function detectShapeForCanvas(createDetector,
createCanvas, createCanvas,
mockReady, mock,
detectionResultTest) { detectionResultTest) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var img = new Image(); var img = new Image();
img.onload = function() { img.onload = function() {
var canvas = createCanvas();
canvas.getContext("2d").drawImage(img, 0, 0);
var canvas = createCanvas(); var detector = createDetector();
canvas.getContext("2d").drawImage(img, 0, 0); detector.detect(canvas)
.then(detectionResult => {
var theMock = null; detectionResultTest(detectionResult, mock);
mockReady() resolve("Success");
.then(mock => { }, error => {
theMock = mock; assert_unreached("Error during detect(canvas): " + error);
var detector = createDetector(); });
return detector; };
})
.catch(error => {
assert_unreached("Error creating Mock Detector: " + error);
})
.then(detector => {
return detector.detect(canvas);
})
.then(detectionResult => {
detectionResultTest(detectionResult, theMock);
resolve("Success");
})
.catch(error => {
assert_unreached("Error during detect(canvas): " + error);
});
}
img.src = "../media/content/greenbox.png"; img.src = "../media/content/greenbox.png";
}); });
...@@ -46,12 +37,12 @@ function detectShapeForCanvas(createDetector, ...@@ -46,12 +37,12 @@ function detectShapeForCanvas(createDetector,
var createTestForCanvasElement = function(createDetector, var createTestForCanvasElement = function(createDetector,
createCanvas, createCanvas,
mockReady, mock,
detectionResultTest) { detectionResultTest) {
promise_test(function() { promise_test(function() {
return detectShapeForCanvas(createDetector, return detectShapeForCanvas(createDetector,
createCanvas, createCanvas,
mockReady, mock,
detectionResultTest) detectionResultTest)
.then(function(result) { .then(function(result) {
assert_equals(result, "Success", "Detect 'Success'"); assert_equals(result, "Success", "Detect 'Success'");
...@@ -87,42 +78,42 @@ generate_tests(createTestForCanvasElement, [ ...@@ -87,42 +78,42 @@ generate_tests(createTestForCanvasElement, [
"Face - detect(HTMLCanvasElement)", "Face - detect(HTMLCanvasElement)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return document.createElement("canvas"); }, () => { return document.createElement("canvas"); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Face - detect(OffscreenCanvas)", "Face - detect(OffscreenCanvas)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return new OffscreenCanvas(300, 150); }, () => { return new OffscreenCanvas(300, 150); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(HTMLCanvasElement)", "Barcode - detect(HTMLCanvasElement)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return document.createElement("canvas"); }, () => { return document.createElement("canvas"); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(OffscreenCanvas)", "Barcode - detect(OffscreenCanvas)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return new OffscreenCanvas(300, 150); }, () => { return new OffscreenCanvas(300, 150); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Text - detect(HTMLCanvasElement)", "Text - detect(HTMLCanvasElement)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return document.createElement("canvas"); }, () => { return document.createElement("canvas"); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
], ],
[ [
"Text - detect(OffscreenCanvas)", "Text - detect(OffscreenCanvas)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return new OffscreenCanvas(300, 150); }, () => { return new OffscreenCanvas(300, 150); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
...@@ -10,32 +14,18 @@ ...@@ -10,32 +14,18 @@
</body> </body>
<script> <script>
var createTestForImageElement = function(createDetector, mockReady, var createTestForImageElement = function(createDetector, mock,
detectionResultTest) { detectionResultTest) {
async_test(function(t) { promise_test(async function() {
var img = document.getElementById("img"); var img = document.getElementById("img");
var theMock = null; var detector = createDetector();
mockReady() try {
.then(mock => { var detectionResult = await detector.detect(img);
theMock = mock; detectionResultTest(detectionResult, mock);
var detector = createDetector(); } catch(error) {
return detector; assert_unreached("Error during detect(img): " + error);
}) }
.catch(error => {
assert_unreached("Error creating Mock Detector: " + error);
})
.then(detector => {
return detector.detect(img);
})
.then(detectionResult => {
detectionResultTest(detectionResult, theMock);
t.done();
})
.catch(error => {
assert_unreached("Error during detect(img): " + error);
});
}); });
}; };
...@@ -69,19 +59,19 @@ generate_tests(createTestForImageElement, [ ...@@ -69,19 +59,19 @@ generate_tests(createTestForImageElement, [
[ [
"Face - detect(HTMLImageElement)", "Face - detect(HTMLImageElement)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(HTMLImageElement)", "Barcode - detect(HTMLImageElement)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Text - detect(HTMLImageElement)", "Text - detect(HTMLImageElement)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
<script> <script>
var createTestForVideoElement = function(createDetector, mockReady, var createTestForVideoElement = function(createDetector, mock,
detectionResultTest) { detectionResultTest) {
async_test(function(t) { async_test(function(t) {
var video = document.createElement("video"); var video = document.createElement("video");
...@@ -15,27 +19,15 @@ var createTestForVideoElement = function(createDetector, mockReady, ...@@ -15,27 +19,15 @@ var createTestForVideoElement = function(createDetector, mockReady,
video.loop = true; video.loop = true;
video.autoplay = true; video.autoplay = true;
video.onerror = this.unreached_func("<video> error"); video.onerror = this.unreached_func("<video> error");
video.onplay = this.step_func(function() { video.onplay = this.step_func(async function() {
var theMock = null; var detector = createDetector();
mockReady() try {
.then(mock => { var detectionResult = await detector.detect(video);
theMock = mock; detectionResultTest(detectionResult, mock);
var detector = createDetector(); t.done();
return detector; } catch (error) {
}) assert_unreached("Error during detect(video): " + error);
.catch(error => { }
assert_unreached("Error creating Mock Detector: " + error);
})
.then(detector => {
return detector.detect(video);
})
.then(detectionResult => {
detectionResultTest(detectionResult, theMock);
t.done();
})
.catch(error => {
assert_unreached("Error during detect(video): " + error);
});
}); });
video.load(); video.load();
...@@ -69,19 +61,19 @@ generate_tests(createTestForVideoElement, [ ...@@ -69,19 +61,19 @@ generate_tests(createTestForVideoElement, [
[ [
"Face - detect(HTMLVideoElement)", "Face - detect(HTMLVideoElement)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(HTMLVideoElement)", "Barcode - detect(HTMLVideoElement)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Text - detect(HTMLVideoElement)", "Text - detect(HTMLVideoElement)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
<script> <script>
var createTestForImageBitmap = function(createDetector, mockReady, var createTestForImageBitmap = function(createDetector, mock,
detectionResultTest) { detectionResultTest) {
async_test(function(t) { async_test(function(t) {
var img = new Image(); var img = new Image();
img.onload = function() { img.onload = async function() {
var theImageBitmap = null; var imageBitmap = await createImageBitmap(img);
var theMock = null; var detector = createDetector();
createImageBitmap(img) try {
.then(imageBitmap => { var detectionResult = await detector.detect(imageBitmap);
theImageBitmap = imageBitmap; detectionResultTest(detectionResult, mock);
return mockReady(); t.done();
}) } catch (error) {
.catch(error => { assert_unreached("Error during detect(img): " + error);
assert_unreached("createImageBitmap() error: " + error); }
})
.then(mock => {
theMock = mock;
var detector = createDetector();
return detector;
})
.catch(error => {
assert_unreached("Error creating Mock Detector: " + error);
})
.then(detector => {
return detector.detect(theImageBitmap);
})
.then(detectionResult => {
detectionResultTest(detectionResult, theMock);
t.done();
})
.catch(error => {
assert_unreached("Error during detect(img): " + error);
});
} }
img.src = "../media/content/greenbox.png"; img.src = "../media/content/greenbox.png";
}); });
...@@ -73,19 +58,19 @@ generate_tests(createTestForImageBitmap, [ ...@@ -73,19 +58,19 @@ generate_tests(createTestForImageBitmap, [
[ [
"Face - detect(ImageBitmap)", "Face - detect(ImageBitmap)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(ImageBitmap)", "Barcode - detect(ImageBitmap)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Text - detect(ImageBitmap)", "Text - detect(ImageBitmap)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
<script> <script>
var createTestForImageData = function(createDetector, mockReady, var createTestForImageData = function(createDetector, mock,
detectionResultTest) { detectionResultTest) {
async_test(function(t) { async_test(async function(t) {
var img = new Image(); var img = new Image();
img.onload = function() { img.onload = async function() {
var canvas = document.createElement("canvas");; var canvas = document.createElement("canvas");;
canvas.getContext("2d").drawImage(img, 0, 0); canvas.getContext("2d").drawImage(img, 0, 0);
var theMock = null; var detector = createDetector();
mockReady() try {
.then(mock => { var detectionResult = await detector.detect(canvas.getContext("2d")
theMock = mock; .getImageData(0, 0, canvas.width, canvas.height));
var detector = createDetector(); detectionResultTest(detectionResult, mock);
return detector; t.done();
}) } catch (error) {
.catch(error => { assert_unreached("Error during detect(canvas): " + error);
assert_unreached("Error creating Mock Detector: " + error); }
})
.then(detector => {
return detector.detect(canvas.getContext("2d").getImageData(
0, 0, canvas.width, canvas.height));
})
.then(detectionResult => {
detectionResultTest(detectionResult, theMock);
t.done();
})
.catch(error => {
assert_unreached("Error during detect(canvas): " + error);
});
} }
img.src = "../media/content/greenbox.png"; img.src = "../media/content/greenbox.png";
...@@ -70,19 +62,19 @@ generate_tests(createTestForImageData, [ ...@@ -70,19 +62,19 @@ generate_tests(createTestForImageData, [
[ [
"Face - detect(ImageData)", "Face - detect(ImageData)",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
FaceDetectorDetectionResultTest FaceDetectorDetectionResultTest
], ],
[ [
"Barcode - detect(ImageData)", "Barcode - detect(ImageData)",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
BarcodeDetectorDetectionResultTest BarcodeDetectorDetectionResultTest
], ],
[ [
"Text - detect(ImageData)", "Text - detect(ImageData)",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return mockTextDetectionReady; }, mockTextDetection,
TextDetectorDetectionResultTest TextDetectorDetectionResultTest
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script>
<script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script>
<script> <script>
// ImageBitmap is of transferable type and can be sent to and tested on worker. // ImageBitmap is of transferable type and can be sent to and tested on worker.
var createTestForImageBitmap = function(detectorType, mockReady, var createTestForImageBitmap = function(detectorType, resultSize) {
resultSize) {
async_test(function(t) { async_test(function(t) {
var img = new Image(); let img = new Image();
img.onload = function() { img.onload = async function() {
var theImageBitmap = null; let theImageBitmap = await createImageBitmap(img);
var theMock = null; let worker = new Worker("resources/worker.js");
worker.postMessage({
createImageBitmap(img) detectorType: detectorType,
.then(imageBitmap => { bitmap: theImageBitmap,
theImageBitmap = imageBitmap; expectedLength: resultSize
return mockReady(); }, [theImageBitmap]);
}) worker.onmessage = function(e) {
.catch(error => { if(e.data=="PASS")
assert_unreached("createImageBitmap() error: " + error); t.done();
}) }
.then(mock => {
theMock = mock;
return new Worker("resources/worker.js");
})
.catch(error => {
assert_unreached("Error creating Mock: " + error);
})
.then(worker => {
worker.postMessage({
detectorType: detectorType,
bitmap: theImageBitmap,
expectedLength: resultSize
}, [theImageBitmap]);
worker.onmessage = function(e) {
if(e.data=="PASS")
t.done();
}
})
.catch(error => {
assert_unreached("Error creating detector: " + error);
});
} }
img.src = "../media/content/greenbox.png"; img.src = "../media/content/greenbox.png";
}, detectorType + "Detector detect(ImageBitmap) on worker"); }, detectorType + "Detector detect(ImageBitmap) on worker");
...@@ -57,19 +31,16 @@ generate_tests(createTestForImageBitmap, [ ...@@ -57,19 +31,16 @@ generate_tests(createTestForImageBitmap, [
[ [
"Face", "Face",
"Face", "Face",
() => { return mockFaceDetectionProviderReady; },
3 // Number of faces 3 // Number of faces
], ],
[ [
"Barcode", "Barcode",
"Barcode", "Barcode",
() => { return mockBarcodeDetectionReady; },
2 // Number of barcodes 2 // Number of barcodes
], ],
[ [
"Text", "Text",
"Text", "Text",
() => { return mockTextDetectionReady; },
2 // Number of text blocks 2 // Number of text blocks
] ]
]); ]);
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<body> <body>
<img id="img" src="../media/content/greenbox.png"/> <img id="img" src="../media/content/greenbox.png"/>
</body> </body>
<script> <script>
async_test(function(t) { promise_test(async function() {
var img = document.getElementById("img"); var img = document.getElementById("img");
var theMock = null; var mock = mockFaceDetectionProvider;
mockFaceDetectionProviderReady
.then(mock => { var detectorWithDefault = new FaceDetector();
theMock = mock; var faceDetectionResult = await detectorWithDefault.detect(img);
return new FaceDetector(); assert_equals(mock.getMaxDetectedFaces(), 10, "default maxDetectedFaces");
}) assert_equals(mock.getFastMode(), false, "default maxDetectedFaces");
.catch(error => {
assert_unreached("Error creating MockShapeDetection: " + error); var detectorWithOptions =
}) new FaceDetector({maxDetectedFaces: 7, fastMode: true});
.then(detectorWithDefault => detectorWithDefault.detect(img)) faceDetectionResult = await detectorWithOptions.detect(img);
.then(t.step_func(faceDetectionResult => { assert_equals(mock.getMaxDetectedFaces(), 7, "maxDetectedFaces");
assert_equals(theMock.getMaxDetectedFaces(), 10, "default maxDetectedFaces"); assert_equals(mock.getFastMode(), true, "maxDetectedFaces");
assert_equals(theMock.getFastMode(), false, "default maxDetectedFaces");
return new FaceDetector({maxDetectedFaces: 7, fastMode: true});
}))
.then(detectorWithOptions => detectorWithOptions.detect(img))
.then(t.step_func(faceDetectionResult => {
assert_equals(theMock.getMaxDetectedFaces(), 7, "maxDetectedFaces");
assert_equals(theMock.getFastMode(), true, "maxDetectedFaces");
t.done();
}))
.catch(error => {
assert_unreached("Error creating detectors: " + error);
});
}, "Test that FaceDetectionOptions are correctly propagated"); }, "Test that FaceDetectionOptions are correctly propagated");
</script> </script>
<!DOCTYPE html> <!DOCTYPE html>
<script src=../resources/testharness.js></script> <script src=../resources/testharness.js></script>
<script src=../resources/testharnessreport.js></script> <script src=../resources/testharnessreport.js></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script>
<script> <script>
// Returns a Promise that is resolve()d if detect() is rejected. Needs an input // Returns a Promise that is resolve()d if detect() is rejected. Needs an input
// |element| (e.g. an HTMLImageElement or HTMLVideoElement) and a |url| to load. // |element| (e.g. an HTMLImageElement or HTMLVideoElement) and a |url| to load.
function detectOnElementAndExpectError(createDetector, element, url) { function detectOnElementAndExpectError(createDetector, element, url) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var tryDetection = function() { var tryDetection = async function() {
var theMock = null; var detector = createDetector();
mockFaceDetectionProviderReady try {
.then(mock => { var detectionResult = await detector.detect(element);
return createDetector(); reject("Promise should have been rejected.");
}) } catch (error) {
.then(detector => { resolve(error);
return detector.detect(element); }
})
.then(detectionResult => {
reject("Promise should have been rejected.");
})
.catch(error => {
resolve(error);
});
}; };
element.onload = tryDetection; element.onload = tryDetection;
element.onerror = tryDetection; element.onerror = tryDetection;
......
<!DOCTYPE html> <!DOCTYPE html>
<script src="../resources/testharness.js"></script> <script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script> <script src="../resources/testharnessreport.js"></script>
<script src="../resources/mojo-helpers.js"></script> <script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script> <script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script> <script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script> <script src="resources/mock-textdetection.js"></script>
<script> <script>
var createTestForImageData = function(createDetector, mockReady, var createTestForImageData = function(createDetector, mock,
detectionResultTest) { detectionResultTest) {
async_test(function(t) { async_test(function(t) {
var img = new Image(); var img = new Image();
img.onload = function() { img.onload = async function() {
var canvas = document.createElement("canvas");; var canvas = document.createElement("canvas");;
canvas.getContext("2d").drawImage(img, 0, 0); canvas.getContext("2d").drawImage(img, 0, 0);
var theMock = null; var detector = createDetector();
mockReady() try {
.then(mock => { var detectionResult = await detector.detect(canvas.getContext("2d")
theMock = mock; .getImageData(0, 0, canvas.width, canvas.height));
var detector = createDetector(); detectionResultTest(detectionResult);
return detector; t.done();
}) } catch(error) {
.catch(error => { assert_unreached("Error during detect(canvas): " + error);
assert_unreached("Error creating Mock Detector: " + error); }
})
.then(detector => {
return detector.detect(canvas.getContext("2d").getImageData(
0, 0, canvas.width, canvas.height));
})
.then(detectionResult => {
detectionResultTest(detectionResult);
t.done();
})
.catch(error => {
assert_unreached("Error during detect(canvas): " + error);
});
} }
img.src = "../media/content/greenbox.png"; img.src = "../media/content/greenbox.png";
...@@ -69,19 +61,19 @@ generate_tests(createTestForImageData, [ ...@@ -69,19 +61,19 @@ generate_tests(createTestForImageData, [
[ [
"Face - detect(ImageData), [SameObject]", "Face - detect(ImageData), [SameObject]",
() => { return new FaceDetector(); }, () => { return new FaceDetector(); },
() => { return mockFaceDetectionProviderReady; }, mockFaceDetectionProvider,
CheckDetectedFaceSameObjects CheckDetectedFaceSameObjects
], ],
[ [
"Barcode - detect(ImageData), [SameObject]", "Barcode - detect(ImageData), [SameObject]",
() => { return new BarcodeDetector(); }, () => { return new BarcodeDetector(); },
() => { return mockBarcodeDetectionReady; }, mockBarcodeDetection,
CheckDetectedBarcodesSameObjects CheckDetectedBarcodesSameObjects
], ],
[ [
"Text - detect(ImageData), [SameObject]", "Text - detect(ImageData), [SameObject]",
() => { return new TextDetector(); }, () => { return new TextDetector(); },
() => { return mockTextDetectionReady; }, mockTextDetection,
CheckDetectedTextBlocksSameObjects CheckDetectedTextBlocksSameObjects
] ]
]); ]);
......
"use strict"; "use strict";
let mockBarcodeDetectionReady = define( class MockBarcodeDetection {
'mockBarcodeDetection', constructor() {
['services/shape_detection/public/interfaces/barcodedetection.mojom', this.bindingSet_ = new mojo.BindingSet(
'mojo/public/js/bindings', shapeDetection.mojom.BarcodeDetection);
'mojo/public/js/core',
'content/public/renderer/frame_interfaces',
'content/public/renderer/interfaces',
], (barcodeDetection, bindings, mojo, frameInterfaces, processInterfaces) => {
class MockBarcodeDetection { this.interceptor_ = new MojoInterfaceInterceptor(
constructor() { shapeDetection.mojom.BarcodeDetection.name);
this.bindingSet_ = new bindings.BindingSet( this.interceptor_.oninterfacerequest =
barcodeDetection.BarcodeDetection); e => this.bindingSet_.addBinding(this, e.handle);
this.interceptor_.start();
frameInterfaces.addInterfaceOverrideForTesting( }
barcodeDetection.BarcodeDetection.name,
handle => this.bindingSet_.addBinding(this, handle));
processInterfaces.addInterfaceOverrideForTesting(
barcodeDetection.BarcodeDetection.name,
handle => this.bindingSet_.addBinding(this, handle));
}
detect(bitmap_data) { detect(bitmap_data) {
let receivedStruct = new Uint8Array(bitmap_data.pixel_data); let receivedStruct = new Uint8Array(bitmap_data.pixel_data);
this.buffer_data_ = new Uint32Array(receivedStruct.buffer); this.buffer_data_ = new Uint32Array(receivedStruct.buffer);
return Promise.resolve({ return Promise.resolve({
results: [ results: [
{ {
raw_value : "cats", rawValue : "cats",
bounding_box: { x: 1.0, y: 1.0, width: 100.0, height: 100.0 }, boundingBox: { x: 1.0, y: 1.0, width: 100.0, height: 100.0 },
corner_points: [ cornerPoints: [
{ x: 1.0, y: 1.0 }, { x: 1.0, y: 1.0 },
{ x: 101.0, y: 1.0 }, { x: 101.0, y: 1.0 },
{ x: 101.0, y: 101.0 }, { x: 101.0, y: 101.0 },
{ x: 1.0, y: 101.0 } { x: 1.0, y: 101.0 }
], ],
}, },
{ {
raw_value : "dogs", rawValue : "dogs",
bounding_box: { x: 2.0, y: 2.0, width: 50.0, height: 50.0 }, boundingBox: { x: 2.0, y: 2.0, width: 50.0, height: 50.0 },
corner_points: [ cornerPoints: [
{ x: 2.0, y: 2.0 }, { x: 2.0, y: 2.0 },
{ x: 52.0, y: 2.0 }, { x: 52.0, y: 2.0 },
{ x: 52.0, y: 52.0 }, { x: 52.0, y: 52.0 },
{ x: 2.0, y: 52.0 } { x: 2.0, y: 52.0 }
], ],
}, },
], ],
}); });
} }
getFrameData() { getFrameData() {
return this.buffer_data_; return this.buffer_data_;
}
} }
return new MockBarcodeDetection(); }
});
let mockBarcodeDetection = new MockBarcodeDetection();
"use strict"; "use strict";
let mockFaceDetectionProviderReady = define( class MockFaceDetectionProvider {
'mockFaceDetectionProvider', constructor() {
['services/shape_detection/public/interfaces/facedetection.mojom', this.bindingSet_ = new mojo.BindingSet(
'services/shape_detection/public/interfaces/facedetection_provider.mojom', shapeDetection.mojom.FaceDetectionProvider);
'mojo/public/js/bindings',
'mojo/public/js/core',
'content/public/renderer/frame_interfaces',
'content/public/renderer/interfaces',
], (faceDetection, faceDetectionProvider, bindings, mojo, frameInterfaces,
processInterfaces) => {
class MockFaceDetectionProvider { this.interceptor_ = new MojoInterfaceInterceptor(
constructor() { shapeDetection.mojom.FaceDetectionProvider.name);
this.bindingSet_ = new bindings.BindingSet( this.interceptor_.oninterfacerequest =
faceDetectionProvider.FaceDetectionProvider); e => this.bindingSet_.addBinding(this, e.handle);
this.interceptor_.start();
frameInterfaces.addInterfaceOverrideForTesting( }
faceDetectionProvider.FaceDetectionProvider.name,
handle => this.bindingSet_.addBinding(this, handle));
processInterfaces.addInterfaceOverrideForTesting(
faceDetectionProvider.FaceDetectionProvider.name,
handle => this.bindingSet_.addBinding(this, handle));
}
createFaceDetection(request, options) { createFaceDetection(request, options) {
this.mockService_ = new MockFaceDetection(request, options); this.mockService_ = new MockFaceDetection(request, options);
} }
getFrameData() { getFrameData() {
return this.mockService_.bufferData_; return this.mockService_.bufferData_;
} }
getMaxDetectedFaces() { getMaxDetectedFaces() {
return this.mockService_.maxDetectedFaces_; return this.mockService_.maxDetectedFaces_;
} }
getFastMode () { getFastMode () {
return this.mockService_.fastMode_; return this.mockService_.fastMode_;
}
} }
}
class MockFaceDetection { class MockFaceDetection {
constructor(request, options) { constructor(request, options) {
this.maxDetectedFaces_ = options.max_detected_faces; this.maxDetectedFaces_ = options.maxDetectedFaces;
this.fastMode_ = options.fast_mode; this.fastMode_ = options.fastMode;
this.binding_ = new bindings.Binding(faceDetection.FaceDetection, this, this.binding_ =
request); new mojo.Binding(shapeDetection.mojom.FaceDetection, this, request);
} }
detect(bitmap_data) { detect(bitmap_data) {
let receivedStruct = new Uint8Array(bitmap_data.pixel_data); let receivedStruct = new Uint8Array(bitmap_data.pixelData);
this.bufferData_ = new Uint32Array(receivedStruct.buffer); this.bufferData_ = new Uint32Array(receivedStruct.buffer);
return Promise.resolve({ return Promise.resolve({
results: [ results: [
{ {
bounding_box: {x: 1.0, y: 1.0, width: 100.0, height: 100.0}, boundingBox: {x: 1.0, y: 1.0, width: 100.0, height: 100.0},
landmarks: [{ landmarks: [{
type: faceDetection.LandmarkType.EYE, type: shapeDetection.mojom.LandmarkType.EYE,
location: {x: 4.0, y: 5.0} location: {x: 4.0, y: 5.0}
}] }]
}, },
{ {
bounding_box: {x: 2.0, y: 2.0, width: 200.0, height: 200.0}, boundingBox: {x: 2.0, y: 2.0, width: 200.0, height: 200.0},
landmarks: [] landmarks: []
}, },
{ {
bounding_box: {x: 3.0, y: 3.0, width: 300.0, height: 300.0}, boundingBox: {x: 3.0, y: 3.0, width: 300.0, height: 300.0},
landmarks: [] landmarks: []
}, },
] ]
}); });
}
} }
return new MockFaceDetectionProvider(); }
});
let mockFaceDetectionProvider = new MockFaceDetectionProvider();
"use strict"; "use strict";
let mockTextDetectionReady = define( class MockTextDetection {
'mockTextDetection', constructor() {
['services/shape_detection/public/interfaces/textdetection.mojom', this.bindingSet_ =
'mojo/public/js/bindings', new mojo.BindingSet(shapeDetection.mojom.TextDetection);
'mojo/public/js/core',
'content/public/renderer/frame_interfaces',
'content/public/renderer/interfaces',
], (textDetection, bindings, mojo, frameInterfaces, processInterfaces) => {
class MockTextDetection { this.interceptor_ = new MojoInterfaceInterceptor(
constructor() { shapeDetection.mojom.TextDetection.name);
this.bindingSet_ = new bindings.BindingSet(textDetection.TextDetection); this.interceptor_.oninterfacerequest =
e => this.bindingSet_.addBinding(this, e.handle);
frameInterfaces.addInterfaceOverrideForTesting( this.interceptor_.start();
textDetection.TextDetection.name, }
handle => this.bindingSet_.addBinding(this, handle));
processInterfaces.addInterfaceOverrideForTesting(
textDetection.TextDetection.name,
handle => this.bindingSet_.addBinding(this, handle));
}
detect(bitmap_data) { detect(bitmap_data) {
let receivedStruct = new Uint8Array(bitmap_data.pixel_data); let receivedStruct = new Uint8Array(bitmap_data.pixel_data);
this.buffer_data_ = new Uint32Array(receivedStruct.buffer); this.buffer_data_ = new Uint32Array(receivedStruct.buffer);
return Promise.resolve({ return Promise.resolve({
results: [ results: [
{ {
raw_value : "cats", rawValue : "cats",
bounding_box: { x: 1.0, y: 1.0, width: 100.0, height: 100.0 } boundingBox: { x: 1.0, y: 1.0, width: 100.0, height: 100.0 }
}, },
{ {
raw_value : "dogs", rawValue : "dogs",
bounding_box: { x: 2.0, y: 2.0, width: 50.0, height: 50.0 } boundingBox: { x: 2.0, y: 2.0, width: 50.0, height: 50.0 }
}, },
], ],
}); });
} }
getFrameData() { getFrameData() {
return this.buffer_data_; return this.buffer_data_;
}
} }
return new MockTextDetection(); }
});
let mockTextDetection = new MockTextDetection();
importScripts("../../resources/testharness.js"); importScripts("../../resources/testharness.js");
importScripts("file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js");
importScripts("file:///gen/skia/public/interfaces/bitmap.mojom.js");
importScripts("file:///gen/ui/gfx/geometry/mojo/geometry.mojom.js");
importScripts("file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js");
importScripts("file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js");
importScripts("file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js");
importScripts("file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js");
importScripts("mock-barcodedetection.js");
importScripts("mock-facedetection.js");
importScripts("mock-textdetection.js");
onmessage = function(e) { onmessage = async function(e) {
var detector; let detector;
switch (e.data.detectorType) { switch (e.data.detectorType) {
case "Face": detector = new FaceDetector(); break; case "Face": detector = new FaceDetector(); break;
case "Barcode": detector = new BarcodeDetector(); break; case "Barcode": detector = new BarcodeDetector(); break;
case "Text": detector = new TextDetector(); break; case "Text": detector = new TextDetector(); break;
} }
var imageBitmap = e.data.bitmap; let imageBitmap = e.data.bitmap;
detector.detect(imageBitmap) try {
.then(detectionResult => { let detectionResult = await detector.detect(imageBitmap);
assert_equals(detectionResult.length, e.data.expectedLength, assert_equals(detectionResult.length, e.data.expectedLength,
"Number of " + e.data.detectorType); "Number of " + e.data.detectorType);
postMessage("PASS"); postMessage("PASS");
}) } catch (error) {
.catch(error => { assert_unreached("Error during detect(img): " + error);
assert_unreached("Error during detect(img): " + error); }
});
} }
...@@ -43,9 +43,7 @@ MojoWatcher* MojoWatcher::Create(mojo::Handle handle, ...@@ -43,9 +43,7 @@ MojoWatcher* MojoWatcher::Create(mojo::Handle handle,
return watcher; return watcher;
} }
MojoWatcher::~MojoWatcher() { MojoWatcher::~MojoWatcher() {}
DCHECK(!handle_.is_valid());
}
MojoResult MojoWatcher::cancel() { MojoResult MojoWatcher::cancel() {
if (!watcher_handle_.is_valid()) if (!watcher_handle_.is_valid())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment