Title: [92769] trunk
Revision
92769
Author
[email protected]
Date
2011-08-10 08:27:17 -0700 (Wed, 10 Aug 2011)

Log 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 <[email protected]> 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.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (92768 => 92769)


--- trunk/LayoutTests/ChangeLog	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/LayoutTests/ChangeLog	2011-08-10 15:27:17 UTC (rev 92769)
@@ -1,3 +1,20 @@
+2011-08-10  Benjamin Poulain  <[email protected]>
+
+        Unify the way we generate HTML for an image in the Clipboard
+        https://bugs.webkit.org/show_bug.cgi?id=58043
+
+        Reviewed by Ryosuke Niwa.
+
+        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.
+
 2011-08-10  Pavel Feldman  <[email protected]>
 
         Web Inspector: auto-completion for string literals doesn't work

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable-expected.txt	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,17 @@
+This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+
+PASS target.getElementsByTagName("img").length is 1
+PASS target.getElementsByTagName("img")[0].attributes.length is 5
+PASS target.getElementsByTagName("img")[0].id is "source"
+PASS target.getElementsByTagName("img")[0].alt is "alt-text"
+PASS target.getElementsByTagName("img")[0].attributes["itemprop"].value is "somedata"
+PASS target.getElementsByTagName("img")[0].attributes["arbitrary"].value is "green"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable.html (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable.html	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-image-contenteditable.html	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<style>
+#target {
+    height: 200px;
+    width: 220px;
+    border: 5px solid blue;
+}
+</style>
+</head>
+<body _onload_="runTest()">
+<p id="description"></p>
+<div contenteditable=true id="target"></div>
+<div><img id="source" src="" alt="alt-text" itemprop="somedata" arbitrary="green"></div>
+<div id="console"></div>
+
+<script>
+description('This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.');
+var jsTestIsAsync = true;
+var target = document.getElementById('target');
+
+function contentInserted() {
+    shouldBe('target.getElementsByTagName("img").length', '1');
+    shouldBe('target.getElementsByTagName("img")[0].attributes.length', '5');
+    shouldBeEqualToString('target.getElementsByTagName("img")[0].id', 'source');
+    shouldBeEqualToString('target.getElementsByTagName("img")[0].alt', 'alt-text');
+    shouldBeEqualToString('target.getElementsByTagName("img")[0].attributes["itemprop"].value', 'somedata');
+    shouldBeEqualToString('target.getElementsByTagName("img")[0].attributes["arbitrary"].value', 'green');
+
+    successfullyParsed = true;
+    finishJSTest();
+}
+
+function runTest() {
+    target.addEventListener('DOMNodeInserted', contentInserted, false);
+    if (!window.layoutTestController)
+        return;
+
+    layoutTestController.waitUntilDone();
+
+    e = document.getElementById("source");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseDown();
+    eventSender.leapForward(100);
+    e = document.getElementById("target");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseUp();
+}
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable-expected.txt	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,18 @@
+This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+
+PASS target.getElementsByTagName("input").length is 1
+PASS target.getElementsByTagName("input")[0].attributes.length is 6
+PASS target.getElementsByTagName("input")[0].id is "source"
+PASS target.getElementsByTagName("input")[0].type is "image"
+PASS target.getElementsByTagName("input")[0].draggable is true
+PASS target.getElementsByTagName("input")[0].attributes["itemprop"].value is "somedata"
+PASS target.getElementsByTagName("input")[0].attributes["arbitrary"].value is "green"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable.html (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable.html	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-inputimage-contenteditable.html	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<style>
+#target {
+    height: 200px;
+    width: 220px;
+    border: 5px solid blue;
+}
+</style>
+</head>
+<body _onload_="runTest()">
+<p id="description"></p>
+<div contenteditable=true id="target"></div>
+<div><input type="image" id="source" src="" itemprop="somedata" arbitrary="green" draggable=true></div>
+<div id="console"></div>
+
+<script>
+description('This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.');
+var jsTestIsAsync = true;
+var target = document.getElementById('target');
+
+function contentInserted() {
+    shouldBe('target.getElementsByTagName("input").length', '1');
+    shouldBe('target.getElementsByTagName("input")[0].attributes.length', '6');
+    shouldBeEqualToString('target.getElementsByTagName("input")[0].id', 'source');
+    shouldBeEqualToString('target.getElementsByTagName("input")[0].type', 'image');
+    shouldBeTrue('target.getElementsByTagName("input")[0].draggable');
+    shouldBeEqualToString('target.getElementsByTagName("input")[0].attributes["itemprop"].value', 'somedata');
+    shouldBeEqualToString('target.getElementsByTagName("input")[0].attributes["arbitrary"].value', 'green');
+
+    successfullyParsed = true;
+    finishJSTest();
+}
+
+function runTest() {
+    target.addEventListener('DOMNodeInserted', contentInserted, false);
+    if (!window.layoutTestController)
+        return;
+
+    layoutTestController.waitUntilDone();
+
+    e = document.getElementById("source");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseDown();
+    eventSender.leapForward(100);
+    e = document.getElementById("target");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseUp();
+}
+</script>
+<script src=""
+</body>
+</html>

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable-expected.txt	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,18 @@
+This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+
+PASS target.getElementsByTagName("object").length is 1
+PASS target.getElementsByTagName("object")[0].attributes.length is 6
+PASS target.getElementsByTagName("object")[0].id is "source"
+PASS target.getElementsByTagName("object")[0].type is "image/png"
+PASS target.getElementsByTagName("object")[0].draggable is true
+PASS target.getElementsByTagName("object")[0].attributes["itemprop"].value is "somedata"
+PASS target.getElementsByTagName("object")[0].attributes["arbitrary"].value is "green"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable.html (0 => 92769)


--- trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable.html	                        (rev 0)
+++ trunk/LayoutTests/editing/pasteboard/drag-and-drop-objectimage-contenteditable.html	2011-08-10 15:27:17 UTC (rev 92769)
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+<style>
+#target {
+    height: 200px;
+    width: 220px;
+    border: 5px solid blue;
+}
+</style>
+</head>
+<body _onload_="runTest()">
+<p id="description"></p>
+<div contenteditable=true id="target"></div>
+<div><object id="source" data="" type="image/png" itemprop="somedata" arbitrary="green" draggable=true></object></div>
+<div id="console"></div>
+
+<script>
+description('This test verify dragging an image in the page keeps its attributes. To test manually, drag the image and drop it in the rect with a blue border.');
+var jsTestIsAsync = true;
+var target = document.getElementById('target');
+
+function contentInserted() {
+    shouldBe('target.getElementsByTagName("object").length', '1');
+    shouldBe('target.getElementsByTagName("object")[0].attributes.length', '6');
+    shouldBeEqualToString('target.getElementsByTagName("object")[0].id', 'source');
+    shouldBeEqualToString('target.getElementsByTagName("object")[0].type', 'image/png');
+    shouldBeTrue('target.getElementsByTagName("object")[0].draggable');
+    shouldBeEqualToString('target.getElementsByTagName("object")[0].attributes["itemprop"].value', 'somedata');
+    shouldBeEqualToString('target.getElementsByTagName("object")[0].attributes["arbitrary"].value', 'green');
+
+    successfullyParsed = true;
+    finishJSTest();
+}
+
+function runTest() {
+    target.addEventListener('DOMNodeInserted', contentInserted, false);
+    if (!window.layoutTestController)
+        return;
+
+    layoutTestController.waitUntilDone();
+
+    e = document.getElementById("source");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseDown();
+    eventSender.leapForward(100);
+    e = document.getElementById("target");
+    x = e.offsetLeft + e.offsetWidth / 2;
+    y = e.offsetTop + e.offsetHeight / 2;
+
+    eventSender.mouseMoveTo(x, y);
+    eventSender.mouseUp();
+}
+</script>
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/platform/qt/Skipped (92768 => 92769)


