From 573d612de46b665081f7ea01ccf21b1d6243bc69 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 10 May 2007 00:32:48 +0200 Subject: [PATCH] mshtml: Reimplement IHTMTxtRange on top of nsIDOMRange. --- dlls/mshtml/mshtml_private.h | 2 +- dlls/mshtml/selection.c | 16 ++++++++++++++- dlls/mshtml/txtrange.c | 48 ++++++++++++++++++++++++++------------------ 3 files changed, 45 insertions(+), 21 deletions(-) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 6d8e1546bfc..432df7e25d6 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -351,7 +351,7 @@ void set_document_bscallback(HTMLDocument*,BSCallback*); IHlink *Hlink_Create(void); IHTMLSelectionObject *HTMLSelectionObject_Create(nsISelection*); -IHTMLTxtRange *HTMLTxtRange_Create(nsISelection*); +IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange*); IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*); IHTMLStyleSheet *HTMLStyleSheet_Create(void); diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index f5cc5aa381f..79683f04477 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -139,10 +139,24 @@ static HRESULT WINAPI HTMLSelectionObject_Invoke(IHTMLSelectionObject *iface, DI static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *iface, IDispatch **range) { HTMLSelectionObject *This = HTMLSELOBJ_THIS(iface); + nsIDOMRange *nsrange = NULL; TRACE("(%p)->(%p)\n", This, range); - *range = (IDispatch*)HTMLTxtRange_Create(This->nsselection); + if(This->nsselection) { + PRInt32 nsrange_cnt = 0; + nsresult nsres; + + nsISelection_GetRangeCount(This->nsselection, &nsrange_cnt); + if(nsrange_cnt != 1) + FIXME("range_cnt = %d\n", nsrange_cnt); + + nsres = nsISelection_GetRangeAt(This->nsselection, 0, &nsrange); + if(NS_FAILED(nsres)) + ERR("GetRangeAt failed: %08x\n", nsres); + } + + *range = (IDispatch*)HTMLTxtRange_Create(nsrange); return S_OK; } diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c index eb83fd07ed1..70fb1f972b9 100644 --- a/dlls/mshtml/txtrange.c +++ b/dlls/mshtml/txtrange.c @@ -41,7 +41,7 @@ typedef struct { LONG ref; - nsISelection *nsselection; + nsIDOMRange *nsrange; } HTMLTxtRange; #define HTMLTXTRANGE(x) ((IHTMLTxtRange*) &(x)->lpHTMLTxtRangeVtbl) @@ -92,8 +92,8 @@ static ULONG WINAPI HTMLTxtRange_Release(IHTMLTxtRange *iface) TRACE("(%p) ref=%d\n", This, ref); if(!ref) { - if(This->nsselection) - nsISelection_Release(This->nsselection); + if(This->nsrange) + nsISelection_Release(This->nsrange); mshtml_free(This); } @@ -152,25 +152,35 @@ static HRESULT WINAPI HTMLTxtRange_put_text(IHTMLTxtRange *iface, BSTR v) static HRESULT WINAPI HTMLTxtRange_get_text(IHTMLTxtRange *iface, BSTR *p) { HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface); - PRUnichar *nstext = NULL; - nsresult nsres; TRACE("(%p)->(%p)\n", This, p); - if(!This->nsselection) { - static const WCHAR empty[] = {0}; - *p = SysAllocString(empty); - return S_OK; + *p = NULL; + + if(This->nsrange) { + nsAString text_str; + nsresult nsres; + + nsAString_Init(&text_str, NULL); + + nsres = nsIDOMRange_ToString(This->nsrange, &text_str); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *nstext; + + nsAString_GetData(&text_str, &nstext, NULL); + *p = SysAllocString(nstext); + }else { + ERR("ToString failed: %08x\n", nsres); + } + + nsAString_Finish(&text_str); } - nsres = nsISelection_ToString(This->nsselection, &nstext); - if(NS_FAILED(nsres) || !nstext) { - ERR("toString failed: %08x\n", nsres); - return E_FAIL; + if(!*p) { + static const WCHAR empty[] = {0}; + *p = SysAllocString(empty); } - *p = SysAllocString(nstext); - nsfree(nstext); return S_OK; } @@ -422,16 +432,16 @@ static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl = { HTMLTxtRange_execCommandShowHelp }; -IHTMLTxtRange *HTMLTxtRange_Create(nsISelection *nsselection) +IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange *nsrange) { HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange)); ret->lpHTMLTxtRangeVtbl = &HTMLTxtRangeVtbl; ret->ref = 1; - if(nsselection) - nsISelection_AddRef(nsselection); - ret->nsselection = nsselection; + if(nsrange) + nsIDOMRange_AddRef(nsrange); + ret->nsrange = nsrange; return HTMLTXTRANGE(ret); } -- 2.11.4.GIT