1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/test/mock_webclipboard_impl.h"
9 #include "base/logging.h"
10 #include "base/stl_util.h"
11 #include "base/strings/string_util.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "content/renderer/clipboard_utils.h"
14 #include "third_party/WebKit/public/platform/WebCommon.h"
15 #include "third_party/WebKit/public/platform/WebDragData.h"
16 #include "third_party/WebKit/public/platform/WebImage.h"
17 #include "third_party/WebKit/public/platform/WebURL.h"
18 #include "ui/base/clipboard/clipboard.h"
19 #include "ui/gfx/codec/png_codec.h"
20 #include "ui/gfx/size.h"
21 #include "webkit/glue/webkit_glue.h"
23 using WebKit::WebDragData
;
24 using WebKit::WebString
;
26 using WebKit::WebVector
;
30 MockWebClipboardImpl::MockWebClipboardImpl() {}
32 MockWebClipboardImpl::~MockWebClipboardImpl() {}
34 bool MockWebClipboardImpl::isFormatAvailable(Format format
, Buffer buffer
) {
37 return !m_plainText
.isNull();
40 return !m_htmlText
.isNull();
42 case FormatSmartPaste
:
43 return m_writeSmartPaste
;
54 #if defined(OS_POSIX) && !defined(OS_MACOSX)
65 WebVector
<WebString
> MockWebClipboardImpl::readAvailableTypes(
67 bool* containsFilenames
) {
68 *containsFilenames
= false;
69 std::vector
<WebString
> results
;
70 if (!m_plainText
.isEmpty()) {
71 results
.push_back(WebString("text/plain"));
73 if (!m_htmlText
.isEmpty()) {
74 results
.push_back(WebString("text/html"));
76 if (!m_image
.isNull()) {
77 results
.push_back(WebString("image/png"));
79 for (std::map
<base::string16
, base::string16
>::const_iterator it
=
81 it
!= m_customData
.end(); ++it
) {
82 CHECK(std::find(results
.begin(), results
.end(), it
->first
) ==
84 results
.push_back(it
->first
);
89 WebKit::WebString
MockWebClipboardImpl::readPlainText(
90 WebKit::WebClipboard::Buffer buffer
) {
94 // TODO(wtc): set output argument *url.
95 WebKit::WebString
MockWebClipboardImpl::readHTML(
96 WebKit::WebClipboard::Buffer buffer
,
98 unsigned* fragmentStart
,
99 unsigned* fragmentEnd
) {
101 *fragmentEnd
= static_cast<unsigned>(m_htmlText
.length());
105 WebKit::WebData
MockWebClipboardImpl::readImage(
106 WebKit::WebClipboard::Buffer buffer
) {
108 std::vector
<unsigned char> encoded_image
;
109 // TODO(dcheng): Verify that we can assume the image is ARGB8888. Note that
110 // for endianess reasons, it will be BGRA8888 on Windows.
111 const SkBitmap
& bitmap
= m_image
.getSkBitmap();
112 SkAutoLockPixels
lock(bitmap
);
113 gfx::PNGCodec::Encode(static_cast<unsigned char*>(bitmap
.getPixels()),
114 #if defined(OS_ANDROID)
115 gfx::PNGCodec::FORMAT_RGBA
,
117 gfx::PNGCodec::FORMAT_BGRA
,
119 gfx::Size(bitmap
.width(), bitmap
.height()),
121 false /* discard_transparency */,
122 std::vector
<gfx::PNGCodec::Comment
>(),
124 data
.assign(reinterpret_cast<char*>(vector_as_array(&encoded_image
)),
125 encoded_image
.size());
129 WebKit::WebString
MockWebClipboardImpl::readCustomData(
130 WebKit::WebClipboard::Buffer buffer
,
131 const WebKit::WebString
& type
) {
132 std::map
<base::string16
, base::string16
>::const_iterator it
=
133 m_customData
.find(type
);
134 if (it
!= m_customData
.end())
136 return WebKit::WebString();
139 void MockWebClipboardImpl::writeHTML(const WebKit::WebString
& htmlText
,
140 const WebKit::WebURL
& url
,
141 const WebKit::WebString
& plainText
,
142 bool writeSmartPaste
) {
145 m_htmlText
= htmlText
;
146 m_plainText
= plainText
;
147 m_writeSmartPaste
= writeSmartPaste
;
150 void MockWebClipboardImpl::writePlainText(const WebKit::WebString
& plain_text
) {
153 m_plainText
= plain_text
;
156 void MockWebClipboardImpl::writeURL(const WebKit::WebURL
& url
,
157 const WebKit::WebString
& title
) {
160 m_htmlText
= WebString::fromUTF8(URLToMarkup(url
, title
));
161 m_plainText
= url
.spec().utf16();
164 void MockWebClipboardImpl::writeImage(const WebKit::WebImage
& image
,
165 const WebKit::WebURL
& url
,
166 const WebKit::WebString
& title
) {
167 if (!image
.isNull()) {
170 m_plainText
= m_htmlText
;
171 m_htmlText
= WebString::fromUTF8(URLToImageMarkup(url
, title
));
176 void MockWebClipboardImpl::writeDataObject(const WebDragData
& data
) {
179 const WebVector
<WebDragData::Item
>& itemList
= data
.items();
180 for (size_t i
= 0; i
< itemList
.size(); ++i
) {
181 const WebDragData::Item
& item
= itemList
[i
];
182 switch (item
.storageType
) {
183 case WebDragData::Item::StorageTypeString
: {
184 if (EqualsASCII(item
.stringType
, ui::Clipboard::kMimeTypeText
)) {
185 m_plainText
= item
.stringData
;
188 if (EqualsASCII(item
.stringType
, ui::Clipboard::kMimeTypeHTML
)) {
189 m_htmlText
= item
.stringData
;
192 m_customData
.insert(std::make_pair(item
.stringType
, item
.stringData
));
195 case WebDragData::Item::StorageTypeFilename
:
196 case WebDragData::Item::StorageTypeBinaryData
:
197 NOTREACHED(); // Currently unused by the clipboard implementation.
202 void MockWebClipboardImpl::clear() {
203 m_plainText
= WebString();
204 m_htmlText
= WebString();
206 m_customData
.clear();
207 m_writeSmartPaste
= false;
210 } // namespace content