From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmldoc.c | 5 +++++ dlls/mshtml/htmlevent.c | 5 +++-- dlls/mshtml/nsevents.c | 7 +++++++ dlls/mshtml/tests/dom.js | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 67d14da30ae..7a9301796ba 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -1469,6 +1469,11 @@ static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT if(tmp) nsISupports_Release(tmp);
+ /* Open resets all document event handlers. Reflect this in the DOM event target and reinitialize + * our Gecko listeners. */ + release_event_target(&This->node.event_target); + doc_init_events(This); + *pomWindowResult = (IDispatch*)&This->window->base.outer_window->base.IHTMLWindow2_iface; IHTMLWindow2_AddRef(&This->window->base.outer_window->base.IHTMLWindow2_iface); return S_OK; diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 8af5a1ff6a1..3d6df5e2b44 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -4964,8 +4964,9 @@ HRESULT doc_init_events(HTMLDocumentNode *doc) unsigned i; HRESULT hres;
- doc->event_vector = calloc(EVENTID_LAST, sizeof(BOOL)); - if(!doc->event_vector) + if(doc->event_vector) + memset(doc->event_vector, 0, EVENTID_LAST * sizeof(BOOL)); + else if(!(doc->event_vector = calloc(EVENTID_LAST, sizeof(BOOL)))) return E_OUTOFMEMORY;
init_nsevents(doc); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 342615a9e67..3fbc1cf09fe 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -573,6 +573,13 @@ void init_nsevents(HTMLDocumentNode *doc) nsIDOMEventTarget *target; unsigned i;
+ if(doc->nsevent_listener) { + listener = doc->nsevent_listener; + listener->doc = NULL; + doc->nsevent_listener = NULL; + release_listener(listener); + } + listener = malloc(sizeof(nsDocumentEventListener)); if(!listener) return; diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js index ff81bcc8c90..180c56fbbfe 100644 --- a/dlls/mshtml/tests/dom.js +++ b/dlls/mshtml/tests/dom.js @@ -1149,3 +1149,17 @@ sync_test("attributeNode", function() { ok(e.message === "NotFoundError", "removeChild threw " + e.message); } }); + +sync_test("document.open", function() { + document.body.innerHTML = '<iframe id="test"></iframe>'; + var elem = document.getElementById("test"); + var doc = elem.contentDocument; + var f = function() {}; + doc.onclick = f; + ok(doc.onclick === f, "doc.onclick != f"); + doc.open(); + ok(doc.onclick === null, "doc.onclick != null"); + doc.onclick = f; + doc.close(); + ok(doc.onclick === f, "doc.onclick != f"); +});