| Index: ui/base/clipboard/clipboard_android.cc
|
| diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc
|
| index d4a6548c5ae74a21ec1e1aa571434415bf42f96c..ec8bf37120ddc30d6622acef8d4df77265bd839b 100644
|
| --- a/ui/base/clipboard/clipboard_android.cc
|
| +++ b/ui/base/clipboard/clipboard_android.cc
|
| @@ -52,6 +52,7 @@ class ClipboardMap {
|
| bool HasFormat(const std::string& format);
|
| void Set(const std::string& format, const std::string& data);
|
| void Clear();
|
| + void CommitToAndroidClipboard();
|
|
|
| private:
|
| void SyncWithAndroidClipboard();
|
| @@ -91,33 +92,8 @@ bool ClipboardMap::HasFormat(const std::string& format) {
|
| }
|
|
|
| void ClipboardMap::Set(const std::string& format, const std::string& data) {
|
| - JNIEnv* env = AttachCurrentThread();
|
| base::AutoLock lock(lock_);
|
| - SyncWithAndroidClipboard();
|
| -
|
| map_[format] = data;
|
| - if (format == kPlainTextFormat) {
|
| - ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(env, data);
|
| - DCHECK(str.obj());
|
| -
|
| - Java_Clipboard_setText(env, clipboard_manager_.obj(), str.obj());
|
| - } else if (format == kHTMLFormat) {
|
| - // Android's API for storing HTML content on the clipboard requires a plain-
|
| - // text representation to be available as well. ScopedClipboardWriter has a
|
| - // stable order for setting clipboard data, ensuring that plain-text data
|
| - // is available first. Do not write to the clipboard when only HTML data is
|
| - // available, because otherwise others apps may not be able to paste it.
|
| - if (!ContainsKey(map_, kPlainTextFormat))
|
| - return;
|
| -
|
| - ScopedJavaLocalRef<jstring> html = ConvertUTF8ToJavaString(env, data);
|
| - ScopedJavaLocalRef<jstring> text = ConvertUTF8ToJavaString(
|
| - env, map_[kPlainTextFormat].c_str());
|
| -
|
| - DCHECK(html.obj() && text.obj());
|
| - Java_Clipboard_setHTMLText(
|
| - env, clipboard_manager_.obj(), html.obj(), text.obj());
|
| - }
|
| }
|
|
|
| void ClipboardMap::Clear() {
|
| @@ -176,6 +152,35 @@ void ClipboardMap::SyncWithAndroidClipboard() {
|
| }
|
| }
|
|
|
| +void ClipboardMap::CommitToAndroidClipboard() {
|
| + JNIEnv* env = AttachCurrentThread();
|
| + base::AutoLock lock(lock_);
|
| + // Android's API for storing HTML content on the clipboard requires a plain-
|
| + // text representation to be available as well. ScopedClipboardWriter has a
|
| + // stable order for setting clipboard data, ensuring that plain-text data
|
| + // is available first. Do not write to the clipboard when only HTML data is
|
| + // available, because otherwise others apps may not be able to paste it.
|
| + if (ContainsKey(map_, kHTMLFormat) &&
|
| + ContainsKey(map_, kPlainTextFormat) &&
|
| + Java_Clipboard_isHTMLClipboardSupported(env)) {
|
| + ScopedJavaLocalRef<jstring> text = ConvertUTF8ToJavaString(
|
| + env, map_[kPlainTextFormat]);
|
| + DCHECK(text.obj());
|
| +
|
| + ScopedJavaLocalRef<jstring> html = ConvertUTF8ToJavaString(
|
| + env, map_[kHTMLFormat]);
|
| + DCHECK(html.obj());
|
| + Java_Clipboard_setHTMLText(
|
| + env, clipboard_manager_.obj(), html.obj(), text.obj());
|
| +
|
| + } else if (ContainsKey(map_, kPlainTextFormat)) {
|
| + ScopedJavaLocalRef<jstring> str = ConvertUTF8ToJavaString(
|
| + env, map_[kPlainTextFormat]);
|
| + DCHECK(str.obj());
|
| + Java_Clipboard_setText(env, clipboard_manager_.obj(), str.obj());
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| // Clipboard::FormatType implementation.
|
| @@ -408,6 +413,7 @@ void ClipboardAndroid::WriteObjects(ClipboardType type,
|
| ++iter) {
|
| DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
|
| }
|
| + g_map.Get().CommitToAndroidClipboard();
|
| }
|
|
|
| void ClipboardAndroid::WriteText(const char* text_data, size_t text_len) {
|
|
|