Home | History | Annotate | Download | only in chromium
      1 /*
      2  * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 #include "ChromiumDataObjectLegacy.h"
     33 
     34 #include "ClipboardMimeTypes.h"
     35 #include "Pasteboard.h"
     36 #include "PlatformBridge.h"
     37 
     38 namespace WebCore {
     39 
     40 // Per RFC 2483, the line separator for "text/..." MIME types is CR-LF.
     41 static char const* const textMIMETypeLineSeparator = "\r\n";
     42 
     43 void ChromiumDataObjectLegacy::clearData(const String& type)
     44 {
     45     if (type == mimeTypeTextPlain) {
     46         m_plainText = "";
     47         return;
     48     }
     49 
     50     if (type == mimeTypeURL || type == mimeTypeTextURIList) {
     51         m_uriList = "";
     52         m_url = KURL();
     53         m_urlTitle = "";
     54         return;
     55     }
     56 
     57     if (type == mimeTypeTextHTML) {
     58         m_textHtml = "";
     59         m_htmlBaseUrl = KURL();
     60         return;
     61     }
     62 
     63     if (type == mimeTypeDownloadURL) {
     64         m_downloadMetadata = "";
     65         return;
     66     }
     67 }
     68 
     69 void ChromiumDataObjectLegacy::clearAll()
     70 {
     71     clearAllExceptFiles();
     72     m_filenames.clear();
     73 }
     74 
     75 void ChromiumDataObjectLegacy::clearAllExceptFiles()
     76 {
     77     m_urlTitle = "";
     78     m_url = KURL();
     79     m_uriList = "";
     80     m_downloadMetadata = "";
     81     m_fileExtension = "";
     82     m_plainText = "";
     83     m_textHtml = "";
     84     m_htmlBaseUrl = KURL();
     85     m_fileContentFilename = "";
     86     if (m_fileContent)
     87         m_fileContent->clear();
     88 }
     89 
     90 bool ChromiumDataObjectLegacy::hasData() const
     91 {
     92     return !m_url.isEmpty()
     93         || !m_uriList.isEmpty()
     94         || !m_downloadMetadata.isEmpty()
     95         || !m_fileExtension.isEmpty()
     96         || !m_filenames.isEmpty()
     97         || !m_plainText.isEmpty()
     98         || !m_textHtml.isEmpty()
     99         || m_fileContent;
    100 }
    101 
    102 HashSet<String> ChromiumDataObjectLegacy::types() const
    103 {
    104     // This is currently broken for pasteboard events, and always has been.
    105     HashSet<String> results;
    106 
    107     if (!m_plainText.isEmpty()) {
    108         results.add(mimeTypeText);
    109         results.add(mimeTypeTextPlain);
    110     }
    111 
    112     if (m_url.isValid())
    113         results.add(mimeTypeURL);
    114 
    115     if (!m_uriList.isEmpty())
    116         results.add(mimeTypeTextURIList);
    117 
    118     if (!m_textHtml.isEmpty())
    119         results.add(mimeTypeTextHTML);
    120 
    121     if (!m_filenames.isEmpty())
    122         results.add("Files");
    123 
    124     return results;
    125 }
    126 
    127 String ChromiumDataObjectLegacy::getData(const String& type, bool& success)
    128 {
    129     if (type == mimeTypeTextPlain) {
    130         if (m_clipboardType == Clipboard::CopyAndPaste) {
    131             PasteboardPrivate::ClipboardBuffer buffer =
    132                 Pasteboard::generalPasteboard()->isSelectionMode() ?
    133                 PasteboardPrivate::SelectionBuffer :
    134                 PasteboardPrivate::StandardBuffer;
    135             String text = PlatformBridge::clipboardReadPlainText(buffer);
    136             success = !text.isEmpty();
    137             return text;
    138         }
    139         success = !m_plainText.isEmpty();
    140         return m_plainText;
    141     }
    142 
    143     if (type == mimeTypeURL) {
    144         success = !m_url.isEmpty();
    145         return m_url.string();
    146     }
    147 
    148     if (type == mimeTypeTextURIList) {
    149         success = !m_uriList.isEmpty();
    150         return m_uriList;
    151     }
    152 
    153     if (type == mimeTypeTextHTML) {
    154         if (m_clipboardType == Clipboard::CopyAndPaste) {
    155             PasteboardPrivate::ClipboardBuffer buffer =
    156                 Pasteboard::generalPasteboard()->isSelectionMode() ?
    157                 PasteboardPrivate::SelectionBuffer :
    158                 PasteboardPrivate::StandardBuffer;
    159             String htmlText;
    160             KURL sourceURL;
    161             PlatformBridge::clipboardReadHTML(buffer, &htmlText, &sourceURL);
    162             success = !htmlText.isEmpty();
    163             return htmlText;
    164         }
    165         success = !m_textHtml.isEmpty();
    166         return m_textHtml;
    167     }
    168 
    169     if (type == mimeTypeDownloadURL) {
    170         success = !m_downloadMetadata.isEmpty();
    171         return m_downloadMetadata;
    172     }
    173 
    174     success = false;
    175     return String();
    176 }
    177 
    178 bool ChromiumDataObjectLegacy::setData(const String& type, const String& data)
    179 {
    180     if (type == mimeTypeTextPlain) {
    181         m_plainText = data;
    182         return true;
    183     }
    184 
    185     if (type == mimeTypeURL || type == mimeTypeTextURIList) {
    186         m_url = KURL();
    187         Vector<String> uriList;
    188         // Line separator is \r\n per RFC 2483 - however, for compatibility
    189         // reasons we also allow just \n here.
    190         data.split('\n', uriList);
    191         // Process the input and copy the first valid URL into the url member.
    192         // In case no URLs can be found, subsequent calls to getData("URL")
    193         // will get an empty string. This is in line with the HTML5 spec (see
    194         // "The DragEvent and DataTransfer interfaces").
    195         for (size_t i = 0; i < uriList.size(); ++i) {
    196             String& line = uriList[i];
    197             line = line.stripWhiteSpace();
    198             if (line.isEmpty())
    199                 continue;
    200             if (line[0] == '#')
    201                 continue;
    202             KURL url = KURL(ParsedURLString, line);
    203             if (url.isValid()) {
    204                 m_url = url;
    205                 break;
    206             }
    207         }
    208         m_uriList = data;
    209         return true;
    210     }
    211 
    212     if (type == mimeTypeTextHTML) {
    213         m_textHtml = data;
    214         m_htmlBaseUrl = KURL();
    215         return true;
    216     }
    217 
    218     if (type == mimeTypeDownloadURL) {
    219         m_downloadMetadata = data;
    220         return true;
    221     }
    222 
    223     return false;
    224 }
    225 
    226 ChromiumDataObjectLegacy::ChromiumDataObjectLegacy(Clipboard::ClipboardType clipboardType)
    227     : m_clipboardType(clipboardType)
    228 {
    229 }
    230 
    231 ChromiumDataObjectLegacy::ChromiumDataObjectLegacy(const ChromiumDataObjectLegacy& other)
    232     : RefCounted<ChromiumDataObjectLegacy>()
    233     , m_clipboardType(other.m_clipboardType)
    234     , m_urlTitle(other.m_urlTitle)
    235     , m_downloadMetadata(other.m_downloadMetadata)
    236     , m_fileExtension(other.m_fileExtension)
    237     , m_filenames(other.m_filenames)
    238     , m_plainText(other.m_plainText)
    239     , m_textHtml(other.m_textHtml)
    240     , m_htmlBaseUrl(other.m_htmlBaseUrl)
    241     , m_fileContentFilename(other.m_fileContentFilename)
    242     , m_url(other.m_url)
    243     , m_uriList(other.m_uriList)
    244 {
    245     if (other.m_fileContent.get())
    246         m_fileContent = other.m_fileContent->copy();
    247 }
    248 
    249 } // namespace WebCore
    250