Ranges given to createMarkupInternal might not be canonicalized
authormmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Feb 2014 01:26:36 +0000 (01:26 +0000)
committermmaxfield@apple.com <mmaxfield@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 27 Feb 2014 01:26:36 +0000 (01:26 +0000)
https://bugs.webkit.org/show_bug.cgi?id=129408

Reviewed by Ryosuke Niwa.

When WebKit clients (such as Mail) call WKWebArchiveCreateFromRange() with a range,
that range is not necessarily canonicalized. Therefore, comparing it for equality
with a canonicalized range might return a false negative. Instead, we should compare
canonicalized ranges.

No new tests because this codepath will only be reached via SPI.

* editing/markup.cpp:
(WebCore::createMarkupInternal):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@164763 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/editing/markup.cpp

index 7180151e395b6fd42525615a9e3144202d0fdbcf..c5e2f3ec84bee759f70dfaf6f59e891e6cb7dda1 100644 (file)
@@ -1,3 +1,20 @@
+2014-02-26  Myles C. Maxfield  <mmaxfield@apple.com>
+
+        Ranges given to createMarkupInternal might not be canonicalized
+        https://bugs.webkit.org/show_bug.cgi?id=129408
+
+        Reviewed by Ryosuke Niwa.
+
+        When WebKit clients (such as Mail) call WKWebArchiveCreateFromRange() with a range,
+        that range is not necessarily canonicalized. Therefore, comparing it for equality
+        with a canonicalized range might return a false negative. Instead, we should compare
+        canonicalized ranges.
+
+        No new tests because this codepath will only be reached via SPI.
+
+        * editing/markup.cpp:
+        (WebCore::createMarkupInternal):
+
 2014-02-26  Enrica Casucci  <enrica@apple.com>
 
         [iOS WebKit2] Form controls handling: implement date and time controls.
index 1dd344787b4ccdd2dc8d19a27a6a66f60e923a07..f4b34e31f6559db49abbf2bdc1beebdf45cb1015 100644 (file)
@@ -571,7 +571,8 @@ static String createMarkupInternal(Document& document, const Range& range, const
     Node* body = enclosingNodeWithTag(firstPositionInNode(commonAncestor), bodyTag);
     Node* fullySelectedRoot = 0;
     // FIXME: Do this for all fully selected blocks, not just the body.
-    if (body && areRangesEqual(VisibleSelection::selectionFromContentsOfNode(body).toNormalizedRange().get(), &range))
+    if (body && VisiblePosition(firstPositionInNode(body)) == VisiblePosition(range.startPosition())
+        && VisiblePosition(lastPositionInNode(body)) == VisiblePosition(range.endPosition()))
         fullySelectedRoot = body;
     Node* specialCommonAncestor = highestAncestorToWrapMarkup(&updatedRange, shouldAnnotate);