| Index: third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
|
| diff --git a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
|
| index bb969d71c63d44b04e7969fcfa5c55999071a146..7ad81a6bf0ec83d632043f08af84645e0bd0a8a9 100644
|
| --- a/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
|
| +++ b/third_party/WebKit/Source/modules/shapedetection/FaceDetector.cpp
|
| @@ -21,16 +21,20 @@ namespace blink {
|
| namespace {
|
|
|
| mojo::ScopedSharedBufferHandle getSharedBufferHandle(
|
| - const HTMLImageElement* img) {
|
| + const HTMLImageElement* img,
|
| + ScriptPromiseResolver* resolver) {
|
| ImageResource* const imageResource = img->cachedImage();
|
| - if (!imageResource) {
|
| - DLOG(ERROR) << "Failed to convert HTMLImageElement to ImageSource.";
|
| + // TODO(xianglu): Add test case for undecodable images.
|
| + if (!imageResource || imageResource->errorOccurred()) {
|
| + resolver->reject(DOMException::create(
|
| + InvalidStateError, "Failed to load or decode HTMLImageElement."));
|
| return mojo::ScopedSharedBufferHandle();
|
| }
|
|
|
| Image* const blinkImage = imageResource->getImage();
|
| if (!blinkImage) {
|
| - DLOG(ERROR) << "Failed to convert ImageSource to blink::Image.";
|
| + resolver->reject(DOMException::create(
|
| + InvalidStateError, "Failed to get image from resource."));
|
| return mojo::ScopedSharedBufferHandle();
|
| }
|
|
|
| @@ -39,7 +43,8 @@ mojo::ScopedSharedBufferHandle getSharedBufferHandle(
|
| DCHECK_EQ(img->naturalHeight(), image->height());
|
|
|
| if (!image) {
|
| - DLOG(ERROR) << "Failed to convert blink::Image to sk_sp<SkImage>.";
|
| + resolver->reject(DOMException::create(
|
| + InvalidStateError, "Failed to get image from current frame."));
|
| return mojo::ScopedSharedBufferHandle();
|
| }
|
|
|
| @@ -51,9 +56,13 @@ mojo::ScopedSharedBufferHandle getSharedBufferHandle(
|
| mojo::ScopedSharedBufferHandle sharedBufferHandle =
|
| mojo::SharedBufferHandle::Create(allocationSize);
|
| if (!sharedBufferHandle.is_valid()) {
|
| - // TODO(xianglu): Do something when the image is too large.
|
| - DLOG(ERROR) << "Failed to create a sharedBufferHandle. allocationSize = "
|
| - << allocationSize << "bytes. limit = 16777216";
|
| + DLOG(ERROR) << "Requested allocation : " << allocationSize
|
| + << "B, larger than |mojo::edk::kMaxSharedBufferSize| == 16MB ";
|
| + // TODO(xianglu): For now we reject the promise if the image is too large.
|
| + // But consider resizing the image to remove restriction on the user side.
|
| + // Also, add layouttest for this case later.
|
| + resolver->reject(
|
| + DOMException::create(InvalidStateError, "Image exceeds size limit."));
|
| return mojo::ScopedSharedBufferHandle();
|
| }
|
|
|
| @@ -62,7 +71,9 @@ mojo::ScopedSharedBufferHandle getSharedBufferHandle(
|
|
|
| const SkPixmap pixmap(skiaInfo, mappedBuffer.get(), skiaInfo.minRowBytes());
|
| if (!image->readPixels(pixmap, 0, 0)) {
|
| - DLOG(ERROR) << "Failed to read pixels from sk_sp<SkImage>.";
|
| + resolver->reject(DOMException::create(
|
| + InvalidStateError,
|
| + "Failed to read pixels: Unable to decompress or unsupported format."));
|
| return mojo::ScopedSharedBufferHandle();
|
| }
|
|
|
| @@ -86,25 +97,28 @@ ScriptPromise FaceDetector::detect(ScriptState* scriptState,
|
| ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| ScriptPromise promise = resolver->promise();
|
|
|
| - if (!m_service) {
|
| + // TODO(xianglu): Add test cases for cross-origin-images.
|
| + if (img->wouldTaintOrigin(
|
| + scriptState->getExecutionContext()->getSecurityOrigin())) {
|
| resolver->reject(DOMException::create(
|
| - NotFoundError, "Face detection service unavailable."));
|
| + SecurityError, "Image source from a different origin."));
|
| return promise;
|
| }
|
|
|
| - if (!img) {
|
| - resolver->reject(DOMException::create(
|
| - SyntaxError, "The provided HTMLImageElement is empty."));
|
| + if (img->bitmapSourceSize().isZero()) {
|
| + resolver->reject(
|
| + DOMException::create(InvalidStateError, "HTMLImageElement is empty."));
|
| return promise;
|
| }
|
|
|
| - // TODO(xianglu): Add security check when the spec is ready.
|
| - // https://crbug.com/646083
|
| mojo::ScopedSharedBufferHandle sharedBufferHandle =
|
| - getSharedBufferHandle(img);
|
| - if (!sharedBufferHandle->is_valid()) {
|
| + getSharedBufferHandle(img, resolver);
|
| + if (!sharedBufferHandle->is_valid())
|
| + return promise;
|
| +
|
| + if (!m_service) {
|
| resolver->reject(DOMException::create(
|
| - SyntaxError, "Request for sharedBufferHandle failed."));
|
| + NotSupportedError, "Face detection service unavailable."));
|
| return promise;
|
| }
|
|
|
|
|