diff options
author | xlai <xlai@chromium.org> | 2016-02-02 15:19:18 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-02 23:20:58 +0000 |
commit | d3991457ab5fcb905f2a8a07657e26b16b2974fa (patch) | |
tree | 7a2b2598864892fa2a53188b732677dc2aba2bee /third_party | |
parent | efdf4fd25177c3e45bc373ce4574cfdce11c58b3 (diff) | |
download | chromium_src-d3991457ab5fcb905f2a8a07657e26b16b2974fa.zip chromium_src-d3991457ab5fcb905f2a8a07657e26b16b2974fa.tar.gz chromium_src-d3991457ab5fcb905f2a8a07657e26b16b2974fa.tar.bz2 |
Simplify CanvasAsyncBlobCreator by removing ContextObserver and related tests
After we confirm to use idle-tasks implementation in toBlob, the cancellation
mechanism for async thread implementation is no longer useful. First, compositor
thread is definitely alive when users open Chrome browser; so the alternative
code path for PNG image encoding when compositor thread is disabled would be
unreachable in real-world situations; as a result, PNG image encoding happens
in idle tasks only. Second, JPEG and WEBP image formats do not have progressive
encoding at this moment and thus cancellation mechanism is not useful to them
either; once their progressive encoding implementations are completed, they
would be moved over to idle-tasks implementation too.
This patch removes ContextObserver and CanvasAsyncBlobCreatorTest; it also moves
all layout tests that use toBlob on PNG image formats to virtual/threaded as
idle tasks require compositor thread to be alive. There is no need to perform
tests on toBlob (png) in scenarios when compositor thread is not available.
BUG=581574
Review URL: https://codereview.chromium.org/1653253003
Cr-Commit-Position: refs/heads/master@{#373068}
Diffstat (limited to 'third_party')
22 files changed, 28 insertions, 324 deletions
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites index 408d9cf..9b5674a 100644 --- a/third_party/WebKit/LayoutTests/VirtualTestSuites +++ b/third_party/WebKit/LayoutTests/VirtualTestSuites @@ -12,7 +12,7 @@ }, { "prefix": "threaded", - "base": "fast/canvas/toBlob", + "base": "fast/canvas-toBlob", "args": ["--enable-threaded-compositing"] }, { diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/README.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/README.txt new file mode 100644 index 0000000..315f95b --- /dev/null +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/README.txt @@ -0,0 +1,2 @@ +# This suite runs the tests in virtual/threaded/fast/canvas with --enable-threaded-compositing. +# See the virtual_test_suites() method in Tools/Scripts/webkitpy/layout_tests/port/base.py. diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers-expected.txt index 1a07f4a..b785e09 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers-expected.txt @@ -3,7 +3,7 @@ Test createImageBitmap with blob in workers. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". -Starting worker: ./resources/canvas-createImageBitmap-blob-in-workers.js +Starting worker: ../../../../fast/canvas/resources/canvas-createImageBitmap-blob-in-workers.js PASS ImageBitmaps created from blob in worker and in main have the same pixel data PASS successfullyParsed is true diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers.html index ea845ef..228e9e4 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers.html @@ -1,12 +1,12 @@ <!DOCTYPE html> <html> <head> -<script src="../../resources/js-test.js"></script> +<script src="../../../../resources/js-test.js"></script> </head> <body> <script> jsTestIsAsync = true; -var worker = startWorker('./resources/canvas-createImageBitmap-blob-in-workers.js'); +var worker = startWorker('../../../../fast/canvas/resources/canvas-createImageBitmap-blob-in-workers.js'); description('Test createImageBitmap with blob in workers.'); diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob-expected.txt index d5353c2..d5353c2 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob-expected.txt diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob.html index 99da913..beb0748 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<script src="../../resources/js-test.js"></script> +<script src="../../../../resources/js-test.js"></script> <script> jsTestIsAsync = true; diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype-expected.txt index def2f15..def2f15 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype-expected.txt diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype.html index dc48053..5e772af 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype.html @@ -1,4 +1,4 @@ -<script src = "../../resources/js-test.js"></script> +<script src = "../../../../resources/js-test.js"></script> <script type = "text/javascript"> if (window.testRunner) { diff --git a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng-expected.txt index fed3498..fed3498 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng-expected.txt diff --git a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng.html index c68d3ea..cbc40e3 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng.html @@ -1,4 +1,4 @@ -<script src = "../../../resources/js-test.js"></script> +<script src = "../../../../resources/js-test.js"></script> <script type = 'text/javascript'> jsTestIsAsync = true; description("Test that verifies whether the image data survives the toBlob process after async image encoding"); diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob-expected.txt index 843f9a4..843f9a4 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob-expected.txt diff --git a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob.html index 66e448d..69a61a2 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob.html @@ -1,4 +1,4 @@ -<script src = "../../resources/js-test.js"></script> +<script src = "../../../../resources/js-test.js"></script> <script type = "text/javascript"> if (window.testRunner) { diff --git a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt index ac789eb..ac789eb 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt diff --git a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html index 806cc27..8940ce5 100644 --- a/third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html +++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html @@ -1,5 +1,5 @@ -<script src = "../../../resources/js-test.js"></script> -<script src = "../script-tests/canvas-toBlob-toDataURL-race.js"></script> +<script src = "../../../../resources/js-test.js"></script> +<script src = "../../../../fast/canvas/script-tests/canvas-toBlob-toDataURL-race.js"></script> <script type = 'text/javascript'> description("Verifies if synchronous PNG image encoding (toDataURL) conflicts with asynchronous image encoding (toBlob)"); diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas/toBlob/README.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas/toBlob/README.txt deleted file mode 100644 index bf44e27..0000000 --- a/third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas/toBlob/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -# This suite runs the tests in LayoutTests/fast/canvas/toBlob with --enable-threaded-compositing. -# See the virtual_test_suites() method in Tools/Scripts/webkitpy/layout_tests/port/base.py. diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 80581bc..a783f60 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi @@ -3990,7 +3990,6 @@ 'html/HTMLVideoElementTest.cpp', 'html/LinkRelAttributeTest.cpp', 'html/TimeRangesTest.cpp', - 'html/canvas/CanvasAsyncBlobCreatorTest.cpp', 'html/canvas/CanvasFontCacheTest.cpp', 'html/forms/EmailInputTypeTest.cpp', 'html/forms/FileInputTypeTest.cpp', diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp index 2b554b5..63d691d 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp @@ -580,7 +580,7 @@ String HTMLCanvasElement::toDataURL(const String& mimeType, const ScriptValue& q return toDataURLInternal(mimeType, quality, BackBuffer); } -void HTMLCanvasElement::toBlob(ScriptState* scriptState, BlobCallback* callback, const String& mimeType, const ScriptValue& qualityArgument, ExceptionState& exceptionState) +void HTMLCanvasElement::toBlob(BlobCallback* callback, const String& mimeType, const ScriptValue& qualityArgument, ExceptionState& exceptionState) { if (!originClean()) { exceptionState.throwSecurityError("Tainted canvases may not be exported."); @@ -609,9 +609,9 @@ void HTMLCanvasElement::toBlob(ScriptState* scriptState, BlobCallback* callback, // Add a ref to keep image data alive until completion of encoding RefPtr<DOMUint8ClampedArray> imageDataRef(imageData->data()); - RefPtr<CanvasAsyncBlobCreator> asyncCreatorRef = CanvasAsyncBlobCreator::create(imageDataRef.release(), encodingMimeType, imageData->size(), callback, scriptState->executionContext()); + RefPtr<CanvasAsyncBlobCreator> asyncCreatorRef = CanvasAsyncBlobCreator::create(imageDataRef.release(), encodingMimeType, imageData->size(), callback); - if (Platform::current()->isThreadedCompositingEnabled() && (encodingMimeType == DefaultMimeType)) { + if (encodingMimeType == DefaultMimeType) { asyncCreatorRef->scheduleAsyncBlobCreation(true); } else { asyncCreatorRef->scheduleAsyncBlobCreation(false, quality); diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h index 4153552..b06280ed 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.h +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.h @@ -101,8 +101,8 @@ public: String toDataURL(const String& mimeType, const ScriptValue& qualityArgument, ExceptionState&) const; String toDataURL(const String& mimeType, ExceptionState& exceptionState) const { return toDataURL(mimeType, ScriptValue(), exceptionState); } - void toBlob(ScriptState*, BlobCallback*, const String& mimeType, const ScriptValue& qualityArgument, ExceptionState&); - void toBlob(ScriptState* scriptState, BlobCallback* callback, const String& mimeType, ExceptionState& exceptionState) { return toBlob(scriptState, callback, mimeType, ScriptValue(), exceptionState); } + void toBlob(BlobCallback*, const String& mimeType, const ScriptValue& qualityArgument, ExceptionState&); + void toBlob(BlobCallback* callback, const String& mimeType, ExceptionState& exceptionState) { return toBlob(callback, mimeType, ScriptValue(), exceptionState); } // Used for canvas capture. void addListener(CanvasDrawListener*); diff --git a/third_party/WebKit/Source/core/html/HTMLCanvasElement.idl b/third_party/WebKit/Source/core/html/HTMLCanvasElement.idl index 3e52f7e..15e7e50 100644 --- a/third_party/WebKit/Source/core/html/HTMLCanvasElement.idl +++ b/third_party/WebKit/Source/core/html/HTMLCanvasElement.idl @@ -53,5 +53,5 @@ interface HTMLCanvasElement : HTMLElement // FIXME: type should not have a default value. [RaisesException] DOMString toDataURL(optional DOMString type = null, optional any arguments); - [RaisesException, CallWith=ScriptState] void toBlob(BlobCallback _callback, optional DOMString type = null, optional any arguments); + [RaisesException] void toBlob(BlobCallback _callback, optional DOMString type = null, optional any arguments); }; diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp index 3f7d29e..cfcd5c7f 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp @@ -4,7 +4,6 @@ #include "CanvasAsyncBlobCreator.h" -#include "core/dom/ContextLifecycleObserver.h" #include "core/fileapi/Blob.h" #include "platform/Task.h" #include "platform/ThreadSafeFunctional.h" @@ -34,51 +33,14 @@ bool isDeadlineNearOrPassed(double deadlineSeconds) } // anonymous namespace -class CanvasAsyncBlobCreator::ContextObserver final : public NoBaseWillBeGarbageCollected<CanvasAsyncBlobCreator::ContextObserver>, public ContextLifecycleObserver { - WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(CanvasAsyncBlobCreator::ContextObserver); -public: - ContextObserver(ExecutionContext* executionContext, CanvasAsyncBlobCreator* asyncBlobCreator) - : ContextLifecycleObserver(executionContext) - , m_asyncBlobCreator(asyncBlobCreator) - { - } - - DECLARE_VIRTUAL_TRACE(); - - void contextDestroyed() override - { - ContextLifecycleObserver::contextDestroyed(); - if (!!m_asyncBlobCreator) { - m_asyncBlobCreator->m_cancelled = true; - // After sending cancel signal to asyncBlobCreator, the observer has - // done its job and thus deref asyncBlobCreator for proper destruction - m_asyncBlobCreator = nullptr; - } - } - - void dispose() - { - // In Oilpan context, on-heap ContextObserver sometimes live longer than - // off-heap CanvasAsyncBlobCreator, thus we need to dispose backref to - // m_asyncBlobCreator here when its destructor is called to avoid - // heap-use-after-free error. - m_asyncBlobCreator = nullptr; - } - -private: - CanvasAsyncBlobCreator* m_asyncBlobCreator; -}; - -PassRefPtr<CanvasAsyncBlobCreator> CanvasAsyncBlobCreator::create(PassRefPtr<DOMUint8ClampedArray> unpremultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCallback* callback, ExecutionContext* executionContext) +PassRefPtr<CanvasAsyncBlobCreator> CanvasAsyncBlobCreator::create(PassRefPtr<DOMUint8ClampedArray> unpremultipliedRGBAImageData, const String& mimeType, const IntSize& size, BlobCallback* callback) { RefPtr<CanvasAsyncBlobCreator> asyncBlobCreator = adoptRef(new CanvasAsyncBlobCreator(unpremultipliedRGBAImageData, mimeType, size, callback)); - asyncBlobCreator->createContextObserver(executionContext); return asyncBlobCreator.release(); } CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(PassRefPtr<DOMUint8ClampedArray> data, const String& mimeType, const IntSize& size, BlobCallback* callback) - : m_cancelled(false) - , m_data(data) + : m_data(data) , m_size(size) , m_mimeType(mimeType) , m_callback(callback) @@ -91,13 +53,6 @@ CanvasAsyncBlobCreator::CanvasAsyncBlobCreator(PassRefPtr<DOMUint8ClampedArray> CanvasAsyncBlobCreator::~CanvasAsyncBlobCreator() { - if (!!m_contextObserver) - m_contextObserver->dispose(); -} - -DEFINE_TRACE(CanvasAsyncBlobCreator::ContextObserver) -{ - ContextLifecycleObserver::trace(visitor); } void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, double quality) @@ -108,6 +63,9 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche // Make self-reference to keep this object alive until the final task completes m_selfRef = this; + // At the time being, progressive encoding is only applicable to png image format, + // and thus idle tasks scheduling can only be applied to png image format. + // TODO(xlai): Progressive encoding on jpeg and webp image formats (crbug.com/571398, crbug.com/571399) if (canUseIdlePeriodScheduling) { ASSERT(m_mimeType == "image/png"); Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, this)); @@ -166,40 +124,7 @@ void CanvasAsyncBlobCreator::createBlobAndCall() void CanvasAsyncBlobCreator::encodeImageOnEncoderThread(double quality) { ASSERT(!isMainThread()); - if (initializeEncodeImageOnEncoderThread()) { - if (m_mimeType == "image/png") { - // At the time being, progressive encoding is only applicable to png image format - // TODO(xlai): Progressive encoding on jpeg and webp image formats (crbug.com/571398, crbug.com/571399) - progressiveEncodeImageOnEncoderThread(); - } else { - nonprogressiveEncodeImageOnEncoderThread(quality); - } - } -} - -bool CanvasAsyncBlobCreator::initializeEncodeImageOnEncoderThread() -{ - if (m_cancelled) { - scheduleClearSelfRefOnMainThread(); - return false; - } - - if (m_mimeType == "image/png") { - m_encoderState = PNGImageEncoderState::create(m_size, m_encodedImage.get()); - if (m_cancelled) { - scheduleClearSelfRefOnMainThread(); - return false; - } - if (!m_encoderState) { - scheduleCreateNullptrAndCallOnMainThread(); - return false; - } - } // else, do nothing; as encoding on other image formats are not progressive - return true; -} -void CanvasAsyncBlobCreator::nonprogressiveEncodeImageOnEncoderThread(double quality) -{ if (ImageDataBuffer(m_size, m_data->data()).encodeImage(m_mimeType, quality, m_encodedImage.get())) { scheduleCreateBlobAndCallOnMainThread(); } else { @@ -207,32 +132,6 @@ void CanvasAsyncBlobCreator::nonprogressiveEncodeImageOnEncoderThread(double qua } } -void CanvasAsyncBlobCreator::progressiveEncodeImageOnEncoderThread() -{ - unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCompleted; - for (int y = 0; y < m_size.height() && !m_cancelled; ++y) { - PNGImageEncoder::writeOneRowToPng(inputPixels, m_encoderState.get()); - inputPixels += m_pixelRowStride; - } - if (m_cancelled) { - scheduleClearSelfRefOnMainThread(); - return; - } - - PNGImageEncoder::finalizePng(m_encoderState.get()); - if (m_cancelled) { - scheduleClearSelfRefOnMainThread(); - return; - } - - scheduleCreateBlobAndCallOnMainThread(); -} - -void CanvasAsyncBlobCreator::createContextObserver(ExecutionContext* executionContext) -{ - m_contextObserver = adoptPtrWillBeNoop(new ContextObserver(executionContext, this)); -} - void CanvasAsyncBlobCreator::clearSelfReference() { // Some persistent members in CanvasAsyncBlobCreator can only be destroyed diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h index df7f1d7..0a714c7 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h @@ -4,7 +4,6 @@ #include "core/CoreExport.h" #include "core/dom/DOMTypedArray.h" -#include "core/dom/ExecutionContext.h" #include "core/fileapi/BlobCallback.h" #include "platform/geometry/IntSize.h" #include "platform/heap/Handle.h" @@ -20,19 +19,15 @@ class PNGImageEncoderState; class CORE_EXPORT CanvasAsyncBlobCreator : public RefCounted<CanvasAsyncBlobCreator> { public: - static PassRefPtr<CanvasAsyncBlobCreator> create(PassRefPtr<DOMUint8ClampedArray> unpremultipliedRGBAImageData, const String& mimeType, const IntSize&, BlobCallback*, ExecutionContext*); + static PassRefPtr<CanvasAsyncBlobCreator> create(PassRefPtr<DOMUint8ClampedArray> unpremultipliedRGBAImageData, const String& mimeType, const IntSize&, BlobCallback*); void scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, double quality = 0.0); virtual ~CanvasAsyncBlobCreator(); -protected: - CanvasAsyncBlobCreator(PassRefPtr<DOMUint8ClampedArray> data, const String& mimeType, const IntSize&, BlobCallback*); - virtual void scheduleCreateBlobAndCallOnMainThread(); - virtual void scheduleCreateNullptrAndCallOnMainThread(); - virtual void scheduleClearSelfRefOnMainThread(); - std::atomic<bool> m_cancelled; - private: - friend class CanvasAsyncBlobCreatorTest; + CanvasAsyncBlobCreator(PassRefPtr<DOMUint8ClampedArray> data, const String& mimeType, const IntSize&, BlobCallback*); + void scheduleCreateBlobAndCallOnMainThread(); + void scheduleCreateNullptrAndCallOnMainThread(); + void scheduleClearSelfRefOnMainThread(); OwnPtr<PNGImageEncoderState> m_encoderState; RefPtr<DOMUint8ClampedArray> m_data; @@ -54,13 +49,6 @@ private: void createBlobAndCall(); void encodeImageOnEncoderThread(double quality); - bool initializeEncodeImageOnEncoderThread(); - void nonprogressiveEncodeImageOnEncoderThread(double quality); - void progressiveEncodeImageOnEncoderThread(); - - class ContextObserver; - void createContextObserver(ExecutionContext*); - OwnPtrWillBePersistent<ContextObserver> m_contextObserver; }; } // namespace blink diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp deleted file mode 100644 index 9ffc255..0000000 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "core/html/canvas/CanvasAsyncBlobCreator.h" - -#include "core/html/ImageData.h" -#include "platform/ThreadSafeFunctional.h" -#include "platform/threading/BackgroundTaskRunner.h" -#include "public/platform/Platform.h" -#include "public/platform/WebWaitableEvent.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace blink { - -class MockCanvasAsyncBlobCreator; - -class FakeContextObserver { -public: - FakeContextObserver(MockCanvasAsyncBlobCreator* asyncBlobCreator) - : m_asyncBlobCreator(asyncBlobCreator) - { - } - - void contextDestroyed(); - -private: - MockCanvasAsyncBlobCreator* m_asyncBlobCreator; -}; - -//============================================================================ - -class MockCanvasAsyncBlobCreator : public CanvasAsyncBlobCreator { -public: - MockCanvasAsyncBlobCreator(PassRefPtr<DOMUint8ClampedArray> data, const String& mimeType, const IntSize& size) - : CanvasAsyncBlobCreator(data, mimeType, size, nullptr) - { - } - - void setFakeContextObserver(FakeContextObserver* contextObserver) - { - m_contextObserver = contextObserver; - } - - bool isCancelled() { return m_cancelled; } - void onContextDestroyed() - { - m_cancelled = true; - } - MOCK_METHOD0(scheduleClearSelfRefOnMainThread, void()); - MOCK_METHOD0(scheduleCreateNullptrAndCallOnMainThread, void()); - MOCK_METHOD0(scheduleCreateBlobAndCallOnMainThread, void()); - -private: - FakeContextObserver* m_contextObserver; -}; - -//============================================================================ - -class CanvasAsyncBlobCreatorTest : public ::testing::Test { -public: - void prepareMockCanvasAsyncBlobCreator(int width, int height); - bool initializeEncodeImage() { return m_asyncBlobCreator->initializeEncodeImageOnEncoderThread(); } - void startEncodeImage() { m_asyncBlobCreator->progressiveEncodeImageOnEncoderThread(); } - -protected: - CanvasAsyncBlobCreatorTest(); - void TearDown() override; - MockCanvasAsyncBlobCreator* asyncBlobCreator(); - FakeContextObserver* contextObserver(); - -private: - RefPtr<MockCanvasAsyncBlobCreator> m_asyncBlobCreator; - FakeContextObserver* m_contextObserver; -}; - -//============================================================================ - -CanvasAsyncBlobCreatorTest::CanvasAsyncBlobCreatorTest() -{ -} - -void CanvasAsyncBlobCreatorTest::prepareMockCanvasAsyncBlobCreator(int width, int height) -{ - IntSize testSize(width, height); - ImageData* imageData = ImageData::create(testSize); - RefPtr<DOMUint8ClampedArray> imageDataRef(imageData->data()); - - m_asyncBlobCreator = adoptRef(new MockCanvasAsyncBlobCreator(imageDataRef.release(), "image/png", testSize)); - m_contextObserver = new FakeContextObserver(m_asyncBlobCreator.get()); - m_asyncBlobCreator->setFakeContextObserver(m_contextObserver); -} - -void CanvasAsyncBlobCreatorTest::TearDown() -{ - delete m_contextObserver; - m_asyncBlobCreator->m_selfRef.clear(); -} - -void FakeContextObserver::contextDestroyed() -{ - m_asyncBlobCreator->onContextDestroyed(); - m_asyncBlobCreator = nullptr; -} - -void ImageEncodingTask(CanvasAsyncBlobCreatorTest* testHost, WebWaitableEvent* startEvent, WebWaitableEvent* doneEvent) -{ - bool initializationSuccess = testHost->initializeEncodeImage(); - startEvent->signal(); - if (initializationSuccess) - testHost->startEncodeImage(); - doneEvent->signal(); -} - -void ImageEncodingTaskWithoutStartSignal(CanvasAsyncBlobCreatorTest* testHost, WebWaitableEvent* doneEvent) -{ - bool initializationSuccess = testHost->initializeEncodeImage(); - if (initializationSuccess) - testHost->startEncodeImage(); - doneEvent->signal(); -} - -MockCanvasAsyncBlobCreator* CanvasAsyncBlobCreatorTest::asyncBlobCreator() -{ - return m_asyncBlobCreator.get(); -} - -FakeContextObserver* CanvasAsyncBlobCreatorTest::contextObserver() -{ - return m_contextObserver; -} - -TEST_F(CanvasAsyncBlobCreatorTest, CancelImageEncodingWhenContextTornDown) -{ - this->prepareMockCanvasAsyncBlobCreator(4000, 4000); - - OwnPtr<WebWaitableEvent> startEvent = adoptPtr(Platform::current()->createWaitableEvent()); - OwnPtr<WebWaitableEvent> doneEvent = adoptPtr(Platform::current()->createWaitableEvent()); - - EXPECT_CALL(*(asyncBlobCreator()), scheduleClearSelfRefOnMainThread()); - - BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&ImageEncodingTask, AllowCrossThreadAccess(this), AllowCrossThreadAccess(startEvent.get()), AllowCrossThreadAccess(doneEvent.get())), BackgroundTaskRunner::TaskSizeLongRunningTask); - startEvent->wait(); - contextObserver()->contextDestroyed(); - doneEvent->wait(); - - ::testing::Mock::VerifyAndClearExpectations(asyncBlobCreator()); - EXPECT_TRUE(asyncBlobCreator()->isCancelled()); -} - -TEST_F(CanvasAsyncBlobCreatorTest, CompleteImageEncodingWithoutContextTornDown) -{ - this->prepareMockCanvasAsyncBlobCreator(50, 50); - - OwnPtr<WebWaitableEvent> doneEvent = adoptPtr(Platform::current()->createWaitableEvent()); - - EXPECT_CALL(*(asyncBlobCreator()), scheduleCreateBlobAndCallOnMainThread()); - - BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&ImageEncodingTaskWithoutStartSignal, AllowCrossThreadAccess(this), AllowCrossThreadAccess(doneEvent.get())), BackgroundTaskRunner::TaskSizeShortRunningTask); - doneEvent->wait(); - - ::testing::Mock::VerifyAndClearExpectations(asyncBlobCreator()); - EXPECT_FALSE(asyncBlobCreator()->isCancelled()); -} - -TEST_F(CanvasAsyncBlobCreatorTest, FailedImageEncodingOnEmptyImageData) -{ - this->prepareMockCanvasAsyncBlobCreator(0, 0); - - OwnPtr<WebWaitableEvent> doneEvent = adoptPtr(Platform::current()->createWaitableEvent()); - - EXPECT_CALL(*(asyncBlobCreator()), scheduleCreateNullptrAndCallOnMainThread()); - - BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&ImageEncodingTaskWithoutStartSignal, AllowCrossThreadAccess(this), AllowCrossThreadAccess(doneEvent.get())), BackgroundTaskRunner::TaskSizeShortRunningTask); - doneEvent->wait(); - - ::testing::Mock::VerifyAndClearExpectations(asyncBlobCreator()); - EXPECT_FALSE(asyncBlobCreator()->isCancelled()); -} - -} // namespace blink |