summaryrefslogtreecommitdiffstats
path: root/third_party
diff options
context:
space:
mode:
authorxlai <xlai@chromium.org>2016-02-02 15:19:18 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-02 23:20:58 +0000
commitd3991457ab5fcb905f2a8a07657e26b16b2974fa (patch)
tree7a2b2598864892fa2a53188b732677dc2aba2bee /third_party
parentefdf4fd25177c3e45bc373ce4574cfdce11c58b3 (diff)
downloadchromium_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')
-rw-r--r--third_party/WebKit/LayoutTests/VirtualTestSuites2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/README.txt2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers-expected.txt)2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-blob-in-workers.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-blob-in-workers.html)4
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob-expected.txt)0
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-createImageBitmap-from-canvas-toBlob.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-from-canvas-toBlob.html)2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype-expected.txt)0
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-case-insensitive-mimetype.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-case-insensitive-mimetype.html)2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng-expected.txt)0
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-defaultpng.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-defaultpng.html)2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob-expected.txt)0
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-file-vs-blob.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/canvas-toBlob-file-vs-blob.html)2
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt (renamed from third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png-expected.txt)0
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas-toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html (renamed from third_party/WebKit/LayoutTests/fast/canvas/toBlob/canvas-toBlob-toDataURL-race-imageEncoder-png.html)4
-rw-r--r--third_party/WebKit/LayoutTests/virtual/threaded/fast/canvas/toBlob/README.txt2
-rw-r--r--third_party/WebKit/Source/core/core.gypi1
-rw-r--r--third_party/WebKit/Source/core/html/HTMLCanvasElement.cpp6
-rw-r--r--third_party/WebKit/Source/core/html/HTMLCanvasElement.h4
-rw-r--r--third_party/WebKit/Source/core/html/HTMLCanvasElement.idl2
-rw-r--r--third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp111
-rw-r--r--third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h22
-rw-r--r--third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreatorTest.cpp182
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