Chromium Code Reviews| 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..7fcf8b93ae6fcae9c3fff34e9dd7566e720e270c 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 CommitToClipboard(); |
|
dcheng
2015/03/18 03:42:46
Probably should be "CommitToAndroidClipboard()". I
|
| 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,40 @@ void ClipboardMap::SyncWithAndroidClipboard() { |
| } |
| } |
| +void ClipboardMap::CommitToClipboard() { |
| + 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)) { |
| + ScopedJavaLocalRef<jstring> text = ConvertUTF8ToJavaString( |
| + env, map_[kPlainTextFormat].c_str()); |
|
dcheng
2015/03/18 03:42:46
The c_str() here (and below) is superfluous.
|
| + DCHECK(text.obj()); |
| + |
| + if (!Java_Clipboard_isHTMLClipboardSupported(env)) { |
|
dcheng
2015/03/18 03:42:46
Why wasn't this check previously needed?
dcheng
2015/03/18 03:42:46
Why wasn't this check previously needed?
|
| + Java_Clipboard_setText(env, clipboard_manager_.obj(), text.obj()); |
| + return; |
| + } |
| + |
| + ScopedJavaLocalRef<jstring> html = ConvertUTF8ToJavaString( |
| + env, map_[kHTMLFormat].c_str()); |
| + |
| + 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].c_str()); |
| + DCHECK(str.obj()); |
| + Java_Clipboard_setText(env, clipboard_manager_.obj(), str.obj()); |
| + } |
| +} |
| + |
| } // namespace |
| // Clipboard::FormatType implementation. |
| @@ -408,6 +418,7 @@ void ClipboardAndroid::WriteObjects(ClipboardType type, |
| ++iter) { |
| DispatchObject(static_cast<ObjectType>(iter->first), iter->second); |
| } |
| + g_map.Get().CommitToClipboard(); |
| } |
| void ClipboardAndroid::WriteText(const char* text_data, size_t text_len) { |