--- trunk/LayoutTests/platform/qt/Skipped	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/LayoutTests/platform/qt/Skipped	2011-08-10 15:27:17 UTC (rev 92769)
@@ -255,6 +255,9 @@
 editing/pasteboard/get-data-text-plain-drop.html
 editing/pasteboard/drop-text-events.html
 editing/pasteboard/drop-text-events-sideeffect.html
+editing/pasteboard/drag-and-drop-image-contenteditable.html
+editing/pasteboard/drag-and-drop-inputimage-contenteditable.html
+editing/pasteboard/drag-and-drop-objectimage-contenteditable.html
 
 # data-transfer-items is not a default build option
 # See bug https://bugs.webkit.org/show_bug.cgi?id=60068

Modified: trunk/Source/WebCore/ChangeLog (92768 => 92769)


--- trunk/Source/WebCore/ChangeLog	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/ChangeLog	2011-08-10 15:27:17 UTC (rev 92769)
@@ -1,3 +1,58 @@
+2011-08-10  Benjamin Poulain  <[email protected]>
+
+        Unify the way we generate HTML for an image in the Clipboard
+        https://bugs.webkit.org/show_bug.cgi?id=58043
+
+        Reviewed by Ryosuke Niwa.
+
+        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):
+
 2011-08-10  Pavel Feldman  <[email protected]>
 
         Web Inspector: auto-completion for string literals doesn't work

Modified: trunk/Source/WebCore/editing/MarkupAccumulator.cpp (92768 => 92769)


--- trunk/Source/WebCore/editing/MarkupAccumulator.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/editing/MarkupAccumulator.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -73,10 +73,10 @@
     out.append(content + positionAfterLastEntity, length - positionAfterLastEntity);
 }
 
-MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range)
+MarkupAccumulator::MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs resolveUrlsMethod, const Range* range)
     : m_nodes(nodes)
     , m_range(range)
-    , m_shouldResolveURLs(shouldResolveURLs)
+    , m_resolveURLsMethod(resolveUrlsMethod)
 {
 }
 
@@ -114,6 +114,23 @@
         appendEndTag(node);
 }
 
