[v2 PATCH] mshtml: Add IHTMLDOMRange stub.

Nikolay Sivov nsivov at codeweavers.com
Thu Jun 27 05:46:14 CDT 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mshtml/Makefile.in             |   2 +-
 dlls/mshtml/htmldoc.c               |  18 +-
 dlls/mshtml/mshtml_private.h        |   3 +
 dlls/mshtml/{txtrange.c => range.c} | 349 ++++++++++++++++++++++++++++
 dlls/mshtml/tests/dom.c             |  23 ++
 include/mshtml.idl                  |  88 +++++++
 6 files changed, 480 insertions(+), 3 deletions(-)
 rename dlls/mshtml/{txtrange.c => range.c} (82%)

diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in
index f054816056..7e1d517f07 100644
--- a/dlls/mshtml/Makefile.in
+++ b/dlls/mshtml/Makefile.in
@@ -55,13 +55,13 @@ C_SRCS = \
 	persist.c \
 	pluginhost.c \
 	protocol.c \
+	range.c \
 	script.c \
 	secmgr.c \
 	selection.c \
 	service.c \
 	svg.c \
 	task.c \
-	txtrange.c \
 	view.c \
 	xmlhttprequest.c
 
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 7595ad852a..0daaff7d95 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -5223,8 +5223,22 @@ static HRESULT WINAPI DocumentRange_Invoke(IDocumentRange *iface, DISPID dispIdM
 static HRESULT WINAPI DocumentRange_createRange(IDocumentRange *iface, IHTMLDOMRange **p)
 {
     HTMLDocument *This = impl_from_IDocumentRange(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    nsIDOMRange *nsrange;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(!This->doc_node->nsdoc) {
+        WARN("NULL nsdoc\n");
+        return E_UNEXPECTED;
+    }
+
+    if(NS_FAILED(nsIDOMHTMLDocument_CreateRange(This->doc_node->nsdoc, &nsrange)))
+        return E_FAIL;
+
+    hres = HTMLDOMRange_Create(This->doc_node, nsrange, p);
+    nsIDOMRange_Release(nsrange);
+    return hres;
 }
 
 static const IDocumentRangeVtbl DocumentRangeVtbl = {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index ef56f1d23d..17c44f340e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -95,6 +95,7 @@ typedef struct EventTarget EventTarget;
     XDIID(DispHTMLDocument) \
     XDIID(DispHTMLDOMAttribute) \
     XDIID(DispHTMLDOMImplementation) \
+    XDIID(DispHTMLDOMRange) \
     XDIID(DispHTMLDOMTextNode) \
     XDIID(DispHTMLElementCollection) \
     XDIID(DispHTMLEmbed) \
@@ -178,6 +179,7 @@ typedef struct EventTarget EventTarget;
     XIID(IHTMLDOMNode) \
     XIID(IHTMLDOMNode2) \
     XIID(IHTMLDOMNode3) \
+    XIID(IHTMLDOMRange) \
     XIID(IHTMLDOMTextNode) \
     XIID(IHTMLDOMTextNode2) \
     XIID(IHTMLElement) \
@@ -1008,6 +1010,7 @@ HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectio
 HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**) DECLSPEC_HIDDEN;
 IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*) DECLSPEC_HIDDEN;
 IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*) DECLSPEC_HIDDEN;
