HTMLDocument_iface_tids
};
-HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
+static HRESULT alloc_doc(HTMLDocument **ret)
+{
+ HTMLDocument *doc;
+
+ doc = heap_alloc_zero(sizeof(HTMLDocument));
+ doc->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl;
+ doc->lpIDispatchExVtbl = &DocDispatchExVtbl;
+ doc->ref = 1;
+ doc->readystate = READYSTATE_UNINITIALIZED;
+ doc->scriptmode = SCRIPTMODE_GECKO;
+
+ list_init(&doc->bindings);
+ list_init(&doc->script_hosts);
+ list_init(&doc->selection_list);
+ list_init(&doc->range_list);
+
+ HTMLDocument_HTMLDocument3_Init(doc);
+ HTMLDocument_HTMLDocument5_Init(doc);
+ HTMLDocument_Persist_Init(doc);
+ HTMLDocument_OleCmd_Init(doc);
+ HTMLDocument_OleObj_Init(doc);
+ HTMLDocument_View_Init(doc);
+ HTMLDocument_Window_Init(doc);
+ HTMLDocument_Service_Init(doc);
+ HTMLDocument_Hlink_Init(doc);
+
+ ConnectionPointContainer_Init(&doc->cp_container, (IUnknown*)HTMLDOC(doc));
+ ConnectionPoint_Init(&doc->cp_propnotif, &doc->cp_container, &IID_IPropertyNotifySink);
+ ConnectionPoint_Init(&doc->cp_htmldocevents, &doc->cp_container, &DIID_HTMLDocumentEvents);
+ ConnectionPoint_Init(&doc->cp_htmldocevents2, &doc->cp_container, &DIID_HTMLDocumentEvents2);
+
+ init_dispex(&doc->dispex, (IUnknown*)HTMLDOC(doc), &HTMLDocument_dispex);
+
+ *ret = doc;
+ return S_OK;
+}
+
+HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocument **ret)
{
- nsIDOMWindow *nswindow;
- HTMLDocument *ret;
+ HTMLDocument *doc;
HRESULT hres;
- TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
-
- ret = heap_alloc_zero(sizeof(HTMLDocument));
- ret->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl;
- ret->lpIDispatchExVtbl = &DocDispatchExVtbl;
- ret->ref = 0;
- ret->readystate = READYSTATE_UNINITIALIZED;
- ret->scriptmode = SCRIPTMODE_GECKO;
+ hres = alloc_doc(&doc);
+ if(FAILED(hres))
+ return hres;
- list_init(&ret->bindings);
- list_init(&ret->script_hosts);
- list_init(&ret->selection_list);
- list_init(&ret->range_list);
+ nsIDOMHTMLDocument_AddRef(nsdoc);
+ doc->nsdoc = nsdoc;
- hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject);
+ hres = HTMLWindow_Create(doc, NULL, &doc->window);
if(FAILED(hres)) {
- heap_free(ret);
+ IHTMLDocument_Release(HTMLDOC(doc));
return hres;
}
- LOCK_MODULE();
+ *ret = doc;
+ return S_OK;
+}
- HTMLDocument_HTMLDocument3_Init(ret);
- HTMLDocument_HTMLDocument5_Init(ret);
- HTMLDocument_Persist_Init(ret);
- HTMLDocument_OleCmd_Init(ret);
- HTMLDocument_OleObj_Init(ret);
- HTMLDocument_View_Init(ret);
- HTMLDocument_Window_Init(ret);
- HTMLDocument_Service_Init(ret);
- HTMLDocument_Hlink_Init(ret);
+HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
+{
+ HTMLDocument *doc;
+ nsIDOMWindow *nswindow;
+ HRESULT hres;
+
+ TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject);
- ConnectionPointContainer_Init(&ret->cp_container, (IUnknown*)HTMLDOC(ret));
- ConnectionPoint_Init(&ret->cp_propnotif, &ret->cp_container, &IID_IPropertyNotifySink);
- ConnectionPoint_Init(&ret->cp_htmldocevents, &ret->cp_container, &DIID_HTMLDocumentEvents);
- ConnectionPoint_Init(&ret->cp_htmldocevents2, &ret->cp_container, &DIID_HTMLDocumentEvents2);
+ hres = alloc_doc(&doc);
+ if(FAILED(hres))
+ return hres;
- init_dispex(&ret->dispex, (IUnknown*)HTMLDOC(ret), &HTMLDocument_dispex);
+ hres = IHTMLDocument_QueryInterface(HTMLDOC(doc), riid, ppvObject);
+ IHTMLDocument_Release(HTMLDOC(doc));
+ if(FAILED(hres))
+ return hres;
+
+ LOCK_MODULE();
- ret->nscontainer = NSContainer_Create(ret, NULL);
- update_nsdocument(ret);
+ doc->nscontainer = NSContainer_Create(doc, NULL);
+ update_nsdocument(doc);
- if(ret->nscontainer)
- nsIWebBrowser_GetContentDOMWindow(ret->nscontainer->webbrowser, &nswindow);
+ if(doc->nscontainer) {
+ nsresult nsres;
- HTMLWindow_Create(ret, nswindow, &ret->window);
+ nsres = nsIWebBrowser_GetContentDOMWindow(doc->nscontainer->webbrowser, &nswindow);
+ if(NS_FAILED(nsres))
+ ERR("GetContentDOMWindow failed: %08x\n", nsres);
+ }
+
+ hres = HTMLWindow_Create(doc, nswindow, &doc->window);
if(nswindow)
nsIDOMWindow_Release(nswindow);
+ if(FAILED(hres)) {
+ IHTMLDocument_Release(HTMLDOC(doc));
+ return hres;
+ }
get_thread_hwnd();
- return hres;
+ return S_OK;
}
LONG ref;
nsIDOMHTMLIFrameElement *nsiframe;
+ HTMLDocument *content_doc;
} HTMLIFrame;
#define HTMLFRAMEBASE2(x) ((IHTMLFrameBase2*) &(x)->lpIHTMLFrameBase2Vtbl)
static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p)
{
HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(!This->content_doc) {
+ nsIDOMHTMLDocument *nshtmldoc;
+ nsIDOMDocument *nsdoc;
+ nsresult nsres;
+ HRESULT hres;
+
+ nsres = nsIDOMHTMLIFrameElement_GetContentDocument(This->nsiframe, &nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("GetContentDocument failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ if(!nsdoc) {
+ FIXME("NULL contentDocument\n");
+ return E_FAIL;
+ }
+
+ 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 E_FAIL;
+ }
+
+ hres = create_doc_from_nsdoc(nshtmldoc, &This->content_doc);
+ nsIDOMHTMLDocument_Release(nshtmldoc);
+ if(FAILED(hres))
+ return hres;
+ }
+
+ return IHTMLDocument2_get_parentWindow(HTMLDOC(This->content_doc), p);
}
static HRESULT WINAPI HTMLIFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v)
{
HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface);
+ if(This->content_doc)
+ IHTMLDocument2_Release(HTMLDOC(This->content_doc));
if(This->nsiframe)
nsIDOMHTMLIFrameElement_Release(This->nsiframe);
"<script id=\"sc\" type=\"text/javascript\"></script>"
"<test />"
"<img id=\"imgid\"/>"
- "<iframe src=\"about:blank\"></iframe>"
+ "<iframe src=\"about:blank\" id=\"ifr\"></iframe>"
"</body></html>";
static const char indent_test_str[] =
"<html><head><title>test</title></head><body>abc<br /><a href=\"about:blank\">123</a></body></html>";
IHTMLTable_Release(table);
}
+static void test_iframe_elem(IHTMLElement *elem)
+{
+ IHTMLDocument2 *content_doc;
+ IHTMLWindow2 *content_window;
+ IHTMLFrameBase2 *base2;
+ HRESULT hres;
+
+ hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLFrameBase2, (void**)&base2);
+ ok(hres == S_OK, "Could not get IHTMFrameBase2 iface: %08x\n", hres);
+
+ content_window = NULL;
+ hres = IHTMLFrameBase2_get_contentWindow(base2, &content_window);
+ IHTMLFrameBase2_Release(base2);
+ ok(hres == S_OK, "get_contentWindow failed: %08x\n", hres);
+ ok(content_window != NULL, "contentWindow = NULL\n");
+
+ content_doc = NULL;
+ hres = IHTMLWindow2_get_document(content_window, &content_doc);
+ IHTMLWindow2_Release(content_window);
+ ok(hres == S_OK, "get_document failed: %08x\n", hres);
+ ok(content_doc != NULL, "content_doc = NULL\n");
+
+ IHTMLDocument2_Release(content_doc);
+}
+
static void test_stylesheet(IDispatch *disp)
{
IHTMLStyleSheetRulesCollection *col = NULL;
static const WCHAR xxxW[] = {'x','x','x',0};
static const WCHAR tblW[] = {'t','b','l',0};
static const WCHAR row2W[] = {'r','o','w','2',0};
+ static const WCHAR ifrW[] = {'i','f','r',0};
static const elem_type_t all_types[] = {
ET_HTML,
IHTMLElement_Release(elem);
}
+ elem = get_doc_elem_by_id(doc, ifrW);
+ ok(elem != NULL, "elem == NULL\n");
+ if(elem) {
+ test_iframe_elem(elem);
+ IHTMLElement_Release(elem);
+ }
+
hres = IHTMLDocument2_get_body(doc, &elem);
ok(hres == S_OK, "get_body failed: %08x\n", hres);