+String MarkupAccumulator::resolveURLIfNeeded(const Element* element, const String& urlString) const
+{
+    switch (m_resolveURLsMethod) {
+    case ResolveAllURLs:
+        return element->document()->completeURL(urlString).string();
+
+    case ResolveNonLocalURLs:
+        if (!element->document()->url().isLocalFile())
+            return element->document()->completeURL(urlString).string();
+        break;
+
+    case DoNotResolveURLs:
+        break;
+    }
+    return urlString;
+}
+
 void MarkupAccumulator::appendString(const String& string)
 {
     m_succeedingMarkup.append(string);
@@ -371,14 +388,9 @@
 
     out.append('=');
 
-    if (element->isURLAttribute(const_cast<Attribute*>(&attribute))) {
-        // We don't want to complete file:/// URLs because it may contain sensitive information
-        // about the user's system.
-        if (shouldResolveURLs() && !element->document()->url().isLocalFile())
-            appendQuotedURLAttributeValue(out, element->document()->completeURL(attribute.value()).string());
-        else
-            appendQuotedURLAttributeValue(out, attribute.value()); 
-    } else {
+    if (element->isURLAttribute(const_cast<Attribute*>(&attribute)))
+        appendQuotedURLAttributeValue(out, resolveURLIfNeeded(element, attribute.value()));
+    else {
         out.append('\"');
         appendAttributeValue(out, attribute.value(), documentIsHTML);
         out.append('\"');

Modified: trunk/Source/WebCore/editing/MarkupAccumulator.h (92768 => 92769)


--- trunk/Source/WebCore/editing/MarkupAccumulator.h	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/editing/MarkupAccumulator.h	2011-08-10 15:27:17 UTC (rev 92769)
@@ -66,7 +66,7 @@
 // FIXME: Noncopyable?
 class MarkupAccumulator {
 public:
-    MarkupAccumulator(Vector<Node*>* nodes, EAbsoluteURLs shouldResolveURLs, const Range* range = 0);
+    MarkupAccumulator(Vector<Node*>*, EAbsoluteURLs resolveUrlsMethod, const Range* = 0);
     virtual ~MarkupAccumulator();
 
     String serializeNodes(Node* node, Node* nodeToSkip, EChildrenOnly childrenOnly);
@@ -100,16 +100,15 @@
     bool elementCannotHaveEndTag(const Node* node);
     void appendEndMarkup(Vector<UChar>& result, const Node*);
 
-    bool shouldResolveURLs() { return m_shouldResolveURLs == AbsoluteURLs; }
-
     Vector<Node*>* const m_nodes;
     const Range* const m_range;
 
 private:
+    String resolveURLIfNeeded(const Element*, const String& urlString) const;
     void serializeNodesWithNamespaces(Node*, Node* nodeToSkip, EChildrenOnly, const Namespaces*);
 
     Vector<String> m_succeedingMarkup;
-    const bool m_shouldResolveURLs;
+    const EAbsoluteURLs m_resolveURLsMethod;
 };
 
 // FIXME: This method should be integrated with MarkupAccumulator.

Modified: trunk/Source/WebCore/editing/markup.cpp (92768 => 92769)


--- trunk/Source/WebCore/editing/markup.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/editing/markup.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -854,28 +854,4 @@
     return String::adopt(markup);
 }
 
-String imageToMarkup(const KURL& url, Element* element)
-{
-    Vector<UChar> markup;
-    append(markup, "<img src=""
-    append(markup, url.string());
-    append(markup, "\"");
-
-    NamedNodeMap* attrs = element->attributes();
-    unsigned length = attrs->length();
-    for (unsigned i = 0; i < length; ++i) {
-        Attribute* attr = attrs->attributeItem(i);
-        if (attr->localName() == "src")
-            continue;
-        append(markup, " ");
-        append(markup, attr->localName());
-        append(markup, "=\"");
-        appendCharactersReplacingEntities(markup, attr->value().characters(), attr->value().length(), EntityMaskInAttributeValue);
-        append(markup, "\"");
-    }
-
-    append(markup, "/>");
-    return String::adopt(markup);
 }
-
-}

Modified: trunk/Source/WebCore/editing/markup.h (92768 => 92769)


--- trunk/Source/WebCore/editing/markup.h	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/editing/markup.h	2011-08-10 15:27:17 UTC (rev 92769)
@@ -41,7 +41,7 @@
     class Range;
 
     enum EChildrenOnly { IncludeNode, ChildrenOnly };
-    enum EAbsoluteURLs { DoNotResolveURLs, AbsoluteURLs };
+    enum EAbsoluteURLs { DoNotResolveURLs, ResolveAllURLs, ResolveNonLocalURLs };
 
     PassRefPtr<DocumentFragment> createFragmentFromText(Range* context, const String& text);
     PassRefPtr<DocumentFragment> createFragmentFromMarkup(Document*, const String& markup, const String& baseURL, FragmentScriptingPermission = FragmentScriptingAllowed);
@@ -57,7 +57,6 @@
     String createFullMarkup(const Range*);
 
     String urlToMarkup(const KURL&, const String& title);
-    String imageToMarkup(const KURL&, Element*);
 }
 
 #endif // markup_h

Modified: trunk/Source/WebCore/page/PageSerializer.cpp (92768 => 92769)


--- trunk/Source/WebCore/page/PageSerializer.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/page/PageSerializer.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -106,8 +106,9 @@
     Document* m_document;
 };
 
+// FIXME: should that really use ResolveNonLocalURLs?
 SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer* serializer, Document* document, Vector<Node*>* nodes)
