Changeset 92769 in webkit


Ignore:
Timestamp:
Aug 10, 2011 8:27:17 AM (13 years ago)
Author:
commit-queue@webkit.org
Message:

Unify the way we generate HTML for an image in the Clipboard
https://bugs.webkit.org/show_bug.cgi?id=58043

Patch by Benjamin Poulain <benjamin@webkit.org> on 2011-08-10
Reviewed by Ryosuke Niwa.

Source/WebCore:

Unify the way we generate the markup when dragging and image.

Previously, the code was using the special function imageToMarkup() that was
spread from the Chromium port.
That function ignores some edge cases so this patch replace it by the
more generic MarkupAccumulator (which is also used by the other pasteboard
actions).

The MarkupAccumulator was modified because following r61178, the local filepath
are treated differently (the enum was changed to make this behavior
explicit).

Tests: fast/drag-and-drop/drag-and-drop-image-contenteditable.html

fast/drag-and-drop/drag-and-drop-inputimage-contenteditable.html
fast/drag-and-drop/drag-and-drop-objectimage-contenteditable.html

  • editing/MarkupAccumulator.cpp:

(WebCore::MarkupAccumulator::MarkupAccumulator):
(WebCore::MarkupAccumulator::resolveURLIfNeeded):
(WebCore::MarkupAccumulator::appendAttribute):

  • editing/MarkupAccumulator.h:
  • editing/markup.cpp:
  • editing/markup.h:
  • page/PageSerializer.cpp:

(WebCore::SerializerMarkupAccumulator::SerializerMarkupAccumulator):

  • platform/chromium/ClipboardChromium.cpp:

(WebCore::ClipboardChromium::declareAndWriteDragImage):
(WebCore::ClipboardChromium::writeRange):

  • platform/chromium/PasteboardChromium.cpp:

(WebCore::Pasteboard::writeSelection):

  • platform/gtk/ClipboardGtk.cpp:

(WebCore::ClipboardGtk::declareAndWriteDragImage):
(WebCore::ClipboardGtk::writeRange):

  • platform/gtk/DataObjectGtk.cpp:

(WebCore::DataObjectGtk::markup):

  • platform/gtk/PasteboardGtk.cpp:

(WebCore::Pasteboard::writeSelection):
(WebCore::Pasteboard::writeImage):

  • platform/haiku/PasteboardHaiku.cpp:

(WebCore::Pasteboard::writeSelection):

  • platform/qt/ClipboardQt.cpp:

(WebCore::ClipboardQt::declareAndWriteDragImage):
(WebCore::ClipboardQt::writeRange):

  • platform/qt/PasteboardQt.cpp:

(WebCore::Pasteboard::writeSelection):

  • platform/win/ClipboardWin.cpp:

(WebCore::ClipboardWin::declareAndWriteDragImage):

LayoutTests:

Add 3 tests for dragging an image-like element to an editable area.

  • editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt: Added.
  • editing/pasteboard/drag-and-drop-image-contenteditable.html: Added.
  • editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt: Added.
  • editing/pasteboard/drag-and-drop-inputimage-contenteditable.html: Added.
  • editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt: Added.
  • editing/pasteboard/drag-and-drop-objectimage-contenteditable.html: Added.
  • platform/qt/Skipped: Qt does not have support for testing drag and drop.
