summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc')
-rw-r--r--chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc85
1 files changed, 24 insertions, 61 deletions
diff --git a/chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc b/chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
index 3dabb82f769..631100bf570 100644
--- a/chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
+++ b/chromium/third_party/blink/renderer/modules/clipboard/clipboard_promise.cc
@@ -16,7 +16,6 @@
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_clipboard_item_options.h"
#include "third_party/blink/renderer/core/clipboard/clipboard_mime_types.h"
-#include "third_party/blink/renderer/core/clipboard/raw_system_clipboard.h"
#include "third_party/blink/renderer/core/clipboard/system_clipboard.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
@@ -133,10 +132,7 @@ void ClipboardPromise::WriteNextRepresentation() {
// This is in the start flow so that a |clipboard_item_data_| with 0 items
// will still commit gracefully.
if (clipboard_representation_index_ == clipboard_item_data_.size()) {
- if (is_raw_)
- local_frame->GetRawSystemClipboard()->CommitWrite();
- else
- local_frame->GetSystemClipboard()->CommitWrite();
+ local_frame->GetSystemClipboard()->CommitWrite();
script_promise_resolver_->Resolve();
return;
}
@@ -148,14 +144,8 @@ void ClipboardPromise::WriteNextRepresentation() {
clipboard_item_data_[clipboard_representation_index_].second;
DCHECK(!clipboard_writer_);
- if (is_raw_) {
- clipboard_writer_ = ClipboardWriter::Create(
- local_frame->GetRawSystemClipboard(), type, this);
- } else {
- clipboard_writer_ =
- ClipboardWriter::Create(local_frame->GetSystemClipboard(), type, this);
- }
-
+ clipboard_writer_ =
+ ClipboardWriter::Create(local_frame->GetSystemClipboard(), type, this);
clipboard_writer_->WriteToSystem(blob);
}
@@ -171,10 +161,13 @@ void ClipboardPromise::RejectFromReadOrDecodeFailure() {
void ClipboardPromise::HandleRead(ClipboardItemOptions* options) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (base::FeatureList::IsEnabled(features::kRawClipboard) && options &&
- options->hasRaw())
- is_raw_ = options->raw();
- RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ, is_raw_,
+ if (options->hasUnsanitized()) {
+ for (const auto& unsanitized_item : options->unsanitized()) {
+ custom_format_items_.push_back(unsanitized_item);
+ }
+ }
+ RequestPermission(mojom::blink::PermissionName::CLIPBOARD_READ,
+ !custom_format_items_.IsEmpty(),
WTF::Bind(&ClipboardPromise::HandleReadWithPermission,
WrapPersistent(this)));
}
@@ -208,11 +201,12 @@ void ClipboardPromise::HandleWrite(
// For now, we only process the first ClipboardItem.
ClipboardItem* clipboard_item = (*clipboard_items)[0];
clipboard_item_data_ = clipboard_item->GetItems();
- is_raw_ = clipboard_item->raw();
-
- DCHECK(base::FeatureList::IsEnabled(features::kRawClipboard) || !is_raw_);
+ custom_format_items_ = clipboard_item->CustomFormats();
+ DCHECK(base::FeatureList::IsEnabled(features::kClipboardCustomFormats) ||
+ custom_format_items_.IsEmpty());
- RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE, is_raw_,
+ RequestPermission(mojom::blink::PermissionName::CLIPBOARD_WRITE,
+ !custom_format_items_.IsEmpty(),
WTF::Bind(&ClipboardPromise::HandleWriteWithPermission,
WrapPersistent(this)));
}
@@ -235,13 +229,6 @@ void ClipboardPromise::HandleReadWithPermission(PermissionStatus status) {
return;
}
- if (is_raw_) {
- RawSystemClipboard* raw_system_clipboard =
- GetLocalFrame()->GetRawSystemClipboard();
- raw_system_clipboard->ReadAvailableFormatNames(WTF::Bind(
- &ClipboardPromise::OnReadAvailableFormatNames, WrapPersistent(this)));
- return;
- }
SystemClipboard* system_clipboard = GetLocalFrame()->GetSystemClipboard();
Vector<String> available_types = system_clipboard->ReadAvailableTypes();
OnReadAvailableFormatNames(available_types);
@@ -258,7 +245,7 @@ void ClipboardPromise::ResolveRead() {
}
ClipboardItemOptions* options = ClipboardItemOptions::Create();
- options->setRaw(is_raw_);
+ options->setUnsanitized(custom_format_items_);
HeapVector<Member<ClipboardItem>> clipboard_items = {
MakeGarbageCollected<ClipboardItem>(clipboard_item_data_, options)};
@@ -273,7 +260,8 @@ void ClipboardPromise::OnReadAvailableFormatNames(
clipboard_item_data_.ReserveInitialCapacity(format_names.size());
for (const String& format_name : format_names) {
- if (ClipboardWriter::IsValidType(format_name, is_raw_)) {
+ if (ClipboardWriter::IsValidType(format_name,
+ /*is_custom_format_type=*/false)) {
clipboard_item_data_.emplace_back(format_name,
/* Placeholder value. */ nullptr);
}
@@ -292,12 +280,6 @@ void ClipboardPromise::ReadNextRepresentation() {
String format_name =
clipboard_item_data_[clipboard_representation_index_].first;
- if (is_raw_) {
- GetLocalFrame()->GetRawSystemClipboard()->Read(
- format_name,
- WTF::Bind(&ClipboardPromise::OnRawRead, WrapPersistent(this)));
- return;
- }
ClipboardReader* clipboard_reader = ClipboardReader::Create(
GetLocalFrame()->GetSystemClipboard(), format_name, this);
@@ -308,26 +290,6 @@ void ClipboardPromise::ReadNextRepresentation() {
clipboard_reader->Read();
}
-void ClipboardPromise::OnRawRead(mojo_base::BigBuffer data) {
- DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
- if (!GetExecutionContext())
- return;
- String format_name =
- clipboard_item_data_[clipboard_representation_index_].first;
- Blob* blob = Blob::Create(reinterpret_cast<const uint8_t*>(data.data()),
- data.size(), format_name);
- if (!blob) {
- script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
- DOMExceptionCode::kDataError,
- "Failed to read or decode clipboard data for type " +
- clipboard_item_data_[clipboard_representation_index_].first + "."));
- return;
- }
- clipboard_item_data_[clipboard_representation_index_].second = blob;
- ++clipboard_representation_index_;
- ReadNextRepresentation();
-}
-
void ClipboardPromise::OnRead(Blob* blob) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
clipboard_item_data_[clipboard_representation_index_].second = blob;
@@ -364,16 +326,16 @@ void ClipboardPromise::HandleWriteWithPermission(PermissionStatus status) {
for (const auto& type_and_blob : clipboard_item_data_) {
String type = type_and_blob.first;
String type_with_args = type_and_blob.second->type();
- if (!ClipboardWriter::IsValidType(type, is_raw_)) {
+ bool is_valid_custom_format = base::Contains(custom_format_items_, type);
+ if (!ClipboardWriter::IsValidType(type, is_valid_custom_format)) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kNotAllowedError,
"Type " + type + " not supported on write."));
return;
}
- // For normal (not-raw) write, blobs may have a full MIME type with args
+ // For normal (not-custom) write, blobs may have a full MIME type with args
// (ex. 'text/plain;charset=utf-8'), whereas the type must not have args
// (ex. 'text/plain' only), so ensure that Blob->type is contained in type.
- // For raw clipboard, Blobs convert their type to lowercase.
if (!type_with_args.Contains(type.LowerASCII())) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kNotAllowedError,
@@ -455,10 +417,11 @@ void ClipboardPromise::RequestPermission(
return;
}
- if (is_raw_ && !LocalFrame::HasTransientUserActivation(GetLocalFrame())) {
+ if (!custom_format_items_.IsEmpty() &&
+ !LocalFrame::HasTransientUserActivation(GetLocalFrame())) {
script_promise_resolver_->Reject(MakeGarbageCollected<DOMException>(
DOMExceptionCode::kSecurityError,
- "Must be handling a user gesture to use raw clipboard"));
+ "Must be handling a user gesture to use custom clipboard"));
return;
}