Module: wine Branch: master Commit: 573d612de46b665081f7ea01ccf21b1d6243bc69 URL: http://source.winehq.org/git/wine.git/?a=commit;h=573d612de46b665081f7ea01cc...
Author: Jacek Caban jacek@codeweavers.com Date: Thu May 10 00:32:48 2007 +0200
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 6d8e154..432df7e 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 f5cc5aa..79683f0 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 eb83fd0..70fb1f9 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); }