+HRESULT HTMLDOMRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLDOMRange**) DECLSPEC_HIDDEN;
 
 void detach_document_node(HTMLDocumentNode*) DECLSPEC_HIDDEN;
 void detach_selection(HTMLDocumentNode*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/range.c
similarity index 82%
rename from dlls/mshtml/txtrange.c
rename to dlls/mshtml/range.c
index c6a6ed096b..1fa746f539 100644
--- a/dlls/mshtml/txtrange.c
+++ b/dlls/mshtml/range.c
@@ -49,6 +49,15 @@ typedef struct {
     struct list entry;
 } HTMLTxtRange;
 
+typedef struct {
+    DispatchEx dispex;
+    IHTMLDOMRange IHTMLDOMRange_iface;
+
+    LONG ref;
+
+    nsIDOMRange *nsrange;
+} HTMLDOMRange;
+
 typedef struct {
     WCHAR *buf;
     DWORD len;
@@ -1758,6 +1767,346 @@ HRESULT HTMLTxtRange_Create(HTMLDocumentNode *doc, nsIDOMRange *nsrange, IHTMLTx
     return S_OK;
 }
 
+static inline HTMLDOMRange *impl_from_IHTMLDOMRange(IHTMLDOMRange *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLDOMRange, IHTMLDOMRange_iface);
+}
+
+static HRESULT WINAPI HTMLDOMRange_QueryInterface(IHTMLDOMRange *iface, REFIID riid, void **ppv)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
+
+    if(IsEqualGUID(&IID_IUnknown, riid)) {
+        *ppv = &This->IHTMLDOMRange_iface;
+    }else if(IsEqualGUID(&IID_IHTMLDOMRange, riid)) {
+        *ppv = &This->IHTMLDOMRange_iface;
+    }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+        return *ppv ? S_OK : E_NOINTERFACE;
+    }else {
+        *ppv = NULL;
+        WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
+        return E_NOINTERFACE;
+    }
+
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
+}
+
+static ULONG WINAPI HTMLDOMRange_AddRef(IHTMLDOMRange *iface)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    LONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    return ref;
+}
+
+static ULONG WINAPI HTMLDOMRange_Release(IHTMLDOMRange *iface)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    LONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("(%p) ref=%d\n", This, ref);
+
+    if(!ref) {
+        if(This->nsrange)
+            nsIDOMRange_Release(This->nsrange);
+        release_dispex(&This->dispex);
+        heap_free(This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI HTMLDOMRange_GetTypeInfoCount(IHTMLDOMRange *iface, UINT *pctinfo)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+
+    return IDispatchEx_GetTypeInfoCount(&This->dispex.IDispatchEx_iface, pctinfo);
+}
+
+static HRESULT WINAPI HTMLDOMRange_GetTypeInfo(IHTMLDOMRange *iface, UINT iTInfo,
+                                               LCID lcid, ITypeInfo **ppTInfo)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+
+    return IDispatchEx_GetTypeInfo(&This->dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo);
+}
+
+static HRESULT WINAPI HTMLDOMRange_GetIDsOfNames(IHTMLDOMRange *iface, REFIID riid,
+                                                 LPOLESTR *rgszNames, UINT cNames,
+                                                 LCID lcid, DISPID *rgDispId)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+
+    return IDispatchEx_GetIDsOfNames(&This->dispex.IDispatchEx_iface, riid, rgszNames,
+            cNames, lcid, rgDispId);
+}
+
+static HRESULT WINAPI HTMLDOMRange_Invoke(IHTMLDOMRange *iface, DISPID dispIdMember,
+                            REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
+                            VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+
+    return IDispatchEx_Invoke(&This->dispex.IDispatchEx_iface, dispIdMember, riid,
+            lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_startContainer(IHTMLDOMRange *iface, IHTMLDOMNode **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_startOffset(IHTMLDOMRange *iface, LONG *p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_endContainer(IHTMLDOMRange *iface, IHTMLDOMNode **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_endOffset(IHTMLDOMRange *iface, LONG *p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_collapsed(IHTMLDOMRange *iface, VARIANT_BOOL *p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_get_commonAncestorContainer(IHTMLDOMRange *iface, IHTMLDOMNode **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setStart(IHTMLDOMRange *iface, IDispatch *node, LONG offset)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p, %d)\n", This, node, offset);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setEnd(IHTMLDOMRange *iface, IDispatch *node, LONG offset)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p, %d)\n", This, node, offset);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setStartBefore(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setStartAfter(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setEndBefore(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_setEndAfter(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_collapse(IHTMLDOMRange *iface, VARIANT_BOOL tostart)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%x)\n", This, tostart);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_selectNode(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_selectNodeContents(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_compareBoundaryPoints(IHTMLDOMRange *iface, short how,
+    IDispatch *src_range, LONG *result)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%x, %p, %p)\n", This, how, src_range, result);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_deleteContents(IHTMLDOMRange *iface)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_extractContents(IHTMLDOMRange *iface, IDispatch **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_cloneContents(IHTMLDOMRange *iface, IDispatch **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_insertNode(IHTMLDOMRange *iface, IDispatch *node)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, node);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_surroundContents(IHTMLDOMRange *iface, IDispatch *parent)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, parent);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_cloneRange(IHTMLDOMRange *iface, IHTMLDOMRange **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_toString(IHTMLDOMRange *iface, BSTR *p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_detach(IHTMLDOMRange *iface)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)\n", This);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_getClientRects(IHTMLDOMRange *iface, IHTMLRectCollection **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI HTMLDOMRange_getBoundingClientRect(IHTMLDOMRange *iface, IHTMLRect **p)
+{
+    HTMLDOMRange *This = impl_from_IHTMLDOMRange(iface);
+    FIXME("(%p)->(%p)\n", This, p);
+    return E_NOTIMPL;
+}
+
+static const IHTMLDOMRangeVtbl HTMLDOMRangeVtbl = {
+    HTMLDOMRange_QueryInterface,
+    HTMLDOMRange_AddRef,
+    HTMLDOMRange_Release,
+    HTMLDOMRange_GetTypeInfoCount,
+    HTMLDOMRange_GetTypeInfo,
+    HTMLDOMRange_GetIDsOfNames,
+    HTMLDOMRange_Invoke,
+    HTMLDOMRange_get_startContainer,
+    HTMLDOMRange_get_startOffset,
+    HTMLDOMRange_get_endContainer,
+    HTMLDOMRange_get_endOffset,
+    HTMLDOMRange_get_collapsed,
+    HTMLDOMRange_get_commonAncestorContainer,
+    HTMLDOMRange_setStart,
+    HTMLDOMRange_setEnd,
+    HTMLDOMRange_setStartBefore,
+    HTMLDOMRange_setStartAfter,
+    HTMLDOMRange_setEndBefore,
+    HTMLDOMRange_setEndAfter,
+    HTMLDOMRange_collapse,
+    HTMLDOMRange_selectNode,
+    HTMLDOMRange_selectNodeContents,
+    HTMLDOMRange_compareBoundaryPoints,
+    HTMLDOMRange_deleteContents,
+    HTMLDOMRange_extractContents,
+    HTMLDOMRange_cloneContents,
+    HTMLDOMRange_insertNode,
+    HTMLDOMRange_surroundContents,
+    HTMLDOMRange_cloneRange,
+    HTMLDOMRange_toString,
+    HTMLDOMRange_detach,
+    HTMLDOMRange_getClientRects,
+    HTMLDOMRange_getBoundingClientRect,
+};
+
+static const tid_t HTMLDOMRange_iface_tids[] = {
+    IHTMLDOMRange_tid,
+    0
+};
+
+static dispex_static_data_t HTMLDOMRange_dispex = {
+    NULL,
+    DispHTMLDOMRange_tid,
+    HTMLDOMRange_iface_tids
+};
+
+HRESULT HTMLDOMRange_Create(HTMLDocumentNode *doc, nsIDOMRange *nsrange, IHTMLDOMRange **p)
+{
+    HTMLDOMRange *ret;
+
+    ret = heap_alloc(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
+
+    init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLDOMRange_iface, &HTMLDOMRange_dispex);
+
+    ret->IHTMLDOMRange_iface.lpVtbl = &HTMLDOMRangeVtbl;
+    ret->ref = 1;
+
+    if(nsrange)
+        nsIDOMRange_AddRef(nsrange);
+    ret->nsrange = nsrange;
+
+    *p = &ret->IHTMLDOMRange_iface;
+    return S_OK;
+}
+
 void detach_ranges(HTMLDocumentNode *This)
 {
     HTMLTxtRange *iter, *next;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 586df7d8a5..cb5e930820 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -10380,6 +10380,28 @@ static void test_docfrag(IHTMLDocument2 *doc)
     IHTMLDocument2_Release(frag);
 }
 
+static void test_domrange(IHTMLDocument2 *doc)
+{
+    IDocumentRange *doc_range;
+    IHTMLDOMRange *range;
+    HRESULT hres;
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IDocumentRange, (void **)&doc_range);
+    ok(hres == S_OK || broken(hres == E_NOINTERFACE) /* XP */, "Failed to get IDocumentRange: %08x\n", hres);
+
+    if (FAILED(hres))
+        return;
+
+    hres = IDocumentRange_createRange(doc_range, &range);
+    ok(hres == S_OK, "Failed to create range, %08x\n", hres);
+
+    test_disp((IUnknown *)range, &DIID_DispHTMLDOMRange, NULL, NULL);
+
+    IHTMLDOMRange_Release(range);
+
+    IDocumentRange_Release(doc_range);
+}
+
 static void check_quirks_mode(IHTMLDocument2 *doc)
 {
     test_compatmode(doc, "BackCompat");
@@ -11077,6 +11099,7 @@ START_TEST(dom)
     run_domtest(emptydiv_str, test_docfrag);
     run_domtest(doc_blank, test_replacechild_elems);
     run_domtest(doctype_str, test_doctype);
+    run_domtest(doc_blank, test_domrange);
 
     test_quirks_mode();
 
diff --git a/include/mshtml.idl b/include/mshtml.idl
index aea888b2b8..0faa605482 100644
--- a/include/mshtml.idl
+++ b/include/mshtml.idl
@@ -420,6 +420,7 @@ interface ILineInfo;
 interface IMarkupPointer;
 interface IMarkupContainer;
 interface ISVGSVGElement;
+interface IHTMLDOMRange;
 
 /*****************************************************************************
  *    IHTMLCSSStyleDeclaration interface
@@ -12205,6 +12206,93 @@ interface IHTMLTxtRange : IDispatch
         [retval, out] VARIANT_BOOL *pfRet);
 }
 
+[
+    hidden,
+    uuid(3050f5a3-98b5-11cf-bb82-00aa00bdce0b)
+]
+dispinterface DispHTMLDOMRange
+{
+properties:
+methods:
+    [propget, id(DISPID_IHTMLDOMRANGE_STARTCONTAINER)]
+    IHTMLDOMNode *startContainer();
+
+    [propget, id(DISPID_IHTMLDOMRANGE_STARTOFFSET)]
+    long startOffset();
+
+    [propget, id(DISPID_IHTMLDOMRANGE_ENDCONTAINER)]
+    IHTMLDOMNode *endContainer();
+
+    [propget, id(DISPID_IHTMLDOMRANGE_ENDOFFSET)]
+    long endOffset();
+
+    [propget, id(DISPID_IHTMLDOMRANGE_COLLAPSED)]
+    VARIANT_BOOL collapsed();
+
+    [propget, id(DISPID_IHTMLDOMRANGE_COMMONANCESTORCONTAINER)]
+    IHTMLDOMNode *commonAncestorContainer();
+
+    [id(DISPID_IHTMLDOMRANGE_SETSTART)]
+    void setStart([in] IDispatch *node ,[in] long offset);
+
+    [id(DISPID_IHTMLDOMRANGE_SETEND)]
+    void setEnd([in] IDispatch *node, [in] long offset);
+
+    [id(DISPID_IHTMLDOMRANGE_SETSTARTBEFORE)]
+    void setStartBefore([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_SETSTARTAFTER)]
+    void setStartAfter([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_SETENDBEFORE)]
+    void setEndBefore([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_SETENDAFTER)]
+    void setEndAfter([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_COLLAPSE)]
+    void collapse([in] VARIANT_BOOL tostart);
+
+    [id(DISPID_IHTMLDOMRANGE_SELECTNODE)]
+    void selectNode([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_SELECTNODECONTENTS)]
+    void selectNodeContents([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_COMPAREBOUNDARYPOINTS)]
+    long compareBoundaryPoints([in] short how, [in] IDispatch *src_range);
+
+    [id(DISPID_IHTMLDOMRANGE_DELETECONTENTS)]
+    void deleteContents();
+
+    [id(DISPID_IHTMLDOMRANGE_EXTRACTCONTENTS)]
+    IDispatch *extractContents();
+
+    [id(DISPID_IHTMLDOMRANGE_CLONECONTENTS)]
+    IDispatch *cloneContents();
+
+    [id(DISPID_IHTMLDOMRANGE_INSERTNODE)]
+    void insertNode([in] IDispatch *node);
+
+    [id(DISPID_IHTMLDOMRANGE_SURROUNDCONTENTS)]
+    void surroundContents([in] IDispatch *parent);
+
+    [id(DISPID_IHTMLDOMRANGE_CLONERANGE)]
+    IHTMLDOMRange *cloneRange();
+
+    [id(DISPID_IHTMLDOMRANGE_TOSTRING)]
+    BSTR toString();
+
+    [id(DISPID_IHTMLDOMRANGE_DETACH)]
+    void detach();
+
+    [id(DISPID_IHTMLDOMRANGE_GETCLIENTRECTS)]
+    IHTMLRectCollection *getClientRects();
+
+    [id(DISPID_IHTMLDOMRANGE_GETBOUNDINGCLIENTRECT)]
+    IHTMLRect *getBoundingClientRect();
+}
+
 /*****************************************************************************
  *    IHTMLDOMRange interface
  */
-- 
2.20.1




More information about the wine-devel mailing list