-    : MarkupAccumulator(nodes, AbsoluteURLs)
+    : MarkupAccumulator(nodes, ResolveNonLocalURLs)
     , m_serializer(serializer)
     , m_document(document)
 {

Modified: trunk/Source/WebCore/platform/chromium/ClipboardChromium.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/chromium/ClipboardChromium.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/chromium/ClipboardChromium.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -265,16 +265,8 @@
     // Write the bytes in the image to the file format.
     writeImageToDataObject(m_dataObject.get(), element, url);
 
-    AtomicString imageURL = element->getAttribute(srcAttr);
-    if (imageURL.isEmpty())
-        return;
-
-    KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL));
-    if (fullURL.isEmpty())
-        return;
-
     // Put img tag on the clipboard referencing the image
-    m_dataObject->setData(mimeTypeTextHTML, imageToMarkup(fullURL, element));
+    m_dataObject->setData(mimeTypeTextHTML, createMarkup(element, IncludeNode, 0, ResolveAllURLs));
 }
 
 void ClipboardChromium::writeURL(const KURL& url, const String& title, Frame*)
@@ -299,7 +291,7 @@
     if (!m_dataObject)
          return;
 
-    m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
+    m_dataObject->setData(mimeTypeTextHTML, createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
     m_dataObject->setHtmlBaseUrl(frame->document()->url());
 
     String str = frame->editor()->selectedText();

Modified: trunk/Source/WebCore/platform/chromium/PasteboardChromium.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/chromium/PasteboardChromium.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/chromium/PasteboardChromium.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -82,7 +82,7 @@
 
 void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame)
 {
-    String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);
+    String html = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
     ExceptionCode ec = 0;
     KURL url = ""
     String plainText = frame->editor()->selectedText();

Modified: trunk/Source/WebCore/platform/gtk/ClipboardGtk.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/gtk/ClipboardGtk.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/gtk/ClipboardGtk.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -283,7 +283,7 @@
 void ClipboardGtk::declareAndWriteDragImage(Element* element, const KURL& url, const String& label, Frame* frame)
 {
     m_dataObject->setURL(url, label);
-    m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, AbsoluteURLs));
+    m_dataObject->setMarkup(createMarkup(element, IncludeNode, 0, ResolveAllURLs));
 
     CachedImage* image = getCachedImage(element);
     if (!image || !image->isLoaded())
@@ -308,7 +308,7 @@
     ASSERT(range);
 
     m_dataObject->setText(frame->editor()->selectedText());
