Chromium Code Reviews| 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 |