Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(562)

Unified Diff: third_party/WebKit/Source/core/offscreencanvas/OffscreenCanvas.cpp

Issue 2420203002: Implement convertToBlob() in OffscreenCanvas (Closed)
Patch Set: rebase and fix global-interface-listing-service-worker-expected.txt Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698