-    m_dataObject->setMarkup(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));
+    m_dataObject->setMarkup(createMarkup(range, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
 
     if (m_clipboard)
         PasteboardHelper::defaultPasteboardHelper()->writeClipboardContents(m_clipboard);

Modified: trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/gtk/DataObjectGtk.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -42,7 +42,7 @@
 String DataObjectGtk::markup()
 {
     if (m_range)
-        return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, AbsoluteURLs);
+        return createMarkup(m_range.get(), 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
     return m_markup;
 }
 

Modified: trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/gtk/PasteboardGtk.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -60,7 +60,7 @@
     GtkClipboard* clipboard = helper->getClipboard(frame);
     DataObjectGtk* dataObject = DataObjectGtk::forClipboard(clipboard);
     dataObject->setText(frame->editor()->selectedText());
-    dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
+    dataObject->setMarkup(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
     helper->writeClipboardContents(clipboard, canSmartCopyOrDelete ? PasteboardHelper::IncludeSmartPaste : PasteboardHelper::DoNotIncludeSmartPaste);
 }
 
@@ -122,11 +122,7 @@
     if (!url.isEmpty()) {
         dataObject->setURL(url, title);
 
-        // This image may be an SVG, embed, or object tag, so do not write the image
-        // tag markup in those cases. Eventually we may want to support passing markup
-        // for these tag types.
-        if (node->hasTagName(HTMLNames::imgTag))
-            dataObject->setMarkup(imageToMarkup(url, static_cast<Element*>(node)));
+        dataObject->setMarkup(createMarkup(static_cast<Element*>(node), IncludeNode, 0, ResolveAllURLs));
     }
 
     GRefPtr<GdkPixbuf> pixbuf = adoptGRef(image->getGdkPixbuf());

Modified: trunk/Source/WebCore/platform/haiku/PasteboardHaiku.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/haiku/PasteboardHaiku.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/haiku/PasteboardHaiku.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -102,7 +102,7 @@
 
     data->AddData("text/plain", B_MIME_TYPE, string.String(), string.Length());
 
-    BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs));
+    BString markupString(createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
     data->AddData("text/html", B_MIME_TYPE, markupString.String(), markupString.Length());
 
     be_clipboard->Commit();

Modified: trunk/Source/WebCore/platform/qt/ClipboardQt.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/qt/ClipboardQt.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/qt/ClipboardQt.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -288,20 +288,12 @@
     if (pixmap)
         m_writableData->setImageData(*pixmap);
 
-    AtomicString imageURL = element->getAttribute(HTMLNames::srcAttr);
-    if (imageURL.isEmpty())
-        return;
-
-    KURL fullURL = frame->document()->completeURL(stripLeadingAndTrailingHTMLSpaces(imageURL));
-    if (fullURL.isEmpty())
-        return;
-
     QList<QUrl> urls;
     urls.append(url);
 
     m_writableData->setText(title);
     m_writableData->setUrls(urls);
-    m_writableData->setHtml(imageToMarkup(fullURL, element));
+    m_writableData->setHtml(createMarkup(element, IncludeNode, 0, ResolveAllURLs));
 #ifndef QT_NO_CLIPBOARD
     if (isForCopyAndPaste())
         QApplication::clipboard()->setMimeData(m_writableData);
@@ -334,7 +326,7 @@
     QString text = frame->editor()->selectedText();
     text.replace(QChar(0xa0), QLatin1Char(' '));
     m_writableData->setText(text);
-    m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, AbsoluteURLs));
+    m_writableData->setHtml(createMarkup(range, 0, AnnotateForInterchange, false, ResolveNonLocalURLs));
 #ifndef QT_NO_CLIPBOARD
     if (isForCopyAndPaste())
         QApplication::clipboard()->setMimeData(m_writableData);

Modified: trunk/Source/WebCore/platform/qt/PasteboardQt.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/qt/PasteboardQt.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/qt/PasteboardQt.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -64,7 +64,7 @@
     text.replace(QChar(0xa0), QLatin1Char(' '));
     md->setText(text);
 
-    QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, AbsoluteURLs);
+    QString markup = createMarkup(selectedRange, 0, AnnotateForInterchange, false, ResolveNonLocalURLs);
 #ifdef Q_OS_MAC
     markup.prepend(QLatin1String("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" /></head><body>"));
     markup.append(QLatin1String("</body></html>"));

Modified: trunk/Source/WebCore/platform/win/ClipboardWin.cpp (92768 => 92769)


--- trunk/Source/WebCore/platform/win/ClipboardWin.cpp	2011-08-10 14:37:23 UTC (rev 92768)
+++ trunk/Source/WebCore/platform/win/ClipboardWin.cpp	2011-08-10 15:27:17 UTC (rev 92769)
@@ -683,7 +683,7 @@
 
     // Put img tag on the clipboard referencing the image
     Vector<char> data;
-    markupToCFHTML(imageToMarkup(fullURL, element), "", data);
+    markupToCFHTML(createMarkup(element, IncludeNode, 0, ResolveAllURLs), "", data);
     medium.hGlobal = createGlobalData(data);
     if (medium.hGlobal && FAILED(m_writableDataObject->SetData(htmlFormat(), &medium, TRUE)))
         ::GlobalFree(medium.hGlobal);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to