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) { |