Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(132)

Unified Diff: third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp

Issue 2695593006: Initial stub version of Async Clipboard API (Closed)
Patch Set: Expected layout tests results for mac Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
diff --git a/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..4a0739a2425311f3dcf56049f71bac8cbe3dcbec
--- /dev/null
+++ b/third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp
@@ -0,0 +1,115 @@
+// Copyright 2017 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/clipboard/ClipboardPromise.h"
+
+#include "bindings/core/v8/ScriptPromiseResolver.h"
+#include "core/clipboard/DataObject.h"
+#include "core/clipboard/DataTransfer.h"
+#include "core/clipboard/DataTransferItem.h"
+#include "core/clipboard/DataTransferItemList.h"
+#include "core/dom/TaskRunnerHelper.h"
+#include "platform/CrossThreadFunctional.h"
+#include "platform/clipboard/ClipboardMimeTypes.h"
+#include "public/platform/Platform.h"
+
+namespace blink {
+
+ScriptPromise ClipboardPromise::CreateForRead(ScriptState* script_state) {
+ ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+ clipboard_promise->GetTaskRunner()->PostTask(
+ BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead,
+ WrapPersistent(clipboard_promise)));
+ return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* script_state) {
+ ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+ clipboard_promise->GetTaskRunner()->PostTask(
+ BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText,
+ WrapPersistent(clipboard_promise)));
+ return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* script_state,
+ DataTransfer* data) {
+ ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+ clipboard_promise->GetTaskRunner()->PostTask(
+ BLINK_FROM_HERE,
+ WTF::Bind(&ClipboardPromise::HandleWrite,
+ WrapPersistent(clipboard_promise), WrapPersistent(data)));
+ return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* script_state,
+ const String& data) {
+ ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
+ clipboard_promise->GetTaskRunner()->PostTask(
+ BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText,
+ WrapPersistent(clipboard_promise), data));
+ return clipboard_promise->script_promise_resolver_->Promise();
+}
+
+ClipboardPromise::ClipboardPromise(ScriptState* script_state)
+ : ContextLifecycleObserver(blink::ExecutionContext::From(script_state)),
+ script_promise_resolver_(ScriptPromiseResolver::Create(script_state)),
+ buffer_(WebClipboard::kBufferStandard) {}
+
+WebTaskRunner* ClipboardPromise::GetTaskRunner() {
+ // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard.
+ return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI,
+ GetExecutionContext())
+ .Get();
+}
+
+// TODO(garykac): This currently only handles plain text.
+void ClipboardPromise::HandleRead() {
+ DCHECK(script_promise_resolver_);
+ String plain_text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
+
+ const DataTransfer::DataTransferType type =
+ DataTransfer::DataTransferType::kCopyAndPaste;
+ const DataTransferAccessPolicy access =
+ DataTransferAccessPolicy::kDataTransferReadable;
+ DataObject* data = DataObject::CreateFromString(plain_text);
+ DataTransfer* dt = DataTransfer::Create(type, access, data);
+ script_promise_resolver_->Resolve(dt);
+}
+
+void ClipboardPromise::HandleReadText() {
+ DCHECK(script_promise_resolver_);
+ String text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
+ script_promise_resolver_->Resolve(text);
+}
+
+// TODO(garykac): This currently only handles plain text.
+void ClipboardPromise::HandleWrite(DataTransfer* data) {
+ DCHECK(script_promise_resolver_);
+ size_t num_items = data->items()->length();
+ for (unsigned long i = 0; i < num_items; i++) {
+ DataTransferItem* item = data->items()->item(i);
+ DataObjectItem* objectItem = item->GetDataObjectItem();
+ if (objectItem->Kind() == DataObjectItem::kStringKind &&
+ objectItem->GetType() == kMimeTypeTextPlain) {
+ String text = objectItem->GetAsString();
+ Platform::Current()->Clipboard()->WritePlainText(text);
+ script_promise_resolver_->Resolve();
+ return;
+ }
+ }
+ script_promise_resolver_->Reject();
+}
+
+void ClipboardPromise::HandleWriteText(const String& data) {
+ DCHECK(script_promise_resolver_);
+ Platform::Current()->Clipboard()->WritePlainText(data);
+ script_promise_resolver_->Resolve();
+}
+
+DEFINE_TRACE(ClipboardPromise) {
+ visitor->Trace(script_promise_resolver_);
+ ContextLifecycleObserver::Trace(visitor);
+}
+
+} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/clipboard/ClipboardPromise.h ('k') | third_party/WebKit/Source/core/core_idl_files.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698