OLD | NEW |
---|---|
(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 | |
OLD | NEW |