Commit b62f281d authored by Darwin Huang's avatar Darwin Huang Committed by Commit Bot

Clipboard: Make DecodeOnBackgroundThread a static function.

This ensures member variables aren't accessed or modified from
more than one thread at a time.

Bug: 1099089
Change-Id: I644c30423d2ed999c3b316c4a76916a61ba1e1bb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2518253
Commit-Queue: Victor Costan <pwnall@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#824305}
parent c0a550e7
...@@ -45,12 +45,13 @@ class ClipboardImageWriter final : public ClipboardWriter { ...@@ -45,12 +45,13 @@ class ClipboardImageWriter final : public ClipboardWriter {
worker_pool::PostTask( worker_pool::PostTask(
FROM_HERE, FROM_HERE,
CrossThreadBindOnce(&ClipboardImageWriter::DecodeOnBackgroundThread, CrossThreadBindOnce(&ClipboardImageWriter::DecodeOnBackgroundThread,
WrapCrossThreadPersistent(this), WrapCrossThreadPersistent(raw_data),
WrapCrossThreadPersistent(raw_data), task_runner)); WrapCrossThreadPersistent(this), task_runner));
} }
void DecodeOnBackgroundThread( static void DecodeOnBackgroundThread(
DOMArrayBuffer* png_data, DOMArrayBuffer* png_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override { ClipboardImageWriter* writer,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
DCHECK(!IsMainThread()); DCHECK(!IsMainThread());
std::unique_ptr<ImageDecoder> decoder = ImageDecoder::Create( std::unique_ptr<ImageDecoder> decoder = ImageDecoder::Create(
SegmentReader::CreateFromSkData(SkData::MakeWithoutCopy( SegmentReader::CreateFromSkData(SkData::MakeWithoutCopy(
...@@ -62,10 +63,10 @@ class ClipboardImageWriter final : public ClipboardWriter { ...@@ -62,10 +63,10 @@ class ClipboardImageWriter final : public ClipboardWriter {
if (decoder) if (decoder)
image = ImageBitmap::GetSkImageFromDecoder(std::move(decoder)); image = ImageBitmap::GetSkImageFromDecoder(std::move(decoder));
PostCrossThreadTask( PostCrossThreadTask(*task_runner, FROM_HERE,
*task_runner, FROM_HERE, CrossThreadBindOnce(&ClipboardImageWriter::Write,
CrossThreadBindOnce(&ClipboardImageWriter::Write, WrapCrossThreadPersistent(writer),
WrapCrossThreadPersistent(this), std::move(image))); std::move(image)));
} }
void Write(sk_sp<SkImage> image) { void Write(sk_sp<SkImage> image) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
...@@ -97,12 +98,13 @@ class ClipboardTextWriter final : public ClipboardWriter { ...@@ -97,12 +98,13 @@ class ClipboardTextWriter final : public ClipboardWriter {
worker_pool::PostTask( worker_pool::PostTask(
FROM_HERE, FROM_HERE,
CrossThreadBindOnce(&ClipboardTextWriter::DecodeOnBackgroundThread, CrossThreadBindOnce(&ClipboardTextWriter::DecodeOnBackgroundThread,
WrapCrossThreadPersistent(this), WrapCrossThreadPersistent(raw_data),
WrapCrossThreadPersistent(raw_data), task_runner)); WrapCrossThreadPersistent(this), task_runner));
} }
void DecodeOnBackgroundThread( static void DecodeOnBackgroundThread(
DOMArrayBuffer* raw_data, DOMArrayBuffer* raw_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override { ClipboardTextWriter* writer,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
DCHECK(!IsMainThread()); DCHECK(!IsMainThread());
String wtf_string = String wtf_string =
...@@ -111,7 +113,7 @@ class ClipboardTextWriter final : public ClipboardWriter { ...@@ -111,7 +113,7 @@ class ClipboardTextWriter final : public ClipboardWriter {
DCHECK(wtf_string.IsSafeToSendToAnotherThread()); DCHECK(wtf_string.IsSafeToSendToAnotherThread());
PostCrossThreadTask(*task_runner, FROM_HERE, PostCrossThreadTask(*task_runner, FROM_HERE,
CrossThreadBindOnce(&ClipboardTextWriter::Write, CrossThreadBindOnce(&ClipboardTextWriter::Write,
WrapCrossThreadPersistent(this), WrapCrossThreadPersistent(writer),
std::move(wtf_string))); std::move(wtf_string)));
} }
void Write(const String& text) { void Write(const String& text) {
...@@ -156,12 +158,6 @@ class ClipboardHtmlWriter final : public ClipboardWriter { ...@@ -156,12 +158,6 @@ class ClipboardHtmlWriter final : public ClipboardWriter {
Write(sanitized_html, url); Write(sanitized_html, url);
} }
void DecodeOnBackgroundThread(
DOMArrayBuffer* html_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override {
NOTREACHED() << "HTML's serializers cannot be used on background threads.";
}
void Write(const String& sanitized_html, KURL url) { void Write(const String& sanitized_html, KURL url) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
system_clipboard()->WriteHTML(sanitized_html, url); system_clipboard()->WriteHTML(sanitized_html, url);
...@@ -201,12 +197,6 @@ class ClipboardSvgWriter final : public ClipboardWriter { ...@@ -201,12 +197,6 @@ class ClipboardSvgWriter final : public ClipboardWriter {
Write(sanitized_svg); Write(sanitized_svg);
} }
void DecodeOnBackgroundThread(
DOMArrayBuffer* html_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override {
NOTREACHED() << "SVG's serializers cannot be used on background threads.";
}
void Write(const String& svg_html) { void Write(const String& svg_html) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
system_clipboard()->WriteSvg(svg_html); system_clipboard()->WriteSvg(svg_html);
...@@ -233,12 +223,6 @@ class ClipboardRawDataWriter final : public ClipboardWriter { ...@@ -233,12 +223,6 @@ class ClipboardRawDataWriter final : public ClipboardWriter {
Write(raw_data); Write(raw_data);
} }
void DecodeOnBackgroundThread(
DOMArrayBuffer* raw_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) override {
NOTREACHED() << "Raw Data doesn't require decoding.";
}
void Write(DOMArrayBuffer* raw_data) { void Write(DOMArrayBuffer* raw_data) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
......
...@@ -63,9 +63,6 @@ class ClipboardWriter : public GarbageCollected<ClipboardWriter>, ...@@ -63,9 +63,6 @@ class ClipboardWriter : public GarbageCollected<ClipboardWriter>,
virtual void StartWrite( virtual void StartWrite(
DOMArrayBuffer* raw_data, DOMArrayBuffer* raw_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) = 0; scoped_refptr<base::SingleThreadTaskRunner> task_runner) = 0;
virtual void DecodeOnBackgroundThread(
DOMArrayBuffer* raw_data,
scoped_refptr<base::SingleThreadTaskRunner> task_runner) = 0;
// This ClipboardPromise owns this. // This ClipboardPromise owns this.
Member<ClipboardPromise> promise_; Member<ClipboardPromise> promise_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment