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

Side by Side 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/clipboard/ClipboardPromise.h"
6
7 #include "bindings/core/v8/ScriptPromiseResolver.h"
8 #include "core/clipboard/DataObject.h"
9 #include "core/clipboard/DataTransfer.h"
10 #include "core/clipboard/DataTransferItem.h"
11 #include "core/clipboard/DataTransferItemList.h"
12 #include "core/dom/TaskRunnerHelper.h"
13 #include "platform/CrossThreadFunctional.h"
14 #include "platform/clipboard/ClipboardMimeTypes.h"
15 #include "public/platform/Platform.h"
16
17 namespace blink {
18
19 ScriptPromise ClipboardPromise::CreateForRead(ScriptState* script_state) {
20 ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
21 clipboard_promise->GetTaskRunner()->PostTask(
22 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead,
23 WrapPersistent(clipboard_promise)));
24 return clipboard_promise->script_promise_resolver_->Promise();
25 }
26
27 ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* script_state) {
28 ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
29 clipboard_promise->GetTaskRunner()->PostTask(
30 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText,
31 WrapPersistent(clipboard_promise)));
32 return clipboard_promise->script_promise_resolver_->Promise();
33 }
34
35 ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* script_state,
36 DataTransfer* data) {
37 ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
38 clipboard_promise->GetTaskRunner()->PostTask(
39 BLINK_FROM_HERE,
40 WTF::Bind(&ClipboardPromise::HandleWrite,
41 WrapPersistent(clipboard_promise), WrapPersistent(data)));
42 return clipboard_promise->script_promise_resolver_->Promise();
43 }
44
45 ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* script_state,
46 const String& data) {
47 ClipboardPromise* clipboard_promise = new ClipboardPromise(script_state);
48 clipboard_promise->GetTaskRunner()->PostTask(
49 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText,
50 WrapPersistent(clipboard_promise), data));
51 return clipboard_promise->script_promise_resolver_->Promise();
52 }
53
54 ClipboardPromise::ClipboardPromise(ScriptState* script_state)
55 : ContextLifecycleObserver(blink::ExecutionContext::From(script_state)),
56 script_promise_resolver_(ScriptPromiseResolver::Create(script_state)),
57 buffer_(WebClipboard::kBufferStandard) {}
58
59 WebTaskRunner* ClipboardPromise::GetTaskRunner() {
60 // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard.
61 return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI,
62 GetExecutionContext())
63 .Get();
64 }
65
66 // TODO(garykac): This currently only handles plain text.
67 void ClipboardPromise::HandleRead() {
68 DCHECK(script_promise_resolver_);
69 String plain_text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
70
71 const DataTransfer::DataTransferType type =
72 DataTransfer::DataTransferType::kCopyAndPaste;
73 const DataTransferAccessPolicy access =
74 DataTransferAccessPolicy::kDataTransferReadable;
75 DataObject* data = DataObject::CreateFromString(plain_text);
76 DataTransfer* dt = DataTransfer::Create(type, access, data);
77 script_promise_resolver_->Resolve(dt);
78 }
79
80 void ClipboardPromise::HandleReadText() {
81 DCHECK(script_promise_resolver_);
82 String text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
83 script_promise_resolver_->Resolve(text);
84 }
85
86 // TODO(garykac): This currently only handles plain text.
87 void ClipboardPromise::HandleWrite(DataTransfer* data) {
88 DCHECK(script_promise_resolver_);
89 size_t num_items = data->items()->length();
90 for (unsigned long i = 0; i < num_items; i++) {
91 DataTransferItem* item = data->items()->item(i);
92 DataObjectItem* objectItem = item->GetDataObjectItem();
93 if (objectItem->Kind() == DataObjectItem::kStringKind &&
94 objectItem->GetType() == kMimeTypeTextPlain) {
95 String text = objectItem->GetAsString();
96 Platform::Current()->Clipboard()->WritePlainText(text);
97 script_promise_resolver_->Resolve();
98 return;
99 }
100 }
101 script_promise_resolver_->Reject();
102 }
103
104 void ClipboardPromise::HandleWriteText(const String& data) {
105 DCHECK(script_promise_resolver_);
106 Platform::Current()->Clipboard()->WritePlainText(data);
107 script_promise_resolver_->Resolve();
108 }
109
110 DEFINE_TRACE(ClipboardPromise) {
111 visitor->Trace(script_promise_resolver_);
112 ContextLifecycleObserver::Trace(visitor);
113 }
114
115 } // namespace blink
OLDNEW
« 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