| Index: third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
|
| diff --git a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
|
| index 816d7e968fb6a8d98423feab9b38795546a49659..4a76b803e2834e17aba2ee6c6246523b8c87e63b 100644
|
| --- a/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
|
| +++ b/third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp
|
| @@ -5,12 +5,17 @@
|
| #include "core/offscreencanvas/OffscreenCanvas.h"
|
|
|
| #include "core/dom/ExceptionCode.h"
|
| +#include "core/fileapi/Blob.h"
|
| +#include "core/html/ImageData.h"
|
| +#include "core/html/canvas/CanvasAsyncBlobCreator.h"
|
| #include "core/html/canvas/CanvasContextCreationAttributes.h"
|
| #include "core/html/canvas/CanvasRenderingContext.h"
|
| #include "core/html/canvas/CanvasRenderingContextFactory.h"
|
| #include "platform/graphics/Image.h"
|
| #include "platform/graphics/ImageBuffer.h"
|
| #include "platform/graphics/OffscreenCanvasFrameDispatcherImpl.h"
|
| +#include "platform/graphics/StaticBitmapImage.h"
|
| +#include "platform/image-encoders/ImageEncoderUtils.h"
|
| #include "wtf/MathExtras.h"
|
| #include <memory>
|
|
|
| @@ -183,6 +188,53 @@ OffscreenCanvasFrameDispatcher* OffscreenCanvas::getOrCreateFrameDispatcher() {
|
| return m_frameDispatcher.get();
|
| }
|
|
|
| +ScriptPromise OffscreenCanvas::convertToBlob(ScriptState* scriptState,
|
| + const ImageEncodeOptions& options,
|
| + ExceptionState& exceptionState) {
|
| + if (this->isNeutered()) {
|
| + exceptionState.throwDOMException(InvalidStateError,
|
| + "OffscreenCanvas object is detached.");
|
| + return exceptionState.reject(scriptState);
|
| + }
|
| +
|
| + if (!this->originClean()) {
|
| + exceptionState.throwSecurityError(
|
| + "Tainted OffscreenCanvas may not be exported.");
|
| + return exceptionState.reject(scriptState);
|
| + }
|
| +
|
| + if (!this->isPaintable()) {
|
| + return ScriptPromise();
|
| + }
|
| +
|
| + double startTime = WTF::monotonicallyIncreasingTime();
|
| + String encodingMimeType = ImageEncoderUtils::toEncodingMimeType(
|
| + options.type(), ImageEncoderUtils::EncodeReasonConvertToBlobPromise);
|
| +
|
| + ImageData* imageData = nullptr;
|
| + if (this->renderingContext()) {
|
| + imageData = this->renderingContext()->toImageData(SnapshotReasonUnknown);
|
| + }
|
| + if (!imageData) {
|
| + return ScriptPromise();
|
| + }
|
| +
|
| + ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
|
| +
|
| + Document* document =
|
| + scriptState->getExecutionContext()->isDocument()
|
| + ? static_cast<Document*>(scriptState->getExecutionContext())
|
| + : nullptr;
|
| +
|
| + CanvasAsyncBlobCreator* asyncCreator = CanvasAsyncBlobCreator::create(
|
| + imageData->data(), encodingMimeType, imageData->size(), startTime,
|
| + document, resolver);
|
| +
|
| + asyncCreator->scheduleAsyncBlobCreation(options.quality());
|
| +
|
| + return resolver->promise();
|
| +}
|
| +
|
| DEFINE_TRACE(OffscreenCanvas) {
|
| visitor->trace(m_context);
|
| }
|
|
|