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

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

Issue 8364037: Implement clipboard for aura and re-enable clipboard_unittests. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: modified according to comments Created 9 years, 2 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 | « ui/base/clipboard/clipboard_aura.cc ('k') | ui/base/clipboard/clipboard_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/clipboard/clipboard_aurax11.cc
diff --git a/ui/base/clipboard/clipboard_aurax11.cc b/ui/base/clipboard/clipboard_aurax11.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d96cd274e9a52fd171a68fced4c152f3da9242b6
--- /dev/null
+++ b/ui/base/clipboard/clipboard_aurax11.cc
@@ -0,0 +1,332 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/base/clipboard/clipboard.h"
+
+#include "base/logging.h"
+#include "base/utf_string_conversions.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/linux_util.h"
+#include "ui/gfx/size.h"
+
+namespace ui {
+
+namespace {
+const char kMimeTypeBitmap[] = "image/bmp";
+const char kMimeTypeWebkitSmartPaste[] = "chromium/x-webkit-paste";
+
+// ClipboardData contains data copied to the Clipboard for a variety of formats.
+// It mostly just provides APIs to cleanly access and manipulate this data.
+class ClipboardData {
+ public:
+ ClipboardData()
+ : bitmap_data_(),
+ custom_data_data_(),
+ custom_data_len_(0),
+ web_smart_paste_(false) {}
+
+ virtual ~ClipboardData() {}
+
+ const std::string& text() const { return text_; }
+ void set_text(const std::string& text) { text_ = text; }
+
+ const std::string& markup_data() const { return markup_data_; }
+ void set_markup_data(const std::string& markup_data) {
+ markup_data_ = markup_data;
+ }
+
+ const std::string& url() const { return url_; }
+ void set_url(const std::string& url) { url_ = url; }
+
+ const std::string& bookmark_title() const { return bookmark_title_; }
+ void set_bookmark_title(const std::string& bookmark_title) {
+ bookmark_title_ = bookmark_title;
+ }
+
+ const std::string& bookmark_url() const { return bookmark_url_; }
+ void set_bookmark_url(const std::string& bookmark_url) {
+ bookmark_url_ = bookmark_url;
+ }
+
+ uint8_t* bitmap_data() const { return bitmap_data_.get(); }
+ const gfx::Size& bitmap_size() const { return bitmap_size_; }
+ void SetBitmapData(const char* pixel_data, const char* size_data) {
+ bitmap_size_ = *reinterpret_cast<const gfx::Size*>(size_data);
+
+ // We assume 4-byte pixel data.
+ size_t bitmap_data_len = 4 * bitmap_size_.width() * bitmap_size_.height();
+ bitmap_data_.reset(new uint8_t[bitmap_data_len]);
+ memcpy(bitmap_data_.get(), pixel_data, bitmap_data_len);
+ }
+
+ const std::string& custom_data_format() const { return custom_data_format_; }
+ char* custom_data_data() const { return custom_data_data_.get(); }
+ size_t custom_data_len() const { return custom_data_len_; }
+
+ void SetCustomData(const std::string& data_format,
+ const char* data_data,
+ size_t data_len) {
+ custom_data_len_ = data_len;
+ if (custom_data_len_ == 0) {
+ custom_data_data_.reset();
+ custom_data_format_.clear();
+ return;
+ }
+ custom_data_data_.reset(new char[custom_data_len_]);
+ memcpy(custom_data_data_.get(), data_data, custom_data_len_);
+ custom_data_format_ = data_format;
+ }
+
+ bool web_smart_paste() const { return web_smart_paste_; }
+ void set_web_smart_paste(bool web_smart_paste) {
+ web_smart_paste_ = web_smart_paste;
+ }
+
+ private:
+ // Plain text in UTF8 format.
+ std::string text_;
+
+ // HTML markup data in UTF8 format.
+ std::string markup_data_;
+ std::string url_;
+
+ // Bookmark title in UTF8 format.
+ std::string bookmark_title_;
+ std::string bookmark_url_;
+
+ // Bitmap images.
+ scoped_array<uint8_t> bitmap_data_;
+ gfx::Size bitmap_size_;
+
+ // Data with custom format.
+ std::string custom_data_format_;
+ scoped_array<char> custom_data_data_;
+ size_t custom_data_len_;
+
+ // WebKit smart paste data.
+ bool web_smart_paste_;
+
+ DISALLOW_COPY_AND_ASSIGN(ClipboardData);
+};
+
+ClipboardData* clipboard_data = NULL;
+
+ClipboardData* GetClipboardData() {
+ if (!clipboard_data)
+ clipboard_data = new ClipboardData();
+ return clipboard_data;
+}
+
+void DeleteClipboardData() {
+ if (clipboard_data)
+ delete clipboard_data;
+ clipboard_data = NULL;
+}
+
+} // namespace
+
+// TODO(varunjain): Complete implementation:
+// 1. Handle different types of BUFFERs.
+// 2. Do we need to care about concurrency here? Can there be multiple instances
+// of ui::Clipboard? Ask oshima.
+// 3. Implement File types.
+// 4. Handle conversion between types.
+
+Clipboard::Clipboard() {
+ // Make sure clipboard is created.
+ GetClipboardData();
+}
+
+Clipboard::~Clipboard() {
+}
+
+void Clipboard::WriteObjects(const ObjectMap& objects) {
+ // We need to overwrite previous data. Probably best to just delete
+ // everything and start fresh.
+ DeleteClipboardData();
+ for (ObjectMap::const_iterator iter = objects.begin();
+ iter != objects.end(); ++iter) {
+ DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
+ }
+}
+
+void Clipboard::WriteObjects(const ObjectMap& objects,
+ base::ProcessHandle process) {
+ NOTIMPLEMENTED();
+}
+
+bool Clipboard::IsFormatAvailable(const FormatType& format,
+ Buffer buffer) const {
+ ClipboardData* data = GetClipboardData();
+ if (GetPlainTextFormatType() == format)
+ return !data->text().empty();
+ else if (GetHtmlFormatType() == format)
+ return !data->markup_data().empty() || !data->url().empty();
+ else if (GetBitmapFormatType() == format)
+ return !!data->bitmap_data();
+ else if (GetWebKitSmartPasteFormatType() == format)
+ return data->web_smart_paste();
+ else if (data->custom_data_format() == format)
+ return true;
+ return false;
+}
+
+bool Clipboard::IsFormatAvailableByString(const std::string& format,
+ Buffer buffer) const {
+ return IsFormatAvailable(format, buffer);
+}
+
+void Clipboard::ReadAvailableTypes(Buffer buffer, std::vector<string16>* types,
+ bool* contains_filenames) const {
+ if (!types || !contains_filenames) {
+ NOTREACHED();
+ return;
+ }
+
+ types->clear();
+ if (IsFormatAvailable(GetPlainTextFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(GetPlainTextFormatType()));
+ if (IsFormatAvailable(GetHtmlFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(GetHtmlFormatType()));
+ if (IsFormatAvailable(GetBitmapFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(GetBitmapFormatType()));
+ if (IsFormatAvailable(GetWebKitSmartPasteFormatType(), buffer))
+ types->push_back(UTF8ToUTF16(GetWebKitSmartPasteFormatType()));
+ *contains_filenames = false;
+}
+
+void Clipboard::ReadText(Buffer buffer, string16* result) const {
+ *result = UTF8ToUTF16(GetClipboardData()->text());
+}
+
+void Clipboard::ReadAsciiText(Buffer buffer, std::string* result) const {
+ *result = GetClipboardData()->text();
+}
+
+void Clipboard::ReadHTML(Buffer buffer,
+ string16* markup,
+ std::string* src_url,
+ uint32* fragment_start,
+ uint32* fragment_end) const {
+ markup->clear();
+ if (src_url)
+ src_url->clear();
+ *fragment_start = 0;
+ *fragment_end = 0;
+
+ *markup = UTF8ToUTF16(GetClipboardData()->markup_data());
+ *src_url = GetClipboardData()->url();
+
+ *fragment_start = 0;
+ DCHECK(markup->length() <= kuint32max);
+ *fragment_end = static_cast<uint32>(markup->length());
+
+}
+
+SkBitmap Clipboard::ReadImage(Buffer buffer) const {
+ const gfx::Size size = GetClipboardData()->bitmap_size();
+ uint8_t* bitmap = GetClipboardData()->bitmap_data();
+ SkBitmap image;
+ image.setConfig(SkBitmap::kARGB_8888_Config, size.width(), size.height(), 0);
+ image.allocPixels();
+ image.eraseARGB(0, 0, 0, 0);
+ int byte_counter = 0;
+ for (int i = 0; i < size.height(); ++i) {
+ for (int j = 0; j < size.width(); ++j) {
+ uint32* pixel = image.getAddr32(j, i);
+ *pixel = (bitmap[byte_counter] << 0) + /* R */
+ (bitmap[byte_counter + 1] << 8) + /* G */
+ (bitmap[byte_counter + 2] << 16) + /* B */
+ (bitmap[byte_counter + 3] << 24); /* A */
+ byte_counter += 4;
+ }
+ }
+ return image;
+}
+
+void Clipboard::ReadBookmark(string16* title, std::string* url) const {
+ *title = UTF8ToUTF16(GetClipboardData()->bookmark_title());
+ *url = GetClipboardData()->bookmark_url();
+}
+
+void Clipboard::ReadFile(FilePath* file) const {
+ NOTIMPLEMENTED();
+}
+
+void Clipboard::ReadFiles(std::vector<FilePath>* files) const {
+ NOTIMPLEMENTED();
+}
+
+void Clipboard::ReadData(const std::string& format, std::string* result) {
+ result->clear();
+ ClipboardData* data = GetClipboardData();
+ if (data->custom_data_format() == format)
+ *result = std::string(data->custom_data_data(), data->custom_data_len());
+}
+
+uint64 Clipboard::GetSequenceNumber() {
+ NOTIMPLEMENTED();
+ return 0;
+}
+
+void Clipboard::WriteText(const char* text_data, size_t text_len) {
+ GetClipboardData()->set_text(std::string(text_data, text_len));
+}
+
+void Clipboard::WriteHTML(const char* markup_data,
+ size_t markup_len,
+ const char* url_data,
+ size_t url_len) {
+ GetClipboardData()->set_markup_data(std::string(markup_data, markup_len));
+ GetClipboardData()->set_url(std::string(url_data, url_len));
+}
+
+void Clipboard::WriteBookmark(const char* title_data,
+ size_t title_len,
+ const char* url_data,
+ size_t url_len) {
+ GetClipboardData()->set_bookmark_title(std::string(title_data, title_len));
+ GetClipboardData()->set_bookmark_url(std::string(url_data, url_len));
+}
+
+void Clipboard::WriteWebSmartPaste() {
+ GetClipboardData()->set_web_smart_paste(true);
+}
+
+void Clipboard::WriteBitmap(const char* pixel_data, const char* size_data) {
+ GetClipboardData()->SetBitmapData(pixel_data, size_data);
+}
+
+void Clipboard::WriteData(const char* format_name, size_t format_len,
+ const char* data_data, size_t data_len) {
+ GetClipboardData()->SetCustomData(std::string(format_name, format_len),
+ data_data, data_len);
+}
+
+// static
+Clipboard::FormatType Clipboard::GetPlainTextFormatType() {
+ return std::string(kMimeTypeText);
+}
+
+// static
+Clipboard::FormatType Clipboard::GetPlainTextWFormatType() {
+ return GetPlainTextFormatType();
+}
+
+// static
+Clipboard::FormatType Clipboard::GetHtmlFormatType() {
+ return std::string(kMimeTypeHTML);
+}
+
+// static
+Clipboard::FormatType Clipboard::GetBitmapFormatType() {
+ return std::string(kMimeTypeBitmap);
+}
+
+// static
+Clipboard::FormatType Clipboard::GetWebKitSmartPasteFormatType() {
+ return std::string(kMimeTypeWebkitSmartPaste);
+}
+
+} // namespace ui
« no previous file with comments | « ui/base/clipboard/clipboard_aura.cc ('k') | ui/base/clipboard/clipboard_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698