| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "webkit/glue/webclipboard_impl.h" | 5 #include "webkit/glue/webclipboard_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "googleurl/src/gurl.h" | 10 #include "googleurl/src/gurl.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 markup.append("\""); | 55 markup.append("\""); |
| 56 if (!title.isEmpty()) { | 56 if (!title.isEmpty()) { |
| 57 markup.append(" alt=\""); | 57 markup.append(" alt=\""); |
| 58 markup.append(net::EscapeForHTML(UTF16ToUTF8(title))); | 58 markup.append(net::EscapeForHTML(UTF16ToUTF8(title))); |
| 59 markup.append("\""); | 59 markup.append("\""); |
| 60 } | 60 } |
| 61 markup.append("/>"); | 61 markup.append("/>"); |
| 62 return markup; | 62 return markup; |
| 63 } | 63 } |
| 64 | 64 |
| 65 WebClipboardImpl::WebClipboardImpl(ClipboardClient* client) |
| 66 : client_(client) { |
| 67 } |
| 68 |
| 65 WebClipboardImpl::~WebClipboardImpl() { | 69 WebClipboardImpl::~WebClipboardImpl() { |
| 66 } | 70 } |
| 67 | 71 |
| 68 uint64 WebClipboardImpl::getSequenceNumber() { | 72 uint64 WebClipboardImpl::getSequenceNumber() { |
| 69 return sequenceNumber(BufferStandard); | 73 return sequenceNumber(BufferStandard); |
| 70 } | 74 } |
| 71 | 75 |
| 72 uint64 WebClipboardImpl::sequenceNumber(Buffer buffer) { | 76 uint64 WebClipboardImpl::sequenceNumber(Buffer buffer) { |
| 73 ui::Clipboard::Buffer buffer_type; | 77 ui::Clipboard::Buffer buffer_type; |
| 74 if (!ConvertBufferType(buffer, &buffer_type)) | 78 if (!ConvertBufferType(buffer, &buffer_type)) |
| 75 return 0; | 79 return 0; |
| 76 | 80 |
| 77 return ClipboardGetSequenceNumber(buffer_type); | 81 return client_->GetSequenceNumber(buffer_type); |
| 78 } | 82 } |
| 79 | 83 |
| 80 bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) { | 84 bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) { |
| 81 ui::Clipboard::FormatType format_type; | 85 ui::Clipboard::FormatType format_type; |
| 82 ui::Clipboard::Buffer buffer_type; | 86 ui::Clipboard::Buffer buffer_type; |
| 83 | 87 |
| 84 if (!ConvertBufferType(buffer, &buffer_type)) | 88 if (!ConvertBufferType(buffer, &buffer_type)) |
| 85 return false; | 89 return false; |
| 86 | 90 |
| 87 switch (format) { | 91 switch (format) { |
| 88 case FormatPlainText: | 92 case FormatPlainText: |
| 89 return ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), | 93 return client_->IsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), |
| 90 buffer_type) || | 94 buffer_type) || |
| 91 ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextWFormatType(), | 95 client_->IsFormatAvailable(ui::Clipboard::GetPlainTextWFormatType(), |
| 92 buffer_type); | 96 buffer_type); |
| 93 case FormatHTML: | 97 case FormatHTML: |
| 94 format_type = ui::Clipboard::GetHtmlFormatType(); | 98 format_type = ui::Clipboard::GetHtmlFormatType(); |
| 95 break; | 99 break; |
| 96 case FormatSmartPaste: | 100 case FormatSmartPaste: |
| 97 format_type = ui::Clipboard::GetWebKitSmartPasteFormatType(); | 101 format_type = ui::Clipboard::GetWebKitSmartPasteFormatType(); |
| 98 break; | 102 break; |
| 99 case FormatBookmark: | 103 case FormatBookmark: |
| 100 #if defined(OS_WIN) || defined(OS_MACOSX) | 104 #if defined(OS_WIN) || defined(OS_MACOSX) |
| 101 format_type = ui::Clipboard::GetUrlWFormatType(); | 105 format_type = ui::Clipboard::GetUrlWFormatType(); |
| 102 break; | 106 break; |
| 103 #endif | 107 #endif |
| 104 default: | 108 default: |
| 105 NOTREACHED(); | 109 NOTREACHED(); |
| 106 return false; | 110 return false; |
| 107 } | 111 } |
| 108 | 112 |
| 109 return ClipboardIsFormatAvailable(format_type, buffer_type); | 113 return client_->IsFormatAvailable(format_type, buffer_type); |
| 110 } | 114 } |
| 111 | 115 |
| 112 WebVector<WebString> WebClipboardImpl::readAvailableTypes( | 116 WebVector<WebString> WebClipboardImpl::readAvailableTypes( |
| 113 Buffer buffer, bool* contains_filenames) { | 117 Buffer buffer, bool* contains_filenames) { |
| 114 ui::Clipboard::Buffer buffer_type; | 118 ui::Clipboard::Buffer buffer_type; |
| 115 std::vector<string16> types; | 119 std::vector<string16> types; |
| 116 if (ConvertBufferType(buffer, &buffer_type)) { | 120 if (ConvertBufferType(buffer, &buffer_type)) { |
| 117 ClipboardReadAvailableTypes(buffer_type, &types, contains_filenames); | 121 client_->ReadAvailableTypes(buffer_type, &types, contains_filenames); |
| 118 } | 122 } |
| 119 return types; | 123 return types; |
| 120 } | 124 } |
| 121 | 125 |
| 122 WebString WebClipboardImpl::readPlainText(Buffer buffer) { | 126 WebString WebClipboardImpl::readPlainText(Buffer buffer) { |
| 123 ui::Clipboard::Buffer buffer_type; | 127 ui::Clipboard::Buffer buffer_type; |
| 124 if (!ConvertBufferType(buffer, &buffer_type)) | 128 if (!ConvertBufferType(buffer, &buffer_type)) |
| 125 return WebString(); | 129 return WebString(); |
| 126 | 130 |
| 127 if (ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextWFormatType(), | 131 if (client_->IsFormatAvailable(ui::Clipboard::GetPlainTextWFormatType(), |
| 128 buffer_type)) { | 132 buffer_type)) { |
| 129 string16 text; | 133 string16 text; |
| 130 ClipboardReadText(buffer_type, &text); | 134 client_->ReadText(buffer_type, &text); |
| 131 if (!text.empty()) | 135 if (!text.empty()) |
| 132 return text; | 136 return text; |
| 133 } | 137 } |
| 134 | 138 |
| 135 if (ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), | 139 if (client_->IsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(), |
| 136 buffer_type)) { | 140 buffer_type)) { |
| 137 std::string text; | 141 std::string text; |
| 138 ClipboardReadAsciiText(buffer_type, &text); | 142 client_->ReadAsciiText(buffer_type, &text); |
| 139 if (!text.empty()) | 143 if (!text.empty()) |
| 140 return ASCIIToUTF16(text); | 144 return ASCIIToUTF16(text); |
| 141 } | 145 } |
| 142 | 146 |
| 143 return WebString(); | 147 return WebString(); |
| 144 } | 148 } |
| 145 | 149 |
| 146 WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url, | 150 WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url, |
| 147 unsigned* fragment_start, | 151 unsigned* fragment_start, |
| 148 unsigned* fragment_end) { | 152 unsigned* fragment_end) { |
| 149 ui::Clipboard::Buffer buffer_type; | 153 ui::Clipboard::Buffer buffer_type; |
| 150 if (!ConvertBufferType(buffer, &buffer_type)) | 154 if (!ConvertBufferType(buffer, &buffer_type)) |
| 151 return WebString(); | 155 return WebString(); |
| 152 | 156 |
| 153 string16 html_stdstr; | 157 string16 html_stdstr; |
| 154 GURL gurl; | 158 GURL gurl; |
| 155 ClipboardReadHTML(buffer_type, &html_stdstr, &gurl, | 159 client_->ReadHTML(buffer_type, &html_stdstr, &gurl, |
| 156 static_cast<uint32*>(fragment_start), | 160 static_cast<uint32*>(fragment_start), |
| 157 static_cast<uint32*>(fragment_end)); | 161 static_cast<uint32*>(fragment_end)); |
| 158 *source_url = gurl; | 162 *source_url = gurl; |
| 159 return html_stdstr; | 163 return html_stdstr; |
| 160 } | 164 } |
| 161 | 165 |
| 162 WebData WebClipboardImpl::readImage(Buffer buffer) { | 166 WebData WebClipboardImpl::readImage(Buffer buffer) { |
| 163 ui::Clipboard::Buffer buffer_type; | 167 ui::Clipboard::Buffer buffer_type; |
| 164 if (!ConvertBufferType(buffer, &buffer_type)) | 168 if (!ConvertBufferType(buffer, &buffer_type)) |
| 165 return WebData(); | 169 return WebData(); |
| 166 | 170 |
| 167 std::string png_data; | 171 std::string png_data; |
| 168 ClipboardReadImage(buffer_type, &png_data); | 172 client_->ReadImage(buffer_type, &png_data); |
| 169 return WebData(png_data); | 173 return WebData(png_data); |
| 170 } | 174 } |
| 171 | 175 |
| 172 void WebClipboardImpl::writeHTML( | 176 void WebClipboardImpl::writeHTML( |
| 173 const WebString& html_text, const WebURL& source_url, | 177 const WebString& html_text, const WebURL& source_url, |
| 174 const WebString& plain_text, bool write_smart_paste) { | 178 const WebString& plain_text, bool write_smart_paste) { |
| 175 ScopedClipboardWriterGlue scw(ClipboardGetClipboard()); | 179 ScopedClipboardWriterGlue scw(client_); |
| 176 scw.WriteHTML(html_text, source_url.spec()); | 180 scw.WriteHTML(html_text, source_url.spec()); |
| 177 scw.WriteText(plain_text); | 181 scw.WriteText(plain_text); |
| 178 | 182 |
| 179 if (write_smart_paste) | 183 if (write_smart_paste) |
| 180 scw.WriteWebSmartPaste(); | 184 scw.WriteWebSmartPaste(); |
| 181 } | 185 } |
| 182 | 186 |
| 183 void WebClipboardImpl::writePlainText(const WebString& plain_text) { | 187 void WebClipboardImpl::writePlainText(const WebString& plain_text) { |
| 184 ScopedClipboardWriterGlue scw(ClipboardGetClipboard()); | 188 ScopedClipboardWriterGlue scw(client_); |
| 185 scw.WriteText(plain_text); | 189 scw.WriteText(plain_text); |
| 186 } | 190 } |
| 187 | 191 |
| 188 void WebClipboardImpl::writeURL(const WebURL& url, const WebString& title) { | 192 void WebClipboardImpl::writeURL(const WebURL& url, const WebString& title) { |
| 189 ScopedClipboardWriterGlue scw(ClipboardGetClipboard()); | 193 ScopedClipboardWriterGlue scw(client_); |
| 190 | 194 |
| 191 scw.WriteBookmark(title, url.spec()); | 195 scw.WriteBookmark(title, url.spec()); |
| 192 scw.WriteHTML(UTF8ToUTF16(URLToMarkup(url, title)), ""); | 196 scw.WriteHTML(UTF8ToUTF16(URLToMarkup(url, title)), ""); |
| 193 scw.WriteText(UTF8ToUTF16(std::string(url.spec()))); | 197 scw.WriteText(UTF8ToUTF16(std::string(url.spec()))); |
| 194 } | 198 } |
| 195 | 199 |
| 196 void WebClipboardImpl::writeImage( | 200 void WebClipboardImpl::writeImage( |
| 197 const WebImage& image, const WebURL& url, const WebString& title) { | 201 const WebImage& image, const WebURL& url, const WebString& title) { |
| 198 ScopedClipboardWriterGlue scw(ClipboardGetClipboard()); | 202 ScopedClipboardWriterGlue scw(client_); |
| 199 | 203 |
| 200 if (!image.isNull()) { | 204 if (!image.isNull()) { |
| 201 #if WEBKIT_USING_SKIA | 205 #if WEBKIT_USING_SKIA |
| 202 const SkBitmap& bitmap = image.getSkBitmap(); | 206 const SkBitmap& bitmap = image.getSkBitmap(); |
| 203 #elif WEBKIT_USING_CG | 207 #elif WEBKIT_USING_CG |
| 204 const SkBitmap& bitmap = gfx::CGImageToSkBitmap(image.getCGImageRef()); | 208 const SkBitmap& bitmap = gfx::CGImageToSkBitmap(image.getCGImageRef()); |
| 205 #endif | 209 #endif |
| 206 SkAutoLockPixels locked(bitmap); | 210 SkAutoLockPixels locked(bitmap); |
| 207 scw.WriteBitmapFromPixels(bitmap.getPixels(), image.size()); | 211 scw.WriteBitmapFromPixels(bitmap.getPixels(), image.size()); |
| 208 } | 212 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 219 // http://crbug.com/33016 for details. | 223 // http://crbug.com/33016 for details. |
| 220 scw.WriteHTML(UTF8ToUTF16(URLToImageMarkup(url, title)), ""); | 224 scw.WriteHTML(UTF8ToUTF16(URLToImageMarkup(url, title)), ""); |
| 221 #endif | 225 #endif |
| 222 } | 226 } |
| 223 } | 227 } |
| 224 | 228 |
| 225 void WebClipboardImpl::writeDataObject(const WebDragData& data) { | 229 void WebClipboardImpl::writeDataObject(const WebDragData& data) { |
| 226 // TODO(dcheng): This actually results in a double clear of the clipboard. | 230 // TODO(dcheng): This actually results in a double clear of the clipboard. |
| 227 // Once in WebKit, and once here when the clipboard writer goes out of scope. | 231 // Once in WebKit, and once here when the clipboard writer goes out of scope. |
| 228 // The same is true of the other WebClipboard::write* methods. | 232 // The same is true of the other WebClipboard::write* methods. |
| 229 ScopedClipboardWriterGlue scw(ClipboardGetClipboard()); | 233 ScopedClipboardWriterGlue scw(client_); |
| 230 | 234 |
| 231 // TODO(dcheng): Properly support text/uri-list here. | 235 // TODO(dcheng): Properly support text/uri-list here. |
| 232 scw.WriteText(data.plainText()); | 236 scw.WriteText(data.plainText()); |
| 233 scw.WriteHTML(data.htmlText(), ""); | 237 scw.WriteHTML(data.htmlText(), ""); |
| 234 } | 238 } |
| 235 | 239 |
| 236 bool WebClipboardImpl::ConvertBufferType(Buffer buffer, | 240 bool WebClipboardImpl::ConvertBufferType(Buffer buffer, |
| 237 ui::Clipboard::Buffer* result) { | 241 ui::Clipboard::Buffer* result) { |
| 238 switch (buffer) { | 242 switch (buffer) { |
| 239 case BufferStandard: | 243 case BufferStandard: |
| 240 *result = ui::Clipboard::BUFFER_STANDARD; | 244 *result = ui::Clipboard::BUFFER_STANDARD; |
| 241 break; | 245 break; |
| 242 case BufferSelection: | 246 case BufferSelection: |
| 243 #if defined(USE_X11) && !defined(USE_AURA) | 247 #if defined(USE_X11) && !defined(USE_AURA) |
| 244 *result = ui::Clipboard::BUFFER_SELECTION; | 248 *result = ui::Clipboard::BUFFER_SELECTION; |
| 245 break; | 249 break; |
| 246 #endif | 250 #endif |
| 247 default: | 251 default: |
| 248 NOTREACHED(); | 252 NOTREACHED(); |
| 249 return false; | 253 return false; |
| 250 } | 254 } |
| 251 return true; | 255 return true; |
| 252 } | 256 } |
| 253 | 257 |
| 254 } // namespace webkit_glue | 258 } // namespace webkit_glue |
| OLD | NEW |