Home | History | Annotate | Download | only in support
      1 // Copyright (c) 2012 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.
      4 
      5 #include "webkit/support/mock_webclipboard_impl.h"
      6 
      7 #include <algorithm>
      8 
      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 "third_party/WebKit/public/platform/WebCommon.h"
     14 #include "third_party/WebKit/public/platform/WebDragData.h"
     15 #include "third_party/WebKit/public/platform/WebImage.h"
     16 #include "third_party/WebKit/public/platform/WebURL.h"
     17 #include "ui/base/clipboard/clipboard.h"
     18 #include "ui/gfx/codec/png_codec.h"
     19 #include "ui/gfx/size.h"
     20 #include "webkit/glue/webkit_glue.h"
     21 #include "webkit/renderer/clipboard_utils.h"
     22 
     23 using WebKit::WebDragData;
     24 using WebKit::WebString;
     25 using WebKit::WebURL;
     26 using WebKit::WebVector;
     27 
     28 MockWebClipboardImpl::MockWebClipboardImpl() {
     29 }
     30 
     31 MockWebClipboardImpl::~MockWebClipboardImpl() {
     32 }
     33 
     34 bool MockWebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) {
     35   switch (format) {
     36     case FormatPlainText:
     37       return !m_plainText.isNull();
     38 
     39     case FormatHTML:
     40       return !m_htmlText.isNull();
     41 
     42     case FormatSmartPaste:
     43       return m_writeSmartPaste;
     44 
     45     default:
     46       NOTREACHED();
     47       return false;
     48   }
     49 
     50   switch (buffer) {
     51     case BufferStandard:
     52       break;
     53     case BufferSelection:
     54 #if defined(OS_POSIX) && !defined(OS_MACOSX)
     55       break;
     56 #endif
     57     default:
     58       NOTREACHED();
     59       return false;
     60   }
     61 
     62   return true;
     63 }
     64 
     65 WebVector<WebString> MockWebClipboardImpl::readAvailableTypes(
     66     Buffer buffer, bool* containsFilenames) {
     67   *containsFilenames = false;
     68   std::vector<WebString> results;
     69   if (!m_plainText.isEmpty()) {
     70     results.push_back(WebString("text/plain"));
     71   }
     72   if (!m_htmlText.isEmpty()) {
     73     results.push_back(WebString("text/html"));
     74   }
     75   if (!m_image.isNull()) {
     76     results.push_back(WebString("image/png"));
     77   }
     78   for (std::map<base::string16, base::string16>::const_iterator it =
     79            m_customData.begin();
     80        it != m_customData.end(); ++it) {
     81     CHECK(std::find(results.begin(), results.end(), it->first) ==
     82           results.end());
     83     results.push_back(it->first);
     84   }
     85   return results;
     86 }
     87 
     88 WebKit::WebString MockWebClipboardImpl::readPlainText(
     89     WebKit::WebClipboard::Buffer buffer) {
     90   return m_plainText;
     91 }
     92 
     93 // TODO(wtc): set output argument *url.
     94 WebKit::WebString MockWebClipboardImpl::readHTML(
     95     WebKit::WebClipboard::Buffer buffer, WebKit::WebURL* url,
     96     unsigned* fragmentStart, unsigned* fragmentEnd) {
     97   *fragmentStart = 0;
     98   *fragmentEnd = static_cast<unsigned>(m_htmlText.length());
     99   return m_htmlText;
    100 }
    101 
    102 WebKit::WebData MockWebClipboardImpl::readImage(
    103     WebKit::WebClipboard::Buffer buffer) {
    104   std::string data;
    105   std::vector<unsigned char> encoded_image;
    106   // TODO(dcheng): Verify that we can assume the image is ARGB8888. Note that
    107   // for endianess reasons, it will be BGRA8888 on Windows.
    108   const SkBitmap& bitmap = m_image.getSkBitmap();
    109   SkAutoLockPixels lock(bitmap);
    110   gfx::PNGCodec::Encode(static_cast<unsigned char*>(bitmap.getPixels()),
    111 #if defined(OS_ANDROID)
    112                         gfx::PNGCodec::FORMAT_RGBA,
    113 #else
    114                         gfx::PNGCodec::FORMAT_BGRA,
    115 #endif
    116                         gfx::Size(bitmap.width(), bitmap.height()),
    117                         bitmap.rowBytes(),
    118                         false /* discard_transparency */,
    119                         std::vector<gfx::PNGCodec::Comment>(),
    120                         &encoded_image);
    121   data.assign(reinterpret_cast<char*>(vector_as_array(&encoded_image)),
    122               encoded_image.size());
    123   return data;
    124 }
    125 
    126 WebKit::WebString MockWebClipboardImpl::readCustomData(
    127     WebKit::WebClipboard::Buffer buffer,
    128     const WebKit::WebString& type) {
    129   std::map<base::string16, base::string16>::const_iterator it =
    130       m_customData.find(type);
    131   if (it != m_customData.end())
    132     return it->second;
    133   return WebKit::WebString();
    134 }
    135 
    136 void MockWebClipboardImpl::writeHTML(
    137     const WebKit::WebString& htmlText, const WebKit::WebURL& url,
    138     const WebKit::WebString& plainText, bool writeSmartPaste) {
    139   clear();
    140 
    141   m_htmlText = htmlText;
    142   m_plainText = plainText;
    143   m_writeSmartPaste = writeSmartPaste;
    144 }
    145 
    146 void MockWebClipboardImpl::writePlainText(const WebKit::WebString& plain_text) {
    147   clear();
    148 
    149   m_plainText = plain_text;
    150 }
    151 
    152 void MockWebClipboardImpl::writeURL(
    153     const WebKit::WebURL& url, const WebKit::WebString& title) {
    154   clear();
    155 
    156   m_htmlText = WebString::fromUTF8(webkit_clipboard::URLToMarkup(url, title));
    157   m_plainText = url.spec().utf16();
    158 }
    159 
    160 void MockWebClipboardImpl::writeImage(const WebKit::WebImage& image,
    161     const WebKit::WebURL& url, const WebKit::WebString& title) {
    162   if (!image.isNull()) {
    163     clear();
    164 
    165     m_plainText = m_htmlText;
    166     m_htmlText = WebString::fromUTF8(
    167         webkit_clipboard::URLToImageMarkup(url, title));
    168     m_image = image;
    169   }
    170 }
    171 
    172 void MockWebClipboardImpl::writeDataObject(const WebDragData& data) {
    173   clear();
    174 
    175   const WebVector<WebDragData::Item>& itemList = data.items();
    176   for (size_t i = 0; i < itemList.size(); ++i) {
    177     const WebDragData::Item& item = itemList[i];
    178     switch (item.storageType) {
    179       case WebDragData::Item::StorageTypeString: {
    180         if (EqualsASCII(item.stringType, ui::Clipboard::kMimeTypeText)) {
    181           m_plainText = item.stringData;
    182           continue;
    183         }
    184         if (EqualsASCII(item.stringType, ui::Clipboard::kMimeTypeHTML)) {
    185           m_htmlText = item.stringData;
    186           continue;
    187         }
    188         m_customData.insert(std::make_pair(item.stringType, item.stringData));
    189         continue;
    190       }
    191       case WebDragData::Item::StorageTypeFilename:
    192       case WebDragData::Item::StorageTypeBinaryData:
    193         NOTREACHED();  // Currently unused by the clipboard implementation.
    194     }
    195   }
    196 }
    197 
    198 void MockWebClipboardImpl::clear() {
    199   m_plainText = WebString();
    200   m_htmlText = WebString();
    201   m_image.reset();
    202   m_customData.clear();
    203   m_writeSmartPaste = false;
    204 }
    205