Location:
trunk
Files:
6 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r92768 r92769  
     12011-08-10  Benjamin Poulain  <benjamin@webkit.org>
     2
     3        Unify the way we generate HTML for an image in the Clipboard
     4        https://bugs.webkit.org/show_bug.cgi?id=58043
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Add 3 tests for dragging an image-like element to an editable area.
     9
     10        * editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt: Added.
     11        * editing/pasteboard/drag-and-drop-image-contenteditable.html: Added.
     12        * editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt: Added.
     13        * editing/pasteboard/drag-and-drop-inputimage-contenteditable.html: Added.
     14        * editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt: Added.
     15        * editing/pasteboard/drag-and-drop-objectimage-contenteditable.html: Added.
     16        * platform/qt/Skipped: Qt does not have support for testing drag and drop.
     17
    1182011-08-10  Pavel Feldman  <pfeldman@google.com>
    219
  • trunk/LayoutTests/platform/qt/Skipped

    r92761 r92769  
    256256editing/pasteboard/drop-text-events.html
    257257editing/pasteboard/drop-text-events-sideeffect.html
     258editing/pasteboard/drag-and-drop-image-contenteditable.html
     259editing/pasteboard/drag-and-drop-inputimage-contenteditable.html
     260editing/pasteboard/drag-and-drop-objectimage-contenteditable.html
    258261
    259262# data-transfer-items is not a default build option
  • trunk/Source/WebCore/ChangeLog

    r92768 r92769  
     12011-08-10  Benjamin Poulain  <benjamin@webkit.org>
     2
     3        Unify the way we generate HTML for an image in the Clipboard
     4        https://bugs.webkit.org/show_bug.cgi?id=58043
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        Unify the way we generate the markup when dragging and image.
     9
     10        Previously, the code was using the special function imageToMarkup() that was
     11        spread from the Chromium port.
     12        That function ignores some edge cases so this patch replace it by the
     13        more generic MarkupAccumulator (which is also used by the other pasteboard
     14        actions).
     15
     16        The MarkupAccumulator was modified because following r61178, the local filepath
     17        are treated differently (the enum was changed to  make this behavior
     18        explicit).
     19
     20        Tests: fast/drag-and-drop/drag-and-drop-image-contenteditable.html
     21               fast/drag-and-drop/drag-and-drop-inputimage-contenteditable.html
     22               fast/drag-and-drop/drag-and-drop-objectimage-contenteditable.html
     23
     24        * editing/MarkupAccumulator.cpp:
     25        (WebCore::MarkupAccumulator::MarkupAccumulator):
     26        (WebCore::MarkupAccumulator::resolveURLIfNeeded):
     27        (WebCore::MarkupAccumulator::appendAttribute):
     28        * editing/MarkupAccumulator.h:
     29        * editing/markup.cpp:
     30        * editing/markup.h:
     31        * page/PageSerializer.cpp:
     32        (WebCore::SerializerMarkupAccumulator::SerializerMarkupAccumulator):
     33        * platform/chromium/ClipboardChromium.cpp:
     34        (WebCore::ClipboardChromium::declareAndWriteDragImage):
     35        (WebCore::ClipboardChromium::writeRange):
     36        * platform/chromium/PasteboardChromium.cpp:
     37        (WebCore::Pasteboard::writeSelection):
     38        * platform/gtk/ClipboardGtk.cpp:
     39        (WebCore::ClipboardGtk::declareAndWriteDragImage):
     40        (WebCore::ClipboardGtk::writeRange):
     41        * platform/gtk/DataObjectGtk.cpp:
     42        (WebCore::DataObjectGtk::markup):
     43        * platform/gtk/PasteboardGtk.cpp:
     44        (WebCore::Pasteboard::writeSelection):
     45        (WebCore::Pasteboard::writeImage):
     46        * platform/haiku/PasteboardHaiku.cpp:
     47        (WebCore::Pasteboard::writeSelection):
     48        * platform/qt/ClipboardQt.cpp:
     49        (WebCore::ClipboardQt::declareAndWriteDragImage):
     50        (WebCore::ClipboardQt::writeRange):
     51        * platform/qt/PasteboardQt.cpp:
     52        (WebCore::Pasteboard::writeSelection):
     53        * platform/win/ClipboardWin.cpp:
     54        (WebCore::ClipboardWin::declareAndWriteDragImage):
     55
    1562011-08-10  Pavel Feldman  <pfeldman@google.com>
    257
  • trunk/Source/WebCore/editing/MarkupAccumulator.cpp

    r86330 r92769  
    7474}
    7575
    76 MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range)
     76MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs resolveUrlsMethod, const Range* range)
    7777    : m_nodes(nodes)
    7878    , m_range(range)
    79     , m_shouldResolveURLs(shouldResolveURLs)
     79    , m_resolveURLsMethod(resolveUrlsMethod)
    8080{
    8181}
     
    113113    if (!childrenOnly)
    114114        appendEndTag(node);
     115}
     116
     117String MarkupAccumulator::resolveURLIfNeeded(const Element* element, const String& urlString) const
     118{
     119    switch (m_resolveURLsMethod) {
     120    case ResolveAllURLs:
     121        return element->document()->completeURL(urlString).string();
     122
     123    case ResolveNonLocalURLs:
     124        if (!element->document()->url().isLocalFile())
     125            return element->document()->completeURL(urlString).string();
     126        break;
     127
     128    case DoNotResolveURLs:
     129        break;
     130    }
     131    return urlString;
    115132}
    116133
     
    372389    out.append('=');
    373390
    374     if (element->isURLAttribute(const_cast<Attribute*>(&attribute))) {
    375         // We don't want to complete file:/// URLs because it may contain sensitive information
    376         // about the user's system.
    377         if (shouldResolveURLs() && !element->document()->url().isLocalFile())
    378             appendQuotedURLAttributeValue(out, element->document()->completeURL(attribute.value()).string());
    379         else
    380             appendQuotedURLAttributeValue(out, attribute.value());
    381     } else {
     391    if (element->isURLAttribute(const_cast<Attribute*>(&attribute)))
     392        appendQuotedURLAttributeValue(out, resolveURLIfNeeded(element, attribute.value()));
     393    else {
    382394        out.append('\"');
    383395        appendAttributeValue(out, attribute.value(), documentIsHTML);
  • trunk/Source/WebCore/editing/MarkupAccumulator.h

    r85244 r92769  
    6767class MarkupAccumulator {
    6868public:
    69     MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range = 0);
     69    MarkupAccumulator(Vector<Node*>*, EAbsoluteURLs resolveUrlsMethod, const Range* = 0);
    7070    virtual ~MarkupAccumulator();
    7171
     
    101101    void appendEndMarkup(Vector<UChar>& result, const Node*);
    102102
    103     bool shouldResolveURLs() { return m_shouldResolveURLs == AbsoluteURLs; }
    104 
    105103    Vector<Node*>* const m_nodes;
    106104    const Range* const m_range;
    107105
    108106private:
     107    String resolveURLIfNeeded(const Element*, const String& urlString) const;
    109108    void serializeNodesWithNamespaces(Node*, Node* nodeToSkip, EChildrenOnly, const Namespaces*);
    110109
    111110    Vector<String> m_succeedingMarkup;
    112     const bool m_shouldResolveURLs;
     111    const EAbsoluteURLs m_resolveURLsMethod;
    113112};
    114113
  • trunk/Source/WebCore/editing/markup.cpp

    r92537 r92769  
    855855}
    856856
    857 String imageToMarkup(const KURL& url, Element* element)
    858 {
    859     Vector<UChar> markup;
    860     append(markup, "<img src=\"");
    861     append(markup, url.string());
    862     append(markup, "\"");
    863 
    864     NamedNodeMap* attrs = element->attributes();
    865     unsigned length = attrs->length();
    866     for (unsigned i = 0; i < length; ++i) {
    867         Attribute* attr = attrs->attributeItem(i);
    868         if (attr->localName() == "src")
    869             continue;
    870         append(markup, " ");
    871         append(markup, attr->localName());
    872         append(markup, "=\"");
    873         appendCharactersReplacingEntities(markup, attr->value().characters(), attr->value().length(), EntityMaskInAttributeValue);
    874         append(markup, "\"");
    875     }
    876 
    877     append(markup, "/>");
    878     return String::adopt(markup);
    879 }
    880 
    881 }
     857}
  • trunk/Source/WebCore/editing/markup.h

    r92537 r92769  
    4242
    4343    enum EChildrenOnly { IncludeNode, ChildrenOnly };
    44     enum EAbsoluteURLs { DoNotResolveURLs, AbsoluteURLs };
     44    enum EAbsoluteURLs { DoNotResolveURLs, ResolveAllURLs, ResolveNonLocalURLs };
    4545
    4646    PassRefPtr<DocumentFragment> createFragmentFromText(Range* context, const String& text);
     
    5858
    5959    String urlToMarkup(const KURL&, const String& title);
    60     String imageToMarkup(const KURL&, Element*);
    6160}
    6261
  • trunk/Source/WebCore/page/PageSerializer.cpp

    r87958 r92769  
    107107};
    108108
     109// FIXME: should that really use ResolveNonLocalURLs?
    109110SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer* serializer, Document* document, Vector<Node*>* nodes)
    110     : MarkupAccumulator(nodes, AbsoluteURLs)
     111    : MarkupAccumulator(nodes, ResolveNonLocalURLs)
    111112    , m_serializer(serializer)
    112113    , m_document(document)
  • trunk/Source/WebCore/platform/chromium/ClipboardChromium.cpp

    r90497 r92769  
    266266    writeImageToDataObject(m_dataObject.get(), element, url);
    267267
    268     AtomicString imageURL = element->getAttribute(srcAttr);
    269     if (imageURL.isEmpty())
    270         return;
    271 
    272     KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL));
    273     if (fullURL.isEmpty())
    274         return;
    275 
    276268    // Put img tag on the clipboard referencing the image
    277     m_dataObject->setData(mimeTypeTextHTML, imageToMarkup(fullURL, element));
     269    m_dataObject->setData(mimeTypeTextHTML, createMarkup(element, IncludeNode, 0, ResolveAllURLs));
    278270}
    279271
     
    300292         return;
    301293
    302     m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
     294    m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
    303295    m_dataObject->setHtmlBaseUrl(frame->document()->url());
    304296
  • trunk/Source/WebCore/platform/chromium/PasteboardChromium.cpp

    r87709 r92769  
    8383void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame)
    8484{
    85     String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);
     85    String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
    8686    ExceptionCode ec = 0;
    8787    KURL url = selectedRange->startContainer(ec)->document()->url();
  • trunk/Source/WebCore/platform/gtk/ClipboardGtk.cpp

    r87978 r92769  
    284284{
    285285    m_dataObject->setURL(url, label);
    286     m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, AbsoluteURLs));
     286    m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, ResolveAllURLs));
    287287
    288288    CachedImage* image = getCachedImage(element);
     
    309309
    310310    m_dataObject->setText(frame->editor()->selectedText());
    311     m_dataObject->setMarkup(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));
     311    m_dataObject->setMarkup(createMarkup(range, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
    312312
    313313    if (m_clipboard)
  • trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp

    r69530 r92769  
    4343{
    4444    if (m_range)
    45         return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, AbsoluteURLs);
     45        return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
    4646    return m_markup;
    4747}
  • trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp

    r88066 r92769  
    6161    DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
    6262    dataObject->setText(frame->editor()->selectedText());
    63     dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
     63    dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
    6464    helper->writeClipboardContents(clipboard, canSmartCopyOrDelete ? PasteboardHelper::IncludeSmartPaste : PasteboardHelper::DoNotIncludeSmartPaste);
    6565}
     
    123123        dataObject->setURL(url, title);
    124124
    125         // This image may be an SVG, embed, or object tag, so do not write the image
    126         // tag markup in those cases. Eventually we may want to support passing markup
    127         // for these tag types.
    128         if (node->hasTagName(HTMLNames::imgTag))
    129             dataObject->setMarkup(imageToMarkup(url, static_cast<Element*>(node)));
     125        dataObject->setMarkup(createMarkup(static_cast<Element*>(node), IncludeNode, 0, ResolveAllURLs));
    130126    }
    131127
  • trunk/Source/WebCore/platform/haiku/PasteboardHaiku.cpp

    r61178 r92769  
    103103    data->AddData("text/plain", B_MIME_TYPE, string.String(), string.Length());
    104104
    105     BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
     105    BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
    106106    data->AddData("text/html", B_MIME_TYPE, markupString.String(), markupString.Length());
    107107
  • trunk/Source/WebCore/platform/qt/ClipboardQt.cpp

    r87897 r92769  
    289289        m_writableData->setImageData(*pixmap);
    290290
    291     AtomicString imageURL = element->getAttribute(HTMLNames::srcAttr);
    292     if (imageURL.isEmpty())
    293         return;
    294 
    295     KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL));
    296     if (fullURL.isEmpty())
    297         return;
    298 
    299291    QList<QUrl> urls;
    300292    urls.append(url);
     
    302294    m_writableData->setText(title);
    303295    m_writableData->setUrls(urls);
    304     m_writableData->setHtml(imageToMarkup(fullURL, element));
     296    m_writableData->setHtml(createMarkup(element, IncludeNode, 0, ResolveAllURLs));
    305297#ifndef QT_NO_CLIPBOARD
    306298    if (isForCopyAndPaste())
     
    335327    text.replace(QChar(0xa0), QLatin1Char(' '));
    336328    m_writableData->setText(text);
    337     m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));
     329    m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
    338330#ifndef QT_NO_CLIPBOARD
    339331    if (isForCopyAndPaste())
  • trunk/Source/WebCore/platform/qt/PasteboardQt.cpp

    r87709 r92769  
    6565    md->setText(text);
    6666
    67     QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);
     67    QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
    6868#ifdef Q_OS_MAC
    6969    markup.prepend(QLatin1String("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body>"));
  • trunk/Source/WebCore/platform/win/ClipboardWin.cpp

    r86592 r92769  
    684684    // Put img tag on the clipboard referencing the image
    685685    Vector<char> data;
    686     markupToCFHTML(imageToMarkup(fullURL, element), "", data);
     686    markupToCFHTML(createMarkup(element, IncludeNode, 0, ResolveAllURLs), "", data);
    687687    medium.hGlobal = createGlobalData(data);
    688688    if (medium.hGlobal && FAILED(m_writableDataObject->SetData(htmlFormat(), &medium, TRUE)))
Note: See TracChangeset for help on using the changeset viewer.