2009-03-31 Darin Adler <darin@apple.com>
authordarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Apr 2009 04:41:34 +0000 (04:41 +0000)
committerdarin@apple.com <darin@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 1 Apr 2009 04:41:34 +0000 (04:41 +0000)
        Reviewed by Eric Seidel.

        Bug 24621: PositionIterator doesn't iterate "after last child" positions when going backwards
        https://bugs.webkit.org/show_bug.cgi?id=24621

        * dom/PositionIterator.cpp:
        (WebCore::PositionIterator::decrement): Make sure that when the parent has no children, we
        don't ever use Position::uncheckedPreviousOffset. This is consistent with the forward
        iterator, but also should never arise because of the fix below.
        * dom/PositionIterator.h:
        (WebCore::PositionIterator::PositionIterator): Fixed so m_offset will always be 0 when
        the passed-in node has no children. Like the change above, this is consistent with the rest
        of the class, although in the long run I think it's a bit strange to treat a <p> element
        with no children differently than a <p> element with children.

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

WebCore/ChangeLog
WebCore/dom/PositionIterator.cpp
WebCore/dom/PositionIterator.h

index 949bd55..a0feaac 100644 (file)
@@ -1,3 +1,20 @@
+2009-03-31  Darin Adler  <darin@apple.com>
+
+        Reviewed by Eric Seidel.
+
+        Bug 24621: PositionIterator doesn't iterate "after last child" positions when going backwards
+        https://bugs.webkit.org/show_bug.cgi?id=24621
+
+        * dom/PositionIterator.cpp:
+        (WebCore::PositionIterator::decrement): Make sure that when the parent has no children, we
+        don't ever use Position::uncheckedPreviousOffset. This is consistent with the forward
+        iterator, but also should never arise because of the fix below.
+        * dom/PositionIterator.h:
+        (WebCore::PositionIterator::PositionIterator): Fixed so m_offset will always be 0 when
+        the passed-in node has no children. Like the change above, this is consistent with the rest
+        of the class, although in the long run I think it's a bit strange to treat a <p> element
+        with no children differently than a <p> element with children.
+
 2009-03-31  Eric Carlson  <eric.carlson@apple.com>
 
         Reviewed by Simon Fraser.
index 781d352..62ce8ee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -85,13 +85,14 @@ void PositionIterator::decrement()
         return;
     }
 
-    if (m_offset) {
-        m_offset = Position::uncheckedPreviousOffset(m_parent, m_offset);
+    if (m_parent->hasChildNodes()) {
+        ASSERT(!m_offset);
+        m_parent = m_parent->lastChild();
+        if (!m_parent->hasChildNodes())
+            m_offset = lastOffsetForEditing(m_parent);
     } else {
-        if (m_parent->hasChildNodes()) {
-            m_parent = m_parent->lastChild();
-            if (!m_parent->hasChildNodes())
-                m_offset = lastOffsetForEditing(m_parent);
+        if (m_offset) {
+            m_offset = Position::uncheckedPreviousOffset(m_parent, m_offset);
         } else {
             m_child = m_parent;
             m_parent = m_parent->parentNode();
index 98a2ccb..c90c31c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2007, 2008, 2009 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -42,18 +42,17 @@ public:
         , m_offset(0)
     {
     }
-
-    PositionIterator(const Position& pos)
-        : m_parent(pos.node())
-        , m_child(m_parent->childNode(pos.m_offset))
-        , m_offset(m_child ? 0 : pos.m_offset)
+    PositionIterator(const Position& position)
+        : m_parent(position.node())
+        , m_child(m_parent->childNode(position.m_offset))
+        , m_offset(m_parent->hasChildNodes() ? 0 : position.m_offset)
     {
     }
-    operator Position() const;
 
     void increment();
     void decrement();
 
+    operator Position() const;
     Node* node() const { return m_parent; }
     int offsetInLeafNode() const { return m_offset; }