Module: wine Branch: master Commit: 068489fb9485a38c0565ac5ad4bf2fac4b167de7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=068489fb9485a38c0565ac5ad4...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 16 22:09:42 2009 +0200
mshtml: Moved selection_list to HTMLDocumentNode object.
---
dlls/mshtml/htmldoc.c | 8 ++++---- dlls/mshtml/mshtml_private.h | 7 ++++--- dlls/mshtml/selection.c | 31 ++++++++++++++++++------------- 3 files changed, 26 insertions(+), 20 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index a15112a..8b96328 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -428,8 +428,7 @@ static HRESULT WINAPI HTMLDocument_get_selection(IHTMLDocument2 *iface, IHTMLSel return E_FAIL; }
- *p = HTMLSelectionObject_Create(This, nsselection); - return S_OK; + return HTMLSelectionObject_Create(This->doc_node, nsselection, p); }
static HRESULT WINAPI HTMLDocument_get_readyState(IHTMLDocument2 *iface, BSTR *p) @@ -1741,7 +1740,6 @@ static void init_doc(HTMLDocument *doc, const htmldoc_vtbl_t *vtbl) doc->readystate = READYSTATE_UNINITIALIZED;
list_init(&doc->bindings); - list_init(&doc->selection_list); list_init(&doc->range_list);
HTMLDocument_HTMLDocument3_Init(doc); @@ -1787,7 +1785,6 @@ static void destroy_htmldoc(HTMLDocument *This) release_event_target(This->event_target);
heap_free(This->mime); - detach_selection(This); detach_ranges(This); release_nodes(This); release_dispex(&This->dispex); @@ -1825,6 +1822,7 @@ static ULONG HTMLDocumentNode_Release(HTMLDocument *base) TRACE("(%p) ref = %u\n", This, ref);
if(!ref) { + detach_selection(This); destroy_htmldoc(&This->basedoc); heap_free(This); } @@ -1859,6 +1857,8 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
doc->basedoc.window = window;
+ list_init(&doc->selection_list); + *ret = doc; return S_OK; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index cf68394..0829190 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -320,7 +320,6 @@ struct HTMLDocument { ConnectionPoint cp_htmldocevents2; ConnectionPoint cp_propnotif;
- struct list selection_list; struct list range_list;
HTMLDOMNode *nodes; @@ -345,6 +344,8 @@ struct HTMLDocumentNode { HTMLDocument basedoc;
LONG ref; + + struct list selection_list; };
struct HTMLDocumentObj { @@ -635,13 +636,13 @@ HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*); void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*); IMoniker *get_channelbsc_mon(nsChannelBSC*);
-IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument*,nsISelection*); +HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**); IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument*,nsIDOMRange*); IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*); IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*); IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*);
-void detach_selection(HTMLDocument*); +void detach_selection(HTMLDocumentNode*); void detach_ranges(HTMLDocument*); HRESULT get_node_text(HTMLDOMNode*,BSTR*);
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index 53151a1..0d1729d 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -38,7 +38,7 @@ typedef struct { LONG ref;
nsISelection *nsselection; - HTMLDocument *doc; + HTMLDocumentNode *doc;
struct list entry; } HTMLSelectionObject; @@ -154,12 +154,12 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
TRACE("nsrange_cnt = 0\n");
- if(!This->doc->nsdoc) { + if(!This->doc->basedoc.nsdoc) { WARN("nsdoc is NULL\n"); return E_UNEXPECTED; }
- nsres = nsIDOMHTMLDocument_GetBody(This->doc->nsdoc, &nsbody); + nsres = nsIDOMHTMLDocument_GetBody(This->doc->basedoc.nsdoc, &nsbody); if(NS_FAILED(nsres) || !nsbody) { ERR("Could not get body: %08x\n", nsres); return E_FAIL; @@ -178,7 +178,7 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac ERR("GetRangeAt failed: %08x\n", nsres); }
- *range = (IDispatch*)HTMLTxtRange_Create(This->doc, nsrange); + *range = (IDispatch*)HTMLTxtRange_Create(&This->doc->basedoc, nsrange); return S_OK; }
@@ -230,21 +230,26 @@ static const IHTMLSelectionObjectVtbl HTMLSelectionObjectVtbl = { HTMLSelectionObject_get_type };
-IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument *doc, nsISelection *nsselection) +HRESULT HTMLSelectionObject_Create(HTMLDocumentNode *doc, nsISelection *nsselection, IHTMLSelectionObject **ret) { - HTMLSelectionObject *ret = heap_alloc(sizeof(HTMLSelectionObject)); + HTMLSelectionObject *selection;
- ret->lpHTMLSelectionObjectVtbl = &HTMLSelectionObjectVtbl; - ret->ref = 1; - ret->nsselection = nsselection; /* We shouldn't call AddRef here */ + selection = heap_alloc(sizeof(HTMLSelectionObject)); + if(!selection) + return E_OUTOFMEMORY;
- ret->doc = doc; - list_add_head(&doc->selection_list, &ret->entry); + selection->lpHTMLSelectionObjectVtbl = &HTMLSelectionObjectVtbl; + selection->ref = 1; + selection->nsselection = nsselection; /* We shouldn't call AddRef here */
- return HTMLSELOBJ(ret); + selection->doc = doc; + list_add_head(&doc->selection_list, &selection->entry); + + *ret = HTMLSELOBJ(selection); + return S_OK; }
-void detach_selection(HTMLDocument *This) +void detach_selection(HTMLDocumentNode *This) { HTMLSelectionObject *iter;