Jacek Caban : mshtml: Added more range tests and fixes.

Alexandre Julliard julliard at winehq.org
Mon Oct 15 11:27:58 CDT 2007


Module: wine
Branch: master
Commit: 07dfef53bcb6475788ac5bf6578323572387ed48
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=07dfef53bcb6475788ac5bf6578323572387ed48

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Oct 14 01:14:08 2007 +0200

mshtml: Added more range tests and fixes.

---

 dlls/mshtml/tests/dom.c |    4 ++++
 dlls/mshtml/txtrange.c  |   36 ++++++++++++++++++++++++++----------
 2 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 59b77a7..364f139 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -726,6 +726,10 @@ static void test_txtrange(IHTMLDocument2 *doc)
     test_range_expand(range, wordW, VARIANT_FALSE, "123");
     test_range_move(range, characterW, 2, 2);
     test_range_expand(range, wordW, VARIANT_TRUE, "123");
+    test_range_moveend(range, characterW, -5, -5);
+    test_range_text(range, NULL);
+    test_range_moveend(range, characterW, 3, 3);
+    test_range_text(range, "c 1");
 
     IHTMLTxtRange_Release(range);
 
diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c
index faea069..39711e8 100644
--- a/dlls/mshtml/txtrange.c
+++ b/dlls/mshtml/txtrange.c
@@ -413,6 +413,11 @@ static inline void dompos_addref(dompos_t *pos)
         fill_nodestr(pos);
 }
 
+static inline BOOL dompos_cmp(const dompos_t *pos1, const dompos_t *pos2)
+{
+    return pos1->node == pos2->node && pos1->off == pos2->off;
+}
+
 static void range_to_string(HTMLTxtRange *This, wstrbuf_t *buf)
 {
     nsIDOMNode *iter, *tmp;
@@ -601,12 +606,16 @@ static long move_next_chars(long cnt, const dompos_t *pos, BOOL col, dompos_t *n
     return ret;
 }
 
-static long move_prev_chars(HTMLTxtRange *This, long cnt, const dompos_t *pos, BOOL end, dompos_t *new_pos)
+static long move_prev_chars(HTMLTxtRange *This, long cnt, const dompos_t *pos, BOOL end,
+        const dompos_t *bound_pos, BOOL *bounded, dompos_t *new_pos)
 {
     dompos_t iter, tmp;
     long ret = 0;
     WCHAR c;
 
+    if(bounded)
+        *bounded = FALSE;
+
     c = prev_char(This, pos, &iter);
     if(c)
         ret++;
@@ -620,8 +629,12 @@ static long move_prev_chars(HTMLTxtRange *This, long cnt, const dompos_t *pos, B
                 ret++;
             break;
         }
+
         ret++;
         dompos_release(&tmp);
+
+        if(bound_pos && dompos_cmp(&iter, bound_pos))
+            *bounded = TRUE;
     }
 
     *new_pos = iter;
@@ -1114,7 +1127,7 @@ static HRESULT WINAPI HTMLTxtRange_move(IHTMLTxtRange *iface, BSTR Unit,
             IHTMLTxtRange_collapse(HTMLTXTRANGE(This), FALSE);
             dompos_release(&new_pos);
         }else {
-            *ActualCount = -move_prev_chars(This, -Count, &cur_pos, FALSE, &new_pos);
+            *ActualCount = -move_prev_chars(This, -Count, &cur_pos, FALSE, NULL, NULL, &new_pos);
             set_range_pos(This, TRUE, &new_pos);
             IHTMLTxtRange_collapse(HTMLTXTRANGE(This), TRUE);
             dompos_release(&new_pos);
@@ -1180,24 +1193,27 @@ static HRESULT WINAPI HTMLTxtRange_moveEnd(IHTMLTxtRange *iface, BSTR Unit,
 
     switch(unit) {
     case RU_CHAR: {
-        dompos_t cur_pos, new_pos;
+        dompos_t start_pos, end_pos, new_pos;
         PRBool collapsed;
 
-        get_cur_pos(This, FALSE, &cur_pos);
+        get_cur_pos(This, TRUE, &start_pos);
+        get_cur_pos(This, FALSE, &end_pos);
         nsIDOMRange_GetCollapsed(This->nsrange, &collapsed);
 
         if(Count > 0) {
-            *ActualCount = move_next_chars(Count, &cur_pos, collapsed, &new_pos);
+            *ActualCount = move_next_chars(Count, &end_pos, collapsed, &new_pos);
             set_range_pos(This, FALSE, &new_pos);
         }else {
-            *ActualCount = -move_prev_chars(This, -Count, &cur_pos, TRUE,  &new_pos);
-            if(*ActualCount == Count)
-                set_range_pos(This, FALSE, &new_pos);
-            else
+            BOOL bounded;
+
+            *ActualCount = -move_prev_chars(This, -Count, &end_pos, TRUE, &start_pos, &bounded, &new_pos);
+            set_range_pos(This, bounded, &new_pos);
+            if(bounded)
                 IHTMLTxtRange_collapse(HTMLTXTRANGE(This), TRUE);
         }
 
-        dompos_release(&cur_pos);
+        dompos_release(&start_pos);
+        dompos_release(&end_pos);
         dompos_release(&new_pos);
         break;
     }




More information about the wine-cvs mailing list