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

Side by Side Diff: third_party/WebKit/Source/core/clipboard/ClipboardPromise.cpp

Issue 2695593006: Initial stub version of Async Clipboard API (Closed)
Patch Set: Address review comments; improve tests Created 3 years, 7 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 "public/platform/Platform.h"
15
16 namespace blink {
17
18 ScriptPromise ClipboardPromise::CreateForRead(ScriptState* scriptState) {
dcheng 2017/06/06 23:33:38 Nit: script_state, etc since we know use Chromium/
garykac 2017/06/09 20:38:59 Done.
19 ClipboardPromise* clipboardPromise = new ClipboardPromise(scriptState);
20 clipboardPromise->GetTaskRunner()->PostTask(
21 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleRead,
22 WrapPersistent(clipboardPromise)));
23 return clipboardPromise->scriptPromiseResolver_->Promise();
24 }
25
26 ScriptPromise ClipboardPromise::CreateForReadText(ScriptState* scriptState) {
27 ClipboardPromise* clipboardPromise = new ClipboardPromise(scriptState);
28 clipboardPromise->GetTaskRunner()->PostTask(
29 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleReadText,
30 WrapPersistent(clipboardPromise)));
31 return clipboardPromise->scriptPromiseResolver_->Promise();
32 }
33
34 ScriptPromise ClipboardPromise::CreateForWrite(ScriptState* scriptState,
35 DataTransfer* data) {
36 ClipboardPromise* clipboardPromise = new ClipboardPromise(scriptState);
37 clipboardPromise->GetTaskRunner()->PostTask(
38 BLINK_FROM_HERE,
39 WTF::Bind(&ClipboardPromise::HandleWrite,
40 WrapPersistent(clipboardPromise), WrapPersistent(data)));
41 return clipboardPromise->scriptPromiseResolver_->Promise();
42 }
43
44 ScriptPromise ClipboardPromise::CreateForWriteText(ScriptState* scriptState,
45 const String& data) {
46 ClipboardPromise* clipboardPromise = new ClipboardPromise(scriptState);
47 clipboardPromise->GetTaskRunner()->PostTask(
48 BLINK_FROM_HERE, WTF::Bind(&ClipboardPromise::HandleWriteText,
49 WrapPersistent(clipboardPromise), data));
50 return clipboardPromise->scriptPromiseResolver_->Promise();
51 }
52
53 ClipboardPromise::ClipboardPromise(ScriptState* scriptState)
54 : ContextLifecycleObserver(blink::ExecutionContext::From(scriptState)),
55 scriptPromiseResolver_(ScriptPromiseResolver::Create(scriptState)),
56 buffer_(WebClipboard::kBufferStandard) {}
57
58 WebTaskRunner* ClipboardPromise::GetTaskRunner() {
59 // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard.
60 return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI,
61 GetExecutionContext())
62 .Get();
63 }
64
65 // TODO(garykac): This currently only handles plain text.
66 void ClipboardPromise::HandleRead() {
67 DCHECK(scriptPromiseResolver_);
68 String plainText = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
69
70 DataTransfer::DataTransferType type =
71 DataTransfer::DataTransferType::kCopyAndPaste;
72 DataTransferAccessPolicy access =
73 DataTransferAccessPolicy::kDataTransferReadable;
74 DataObject* data = DataObject::CreateFromString(plainText);
75 DataTransfer* dt = DataTransfer::Create(type, access, data);
76 scriptPromiseResolver_->Resolve(dt);
77 }
78
79 void ClipboardPromise::HandleReadText() {
80 DCHECK(scriptPromiseResolver_);
81 String text = Platform::Current()->Clipboard()->ReadPlainText(buffer_);
82 scriptPromiseResolver_->Resolve(text);
83 }
84
85 // TODO(garykac): This currently only handles plain text.
86 void ClipboardPromise::HandleWrite(DataTransfer* data) {
87 DCHECK(scriptPromiseResolver_);
88 size_t nItems = data->items()->length();
89 for (unsigned long i = 0; i < nItems; i++) {
90 DataTransferItem* item = data->items()->item(i);
91 DataObjectItem* objectItem = item->GetDataObjectItem();
92 if (objectItem->Kind() == DataObjectItem::kStringKind &&
93 objectItem->GetType() == "text/plain") {
dcheng 2017/06/06 23:33:38 Nit: please use kMimeTypeTextPlain from ClipboardM
garykac 2017/06/09 20:38:59 Done.
94 String text = objectItem->GetAsString();
95 Platform::Current()->Clipboard()->WritePlainText(text);
96 scriptPromiseResolver_->Resolve();
97 return;
98 }
99 }
100 scriptPromiseResolver_->Reject();
101 }
102
103 void ClipboardPromise::HandleWriteText(const String& data) {
104 DCHECK(scriptPromiseResolver_);
105 Platform::Current()->Clipboard()->WritePlainText(data);
106 scriptPromiseResolver_->Resolve();
107 }
108
109 void ClipboardPromise::ContextDestroyed(ExecutionContext*) {
110 DCHECK(scriptPromiseResolver_);
111 scriptPromiseResolver_.Clear();
112 }
113
114 DEFINE_TRACE(ClipboardPromise) {
115 visitor->Trace(scriptPromiseResolver_);
116 ContextLifecycleObserver::Trace(visitor);
117 }
118
119 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698