OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/shapedetection/ShapeDetector.h" | 5 #include "modules/shapedetection/ShapeDetector.h" |
6 | 6 |
7 #include "core/dom/DOMException.h" | 7 #include "core/dom/DOMException.h" |
8 #include "core/dom/DOMRect.h" | 8 #include "core/dom/DOMRect.h" |
9 #include "core/dom/Document.h" | 9 #include "core/dom/Document.h" |
10 #include "core/frame/ImageBitmap.h" | 10 #include "core/frame/ImageBitmap.h" |
11 #include "core/frame/LocalFrame.h" | 11 #include "core/frame/LocalFrame.h" |
12 #include "core/html/HTMLImageElement.h" | 12 #include "core/html/HTMLImageElement.h" |
13 #include "core/html/HTMLVideoElement.h" | 13 #include "core/html/HTMLVideoElement.h" |
14 #include "core/html/canvas/CanvasImageSource.h" | 14 #include "core/html/ImageData.h" |
15 #include "core/loader/resource/ImageResourceContent.h" | 15 #include "core/loader/resource/ImageResourceContent.h" |
16 #include "platform/graphics/Image.h" | 16 #include "platform/graphics/Image.h" |
17 #include "third_party/skia/include/core/SkImage.h" | 17 #include "third_party/skia/include/core/SkImage.h" |
18 #include "third_party/skia/include/core/SkImageInfo.h" | 18 #include "third_party/skia/include/core/SkImageInfo.h" |
19 #include "wtf/CheckedNumeric.h" | 19 #include "wtf/CheckedNumeric.h" |
20 | 20 |
21 namespace blink { | 21 namespace blink { |
22 | 22 |
23 namespace { | 23 namespace { |
24 | 24 |
(...skipping 21 matching lines...) Expand all Loading... |
46 return sharedBufferHandle; | 46 return sharedBufferHandle; |
47 } | 47 } |
48 | 48 |
49 } // anonymous namespace | 49 } // anonymous namespace |
50 | 50 |
51 ShapeDetector::ShapeDetector(LocalFrame& frame) { | 51 ShapeDetector::ShapeDetector(LocalFrame& frame) { |
52 DCHECK(frame.interfaceProvider()); | 52 DCHECK(frame.interfaceProvider()); |
53 } | 53 } |
54 | 54 |
55 ScriptPromise ShapeDetector::detect(ScriptState* scriptState, | 55 ScriptPromise ShapeDetector::detect(ScriptState* scriptState, |
56 const CanvasImageSourceUnion& imageSource) { | 56 const ImageBitmapSourceUnion& imageSource) { |
57 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); | 57 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
58 ScriptPromise promise = resolver->promise(); | 58 ScriptPromise promise = resolver->promise(); |
59 | 59 |
| 60 // ImageDatas cannot be tainted by definition. |
| 61 if (imageSource.isImageData()) |
| 62 return detectShapesOnImageData(resolver, imageSource.getAsImageData()); |
| 63 |
60 CanvasImageSource* canvasImageSource; | 64 CanvasImageSource* canvasImageSource; |
61 if (imageSource.isHTMLImageElement()) { | 65 if (imageSource.isHTMLImageElement()) { |
62 canvasImageSource = imageSource.getAsHTMLImageElement(); | 66 canvasImageSource = imageSource.getAsHTMLImageElement(); |
63 } else if (imageSource.isImageBitmap()) { | 67 } else if (imageSource.isImageBitmap()) { |
64 canvasImageSource = imageSource.getAsImageBitmap(); | 68 canvasImageSource = imageSource.getAsImageBitmap(); |
65 } else if (imageSource.isHTMLVideoElement()) { | 69 } else if (imageSource.isHTMLVideoElement()) { |
66 canvasImageSource = imageSource.getAsHTMLVideoElement(); | 70 canvasImageSource = imageSource.getAsHTMLVideoElement(); |
67 } else if (imageSource.isHTMLCanvasElement()) { | 71 } else if (imageSource.isHTMLCanvasElement()) { |
68 canvasImageSource = imageSource.getAsHTMLCanvasElement(); | 72 canvasImageSource = imageSource.getAsHTMLCanvasElement(); |
69 } else if (imageSource.isOffscreenCanvas()) { | 73 } else if (imageSource.isOffscreenCanvas()) { |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 | 138 |
135 mojo::ScopedSharedBufferHandle sharedBufferHandle = getSharedBufferOnData( | 139 mojo::ScopedSharedBufferHandle sharedBufferHandle = getSharedBufferOnData( |
136 resolver, pixelDataPtr, allocationSize.ValueOrDefault(0)); | 140 resolver, pixelDataPtr, allocationSize.ValueOrDefault(0)); |
137 if (!sharedBufferHandle->is_valid()) | 141 if (!sharedBufferHandle->is_valid()) |
138 return promise; | 142 return promise; |
139 | 143 |
140 return doDetect(resolver, std::move(sharedBufferHandle), image->width(), | 144 return doDetect(resolver, std::move(sharedBufferHandle), image->width(), |
141 image->height()); | 145 image->height()); |
142 } | 146 } |
143 | 147 |
| 148 ScriptPromise ShapeDetector::detectShapesOnImageData( |
| 149 ScriptPromiseResolver* resolver, |
| 150 ImageData* imageData) { |
| 151 ScriptPromise promise = resolver->promise(); |
| 152 |
| 153 uint8_t* const data = imageData->data()->data(); |
| 154 WTF::CheckedNumeric<int> allocationSize = imageData->size().area() * 4; |
| 155 |
| 156 mojo::ScopedSharedBufferHandle sharedBufferHandle = |
| 157 getSharedBufferOnData(resolver, data, allocationSize.ValueOrDefault(0)); |
| 158 if (!sharedBufferHandle->is_valid()) |
| 159 return promise; |
| 160 |
| 161 return doDetect(resolver, std::move(sharedBufferHandle), imageData->width(), |
| 162 imageData->height()); |
| 163 } |
| 164 |
144 ScriptPromise ShapeDetector::detectShapesOnImageElement( | 165 ScriptPromise ShapeDetector::detectShapesOnImageElement( |
145 ScriptPromiseResolver* resolver, | 166 ScriptPromiseResolver* resolver, |
146 const HTMLImageElement* img) { | 167 const HTMLImageElement* img) { |
147 ScriptPromise promise = resolver->promise(); | 168 ScriptPromise promise = resolver->promise(); |
148 | 169 |
| 170 // TODO(mcasas): reconsider this resolve(), https://crbug.com/674306. |
149 if (img->bitmapSourceSize().isZero()) { | 171 if (img->bitmapSourceSize().isZero()) { |
150 resolver->resolve(HeapVector<Member<DOMRect>>()); | 172 resolver->resolve(HeapVector<Member<DOMRect>>()); |
151 return promise; | 173 return promise; |
152 } | 174 } |
153 | 175 |
154 ImageResourceContent* const imageResource = img->cachedImage(); | 176 ImageResourceContent* const imageResource = img->cachedImage(); |
155 if (!imageResource || imageResource->errorOccurred()) { | 177 if (!imageResource || imageResource->errorOccurred()) { |
156 resolver->reject(DOMException::create( | 178 resolver->reject(DOMException::create( |
157 InvalidStateError, "Failed to load or decode HTMLImageElement.")); | 179 InvalidStateError, "Failed to load or decode HTMLImageElement.")); |
158 return promise; | 180 return promise; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 InvalidStateError, | 226 InvalidStateError, |
205 "Failed to read pixels: Unable to decompress or unsupported format.")); | 227 "Failed to read pixels: Unable to decompress or unsupported format.")); |
206 return promise; | 228 return promise; |
207 } | 229 } |
208 | 230 |
209 return doDetect(resolver, std::move(sharedBufferHandle), img->naturalWidth(), | 231 return doDetect(resolver, std::move(sharedBufferHandle), img->naturalWidth(), |
210 img->naturalHeight()); | 232 img->naturalHeight()); |
211 } | 233 } |
212 | 234 |
213 } // namespace blink | 235 } // namespace blink |
OLD | NEW |