Module: wine Branch: master Commit: e68cc482152d937690f41685a3fab27a3e566627 URL: https://gitlab.winehq.org/wine/wine/-/commit/e68cc482152d937690f41685a3fab27...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Nov 20 14:57:06 2023 +0100
mshtml: Store Gecko inner window in HTMLInnerWindow and use it in HTMLTxtRange_select.
---
dlls/mshtml/htmlwindow.c | 12 +++++++++++- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/range.c | 7 ++++++- 3 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 11c7c6d892d..fc0a03e3bf8 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3955,6 +3955,8 @@ static void HTMLWindow_traverse(DispatchEx *dispex, nsCycleCollectionTraversalCa note_cc_edge((nsISupports*)This->session_storage, "session_storage", cb); if(This->local_storage) note_cc_edge((nsISupports*)This->local_storage, "local_storage", cb); + if(This->dom_window) + note_cc_edge((nsISupports*)This->dom_window, "dom_window", cb); traverse_variant(&This->performance, "performance", cb); }
@@ -4009,6 +4011,7 @@ static void HTMLWindow_unlink(DispatchEx *dispex) IHTMLStorage_Release(local_storage); } unlink_variant(&This->performance); + unlink_ref(&This->dom_window); }
static void HTMLWindow_destructor(DispatchEx *dispex) @@ -4523,11 +4526,12 @@ HRESULT update_window_doc(HTMLInnerWindow *window) { HTMLOuterWindow *outer_window = window->base.outer_window; compat_mode_t parent_mode = COMPAT_MODE_QUIRKS; + mozIDOMWindow *gecko_inner_window; nsIDOMDocument *nsdoc; nsresult nsres; HRESULT hres;
- assert(!window->doc); + assert(!window->doc && !window->dom_window);
if(!outer_window) return E_UNEXPECTED; @@ -4538,6 +4542,12 @@ HRESULT update_window_doc(HTMLInnerWindow *window) return E_FAIL; }
+ nsres = nsIDOMWindow_GetInnerWindow(outer_window->nswindow, &gecko_inner_window); + assert(nsres == NS_OK); + nsres = mozIDOMWindow_QueryInterface(gecko_inner_window, &IID_nsIDOMWindow, (void **)&window->dom_window); + assert(nsres == NS_OK); + mozIDOMWindow_Release(gecko_inner_window); + if(outer_window->parent) parent_mode = outer_window->parent->base.inner_window->doc->document_mode;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 23e1decc68b..40dcb0ebfab 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -580,6 +580,7 @@ struct HTMLInnerWindow { EventTarget event_target;
HTMLDocumentNode *doc; + nsIDOMWindow *dom_window;
struct list children; struct list script_hosts; diff --git a/dlls/mshtml/range.c b/dlls/mshtml/range.c index 738818d93fb..e9b0b0edfef 100644 --- a/dlls/mshtml/range.c +++ b/dlls/mshtml/range.c @@ -1287,7 +1287,12 @@ static HRESULT WINAPI HTMLTxtRange_select(IHTMLTxtRange *iface)
TRACE("(%p)\n", This);
- nsres = nsIDOMWindow_GetSelection(This->doc->outer_window->nswindow, &nsselection); + if(!This->doc->window) { + FIXME("no window\n"); + return E_FAIL; + } + + nsres = nsIDOMWindow_GetSelection(This->doc->window->dom_window, &nsselection); if(NS_FAILED(nsres)) { ERR("GetSelection failed: %08lx\n", nsres); return E_FAIL;