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

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

Issue 2695593006: Initial stub version of Async Clipboard API (Closed)
Patch Set: Add WPTs; Update naming conventions; Review comments 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/ClipboardAsync.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 ClipboardAsync* ClipboardAsync::create(ScriptState* scriptState) {
19 return new ClipboardAsync(scriptState);
20 }
21
22 ClipboardAsync::ClipboardAsync(ScriptState* scriptState)
23 : ContextLifecycleObserver(blink::ExecutionContext::From(scriptState)),
24 m_scriptPromiseResolver(ScriptPromiseResolver::Create(scriptState)),
25 m_buffer(WebClipboard::kBufferStandard) {}
dcheng 2017/05/13 22:18:32 Out of curiosity, do you see this being used for n
garykac 2017/05/17 23:51:14 Probably not. So I removed CORE_EXPORT from the .h
26
27 WebTaskRunner* ClipboardAsync::getTaskRunner() {
28 // TODO(garykac): Replace MiscPlatformAPI with TaskType specific to clipboard.
29 return TaskRunnerHelper::Get(TaskType::kMiscPlatformAPI,
30 GetExecutionContext())
31 .Get();
32 }
33
34 ScriptPromise ClipboardAsync::scheduleRead() {
35 getTaskRunner()->PostTask(
36 BLINK_FROM_HERE,
37 WTF::Bind(&ClipboardAsync::handleRead, WrapPersistent(this)));
38 return m_scriptPromiseResolver->Promise();
39 }
40
41 ScriptPromise ClipboardAsync::scheduleReadText() {
42 getTaskRunner()->PostTask(
43 BLINK_FROM_HERE,
44 WTF::Bind(&ClipboardAsync::handleReadText, WrapPersistent(this)));
45 return m_scriptPromiseResolver->Promise();
46 }
47
48 ScriptPromise ClipboardAsync::scheduleWrite(DataTransfer* data) {
49 getTaskRunner()->PostTask(
50 BLINK_FROM_HERE, WTF::Bind(&ClipboardAsync::handleWrite,
51 WrapPersistent(this), WrapPersistent(data)));
52 return m_scriptPromiseResolver->Promise();
53 }
54
55 ScriptPromise ClipboardAsync::scheduleWriteText(const String& data) {
56 getTaskRunner()->PostTask(
57 BLINK_FROM_HERE,
58 WTF::Bind(&ClipboardAsync::handleWriteText, WrapPersistent(this), data));
59 return m_scriptPromiseResolver->Promise();
60 }
61
62 // TODO(garykac): This currently only handles plain text.
63 void ClipboardAsync::handleRead() {
64 String plainText = Platform::Current()->Clipboard()->ReadPlainText(m_buffer);
65
66 DataTransfer::DataTransferType type =
67 DataTransfer::DataTransferType::kCopyAndPaste;
68 DataTransferAccessPolicy access =
69 DataTransferAccessPolicy::kDataTransferReadable;
70 DataObject* data = DataObject::CreateFromString(plainText);
71 DataTransfer* dt = DataTransfer::Create(type, access, data);
72 m_scriptPromiseResolver->Resolve(dt);
73 }
74
75 void ClipboardAsync::handleReadText() {
76 String text = Platform::Current()->Clipboard()->ReadPlainText(m_buffer);
77 m_scriptPromiseResolver->Resolve(text);
78 }
79
80 // TODO(garykac): This currently only handles plain text.
81 void ClipboardAsync::handleWrite(DataTransfer* data) {
82 size_t nItems = data->items()->length();
83 for (unsigned long i = 0; i < nItems; i++) {
84 DataTransferItem* item = data->items()->item(i);
85 DataObjectItem* objectItem = item->GetDataObjectItem();
86 if (objectItem->Kind() == DataObjectItem::kStringKind &&
87 objectItem->GetType() == "text/plain") {
88 String text = objectItem->GetAsString();
89 Platform::Current()->Clipboard()->WritePlainText(text);
90 m_scriptPromiseResolver->Resolve();
91 return;
92 }
93 }
94 m_scriptPromiseResolver->Reject();
95 }
96
97 void ClipboardAsync::handleWriteText(const String& data) {
98 Platform::Current()->Clipboard()->WritePlainText(data);
99 m_scriptPromiseResolver->Resolve();
100 }
101
102 void ClipboardAsync::ContextDestroyed(ExecutionContext*) {
103 m_scriptPromiseResolver.Clear();
dcheng 2017/05/13 22:18:32 As far as I can tell, we don't check that the m_sc
garykac 2017/05/17 23:51:14 AIUI, the resolver sticks around until garbage col
dcheng 2017/06/06 23:33:38 Right--but if we call clear() here, Member<ScriptP
garykac 2017/06/09 20:38:59 OK. I've removed the entire ContextDestroyed metho
104 }
105
106 DEFINE_TRACE(ClipboardAsync) {
107 visitor->Trace(m_scriptPromiseResolver);
108 ContextLifecycleObserver::Trace(visitor);
109 }
110
111 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698