Jacek Caban : mshtml: Set selection to default on IHTMLSelectionObject:: createRange if there is no range selected.

Alexandre Julliard julliard at winehq.org
Fri Oct 19 08:35:39 CDT 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct 18 14:54:42 2007 +0200

mshtml: Set selection to default on IHTMLSelectionObject::createRange if there is no range selected.

---

 dlls/mshtml/selection.c |   30 +++++++++++++++++++++++++++++-
 dlls/mshtml/tests/dom.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletions(-)

diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c
index 4139d3b..df2d635 100644
--- a/dlls/mshtml/selection.c
+++ b/dlls/mshtml/selection.c
@@ -153,8 +153,36 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
         nsresult nsres;
 
         nsISelection_GetRangeCount(This->nsselection, &nsrange_cnt);
-        if(nsrange_cnt != 1)
+        if(!nsrange_cnt) {
+            nsIDOMDocument *nsdoc;
+            nsIDOMHTMLDocument *nshtmldoc;
+            nsIDOMHTMLElement *nsbody = NULL;
+
+            TRACE("nsrange_cnt = 0\n");
+
+            nsres = nsIWebNavigation_GetDocument(This->doc->nscontainer->navigation, &nsdoc);
+            if(NS_FAILED(nsres) || !nsdoc) {
+                ERR("GetDocument failed: %08x\n", nsres);
+                return E_FAIL;
+            }
+
+            nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
+            nsIDOMDocument_Release(nsdoc);
+
+            nsres = nsIDOMHTMLDocument_GetBody(nshtmldoc, &nsbody);
+            nsIDOMHTMLDocument_Release(nshtmldoc);
+            if(NS_FAILED(nsres) || !nsbody) {
+                ERR("Could not get body: %08x\n", nsres);
+                return E_FAIL;
+            }
+
+            nsres = nsISelection_Collapse(This->nsselection, (nsIDOMNode*)nsbody, 0);
+            nsIDOMHTMLElement_Release(nsbody);
+            if(NS_FAILED(nsres))
+                ERR("Collapse failed: %08x\n", nsres);
+        }else if(nsrange_cnt > 1) {
             FIXME("range_cnt = %d\n", nsrange_cnt);
+        }
 
         nsres = nsISelection_GetRangeAt(This->nsselection, 0, &nsrange);
         if(NS_FAILED(nsres))
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index bf9f499..3933ac8 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -539,6 +539,20 @@ static void _test_range_isequal(unsigned line, IHTMLTxtRange *range1, IHTMLTxtRa
     }
 }
 
+#define test_range_parent(r,t) _test_range_parent(__LINE__,r,t)
+static void _test_range_parent(unsigned line, IHTMLTxtRange *range, elem_type_t type)
+{
+    IHTMLElement *elem;
+    HRESULT hres;
+
+    hres = IHTMLTxtRange_parentElement(range, &elem);
+    ok_(__FILE__,line) (hres == S_OK, "parentElement failed: %08x\n", hres);
+
+    _test_elem_type(line, (IUnknown*)elem, type);
+
+    IHTMLElement_Release(elem);
+}
+
 static void test_elem_collection(IHTMLElementCollection *col, const elem_type_t *elem_types, long exlen)
 {
     long len;
@@ -695,6 +709,8 @@ static void test_txtrange(IHTMLDocument2 *doc)
     IHTMLElement *elem;
     IHTMLBodyElement *body;
     IHTMLTxtRange *body_range, *range, *range2;
+    IHTMLSelectionObject *selection;
+    IDispatch *disp_range;
     HRESULT hres;
 
     hres = IHTMLDocument2_get_body(doc, &elem);
@@ -841,6 +857,24 @@ static void test_txtrange(IHTMLDocument2 *doc)
 
     IHTMLTxtRange_Release(range);
     IHTMLTxtRange_Release(body_range);
+
+    hres = IHTMLDocument2_get_selection(doc, &selection);
+    ok(hres == S_OK, "IHTMLDocument2_get_selection failed: %08x\n", hres);
+
+    hres = IHTMLSelectionObject_createRange(selection, &disp_range);
+    ok(hres == S_OK, "IHTMLSelectionObject_createRange failed: %08x\n", hres);
+    IHTMLSelectionObject_Release(selection);
+
+    hres = IDispatch_QueryInterface(disp_range, &IID_IHTMLTxtRange, (void **)&range);
+    ok(hres == S_OK, "Could not get IID_IHTMLTxtRange interface: 0x%08x\n", hres);
+    IDispatch_Release(disp_range);
+
+    test_range_text(range, NULL);
+    test_range_moveend(range, characterW, 3, 3);
+    test_range_text(range, "wor");
+    test_range_parent(range, ET_BODY);
+
+    IHTMLTxtRange_Release(range);
 }
 
 static void test_compatmode(IHTMLDocument2 *doc)




More information about the wine-cvs mailing list