Changeset 92769 in webkit
- Timestamp:
- Aug 10, 2011 8:27:17 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 6 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r92768 r92769 1 2011-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 1 18 2011-08-10 Pavel Feldman <pfeldman@google.com> 2 19 -
trunk/LayoutTests/platform/qt/Skipped
r92761 r92769 256 256 editing/pasteboard/drop-text-events.html 257 257 editing/pasteboard/drop-text-events-sideeffect.html 258 editing/pasteboard/drag-and-drop-image-contenteditable.html 259 editing/pasteboard/drag-and-drop-inputimage-contenteditable.html 260 editing/pasteboard/drag-and-drop-objectimage-contenteditable.html 258 261 259 262 # data-transfer-items is not a default build option -
trunk/Source/WebCore/ChangeLog
r92768 r92769 1 2011-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 1 56 2011-08-10 Pavel Feldman <pfeldman@google.com> 2 57 -
trunk/Source/WebCore/editing/MarkupAccumulator.cpp
r86330 r92769 74 74 } 75 75 76 MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range)76 MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs resolveUrlsMethod, const Range* range) 77 77 : m_nodes(nodes) 78 78 , m_range(range) 79 , m_ shouldResolveURLs(shouldResolveURLs)79 , m_resolveURLsMethod(resolveUrlsMethod) 80 80 { 81 81 } … … 113 113 if (!childrenOnly) 114 114 appendEndTag(node); 115 } 116 117 String 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; 115 132 } 116 133 … … 372 389 out.append('='); 373 390 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 { 382 394 out.append('\"'); 383 395 appendAttributeValue(out, attribute.value(), documentIsHTML); -
trunk/Source/WebCore/editing/MarkupAccumulator.h
r85244 r92769 67 67 class MarkupAccumulator { 68 68 public: 69 MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range= 0);69 MarkupAccumulator(Vector<Node*>*, EAbsoluteURLs resolveUrlsMethod, const Range* = 0); 70 70 virtual ~MarkupAccumulator(); 71 71 … … 101 101 void appendEndMarkup(Vector<UChar>& result, const Node*); 102 102 103 bool shouldResolveURLs() { return m_shouldResolveURLs == AbsoluteURLs; }104 105 103 Vector<Node*>* const m_nodes; 106 104 const Range* const m_range; 107 105 108 106 private: 107 String resolveURLIfNeeded(const Element*, const String& urlString) const; 109 108 void serializeNodesWithNamespaces(Node*, Node* nodeToSkip, EChildrenOnly, const Namespaces*); 110 109 111 110 Vector<String> m_succeedingMarkup; 112 const bool m_shouldResolveURLs;111 const EAbsoluteURLs m_resolveURLsMethod; 113 112 }; 114 113 -
trunk/Source/WebCore/editing/markup.cpp
r92537 r92769 855 855 } 856 856 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 42 42 43 43 enum EChildrenOnly { IncludeNode, ChildrenOnly }; 44 enum EAbsoluteURLs { DoNotResolveURLs, AbsoluteURLs };44 enum EAbsoluteURLs { DoNotResolveURLs, ResolveAllURLs, ResolveNonLocalURLs }; 45 45 46 46 PassRefPtr<DocumentFragment> createFragmentFromText(Range* context, const String& text); … … 58 58 59 59 String urlToMarkup(const KURL&, const String& title); 60 String imageToMarkup(const KURL&, Element*);61 60 } 62 61 -
trunk/Source/WebCore/page/PageSerializer.cpp
r87958 r92769 107 107 }; 108 108 109 // FIXME: should that really use ResolveNonLocalURLs? 109 110 SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer* serializer, Document* document, Vector<Node*>* nodes) 110 : MarkupAccumulator(nodes, AbsoluteURLs)111 : MarkupAccumulator(nodes, ResolveNonLocalURLs) 111 112 , m_serializer(serializer) 112 113 , m_document(document) -
trunk/Source/WebCore/platform/chromium/ClipboardChromium.cpp
r90497 r92769 266 266 writeImageToDataObject(m_dataObject.get(), element, url); 267 267 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 276 268 // 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)); 278 270 } 279 271 … … 300 292 return; 301 293 302 m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));294 m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs)); 303 295 m_dataObject->setHtmlBaseUrl(frame->document()->url()); 304 296 -
trunk/Source/WebCore/platform/chromium/PasteboardChromium.cpp
r87709 r92769 83 83 void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame) 84 84 { 85 String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);85 String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs); 86 86 ExceptionCode ec = 0; 87 87 KURL url = selectedRange->startContainer(ec)->document()->url(); -
trunk/Source/WebCore/platform/gtk/ClipboardGtk.cpp
r87978 r92769 284 284 { 285 285 m_dataObject->setURL(url, label); 286 m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, AbsoluteURLs));286 m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, ResolveAllURLs)); 287 287 288 288 CachedImage* image = getCachedImage(element); … … 309 309 310 310 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)); 312 312 313 313 if (m_clipboard) -
trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp
r69530 r92769 43 43 { 44 44 if (m_range) 45 return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, AbsoluteURLs);45 return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs); 46 46 return m_markup; 47 47 } -
trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp
r88066 r92769 61 61 DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard); 62 62 dataObject->setText(frame->editor()->selectedText()); 63 dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));63 dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs)); 64 64 helper->writeClipboardContents(clipboard, canSmartCopyOrDelete ? PasteboardHelper::IncludeSmartPaste : PasteboardHelper::DoNotIncludeSmartPaste); 65 65 } … … 123 123 dataObject->setURL(url, title); 124 124 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)); 130 126 } 131 127 -
trunk/Source/WebCore/platform/haiku/PasteboardHaiku.cpp
r61178 r92769 103 103 data->AddData("text/plain", B_MIME_TYPE, string.String(), string.Length()); 104 104 105 BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));105 BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs)); 106 106 data->AddData("text/html", B_MIME_TYPE, markupString.String(), markupString.Length()); 107 107 -
trunk/Source/WebCore/platform/qt/ClipboardQt.cpp
r87897 r92769 289 289 m_writableData->setImageData(*pixmap); 290 290 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 299 291 QList<QUrl> urls; 300 292 urls.append(url); … … 302 294 m_writableData->setText(title); 303 295 m_writableData->setUrls(urls); 304 m_writableData->setHtml( imageToMarkup(fullURL, element));296 m_writableData->setHtml(createMarkup(element, IncludeNode, 0, ResolveAllURLs)); 305 297 #ifndef QT_NO_CLIPBOARD 306 298 if (isForCopyAndPaste()) … … 335 327 text.replace(QChar(0xa0), QLatin1Char(' ')); 336 328 m_writableData->setText(text); 337 m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));329 m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, ResolveNonLocalURLs)); 338 330 #ifndef QT_NO_CLIPBOARD 339 331 if (isForCopyAndPaste()) -
trunk/Source/WebCore/platform/qt/PasteboardQt.cpp
r87709 r92769 65 65 md->setText(text); 66 66 67 QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);67 QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs); 68 68 #ifdef Q_OS_MAC 69 69 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 684 684 // Put img tag on the clipboard referencing the image 685 685 Vector<char> data; 686 markupToCFHTML( imageToMarkup(fullURL, element), "", data);686 markupToCFHTML(createMarkup(element, IncludeNode, 0, ResolveAllURLs), "", data); 687 687 medium.hGlobal = createGlobalData(data); 688 688 if (medium.hGlobal && FAILED(m_writableDataObject->SetData(htmlFormat(), &medium, TRUE)))
Note: See TracChangeset
for help on using the changeset viewer.