| Index: third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| index fbae8739478899e73a50fbdd7910a19c98595335..40462b1f4dcb9245140cee6624b0e176f5513db3 100644
|
| --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp
|
| @@ -145,6 +145,8 @@ HTMLCanvasElement::~HTMLCanvasElement() {
|
| }
|
|
|
| void HTMLCanvasElement::dispose() {
|
| + releasePlaceholderFrame();
|
| +
|
| if (m_context) {
|
| m_context->detachCanvas();
|
| m_context = nullptr;
|
| @@ -470,8 +472,9 @@ void HTMLCanvasElement::reset() {
|
| }
|
|
|
| bool HTMLCanvasElement::paintsIntoCanvasBuffer() const {
|
| + if (placeholderFrame())
|
| + return false;
|
| DCHECK(m_context);
|
| -
|
| if (!m_context->isAccelerated())
|
| return true;
|
| if (layoutBox() && layoutBox()->hasAcceleratedCompositing())
|
| @@ -515,7 +518,7 @@ void HTMLCanvasElement::notifyListenersCanvasChanged() {
|
| void HTMLCanvasElement::paint(GraphicsContext& context, const LayoutRect& r) {
|
| // FIXME: crbug.com/438240; there is a bug with the new CSS blending and
|
| // compositing feature.
|
| - if (!m_context)
|
| + if (!m_context && !placeholderFrame())
|
| return;
|
|
|
| const ComputedStyle* style = ensureComputedStyle();
|
| @@ -536,6 +539,12 @@ void HTMLCanvasElement::paint(GraphicsContext& context, const LayoutRect& r) {
|
| if (!paintsIntoCanvasBuffer() && !document().printing())
|
| return;
|
|
|
| + if (placeholderFrame()) {
|
| + DCHECK(document().printing());
|
| + context.drawImage(placeholderFrame().get(), pixelSnappedIntRect(r));
|
| + return;
|
| + }
|
| +
|
| // TODO(junov): Paint is currently only implemented by ImageBitmap contexts.
|
| // We could improve the abstraction by making all context types paint
|
| // themselves (implement paint()).
|
| @@ -619,19 +628,22 @@ ImageData* HTMLCanvasElement::toImageData(SourceDrawingBuffer sourceBuffer,
|
|
|
| imageData = ImageData::create(m_size);
|
|
|
| - if (!m_context || !imageData)
|
| + if ((!m_context || !imageData) && !placeholderFrame())
|
| return imageData;
|
|
|
| - DCHECK(m_context->is2d());
|
| + DCHECK((m_context && m_context->is2d()) || placeholderFrame());
|
| + sk_sp<SkImage> snapshot;
|
| if (hasImageBuffer()) {
|
| - sk_sp<SkImage> snapshot =
|
| - buffer()->newSkImageSnapshot(PreferNoAcceleration, reason);
|
| - if (snapshot) {
|
| - SkImageInfo imageInfo = SkImageInfo::Make(
|
| - width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType);
|
| - snapshot->readPixels(imageInfo, imageData->data()->data(),
|
| - imageInfo.minRowBytes(), 0, 0);
|
| - }
|
| + snapshot = buffer()->newSkImageSnapshot(PreferNoAcceleration, reason);
|
| + } else if (placeholderFrame()) {
|
| + snapshot = placeholderFrame()->imageForCurrentFrame();
|
| + }
|
| +
|
| + if (snapshot) {
|
| + SkImageInfo imageInfo = SkImageInfo::Make(
|
| + width(), height(), kRGBA_8888_SkColorType, kUnpremul_SkAlphaType);
|
| + snapshot->readPixels(imageInfo, imageData->data()->data(),
|
| + imageInfo.minRowBytes(), 0, 0);
|
| }
|
|
|
| return imageData;
|
| @@ -683,13 +695,6 @@ String HTMLCanvasElement::toDataURLInternal(
|
| String HTMLCanvasElement::toDataURL(const String& mimeType,
|
| const ScriptValue& qualityArgument,
|
| ExceptionState& exceptionState) const {
|
| - if (surfaceLayerBridge()) {
|
| - exceptionState.throwDOMException(InvalidStateError,
|
| - "canvas.toDataURL is not allowed for a "
|
| - "canvas that has transferred its control "
|
| - "to offscreen.");
|
| - return String();
|
| - }
|
| if (!originClean()) {
|
| exceptionState.throwSecurityError("Tainted canvases may not be exported.");
|
| return String();
|
| @@ -709,14 +714,6 @@ void HTMLCanvasElement::toBlob(BlobCallback* callback,
|
| const String& mimeType,
|
| const ScriptValue& qualityArgument,
|
| ExceptionState& exceptionState) {
|
| - if (surfaceLayerBridge()) {
|
| - exceptionState.throwDOMException(InvalidStateError,
|
| - "canvas.toBlob is not allowed for a "
|
| - "canvas that has transferred its control "
|
| - "to offscreen.");
|
| - return;
|
| - }
|
| -
|
| if (!originClean()) {
|
| exceptionState.throwSecurityError("Tainted canvases may not be exported.");
|
| return;
|
| @@ -1200,6 +1197,11 @@ PassRefPtr<Image> HTMLCanvasElement::getSourceImageForCanvas(
|
| return nullptr;
|
| }
|
|
|
| + if (placeholderFrame()) {
|
| + *status = NormalSourceImageStatus;
|
| + return placeholderFrame();
|
| + }
|
| +
|
| if (!m_context) {
|
| *status = NormalSourceImageStatus;
|
| return createTransparentImage(size());
|
|
|