Commit 23891357 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Moved HTMLDocumentNode creating to HTMLWindow_Create.

parent 5b5528f2
...@@ -1998,7 +1998,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) ...@@ -1998,7 +1998,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
return hres; return hres;
} }
update_nsdocument(doc); if(!doc->basedoc.doc_node && doc->basedoc.window->doc) {
doc->basedoc.doc_node = doc->basedoc.window->doc;
htmldoc_addref(&doc->basedoc.doc_node->basedoc);
}
get_thread_hwnd(); get_thread_hwnd();
return S_OK; return S_OK;
......
...@@ -353,9 +353,7 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, ...@@ -353,9 +353,7 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
if(!This->content_window) { if(!This->content_window) {
nsIDOMHTMLDocument *nshtmldoc; nsIDOMHTMLDocument *nshtmldoc;
HTMLDocumentNode *content_doc;
nsIDOMDocument *nsdoc; nsIDOMDocument *nsdoc;
HTMLWindow *window;
nsresult nsres; nsresult nsres;
HRESULT hres; HRESULT hres;
...@@ -377,23 +375,10 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, ...@@ -377,23 +375,10 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
return E_FAIL; return E_FAIL;
} }
hres = create_content_window(This, nshtmldoc, &window); hres = create_content_window(This, nshtmldoc, &This->content_window);
if(FAILED(hres)) {
nsIDOMHTMLDocument_Release(nshtmldoc);
return E_FAIL;
}
hres = create_doc_from_nsdoc(nshtmldoc, This->element.node.doc->basedoc.doc_obj, window, &content_doc);
nsIDOMHTMLDocument_Release(nshtmldoc); nsIDOMHTMLDocument_Release(nshtmldoc);
if(SUCCEEDED(hres))
window_set_docnode(window, content_doc);
else
IHTMLWindow2_Release(HTMLWINDOW2(window));
htmldoc_release(&content_doc->basedoc);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
This->content_window = window;
} }
IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window)); IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
......
...@@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); ...@@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
static struct list window_list = LIST_INIT(window_list); static struct list window_list = LIST_INIT(window_list);
void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
{ {
if(window->doc) { if(window->doc) {
window->doc->basedoc.window = NULL; window->doc->basedoc.window = NULL;
...@@ -45,6 +45,14 @@ void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) ...@@ -45,6 +45,14 @@ void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
window->doc = doc_node; window->doc = doc_node;
if(doc_node) if(doc_node)
htmldoc_addref(&doc_node->basedoc); htmldoc_addref(&doc_node->basedoc);
if(window->doc_obj && window->doc_obj->basedoc.window == window) {
if(window->doc_obj->basedoc.doc_node)
htmldoc_release(&window->doc_obj->basedoc.doc_node->basedoc);
window->doc_obj->basedoc.doc_node = doc_node;
if(doc_node)
htmldoc_addref(&doc_node->basedoc);
}
} }
#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface) #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
...@@ -1516,12 +1524,49 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML ...@@ -1516,12 +1524,49 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
window->scriptmode = SCRIPTMODE_GECKO; window->scriptmode = SCRIPTMODE_GECKO;
list_init(&window->script_hosts); list_init(&window->script_hosts);
update_window_doc(window);
list_add_head(&window_list, &window->entry); list_add_head(&window_list, &window->entry);
*ret = window; *ret = window;
return S_OK; return S_OK;
} }
void update_window_doc(HTMLWindow *window)
{
nsIDOMHTMLDocument *nshtmldoc;
nsIDOMDocument *nsdoc;
nsresult nsres;
nsres = nsIDOMWindow_GetDocument(window->nswindow, &nsdoc);
if(NS_FAILED(nsres) || !nsdoc) {
ERR("GetDocument failed: %08x\n", nsres);
return;
}
nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
nsIDOMDocument_Release(nsdoc);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
return;
}
if(!window->doc || window->doc->nsdoc != nshtmldoc) {
HTMLDocumentNode *doc;
HRESULT hres;
hres = create_doc_from_nsdoc(nshtmldoc, window->doc_obj, window, &doc);
if(SUCCEEDED(hres)) {
window_set_docnode(window, doc);
htmldoc_release(&doc->basedoc);
}else {
ERR("create_doc_from_nsdoc failed: %08x\n", hres);
}
}
nsIDOMHTMLDocument_Release(nshtmldoc);
}
HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow) HTMLWindow *nswindow_to_window(const nsIDOMWindow *nswindow)
{ {
HTMLWindow *iter; HTMLWindow *iter;
......
...@@ -572,7 +572,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**); ...@@ -572,7 +572,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**);
HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**); HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**);
HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow**); HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow**);
void window_set_docnode(HTMLWindow*,HTMLDocumentNode*); void update_window_doc(HTMLWindow*);
HTMLWindow *nswindow_to_window(const nsIDOMWindow*); HTMLWindow *nswindow_to_window(const nsIDOMWindow*);
HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*); HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*);
HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*); HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*);
...@@ -647,7 +647,6 @@ void get_editor_controller(NSContainer*); ...@@ -647,7 +647,6 @@ void get_editor_controller(NSContainer*);
void init_nsevents(NSContainer*); void init_nsevents(NSContainer*);
void add_nsevent_listener(HTMLWindow*,LPCWSTR); void add_nsevent_listener(HTMLWindow*,LPCWSTR);
nsresult get_nsinterface(nsISupports*,REFIID,void**); nsresult get_nsinterface(nsISupports*,REFIID,void**);
void update_nsdocument(HTMLDocumentObj*);
void set_document_bscallback(HTMLDocument*,nsChannelBSC*); void set_document_bscallback(HTMLDocument*,nsChannelBSC*);
void set_current_mon(HTMLDocument*,IMoniker*); void set_current_mon(HTMLDocument*,IMoniker*);
......
...@@ -952,7 +952,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream) ...@@ -952,7 +952,7 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
/* events are reset when a new document URI is loaded, so re-initialise them here */ /* events are reset when a new document URI is loaded, so re-initialise them here */
if(This->bsc.doc && This->bsc.doc->doc_obj->bscallback == This && This->bsc.doc->doc_obj->nscontainer) { if(This->bsc.doc && This->bsc.doc->doc_obj->bscallback == This && This->bsc.doc->doc_obj->nscontainer) {
update_nsdocument(This->bsc.doc->doc_obj); update_window_doc(This->bsc.doc->window);
init_nsevents(This->bsc.doc->doc_obj->nscontainer); init_nsevents(This->bsc.doc->doc_obj->nscontainer);
} }
} }
......
...@@ -807,58 +807,6 @@ void set_ns_editmode(NSContainer *This) ...@@ -807,58 +807,6 @@ void set_ns_editmode(NSContainer *This)
nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This)); nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This));
} }
void update_nsdocument(HTMLDocumentObj *doc)
{
HTMLDocumentNode *doc_node;
nsIDOMHTMLDocument *nsdoc;
nsIDOMDocument *nsdomdoc;
nsresult nsres;
HRESULT hres;
if(!doc->nscontainer || !doc->nscontainer->navigation)
return;
nsres = nsIWebNavigation_GetDocument(doc->nscontainer->navigation, &nsdomdoc);
if(NS_FAILED(nsres) || !nsdomdoc) {
ERR("GetDocument failed: %08x\n", nsres);
return;
}
nsres = nsIDOMDocument_QueryInterface(nsdomdoc, &IID_nsIDOMHTMLDocument, (void**)&nsdoc);
nsIDOMDocument_Release(nsdomdoc);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMHTMLDocument iface: %08x\n", nsres);
return;
}
if(doc->basedoc.doc_node && nsdoc == doc->basedoc.doc_node->nsdoc) {
nsIDOMHTMLDocument_Release(nsdoc);
return;
}
if(doc->basedoc.doc_node && doc->basedoc.doc_node->nsdoc) {
doc_node = doc->basedoc.doc_node;
doc_node->basedoc.doc_obj = NULL;
IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc));
doc->basedoc.doc_node = NULL;
}
if(!nsdoc) {
doc->basedoc.doc_node = NULL;
window_set_docnode(doc->basedoc.window, NULL);
return;
}
hres = create_doc_from_nsdoc(nsdoc, doc, doc->basedoc.window, &doc_node);
if(FAILED(hres)) {
ERR("Could not create document: %08x\n", hres);
return;
}
doc->basedoc.doc_node = doc_node;
window_set_docnode(doc->basedoc.window, doc_node);
}
void close_gecko(void) void close_gecko(void)
{ {
TRACE("()\n"); TRACE("()\n");
......
...@@ -137,7 +137,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event ...@@ -137,7 +137,6 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
if(!This->doc) if(!This->doc)
return NS_OK; return NS_OK;
update_nsdocument(This->doc);
connect_scripts(This->doc->basedoc.window); connect_scripts(This->doc->basedoc.window);
if(This->editor_controller) { if(This->editor_controller) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment