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

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

Issue 136193002: Add Clipboard::GetSequenceNumber test and fix Android. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 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
Index: ui/base/clipboard/clipboard_android.cc
diff --git a/ui/base/clipboard/clipboard_android.cc b/ui/base/clipboard/clipboard_android.cc
index e5e2a960d4da4c4558f8e4c115ca8d4ab3bf285e..ea44d4538ef5da987ce35586a4089c96f5c580e2 100644
--- a/ui/base/clipboard/clipboard_android.cc
+++ b/ui/base/clipboard/clipboard_android.cc
@@ -45,7 +45,7 @@ const char kBookmarkFormat[] = "bookmark";
const char kMimeTypePepperCustomData[] = "chromium/x-pepper-custom-data";
const char kMimeTypeWebCustomData[] = "chromium/x-web-custom-data";
-class ClipboardMap {
+class ClipboardMap : public ClipboardChangeListener {
public:
ClipboardMap();
std::string Get(const std::string& format);
@@ -53,17 +53,23 @@ class ClipboardMap {
void Set(const std::string& format, const std::string& data);
void Clear();
+ uint64 sequence_number() const { return sequence_number_; }
+
private:
+ // Called from Java when the clipboard changes.
+ void OnChange(JNIEnv* env, jobject obj) OVERRIDE;
+
void SyncWithAndroidClipboard();
std::map<std::string, std::string> map_;
base::Lock lock_;
// Java class and methods for the Android ClipboardManager.
ScopedJavaGlobalRef<jobject> clipboard_manager_;
+ uint64 sequence_number_;
};
base::LazyInstance<ClipboardMap>::Leaky g_map = LAZY_INSTANCE_INITIALIZER;
-ClipboardMap::ClipboardMap() {
+ClipboardMap::ClipboardMap() : sequence_number_(0) {
JNIEnv* env = AttachCurrentThread();
DCHECK(env);
@@ -75,6 +81,10 @@ ClipboardMap::ClipboardMap() {
Java_Clipboard_create(env, context);
DCHECK(local_ref.obj());
clipboard_manager_.Reset(env, local_ref.Release());
+
+ Java_Clipboard_addChangeListener(
+ env, clipboard_manager_.obj(), reinterpret_cast<intptr_t>(this));
+ LOG(ERROR) << "Hello?";
}
std::string ClipboardMap::Get(const std::string& format) {
@@ -127,6 +137,12 @@ void ClipboardMap::Clear() {
Java_Clipboard_setText(env, clipboard_manager_.obj(), NULL);
}
+void ClipboardMap::OnChange(JNIEnv* env, jobject obj) {
+ LOG(ERROR) << "Ping";
+ // TODO(dcheng): We may or may not need a lock here.
+ ++sequence_number_;
+}
+
// If the internal map contains a plain-text entry and it does not match that
// in the Android clipboard, clear the map and insert the Android text into it.
// If there is an HTML entry in the Android clipboard it gets inserted in the
@@ -223,10 +239,7 @@ void Clipboard::WriteObjects(ClipboardType type, const ObjectMap& objects) {
uint64 Clipboard::GetSequenceNumber(ClipboardType /* type */) {
DCHECK(CalledOnValidThread());
- // TODO: implement this. For now this interface will advertise
- // that the clipboard never changes. That's fine as long as we
- // don't rely on this signal.
- return 0;
+ return g_map.Get().sequence_number();
}
bool Clipboard::IsFormatAvailable(const Clipboard::FormatType& format,
@@ -389,6 +402,7 @@ const Clipboard::FormatType& Clipboard::GetPepperCustomDataFormatType() {
}
void Clipboard::WriteText(const char* text_data, size_t text_len) {
+ DCHECK(CalledOnValidThread());
g_map.Get().Set(kPlainTextFormat, std::string(text_data, text_len));
}
@@ -396,10 +410,12 @@ void Clipboard::WriteHTML(const char* markup_data,
size_t markup_len,
const char* url_data,
size_t url_len) {
+ DCHECK(CalledOnValidThread());
g_map.Get().Set(kHTMLFormat, std::string(markup_data, markup_len));
}
void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
+ DCHECK(CalledOnValidThread());
NOTIMPLEMENTED();
}
@@ -407,18 +423,21 @@ void Clipboard::WriteRTF(const char* rtf_data, size_t data_len) {
// URL spec.
void Clipboard::WriteBookmark(const char* title_data, size_t title_len,
const char* url_data, size_t url_len) {
+ DCHECK(CalledOnValidThread());
g_map.Get().Set(kBookmarkFormat, std::string(url_data, url_len));
}
// Write an extra flavor that signifies WebKit was the last to modify the
// pasteboard. This flavor has no data.
void Clipboard::WriteWebSmartPaste() {
+ DCHECK(CalledOnValidThread());
g_map.Get().Set(kWebKitSmartPasteFormat, std::string());
}
// Note: we implement this to pass all unit tests but it is currently unclear
// how some code would consume this.
void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
+ DCHECK(CalledOnValidThread());
gfx::Size size(bitmap.width(), bitmap.height());
std::string packed(reinterpret_cast<const char*>(&size), sizeof(size));
@@ -432,6 +451,7 @@ void Clipboard::WriteBitmap(const SkBitmap& bitmap) {
void Clipboard::WriteData(const Clipboard::FormatType& format,
const char* data_data, size_t data_len) {
+ DCHECK(CalledOnValidThread());
g_map.Get().Set(format.data(), std::string(data_data, data_len));
}

Powered by Google App Engine
This is Rietveld 408576698