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

Unified Diff: ui/base/clipboard/clipboard_android.cc

Issue 1012673004: Remove redundant android clipboard API calls from clipboard writing code Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Change HTMLClipboard support checking position Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698