diff --git a/reactos/dll/win32/mshtml/De.rc b/reactos/dll/win32/mshtml/De.rc index 727d2614ecf..219549c8b7a 100644 --- a/reactos/dll/win32/mshtml/De.rc +++ b/reactos/dll/win32/mshtml/De.rc @@ -37,9 +37,11 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine-Gecko-Installation" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine kann das Gecko-Paket nicht finden. Es wird von Programmen mit eingebettetem HTML benötigt, " \ + "damit diese richtig funktionieren.\n" \ + "Wine kann das Paket für Sie herunterladen und installieren.\n\n" \ + "Hinweis: Es wird empfohlen das Paket ihrer Distribution zu verwenden. " \ + "Weitere Hinweise finden Sie unter http://wiki.winehq.org/Gecko", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Fortschritt", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Installieren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP @@ -71,4 +73,3 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "Abbrechen", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } -#pragma code_page(default) diff --git a/reactos/dll/win32/mshtml/Lt.rc b/reactos/dll/win32/mshtml/Lt.rc index 9883bb4cfb5..8f7e772a3a7 100644 --- a/reactos/dll/win32/mshtml/Lt.rc +++ b/reactos/dll/win32/mshtml/Lt.rc @@ -31,18 +31,18 @@ STRINGTABLE DISCARDABLE IDS_INSTALLING "Įdiegiama..." } -ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 95 +ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 105 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Wine Gecko diegimo programa" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine nepavyko rasti Gecko paketo reikalingo programoms įterpiančioms HTML " \ + "teisingai veikti. Wine gali automatiškai atsiųsti ir įdiegti šį paketą.\n\n" \ + "Pastaba: rekomenduojama naudoti distribucijos paketus. Daugiau informacijos http://wiki.winehq.org/Gecko.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT - CONTROL "Eiga", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 - DEFPUSHBUTTON "&Įdiegti", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Atsisakyti", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP + CONTROL "Eiga", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 60, 240, 12 + DEFPUSHBUTTON "&Įdiegti", ID_DWL_INSTALL, 200, 80, 50, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Atsisakyti", IDCANCEL, 140, 80, 50, 15, WS_GROUP | WS_TABSTOP } IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65 diff --git a/reactos/dll/win32/mshtml/Ru.rc b/reactos/dll/win32/mshtml/Ru.rc index 02bc433c767..8d3a4c3cc0a 100644 --- a/reactos/dll/win32/mshtml/Ru.rc +++ b/reactos/dll/win32/mshtml/Ru.rc @@ -31,18 +31,18 @@ STRINGTABLE DISCARDABLE IDS_INSTALLING "Установка..." } -ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 261, 95 +ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 261, 110 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Установка Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine не может найти пакет Gecko который нужен для приложений со встроенным HTML " \ + "для корректной работы. Wine может автоматически загрузить и установить его для Вас.\n\n" \ + "Примечание: Рекомендовано использовать пакет из Вашего дистрибутива. Посетите http://wiki.winehq.org/Gecko для деталей.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT - CONTROL "Прогресс", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 46, 240, 12 - DEFPUSHBUTTON "&Установить", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Отмена", IDCANCEL, 140, 63, 70, 15, WS_GROUP | WS_TABSTOP + CONTROL "Прогресс", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 65, 240, 12 + DEFPUSHBUTTON "&Установить", ID_DWL_INSTALL, 180, 85, 70, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Отмена", IDCANCEL, 100, 85, 70, 15, WS_GROUP | WS_TABSTOP } IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65 @@ -58,3 +58,14 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Отмена", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP } + +ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30 + EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Отмена", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP +} diff --git a/reactos/dll/win32/mshtml/Sv.rc b/reactos/dll/win32/mshtml/Sv.rc index e9ba10e7975..c5a2cc8c383 100644 --- a/reactos/dll/win32/mshtml/Sv.rc +++ b/reactos/dll/win32/mshtml/Sv.rc @@ -33,9 +33,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Installationsprogram" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine kunde inte hitta paketet Gecko vilket krvs fr att program med inbddad HTML " \ + "ska fungera korrekt. Wine kan hmta och installera det automatiskt t dig.\n\n" \ + "Obs: Du rekommenderas att anvnda din distributions paket i stllet. Se http://wiki.winehq.org/Gecko fr mer information.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Frlopp", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Installera", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/conpoint.c b/reactos/dll/win32/mshtml/conpoint.c index 10d8e291bf4..da775adcbe4 100644 --- a/reactos/dll/win32/mshtml/conpoint.c +++ b/reactos/dll/win32/mshtml/conpoint.c @@ -89,13 +89,13 @@ static HRESULT WINAPI ConnectionPoint_QueryInterface(IConnectionPoint *iface, static ULONG WINAPI ConnectionPoint_AddRef(IConnectionPoint *iface) { ConnectionPoint *This = CONPOINT_THIS(iface); - return IConnectionPointContainer_AddRef(This->container); + return IConnectionPointContainer_AddRef(CONPTCONT(This->container)); } static ULONG WINAPI ConnectionPoint_Release(IConnectionPoint *iface) { ConnectionPoint *This = CONPOINT_THIS(iface); - return IConnectionPointContainer_Release(This->container); + return IConnectionPointContainer_Release(CONPTCONT(This->container)); } static HRESULT WINAPI ConnectionPoint_GetConnectionInterface(IConnectionPoint *iface, IID *pIID) @@ -121,7 +121,7 @@ static HRESULT WINAPI ConnectionPoint_GetConnectionPointContainer(IConnectionPoi if(!ppCPC) return E_POINTER; - *ppCPC = This->container; + *ppCPC = CONPTCONT(This->container); IConnectionPointContainer_AddRef(*ppCPC); return S_OK; } @@ -159,6 +159,9 @@ static HRESULT WINAPI ConnectionPoint_Advise(IConnectionPoint *iface, IUnknown * This->sinks[i].unk = sink; *pdwCookie = i+1; + if(!i && This->data && This->data->on_advise) + This->data->on_advise(This->container->outer, This->data); + return S_OK; } @@ -198,14 +201,15 @@ static const IConnectionPointVtbl ConnectionPointVtbl = ConnectionPoint_EnumConnections }; -void ConnectionPoint_Init(ConnectionPoint *cp, ConnectionPointContainer *container, REFIID riid) +void ConnectionPoint_Init(ConnectionPoint *cp, ConnectionPointContainer *container, REFIID riid, cp_static_data_t *data) { cp->lpConnectionPointVtbl = &ConnectionPointVtbl; - cp->container = CONPTCONT(container); + cp->container = container; cp->sinks = NULL; cp->sinks_size = 0; cp->iid = riid; cp->next = NULL; + cp->data = data; cp->next = container->cp_list; container->cp_list = cp; @@ -260,6 +264,9 @@ static HRESULT WINAPI ConnectionPointContainer_FindConnectionPoint(IConnectionPo TRACE("(%p)->(%s %p)\n", This, debugstr_cp_guid(riid), ppCP); + if(This->forward_container) + return IConnectionPointContainer_FindConnectionPoint(CONPTCONT(This), riid, ppCP); + *ppCP = NULL; for(iter = This->cp_list; iter; iter = iter->next) { diff --git a/reactos/dll/win32/mshtml/dispex.c b/reactos/dll/win32/mshtml/dispex.c index 980b13b1654..c77ebb92218 100644 --- a/reactos/dll/win32/mshtml/dispex.c +++ b/reactos/dll/win32/mshtml/dispex.c @@ -90,6 +90,7 @@ static REFIID tid_ids[] = { &DIID_DispHTMLDocument, &DIID_DispHTMLDOMTextNode, &DIID_DispHTMLElementCollection, + &DIID_DispHTMLFormElement, &DIID_DispHTMLGenericElement, &DIID_DispHTMLIFrame, &DIID_DispHTMLImg, @@ -97,12 +98,14 @@ static REFIID tid_ids[] = { &DIID_DispHTMLLocation, &DIID_DispHTMLNavigator, &DIID_DispHTMLOptionElement, + &DIID_DispHTMLScreen, &DIID_DispHTMLSelectElement, &DIID_DispHTMLStyle, &DIID_DispHTMLTable, &DIID_DispHTMLTableRow, &DIID_DispHTMLUnknownElement, &DIID_DispHTMLWindow2, + &DIID_HTMLDocumentEvents, &IID_IHTMLAnchorElement, &IID_IHTMLBodyElement, &IID_IHTMLBodyElement2, @@ -125,6 +128,8 @@ static REFIID tid_ids[] = { &IID_IHTMLElement4, &IID_IHTMLElementCollection, &IID_IHTMLEventObj, + &IID_IHTMLFiltersCollection, + &IID_IHTMLFormElement, &IID_IHTMLFrameBase, &IID_IHTMLFrameBase2, &IID_IHTMLGenericElement, @@ -133,6 +138,7 @@ static REFIID tid_ids[] = { &IID_IHTMLInputElement, &IID_IHTMLLocation, &IID_IHTMLOptionElement, + &IID_IHTMLScreen, &IID_IHTMLSelectElement, &IID_IHTMLStyle, &IID_IHTMLStyle2, @@ -144,6 +150,7 @@ static REFIID tid_ids[] = { &IID_IHTMLUniqueName, &IID_IHTMLWindow2, &IID_IHTMLWindow3, + &IID_IHTMLWindow4, &IID_IOmNavigator }; @@ -303,6 +310,61 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This) return data; } +static int id_cmp(const void *p1, const void *p2) +{ + return *(DISPID*)p1 - *(DISPID*)p2; +} + +HRESULT get_dispids(tid_t tid, DWORD *ret_size, DISPID **ret) +{ + unsigned i, func_cnt; + FUNCDESC *funcdesc; + ITypeInfo *ti; + TYPEATTR *attr; + DISPID *ids; + HRESULT hres; + + hres = get_typeinfo(tid, &ti); + if(FAILED(hres)) + return hres; + + hres = ITypeInfo_GetTypeAttr(ti, &attr); + if(FAILED(hres)) { + ITypeInfo_Release(ti); + return hres; + } + + func_cnt = attr->cFuncs; + ITypeInfo_ReleaseTypeAttr(ti, attr); + + ids = heap_alloc(func_cnt*sizeof(DISPID)); + if(!ids) { + ITypeInfo_Release(ti); + return E_OUTOFMEMORY; + } + + for(i=0; i < func_cnt; i++) { + hres = ITypeInfo_GetFuncDesc(ti, i, &funcdesc); + if(FAILED(hres)) + break; + + ids[i] = funcdesc->memid; + ITypeInfo_ReleaseFuncDesc(ti, funcdesc); + } + + ITypeInfo_Release(ti); + if(FAILED(hres)) { + heap_free(ids); + return hres; + } + + qsort(ids, func_cnt, sizeof(DISPID), id_cmp); + + *ret_size = func_cnt; + *ret = ids; + return S_OK; +} + static CRITICAL_SECTION cs_dispex_static_data; static CRITICAL_SECTION_DEBUG cs_dispex_static_data_dbg = { diff --git a/reactos/dll/win32/mshtml/htmlanchor.c b/reactos/dll/win32/mshtml/htmlanchor.c index 04960d90337..6bbaf26dfae 100644 --- a/reactos/dll/win32/mshtml/htmlanchor.c +++ b/reactos/dll/win32/mshtml/htmlanchor.c @@ -313,43 +313,55 @@ static HRESULT WINAPI HTMLAnchorElement_get_hash(IHTMLAnchorElement *iface, BSTR static HRESULT WINAPI HTMLAnchorElement_put_onblur(IHTMLAnchorElement *iface, VARIANT v) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->()\n", This); + + return IHTMLElement2_put_onblur(HTMLELEM2(&This->element), v); } static HRESULT WINAPI HTMLAnchorElement_get_onblur(IHTMLAnchorElement *iface, VARIANT *p) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return IHTMLElement2_get_onblur(HTMLELEM2(&This->element), p); } static HRESULT WINAPI HTMLAnchorElement_put_onfocus(IHTMLAnchorElement *iface, VARIANT v) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->()\n", This); + + return IHTMLElement2_put_onfocus(HTMLELEM2(&This->element), v); } static HRESULT WINAPI HTMLAnchorElement_get_onfocus(IHTMLAnchorElement *iface, VARIANT *p) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return IHTMLElement2_get_onfocus(HTMLELEM2(&This->element), p); } static HRESULT WINAPI HTMLAnchorElement_put_accessKey(IHTMLAnchorElement *iface, BSTR v) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + return IHTMLElement2_put_accessKey(HTMLELEM2(&This->element), v); } static HRESULT WINAPI HTMLAnchorElement_get_accessKey(IHTMLAnchorElement *iface, BSTR *p) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return IHTMLElement2_get_accessKey(HTMLELEM2(&This->element), p); } static HRESULT WINAPI HTMLAnchorElement_get_protocolLong(IHTMLAnchorElement *iface, BSTR *p) @@ -376,29 +388,37 @@ static HRESULT WINAPI HTMLAnchorElement_get_nameProp(IHTMLAnchorElement *iface, static HRESULT WINAPI HTMLAnchorElement_put_tabIndex(IHTMLAnchorElement *iface, short v) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->()\n", This); + + return IHTMLElement2_put_tabIndex(HTMLELEM2(&This->element), v); } static HRESULT WINAPI HTMLAnchorElement_get_tabIndex(IHTMLAnchorElement *iface, short *p) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return IHTMLElement2_get_tabIndex(HTMLELEM2(&This->element), p); } static HRESULT WINAPI HTMLAnchorElement_focus(IHTMLAnchorElement *iface) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)\n", This); + + return IHTMLElement2_focus(HTMLELEM2(&This->element)); } static HRESULT WINAPI HTMLAnchorElement_blur(IHTMLAnchorElement *iface) { HTMLAnchorElement *This = HTMLANCHOR_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)\n", This); + + return IHTMLElement2_blur(HTMLELEM2(&This->element)); } #undef HTMLANCHOR_THIS diff --git a/reactos/dll/win32/mshtml/htmlbody.c b/reactos/dll/win32/mshtml/htmlbody.c index 4da3373eba1..7f22a4e06a6 100644 --- a/reactos/dll/win32/mshtml/htmlbody.c +++ b/reactos/dll/win32/mshtml/htmlbody.c @@ -63,40 +63,97 @@ static const WCHAR yellowW[] = {'y','e','l','l','o','w',0}; static const struct { LPCWSTR keyword; - const WCHAR hexstr[8]; + DWORD rgb; } keyword_table[] = { - {aquaW, {'#','0','0','f','f','f','f',0}}, - {blackW, {'#','0','0','0','0','0','0',0}}, - {blueW, {'#','0','0','0','0','f','f',0}}, - {fuchsiaW, {'#','f','f','0','0','f','f',0}}, - {grayW, {'#','8','0','8','0','8','0',0}}, - {greenW, {'#','0','0','8','0','0','0',0}}, - {limeW, {'#','0','0','f','f','0','0',0}}, - {maroonW, {'#','8','0','0','0','0','0',0}}, - {navyW, {'#','0','0','0','0','8','0',0}}, - {oliveW, {'#','8','0','8','0','0','0',0}}, - {purpleW, {'#','8','0','0','0','8','0',0}}, - {redW, {'#','f','f','0','0','0','0',0}}, - {silverW, {'#','c','0','c','0','c','0',0}}, - {tealW, {'#','0','0','8','0','8','0',0}}, - {whiteW, {'#','f','f','f','f','f','f',0}}, - {yellowW, {'#','f','f','f','f','0','0',0}} + {aquaW, 0x00ffff}, + {blackW, 0x000000}, + {blueW, 0x0000ff}, + {fuchsiaW, 0xff00ff}, + {grayW, 0x808080}, + {greenW, 0x008000}, + {limeW, 0x00ff00}, + {maroonW, 0x800000}, + {navyW, 0x000080}, + {oliveW, 0x808000}, + {purpleW, 0x800080}, + {redW, 0xff0000}, + {silverW, 0xc0c0c0}, + {tealW, 0x008080}, + {whiteW, 0xffffff}, + {yellowW, 0xffff00} }; -static BSTR nscolor_to_str(LPCWSTR color) +static int comp_value(const WCHAR *ptr, int dpc) { - int i; + int ret = 0; + WCHAR ch; - if(!color || *color == '#') - return SysAllocString(color); + if(dpc > 2) + dpc = 2; - for(i=0; i < sizeof(keyword_table)/sizeof(keyword_table[0]); i++) { - if(!strcmpiW(color, keyword_table[i].keyword)) - return SysAllocString(keyword_table[i].hexstr); + while(dpc--) { + if(!*ptr) + ret *= 16; + else if(isdigitW(ch = *ptr++)) + ret = ret*16 + (ch-'0'); + else if('a' <= ch && ch <= 'f') + ret = ret*16 + (ch-'a') + 10; + else if('A' <= ch && ch <= 'F') + ret = ret*16 + (ch-'A') + 10; + else + ret *= 16; } - WARN("unknown color %s\n", debugstr_w(color)); - return SysAllocString(color); + return ret; +} + +/* Based on Gecko NS_LooseHexToRGB */ +static int loose_hex_to_rgb(const WCHAR *hex) +{ + int len, dpc; + + len = strlenW(hex); + if(*hex == '#') { + hex++; + len--; + } + if(len <= 3) + return 0; + + dpc = min(len/3 + (len%3 ? 1 : 0), 4); + return (comp_value(hex, dpc) << 16) + | (comp_value(hex+dpc, dpc) << 8) + | comp_value(hex+2*dpc, dpc); +} + +static HRESULT nscolor_to_str(LPCWSTR color, BSTR *ret) +{ + int i, rgb = -1; + + static const WCHAR formatW[] = {'#','%','0','2','x','%','0','2','x','%','0','2','x',0}; + + if(!color || !*color) { + *ret = NULL; + return S_OK; + } + + if(*color != '#') { + for(i=0; i < sizeof(keyword_table)/sizeof(keyword_table[0]); i++) { + if(!strcmpiW(color, keyword_table[i].keyword)) + rgb = keyword_table[i].rgb; + } + } + if(rgb == -1) + rgb = loose_hex_to_rgb(color); + + *ret = SysAllocStringLen(NULL, 7); + if(!*ret) + return E_OUTOFMEMORY; + + sprintfW(*ret, formatW, rgb>>16, (rgb>>8)&0xff, rgb&0xff); + + TRACE("%s -> %s\n", debugstr_w(color), debugstr_w(*ret)); + return S_OK; } static BOOL variant_to_nscolor(const VARIANT *v, nsAString *nsstr) @@ -348,23 +405,25 @@ static HRESULT WINAPI HTMLBodyElement_get_bgColor(IHTMLBodyElement *iface, VARIA HTMLBodyElement *This = HTMLBODY_THIS(iface); nsAString strColor; nsresult nsres; - const PRUnichar *color; + HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&strColor, NULL); nsres = nsIDOMHTMLBodyElement_GetBgColor(This->nsbody, &strColor); - if(NS_FAILED(nsres)) + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *color; + + nsAString_GetData(&strColor, &color); + V_VT(p) = VT_BSTR; + hres = nscolor_to_str(color, &V_BSTR(p)); + }else { ERR("SetBgColor failed: %08x\n", nsres); - - nsAString_GetData(&strColor, &color); - - V_VT(p) = VT_BSTR; - V_BSTR(p) = nscolor_to_str(color); + hres = E_FAIL; + } nsAString_Finish(&strColor); - - return S_OK; + return hres; } static HRESULT WINAPI HTMLBodyElement_put_text(IHTMLBodyElement *iface, VARIANT v) @@ -389,22 +448,21 @@ static HRESULT WINAPI HTMLBodyElement_get_text(IHTMLBodyElement *iface, VARIANT HTMLBodyElement *This = HTMLBODY_THIS(iface); nsAString text; nsresult nsres; + HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&text, NULL); - - V_VT(p) = VT_BSTR; - V_BSTR(p) = NULL; - nsres = nsIDOMHTMLBodyElement_GetText(This->nsbody, &text); - if(NS_SUCCEEDED(nsres)) - { - const PRUnichar *sText; - nsAString_GetData(&text, &sText); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *color; + nsAString_GetData(&text, &color); V_VT(p) = VT_BSTR; - V_BSTR(p) = SysAllocString(sText); + hres = nscolor_to_str(color, &V_BSTR(p)); + }else { + ERR("GetText failed: %08x\n", nsres); + hres = E_FAIL; } nsAString_Finish(&text); @@ -725,8 +783,8 @@ static event_target_t **HTMLBodyElement_get_event_target(HTMLDOMNode *iface) { HTMLBodyElement *This = HTMLBODY_NODE_THIS(iface); - return This->textcont.element.node.doc && This->textcont.element.node.doc->basedoc.window - ? &This->textcont.element.node.doc->basedoc.window->event_target + return This->textcont.element.node.doc + ? &This->textcont.element.node.doc->body_event_target : &This->textcont.element.node.event_target; } @@ -771,7 +829,7 @@ HTMLElement *HTMLBodyElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *ns HTMLTextContainer_Init(&ret->textcont, doc, nselem, &HTMLBodyElement_dispex); - ConnectionPoint_Init(&ret->cp_propnotif, &ret->textcont.element.cp_container, &IID_IPropertyNotifySink); + ConnectionPoint_Init(&ret->cp_propnotif, &ret->textcont.element.cp_container, &IID_IPropertyNotifySink, NULL); nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLBodyElement, (void**)&ret->nsbody); diff --git a/reactos/dll/win32/mshtml/htmldoc.c b/reactos/dll/win32/mshtml/htmldoc.c index 836f1aee4b3..ac67a84cc60 100644 --- a/reactos/dll/win32/mshtml/htmldoc.c +++ b/reactos/dll/win32/mshtml/htmldoc.c @@ -26,6 +26,7 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "wininet.h" #include "ole2.h" #include "perhist.h" #include "mshtmdid.h" @@ -610,15 +611,58 @@ static HRESULT WINAPI HTMLDocument_get_domain(IHTMLDocument2 *iface, BSTR *p) static HRESULT WINAPI HTMLDocument_put_cookie(IHTMLDocument2 *iface, BSTR v) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + BOOL bret; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + bret = InternetSetCookieExW(This->window->url, NULL, v, 0, 0); + if(!bret) { + FIXME("InternetSetCookieExW failed: %u\n", GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + + return S_OK; } static HRESULT WINAPI HTMLDocument_get_cookie(IHTMLDocument2 *iface, BSTR *p) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + DWORD size; + BOOL bret; + + TRACE("(%p)->(%p)\n", This, p); + + size = 0; + bret = InternetGetCookieExW(This->window->url, NULL, NULL, &size, 0, NULL); + if(!bret) { + switch(GetLastError()) { + case ERROR_INSUFFICIENT_BUFFER: + break; + case ERROR_NO_MORE_ITEMS: + *p = NULL; + return S_OK; + default: + FIXME("InternetGetCookieExW failed: %u\n", GetLastError()); + return HRESULT_FROM_WIN32(GetLastError()); + } + } + + if(!size) { + *p = NULL; + return S_OK; + } + + *p = SysAllocStringLen(NULL, size-1); + if(!*p) + return E_OUTOFMEMORY; + + bret = InternetGetCookieExW(This->window->url, NULL, *p, &size, 0, NULL); + if(!bret) { + ERR("InternetGetCookieExW failed: %u\n", GetLastError()); + return E_FAIL; + } + + return S_OK; } static HRESULT WINAPI HTMLDocument_put_expando(IHTMLDocument2 *iface, VARIANT_BOOL v) @@ -1028,29 +1072,37 @@ static HRESULT WINAPI HTMLDocument_get_onkeypress(IHTMLDocument2 *iface, VARIANT static HRESULT WINAPI HTMLDocument_put_onmouseup(IHTMLDocument2 *iface, VARIANT v) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_doc_event(This, EVENTID_MOUSEUP, &v); } static HRESULT WINAPI HTMLDocument_get_onmouseup(IHTMLDocument2 *iface, VARIANT *p) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_doc_event(This, EVENTID_MOUSEUP, p); } static HRESULT WINAPI HTMLDocument_put_onmousedown(IHTMLDocument2 *iface, VARIANT v) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)->()\n", This); + + return set_doc_event(This, EVENTID_MOUSEDOWN, &v); } static HRESULT WINAPI HTMLDocument_get_onmousedown(IHTMLDocument2 *iface, VARIANT *p) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_doc_event(This, EVENTID_MOUSEDOWN, p); } static HRESULT WINAPI HTMLDocument_put_onmousemove(IHTMLDocument2 *iface, VARIANT v) @@ -1070,15 +1122,19 @@ static HRESULT WINAPI HTMLDocument_get_onmousemove(IHTMLDocument2 *iface, VARIAN static HRESULT WINAPI HTMLDocument_put_onmouseout(IHTMLDocument2 *iface, VARIANT v) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_doc_event(This, EVENTID_MOUSEOUT, &v); } static HRESULT WINAPI HTMLDocument_get_onmouseout(IHTMLDocument2 *iface, VARIANT *p) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_doc_event(This, EVENTID_MOUSEOUT, p); } static HRESULT WINAPI HTMLDocument_put_onmouseover(IHTMLDocument2 *iface, VARIANT v) @@ -1102,15 +1158,19 @@ static HRESULT WINAPI HTMLDocument_get_onmouseover(IHTMLDocument2 *iface, VARIAN static HRESULT WINAPI HTMLDocument_put_onreadystatechange(IHTMLDocument2 *iface, VARIANT v) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_doc_event(This, EVENTID_READYSTATECHANGE, &v); } static HRESULT WINAPI HTMLDocument_get_onreadystatechange(IHTMLDocument2 *iface, VARIANT *p) { HTMLDocument *This = HTMLDOC_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_doc_event(This, EVENTID_READYSTATECHANGE, p); } static HRESULT WINAPI HTMLDocument_put_onafterupdate(IHTMLDocument2 *iface, VARIANT v) @@ -1406,6 +1466,16 @@ static const IHTMLDocument2Vtbl HTMLDocumentVtbl = { HTMLDocument_createStyleSheet }; +static void HTMLDocument_on_advise(IUnknown *iface, cp_static_data_t *cp) +{ + HTMLDocument *This = HTMLDOC_THIS(iface); + + if(This->window) + update_cp_events(This->window, cp); +} + +#undef HTMLDOC_THIS + #define SUPPINFO_THIS(iface) DEFINE_THIS(HTMLDocument, SupportErrorInfo, iface) static HRESULT WINAPI SupportErrorInfo_QueryInterface(ISupportErrorInfo *iface, REFIID riid, void **ppv) @@ -1649,6 +1719,9 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv) }else if(IsEqualGUID(&IID_IViewObject2, riid)) { TRACE("(%p)->(IID_IViewObject2, %p)\n", This, ppv); *ppv = VIEWOBJ2(This); + }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) { + TRACE("(%p)->(IID_IViewObjectEx, %p)\n", This, ppv); + *ppv = VIEWOBJEX(This); }else if(IsEqualGUID(&IID_IOleWindow, riid)) { TRACE("(%p)->(IID_IOleWindow, %p)\n", This, ppv); *ppv = OLEWIN(This); @@ -1697,6 +1770,9 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv) }else if(IsEqualGUID(&IID_IMarshal, riid)) { TRACE("(%p)->(IID_IMarshal %p) returning NULL\n", This, ppv); *ppv = NULL; + }else if(IsEqualGUID(&IID_IObjectWithSite, riid)) { + TRACE("(%p)->(IID_IObjectWithSite %p)\n", This, ppv); + *ppv = OBJSITE(This); }else { return FALSE; } @@ -1706,6 +1782,8 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv) return TRUE; } +static cp_static_data_t HTMLDocumentEvents_data = { HTMLDocumentEvents_tid, HTMLDocument_on_advise }; + static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex) { doc->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl; @@ -1727,9 +1805,10 @@ static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex) 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); + ConnectionPoint_Init(&doc->cp_dispatch, &doc->cp_container, &IID_IDispatch, NULL); + ConnectionPoint_Init(&doc->cp_propnotif, &doc->cp_container, &IID_IPropertyNotifySink, NULL); + ConnectionPoint_Init(&doc->cp_htmldocevents, &doc->cp_container, &DIID_HTMLDocumentEvents, &HTMLDocumentEvents_data); + ConnectionPoint_Init(&doc->cp_htmldocevents2, &doc->cp_container, &DIID_HTMLDocumentEvents2, NULL); } static void destroy_htmldoc(HTMLDocument *This) @@ -1763,8 +1842,12 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface) { HTMLDocumentNode *This = HTMLDOCNODE_NODE_THIS(iface); + if(This->body_event_target) + release_event_target(This->body_event_target); if(This->nsevent_listener) release_nsevents(This); + if(This->catmgr) + ICatInformation_Release(This->catmgr); if(This->secmgr) IInternetSecurityManager_Release(This->secmgr); @@ -1823,6 +1906,8 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob doc->ref = 1; doc->basedoc.window = window; + if(window == doc_obj->basedoc.window) + doc->basedoc.cp_container.forward_container = &doc_obj->basedoc.cp_container; nsIDOMHTMLDocument_AddRef(nsdoc); doc->nsdoc = nsdoc; @@ -1835,6 +1920,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc); doc->node.vtbl = &HTMLDocumentNodeImplVtbl; + doc->node.cp_container = &doc->basedoc.cp_container; hres = CoInternetCreateSecurityManager(NULL, &doc->secmgr, 0); if(FAILED(hres)) { @@ -1900,6 +1986,8 @@ static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface) This->basedoc.window->doc_obj = NULL; IHTMLWindow2_Release(HTMLWINDOW2(This->basedoc.window)); } + if(This->basedoc.advise_holder) + IOleAdviseHolder_Release(This->basedoc.advise_holder); if(This->client) IOleObject_SetClientSite(OLEOBJ(&This->basedoc), NULL); diff --git a/reactos/dll/win32/mshtml/htmldoc3.c b/reactos/dll/win32/mshtml/htmldoc3.c index a00fa95b21b..de32302c935 100644 --- a/reactos/dll/win32/mshtml/htmldoc3.c +++ b/reactos/dll/win32/mshtml/htmldoc3.c @@ -431,6 +431,8 @@ static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v HTMLDocument *This = HTMLDOC3_THIS(iface); nsIDOMElement *nselem; HTMLDOMNode *node; + nsIDOMNode *nsnode, *nsnode_by_id, *nsnode_by_name; + nsIDOMNodeList *nsnode_list; nsAString id_str; nsresult nsres; @@ -442,16 +444,64 @@ static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v } nsAString_Init(&id_str, v); + /* get element by id attribute */ nsres = nsIDOMHTMLDocument_GetElementById(This->doc_node->nsdoc, &id_str, &nselem); - nsAString_Finish(&id_str); if(FAILED(nsres)) { ERR("GetElementById failed: %08x\n", nsres); + nsAString_Finish(&id_str); return E_FAIL; } + nsnode_by_id = (nsIDOMNode*)nselem; - if(nselem) { - node = get_node(This->doc_node, (nsIDOMNode*)nselem, TRUE); - nsIDOMElement_Release(nselem); + /* get first element by name attribute */ + nsres = nsIDOMHTMLDocument_GetElementsByName(This->doc_node->nsdoc, &id_str, &nsnode_list); + if(FAILED(nsres)) { + ERR("getElementsByName failed: %08x\n", nsres); + nsAString_Finish(&id_str); + if(nsnode_by_id) + nsIDOMNode_Release(nsnode_by_id); + return E_FAIL; + } + nsIDOMNodeList_Item(nsnode_list, 0, &nsnode_by_name); + nsIDOMNodeList_Release(nsnode_list); + + nsAString_Finish(&id_str); + + if(nsnode_by_name && nsnode_by_id) { + nsIDOM3Node *node3; + PRUint16 pos; + + nsres = nsIDOMNode_QueryInterface(nsnode_by_name, &IID_nsIDOM3Node, (void**)&node3); + if(NS_FAILED(nsres)) { + FIXME("failed to get nsIDOM3Node interface: 0x%08x\n", nsres); + nsIDOMNode_Release(nsnode_by_name); + nsIDOMNode_Release(nsnode_by_id); + return E_FAIL; + } + + nsres = nsIDOM3Node_CompareDocumentPosition(node3, nsnode_by_id, &pos); + nsIDOM3Node_Release(node3); + if(NS_FAILED(nsres)) { + FIXME("nsIDOM3Node_CompareDocumentPosition failed: 0x%08x\n", nsres); + nsIDOMNode_Release(nsnode_by_name); + nsIDOMNode_Release(nsnode_by_id); + return E_FAIL; + } + + TRACE("CompareDocumentPosition gave: 0x%x\n", pos); + if(pos & PRECEDING || pos & CONTAINS) { + nsnode = nsnode_by_id; + nsIDOMNode_Release(nsnode_by_name); + }else { + nsnode = nsnode_by_name; + nsIDOMNode_Release(nsnode_by_id); + } + }else + nsnode = nsnode_by_name ? nsnode_by_name : nsnode_by_id; + + if(nsnode) { + node = get_node(This->doc_node, nsnode, TRUE); + nsIDOMNode_Release(nsnode); IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)pel); }else { @@ -620,7 +670,7 @@ static HRESULT WINAPI HTMLDocument4_focus(IHTMLDocument4 *iface) return E_FAIL; } - nsres = nsIDOMNSHTMLElement_focus(nselem); + nsres = nsIDOMNSHTMLElement_Focus(nselem); nsIDOMNSHTMLElement_Release(nselem); if(NS_FAILED(nsres)) { ERR("Focus failed: %08x\n", nsres); diff --git a/reactos/dll/win32/mshtml/htmlelem.c b/reactos/dll/win32/mshtml/htmlelem.c index b794b73288a..a65ed20065e 100644 --- a/reactos/dll/win32/mshtml/htmlelem.c +++ b/reactos/dll/win32/mshtml/htmlelem.c @@ -34,6 +34,22 @@ #include "mshtml_private.h" #include "htmlevent.h" +typedef struct +{ + DispatchEx dispex; + const IHTMLFiltersCollectionVtbl *lpHTMLFiltersCollectionVtbl; + + LONG ref; +} HTMLFiltersCollection; + +#define HTMLFILTERSCOLLECTION(x) ((IHTMLFiltersCollection*) &(x)->lpHTMLFiltersCollectionVtbl) + +#define HTMLFILTERSCOLLECTION_THIS(iface) \ + DEFINE_THIS(HTMLFiltersCollection, HTMLFiltersCollection, iface) + +IHTMLFiltersCollection *HTMLFiltersCollection_Create(void); + + WINE_DEFAULT_DEBUG_CHANNEL(mshtml); #define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface) @@ -569,9 +585,11 @@ static HRESULT WINAPI HTMLElement_get_document(IHTMLElement *iface, IDispatch ** if(!p) return E_POINTER; + if(This->node.vtbl->get_document) + return This->node.vtbl->get_document(&This->node, p); + *p = (IDispatch*)HTMLDOC(&This->node.doc->basedoc); IDispatch_AddRef(*p); - return S_OK; } @@ -908,8 +926,63 @@ static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p) static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v) { HTMLElement *This = HTMLELEM_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsIDOMDocumentFragment *nsfragment; + nsIDOMDocumentRange *nsdocrange; + nsIDOMNSRange *nsrange; + nsIDOMNode *nsparent; + nsIDOMRange *range; + nsAString html_str; + nsresult nsres; + HRESULT hres = S_OK; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsres = nsIDOMHTMLDocument_QueryInterface(This->node.doc->nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange); + if(NS_FAILED(nsres)) + return E_FAIL; + + nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range); + nsIDOMDocumentRange_Release(nsdocrange); + if(NS_FAILED(nsres)) { + ERR("CreateRange failed: %08x\n", nsres); + return E_FAIL; + } + + nsres = nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void**)&nsrange); + nsIDOMRange_Release(range); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDOMNSRange: %08x\n", nsres); + return E_FAIL; + } + + nsAString_Init(&html_str, v); + nsIDOMNSRange_CreateContextualFragment(nsrange, &html_str, &nsfragment); + nsIDOMNSRange_Release(nsrange); + nsAString_Finish(&html_str); + if(NS_FAILED(nsres)) { + ERR("CreateContextualFragment failed: %08x\n", nsres); + return E_FAIL; + } + + nsres = nsIDOMNode_GetParentNode(This->node.nsnode, &nsparent); + if(NS_SUCCEEDED(nsres) && nsparent) { + nsIDOMNode *nstmp; + + nsres = nsIDOMNode_ReplaceChild(nsparent, (nsIDOMNode*)nsfragment, This->node.nsnode, &nstmp); + nsIDOMNode_Release(nsparent); + if(NS_FAILED(nsres)) { + ERR("ReplaceChild failed: %08x\n", nsres); + hres = E_FAIL; + }else if(nstmp) { + nsIDOMNode_Release(nstmp); + } + }else { + ERR("GetParentNode failed: %08x\n", nsres); + hres = E_FAIL; + } + + nsIDOMDocumentFragment_Release(nsfragment); + return hres; } static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p) @@ -959,19 +1032,13 @@ static HRESULT HTMLElement_InsertAdjacentNode(HTMLElement *This, BSTR where, nsI static const WCHAR wszAfterEnd[] = {'a','f','t','e','r','E','n','d',0}; nsresult nsres; - if(!This->nselem) { - FIXME("NULL nselem\n"); - return E_NOTIMPL; - } - if (!strcmpiW(where, wszBeforeBegin)) { nsIDOMNode *unused; nsIDOMNode *parent; - nsres = nsIDOMNode_GetParentNode(This->nselem, &parent); + nsres = nsIDOMNode_GetParentNode(This->node.nsnode, &parent); if (!parent) return E_INVALIDARG; - nsres = nsIDOMNode_InsertBefore(parent, nsnode, - (nsIDOMNode *)This->nselem, &unused); + nsres = nsIDOMNode_InsertBefore(parent, nsnode, This->node.nsnode, &unused); if (unused) nsIDOMNode_Release(unused); nsIDOMNode_Release(parent); } @@ -979,15 +1046,15 @@ static HRESULT HTMLElement_InsertAdjacentNode(HTMLElement *This, BSTR where, nsI { nsIDOMNode *unused; nsIDOMNode *first_child; - nsIDOMNode_GetFirstChild(This->nselem, &first_child); - nsres = nsIDOMNode_InsertBefore(This->nselem, nsnode, first_child, &unused); + nsIDOMNode_GetFirstChild(This->node.nsnode, &first_child); + nsres = nsIDOMNode_InsertBefore(This->node.nsnode, nsnode, first_child, &unused); if (unused) nsIDOMNode_Release(unused); if (first_child) nsIDOMNode_Release(first_child); } else if (!strcmpiW(where, wszBeforeEnd)) { nsIDOMNode *unused; - nsres = nsIDOMNode_AppendChild(This->nselem, nsnode, &unused); + nsres = nsIDOMNode_AppendChild(This->node.nsnode, nsnode, &unused); if (unused) nsIDOMNode_Release(unused); } else if (!strcmpiW(where, wszAfterEnd)) @@ -995,10 +1062,10 @@ static HRESULT HTMLElement_InsertAdjacentNode(HTMLElement *This, BSTR where, nsI nsIDOMNode *unused; nsIDOMNode *next_sibling; nsIDOMNode *parent; - nsIDOMNode_GetParentNode(This->nselem, &parent); + nsIDOMNode_GetParentNode(This->node.nsnode, &parent); if (!parent) return E_INVALIDARG; - nsIDOMNode_GetNextSibling(This->nselem, &next_sibling); + nsIDOMNode_GetNextSibling(This->node.nsnode, &next_sibling); if (next_sibling) { nsres = nsIDOMNode_InsertBefore(parent, nsnode, next_sibling, &unused); @@ -1054,7 +1121,7 @@ static HRESULT WINAPI HTMLElement_insertAdjacentHTML(IHTMLElement *iface, BSTR w return E_FAIL; } - nsIDOMRange_SetStartBefore(range, (nsIDOMNode *)This->nselem); + nsIDOMRange_SetStartBefore(range, This->node.nsnode); nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void **)&nsrange); nsIDOMRange_Release(range); @@ -1142,8 +1209,14 @@ static HRESULT WINAPI HTMLElement_get_filters(IHTMLElement *iface, IHTMLFiltersCollection **p) { HTMLElement *This = HTMLELEM_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + + if(!p) + return E_POINTER; + + *p = HTMLFiltersCollection_Create(); + + return S_OK; } static HRESULT WINAPI HTMLElement_put_ondragstart(IHTMLElement *iface, VARIANT v) @@ -1323,6 +1396,31 @@ static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p) return S_OK; } +static HRESULT HTMLElement_get_dispid(IUnknown *iface, BSTR name, + DWORD grfdex, DISPID *pid) +{ + HTMLElement *This = HTMLELEM_THIS(iface); + + if(This->node.vtbl->get_dispid) + return This->node.vtbl->get_dispid(&This->node, name, grfdex, pid); + + return DISP_E_UNKNOWNNAME; +} + +static HRESULT HTMLElement_invoke(IUnknown *iface, DISPID id, LCID lcid, + WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, + IServiceProvider *caller) +{ + HTMLElement *This = HTMLELEM_THIS(iface); + + if(This->node.vtbl->invoke) + return This->node.vtbl->invoke(&This->node, id, lcid, flags, + params, res, ei, caller); + + ERR("(%p): element has no invoke method\n", This); + return E_NOTIMPL; +} + #undef HTMLELEM_THIS static const IHTMLElementVtbl HTMLElementVtbl = { @@ -1482,8 +1580,14 @@ static const tid_t HTMLElement_iface_tids[] = { 0 }; -static dispex_static_data_t HTMLElement_dispex = { +static dispex_static_data_vtbl_t HTMLElement_dispex_vtbl = { NULL, + HTMLElement_get_dispid, + HTMLElement_invoke +}; + +static dispex_static_data_t HTMLElement_dispex = { + &HTMLElement_dispex_vtbl, DispHTMLUnknownElement_tid, NULL, HTMLElement_iface_tids @@ -1496,6 +1600,8 @@ void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMHTMLElemen HTMLElement2_Init(This); HTMLElement3_Init(This); + if(dispex_data && !dispex_data->vtbl) + dispex_data->vtbl = &HTMLElement_dispex_vtbl; init_dispex(&This->node.dispex, (IUnknown*)HTMLELEM(This), dispex_data ? dispex_data : &HTMLElement_dispex); if(nselem) @@ -1517,6 +1623,8 @@ HTMLElement *HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL static const WCHAR wszA[] = {'A',0}; static const WCHAR wszBODY[] = {'B','O','D','Y',0}; + static const WCHAR wszFORM[] = {'F','O','R','M',0}; + static const WCHAR wszFRAME[] = {'F','R','A','M','E',0}; static const WCHAR wszIFRAME[] = {'I','F','R','A','M','E',0}; static const WCHAR wszIMG[] = {'I','M','G',0}; static const WCHAR wszINPUT[] = {'I','N','P','U','T',0}; @@ -1540,8 +1648,12 @@ HTMLElement *HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL ret = HTMLAnchorElement_Create(doc, nselem); else if(!strcmpW(class_name, wszBODY)) ret = HTMLBodyElement_Create(doc, nselem); + else if(!strcmpW(class_name, wszFORM)) + ret = HTMLFormElement_Create(doc, nselem); + else if(!strcmpW(class_name, wszFRAME)) + ret = HTMLFrameElement_Create(doc, nselem); else if(!strcmpW(class_name, wszIFRAME)) - ret = HTMLIFrame_Create(doc, nselem, NULL); + ret = HTMLIFrame_Create(doc, nselem); else if(!strcmpW(class_name, wszIMG)) ret = HTMLImgElement_Create(doc, nselem); else if(!strcmpW(class_name, wszINPUT)) @@ -1574,3 +1686,185 @@ HTMLElement *HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL return ret; } + +/* interaface IHTMLFiltersCollection */ +static HRESULT WINAPI HTMLFiltersCollection_QueryInterface(IHTMLFiltersCollection *iface, REFIID riid, void **ppv) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + + TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppv ); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = HTMLFILTERSCOLLECTION(This); + }else if(IsEqualGUID(&IID_IHTMLFiltersCollection, riid)) { + TRACE("(%p)->(IID_IHTMLFiltersCollection %p)\n", This, ppv); + *ppv = HTMLFILTERSCOLLECTION(This); + }else if(dispex_query_interface(&This->dispex, riid, ppv)) { + return *ppv ? S_OK : E_NOINTERFACE; + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI HTMLFiltersCollection_AddRef(IHTMLFiltersCollection *iface) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI HTMLFiltersCollection_Release(IHTMLFiltersCollection *iface) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) + { + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI HTMLFiltersCollection_GetTypeInfoCount(IHTMLFiltersCollection *iface, UINT *pctinfo) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo); +} + +static HRESULT WINAPI HTMLFiltersCollection_GetTypeInfo(IHTMLFiltersCollection *iface, + UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLFiltersCollection_GetIDsOfNames(IHTMLFiltersCollection *iface, + REFIID riid, LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLFiltersCollection_Invoke(IHTMLFiltersCollection *iface, DISPID dispIdMember, REFIID riid, + LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, + wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLFiltersCollection_get_length(IHTMLFiltersCollection *iface, LONG *p) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + + FIXME("(%p)->(%p) Always returning 0\n", This, p); + + if(!p) + return E_POINTER; + + if(p) + *p = 0; + + return S_OK; +} + +static HRESULT WINAPI HTMLFiltersCollection_get__newEnum(IHTMLFiltersCollection *iface, IUnknown **p) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFiltersCollection_item(IHTMLFiltersCollection *iface, VARIANT *pvarIndex, VARIANT *pvarResult) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + FIXME("(%p)->(%p, %p)\n", This, pvarIndex, pvarResult); + return E_NOTIMPL; +} + +static const IHTMLFiltersCollectionVtbl HTMLFiltersCollectionVtbl = { + HTMLFiltersCollection_QueryInterface, + HTMLFiltersCollection_AddRef, + HTMLFiltersCollection_Release, + HTMLFiltersCollection_GetTypeInfoCount, + HTMLFiltersCollection_GetTypeInfo, + HTMLFiltersCollection_GetIDsOfNames, + HTMLFiltersCollection_Invoke, + HTMLFiltersCollection_get_length, + HTMLFiltersCollection_get__newEnum, + HTMLFiltersCollection_item +}; + +static HRESULT HTMLFiltersCollection_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid) +{ + WCHAR *ptr; + int idx = 0; + + for(ptr = name; *ptr && isdigitW(*ptr); ptr++) + idx = idx*10 + (*ptr-'0'); + if(*ptr) + return DISP_E_UNKNOWNNAME; + + *dispid = MSHTML_DISPID_CUSTOM_MIN + idx; + TRACE("ret %x\n", *dispid); + return S_OK; +} + +static HRESULT HTMLFiltersCollection_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface); + + TRACE("(%p)->(%x %x %x %p %p %p)\n", This, id, lcid, flags, params, res, ei); + + V_VT(res) = VT_DISPATCH; + V_DISPATCH(res) = NULL; + + FIXME("always returning NULL\n"); + + return S_OK; +} + +static const dispex_static_data_vtbl_t HTMLFiltersCollection_dispex_vtbl = { + NULL, + HTMLFiltersCollection_get_dispid, + HTMLFiltersCollection_invoke +}; + +static const tid_t HTMLFiltersCollection_iface_tids[] = { + IHTMLFiltersCollection_tid, + 0 +}; +static dispex_static_data_t HTMLFiltersCollection_dispex = { + &HTMLFiltersCollection_dispex_vtbl, + IHTMLFiltersCollection_tid, + NULL, + HTMLFiltersCollection_iface_tids +}; + +IHTMLFiltersCollection *HTMLFiltersCollection_Create() +{ + HTMLFiltersCollection *ret = heap_alloc(sizeof(HTMLFiltersCollection)); + + ret->lpHTMLFiltersCollectionVtbl = &HTMLFiltersCollectionVtbl; + ret->ref = 1; + + init_dispex(&ret->dispex, (IUnknown*)HTMLFILTERSCOLLECTION(ret), &HTMLFiltersCollection_dispex); + + return HTMLFILTERSCOLLECTION(ret); +} diff --git a/reactos/dll/win32/mshtml/htmlelem2.c b/reactos/dll/win32/mshtml/htmlelem2.c index d001eaa82f6..cd9b6764857 100644 --- a/reactos/dll/win32/mshtml/htmlelem2.c +++ b/reactos/dll/win32/mshtml/htmlelem2.c @@ -451,7 +451,7 @@ static HRESULT WINAPI HTMLElement2_focus(IHTMLElement2 *iface) nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem); if(NS_SUCCEEDED(nsres)) { - nsIDOMNSHTMLElement_focus(nselem); + nsIDOMNSHTMLElement_Focus(nselem); nsIDOMNSHTMLElement_Release(nselem); }else { ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres); @@ -662,15 +662,34 @@ static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p) { HTMLElement *This = HTMLELEM2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + BSTR str; + + TRACE("(%p)->(%p)\n", This, p); + + if(This->node.vtbl->get_readystate) { + HRESULT hres; + + hres = This->node.vtbl->get_readystate(&This->node, &str); + if(FAILED(hres)) + return hres; + }else { + static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0}; + + str = SysAllocString(completeW); + if(!str) + return E_OUTOFMEMORY; + } + + V_VT(p) = VT_BSTR; + V_BSTR(p) = str; + return S_OK; } static HRESULT WINAPI HTMLElement2_put_onreadystatechange(IHTMLElement2 *iface, VARIANT v) { HTMLElement *This = HTMLELEM2_THIS(iface); - FIXME("(%p)->(%s): semi-stub\n", This, debugstr_variant(&v)); + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); return set_node_event(&This->node, EVENTID_READYSTATECHANGE, &v); } diff --git a/reactos/dll/win32/mshtml/htmlelemcol.c b/reactos/dll/win32/mshtml/htmlelemcol.c index 70827bcd8e9..c9737077382 100644 --- a/reactos/dll/win32/mshtml/htmlelemcol.c +++ b/reactos/dll/win32/mshtml/htmlelemcol.c @@ -205,6 +205,26 @@ static HRESULT WINAPI HTMLElementCollection_get__newEnum(IHTMLElementCollection return E_NOTIMPL; } +static BOOL is_elem_id(HTMLElement *elem, LPCWSTR name) +{ + BSTR elem_id; + HRESULT hres; + + hres = IHTMLElement_get_id(HTMLELEM(elem), &elem_id); + if(FAILED(hres)){ + WARN("IHTMLElement_get_id failed: 0x%08x\n", hres); + return FALSE; + } + + if(elem_id && !strcmpW(elem_id, name)) { + SysFreeString(elem_id); + return TRUE; + } + + SysFreeString(elem_id); + return FALSE; +} + static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name) { const PRUnichar *str; @@ -376,7 +396,16 @@ static HRESULT HTMLElementCollection_get_dispid(IUnknown *iface, BSTR name, DWOR for(ptr = name; *ptr && isdigitW(*ptr); ptr++) idx = idx*10 + (*ptr-'0'); - if(*ptr || idx >= This->len) + if(*ptr) { + /* the name contains alpha characters, so search by name & id */ + for(idx = 0; idx < This->len; ++idx) { + if(is_elem_id(This->elems[idx], name) || + is_elem_name(This->elems[idx], name)) + break; + } + } + + if(idx >= This->len) return DISP_E_UNKNOWNNAME; *dispid = DISPID_ELEMCOL_0 + idx; diff --git a/reactos/dll/win32/mshtml/htmlevent.c b/reactos/dll/win32/mshtml/htmlevent.c index 345fd839aac..d04b2e66370 100644 --- a/reactos/dll/win32/mshtml/htmlevent.c +++ b/reactos/dll/win32/mshtml/htmlevent.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "mshtmdid.h" #include "mshtml_private.h" #include "htmlevent.h" @@ -93,6 +94,9 @@ static const WCHAR onpasteW[] = {'o','n','p','a','s','t','e',0}; static const WCHAR readystatechangeW[] = {'r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0}; static const WCHAR onreadystatechangeW[] = {'o','n','r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0}; +static const WCHAR resizeW[] = {'r','e','s','i','z','e',0}; +static const WCHAR onresizeW[] = {'o','n','r','e','s','i','z','e',0}; + static const WCHAR selectstartW[] = {'s','e','l','e','c','t','s','t','a','r','t',0}; static const WCHAR onselectstartW[] = {'o','n','s','e','l','e','c','t','s','t','a','r','t',0}; @@ -118,6 +122,7 @@ typedef struct { LPCWSTR name; LPCWSTR attr_name; DWORD type; + DISPID dispid; DWORD flags; } event_info_t; @@ -126,24 +131,44 @@ typedef struct { #define EVENT_FORWARDBODY 0x0004 static const event_info_t event_info[] = { - {beforeunloadW, onbeforeunloadW, EVENTT_NONE, EVENT_DEFAULTLISTENER|EVENT_FORWARDBODY}, - {blurW, onblurW, EVENTT_HTML, EVENT_DEFAULTLISTENER}, - {changeW, onchangeW, EVENTT_HTML, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {clickW, onclickW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {dblclickW, ondblclickW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {dragW, ondragW, EVENTT_MOUSE, 0}, - {dragstartW, ondragstartW, EVENTT_MOUSE, 0}, - {focusW, onfocusW, EVENTT_HTML, EVENT_DEFAULTLISTENER}, - {keydownW, onkeydownW, EVENTT_KEY, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {keyupW, onkeyupW, EVENTT_KEY, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {loadW, onloadW, EVENTT_HTML, 0}, - {mousedownW, onmousedownW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {mouseoutW, onmouseoutW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {mouseoverW, onmouseoverW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {mouseupW, onmouseupW, EVENTT_MOUSE, EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, - {pasteW, onpasteW, EVENTT_NONE, 0}, - {readystatechangeW, onreadystatechangeW, EVENTT_NONE, 0}, - {selectstartW, onselectstartW, EVENTT_MOUSE, 0} + {beforeunloadW, onbeforeunloadW, EVENTT_NONE, DISPID_EVMETH_ONBEFOREUNLOAD, + EVENT_DEFAULTLISTENER|EVENT_FORWARDBODY}, + {blurW, onblurW, EVENTT_HTML, DISPID_EVMETH_ONBLUR, + EVENT_DEFAULTLISTENER}, + {changeW, onchangeW, EVENTT_HTML, DISPID_EVMETH_ONCHANGE, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {clickW, onclickW, EVENTT_MOUSE, DISPID_EVMETH_ONCLICK, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {dblclickW, ondblclickW, EVENTT_MOUSE, DISPID_EVMETH_ONDBLCLICK, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {dragW, ondragW, EVENTT_MOUSE, DISPID_EVMETH_ONDRAG, + 0}, + {dragstartW, ondragstartW, EVENTT_MOUSE, DISPID_EVMETH_ONDRAGSTART, + 0}, + {focusW, onfocusW, EVENTT_HTML, DISPID_EVMETH_ONFOCUS, + EVENT_DEFAULTLISTENER}, + {keydownW, onkeydownW, EVENTT_KEY, DISPID_EVMETH_ONKEYDOWN, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {keyupW, onkeyupW, EVENTT_KEY, DISPID_EVMETH_ONKEYUP, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {loadW, onloadW, EVENTT_HTML, DISPID_EVMETH_ONLOAD, + 0}, + {mousedownW, onmousedownW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEDOWN, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {mouseoutW, onmouseoutW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEOUT, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {mouseoverW, onmouseoverW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEOVER, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {mouseupW, onmouseupW, EVENTT_MOUSE, DISPID_EVMETH_ONMOUSEUP, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {pasteW, onpasteW, EVENTT_NONE, DISPID_EVMETH_ONPASTE, + 0}, + {readystatechangeW, onreadystatechangeW, EVENTT_NONE, DISPID_EVMETH_ONREADYSTATECHANGE, + 0}, + {resizeW, onresizeW, EVENTT_NONE, DISPID_EVMETH_ONRESIZE, + EVENT_DEFAULTLISTENER|EVENT_BUBBLE}, + {selectstartW, onselectstartW, EVENTT_MOUSE, DISPID_EVMETH_ONSELECTSTART, + 0} }; eventid_t str_to_eid(LPCWSTR str) @@ -738,17 +763,66 @@ static IHTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid, nsIDOMEve return HTMLEVENTOBJ(ret); } -static void call_event_handlers(HTMLDocumentNode *doc, IHTMLEventObj *event_obj, event_target_t *event_target, - eventid_t eid, IDispatch *this_obj) +static HRESULT call_cp_func(IDispatch *disp, DISPID dispid) { - handler_vector_t *handler_vector; + DISPPARAMS dp = {NULL,NULL,0,0}; + ULONG argerr; + EXCEPINFO ei; + VARIANT vres; + HRESULT hres; + + V_VT(&vres) = VT_EMPTY; + memset(&ei, 0, sizeof(ei)); + hres = IDispatch_Invoke(disp, dispid, &IID_NULL, 0, DISPATCH_METHOD, &dp, &vres, &ei, &argerr); + if(SUCCEEDED(hres) && V_VT(&vres) != VT_EMPTY) { + FIXME("handle result %s\n", debugstr_variant(&vres)); + VariantClear(&vres); + } + + return hres; +} + +static BOOL is_cp_event(cp_static_data_t *data, DISPID dispid) +{ + int min, max, i; + HRESULT hres; + + if(!data) + return FALSE; + + if(!data->ids) { + hres = get_dispids(data->tid, &data->id_cnt, &data->ids); + if(FAILED(hres)) + return FALSE; + } + + min = 0; + max = data->id_cnt-1; + while(min <= max) { + i = (min+max)/2; + if(data->ids[i] == dispid) + return TRUE; + + if(data->ids[i] < dispid) + min = i+1; + else + max = i-1; + } + + return FALSE; +} + +static void call_event_handlers(HTMLDocumentNode *doc, IHTMLEventObj *event_obj, event_target_t *event_target, + ConnectionPointContainer *cp_container, eventid_t eid, IDispatch *this_obj) +{ + handler_vector_t *handler_vector = NULL; DWORD i; HRESULT hres; - if(!event_target || !(handler_vector = event_target->event_table[eid])) - return; + if(event_target) + handler_vector = event_target->event_table[eid]; - if(handler_vector->handler_prop) { + if(handler_vector && handler_vector->handler_prop) { DISPID named_arg = DISPID_THIS; VARIANTARG arg; DISPPARAMS dp = {&arg, &named_arg, 1, 1}; @@ -764,7 +838,7 @@ static void call_event_handlers(HTMLDocumentNode *doc, IHTMLEventObj *event_obj, WARN("%s <<< %08x\n", debugstr_w(event_info[eid].name), hres); } - if(handler_vector->handler_cnt) { + if(handler_vector && handler_vector->handler_cnt) { VARIANTARG arg; DISPPARAMS dp = {&arg, NULL, 1, 0}; @@ -782,6 +856,26 @@ static void call_event_handlers(HTMLDocumentNode *doc, IHTMLEventObj *event_obj, } } } + + if(cp_container) { + ConnectionPoint *cp; + + if(cp_container->forward_container) + cp_container = cp_container->forward_container; + + for(cp = cp_container->cp_list; cp; cp = cp->next) { + if(cp->sinks_size && is_cp_event(cp->data, event_info[eid].dispid)) { + for(i=0; i < cp->sinks_size; i++) { + TRACE("cp %s [%d] >>>\n", debugstr_w(event_info[eid].name), i); + hres = call_cp_func(cp->sinks[i].disp, event_info[eid].dispid); + if(hres == S_OK) + TRACE("cp %s [%d] <<<\n", debugstr_w(event_info[eid].name), i); + else + WARN("cp %s [%d] <<< %08x\n", debugstr_w(event_info[eid].name), i, hres); + } + } + } + } } void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEvent *nsevent) @@ -805,7 +899,8 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOM do { node = get_node(doc, nsnode, FALSE); if(node) - call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node)); + call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, eid, + (IDispatch*)HTMLDOMNODE(node)); if(!(event_info[eid].flags & EVENT_BUBBLE)) break; @@ -831,14 +926,15 @@ void fire_event(HTMLDocumentNode *doc, eventid_t eid, nsIDOMNode *target, nsIDOM if(NS_SUCCEEDED(nsres) && nsbody) { node = get_node(doc, (nsIDOMNode*)nsbody, FALSE); if(node) - call_event_handlers(doc, event_obj, *get_node_event_target(node), eid, (IDispatch*)HTMLDOMNODE(node)); + call_event_handlers(doc, event_obj, *get_node_event_target(node), node->cp_container, + eid, (IDispatch*)HTMLDOMNODE(node)); nsIDOMHTMLElement_Release(nsbody); }else { ERR("Could not get body: %08x\n", nsres); } } - call_event_handlers(doc, event_obj, doc->basedoc.doc_node->node.event_target, eid, + call_event_handlers(doc, event_obj, doc->node.event_target, &doc->basedoc.cp_container, eid, (IDispatch*)HTMLDOC(&doc->basedoc)); break; @@ -921,6 +1017,25 @@ static BOOL alloc_handler_vector(event_target_t *event_target, eventid_t eid, in return TRUE; } +static HRESULT ensure_nsevent_handler(HTMLDocumentNode *doc, eventid_t eid) +{ + if(!doc->nsdoc || !(event_info[eid].flags & EVENT_DEFAULTLISTENER)) + return S_OK; + + if(!doc->event_vector) { + doc->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL)); + if(!doc->event_vector) + return E_OUTOFMEMORY; + } + + if(!doc->event_vector[eid]) { + doc->event_vector[eid] = TRUE; + add_nsevent_listener(doc, event_info[eid].name); + } + + return S_OK; +} + static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDocumentNode *doc, eventid_t eid, IDispatch *disp) { @@ -941,20 +1056,7 @@ static HRESULT set_event_handler_disp(event_target_t **event_target_ptr, HTMLDoc return S_OK; IDispatch_AddRef(disp); - if(doc->nsdoc && (event_info[eid].flags & EVENT_DEFAULTLISTENER)) { - if(!doc->event_vector) { - doc->event_vector = heap_alloc_zero(EVENTID_LAST*sizeof(BOOL)); - if(!doc->event_vector) - return E_OUTOFMEMORY; - } - - if(!doc->event_vector[eid]) { - doc->event_vector[eid] = TRUE; - add_nsevent_listener(doc, event_info[eid].name); - } - } - - return S_OK; + return ensure_nsevent_handler(doc, eid); } HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, eventid_t eid, VARIANT *var) @@ -972,6 +1074,7 @@ HRESULT set_event_handler(event_target_t **event_target, HTMLDocumentNode *doc, default: FIXME("not supported vt=%d\n", V_VT(var)); + case VT_EMPTY: return E_NOTIMPL; } @@ -1024,6 +1127,16 @@ HRESULT attach_event(event_target_t **event_target_ptr, HTMLDocument *doc, BSTR return S_OK; } +void update_cp_events(HTMLWindow *window, cp_static_data_t *cp) +{ + int i; + + for(i=0; i < EVENTID_LAST; i++) { + if((event_info[i].flags & EVENT_DEFAULTLISTENER) && is_cp_event(cp, event_info[i].dispid)) + ensure_nsevent_handler(window->doc, i); + } +} + void check_event_attr(HTMLDocumentNode *doc, nsIDOMElement *nselem) { const PRUnichar *attr_value; diff --git a/reactos/dll/win32/mshtml/htmlevent.h b/reactos/dll/win32/mshtml/htmlevent.h index d0332eef30c..1a8572f951e 100644 --- a/reactos/dll/win32/mshtml/htmlevent.h +++ b/reactos/dll/win32/mshtml/htmlevent.h @@ -34,6 +34,7 @@ typedef enum { EVENTID_MOUSEUP, EVENTID_PASTE, EVENTID_READYSTATECHANGE, + EVENTID_RESIZE, EVENTID_SELECTSTART, EVENTID_LAST } eventid_t; @@ -47,6 +48,7 @@ HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*); HRESULT attach_event(event_target_t**,HTMLDocument*,BSTR,IDispatch*,VARIANT_BOOL*); HRESULT dispatch_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*); HRESULT call_event(HTMLDOMNode*,eventid_t); +void update_cp_events(HTMLWindow*,cp_static_data_t*); static inline event_target_t **get_node_event_target(HTMLDOMNode *node) { @@ -72,13 +74,3 @@ static inline HRESULT get_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *v { return get_node_event(&doc->doc_node->node, eid, var); } - -static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) -{ - return set_event_handler(&window->event_target, window->doc, eid, var); -} - -static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) -{ - return get_event_handler(&window->event_target, eid, var); -} diff --git a/reactos/dll/win32/mshtml/htmlform.c b/reactos/dll/win32/mshtml/htmlform.c new file mode 100644 index 00000000000..1db965a8d77 --- /dev/null +++ b/reactos/dll/win32/mshtml/htmlform.c @@ -0,0 +1,517 @@ +/* + * Copyright 2009 Andrew Eikum for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +struct HTMLFormElement { + HTMLElement element; + + const IHTMLFormElementVtbl *lpHTMLFormElementVtbl; + + nsIDOMHTMLFormElement *nsform; +}; + +#define HTMLFORM(x) (&(x)->lpHTMLFormElementVtbl) + +#define HTMLFORM_THIS(iface) DEFINE_THIS(HTMLFormElement, HTMLFormElement, iface) + +static HRESULT WINAPI HTMLFormElement_QueryInterface(IHTMLFormElement *iface, + REFIID riid, void **ppv) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + + return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv); +} + +static ULONG WINAPI HTMLFormElement_AddRef(IHTMLFormElement *iface) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + + return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node)); +} + +static ULONG WINAPI HTMLFormElement_Release(IHTMLFormElement *iface) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + + return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); +} + +static HRESULT WINAPI HTMLFormElement_GetTypeInfoCount(IHTMLFormElement *iface, UINT *pctinfo) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo); +} + +static HRESULT WINAPI HTMLFormElement_GetTypeInfo(IHTMLFormElement *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLFormElement_GetIDsOfNames(IHTMLFormElement *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLFormElement_Invoke(IHTMLFormElement *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLFormElement_put_action(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_action(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_dir(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_dir(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_encoding(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_encoding(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_method(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_method(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_elements(IHTMLFormElement *iface, IDispatch **p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_target(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_target(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_name(IHTMLFormElement *iface, BSTR v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_name(IHTMLFormElement *iface, BSTR *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_onsubmit(IHTMLFormElement *iface, VARIANT v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(v)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_onsubmit(IHTMLFormElement *iface, VARIANT *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_onreset(IHTMLFormElement *iface, VARIANT v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(v)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_onreset(IHTMLFormElement *iface, VARIANT *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_submit(IHTMLFormElement *iface) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_reset(IHTMLFormElement *iface) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_put_length(IHTMLFormElement *iface, LONG v) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%d)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_get_length(IHTMLFormElement *iface, LONG *p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement__newEnum(IHTMLFormElement *iface, IUnknown **p) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name, + VARIANT index, IDispatch **pdisp) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(v v %p)\n", This, pdisp); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFormElement_tags(IHTMLFormElement *iface, VARIANT tagName, + IDispatch **pdisp) +{ + HTMLFormElement *This = HTMLFORM_THIS(iface); + FIXME("(%p)->(v %p)\n", This, pdisp); + return E_NOTIMPL; +} + +#undef HTMLFORM_THIS + +static const IHTMLFormElementVtbl HTMLFormElementVtbl = { + HTMLFormElement_QueryInterface, + HTMLFormElement_AddRef, + HTMLFormElement_Release, + HTMLFormElement_GetTypeInfoCount, + HTMLFormElement_GetTypeInfo, + HTMLFormElement_GetIDsOfNames, + HTMLFormElement_Invoke, + HTMLFormElement_put_action, + HTMLFormElement_get_action, + HTMLFormElement_put_dir, + HTMLFormElement_get_dir, + HTMLFormElement_put_encoding, + HTMLFormElement_get_encoding, + HTMLFormElement_put_method, + HTMLFormElement_get_method, + HTMLFormElement_get_elements, + HTMLFormElement_put_target, + HTMLFormElement_get_target, + HTMLFormElement_put_name, + HTMLFormElement_get_name, + HTMLFormElement_put_onsubmit, + HTMLFormElement_get_onsubmit, + HTMLFormElement_put_onreset, + HTMLFormElement_get_onreset, + HTMLFormElement_submit, + HTMLFormElement_reset, + HTMLFormElement_put_length, + HTMLFormElement_get_length, + HTMLFormElement__newEnum, + HTMLFormElement_item, + HTMLFormElement_tags +}; + +#define HTMLFORM_NODE_THIS(iface) DEFINE_THIS2(HTMLFormElement, element.node, iface) + +static HRESULT HTMLFormElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) +{ + HTMLFormElement *This = HTMLFORM_NODE_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = HTMLFORM(This); + }else if(IsEqualGUID(&IID_IDispatch, riid)) { + TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); + *ppv = HTMLFORM(This); + }else if(IsEqualGUID(&IID_IHTMLFormElement, riid)) { + TRACE("(%p)->(IID_IHTMLFormElement %p)\n", This, ppv); + *ppv = HTMLFORM(This); + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + return HTMLElement_QI(&This->element.node, riid, ppv); +} + +static void HTMLFormElement_destructor(HTMLDOMNode *iface) +{ + HTMLFormElement *This = HTMLFORM_NODE_THIS(iface); + + if(This->nsform) + nsIDOMHTMLFormElement_Release(This->nsform); + + HTMLElement_destructor(&This->element.node); +} + +static HRESULT HTMLFormElement_get_dispid(HTMLDOMNode *iface, + BSTR name, DWORD grfdex, DISPID *pid) +{ + HTMLFormElement *This = HTMLFORM_NODE_THIS(iface); + nsIDOMHTMLCollection *elements; + PRUint32 len, i; + static const PRUnichar nameW[] = {'n','a','m','e',0}; + nsAString nsname; + nsresult nsres; + + TRACE("(%p)->(%s %x %p)\n", This, wine_dbgstr_w(name), grfdex, pid); + + nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements); + if(NS_FAILED(nsres)) { + FIXME("GetElements failed: 0x%08x\n", nsres); + return E_FAIL; + } + + nsres = nsIDOMHTMLCollection_GetLength(elements, &len); + if(NS_FAILED(nsres)) { + FIXME("GetLength failed: 0x%08x\n", nsres); + nsIDOMHTMLCollection_Release(elements); + return E_FAIL; + } + + nsAString_Init(&nsname, nameW); + for(i = 0; i < len; ++i) { + nsIDOMNode *nsitem; + nsIDOMHTMLElement *nshtml_elem; + nsAString nsstr; + const PRUnichar *str; + + nsres = nsIDOMHTMLCollection_Item(elements, i, &nsitem); + if(NS_FAILED(nsres)) { + FIXME("Item failed: 0x%08x\n", nsres); + nsAString_Finish(&nsname); + nsIDOMHTMLCollection_Release(elements); + return E_FAIL; + } + + nsres = nsIDOMNode_QueryInterface(nsitem, &IID_nsIDOMHTMLElement, (void**)&nshtml_elem); + nsIDOMNode_Release(nsitem); + if(NS_FAILED(nsres)) { + FIXME("Failed to get nsIDOMHTMLNode interface: 0x%08x\n", nsres); + nsAString_Finish(&nsname); + nsIDOMHTMLCollection_Release(elements); + return E_FAIL; + } + + /* compare by id attr */ + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLElement_GetId(nshtml_elem, &nsstr); + if(NS_FAILED(nsres)) { + FIXME("GetId failed: 0x%08x\n", nsres); + nsAString_Finish(&nsname); + nsIDOMHTMLElement_Release(nshtml_elem); + nsIDOMHTMLCollection_Release(elements); + return E_FAIL; + } + nsAString_GetData(&nsstr, &str); + if(!strcmpiW(str, name)) { + /* FIXME: using index for dispid */ + *pid = MSHTML_DISPID_CUSTOM_MIN + i; + nsAString_Finish(&nsname); + nsAString_Finish(&nsstr); + nsIDOMHTMLElement_Release(nshtml_elem); + nsIDOMHTMLCollection_Release(elements); + return S_OK; + } + + /* compare by name attr */ + nsres = nsIDOMHTMLElement_GetAttribute(nshtml_elem, &nsname, &nsstr); + nsAString_GetData(&nsstr, &str); + if(!strcmpiW(str, name)) { + /* FIXME: using index for dispid */ + *pid = MSHTML_DISPID_CUSTOM_MIN + i; + nsAString_Finish(&nsname); + nsAString_Finish(&nsstr); + nsIDOMHTMLElement_Release(nshtml_elem); + nsIDOMHTMLCollection_Release(elements); + return S_OK; + } + nsAString_Finish(&nsstr); + + nsIDOMHTMLElement_Release(nshtml_elem); + } + nsAString_Finish(&nsname); + + nsIDOMHTMLCollection_Release(elements); + + return DISP_E_UNKNOWNNAME; +} + +static HRESULT HTMLFormElement_invoke(HTMLDOMNode *iface, + DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, + EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLFormElement *This = HTMLFORM_NODE_THIS(iface); + nsIDOMHTMLCollection *elements; + nsIDOMNode *item; + HTMLDOMNode *node; + nsresult nsres; + + TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller); + + nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements); + if(NS_FAILED(nsres)) { + FIXME("GetElements failed: 0x%08x\n", nsres); + return E_FAIL; + } + + nsres = nsIDOMHTMLCollection_Item(elements, id - MSHTML_DISPID_CUSTOM_MIN, &item); + nsIDOMHTMLCollection_Release(elements); + if(NS_FAILED(nsres)) { + FIXME("Item failed: 0x%08x\n", nsres); + return E_FAIL; + } + + node = get_node(This->element.node.doc, item, TRUE); + + V_VT(res) = VT_DISPATCH; + V_DISPATCH(res) = (IDispatch*)node; + + IHTMLDOMNode_AddRef(HTMLDOMNODE(node)); + nsIDOMNode_Release(item); + + return S_OK; +} + +#undef HTMLFORM_NODE_THIS + +static const NodeImplVtbl HTMLFormElementImplVtbl = { + HTMLFormElement_QI, + HTMLFormElement_destructor, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + HTMLFormElement_get_dispid, + HTMLFormElement_invoke +}; + +static const tid_t HTMLFormElement_iface_tids[] = { + IHTMLDOMNode_tid, + IHTMLDOMNode2_tid, + IHTMLElement_tid, + IHTMLElement2_tid, + IHTMLElement3_tid, + IHTMLFormElement_tid, + 0 +}; + +static dispex_static_data_t HTMLFormElement_dispex = { + NULL, + DispHTMLFormElement_tid, + NULL, + HTMLFormElement_iface_tids +}; + +HTMLElement *HTMLFormElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) +{ + HTMLFormElement *ret = heap_alloc_zero(sizeof(HTMLFormElement)); + nsresult nsres; + + ret->lpHTMLFormElementVtbl = &HTMLFormElementVtbl; + ret->element.node.vtbl = &HTMLFormElementImplVtbl; + + HTMLElement_Init(&ret->element, doc, nselem, &HTMLFormElement_dispex); + + nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFormElement, (void**)&ret->nsform); + if(NS_FAILED(nsres)) + ERR("Could not get nsIDOMHTMLFormElement interface: %08x\n", nsres); + + return &ret->element; +} diff --git a/reactos/dll/win32/mshtml/htmlframebase.c b/reactos/dll/win32/mshtml/htmlframebase.c index 6c0dd40a5e8..e94c8010f9e 100644 --- a/reactos/dll/win32/mshtml/htmlframebase.c +++ b/reactos/dll/win32/mshtml/htmlframebase.c @@ -31,6 +31,36 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +static const WCHAR autoW[] = {'a','u','t','o',0}; +static const WCHAR yesW[] = {'y','e','s',0}; +static const WCHAR noW[] = {'n','o',0}; + +HRESULT set_frame_doc(HTMLFrameBase *frame, nsIDOMDocument *nsdoc) +{ + nsIDOMWindow *nswindow; + HTMLWindow *window; + HRESULT hres = S_OK; + + if(frame->content_window) + return S_OK; + + nswindow = get_nsdoc_window(nsdoc); + if(!nswindow) + return E_FAIL; + + window = nswindow_to_window(nswindow); + if(!window) + hres = HTMLWindow_Create(frame->element.node.doc->basedoc.doc_obj, nswindow, + frame->element.node.doc->basedoc.window, &window); + nsIDOMWindow_Release(nswindow); + if(FAILED(hres)) + return hres; + + frame->content_window = window; + window->frame_element = frame; + return S_OK; +} + #define HTMLFRAMEBASE_THIS(iface) DEFINE_THIS(HTMLFrameBase, IHTMLFrameBase, iface) static HRESULT WINAPI HTMLFrameBase_QueryInterface(IHTMLFrameBase *iface, REFIID riid, void **ppv) @@ -91,8 +121,15 @@ static HRESULT WINAPI HTMLFrameBase_Invoke(IHTMLFrameBase *iface, DISPID dispIdM static HRESULT WINAPI HTMLFrameBase_put_src(IHTMLFrameBase *iface, BSTR v) { HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + if(!This->content_window || !This->element.node.doc || !This->element.node.doc->basedoc.window) { + FIXME("detached element\n"); + return E_FAIL; + } + + return navigate_url(This->content_window, v, This->element.node.doc->basedoc.window->url); } static HRESULT WINAPI HTMLFrameBase_get_src(IHTMLFrameBase *iface, BSTR *p) @@ -112,8 +149,42 @@ static HRESULT WINAPI HTMLFrameBase_put_name(IHTMLFrameBase *iface, BSTR v) static HRESULT WINAPI HTMLFrameBase_get_name(IHTMLFrameBase *iface, BSTR *p) { HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsAString nsstr; + const PRUnichar *strdata; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + if(This->nsframe) { + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLFrameElement_GetName(This->nsframe, &nsstr); + }else if(This->nsiframe) { + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLIFrameElement_GetName(This->nsiframe, &nsstr); + }else { + ERR("No attached ns frame object\n"); + return E_UNEXPECTED; + } + + if(NS_FAILED(nsres)) { + ERR("GetName failed: 0x%08x\n", nsres); + nsAString_Finish(&nsstr); + return E_FAIL; + } + + nsAString_GetData(&nsstr, &strdata); + if(*strdata) { + *p = SysAllocString(strdata); + if(!*p) { + nsAString_Finish(&nsstr); + return E_OUTOFMEMORY; + } + }else + *p = NULL; + + nsAString_Finish(&nsstr); + + return S_OK; } static HRESULT WINAPI HTMLFrameBase_put_border(IHTMLFrameBase *iface, VARIANT v) @@ -203,15 +274,70 @@ static HRESULT WINAPI HTMLFrameBase_get_noResize(IHTMLFrameBase *iface, VARIANT_ static HRESULT WINAPI HTMLFrameBase_put_scrolling(IHTMLFrameBase *iface, BSTR v) { HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString nsstr; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + if(!(!strcmpiW(v, yesW) || !strcmpiW(v, noW) || !strcmpiW(v, autoW))) + return E_INVALIDARG; + + if(This->nsframe) { + nsAString_Init(&nsstr, v); + nsres = nsIDOMHTMLFrameElement_SetScrolling(This->nsframe, &nsstr); + }else if(This->nsiframe) { + nsAString_Init(&nsstr, v); + nsres = nsIDOMHTMLIFrameElement_SetScrolling(This->nsiframe, &nsstr); + }else { + ERR("No attached ns frame object\n"); + return E_UNEXPECTED; + } + nsAString_Finish(&nsstr); + + if(NS_FAILED(nsres)) { + ERR("SetScrolling failed: 0x%08x\n", nsres); + return E_FAIL; + } + + return S_OK; } static HRESULT WINAPI HTMLFrameBase_get_scrolling(IHTMLFrameBase *iface, BSTR *p) { HTMLFrameBase *This = HTMLFRAMEBASE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsAString nsstr; + const PRUnichar *strdata; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + if(This->nsframe) { + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLFrameElement_GetScrolling(This->nsframe, &nsstr); + }else if(This->nsiframe) { + nsAString_Init(&nsstr, NULL); + nsres = nsIDOMHTMLIFrameElement_GetScrolling(This->nsiframe, &nsstr); + }else { + ERR("No attached ns frame object\n"); + return E_UNEXPECTED; + } + + if(NS_FAILED(nsres)) { + ERR("GetScrolling failed: 0x%08x\n", nsres); + nsAString_Finish(&nsstr); + return E_FAIL; + } + + nsAString_GetData(&nsstr, &strdata); + + if(*strdata) + *p = SysAllocString(strdata); + else + *p = SysAllocString(autoW); + + nsAString_Finish(&nsstr); + + return *p ? S_OK : E_OUTOFMEMORY; } static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = { @@ -242,11 +368,161 @@ static const IHTMLFrameBaseVtbl HTMLFrameBaseVtbl = { HTMLFrameBase_get_scrolling }; +#define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLFrameBase, IHTMLFrameBase2, iface) + +static HRESULT WINAPI HTMLFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv); +} + +static ULONG WINAPI HTMLFrameBase2_AddRef(IHTMLFrameBase2 *iface) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node)); +} + +static ULONG WINAPI HTMLFrameBase2_Release(IHTMLFrameBase2 *iface) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + + return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); +} + +static HRESULT WINAPI HTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + if(This->content_window) { + IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window)); + *p = HTMLWINDOW2(This->content_window); + }else { + WARN("NULL content window\n"); + *p = NULL; + } + return S_OK; +} + +static HRESULT WINAPI HTMLFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + if(!This->content_window || !This->content_window->doc) { + FIXME("no document associated\n"); + return E_FAIL; + } + + return IHTMLDocument2_get_readyState(HTMLDOC(&This->content_window->doc->basedoc), p); +} + +static HRESULT WINAPI HTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%x)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p) +{ + HTMLFrameBase *This = HTMLFRAMEBASE2_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +#undef HTMLFRAMEBASE2_THIS + +static const IHTMLFrameBase2Vtbl HTMLFrameBase2Vtbl = { + HTMLFrameBase2_QueryInterface, + HTMLFrameBase2_AddRef, + HTMLFrameBase2_Release, + HTMLFrameBase2_GetTypeInfoCount, + HTMLFrameBase2_GetTypeInfo, + HTMLFrameBase2_GetIDsOfNames, + HTMLFrameBase2_Invoke, + HTMLFrameBase2_get_contentWindow, + HTMLFrameBase2_put_onload, + HTMLFrameBase2_get_onload, + HTMLFrameBase2_put_onreadystatechange, + HTMLFrameBase2_get_onreadystatechange, + HTMLFrameBase2_get_readyState, + HTMLFrameBase2_put_allowTransparency, + HTMLFrameBase2_get_allowTransparency +}; + HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv) { if(IsEqualGUID(&IID_IHTMLFrameBase, riid)) { TRACE("(%p)->(IID_IHTMLFrameBase %p)\n", This, ppv); *ppv = HTMLFRAMEBASE(This); + }else if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) { + TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv); + *ppv = HTMLFRAMEBASE2(This); }else { return HTMLElement_QI(&This->element.node, riid, ppv); } @@ -257,26 +533,34 @@ HRESULT HTMLFrameBase_QI(HTMLFrameBase *This, REFIID riid, void **ppv) void HTMLFrameBase_destructor(HTMLFrameBase *This) { - if(This->content_window) { + if(This->content_window) This->content_window->frame_element = NULL; - IHTMLWindow2_Release(HTMLWINDOW2(This->content_window)); - } + + if(This->nsframe) + nsIDOMHTMLFrameElement_Release(This->nsframe); + if(This->nsiframe) + nsIDOMHTMLIFrameElement_Release(This->nsiframe); HTMLElement_destructor(&This->element.node); } void HTMLFrameBase_Init(HTMLFrameBase *This, HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, - HTMLWindow *content_window, dispex_static_data_t *dispex_data) + dispex_static_data_t *dispex_data) { + nsresult nsres; + This->lpIHTMLFrameBaseVtbl = &HTMLFrameBaseVtbl; + This->lpIHTMLFrameBase2Vtbl = &HTMLFrameBase2Vtbl; HTMLElement_Init(&This->element, doc, nselem, dispex_data); - if(content_window) { - IHTMLWindow2_AddRef(HTMLWINDOW2(content_window)); - content_window->frame_element = This; - } - This->content_window = content_window; + nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&This->nsframe); + if(NS_FAILED(nsres)) { + nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&This->nsiframe); + if(NS_FAILED(nsres)) + ERR("Could not get nsIDOMHTML[I]Frame interface\n"); + }else + This->nsiframe = NULL; } typedef struct { @@ -299,28 +583,87 @@ static void HTMLFrameElement_destructor(HTMLDOMNode *iface) HTMLFrameBase_destructor(&This->framebase); } +static HRESULT HTMLFrameElement_get_document(HTMLDOMNode *iface, IDispatch **p) +{ + HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window || !This->framebase.content_window->doc) { + *p = NULL; + return S_OK; + } + + *p = (IDispatch*)HTMLDOC(&This->framebase.content_window->doc->basedoc); + IDispatch_AddRef(*p); + return S_OK; +} + +static HRESULT HTMLFrameElement_get_dispid(HTMLDOMNode *iface, BSTR name, + DWORD grfdex, DISPID *pid) +{ + HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window) + return DISP_E_UNKNOWNNAME; + + return search_window_props(This->framebase.content_window, name, grfdex, pid); +} + +static HRESULT HTMLFrameElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, + WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window) { + ERR("no content window to invoke on\n"); + return E_FAIL; + } + + return IDispatchEx_InvokeEx(DISPATCHEX(This->framebase.content_window), id, lcid, flags, params, res, ei, caller); +} + +static HRESULT HTMLFrameElement_bind_to_tree(HTMLDOMNode *iface) +{ + HTMLFrameElement *This = HTMLFRAME_NODE_THIS(iface); + nsIDOMDocument *nsdoc; + nsresult nsres; + HRESULT hres; + + nsres = nsIDOMHTMLFrameElement_GetContentDocument(This->framebase.nsframe, &nsdoc); + if(NS_FAILED(nsres) || !nsdoc) { + ERR("GetContentDocument failed: %08x\n", nsres); + return E_FAIL; + } + + hres = set_frame_doc(&This->framebase, nsdoc); + nsIDOMDocument_Release(nsdoc); + return hres; +} + #undef HTMLFRAME_NODE_THIS static const NodeImplVtbl HTMLFrameElementImplVtbl = { HTMLFrameElement_QI, - HTMLFrameElement_destructor + HTMLFrameElement_destructor, + NULL, + NULL, + NULL, + NULL, + HTMLFrameElement_get_document, + NULL, + HTMLFrameElement_get_dispid, + HTMLFrameElement_invoke, + HTMLFrameElement_bind_to_tree }; -HTMLElement *HTMLFrameElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLWindow *content_window) +HTMLElement *HTMLFrameElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) { - nsIDOMHTMLFrameElement *nsframe; HTMLFrameElement *ret; - nsresult nsres; ret = heap_alloc_zero(sizeof(HTMLFrameElement)); ret->framebase.element.node.vtbl = &HTMLFrameElementImplVtbl; - nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLFrameElement, (void**)&nsframe); - if(NS_FAILED(nsres)) - ERR("Could not get nsIDOMHTMLFrameElement iface: %08x\n", nsres); - - HTMLFrameBase_Init(&ret->framebase, doc, nselem, content_window, NULL); + HTMLFrameBase_Init(&ret->framebase, doc, nselem, NULL); return &ret->framebase.element; } diff --git a/reactos/dll/win32/mshtml/htmliframe.c b/reactos/dll/win32/mshtml/htmliframe.c index daef946c94d..ddb32c80ab2 100644 --- a/reactos/dll/win32/mshtml/htmliframe.c +++ b/reactos/dll/win32/mshtml/htmliframe.c @@ -33,189 +33,101 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); typedef struct { HTMLFrameBase framebase; - const IHTMLFrameBase2Vtbl *lpIHTMLFrameBase2Vtbl; - - LONG ref; - - nsIDOMHTMLIFrameElement *nsiframe; } HTMLIFrame; -#define HTMLFRAMEBASE2(x) (&(x)->lpIHTMLFrameBase2Vtbl) - -#define HTMLFRAMEBASE2_THIS(iface) DEFINE_THIS(HTMLIFrame, IHTMLFrameBase2, iface) - -static HRESULT WINAPI HTMLIFrameBase2_QueryInterface(IHTMLFrameBase2 *iface, REFIID riid, void **ppv) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - - return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->framebase.element.node), riid, ppv); -} - -static ULONG WINAPI HTMLIFrameBase2_AddRef(IHTMLFrameBase2 *iface) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - - return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->framebase.element.node)); -} - -static ULONG WINAPI HTMLIFrameBase2_Release(IHTMLFrameBase2 *iface) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - - return IHTMLDOMNode_Release(HTMLDOMNODE(&This->framebase.element.node)); -} - -static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfoCount(IHTMLFrameBase2 *iface, UINT *pctinfo) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_GetTypeInfo(IHTMLFrameBase2 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_GetIDsOfNames(IHTMLFrameBase2 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_Invoke(IHTMLFrameBase2 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - - TRACE("(%p)->(%p)\n", This, p); - - if(This->framebase.content_window) { - IHTMLWindow2_AddRef(HTMLWINDOW2(This->framebase.content_window)); - *p = HTMLWINDOW2(This->framebase.content_window); - }else { - WARN("NULL content window\n"); - *p = NULL; - } - return S_OK; -} - -static HRESULT WINAPI HTMLIFrameBase2_put_onload(IHTMLFrameBase2 *iface, VARIANT v) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_get_onload(IHTMLFrameBase2 *iface, VARIANT *p) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_put_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT v) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_get_onreadystatechange(IHTMLFrameBase2 *iface, VARIANT *p) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_get_readyState(IHTMLFrameBase2 *iface, BSTR *p) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_put_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL v) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%x)\n", This, v); - return E_NOTIMPL; -} - -static HRESULT WINAPI HTMLIFrameBase2_get_allowTransparency(IHTMLFrameBase2 *iface, VARIANT_BOOL *p) -{ - HTMLIFrame *This = HTMLFRAMEBASE2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; -} - -#undef HTMLFRAMEBASE2_THIS - -static const IHTMLFrameBase2Vtbl HTMLIFrameBase2Vtbl = { - HTMLIFrameBase2_QueryInterface, - HTMLIFrameBase2_AddRef, - HTMLIFrameBase2_Release, - HTMLIFrameBase2_GetTypeInfoCount, - HTMLIFrameBase2_GetTypeInfo, - HTMLIFrameBase2_GetIDsOfNames, - HTMLIFrameBase2_Invoke, - HTMLIFrameBase2_get_contentWindow, - HTMLIFrameBase2_put_onload, - HTMLIFrameBase2_get_onload, - HTMLIFrameBase2_put_onreadystatechange, - HTMLIFrameBase2_get_onreadystatechange, - HTMLIFrameBase2_get_readyState, - HTMLIFrameBase2_put_allowTransparency, - HTMLIFrameBase2_get_allowTransparency -}; - #define HTMLIFRAME_NODE_THIS(iface) DEFINE_THIS2(HTMLIFrame, framebase.element.node, iface) static HRESULT HTMLIFrame_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) { HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); - *ppv = NULL; - - if(IsEqualGUID(&IID_IHTMLFrameBase2, riid)) { - TRACE("(%p)->(IID_IHTMLFrameBase2 %p)\n", This, ppv); - *ppv = HTMLFRAMEBASE2(This); - }else { - return HTMLFrameBase_QI(&This->framebase, riid, ppv); - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return HTMLFrameBase_QI(&This->framebase, riid, ppv); } static void HTMLIFrame_destructor(HTMLDOMNode *iface) { HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); - if(This->nsiframe) - nsIDOMHTMLIFrameElement_Release(This->nsiframe); - HTMLFrameBase_destructor(&This->framebase); } +static HRESULT HTMLIFrame_get_document(HTMLDOMNode *iface, IDispatch **p) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window || !This->framebase.content_window->doc) { + *p = NULL; + return S_OK; + } + + *p = (IDispatch*)HTMLDOC(&This->framebase.content_window->doc->basedoc); + IDispatch_AddRef(*p); + return S_OK; +} + +static HRESULT HTMLIFrame_get_dispid(HTMLDOMNode *iface, BSTR name, + DWORD grfdex, DISPID *pid) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window) + return DISP_E_UNKNOWNNAME; + + return search_window_props(This->framebase.content_window, name, grfdex, pid); +} + +static HRESULT HTMLIFrame_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, + WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + if(!This->framebase.content_window) { + ERR("no content window to invoke on\n"); + return E_FAIL; + } + + return IDispatchEx_InvokeEx(DISPATCHEX(This->framebase.content_window), id, lcid, flags, params, res, ei, caller); +} + +static HRESULT HTMLIFrame_get_readystate(HTMLDOMNode *iface, BSTR *p) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + + return IHTMLFrameBase2_get_readyState(HTMLFRAMEBASE2(&This->framebase), p); +} + +static HRESULT HTMLIFrame_bind_to_tree(HTMLDOMNode *iface) +{ + HTMLIFrame *This = HTMLIFRAME_NODE_THIS(iface); + nsIDOMDocument *nsdoc; + nsresult nsres; + HRESULT hres; + + nsres = nsIDOMHTMLIFrameElement_GetContentDocument(This->framebase.nsiframe, &nsdoc); + if(NS_FAILED(nsres) || !nsdoc) { + ERR("GetContentDocument failed: %08x\n", nsres); + return E_FAIL; + } + + hres = set_frame_doc(&This->framebase, nsdoc); + nsIDOMDocument_Release(nsdoc); + return hres; +} + #undef HTMLIFRAME_NODE_THIS static const NodeImplVtbl HTMLIFrameImplVtbl = { HTMLIFrame_QI, - HTMLIFrame_destructor + HTMLIFrame_destructor, + NULL, + NULL, + NULL, + NULL, + HTMLIFrame_get_document, + HTMLIFrame_get_readystate, + HTMLIFrame_get_dispid, + HTMLIFrame_invoke, + HTMLIFrame_bind_to_tree }; static const tid_t HTMLIFrame_iface_tids[] = { @@ -236,55 +148,15 @@ static dispex_static_data_t HTMLIFrame_dispex = { HTMLIFrame_iface_tids }; -static HTMLWindow *get_content_window(nsIDOMHTMLIFrameElement *nsiframe) -{ - HTMLWindow *ret; - nsIDOMWindow *nswindow; - nsIDOMDocument *nsdoc; - nsresult nsres; - - nsres = nsIDOMHTMLIFrameElement_GetContentDocument(nsiframe, &nsdoc); - if(NS_FAILED(nsres)) { - ERR("GetContentDocument failed: %08x\n", nsres); - return NULL; - } - - if(!nsdoc) { - FIXME("NULL contentDocument\n"); - return NULL; - } - - nswindow = get_nsdoc_window(nsdoc); - nsIDOMDocument_Release(nsdoc); - if(!nswindow) - return NULL; - - ret = nswindow_to_window(nswindow); - nsIDOMWindow_Release(nswindow); - if(!ret) - ERR("Could not get window object\n"); - - return ret; -} - -HTMLElement *HTMLIFrame_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, HTMLWindow *content_window) +HTMLElement *HTMLIFrame_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) { HTMLIFrame *ret; - nsresult nsres; ret = heap_alloc_zero(sizeof(HTMLIFrame)); - ret->lpIHTMLFrameBase2Vtbl = &HTMLIFrameBase2Vtbl; ret->framebase.element.node.vtbl = &HTMLIFrameImplVtbl; - nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLIFrameElement, (void**)&ret->nsiframe); - if(NS_FAILED(nsres)) - ERR("Could not get nsIDOMHTMLIFrameElement iface: %08x\n", nsres); - - if(!content_window) - content_window = get_content_window(ret->nsiframe); - - HTMLFrameBase_Init(&ret->framebase, doc, nselem, content_window, &HTMLIFrame_dispex); + HTMLFrameBase_Init(&ret->framebase, doc, nselem, &HTMLIFrame_dispex); return &ret->framebase.element; } diff --git a/reactos/dll/win32/mshtml/htmlimg.c b/reactos/dll/win32/mshtml/htmlimg.c index bfccdd57b63..87fe498b9da 100644 --- a/reactos/dll/win32/mshtml/htmlimg.c +++ b/reactos/dll/win32/mshtml/htmlimg.c @@ -39,7 +39,7 @@ typedef struct { nsIDOMHTMLImageElement *nsimg; } HTMLImgElement; -#define HTMLIMG(x) (&(x)->lpHTMLImgElementVtbl) +#define HTMLIMG(x) ((IHTMLImgElement*) &(x)->lpHTMLImgElementVtbl) #define HTMLIMG_THIS(iface) DEFINE_THIS(HTMLImgElement, HTMLImgElement, iface) @@ -437,8 +437,24 @@ static HRESULT WINAPI HTMLImgElement_put_name(IHTMLImgElement *iface, BSTR v) static HRESULT WINAPI HTMLImgElement_get_name(IHTMLImgElement *iface, BSTR *p) { HTMLImgElement *This = HTMLIMG_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + nsAString strName; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsAString_Init(&strName, NULL); + nsres = nsIDOMHTMLImageElement_GetName(This->nsimg, &strName); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *str; + + nsAString_GetData(&strName, &str); + *p = *str ? SysAllocString(str) : NULL; + }else { + ERR("GetName failed: %08x\n", nsres); + } + nsAString_Finish(&strName); + + return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; } static HRESULT WINAPI HTMLImgElement_put_width(IHTMLImgElement *iface, LONG v) @@ -572,11 +588,24 @@ static void HTMLImgElement_destructor(HTMLDOMNode *iface) HTMLElement_destructor(&This->element.node); } +static HRESULT HTMLImgElement_get_readystate(HTMLDOMNode *iface, BSTR *p) +{ + HTMLImgElement *This = HTMLIMG_NODE_THIS(iface); + + return IHTMLImgElement_get_readyState(HTMLIMG(This), p); +} + #undef HTMLIMG_NODE_THIS static const NodeImplVtbl HTMLImgElementImplVtbl = { HTMLImgElement_QI, - HTMLImgElement_destructor + HTMLImgElement_destructor, + NULL, + NULL, + NULL, + NULL, + NULL, + HTMLImgElement_get_readystate }; static const tid_t HTMLImgElement_iface_tids[] = { diff --git a/reactos/dll/win32/mshtml/htmllocation.c b/reactos/dll/win32/mshtml/htmllocation.c index 3b91429bdb9..93df9e0ee2a 100644 --- a/reactos/dll/win32/mshtml/htmllocation.c +++ b/reactos/dll/win32/mshtml/htmllocation.c @@ -154,12 +154,12 @@ static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v) TRACE("(%p)->(%s)\n", This, debugstr_w(v)); - if(!This->window || !This->window->doc) { - FIXME("No document available\n"); + if(!This->window) { + FIXME("No window available\n"); return E_FAIL; } - return navigate_url(This->window->doc, v); + return navigate_url(This->window, v, This->window->url); } static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p) diff --git a/reactos/dll/win32/mshtml/htmlscreen.c b/reactos/dll/win32/mshtml/htmlscreen.c new file mode 100644 index 00000000000..cc3f4b2eb21 --- /dev/null +++ b/reactos/dll/win32/mshtml/htmlscreen.c @@ -0,0 +1,254 @@ +/* + * Copyright 2009 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +typedef struct { + DispatchEx dispex; + const IHTMLScreenVtbl *lpIHTMLScreenVtbl; + + LONG ref; +} HTMLScreen; + +#define HTMLSCREEN(x) ((IHTMLScreen*) &(x)->lpIHTMLScreenVtbl) + +#define HTMLSCREEN_THIS(iface) DEFINE_THIS(HTMLScreen, IHTMLScreen, iface) + +static HRESULT WINAPI HTMLScreen_QueryInterface(IHTMLScreen *iface, REFIID riid, void **ppv) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = HTMLSCREEN(This); + }else if(IsEqualGUID(&IID_IHTMLScreen, riid)) { + TRACE("(%p)->(IID_IHTMLScreen %p)\n", This, ppv); + *ppv = HTMLSCREEN(This); + }else if(dispex_query_interface(&This->dispex, riid, ppv)) { + return *ppv ? S_OK : E_NOINTERFACE; + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI HTMLScreen_AddRef(IHTMLScreen *iface) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI HTMLScreen_Release(IHTMLScreen *iface) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + release_dispex(&This->dispex); + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI HTMLScreen_GetTypeInfoCount(IHTMLScreen *iface, UINT *pctinfo) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_GetTypeInfo(IHTMLScreen *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_GetIDsOfNames(IHTMLScreen *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_Invoke(IHTMLScreen *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_colorDepth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + *p = GetDeviceCaps(get_display_dc(), BITSPIXEL); + return S_OK; +} + +static HRESULT WINAPI HTMLScreen_put_bufferDepth(IHTMLScreen *iface, LONG v) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%d)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_bufferDepth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_width(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + *p = GetDeviceCaps(get_display_dc(), HORZRES); + return S_OK; +} + +static HRESULT WINAPI HTMLScreen_get_height(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + *p = GetDeviceCaps(get_display_dc(), VERTRES); + return S_OK; +} + +static HRESULT WINAPI HTMLScreen_put_updateInterval(IHTMLScreen *iface, LONG v) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%d)\n", This, v); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_updateInterval(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_availHeight(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_availWidth(IHTMLScreen *iface, LONG *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLScreen_get_fontSmoothingEnabled(IHTMLScreen *iface, VARIANT_BOOL *p) +{ + HTMLScreen *This = HTMLSCREEN_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +#undef HTMLSCREEN_THIS + +static const IHTMLScreenVtbl HTMLSreenVtbl = { + HTMLScreen_QueryInterface, + HTMLScreen_AddRef, + HTMLScreen_Release, + HTMLScreen_GetTypeInfoCount, + HTMLScreen_GetTypeInfo, + HTMLScreen_GetIDsOfNames, + HTMLScreen_Invoke, + HTMLScreen_get_colorDepth, + HTMLScreen_put_bufferDepth, + HTMLScreen_get_bufferDepth, + HTMLScreen_get_width, + HTMLScreen_get_height, + HTMLScreen_put_updateInterval, + HTMLScreen_get_updateInterval, + HTMLScreen_get_availHeight, + HTMLScreen_get_availWidth, + HTMLScreen_get_fontSmoothingEnabled +}; + +static const tid_t HTMLScreen_iface_tids[] = { + IHTMLScreen_tid, + 0 +}; +static dispex_static_data_t HTMLScreen_dispex = { + NULL, + DispHTMLScreen_tid, + NULL, + HTMLScreen_iface_tids +}; + +HRESULT HTMLScreen_Create(IHTMLScreen **ret) +{ + HTMLScreen *screen; + + screen = heap_alloc_zero(sizeof(HTMLScreen)); + if(!screen) + return E_OUTOFMEMORY; + + screen->lpIHTMLScreenVtbl = &HTMLSreenVtbl; + screen->ref = 1; + + init_dispex(&screen->dispex, (IUnknown*)HTMLSCREEN(screen), &HTMLScreen_dispex); + + *ret = HTMLSCREEN(screen); + return S_OK; +} diff --git a/reactos/dll/win32/mshtml/htmlscript.c b/reactos/dll/win32/mshtml/htmlscript.c index a038c556d94..d86f3988932 100644 --- a/reactos/dll/win32/mshtml/htmlscript.c +++ b/reactos/dll/win32/mshtml/htmlscript.c @@ -39,7 +39,7 @@ typedef struct { nsIDOMHTMLScriptElement *nsscript; } HTMLScriptElement; -#define HTMLSCRIPT(x) (&(x)->lpHTMLScriptElementVtbl) +#define HTMLSCRIPT(x) ((IHTMLScriptElement*) &(x)->lpHTMLScriptElementVtbl) #define HTMLSCRIPT_THIS(iface) DEFINE_THIS(HTMLScriptElement, HTMLScriptElement, iface) @@ -299,11 +299,24 @@ static void HTMLScriptElement_destructor(HTMLDOMNode *iface) HTMLElement_destructor(&This->element.node); } +static HRESULT HTMLScriptElement_get_readystate(HTMLDOMNode *iface, BSTR *p) +{ + HTMLScriptElement *This = HTMLSCRIPT_NODE_THIS(iface); + + return IHTMLScriptElement_get_readyState(HTMLSCRIPT(This), p); +} + #undef HTMLSCRIPT_NODE_THIS static const NodeImplVtbl HTMLScriptElementImplVtbl = { HTMLScriptElement_QI, - HTMLScriptElement_destructor + HTMLScriptElement_destructor, + NULL, + NULL, + NULL, + NULL, + NULL, + HTMLScriptElement_get_readystate }; HTMLElement *HTMLScriptElement_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) diff --git a/reactos/dll/win32/mshtml/htmlstyle.c b/reactos/dll/win32/mshtml/htmlstyle.c index 13ac74e124b..467464ac919 100644 --- a/reactos/dll/win32/mshtml/htmlstyle.c +++ b/reactos/dll/win32/mshtml/htmlstyle.c @@ -49,6 +49,8 @@ static const WCHAR attrBackgroundRepeat[] = {'b','a','c','k','g','r','o','u','n','d','-','r','e','p','e','a','t',0}; static const WCHAR attrBorder[] = {'b','o','r','d','e','r',0}; +static const WCHAR attrBorderBottom[] = + {'b','o','r','d','e','r','-','b','o','t','t','o','m',0}; static const WCHAR attrBorderBottomColor[] = {'b','o','r','d','e','r','-','b','o','t','t','o','m','-','c','o','l','o','r',0}; static const WCHAR attrBorderBottomStyle[] = @@ -65,12 +67,16 @@ static const WCHAR attrBorderLeftStyle[] = {'b','o','r','d','e','r','-','l','e','f','t','-','s','t','y','l','e',0}; static const WCHAR attrBorderLeftWidth[] = {'b','o','r','d','e','r','-','l','e','f','t','-','w','i','d','t','h',0}; +static const WCHAR attrBorderRight[] = + {'b','o','r','d','e','r','-','r','i','g','h','t',0}; static const WCHAR attrBorderRightColor[] = {'b','o','r','d','e','r','-','r','i','g','h','t','-','c','o','l','o','r',0}; static const WCHAR attrBorderRightStyle[] = {'b','o','r','d','e','r','-','r','i','g','h','t','-','s','t','y','l','e',0}; static const WCHAR attrBorderRightWidth[] = {'b','o','r','d','e','r','-','r','i','g','h','t','-','w','i','d','t','h',0}; +static const WCHAR attrBorderTop[] = + {'b','o','r','d','e','r','-','t','o','p',0}; static const WCHAR attrBorderTopColor[] = {'b','o','r','d','e','r','-','t','o','p','-','c','o','l','o','r',0}; static const WCHAR attrBorderStyle[] = @@ -167,6 +173,7 @@ static const struct{ {attrBackgroundPositionY, DISPID_IHTMLSTYLE_BACKGROUNDPOSITIONY}, {attrBackgroundRepeat, DISPID_IHTMLSTYLE_BACKGROUNDREPEAT}, {attrBorder, DISPID_IHTMLSTYLE_BORDER}, + {attrBorderBottom, DISPID_IHTMLSTYLE_BORDERBOTTOM}, {attrBorderBottomColor, DISPID_IHTMLSTYLE_BORDERBOTTOMCOLOR}, {attrBorderBottomStyle, DISPID_IHTMLSTYLE_BORDERBOTTOMSTYLE}, {attrBorderBottomWidth, DISPID_IHTMLSTYLE_BORDERBOTTOMWIDTH}, @@ -175,10 +182,12 @@ static const struct{ {attrBorderLeftColor, DISPID_IHTMLSTYLE_BORDERLEFTCOLOR}, {attrBorderLeftStyle, DISPID_IHTMLSTYLE_BORDERLEFTSTYLE}, {attrBorderLeftWidth, DISPID_IHTMLSTYLE_BORDERLEFTWIDTH}, + {attrBorderRight, DISPID_IHTMLSTYLE_BORDERRIGHT}, {attrBorderRightColor, DISPID_IHTMLSTYLE_BORDERRIGHTCOLOR}, {attrBorderRightStyle, DISPID_IHTMLSTYLE_BORDERRIGHTSTYLE}, {attrBorderRightWidth, DISPID_IHTMLSTYLE_BORDERRIGHTWIDTH}, {attrBorderStyle, DISPID_IHTMLSTYLE_BORDERSTYLE}, + {attrBorderTop, DISPID_IHTMLSTYLE_BORDERTOP}, {attrBorderTopColor, DISPID_IHTMLSTYLE_BORDERTOPCOLOR}, {attrBorderTopStyle, DISPID_IHTMLSTYLE_BORDERTOPSTYLE}, {attrBorderTopWidth, DISPID_IHTMLSTYLE_BORDERTOPWIDTH}, @@ -1210,15 +1219,19 @@ static HRESULT WINAPI HTMLStyle_get_lineHeight(IHTMLStyle *iface, VARIANT *p) static HRESULT WINAPI HTMLStyle_put_marginTop(IHTMLStyle *iface, VARIANT v) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(v%d)\n", This, V_VT(&v)); - return E_NOTIMPL; + + TRACE("(%p)->(v%d)\n", This, V_VT(&v)); + + return set_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_TOP, &v, 0); } static HRESULT WINAPI HTMLStyle_get_marginTop(IHTMLStyle *iface, VARIANT *p) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_nsstyle_attr_var(This->nsstyle, STYLEID_MARGIN_TOP, p, 0); } static HRESULT WINAPI HTMLStyle_put_marginRight(IHTMLStyle *iface, VARIANT v) @@ -1433,43 +1446,43 @@ static HRESULT WINAPI HTMLStyle_get_border(IHTMLStyle *iface, BSTR *p) static HRESULT WINAPI HTMLStyle_put_borderTop(IHTMLStyle *iface, BSTR v) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + return set_style_attr(This, STYLEID_BORDER_TOP, v, ATTR_FIX_PX); } static HRESULT WINAPI HTMLStyle_get_borderTop(IHTMLStyle *iface, BSTR *p) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + return get_style_attr(This, STYLEID_BORDER_TOP, p); } static HRESULT WINAPI HTMLStyle_put_borderRight(IHTMLStyle *iface, BSTR v) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + return set_style_attr(This, STYLEID_BORDER_RIGHT, v, ATTR_FIX_PX); } static HRESULT WINAPI HTMLStyle_get_borderRight(IHTMLStyle *iface, BSTR *p) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + return get_style_attr(This, STYLEID_BORDER_RIGHT, p); } static HRESULT WINAPI HTMLStyle_put_borderBottom(IHTMLStyle *iface, BSTR v) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + return set_style_attr(This, STYLEID_BORDER_BOTTOM, v, ATTR_FIX_PX); } static HRESULT WINAPI HTMLStyle_get_borderBottom(IHTMLStyle *iface, BSTR *p) { HTMLStyle *This = HTMLSTYLE_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + return get_style_attr(This, STYLEID_BORDER_BOTTOM, p); } static HRESULT WINAPI HTMLStyle_put_borderLeft(IHTMLStyle *iface, BSTR v) diff --git a/reactos/dll/win32/mshtml/htmlstyle.h b/reactos/dll/win32/mshtml/htmlstyle.h index 4252caa572d..7168eec429d 100644 --- a/reactos/dll/win32/mshtml/htmlstyle.h +++ b/reactos/dll/win32/mshtml/htmlstyle.h @@ -42,6 +42,7 @@ typedef enum { STYLEID_BACKGROUND_POSITION_Y, STYLEID_BACKGROUND_REPEAT, STYLEID_BORDER, + STYLEID_BORDER_BOTTOM, STYLEID_BORDER_BOTTOM_COLOR, STYLEID_BORDER_BOTTOM_STYLE, STYLEID_BORDER_BOTTOM_WIDTH, @@ -50,10 +51,12 @@ typedef enum { STYLEID_BORDER_LEFT_COLOR, STYLEID_BORDER_LEFT_STYLE, STYLEID_BORDER_LEFT_WIDTH, + STYLEID_BORDER_RIGHT, STYLEID_BORDER_RIGHT_COLOR, STYLEID_BORDER_RIGHT_STYLE, STYLEID_BORDER_RIGHT_WIDTH, STYLEID_BORDER_STYLE, + STYLEID_BORDER_TOP, STYLEID_BORDER_TOP_COLOR, STYLEID_BORDER_TOP_STYLE, STYLEID_BORDER_TOP_WIDTH, diff --git a/reactos/dll/win32/mshtml/htmlstyle2.c b/reactos/dll/win32/mshtml/htmlstyle2.c index ff5fff0c09e..aa9531c438e 100644 --- a/reactos/dll/win32/mshtml/htmlstyle2.c +++ b/reactos/dll/win32/mshtml/htmlstyle2.c @@ -212,15 +212,19 @@ static HRESULT WINAPI HTMLStyle2_get_bottom(IHTMLStyle2 *iface, VARIANT *p) static HRESULT WINAPI HTMLStyle2_put_right(IHTMLStyle2 *iface, VARIANT v) { HTMLStyle *This = HTMLSTYLE2_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_nsstyle_attr_var(This->nsstyle, STYLEID_RIGHT, &v, 0); } static HRESULT WINAPI HTMLStyle2_get_right(IHTMLStyle2 *iface, VARIANT *p) { HTMLStyle *This = HTMLSTYLE2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_nsstyle_attr_var(This->nsstyle, STYLEID_RIGHT, p, 0); } static HRESULT WINAPI HTMLStyle2_put_pixelBottom(IHTMLStyle2 *iface, LONG v) diff --git a/reactos/dll/win32/mshtml/htmlstyle3.c b/reactos/dll/win32/mshtml/htmlstyle3.c index 505e91e01d1..56fd3df3bc7 100644 --- a/reactos/dll/win32/mshtml/htmlstyle3.c +++ b/reactos/dll/win32/mshtml/htmlstyle3.c @@ -103,7 +103,15 @@ static HRESULT WINAPI HTMLStyle3_get_layoutFlow(IHTMLStyle3 *iface, BSTR *p) static HRESULT WINAPI HTMLStyle3_put_zoom(IHTMLStyle3 *iface, VARIANT v) { HTMLStyle *This = HTMLSTYLE3_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_variant(&v)); + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + /* zoom property is IE CSS extension that is mostly used as a hack to workaround IE bugs. + * The value is set to 1 then. We can safely ignore setting zoom to 1. */ + if(V_VT(&v) == VT_I4 && V_I4(&v) == 1) + return S_OK; + + FIXME("stub for %s\n", debugstr_variant(&v)); return E_NOTIMPL; } diff --git a/reactos/dll/win32/mshtml/htmltable.c b/reactos/dll/win32/mshtml/htmltable.c index 76997486117..6357f77e4ba 100644 --- a/reactos/dll/win32/mshtml/htmltable.c +++ b/reactos/dll/win32/mshtml/htmltable.c @@ -584,7 +584,7 @@ HTMLElement *HTMLTable_Create(HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem) HTMLElement_Init(&ret->element, doc, nselem, &HTMLTable_dispex); - ConnectionPoint_Init(&ret->cp, &ret->element.cp_container, &DIID_HTMLTableEvents); + ConnectionPoint_Init(&ret->cp, &ret->element.cp_container, &DIID_HTMLTableEvents, NULL); nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLTableElement, (void**)&ret->nstable); if(NS_FAILED(nsres)) diff --git a/reactos/dll/win32/mshtml/htmltextcont.c b/reactos/dll/win32/mshtml/htmltextcont.c index 35fa01b1f83..46b5d87b842 100644 --- a/reactos/dll/win32/mshtml/htmltextcont.c +++ b/reactos/dll/win32/mshtml/htmltextcont.c @@ -189,5 +189,5 @@ void HTMLTextContainer_Init(HTMLTextContainer *This, HTMLDocumentNode *doc, nsID HTMLElement_Init(&This->element, doc, nselem, dispex_data); - ConnectionPoint_Init(&This->cp, &This->element.cp_container, &DIID_HTMLTextContainerEvents); + ConnectionPoint_Init(&This->cp, &This->element.cp_container, &DIID_HTMLTextContainerEvents, NULL); } diff --git a/reactos/dll/win32/mshtml/htmltextnode.c b/reactos/dll/win32/mshtml/htmltextnode.c index 799a13755eb..1c2c2daca8b 100644 --- a/reactos/dll/win32/mshtml/htmltextnode.c +++ b/reactos/dll/win32/mshtml/htmltextnode.c @@ -35,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); struct HTMLDOMTextNode { HTMLDOMNode node; const IHTMLDOMTextNodeVtbl *lpIHTMLDOMTextNodeVtbl; + + nsIDOMText *nstext; }; #define HTMLTEXT(x) (&(x)->lpIHTMLDOMTextNodeVtbl) @@ -119,8 +121,17 @@ static HRESULT WINAPI HTMLDOMTextNode_toString(IHTMLDOMTextNode *iface, BSTR *St static HRESULT WINAPI HTMLDOMTextNode_get_length(IHTMLDOMTextNode *iface, LONG *p) { HTMLDOMTextNode *This = HTMLTEXT_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + PRUint32 length = 0; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsres = nsIDOMText_GetLength(This->nstext, &length); + if(NS_FAILED(nsres)) + ERR("GetLength failed: %08x\n", nsres); + + *p = length; + return S_OK; } static HRESULT WINAPI HTMLDOMTextNode_splitText(IHTMLDOMTextNode *iface, LONG offset, IHTMLDOMNode **pRetNode) @@ -170,6 +181,9 @@ static void HTMLDOMTextNode_destructor(HTMLDOMNode *iface) { HTMLDOMTextNode *This = HTMLTEXT_NODE_THIS(iface); + if(This->nstext) + IHTMLDOMTextNode_Release(This->nstext); + HTMLDOMNode_destructor(&This->node); } @@ -195,7 +209,8 @@ static dispex_static_data_t HTMLDOMTextNode_dispex = { HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode) { - HTMLDOMTextNode *ret ; + HTMLDOMTextNode *ret; + nsresult nsres; ret = heap_alloc_zero(sizeof(*ret)); ret->node.vtbl = &HTMLDOMTextNodeImplVtbl; @@ -204,5 +219,9 @@ HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode) init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex); HTMLDOMNode_Init(doc, &ret->node, nsnode); + nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&ret->nstext); + if(NS_FAILED(nsres)) + ERR("Could not get nsIDOMText iface: %08x\n", nsres); + return &ret->node; } diff --git a/reactos/dll/win32/mshtml/htmlwindow.c b/reactos/dll/win32/mshtml/htmlwindow.c index 9f3b3e7f0c0..4a2babee06d 100644 --- a/reactos/dll/win32/mshtml/htmlwindow.c +++ b/reactos/dll/win32/mshtml/htmlwindow.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "mshtmdid.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -100,6 +101,42 @@ static void release_children(HTMLWindow *This) } } +static HRESULT get_location(HTMLWindow *This, HTMLLocation **ret) +{ + if(This->location) { + IHTMLLocation_AddRef(HTMLLOCATION(This->location)); + }else { + HRESULT hres; + + hres = HTMLLocation_Create(This, &This->location); + if(FAILED(hres)) + return hres; + } + + *ret = This->location; + return S_OK; +} + +static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) +{ + if(!window->doc) { + FIXME("No document\n"); + return E_FAIL; + } + + return set_event_handler(&window->doc->body_event_target, window->doc, eid, var); +} + +static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) +{ + if(!window->doc) { + FIXME("No document\n"); + return E_FAIL; + } + + return get_event_handler(&window->doc->body_event_target, eid, var); +} + #define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface) static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) @@ -126,6 +163,9 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) { TRACE("(%p)->(IID_IHTMLWindow3 %p)\n", This, ppv); *ppv = HTMLWINDOW3(This); + }else if(IsEqualGUID(&IID_IHTMLWindow4, riid)) { + TRACE("(%p)->(IID_IHTMLWindow4 %p)\n", This, ppv); + *ppv = HTMLWINDOW4(This); }else if(dispex_query_interface(&This->dispex, riid, ppv)) { return *ppv ? S_OK : E_NOINTERFACE; } @@ -165,6 +205,9 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) window_set_docnode(This, NULL); release_children(This); + if(This->frame_element) + This->frame_element->content_window = NULL; + if(This->option_factory) { This->option_factory->window = NULL; IHTMLOptionElementFactory_Release(HTMLOPTFACTORY(This->option_factory)); @@ -180,8 +223,9 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) IHTMLLocation_Release(HTMLLOCATION(This->location)); } - if(This->event_target) - release_event_target(This->event_target); + if(This->screen) + IHTMLScreen_Release(This->screen); + for(i=0; i < This->global_prop_cnt; i++) heap_free(This->global_props[i].name); @@ -190,6 +234,10 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) heap_free(This->global_props); release_script_hosts(This); + + if(This->nswindow) + nsIDOMWindow_Release(This->nswindow); + list_remove(&This->entry); release_dispex(&This->dispex); heap_free(This); @@ -232,11 +280,122 @@ static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMembe pVarResult, pExcepInfo, puArgErr); } +static HRESULT get_frame_by_index(nsIDOMWindowCollection *nsFrames, PRUint32 index, HTMLWindow **ret) +{ + PRUint32 length; + nsIDOMWindow *nsWindow; + nsresult nsres; + + nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length); + if(NS_FAILED(nsres)) { + FIXME("nsIDOMWindowCollection_GetLength failed: 0x%08x\n", nsres); + return E_FAIL; + } + + if(index >= length) + return DISP_E_MEMBERNOTFOUND; + + nsres = nsIDOMWindowCollection_Item(nsFrames, index, &nsWindow); + if(NS_FAILED(nsres)) { + FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres); + return E_FAIL; + } + + *ret = nswindow_to_window(nsWindow); + + nsIDOMWindow_Release(nsWindow); + + return S_OK; +} + static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pvarIndex, pvarResult); - return E_NOTIMPL; + nsIDOMWindowCollection *nsFrames; + HTMLWindow *window; + HRESULT hres; + nsresult nsres; + + TRACE("(%p)->(%p %p)\n", This, pvarIndex, pvarResult); + + nsres = nsIDOMWindow_GetFrames(This->nswindow, &nsFrames); + if(NS_FAILED(nsres)) { + FIXME("nsIDOMWindow_GetFrames failed: 0x%08x\n", nsres); + return E_FAIL; + } + + if(V_VT(pvarIndex) == VT_I4) { + int index = V_I4(pvarIndex); + TRACE("Getting index %d\n", index); + if(index < 0) { + hres = DISP_E_MEMBERNOTFOUND; + goto cleanup; + } + hres = get_frame_by_index(nsFrames, index, &window); + if(FAILED(hres)) + goto cleanup; + }else if(V_VT(pvarIndex) == VT_UINT) { + unsigned int index = V_UINT(pvarIndex); + TRACE("Getting index %u\n", index); + hres = get_frame_by_index(nsFrames, index, &window); + if(FAILED(hres)) + goto cleanup; + }else if(V_VT(pvarIndex) == VT_BSTR) { + BSTR str = V_BSTR(pvarIndex); + PRUint32 length, i; + + TRACE("Getting name %s\n", wine_dbgstr_w(str)); + + nsres = nsIDOMWindowCollection_GetLength(nsFrames, &length); + + window = NULL; + for(i = 0; i < length && !window; ++i) { + HTMLWindow *cur_window; + nsIDOMWindow *nsWindow; + BSTR id; + + nsres = nsIDOMWindowCollection_Item(nsFrames, i, &nsWindow); + if(NS_FAILED(nsres)) { + FIXME("nsIDOMWindowCollection_Item failed: 0x%08x\n", nsres); + hres = E_FAIL; + goto cleanup; + } + + cur_window = nswindow_to_window(nsWindow); + + nsIDOMWindow_Release(nsWindow); + + hres = IHTMLElement_get_id(HTMLELEM(&cur_window->frame_element->element), &id); + if(FAILED(hres)) { + FIXME("IHTMLElement_get_id failed: 0x%08x\n", hres); + goto cleanup; + } + + if(!strcmpW(id, str)) + window = cur_window; + + SysFreeString(id); + } + + if(!window) { + hres = DISP_E_MEMBERNOTFOUND; + goto cleanup; + } + }else { + hres = E_INVALIDARG; + goto cleanup; + } + + IHTMLWindow2_AddRef(HTMLWINDOW2(window)); + V_VT(pvarResult) = VT_DISPATCH; + V_DISPATCH(pvarResult) = (IDispatch*)window; + + hres = S_OK; + +cleanup: + nsIDOMWindowCollection_Release(nsFrames); + + return hres; } static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p) @@ -268,8 +427,12 @@ static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p) static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + FIXME("(%p)->(%p): semi-stub\n", This, p); + + /* FIXME: Should return a separate Window object */ + *p = (IHTMLFramesCollection2*)HTMLWINDOW2(This); + HTMLWindow2_AddRef(iface); + return S_OK; } static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v) @@ -472,20 +635,16 @@ static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageEleme static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); + HTMLLocation *location; + HRESULT hres; TRACE("(%p)->(%p)\n", This, p); - if(This->location) { - IHTMLLocation_AddRef(HTMLLOCATION(This->location)); - }else { - HRESULT hres; + hres = get_location(This, &location); + if(FAILED(hres)) + return hres; - hres = HTMLLocation_Create(This, &This->location); - if(FAILED(hres)) - return hres; - } - - *p = HTMLLOCATION(This->location); + *p = HTMLLOCATION(location); return S_OK; } @@ -578,8 +737,15 @@ static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p) static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", This, p); + + if(This->parent) { + *p = HTMLWINDOW2(This->parent); + IHTMLWindow2_AddRef(*p); + }else + *p = NULL; + + return S_OK; } static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name, @@ -605,9 +771,16 @@ static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p) { - HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + HTMLWindow *This = HTMLWINDOW2_THIS(iface), *curr; + TRACE("(%p)->(%p)\n", This, p); + + curr = This; + while(curr->parent) + curr = curr->parent; + *p = HTMLWINDOW2(curr); + IHTMLWindow2_AddRef(*p); + + return S_OK; } static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p) @@ -738,15 +911,19 @@ static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p) static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(v(%d))\n", This, V_VT(&v)); - return E_NOTIMPL; + + TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); + + return set_window_event(This, EVENTID_RESIZE, &v); } static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + return get_window_event(This, EVENTID_RESIZE, p); } static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v) @@ -818,8 +995,20 @@ static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VA static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p) { HTMLWindow *This = HTMLWINDOW2_THIS(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, p); + + if(!This->screen) { + HRESULT hres; + + hres = HTMLScreen_Create(&This->screen); + if(FAILED(hres)) + return hres; + } + + *p = This->screen; + IHTMLScreen_AddRef(This->screen); + return S_OK; } static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p) @@ -1220,7 +1409,12 @@ static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, I TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult); - return attach_event(&This->event_target, &This->doc_obj->basedoc, event, pDisp, pfResult); + if(!This->doc) { + FIXME("No document\n"); + return E_FAIL; + } + + return attach_event(&This->doc->body_event_target, &This->doc->basedoc, event, pDisp, pfResult); } static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp) @@ -1354,6 +1548,99 @@ static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = { HTMLWindow3_showModelessDialog }; +#define HTMLWINDOW4_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow4, iface) + +static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID riid, void **ppv) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv); +} + +static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IHTMLWindow2_AddRef(HTMLWINDOW2(This)); +} + +static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IHTMLWindow2_Release(HTMLWINDOW2(This)); +} + +static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo); +} + +static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo); +} + +static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId); +} + +static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + + return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); +} + +static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn, + IDispatch **ppPopup) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, varArgIn, ppPopup); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLWindow4_get_frameElement(IHTMLWindow4 *iface, IHTMLFrameBase **p) +{ + HTMLWindow *This = HTMLWINDOW4_THIS(iface); + TRACE("(%p)->(%p)\n", This, p); + + if(This->frame_element) { + *p = HTMLFRAMEBASE(This->frame_element); + IHTMLFrameBase_AddRef(*p); + }else + *p = NULL; + + return S_OK; +} + +#undef HTMLWINDOW4_THIS + +static const IHTMLWindow4Vtbl HTMLWindow4Vtbl = { + HTMLWindow4_QueryInterface, + HTMLWindow4_AddRef, + HTMLWindow4_Release, + HTMLWindow4_GetTypeInfoCount, + HTMLWindow4_GetTypeInfo, + HTMLWindow4_GetIDsOfNames, + HTMLWindow4_Invoke, + HTMLWindow4_createPopup, + HTMLWindow4_get_frameElement +}; + #define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface) static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) @@ -1457,15 +1744,11 @@ static inline DWORD prop_to_dispid(HTMLWindow *This, global_prop_t *prop) return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props); } -static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +HRESULT search_window_props(HTMLWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid) { - HTMLWindow *This = DISPEX_THIS(iface); + DWORD i; ScriptHost *script_host; DISPID id; - DWORD i; - HRESULT hres; - - TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); for(i=0; i < This->global_prop_cnt; i++) { /* FIXME: case sensitivity */ @@ -1489,6 +1772,20 @@ static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, return S_OK; } + return DISP_E_UNKNOWNNAME; +} + +static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +{ + HTMLWindow *This = DISPEX_THIS(iface); + HRESULT hres; + + TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); + + hres = search_window_props(This, bstrName, grfdex, pid); + if(hres != DISP_E_UNKNOWNNAME) + return hres; + hres = IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid); if(hres != DISP_E_UNKNOWNNAME) return hres; @@ -1520,6 +1817,21 @@ static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(id == DISPID_IHTMLWINDOW2_LOCATION && (wFlags & DISPATCH_PROPERTYPUT)) { + HTMLLocation *location; + HRESULT hres; + + TRACE("forwarding to location.href\n"); + + hres = get_location(This, &location); + if(FAILED(hres)) + return hres; + + hres = IDispatchEx_InvokeEx(DISPATCHEX(&location->dispex), DISPID_VALUE, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + IHTMLLocation_Release(HTMLLOCATION(location)); + return hres; + } + return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); } @@ -1601,6 +1913,7 @@ static const IDispatchExVtbl WindowDispExVtbl = { static const tid_t HTMLWindow_iface_tids[] = { IHTMLWindow2_tid, IHTMLWindow3_tid, + IHTMLWindow4_tid, 0 }; @@ -1633,6 +1946,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML window->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl; window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl; + window->lpHTMLWindow4Vtbl = &HTMLWindow4Vtbl; window->lpIDispatchExVtbl = &WindowDispExVtbl; window->ref = 1; window->doc_obj = doc_obj; diff --git a/reactos/dll/win32/mshtml/install.c b/reactos/dll/win32/mshtml/install.c index 58ac724a2e7..e47c28423d0 100644 --- a/reactos/dll/win32/mshtml/install.c +++ b/reactos/dll/win32/mshtml/install.c @@ -47,7 +47,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); -#define GECKO_FILE_NAME "wine_gecko-" GECKO_VERSION "-x86.cab" +#ifdef __i386__ +#define GECKO_ARCH "x86" +#else +#define GECKO_ARCH "" +#endif + +#define GECKO_FILE_NAME "wine_gecko-" GECKO_VERSION "-" GECKO_ARCH ".cab" static const WCHAR mshtml_keyW[] = {'S','o','f','t','w','a','r','e', @@ -187,7 +193,7 @@ static BOOL install_from_unix_file(const char *file_name) int fd; BOOL ret; - static WCHAR *(*wine_get_dos_file_name)(const char*); + static WCHAR * (CDECL *wine_get_dos_file_name)(const char*); static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2','.','d','l','l',0}; fd = open(file_name, O_RDONLY); @@ -430,7 +436,8 @@ static LPWSTR get_url(void) static const WCHAR wszGeckoUrl[] = {'G','e','c','k','o','U','r','l',0}; static const WCHAR httpW[] = {'h','t','t','p'}; - static const WCHAR v_formatW[] = {'?','a','r','c','h','=','x','8','6','&','v','=',0}; + static const WCHAR arch_formatW[] = {'?','a','r','c','h','='}; + static const WCHAR v_formatW[] = {'&','v','='}; /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */ res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey); @@ -448,8 +455,15 @@ static LPWSTR get_url(void) } if(returned_size > sizeof(httpW) && !memcmp(url, httpW, sizeof(httpW))) { - strcatW(url, v_formatW); - MultiByteToWideChar(CP_ACP, 0, GECKO_VERSION, -1, url+strlenW(url), size/sizeof(WCHAR)-strlenW(url)); + DWORD len; + + len = strlenW(url); + memcpy(url+len, arch_formatW, sizeof(arch_formatW)); + len += sizeof(arch_formatW)/sizeof(WCHAR); + len += MultiByteToWideChar(CP_ACP, 0, GECKO_ARCH, sizeof(GECKO_ARCH), url+len, size/sizeof(WCHAR)-len)-1; + memcpy(url+len, v_formatW, sizeof(v_formatW)); + len += sizeof(v_formatW)/sizeof(WCHAR); + MultiByteToWideChar(CP_ACP, 0, GECKO_VERSION, -1, url+len, size/sizeof(WCHAR)-len); } TRACE("Got URL %s\n", debugstr_w(url)); @@ -512,6 +526,9 @@ BOOL install_wine_gecko(BOOL silent) { HANDLE hsem; + if(!*GECKO_ARCH) + return FALSE; + SetLastError(ERROR_SUCCESS); hsem = CreateSemaphoreA( NULL, 0, 1, "mshtml_install_semaphore"); diff --git a/reactos/dll/win32/mshtml/main.c b/reactos/dll/win32/mshtml/main.c index 6a358e5492a..1e300661b1b 100644 --- a/reactos/dll/win32/mshtml/main.c +++ b/reactos/dll/win32/mshtml/main.c @@ -47,6 +47,7 @@ HINSTANCE hInst; DWORD mshtml_tls = TLS_OUT_OF_INDEXES; static HINSTANCE shdoclc = NULL; +static HDC display_dc; static void thread_detach(void) { @@ -71,6 +72,8 @@ static void process_detach(void) FreeLibrary(shdoclc); if(mshtml_tls != TLS_OUT_OF_INDEXES) TlsFree(mshtml_tls); + if(display_dc) + DeleteObject(display_dc); } HINSTANCE get_shdoclc(void) @@ -84,6 +87,21 @@ HINSTANCE get_shdoclc(void) return shdoclc = LoadLibraryExW(wszShdoclc, NULL, LOAD_LIBRARY_AS_DATAFILE); } +HDC get_display_dc(void) +{ + static const WCHAR displayW[] = {'D','I','S','P','L','A','Y',0}; + + if(!display_dc) { + HDC hdc; + + hdc = CreateICW(displayW, NULL, NULL, NULL); + if(InterlockedCompareExchangePointer((void**)&display_dc, hdc, NULL)) + DeleteObject(hdc); + } + + return display_dc; +} + BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) { diff --git a/reactos/dll/win32/mshtml/mshtml.rbuild b/reactos/dll/win32/mshtml/mshtml.rbuild index 97f9dd1be94..562a68aac01 100644 --- a/reactos/dll/win32/mshtml/mshtml.rbuild +++ b/reactos/dll/win32/mshtml/mshtml.rbuild @@ -29,6 +29,7 @@ htmlelem3.c htmlelemcol.c htmlevent.c + htmlform.c htmlframebase.c htmlgeneric.c htmliframe.c @@ -37,6 +38,7 @@ htmllocation.c htmlnode.c htmloption.c + htmlscreen.c htmlscript.c htmlselect.c htmlstyle.c diff --git a/reactos/dll/win32/mshtml/mshtml_private.h b/reactos/dll/win32/mshtml/mshtml_private.h index 43601ae9ddf..68b3393d868 100644 --- a/reactos/dll/win32/mshtml/mshtml_private.h +++ b/reactos/dll/win32/mshtml/mshtml_private.h @@ -18,6 +18,7 @@ #include "wingdi.h" #include "docobj.h" +#include "comcat.h" #include "mshtml.h" #include "mshtmhst.h" #include "hlink.h" @@ -51,7 +52,6 @@ typedef struct HTMLDOMNode HTMLDOMNode; typedef struct ConnectionPoint ConnectionPoint; typedef struct BSCallback BSCallback; -typedef struct nsChannelBSC nsChannelBSC; typedef struct event_target_t event_target_t; /* NOTE: make sure to keep in sync with dispex.c */ @@ -66,6 +66,7 @@ typedef enum { DispHTMLDocument_tid, DispHTMLDOMTextNode_tid, DispHTMLElementCollection_tid, + DispHTMLFormElement_tid, DispHTMLGenericElement_tid, DispHTMLIFrame_tid, DispHTMLImg_tid, @@ -73,12 +74,14 @@ typedef enum { DispHTMLLocation_tid, DispHTMLNavigator_tid, DispHTMLOptionElement_tid, + DispHTMLScreen_tid, DispHTMLSelectElement_tid, DispHTMLStyle_tid, DispHTMLTable_tid, DispHTMLTableRow_tid, DispHTMLUnknownElement_tid, DispHTMLWindow2_tid, + HTMLDocumentEvents_tid, IHTMLAnchorElement_tid, IHTMLBodyElement_tid, IHTMLBodyElement2_tid, @@ -101,6 +104,8 @@ typedef enum { IHTMLElement4_tid, IHTMLElementCollection_tid, IHTMLEventObj_tid, + IHTMLFiltersCollection_tid, + IHTMLFormElement_tid, IHTMLFrameBase_tid, IHTMLFrameBase2_tid, IHTMLGenericElement_tid, @@ -109,6 +114,7 @@ typedef enum { IHTMLInputElement_tid, IHTMLLocation_tid, IHTMLOptionElement_tid, + IHTMLScreen_tid, IHTMLSelectElement_tid, IHTMLStyle_tid, IHTMLStyle2_tid, @@ -120,6 +126,7 @@ typedef enum { IHTMLUniqueName_tid, IHTMLWindow2_tid, IHTMLWindow3_tid, + IHTMLWindow4_tid, IOmNavigator_tid, LAST_tid } tid_t; @@ -156,6 +163,7 @@ void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*); void release_dispex(DispatchEx*); BOOL dispex_query_interface(DispatchEx*,REFIID,void**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); +HRESULT get_dispids(tid_t,DWORD*,DISPID**); typedef struct HTMLDocumentNode HTMLDocumentNode; typedef struct HTMLDocumentObj HTMLDocumentObj; @@ -215,6 +223,7 @@ struct HTMLWindow { DispatchEx dispex; const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl; const IHTMLWindow3Vtbl *lpHTMLWindow3Vtbl; + const IHTMLWindow4Vtbl *lpHTMLWindow4Vtbl; const IDispatchExVtbl *lpIDispatchExVtbl; LONG ref; @@ -233,7 +242,6 @@ struct HTMLWindow { IMoniker *mon; LPOLESTR url; - event_target_t *event_target; IHTMLEventObj *event; SCRIPTMODE scriptmode; @@ -242,6 +250,7 @@ struct HTMLWindow { HTMLOptionElementFactory *option_factory; HTMLImageElementFactory *image_factory; HTMLLocation *location; + IHTMLScreen *screen; global_prop_t *global_props; DWORD global_prop_cnt; @@ -258,17 +267,25 @@ typedef enum { EDITMODE } USERMODE; -typedef struct { +typedef struct _cp_static_data_t { + tid_t tid; + void (*on_advise)(IUnknown*,struct _cp_static_data_t*); + DWORD id_cnt; + DISPID *ids; +} cp_static_data_t; + +typedef struct ConnectionPointContainer { const IConnectionPointContainerVtbl *lpConnectionPointContainerVtbl; ConnectionPoint *cp_list; IUnknown *outer; + struct ConnectionPointContainer *forward_container; } ConnectionPointContainer; struct ConnectionPoint { const IConnectionPointVtbl *lpConnectionPointVtbl; - IConnectionPointContainer *container; + ConnectionPointContainer *container; union { IUnknown *unk; @@ -278,6 +295,7 @@ struct ConnectionPoint { DWORD sinks_size; const IID *iid; + cp_static_data_t *data; ConnectionPoint *next; }; @@ -296,7 +314,7 @@ struct HTMLDocument { const IOleDocumentVtbl *lpOleDocumentVtbl; const IOleDocumentViewVtbl *lpOleDocumentViewVtbl; const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl; - const IViewObject2Vtbl *lpViewObject2Vtbl; + const IViewObjectExVtbl *lpViewObjectExVtbl; const IOleInPlaceObjectWindowlessVtbl *lpOleInPlaceObjectWindowlessVtbl; const IServiceProviderVtbl *lpServiceProviderVtbl; const IOleCommandTargetVtbl *lpOleCommandTargetVtbl; @@ -305,6 +323,7 @@ struct HTMLDocument { const IPersistStreamInitVtbl *lpPersistStreamInitVtbl; const IDispatchExVtbl *lpIDispatchExVtbl; const ISupportErrorInfoVtbl *lpSupportErrorInfoVtbl; + const IObjectWithSiteVtbl *lpObjectWithSiteVtbl; IUnknown *unk_impl; IDispatchEx *dispex; @@ -320,6 +339,9 @@ struct HTMLDocument { ConnectionPoint cp_htmldocevents; ConnectionPoint cp_htmldocevents2; ConnectionPoint cp_propnotif; + ConnectionPoint cp_dispatch; + + IOleAdviseHolder *advise_holder; }; static inline HRESULT htmldoc_query_interface(HTMLDocument *This, REFIID riid, void **ppv) @@ -359,12 +381,14 @@ struct HTMLDocumentObj { HWND hwnd; HWND tooltips_hwnd; + BOOL request_uiactivate; BOOL in_place_active; BOOL ui_active; BOOL window_active; BOOL has_key_path; BOOL container_locked; BOOL focus; + INT download_state; USERMODE usermode; LPWSTR mime; @@ -399,7 +423,6 @@ struct NSContainer { HWND hwnd; - nsChannelBSC *bscallback; /* hack */ HWND reset_focus; /* hack */ }; @@ -410,9 +433,6 @@ typedef struct { LONG ref; - nsIChannel *channel; - nsIHttpChannel *http_channel; - nsIHttpChannelInternal *http_channel_internal; nsIWineURI *uri; nsIInputStream *post_data_stream; nsILoadGroup *load_group; @@ -423,6 +443,7 @@ typedef struct { char *content_type; char *charset; PRUint32 response_status; + UINT url_scheme; } nsChannel; typedef struct { @@ -432,6 +453,11 @@ typedef struct { HRESULT (*call_event)(HTMLDOMNode*,DWORD,BOOL*); HRESULT (*put_disabled)(HTMLDOMNode*,VARIANT_BOOL); HRESULT (*get_disabled)(HTMLDOMNode*,VARIANT_BOOL*); + HRESULT (*get_document)(HTMLDOMNode*,IDispatch**); + HRESULT (*get_readystate)(HTMLDOMNode*,BSTR*); + HRESULT (*get_dispid)(HTMLDOMNode*,BSTR,DWORD,DISPID*); + HRESULT (*invoke)(HTMLDOMNode*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*); + HRESULT (*bind_to_tree)(HTMLDOMNode*); } NodeImplVtbl; struct HTMLDOMNode { @@ -445,6 +471,7 @@ struct HTMLDOMNode { nsIDOMNode *nsnode; HTMLDocumentNode *doc; event_target_t *event_target; + ConnectionPointContainer *cp_container; HTMLDOMNode *next; }; @@ -471,9 +498,13 @@ typedef struct { struct HTMLFrameBase { HTMLElement element; - const IHTMLFrameBaseVtbl *lpIHTMLFrameBaseVtbl; + const IHTMLFrameBaseVtbl *lpIHTMLFrameBaseVtbl; + const IHTMLFrameBase2Vtbl *lpIHTMLFrameBase2Vtbl; HTMLWindow *content_window; + + nsIDOMHTMLFrameElement *nsframe; + nsIDOMHTMLIFrameElement *nsiframe; }; typedef struct _mutation_queue_t { @@ -499,8 +530,10 @@ struct HTMLDocumentNode { nsIDOMHTMLDocument *nsdoc; HTMLDOMNode *nodes; BOOL content_ready; + event_target_t *body_event_target; IInternetSecurityManager *secmgr; + ICatInformation *catmgr; nsDocumentEventListener *nsevent_listener; BOOL *event_vector; @@ -514,6 +547,7 @@ struct HTMLDocumentNode { #define HTMLWINDOW2(x) ((IHTMLWindow2*) &(x)->lpHTMLWindow2Vtbl) #define HTMLWINDOW3(x) ((IHTMLWindow3*) &(x)->lpHTMLWindow3Vtbl) +#define HTMLWINDOW4(x) ((IHTMLWindow4*) &(x)->lpHTMLWindow4Vtbl) #define HTMLDOC(x) ((IHTMLDocument2*) &(x)->lpHTMLDocument2Vtbl) #define HTMLDOC3(x) ((IHTMLDocument3*) &(x)->lpHTMLDocument3Vtbl) @@ -529,8 +563,9 @@ struct HTMLDocumentNode { #define DOCVIEW(x) ((IOleDocumentView*) &(x)->lpOleDocumentViewVtbl) #define OLEWIN(x) ((IOleWindow*) &(x)->lpOleInPlaceActiveObjectVtbl) #define ACTOBJ(x) ((IOleInPlaceActiveObject*) &(x)->lpOleInPlaceActiveObjectVtbl) -#define VIEWOBJ(x) ((IViewObject*) &(x)->lpViewObject2Vtbl) -#define VIEWOBJ2(x) ((IViewObject2*) &(x)->lpViewObject2Vtbl) +#define VIEWOBJ(x) ((IViewObject*) &(x)->lpViewObjectExVtbl) +#define VIEWOBJ2(x) ((IViewObject2*) &(x)->lpViewObjectExVtbl) +#define VIEWOBJEX(x) ((IViewObjectEx*) &(x)->lpViewObjectExVtbl) #define INPLACEOBJ(x) ((IOleInPlaceObject*) &(x)->lpOleInPlaceObjectWindowlessVtbl) #define INPLACEWIN(x) ((IOleInPlaceObjectWindowless*) &(x)->lpOleInPlaceObjectWindowlessVtbl) #define SERVPROV(x) ((IServiceProvider*) &(x)->lpServiceProviderVtbl) @@ -541,6 +576,7 @@ struct HTMLDocumentNode { #define PERSTRINIT(x) ((IPersistStreamInit*) &(x)->lpPersistStreamInitVtbl) #define PERSISTHIST(x) ((IPersistHistory*) &(x)->lpPersistHistoryVtbl) #define CUSTOMDOC(x) ((ICustomDoc*) &(x)->lpCustomDocVtbl) +#define OBJSITE(x) ((IObjectWithSite*) &(x)->lpObjectWithSiteVtbl) #define NSWBCHROME(x) ((nsIWebBrowserChrome*) &(x)->lpWebBrowserChromeVtbl) #define NSCML(x) ((nsIContextMenuListener*) &(x)->lpContextMenuListenerVtbl) @@ -573,10 +609,11 @@ struct HTMLDocumentNode { #define HTMLTEXTCONT(x) ((IHTMLTextContainer*) &(x)->lpHTMLTextContainerVtbl) #define HTMLFRAMEBASE(x) ((IHTMLFrameBase*) &(x)->lpIHTMLFrameBaseVtbl) +#define HTMLFRAMEBASE2(x) ((IHTMLFrameBase2*) &(x)->lpIHTMLFrameBase2Vtbl) #define HTMLOPTFACTORY(x) ((IHTMLOptionElementFactory*) &(x)->lpHTMLOptionElementFactoryVtbl) -#define HTMLIMGFACTORY(x) ((IHTMLImageElementFactory*) &(x)->lpHTMLImageElementFactoryVtbl) -#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl) +#define HTMLIMGFACTORY(x) ((IHTMLImageElementFactory*) &(x)->lpHTMLImageElementFactoryVtbl) +#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl) #define DISPATCHEX(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) @@ -599,6 +636,7 @@ HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*); HTMLImageElementFactory *HTMLImageElementFactory_Create(HTMLWindow*); HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**); IOmNavigator *OmNavigator_Create(void); +HRESULT HTMLScreen_Create(IHTMLScreen**); void HTMLDocument_HTMLDocument3_Init(HTMLDocument*); void HTMLDocument_HTMLDocument5_Init(HTMLDocument*); @@ -614,7 +652,7 @@ void HTMLDocumentNode_SecMgr_Init(HTMLDocumentNode*); HRESULT HTMLCurrentStyle_Create(HTMLElement*,IHTMLCurrentStyle**); -void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID); +void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID,cp_static_data_t*); void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*); void ConnectionPointContainer_Destroy(ConnectionPointContainer*); @@ -642,9 +680,12 @@ void release_nsio(void); BOOL install_wine_gecko(BOOL); HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*); +HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsIWineURI**); HRESULT hlink_frame_navigate(HTMLDocument*,LPCWSTR,nsIInputStream*,DWORD); -HRESULT navigate_url(HTMLDocumentNode*,OLECHAR*); +HRESULT navigate_url(HTMLWindow*,const WCHAR*,const WCHAR*); +HRESULT set_frame_doc(HTMLFrameBase*,nsIDOMDocument*); +HRESULT load_nsuri(HTMLWindow*,nsIWineURI*,DWORD); void call_property_onchanged(ConnectionPoint*,DISPID); HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*); @@ -652,10 +693,8 @@ HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*); void *nsalloc(size_t) __WINE_ALLOC_SIZE(1); void nsfree(void*); -void nsACString_Init(nsACString*,const char*); void nsACString_SetData(nsACString*,const char*); PRUint32 nsACString_GetData(const nsACString*,const char**); -void nsACString_Finish(nsACString*); void nsAString_Init(nsAString*,const PRUnichar*); void nsAString_SetData(nsAString*,const PRUnichar*); @@ -703,8 +742,9 @@ HTMLElement *HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL); HTMLElement *HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*); HTMLElement *HTMLAnchorElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); HTMLElement *HTMLBodyElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); -HTMLElement *HTMLFrameElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLWindow*); -HTMLElement *HTMLIFrame_Create(HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLWindow*); +HTMLElement *HTMLFormElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); +HTMLElement *HTMLFrameElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); +HTMLElement *HTMLIFrame_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); HTMLElement *HTMLImgElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); HTMLElement *HTMLInputElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); HTMLElement *HTMLOptionElement_Create(HTMLDocumentNode*,nsIDOMHTMLElement*); @@ -720,7 +760,7 @@ void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMHTMLElement*,dispex_s void HTMLElement2_Init(HTMLElement*); void HTMLElement3_Init(HTMLElement*); void HTMLTextContainer_Init(HTMLTextContainer*,HTMLDocumentNode*,nsIDOMHTMLElement*,dispex_static_data_t*); -void HTMLFrameBase_Init(HTMLFrameBase*,HTMLDocumentNode*,nsIDOMHTMLElement*,HTMLWindow*,dispex_static_data_t*); +void HTMLFrameBase_Init(HTMLFrameBase*,HTMLDocumentNode*,nsIDOMHTMLElement*,dispex_static_data_t*); HRESULT HTMLDOMNode_QI(HTMLDOMNode*,REFIID,void**); void HTMLDOMNode_destructor(HTMLDOMNode*); @@ -741,6 +781,7 @@ IDispatch *script_parse_event(HTMLWindow*,LPCWSTR); void set_script_mode(HTMLWindow*,SCRIPTMODE); BOOL find_global_prop(HTMLWindow*,BSTR,DWORD,ScriptHost**,DISPID*); IDispatch *get_script_disp(ScriptHost*); +HRESULT search_window_props(HTMLWindow*,BSTR,DWORD,DISPID*); IHTMLElementCollection *create_all_collection(HTMLDOMNode*,BOOL); IHTMLElementCollection *create_collection_from_nodelist(HTMLDocumentNode*,IUnknown*,nsIDOMNodeList*); @@ -917,6 +958,7 @@ static inline void windowref_release(windowref_t *ref) heap_free(ref); } +HDC get_display_dc(void); HINSTANCE get_shdoclc(void); extern HINSTANCE hInst; diff --git a/reactos/dll/win32/mshtml/mutation.c b/reactos/dll/win32/mshtml/mutation.c index 84c92413346..372c467bf53 100644 --- a/reactos/dll/win32/mshtml/mutation.c +++ b/reactos/dll/win32/mshtml/mutation.c @@ -37,10 +37,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); enum { + MUTATION_BINDTOTREE, MUTATION_COMMENT, MUTATION_ENDLOAD, - MUTATION_FRAME, - MUTATION_IFRAME, MUTATION_SCRIPT }; @@ -271,87 +270,25 @@ static void pop_mutation_queue(HTMLDocumentNode *doc) heap_free(tmp); } -static nsresult init_nsdoc_window(HTMLDocumentNode *doc, nsIDOMDocument *nsdoc, HTMLWindow **ret) +static void bind_to_tree(HTMLDocumentNode *doc, nsISupports *nsiface) { - nsIDOMWindow *nswindow; - - nswindow = get_nsdoc_window(nsdoc); - if(!nswindow) - return NS_ERROR_FAILURE; - - if(!nswindow_to_window(nswindow)) { - HTMLWindow *window; - HRESULT hres; - - hres = HTMLWindow_Create(doc->basedoc.doc_obj, nswindow, doc->basedoc.window, &window); - if(SUCCEEDED(hres)) - *ret = window; - } - - nsIDOMWindow_Release(nswindow); - return NS_OK; -} - -static nsresult init_iframe_window(HTMLDocumentNode *doc, nsISupports *nsunk) -{ - nsIDOMHTMLIFrameElement *nsiframe; - HTMLWindow *window = NULL; - nsIDOMDocument *nsdoc; + nsIDOMNode *nsnode; + HTMLDOMNode *node; nsresult nsres; - nsres = nsISupports_QueryInterface(nsunk, &IID_nsIDOMHTMLIFrameElement, (void**)&nsiframe); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIDOMHTMLIFrameElement: %08x\n", nsres); - return nsres; + nsres = nsISupports_QueryInterface(nsiface, &IID_nsIDOMNode, (void**)&nsnode); + if(NS_FAILED(nsres)) + return; + + node = get_node(doc, nsnode, TRUE); + nsIDOMNode_Release(nsnode); + if(!node) { + ERR("Could not get node\n"); + return; } - nsres = nsIDOMHTMLIFrameElement_GetContentDocument(nsiframe, &nsdoc); - nsIDOMHTMLIFrameElement_Release(nsiframe); - if(NS_FAILED(nsres) || !nsdoc) { - ERR("GetContentDocument failed: %08x\n", nsres); - return nsres; - } - - nsres = init_nsdoc_window(doc, nsdoc, &window); - - if(window) { - HTMLIFrame_Create(doc, (nsIDOMHTMLElement*)nsiframe, window); - IHTMLWindow2_Release(HTMLWINDOW2(window)); - } - - nsIDOMDocument_Release(nsdoc); - return nsres; -} - -static nsresult init_frame_window(HTMLDocumentNode *doc, nsISupports *nsunk) -{ - nsIDOMHTMLFrameElement *nsframe; - HTMLWindow *window = NULL; - nsIDOMDocument *nsdoc; - nsresult nsres; - - nsres = nsISupports_QueryInterface(nsunk, &IID_nsIDOMHTMLFrameElement, (void**)&nsframe); - if(NS_FAILED(nsres)) { - ERR("Could not get nsIDOMHTMLFrameElement: %08x\n", nsres); - return nsres; - } - - nsres = nsIDOMHTMLFrameElement_GetContentDocument(nsframe, &nsdoc); - nsIDOMHTMLFrameElement_Release(nsframe); - if(NS_FAILED(nsres) || !nsdoc) { - ERR("GetContentDocument failed: %08x\n", nsres); - return nsres; - } - - nsres = init_nsdoc_window(doc, nsdoc, &window); - - if(window) { - HTMLFrameElement_Create(doc, (nsIDOMHTMLElement*)nsframe, window); - IHTMLWindow2_Release(HTMLWINDOW2(window)); - } - - nsIDOMDocument_Release(nsdoc); - return nsres; + if(node->vtbl->bind_to_tree) + node->vtbl->bind_to_tree(node); } /* Calls undocumented 69 cmd of CGID_Explorer */ @@ -426,6 +363,10 @@ static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface) while(This->mutation_queue) { switch(This->mutation_queue->type) { + case MUTATION_BINDTOTREE: + bind_to_tree(This, This->mutation_queue->nsiface); + break; + case MUTATION_COMMENT: { nsIDOMComment *nscomment; nsAString comment_str; @@ -477,14 +418,6 @@ static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface) handle_end_load(This); break; - case MUTATION_FRAME: - init_frame_window(This, This->mutation_queue->nsiface); - break; - - case MUTATION_IFRAME: - init_iframe_window(This, This->mutation_queue->nsiface); - break; - case MUTATION_SCRIPT: { nsIDOMHTMLScriptElement *nsscript; @@ -689,7 +622,7 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, if(NS_SUCCEEDED(nsres)) { TRACE("iframe node\n"); - push_mutation_queue(This, MUTATION_IFRAME, (nsISupports*)nsiframe); + push_mutation_queue(This, MUTATION_BINDTOTREE, (nsISupports*)nsiframe); nsIDOMHTMLIFrameElement_Release(nsiframe); } @@ -697,7 +630,7 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, if(NS_SUCCEEDED(nsres)) { TRACE("frame node\n"); - push_mutation_queue(This, MUTATION_FRAME, (nsISupports*)nsframe); + push_mutation_queue(This, MUTATION_BINDTOTREE, (nsISupports*)nsframe); nsIDOMHTMLFrameElement_Release(nsframe); } } diff --git a/reactos/dll/win32/mshtml/navigate.c b/reactos/dll/win32/mshtml/navigate.c index 727eaef15fe..b85de92e33d 100644 --- a/reactos/dll/win32/mshtml/navigate.c +++ b/reactos/dll/win32/mshtml/navigate.c @@ -27,9 +27,12 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "winreg.h" #include "ole2.h" #include "hlguids.h" #include "shlguid.h" +#include "wininet.h" +#include "shlwapi.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -41,8 +44,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); #define CONTENT_LENGTH "Content-Length" #define UTF16_STR "utf-16" -static WCHAR emptyW[] = {0}; - typedef struct { const nsIInputStreamVtbl *lpInputStreamVtbl; @@ -951,6 +952,21 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream) && (BYTE)This->nsstream->buf[1] == 0xfe) This->nschannel->charset = heap_strdupA(UTF16_STR); + if(!This->nschannel->content_type) { + WCHAR *mime; + + hres = FindMimeFromData(NULL, NULL, This->nsstream->buf, This->nsstream->buf_size, NULL, 0, &mime, 0); + if(FAILED(hres)) + return hres; + + TRACE("Found MIME %s\n", debugstr_w(mime)); + + This->nschannel->content_type = heap_strdupWtoA(mime); + CoTaskMemFree(mime); + if(!This->nschannel->content_type) + return E_OUTOFMEMORY; + } + on_start_nsrequest(This); if(This->window) @@ -1066,6 +1082,12 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW heap_free(This->nschannel->content_type); This->nschannel->content_type = heap_strdupWtoA(status_text); + break; + case BINDSTATUS_REDIRECTING: + TRACE("redirect to %s\n", debugstr_w(status_text)); + + /* FIXME: We should find a better way to handle this */ + nsIWineURI_SetWineURL(This->nschannel->uri, status_text); } return S_OK; @@ -1231,25 +1253,77 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, return hres; } -HRESULT navigate_url(HTMLDocumentNode *doc, OLECHAR *url) +HRESULT load_nsuri(HTMLWindow *window, nsIWineURI *uri, DWORD flags) { - OLECHAR *translated_url = NULL; - HRESULT hres; + nsIWebNavigation *web_navigation; + nsIDocShell *doc_shell; + nsresult nsres; - if(!url) - url = emptyW; - - if(doc->basedoc.doc_obj->hostui) { - hres = IDocHostUIHandler_TranslateUrl(doc->basedoc.doc_obj->hostui, 0, url, - &translated_url); - if(hres == S_OK) - url = translated_url; + nsres = get_nsinterface((nsISupports*)window->nswindow, &IID_nsIWebNavigation, (void**)&web_navigation); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIWebNavigation interface: %08x\n", nsres); + return E_FAIL; } - hres = hlink_frame_navigate(&doc->basedoc, url, NULL, 0); - if(FAILED(hres)) - FIXME("hlink_frame_navigate failed: %08x\n", hres); + nsres = nsIWebNavigation_QueryInterface(web_navigation, &IID_nsIDocShell, (void**)&doc_shell); + nsIWebNavigation_Release(web_navigation); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDocShell: %08x\n", nsres); + return E_FAIL; + } - CoTaskMemFree(translated_url); + nsres = nsIDocShell_LoadURI(doc_shell, (nsIURI*)uri, NULL, flags, FALSE); + nsIDocShell_Release(doc_shell); + if(NS_FAILED(nsres)) { + WARN("LoadURI failed: %08x\n", nsres); + return E_FAIL; + } + + return S_OK; +} + +HRESULT navigate_url(HTMLWindow *window, const WCHAR *new_url, const WCHAR *base_url) +{ + WCHAR url[INTERNET_MAX_URL_LENGTH]; + nsIWineURI *uri; + HRESULT hres; + + if(!new_url) { + *url = 0; + }else if(base_url) { + DWORD len = 0; + + hres = CoInternetCombineUrl(base_url, new_url, URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, + url, sizeof(url)/sizeof(WCHAR), &len, 0); + if(FAILED(hres)) + return hres; + }else { + strcpyW(url, new_url); + } + + if(window->doc_obj && window->doc_obj->hostui) { + OLECHAR *translated_url = NULL; + + hres = IDocHostUIHandler_TranslateUrl(window->doc_obj->hostui, 0, url, + &translated_url); + if(hres == S_OK) { + strcpyW(url, translated_url); + CoTaskMemFree(translated_url); + } + } + + if(window->doc_obj && window == window->doc_obj->basedoc.window) { + hres = hlink_frame_navigate(&window->doc->basedoc, url, NULL, 0); + if(SUCCEEDED(hres)) + return S_OK; + TRACE("hlink_frame_navigate failed: %08x\n", hres); + } + + hres = create_doc_uri(window, url, &uri); + if(FAILED(hres)) + return hres; + + hres = load_nsuri(window, uri, LOAD_FLAGS_NONE); + nsIWineURI_Release(uri); return hres; } diff --git a/reactos/dll/win32/mshtml/nsembed.c b/reactos/dll/win32/mshtml/nsembed.c index 2150a0f30d5..68588977697 100644 --- a/reactos/dll/win32/mshtml/nsembed.c +++ b/reactos/dll/win32/mshtml/nsembed.c @@ -533,7 +533,7 @@ void nsfree(void *mem) nsIMemory_Free(nsmem, mem); } -void nsACString_Init(nsACString *str, const char *data) +static void nsACString_Init(nsACString *str, const char *data) { NS_CStringContainerInit(str); if(data) @@ -550,7 +550,7 @@ PRUint32 nsACString_GetData(const nsACString *str, const char **data) return NS_CStringGetData(str, data, NULL); } -void nsACString_Finish(nsACString *str) +static void nsACString_Finish(nsACString *str) { NS_CStringContainerFinish(str); } @@ -1149,6 +1149,7 @@ static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener nsIWineURI *wine_uri; nsACString spec_str; const char *spec; + BOOL is_doc_uri; nsresult nsres; nsACString_Init(&spec_str, NULL); @@ -1165,29 +1166,12 @@ static nsresult NSAPI nsURIContentListener_OnStartURIOpen(nsIURIContentListener return NS_ERROR_NOT_IMPLEMENTED; } - nsIWineURI_SetNSContainer(wine_uri, This); - nsIWineURI_SetIsDocumentURI(wine_uri, TRUE); + nsIWineURI_GetIsDocumentURI(wine_uri, &is_doc_uri); - if(This->bscallback) { - IMoniker *mon = get_channelbsc_mon(This->bscallback); + if(!is_doc_uri) { + nsIWineURI_SetNSContainer(wine_uri, This); + nsIWineURI_SetIsDocumentURI(wine_uri, TRUE); - if(mon) { - LPWSTR wine_url; - HRESULT hres; - - hres = IMoniker_GetDisplayName(mon, NULL, 0, &wine_url); - if(SUCCEEDED(hres)) { - nsIWineURI_SetWineURL(wine_uri, wine_url); - CoTaskMemFree(wine_url); - }else { - WARN("GetDisplayName failed: %08x\n", hres); - } - - IMoniker_Release(mon); - } - - *_retval = FALSE; - }else if(This->doc) { *_retval = translate_url(This->doc->basedoc.doc_obj, wine_uri); } diff --git a/reactos/dll/win32/mshtml/nsevents.c b/reactos/dll/win32/mshtml/nsevents.c index 7c4c09b0fa7..46f057f079a 100644 --- a/reactos/dll/win32/mshtml/nsevents.c +++ b/reactos/dll/win32/mshtml/nsevents.c @@ -185,17 +185,19 @@ static void handle_docobj_load(HTMLDocumentObj *doc) hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); if(SUCCEEDED(hres)) { - VARIANT state, progress; + if(doc->download_state) { + VARIANT state, progress; - V_VT(&progress) = VT_I4; - V_I4(&progress) = 0; - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, - &progress, NULL); + V_VT(&progress) = VT_I4; + V_I4(&progress) = 0; + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, + OLECMDEXECOPT_DONTPROMPTUSER, &progress, NULL); - V_VT(&state) = VT_I4; - V_I4(&state) = 0; - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, - &state, NULL); + V_VT(&state) = VT_I4; + V_I4(&state) = 0; + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, + OLECMDEXECOPT_DONTPROMPTUSER, &state, NULL); + } IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL); IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL); @@ -203,6 +205,7 @@ static void handle_docobj_load(HTMLDocumentObj *doc) IOleCommandTarget_Release(olecmd); } + doc->download_state = 0; } static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event) diff --git a/reactos/dll/win32/mshtml/nsiface.idl b/reactos/dll/win32/mshtml/nsiface.idl index 19f29b0b663..af117622001 100644 --- a/reactos/dll/win32/mshtml/nsiface.idl +++ b/reactos/dll/win32/mshtml/nsiface.idl @@ -119,7 +119,6 @@ typedef nsISupports nsIDOMDOMImplementation; typedef nsISupports nsIDOMCDATASection; typedef nsISupports nsIDOMProcessingInstruction; typedef nsISupports nsIDOMEntityReference; -typedef nsISupports nsIDOMHTMLFormElement; typedef nsISupports nsIDOMHTMLOptionsCollection; typedef nsISupports nsIWebProgressListener; typedef nsISupports nsIDOMCSSValue; @@ -140,6 +139,16 @@ typedef nsISupports nsIContent; typedef nsISupports nsINode; typedef nsISupports nsIStyleSheet; typedef nsISupports nsIStyleRule; +typedef nsISupports nsIVariant; +typedef nsISupports nsIDOMUserDataHandler; +typedef nsISupports nsIDocShellLoadInfo; +typedef nsISupports nsISHEntry; +typedef nsISupports nsIPresShell; +typedef nsISupports nsIContentViewer; +typedef nsISupports nsIDocumentCharsetInfo; +typedef nsISupports nsILayoutHistoryState; +typedef nsISupports nsISecureBrowserUI; +typedef nsISupports nsIDOMStorage; [ object, @@ -601,6 +610,37 @@ interface nsIDOMNodeList : nsISupports nsresult GetLength(PRUint32 *aLength); } +[ + object, + uuid(29fb2a18-1dd2-11b2-8dd9-a6fd5d5ad12f), + local + /* NOT_FROZEN */ +] +interface nsIDOM3Node : nsISupports +{ + enum NSDOCPOSITION { + DISCONNECTED = 1, + PRECEDING = 2, + FOLLOWING = 4, + CONTAINS = 8, + CONTAINED_BY = 16, + IMPLEMENTATION_SPECIFIC = 32 + }; + + nsresult GetBaseURI(nsAString *aBaseURI); + nsresult CompareDocumentPosition(nsIDOMNode *other, PRUint16 *_retval); + nsresult GetTextContent(nsAString *aTextContent); + nsresult SetTextContent(const nsAString *aTextContent); + nsresult IsSameNode(nsIDOMNode *other, PRBool *_retval); + nsresult LookupPrefix(const nsAString *namespaceURI, PRBool *_retval); + nsresult IsDefaultNamespace(const nsAString *namespaceURI, PRBool *_retval); + nsresult LookupNamespaceURI(const nsAString *prefix, nsAString _retval); + nsresult IsEqualNode(nsIDOMNode *arg, PRBool *_retval); + nsresult GetFeature(const nsAString *feature, const nsAString *version, nsISupports **_retval); + nsresult SetUserData(const nsAString *key, nsIVariant *data, nsIDOMUserDataHandler *handler, nsIVariant **_retval); + nsresult GetUserData(const nsAString *key, nsIVariant **_retval); +} + [ object, uuid(a6cf907c-15b3-11d2-932e-00805f8add32), @@ -763,8 +803,10 @@ interface nsIDOMNSHTMLElement : nsISupports nsresult SetTabIndex(PRInt32 aTabIndex); nsresult GetContentEditable(nsAString *aContentEditable); nsresult SetContentEditable(const nsAString *aContentEditable); - nsresult blur(); - nsresult focus(); + nsresult GetDraggable(PRBool *aDraggable); + nsresult SetDraggable(PRBool aDraggable); + nsresult Blur(); + nsresult Focus(); nsresult ScrollIntoView(PRBool top); nsresult GetSpellcheck(PRBool *aSpellcheck); nsresult SetSpellcheck(PRBool aSpellcheck); @@ -1179,6 +1221,32 @@ interface nsIDOMHTMLBodyElement : nsIDOMHTMLElement nsresult SetVLink(const nsAString *aVLink); } +[ + object, + uuid(a6cf908f-15b3-11d2-932e-00805f8add32), + local + /* FROZEN */ +] +interface nsIDOMHTMLFormElement : nsIDOMHTMLElement +{ + nsresult GetElements(nsIDOMHTMLCollection **aElements); + nsresult GetLength(PRInt32 *aLength); + nsresult GetName(nsAString *aName); + nsresult SetName(const nsAString *aName); + nsresult GetAcceptCharset(nsAString *aAcceptCharset); + nsresult SetAcceptCharset(const nsAString *aAcceptCharset); + nsresult GetAction(nsAString *aAction); + nsresult SetAction(const nsAString *aAction); + nsresult GetEnctype(nsAString *aEnctype); + nsresult SetEnctype(const nsAString *aEnctype); + nsresult GetMethod(nsAString *aMethod); + nsresult SetMethod(const nsAString *aMethod); + nsresult GetTarget(nsAString *aTarget); + nsresult SetTarget(const nsAString *aTarget); + nsresult Submit(); + nsresult Reset(); +} + [ object, uuid(a6cf9093-15b3-11d2-932e-00805f8add32), @@ -1638,7 +1706,8 @@ interface nsIBaseWindow : nsISupports nsresult SetTitle(const PRUnichar *aTitle); } -cpp_quote("#define LOAD_FLAGS_NONE 0") +cpp_quote("#define LOAD_FLAGS_NONE 0x00000") +cpp_quote("#define LOAD_INITIAL_DOCUMENT_URI 0x80000") [ object, @@ -2156,7 +2225,7 @@ interface nsIDOMMouseEvent : nsIDOMUIEvent nsresult GetAltKey(PRBool *aAltKey); nsresult GetMetaKey(PRBool *aMetaKey); nsresult GetButton(PRUint16 *aButton); - nsresult GetRelatedTarget(nsIDOMEventTarget * *aRelatedTarget); + nsresult GetRelatedTarget(nsIDOMEventTarget **aRelatedTarget); nsresult InitMouseEvent(const nsAString *typeArg, PRBool canBubbleArg, PRBool cancelableArg, nsIDOMAbstractView *viewArg, PRInt32 detailArg, PRInt32 screenXArg, PRInt32 screenYArg, PRInt32 clientXArg, PRInt32 clientYArg, PRBool ctrlKeyArg, PRBool altKeyArg, @@ -2284,7 +2353,7 @@ interface nsIProfile : nsISupports nsresult GetProfileCount(PRInt32 *aProfileCount); nsresult GetProfileList(PRUint32 *length, PRUnichar ***profileNames); nsresult ProfileExists(const PRUnichar *profileName, PRBool *_retval); - nsresult GetCurrentProfile(PRUnichar * *aCurrentProfile); + nsresult GetCurrentProfile(PRUnichar **aCurrentProfile); nsresult SetCurrentProfile(const PRUnichar * aCurrentProfile); nsresult ShutDownCurrentProfile(PRUint32 shutDownType); nsresult CreateNewProfile(const PRUnichar *profileName, @@ -2617,6 +2686,88 @@ interface nsIHTMLEditor : nsISupports nsresult SetReturnInParagraphCreatesNewParagraph([in] PRBool prb); } +[ + object, + uuid(8adfb831-1053-4a19-884d-bcdad7277b4b), + local + /* NOT_FROZEN */ +] +interface nsIDocShell : nsISupports +{ + nsresult LoadURI(nsIURI *uri, nsIDocShellLoadInfo *loadInfo, PRUint32 aLoadFlags, PRBool firstParty); + nsresult LoadStream(nsIInputStream *aStream, nsIURI *aURI, const nsACString *aContentType, + const nsACString *aContentCharset, nsIDocShellLoadInfo *aLoadInfo); + nsresult InternalLoad(nsIURI *aURI, nsIURI *aReferrer, nsISupports *aOwner, PRUint32 aFlags, const PRUnichar *aWindowTarget, + const char *aTypeHint, nsIInputStream *aPostDataStream, nsIInputStream *aHeadersStream, PRUint32 aLoadFlags, + nsISHEntry *aSHEntry, PRBool firstParty, nsIDocShell **aDocShell, nsIRequest **aRequest); + nsresult CreateLoadInfo(nsIDocShellLoadInfo **loadInfo); + nsresult PrepareForNewContentModel(); + nsresult SetCurrentURI(nsIURI *aURI); + nsresult FirePageHideNotification(PRBool isUnload); + nsresult GetPresContext(void /*nsPresContext*/ **aPresContext); + nsresult GetPresShell(nsIPresShell **aPresShell); + nsresult GetEldestPresShell(nsIPresShell **aEldestPresShell); + nsresult GetContentViewer(nsIContentViewer **aContentViewer); + nsresult GetChromeEventHandler(nsIDOMEventTarget **aChromeEventHandler); + nsresult SetChromeEventHandler(nsIDOMEventTarget *aChromeEventHandler); + nsresult GetDocumentCharsetInfo(nsIDocumentCharsetInfo **aDocumentCharsetInfo); + nsresult SetDocumentCharsetInfo(nsIDocumentCharsetInfo *aDocumentCharsetInfo); + nsresult GetAllowPlugins(PRBool *aAllowPlugins); + nsresult SetAllowPlugins(PRBool aAllowPlugins); + nsresult GetAllowJavascript(PRBool *aAllowJavascript); + nsresult SetAllowJavascript(PRBool aAllowJavascript); + nsresult GetAllowMetaRedirects(PRBool *aAllowMetaRedirects); + nsresult SetAllowMetaRedirects(PRBool aAllowMetaRedirects); + nsresult GetAllowSubframes(PRBool *aAllowSubframes); + nsresult SetAllowSubframes(PRBool aAllowSubframes); + nsresult GetAllowImages(PRBool *aAllowImages); + nsresult SetAllowImages(PRBool aAllowImages); + nsresult GetAllowDNSPrefetch(PRBool *aAllowDNSPrefetch); + nsresult SetAllowDNSPrefetch(PRBool aAllowDNSPrefetch); + nsresult GetDocShellEnumerator(PRInt32 aItemType, PRInt32 aDirection, nsISimpleEnumerator **_retval); + nsresult GetAppType(PRUint32 *aAppType); + nsresult SetAppType(PRUint32 aAppType); + nsresult GetAllowAuth(PRBool *aAllowAuth); + nsresult SetAllowAuth(PRBool aAllowAuth); + nsresult GetZoom(float *aZoom); + nsresult SetZoom(float aZoom); + nsresult GetMarginWidth(PRInt32 *aMarginWidth); + nsresult SetMarginWidth(PRInt32 aMarginWidth); + nsresult GetMarginHeight(PRInt32 *aMarginHeight); + nsresult SetMarginHeight(PRInt32 aMarginHeight); + nsresult TabToTreeOwner(PRBool forward, PRBool *tookFocus); + nsresult GetBusyFlags(PRUint32 *aBusyFlags); + nsresult GetLoadType(PRUint32 *aLoadType); + nsresult SetLoadType(PRUint32 aLoadType); + nsresult IsBeingDestroyed(PRBool *_retval); + nsresult GetIsExecutingOnLoadHandler(PRBool *aIsExecutingOnLoadHandler); + nsresult GetLayoutHistoryState(nsILayoutHistoryState **aLayoutHistoryState); + nsresult SetLayoutHistoryState(nsILayoutHistoryState *aLayoutHistoryState); + nsresult GetShouldSaveLayoutState(PRBool *aShouldSaveLayoutState); + nsresult GetSecurityUI(nsISecureBrowserUI **aSecurityUI); + nsresult SetSecurityUI(nsISecureBrowserUI *aSecurityUI); + nsresult SuspendRefreshURIs(); + nsresult ResumeRefreshURIs(); + nsresult BeginRestore(nsIContentViewer *viewer, PRBool top); + nsresult FinishRestore(); + nsresult GetRestoringDocument(PRBool *aRestoringDocument); + nsresult GetUseErrorPages(PRBool *aUseErrorPages); + nsresult SetUseErrorPages(PRBool aUseErrorPages); + nsresult GetPreviousTransIndex(PRInt32 *aPreviousTransIndex); + nsresult GetLoadedTransIndex(PRInt32 *aLoadedTransIndex); + nsresult HistoryPurged(PRInt32 numEntries); + nsresult GetSessionStorageForURI(nsIURI *uri, nsIDOMStorage **_retval); + nsresult GetSessionStorageForPrincipal(nsIPrincipal *principal, PRBool create, nsIDOMStorage **_retval); + nsresult AddSessionStorage(nsIPrincipal *principal, nsIDOMStorage *storage); + nsresult GetCurrentDocumentChannel(nsIChannel **aCurrentDocumentChannel); + nsresult SetChildOffset(PRUint32 offset); + nsresult GetIsInUnload(PRBool *aIsInUnload); + nsresult GetChannelIsUnsafe(PRBool *aChannelIsUnsafe); + void DetachEditorFromWindow(); + nsresult GetIsOffScreenBrowser(PRBool *aIsOffScreenBrowser); + nsresult SetIsOffScreenBrowser(PRBool aIsOffScreenBrowser); +} + [ object, uuid(365d600b-868a-452a-8de8-f46fad8fee53), @@ -2685,11 +2836,14 @@ interface nsIWineURI : nsIURL { typedef struct NSContainer NSContainer; typedef struct HTMLWindow HTMLWindow; + typedef struct nsChannelBSC nsChannelBSC; nsresult GetNSContainer(NSContainer **aNSContainer); nsresult SetNSContainer(NSContainer *aNSContainer); nsresult GetWindow(HTMLWindow **aHTMLWindow); nsresult SetWindow(HTMLWindow *aHTMLWindow); + nsresult GetChannelBSC(nsChannelBSC **aChannelBSC); + nsresult SetChannelBSC(nsChannelBSC *aChannelBSC); nsresult GetIsDocumentURI(PRBool *aIsDocumentURI); nsresult SetIsDocumentURI(PRBool aIsDocumentURI); nsresult GetWineURL(LPCWSTR *aURL); diff --git a/reactos/dll/win32/mshtml/nsio.c b/reactos/dll/win32/mshtml/nsio.c index 97927472546..46fdcbc320c 100644 --- a/reactos/dll/win32/mshtml/nsio.c +++ b/reactos/dll/win32/mshtml/nsio.c @@ -38,8 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml); -#define LOAD_INITIAL_DOCUMENT_URI 0x80000 - #define NS_IOSERVICE_CLASSNAME "nsIOService" #define NS_IOSERVICE_CONTRACTID "@mozilla.org/network/io-service;1" @@ -60,6 +58,7 @@ typedef struct { nsIURL *nsurl; NSContainer *container; windowref_t *window_ref; + nsChannelBSC *channel_bsc; LPWSTR wine_url; PRBool is_doc_uri; BOOL use_wine_url; @@ -158,6 +157,11 @@ static BOOL before_async_open(nsChannel *channel, NSContainer *container) return hres != S_OK; } +static inline BOOL is_http_channel(nsChannel *This) +{ + return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTP; +} + #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef riid, nsQIResult result) @@ -175,13 +179,13 @@ static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef r *result = NSCHANNEL(This); }else if(IsEqualGUID(&IID_nsIHttpChannel, riid)) { TRACE("(%p)->(IID_nsIHttpChannel %p)\n", This, result); - *result = This->http_channel ? NSHTTPCHANNEL(This) : NULL; + *result = is_http_channel(This) ? NSHTTPCHANNEL(This) : NULL; }else if(IsEqualGUID(&IID_nsIUploadChannel, riid)) { TRACE("(%p)->(IID_nsIUploadChannel %p)\n", This, result); *result = NSUPCHANNEL(This); }else if(IsEqualGUID(&IID_nsIHttpChannelInternal, riid)) { TRACE("(%p)->(IID_nsIHttpChannelInternal %p)\n", This, result); - *result = This->http_channel_internal ? NSHTTPINTERNAL(This) : NULL; + *result = is_http_channel(This) ? NSHTTPINTERNAL(This) : NULL; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result); *result = NULL; @@ -212,12 +216,6 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) if(!ref) { nsIWineURI_Release(This->uri); - if(This->channel) - nsIChannel_Release(This->channel); - if(This->http_channel) - nsIHttpChannel_Release(This->http_channel); - if(This->http_channel_internal) - nsIHttpChannel_Release(This->http_channel_internal); if(This->owner) nsISupports_Release(This->owner); if(This->post_data_stream) @@ -240,10 +238,7 @@ static nsresult NSAPI nsChannel_GetName(nsIHttpChannel *iface, nsACString *aName { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aName); - - if(This->channel) - return nsIChannel_GetName(This->channel, aName); + FIXME("(%p)->(%p)\n", This, aName); return NS_ERROR_NOT_IMPLEMENTED; } @@ -252,12 +247,8 @@ static nsresult NSAPI nsChannel_IsPending(nsIHttpChannel *iface, PRBool *_retval { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, _retval); + FIXME("(%p)->(%p)\n", This, _retval); - if(This->channel) - return nsIChannel_IsPending(This->channel, _retval); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -265,12 +256,8 @@ static nsresult NSAPI nsChannel_GetStatus(nsIHttpChannel *iface, nsresult *aStat { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aStatus); + WARN("(%p)->(%p) returning NS_OK\n", This, aStatus); - if(This->channel) - return nsIChannel_GetStatus(This->channel, aStatus); - - TRACE("returning NS_OK\n"); return *aStatus = NS_OK; } @@ -278,12 +265,8 @@ static nsresult NSAPI nsChannel_Cancel(nsIHttpChannel *iface, nsresult aStatus) { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%08x)\n", This, aStatus); + FIXME("(%p)->(%08x)\n", This, aStatus); - if(This->channel) - return nsIChannel_Cancel(This->channel, aStatus); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -291,12 +274,8 @@ static nsresult NSAPI nsChannel_Suspend(nsIHttpChannel *iface) { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)\n", This); + FIXME("(%p)\n", This); - if(This->channel) - return nsIChannel_Suspend(This->channel); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -304,12 +283,8 @@ static nsresult NSAPI nsChannel_Resume(nsIHttpChannel *iface) { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)\n", This); + FIXME("(%p)\n", This); - if(This->channel) - return nsIChannel_Resume(This->channel); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -336,11 +311,8 @@ static nsresult NSAPI nsChannel_SetLoadGroup(nsIHttpChannel *iface, nsILoadGroup nsILoadGroup_Release(This->load_group); if(aLoadGroup) nsILoadGroup_AddRef(aLoadGroup); - This->load_group = aLoadGroup; - if(This->channel) - return nsIChannel_SetLoadGroup(This->channel, aLoadGroup); return NS_OK; } @@ -361,9 +333,6 @@ static nsresult NSAPI nsChannel_SetLoadFlags(nsIHttpChannel *iface, nsLoadFlags TRACE("(%p)->(%08x)\n", This, aLoadFlags); This->load_flags = aLoadFlags; - - if(This->channel) - return nsIChannel_SetLoadFlags(This->channel, aLoadFlags); return NS_OK; } @@ -391,9 +360,6 @@ static nsresult NSAPI nsChannel_SetOriginalURI(nsIHttpChannel *iface, nsIURI *aO nsIURI_AddRef(aOriginalURI); This->original_uri = aOriginalURI; - - if(This->channel) - return nsIChannel_SetOriginalURI(This->channel, aOriginalURI); return NS_OK; } @@ -415,9 +381,6 @@ static nsresult NSAPI nsChannel_GetOwner(nsIHttpChannel *iface, nsISupports **aO TRACE("(%p)->(%p)\n", This, aOwner); - if(This->channel) - return nsIChannel_GetOwner(This->channel, aOwner); - if(This->owner) nsISupports_AddRef(This->owner); *aOwner = This->owner; @@ -431,9 +394,6 @@ static nsresult NSAPI nsChannel_SetOwner(nsIHttpChannel *iface, nsISupports *aOw TRACE("(%p)->(%p)\n", This, aOwner); - if(This->channel) - return nsIChannel_SetOwner(This->channel, aOwner); - if(aOwner) nsISupports_AddRef(aOwner); if(This->owner) @@ -471,8 +431,6 @@ static nsresult NSAPI nsChannel_SetNotificationCallbacks(nsIHttpChannel *iface, This->notif_callback = aNotificationCallbacks; - if(This->channel) - return nsIChannel_SetNotificationCallbacks(This->channel, aNotificationCallbacks); return NS_OK; } @@ -480,12 +438,8 @@ static nsresult NSAPI nsChannel_GetSecurityInfo(nsIHttpChannel *iface, nsISuppor { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aSecurityInfo); + FIXME("(%p)->(%p)\n", This, aSecurityInfo); - if(This->channel) - return nsIChannel_GetSecurityInfo(This->channel, aSecurityInfo); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -500,9 +454,6 @@ static nsresult NSAPI nsChannel_GetContentType(nsIHttpChannel *iface, nsACString return S_OK; } - if(This->channel) - return nsIChannel_GetContentType(This->channel, aContentType); - WARN("unknown type\n"); return NS_ERROR_FAILURE; } @@ -522,9 +473,6 @@ static nsresult NSAPI nsChannel_SetContentType(nsIHttpChannel *iface, heap_free(This->content_type); This->content_type = heap_strdupA(content_type); - if(This->channel) - return nsIChannel_SetContentType(This->channel, aContentType); - return NS_OK; } @@ -540,13 +488,6 @@ static nsresult NSAPI nsChannel_GetContentCharset(nsIHttpChannel *iface, return NS_OK; } - if(This->channel) { - nsresult nsres = nsIChannel_GetContentCharset(This->channel, aContentCharset); - const char *ch; - nsACString_GetData(aContentCharset, &ch); - return nsres; - } - nsACString_SetData(aContentCharset, ""); return NS_OK; } @@ -556,12 +497,8 @@ static nsresult NSAPI nsChannel_SetContentCharset(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aContentCharset); + FIXME("(%p)->(%p)\n", This, aContentCharset); - if(This->channel) - return nsIChannel_SetContentCharset(This->channel, aContentCharset); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -569,12 +506,8 @@ static nsresult NSAPI nsChannel_GetContentLength(nsIHttpChannel *iface, PRInt32 { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aContentLength); + FIXME("(%p)->(%p)\n", This, aContentLength); - if(This->channel) - return nsIChannel_GetContentLength(This->channel, aContentLength); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -582,12 +515,8 @@ static nsresult NSAPI nsChannel_SetContentLength(nsIHttpChannel *iface, PRInt32 { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%d)\n", This, aContentLength); + FIXME("(%p)->(%d)\n", This, aContentLength); - if(This->channel) - return nsIChannel_SetContentLength(This->channel, aContentLength); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -595,12 +524,8 @@ static nsresult NSAPI nsChannel_Open(nsIHttpChannel *iface, nsIInputStream **_re { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, _retval); + FIXME("(%p)->(%p)\n", This, _retval); - if(This->channel) - return nsIChannel_Open(This->channel, _retval); - - FIXME("default action not implemented\n"); return NS_ERROR_NOT_IMPLEMENTED; } @@ -844,21 +769,21 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen } if(!window) { - TRACE("window = NULL\n"); - return This->channel - ? nsIChannel_AsyncOpen(This->channel, aListener, aContext) - : NS_ERROR_UNEXPECTED; + ERR("window = NULL\n"); + return NS_ERROR_UNEXPECTED; } - if(is_doc_uri && (This->load_flags & LOAD_INITIAL_DOCUMENT_URI)) { - if(window->doc_obj->nscontainer->bscallback) { - NSContainer *nscontainer = window->doc_obj->nscontainer; + if(is_doc_uri && window == window->doc_obj->basedoc.window) { + nsChannelBSC *channel_bsc; - channelbsc_set_channel(nscontainer->bscallback, This, aListener, aContext); + nsIWineURI_GetChannelBSC(This->uri, &channel_bsc); + if(channel_bsc) { + channelbsc_set_channel(channel_bsc, This, aListener, aContext); + IUnknown_Release((IUnknown*)channel_bsc); - if(nscontainer->doc->mime) { + if(window->doc_obj->mime) { heap_free(This->content_type); - This->content_type = heap_strdupWtoA(nscontainer->doc->mime); + This->content_type = heap_strdupWtoA(window->doc_obj->mime); } open = FALSE; @@ -874,8 +799,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen if(open) nsres = async_open(This, window, is_doc_uri, aListener, aContext); - if(window) - IHTMLWindow2_Release(HTMLWINDOW2(window)); + IHTMLWindow2_Release(HTMLWINDOW2(window)); return nsres; } @@ -883,10 +807,7 @@ static nsresult NSAPI nsChannel_GetRequestMethod(nsIHttpChannel *iface, nsACStri { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aRequestMethod); - - if(This->http_channel) - return nsIHttpChannel_GetRequestMethod(This->http_channel, aRequestMethod); + FIXME("(%p)->(%p)\n", This, aRequestMethod); return NS_ERROR_NOT_IMPLEMENTED; } @@ -896,10 +817,7 @@ static nsresult NSAPI nsChannel_SetRequestMethod(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aRequestMethod); - - if(This->http_channel) - return nsIHttpChannel_SetRequestMethod(This->http_channel, aRequestMethod); + FIXME("(%p)->(%p)\n", This, aRequestMethod); return NS_ERROR_NOT_IMPLEMENTED; } @@ -908,10 +826,7 @@ static nsresult NSAPI nsChannel_GetReferrer(nsIHttpChannel *iface, nsIURI **aRef { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aReferrer); - - if(This->http_channel) - return nsIHttpChannel_GetReferrer(This->http_channel, aReferrer); + FIXME("(%p)->(%p)\n", This, aReferrer); return NS_ERROR_NOT_IMPLEMENTED; } @@ -920,12 +835,9 @@ static nsresult NSAPI nsChannel_SetReferrer(nsIHttpChannel *iface, nsIURI *aRefe { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aReferrer); + FIXME("(%p)->(%p)\n", This, aReferrer); - if(This->http_channel) - return nsIHttpChannel_SetReferrer(This->http_channel, aReferrer); - - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } static nsresult NSAPI nsChannel_GetRequestHeader(nsIHttpChannel *iface, @@ -933,10 +845,7 @@ static nsresult NSAPI nsChannel_GetRequestHeader(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p %p)\n", This, aHeader, _retval); - - if(This->http_channel) - return nsIHttpChannel_GetRequestHeader(This->http_channel, aHeader, _retval); + FIXME("(%p)->(%p %p)\n", This, aHeader, _retval); return NS_ERROR_NOT_IMPLEMENTED; } @@ -946,12 +855,9 @@ static nsresult NSAPI nsChannel_SetRequestHeader(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p %p %x)\n", This, aHeader, aValue, aMerge); + FIXME("(%p)->(%p %p %x)\n", This, aHeader, aValue, aMerge); - if(This->http_channel) - return nsIHttpChannel_SetRequestHeader(This->http_channel, aHeader, aValue, aMerge); - - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } static nsresult NSAPI nsChannel_VisitRequestHeaders(nsIHttpChannel *iface, @@ -959,10 +865,7 @@ static nsresult NSAPI nsChannel_VisitRequestHeaders(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aVisitor); - - if(This->http_channel) - return nsIHttpChannel_VisitRequestHeaders(This->http_channel, aVisitor); + FIXME("(%p)->(%p)\n", This, aVisitor); return NS_ERROR_NOT_IMPLEMENTED; } @@ -971,10 +874,7 @@ static nsresult NSAPI nsChannel_GetAllowPipelining(nsIHttpChannel *iface, PRBool { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aAllowPipelining); - - if(This->http_channel) - return nsIHttpChannel_GetAllowPipelining(This->http_channel, aAllowPipelining); + FIXME("(%p)->(%p)\n", This, aAllowPipelining); return NS_ERROR_NOT_IMPLEMENTED; } @@ -983,10 +883,7 @@ static nsresult NSAPI nsChannel_SetAllowPipelining(nsIHttpChannel *iface, PRBool { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%x)\n", This, aAllowPipelining); - - if(This->http_channel) - return nsIHttpChannel_SetAllowPipelining(This->http_channel, aAllowPipelining); + FIXME("(%p)->(%x)\n", This, aAllowPipelining); return NS_ERROR_NOT_IMPLEMENTED; } @@ -995,10 +892,7 @@ static nsresult NSAPI nsChannel_GetRedirectionLimit(nsIHttpChannel *iface, PRUin { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aRedirectionLimit); - - if(This->http_channel) - return nsIHttpChannel_GetRedirectionLimit(This->http_channel, aRedirectionLimit); + FIXME("(%p)->(%p)\n", This, aRedirectionLimit); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1007,10 +901,7 @@ static nsresult NSAPI nsChannel_SetRedirectionLimit(nsIHttpChannel *iface, PRUin { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%u)\n", This, aRedirectionLimit); - - if(This->http_channel) - return nsIHttpChannel_SetRedirectionLimit(This->http_channel, aRedirectionLimit); + FIXME("(%p)->(%u)\n", This, aRedirectionLimit); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1026,9 +917,7 @@ static nsresult NSAPI nsChannel_GetResponseStatus(nsIHttpChannel *iface, PRUint3 return NS_OK; } - if(This->http_channel) - return nsIHttpChannel_GetResponseStatus(This->http_channel, aResponseStatus); - + WARN("No response status\n"); return NS_ERROR_UNEXPECTED; } @@ -1037,10 +926,7 @@ static nsresult NSAPI nsChannel_GetResponseStatusText(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aResponseStatusText); - - if(This->http_channel) - return nsIHttpChannel_GetResponseStatusText(This->http_channel, aResponseStatusText); + FIXME("(%p)->(%p)\n", This, aResponseStatusText); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1050,10 +936,7 @@ static nsresult NSAPI nsChannel_GetRequestSucceeded(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aRequestSucceeded); - - if(This->http_channel) - return nsIHttpChannel_GetRequestSucceeded(This->http_channel, aRequestSucceeded); + FIXME("(%p)->(%p)\n", This, aRequestSucceeded); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1063,10 +946,7 @@ static nsresult NSAPI nsChannel_GetResponseHeader(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p %p)\n", This, header, _retval); - - if(This->http_channel) - return nsIHttpChannel_GetResponseHeader(This->http_channel, header, _retval); + FIXME("(%p)->(%p %p)\n", This, header, _retval); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1076,10 +956,7 @@ static nsresult NSAPI nsChannel_SetResponseHeader(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p %p %x)\n", This, header, value, merge); - - if(This->http_channel) - return nsIHttpChannel_SetResponseHeader(This->http_channel, header, value, merge); + FIXME("(%p)->(%p %p %x)\n", This, header, value, merge); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1089,10 +966,7 @@ static nsresult NSAPI nsChannel_VisitResponseHeaders(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aVisitor); - - if(This->http_channel) - return nsIHttpChannel_VisitResponseHeaders(This->http_channel, aVisitor); + FIXME("(%p)->(%p)\n", This, aVisitor); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1101,10 +975,7 @@ static nsresult NSAPI nsChannel_IsNoStoreResponse(nsIHttpChannel *iface, PRBool { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, _retval); - - if(This->http_channel) - return nsIHttpChannel_IsNoStoreResponse(This->http_channel, _retval); + FIXME("(%p)->(%p)\n", This, _retval); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1113,10 +984,7 @@ static nsresult NSAPI nsChannel_IsNoCacheResponse(nsIHttpChannel *iface, PRBool { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, _retval); - - if(This->http_channel) - return nsIHttpChannel_IsNoCacheResponse(This->http_channel, _retval); + FIXME("(%p)->(%p)\n", This, _retval); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1200,7 +1068,6 @@ static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface, { nsChannel *This = NSUPCHANNEL_THIS(iface); const char *content_type; - nsresult nsres; TRACE("(%p)->(%p %p %d)\n", This, aStream, aContentType, aContentLength); @@ -1222,20 +1089,6 @@ static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface, if(aStream) nsIInputStream_AddRef(aStream); - if(This->post_data_stream) { - nsIUploadChannel *upload_channel; - - nsres = nsIChannel_QueryInterface(This->channel, &IID_nsIUploadChannel, - (void**)&upload_channel); - if(NS_SUCCEEDED(nsres)) { - nsres = nsIUploadChannel_SetUploadStream(upload_channel, aStream, aContentType, aContentLength); - nsIUploadChannel_Release(upload_channel); - if(NS_FAILED(nsres)) - WARN("SetUploadStream failed: %08x\n", nsres); - - } - } - return NS_OK; } @@ -1288,10 +1141,8 @@ static nsresult NSAPI nsHttpChannelInternal_GetDocumentURI(nsIHttpChannelInterna { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_GetDocumentURI(This->http_channel_internal, aDocumentURI); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1299,10 +1150,8 @@ static nsresult NSAPI nsHttpChannelInternal_SetDocumentURI(nsIHttpChannelInterna { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_SetDocumentURI(This->http_channel_internal, aDocumentURI); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1310,10 +1159,8 @@ static nsresult NSAPI nsHttpChannelInternal_GetRequestVersion(nsIHttpChannelInte { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_GetRequestVersion(This->http_channel_internal, major, minor); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1321,10 +1168,8 @@ static nsresult NSAPI nsHttpChannelInternal_GetResponseVersion(nsIHttpChannelInt { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_GetResponseVersion(This->http_channel_internal, major, minor); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1332,10 +1177,8 @@ static nsresult NSAPI nsHttpChannelInternal_SetCookie(nsIHttpChannelInternal *if { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_SetCookie(This->http_channel_internal, aCookieHeader); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1343,10 +1186,8 @@ static nsresult NSAPI nsHttpChannelInternal_SetupFallbackChannel(nsIHttpChannelI { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_SetupFallbackChannel(This->http_channel_internal, aFallbackKey); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1354,10 +1195,8 @@ static nsresult NSAPI nsHttpChannelInternal_GetForceAllowThirdPartyCookie(nsIHtt { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_GetForceAllowThirdPartyCookie(This->http_channel_internal, aForceThirdPartyCookie); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1365,10 +1204,8 @@ static nsresult NSAPI nsHttpChannelInternal_SetForceAllowThirdPartyCookie(nsIHtt { nsChannel *This = NSHTTPINTERNAL_THIS(iface); - TRACE("(%p)->()\n", This); + FIXME("(%p)->()\n", This); - if(This->http_channel_internal) - return nsIHttpChannelInternal_SetForceAllowThirdPartyCookie(This->http_channel_internal, aForceThirdPartyCookie); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1506,7 +1343,7 @@ static nsresult NSAPI nsURI_GetScheme(nsIWineURI *iface, nsACString *aScheme) TRACE("(%p)->(%p)\n", This, aScheme); - if(This->use_wine_url && strcmpW(This->wine_url, about_blankW)) { + if(This->use_wine_url) { /* * For Gecko we set scheme to unknown so it won't be handled * as any special case. @@ -2220,6 +2057,32 @@ static nsresult NSAPI nsURI_SetWindow(nsIWineURI *iface, HTMLWindow *aHTMLWindow return NS_OK; } +static nsresult NSAPI nsURI_GetChannelBSC(nsIWineURI *iface, nsChannelBSC **aChannelBSC) +{ + nsURI *This = NSURI_THIS(iface); + + TRACE("(%p)->(%p)\n", This, aChannelBSC); + + if(This->channel_bsc) + IUnknown_AddRef((IUnknown*)This->channel_bsc); + *aChannelBSC = This->channel_bsc; + return NS_OK; +} + +static nsresult NSAPI nsURI_SetChannelBSC(nsIWineURI *iface, nsChannelBSC *aChannelBSC) +{ + nsURI *This = NSURI_THIS(iface); + + TRACE("(%p)->(%p)\n", This, aChannelBSC); + + if(This->channel_bsc) + IUnknown_Release((IUnknown*)This->channel_bsc); + if(aChannelBSC) + IUnknown_AddRef((IUnknown*)aChannelBSC); + This->channel_bsc = aChannelBSC; + return NS_OK; +} + static nsresult NSAPI nsURI_GetIsDocumentURI(nsIWineURI *iface, PRBool *aIsDocumentURI) { nsURI *This = NSURI_THIS(iface); @@ -2267,11 +2130,15 @@ static nsresult NSAPI nsURI_SetWineURL(nsIWineURI *iface, LPCWSTR aURL) This->wine_url = heap_alloc(len*sizeof(WCHAR)); memcpy(This->wine_url, aURL, len*sizeof(WCHAR)); - /* FIXME: Always use wine url */ - This->use_wine_url = - strncmpW(aURL, wszFtp, sizeof(wszFtp)/sizeof(WCHAR)) - && strncmpW(aURL, wszHttp, sizeof(wszHttp)/sizeof(WCHAR)) - && strncmpW(aURL, wszHttps, sizeof(wszHttps)/sizeof(WCHAR)); + if(This->uri) { + /* FIXME: Always use wine url */ + This->use_wine_url = + strncmpW(aURL, wszFtp, sizeof(wszFtp)/sizeof(WCHAR)) + && strncmpW(aURL, wszHttp, sizeof(wszHttp)/sizeof(WCHAR)) + && strncmpW(aURL, wszHttps, sizeof(wszHttps)/sizeof(WCHAR)); + }else { + This->use_wine_url = TRUE; + } }else { This->wine_url = NULL; This->use_wine_url = FALSE; @@ -2334,6 +2201,8 @@ static const nsIWineURIVtbl nsWineURIVtbl = { nsURI_SetNSContainer, nsURI_GetWindow, nsURI_SetWindow, + nsURI_GetChannelBSC, + nsURI_SetChannelBSC, nsURI_GetIsDocumentURI, nsURI_SetIsDocumentURI, nsURI_GetWineURL, @@ -2361,6 +2230,22 @@ static nsresult create_uri(nsIURI *uri, HTMLWindow *window, NSContainer *contain return NS_OK; } +HRESULT create_doc_uri(HTMLWindow *window, WCHAR *url, nsIWineURI **ret) +{ + nsIWineURI *uri; + nsresult nsres; + + nsres = create_uri(NULL, window, window->doc_obj->nscontainer, &uri); + if(NS_FAILED(nsres)) + return E_FAIL; + + nsIWineURI_SetWineURL(uri, url); + nsIWineURI_SetIsDocumentURI(uri, TRUE); + + *ret = uri; + return S_OK; +} + typedef struct { const nsIProtocolHandlerVtbl *lpProtocolHandlerVtbl; @@ -2607,38 +2492,25 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * } if(aBaseURI) { - nsACString base_uri_str; - const char *base_uri = NULL; + PARSEDURLA parsed_url = {sizeof(PARSEDURLA)}; - nsACString_Init(&base_uri_str, NULL); - - nsres = nsIURI_GetSpec(aBaseURI, &base_uri_str); + nsres = nsIURI_QueryInterface(aBaseURI, &IID_nsIWineURI, (void**)&base_wine_uri); if(NS_SUCCEEDED(nsres)) { - nsACString_GetData(&base_uri_str, &base_uri); - TRACE("base_uri=%s\n", debugstr_a(base_uri)); + nsIWineURI_GetWineURL(base_wine_uri, &base_wine_url); + nsIWineURI_GetWindow(base_wine_uri, &window); + TRACE("base url: %s window: %p\n", debugstr_w(base_wine_url), window); + }else if(FAILED(ParseURLA(spec, &parsed_url))) { + TRACE("not wraping\n"); + return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); }else { - ERR("GetSpec failed: %08x\n", nsres); + WARN("Could not get base nsIWineURI: %08x\n", nsres); } - - nsACString_Finish(&base_uri_str); } nsres = nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, &uri); if(NS_FAILED(nsres)) TRACE("NewURI failed: %08x\n", nsres); - if(aBaseURI) { - nsres = nsIURI_QueryInterface(aBaseURI, &IID_nsIWineURI, (void**)&base_wine_uri); - if(NS_SUCCEEDED(nsres)) { - nsIWineURI_GetWindow(base_wine_uri, &window); - nsIWineURI_GetWineURL(base_wine_uri, &base_wine_url); - }else { - TRACE("Could not get base nsIWineURI: %08x\n", nsres); - } - } - - TRACE("window = %p\n", window); - nsres = create_uri(uri, window, NULL, &wine_uri); *_retval = (nsIURI*)wine_uri; @@ -2682,25 +2554,18 @@ static nsresult NSAPI nsIOService_NewFileURI(nsIIOService *iface, nsIFile *aFile static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI *aURI, nsIChannel **_retval) { - nsIChannel *channel = NULL; + PARSEDURLW parsed_url = {sizeof(PARSEDURLW)}; nsChannel *ret; nsIWineURI *wine_uri; + const WCHAR *url; nsresult nsres; TRACE("(%p %p)\n", aURI, _retval); - nsres = nsIIOService_NewChannelFromURI(nsio, aURI, &channel); - if(NS_FAILED(nsres) && nsres != NS_ERROR_UNKNOWN_PROTOCOL) { - WARN("NewChannelFromURI failed: %08x\n", nsres); - *_retval = channel; - return nsres; - } - nsres = nsIURI_QueryInterface(aURI, &IID_nsIWineURI, (void**)&wine_uri); if(NS_FAILED(nsres)) { - WARN("Could not get nsIWineURI: %08x\n", nsres); - *_retval = channel; - return channel ? NS_OK : NS_ERROR_UNEXPECTED; + TRACE("Could not get nsIWineURI: %08x\n", nsres); + return nsIIOService_NewChannelFromURI(nsio, aURI, _retval); } ret = heap_alloc_zero(sizeof(nsChannel)); @@ -2709,16 +2574,13 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI ret->lpUploadChannelVtbl = &nsUploadChannelVtbl; ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl; ret->ref = 1; - ret->channel = channel; ret->uri = wine_uri; nsIURI_AddRef(aURI); ret->original_uri = aURI; - if(channel) { - nsIChannel_QueryInterface(channel, &IID_nsIHttpChannel, (void**)&ret->http_channel); - nsIChannel_QueryInterface(channel, &IID_nsIHttpChannelInternal, (void**)&ret->http_channel_internal); - } + nsIWineURI_GetWineURL(wine_uri, &url); + ret->url_scheme = url && SUCCEEDED(ParseURLW(url, &parsed_url)) ? parsed_url.nScheme : URL_SCHEME_UNKNOWN; *_retval = NSCHANNEL(ret); return NS_OK; diff --git a/reactos/dll/win32/mshtml/oleobj.c b/reactos/dll/win32/mshtml/oleobj.c index e9cb2040a0a..3dec3dc62dd 100644 --- a/reactos/dll/win32/mshtml/oleobj.c +++ b/reactos/dll/win32/mshtml/oleobj.c @@ -250,6 +250,9 @@ static HRESULT WINAPI OleObject_Close(IOleObject *iface, DWORD dwSaveOption) IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This)); HTMLDocument_LockContainer(This->doc_obj, FALSE); + + if(This->advise_holder) + IOleAdviseHolder_SendOnClose(This->advise_holder); return S_OK; } @@ -380,22 +383,46 @@ static HRESULT WINAPI OleObject_GetExtent(IOleObject *iface, DWORD dwDrawAspect, static HRESULT WINAPI OleObject_Advise(IOleObject *iface, IAdviseSink *pAdvSink, DWORD *pdwConnection) { HTMLDocument *This = OLEOBJ_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection); - return E_NOTIMPL; + TRACE("(%p)->(%p %p)\n", This, pAdvSink, pdwConnection); + + if(!pdwConnection) + return E_INVALIDARG; + + if(!pAdvSink) { + *pdwConnection = 0; + return E_INVALIDARG; + } + + if(!This->advise_holder) { + CreateOleAdviseHolder(&This->advise_holder); + if(!This->advise_holder) + return E_OUTOFMEMORY; + } + + return IOleAdviseHolder_Advise(This->advise_holder, pAdvSink, pdwConnection); } static HRESULT WINAPI OleObject_Unadvise(IOleObject *iface, DWORD dwConnection) { HTMLDocument *This = OLEOBJ_THIS(iface); - FIXME("(%p)->(%d)\n", This, dwConnection); - return E_NOTIMPL; + TRACE("(%p)->(%d)\n", This, dwConnection); + + if(!This->advise_holder) + return OLE_E_NOCONNECTION; + + return IOleAdviseHolder_Unadvise(This->advise_holder, dwConnection); } static HRESULT WINAPI OleObject_EnumAdvise(IOleObject *iface, IEnumSTATDATA **ppenumAdvise) { HTMLDocument *This = OLEOBJ_THIS(iface); - FIXME("(%p)->(%p)\n", This, ppenumAdvise); - return E_NOTIMPL; + + if(!This->advise_holder) { + *ppenumAdvise = NULL; + return S_OK; + } + + return IOleAdviseHolder_EnumAdvise(This->advise_holder, ppenumAdvise); } static HRESULT WINAPI OleObject_GetMiscStatus(IOleObject *iface, DWORD dwAspect, DWORD *pdwStatus) @@ -705,6 +732,54 @@ static const IOleControlVtbl OleControlVtbl = { OleControl_FreezeEvents }; +/********************************************************** + * IObjectWithSite implementation + */ + +#define OBJSITE_THIS(iface) DEFINE_THIS(HTMLDocument, ObjectWithSite, iface) + +static HRESULT WINAPI ObjectWithSite_QueryInterface(IObjectWithSite *iface, REFIID riid, void **ppvObject) +{ + HTMLDocument *This = OBJSITE_THIS(iface); + return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject); +} + +static ULONG WINAPI ObjectWithSite_AddRef(IObjectWithSite *iface) +{ + HTMLDocument *This = OBJSITE_THIS(iface); + return IHTMLDocument2_AddRef(HTMLDOC(This)); +} + +static ULONG WINAPI ObjectWithSite_Release(IObjectWithSite *iface) +{ + HTMLDocument *This = OBJSITE_THIS(iface); + return IHTMLDocument2_Release(HTMLDOC(This)); +} + +static HRESULT WINAPI ObjectWithSite_SetSite(IObjectWithSite *iface, IUnknown *pUnkSite) +{ + HTMLDocument *This = OBJSITE_THIS(iface); + FIXME("(%p)->(%p)\n", This, pUnkSite); + return E_NOTIMPL; +} + +static HRESULT WINAPI ObjectWithSite_GetSite(IObjectWithSite* iface, REFIID riid, PVOID *ppvSite) +{ + HTMLDocument *This = OBJSITE_THIS(iface); + FIXME("(%p)->(%p)\n", This, ppvSite); + return E_NOTIMPL; +} + +#undef OBJSITE_THIS + +static const IObjectWithSiteVtbl ObjectWithSiteVtbl = { + ObjectWithSite_QueryInterface, + ObjectWithSite_AddRef, + ObjectWithSite_Release, + ObjectWithSite_SetSite, + ObjectWithSite_GetSite +}; + void HTMLDocument_LockContainer(HTMLDocumentObj *This, BOOL fLock) { IOleContainer *container; @@ -726,4 +801,5 @@ void HTMLDocument_OleObj_Init(HTMLDocument *This) This->lpOleObjectVtbl = &OleObjectVtbl; This->lpOleDocumentVtbl = &OleDocumentVtbl; This->lpOleControlVtbl = &OleControlVtbl; + This->lpObjectWithSiteVtbl = &ObjectWithSiteVtbl; } diff --git a/reactos/dll/win32/mshtml/persist.c b/reactos/dll/win32/mshtml/persist.c index f3d23bd1021..d3014b8d330 100644 --- a/reactos/dll/win32/mshtml/persist.c +++ b/reactos/dll/win32/mshtml/persist.c @@ -36,16 +36,25 @@ #include "wine/unicode.h" #include "mshtml_private.h" +#include "htmlevent.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); +typedef struct { + task_t header; + HTMLDocumentObj *doc; + BOOL set_download; +} download_proc_task_t; + static BOOL use_gecko_script(LPCWSTR url) { static const WCHAR fileW[] = {'f','i','l','e',':'}; static const WCHAR aboutW[] = {'a','b','o','u','t',':'}; + static const WCHAR resW[] = {'r','e','s',':'}; return strncmpiW(fileW, url, sizeof(fileW)/sizeof(WCHAR)) - && strncmpiW(aboutW, url, sizeof(aboutW)/sizeof(WCHAR)); + && strncmpiW(aboutW, url, sizeof(aboutW)/sizeof(WCHAR)) + && strncmpiW(resW, url, sizeof(resW)/sizeof(WCHAR)); } void set_current_mon(HTMLWindow *This, IMoniker *mon) @@ -117,7 +126,8 @@ static void set_progress_proc(task_t *_task) static void set_downloading_proc(task_t *_task) { - HTMLDocumentObj *doc = ((docobj_task_t*)_task)->doc; + download_proc_task_t *task = (download_proc_task_t*)_task; + HTMLDocumentObj *doc = task->doc; IOleCommandTarget *olecmd; HRESULT hres; @@ -129,16 +139,20 @@ static void set_downloading_proc(task_t *_task) if(!doc->client) return; - hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); - if(SUCCEEDED(hres)) { - VARIANT var; + if(task->set_download) { + hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); + if(SUCCEEDED(hres)) { + VARIANT var; - V_VT(&var) = VT_I4; - V_I4(&var) = 1; + V_VT(&var) = VT_I4; + V_I4(&var) = 1; - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, - &var, NULL); - IOleCommandTarget_Release(olecmd); + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, + OLECMDEXECOPT_DONTPROMPTUSER, &var, NULL); + IOleCommandTarget_Release(olecmd); + } + + doc->download_state = 1; } if(doc->hostui) { @@ -152,13 +166,14 @@ static void set_downloading_proc(task_t *_task) } } -static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc) +static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL set_download) { nsChannelBSC *bscallback; LPOLESTR url = NULL; docobj_task_t *task; + download_proc_task_t *download_task; + nsIWineURI *nsuri; HRESULT hres; - nsresult nsres; if(pibc) { IUnknown *unk = NULL; @@ -239,34 +254,32 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc) } } + hres = create_doc_uri(This->window, url, &nsuri); + CoTaskMemFree(url); + if(FAILED(hres)) + return hres; + bscallback = create_channelbsc(mon); + nsIWineURI_SetChannelBSC(nsuri, bscallback); + hres = load_nsuri(This->window, nsuri, LOAD_INITIAL_DOCUMENT_URI); + nsIWineURI_SetChannelBSC(nsuri, NULL); + if(SUCCEEDED(hres)) + set_window_bscallback(This->window, bscallback); + IUnknown_Release((IUnknown*)bscallback); + if(FAILED(hres)) + return hres; + if(This->doc_obj->frame) { task = heap_alloc(sizeof(docobj_task_t)); task->doc = This->doc_obj; push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic); } - task = heap_alloc(sizeof(docobj_task_t)); - task->doc = This->doc_obj; - push_task(&task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic); - - if(This->doc_obj->nscontainer) { - This->doc_obj->nscontainer->bscallback = bscallback; - nsres = nsIWebNavigation_LoadURI(This->doc_obj->nscontainer->navigation, url, - LOAD_FLAGS_NONE, NULL, NULL, NULL); - This->doc_obj->nscontainer->bscallback = NULL; - if(NS_FAILED(nsres)) { - WARN("LoadURI failed: %08x\n", nsres); - IUnknown_Release((IUnknown*)bscallback); - CoTaskMemFree(url); - return E_FAIL; - } - } - - set_window_bscallback(This->window, bscallback); - IUnknown_Release((IUnknown*)bscallback); - CoTaskMemFree(url); + download_task = heap_alloc(sizeof(download_proc_task_t)); + download_task->doc = This->doc_obj; + download_task->set_download = set_download; + push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic); return S_OK; } @@ -274,8 +287,11 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc) void set_ready_state(HTMLWindow *window, READYSTATE readystate) { window->readystate = readystate; - if(window->doc_obj->basedoc.window == window) + if(window->doc_obj && window->doc_obj->basedoc.window == window) call_property_onchanged(&window->doc_obj->basedoc.cp_propnotif, DISPID_READYSTATE); + if(window->frame_element) + fire_event(window->frame_element->element.node.doc, EVENTID_READYSTATECHANGE, + window->frame_element->element.node.nsnode, NULL); } static HRESULT get_doc_string(HTMLDocumentNode *This, char **str) @@ -359,7 +375,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva TRACE("(%p)->(%x %p %p %08x)\n", This, fFullyAvailable, pimkName, pibc, grfMode); - hres = set_moniker(This, pimkName, pibc); + hres = set_moniker(This, pimkName, pibc, TRUE); if(FAILED(hres)) return hres; @@ -620,7 +636,7 @@ static HRESULT WINAPI PersistStreamInit_Load(IPersistStreamInit *iface, LPSTREAM return hres; } - hres = set_moniker(This, mon, NULL); + hres = set_moniker(This, mon, NULL, TRUE); IMoniker_Release(mon); if(FAILED(hres)) return hres; @@ -665,8 +681,45 @@ static HRESULT WINAPI PersistStreamInit_GetSizeMax(IPersistStreamInit *iface, static HRESULT WINAPI PersistStreamInit_InitNew(IPersistStreamInit *iface) { HTMLDocument *This = PERSTRINIT_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + IMoniker *mon; + HGLOBAL body; + LPSTREAM stream; + HRESULT hres; + + static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; + static const WCHAR html_bodyW[] = {'<','H','T','M','L','>','<','/','H','T','M','L','>',0}; + + TRACE("(%p)\n", This); + + body = GlobalAlloc(0, sizeof(html_bodyW)); + if(!body) + return E_OUTOFMEMORY; + memcpy(body, html_bodyW, sizeof(html_bodyW)); + + hres = CreateURLMoniker(NULL, about_blankW, &mon); + if(FAILED(hres)) { + WARN("CreateURLMoniker failed: %08x\n", hres); + GlobalFree(body); + return hres; + } + + hres = set_moniker(This, mon, NULL, FALSE); + IMoniker_Release(mon); + if(FAILED(hres)) { + GlobalFree(body); + return hres; + } + + hres = CreateStreamOnHGlobal(body, TRUE, &stream); + if(FAILED(hres)) { + GlobalFree(body); + return hres; + } + + hres = channelbsc_load_stream(This->window->bscallback, stream); + + IStream_Release(stream); + return hres; } #undef PERSTRINIT_THIS diff --git a/reactos/dll/win32/mshtml/script.c b/reactos/dll/win32/mshtml/script.c index 7df0dd6e9f3..efd2605de39 100644 --- a/reactos/dll/win32/mshtml/script.c +++ b/reactos/dll/win32/mshtml/script.c @@ -895,7 +895,7 @@ BOOL find_global_prop(HTMLWindow *window, BSTR name, DWORD flags, ScriptHost **r hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { - hres = IDispatchEx_GetDispID(dispex, name, flags, ret_id); + hres = IDispatchEx_GetDispID(dispex, name, flags & (~fdexNameEnsure), ret_id); IDispatchEx_Release(dispex); }else { FIXME("No IDispatchEx\n"); diff --git a/reactos/dll/win32/mshtml/secmgr.c b/reactos/dll/win32/mshtml/secmgr.c index 8938943fb56..e35a83b5c29 100644 --- a/reactos/dll/win32/mshtml/secmgr.c +++ b/reactos/dll/win32/mshtml/secmgr.c @@ -84,7 +84,7 @@ static HRESULT WINAPI InternetHostSecurityManager_ProcessUrlAction(IInternetHost pContext, cbContext, dwFlags, dwReserved); } -static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown *obj) +static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct CONFIRMSAFETY *cs, DWORD *ret) { DWORD policy, enabled_opts, supported_opts; IObjectSafety *obj_safety; @@ -94,12 +94,29 @@ static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown * hres = IInternetSecurityManager_ProcessUrlAction(This->secmgr, url, URLACTION_SCRIPT_SAFE_ACTIVEX, (BYTE*)&policy, sizeof(policy), NULL, 0, 0, 0); - if(FAILED(hres) || policy != URLPOLICY_ALLOW) - return URLPOLICY_DISALLOW; + if(FAILED(hres) || policy != URLPOLICY_ALLOW) { + *ret = URLPOLICY_DISALLOW; + return S_OK; + } - hres = IUnknown_QueryInterface(obj, &IID_IObjectSafety, (void**)&obj_safety); - if(FAILED(hres)) - return URLPOLICY_DISALLOW; + hres = IUnknown_QueryInterface(cs->pUnk, &IID_IObjectSafety, (void**)&obj_safety); + if(FAILED(hres)) { + CATID scripting_catid = CATID_SafeForScripting; + + if(!This->catmgr) { + hres = CoCreateInstance(&CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, + &IID_ICatInformation, (void**)&This->catmgr); + if(FAILED(hres)) + return hres; + } + + hres = ICatInformation_IsClassOfCategories(This->catmgr, &cs->clsid, 1, &scripting_catid, 0, NULL); + if(FAILED(hres)) + return hres; + + *ret = hres == S_OK ? URLPOLICY_ALLOW : URLPOLICY_DISALLOW; + return S_OK; + } hres = IObjectSafety_GetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, &supported_opts, &enabled_opts); if(SUCCEEDED(hres)) { @@ -109,10 +126,9 @@ static DWORD confirm_safety(HTMLDocumentNode *This, const WCHAR *url, IUnknown * hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts); } IObjectSafety_Release(obj_safety); - if(FAILED(hres)) - return URLPOLICY_DISALLOW; - return URLPOLICY_ALLOW; + *ret = SUCCEEDED(hres) ? URLPOLICY_ALLOW : URLPOLICY_DISALLOW; + return S_OK; } static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHostSecurityManager *iface, REFGUID guidKey, @@ -149,7 +165,9 @@ static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHos return E_FAIL; } - policy = confirm_safety(This, url, cs->pUnk); + hres = confirm_safety(This, url, cs, &policy); + if(FAILED(hres)) + return hres; *ppPolicy = CoTaskMemAlloc(sizeof(policy)); if(!*ppPolicy) diff --git a/reactos/dll/win32/mshtml/service.c b/reactos/dll/win32/mshtml/service.c index d120cf4e337..c77afe4b750 100644 --- a/reactos/dll/win32/mshtml/service.c +++ b/reactos/dll/win32/mshtml/service.c @@ -248,9 +248,24 @@ static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFG return S_OK; } + if(This->doc_obj->client) { + IServiceProvider *sp; + HRESULT hres; + + hres = IOleClientSite_QueryInterface(This->doc_obj->client, + &IID_IServiceProvider, (void**)&sp); + if(SUCCEEDED(hres)) { + hres = IServiceProvider_QueryService(sp, guidService, riid, ppv); + IServiceProvider_Release(sp); + + if(SUCCEEDED(hres)) + return hres; + } + } + FIXME("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv); - return E_UNEXPECTED; + return E_NOINTERFACE; } static const IServiceProviderVtbl ServiceProviderVtbl = { diff --git a/reactos/dll/win32/mshtml/task.c b/reactos/dll/win32/mshtml/task.c index e6b94a2d228..eae51cacd15 100644 --- a/reactos/dll/win32/mshtml/task.c +++ b/reactos/dll/win32/mshtml/task.c @@ -199,12 +199,6 @@ HRESULT clear_task_timer(HTMLDocument *doc, BOOL interval, DWORD id) return S_OK; } -void parse_complete(HTMLDocumentObj *doc) -{ - TRACE("(%p)\n", doc); - -} - static void call_timer_disp(IDispatch *disp) { DISPPARAMS dp = {NULL, NULL, 0, 0}; diff --git a/reactos/dll/win32/mshtml/txtrange.c b/reactos/dll/win32/mshtml/txtrange.c index c068c06014c..0ece6ecb969 100644 --- a/reactos/dll/win32/mshtml/txtrange.c +++ b/reactos/dll/win32/mshtml/txtrange.c @@ -177,12 +177,14 @@ static BOOL is_space_elem(nsIDOMNode *node) return ret; } -static inline void wstrbuf_init(wstrbuf_t *buf) +static inline BOOL wstrbuf_init(wstrbuf_t *buf) { buf->len = 0; buf->size = 16; buf->buf = heap_alloc(buf->size * sizeof(WCHAR)); + if (!buf->buf) return FALSE; *buf->buf = 0; + return TRUE; } static inline void wstrbuf_finish(wstrbuf_t *buf) @@ -549,13 +551,14 @@ HRESULT get_node_text(HTMLDOMNode *node, BSTR *ret) wstrbuf_t buf; HRESULT hres = S_OK; - wstrbuf_init(&buf); + if (!wstrbuf_init(&buf)) + return E_OUTOFMEMORY; wstrbuf_append_node_rec(&buf, node->nsnode); if(buf.buf) { *ret = SysAllocString(buf.buf); if(!*ret) hres = E_OUTOFMEMORY; - }else { + } else { *ret = NULL; } wstrbuf_finish(&buf); @@ -1171,9 +1174,10 @@ static HRESULT WINAPI HTMLTxtRange_get_text(IHTMLTxtRange *iface, BSTR *p) if(!This->nsrange) return S_OK; - wstrbuf_init(&buf); + if (!wstrbuf_init(&buf)) + return E_OUTOFMEMORY; range_to_string(This, &buf); - if(buf.buf) + if (buf.buf) *p = SysAllocString(buf.buf); wstrbuf_finish(&buf); diff --git a/reactos/dll/win32/mshtml/view.c b/reactos/dll/win32/mshtml/view.c index 0d1d0552823..f4c62a03d63 100644 --- a/reactos/dll/win32/mshtml/view.c +++ b/reactos/dll/win32/mshtml/view.c @@ -342,6 +342,14 @@ static HRESULT activate_window(HTMLDocumentObj *This) IOleInPlaceFrame_Release(This->frame); This->frame = pIPFrame; + if(!This->request_uiactivate) { + hres = IOleInPlaceSite_QueryInterface(This->ipsite, &IID_IOleInPlaceSiteEx, (void**)&ipsiteex); + if(SUCCEEDED(hres)) { + IOleInPlaceSiteEx_RequestUIActivate(ipsiteex); + IOleInPlaceSiteEx_Release(ipsiteex); + } + } + This->window_active = TRUE; return S_OK; @@ -466,6 +474,7 @@ static HRESULT WINAPI OleDocumentView_SetInPlaceSite(IOleDocumentView *iface, IO IOleInPlaceSite_Release(This->doc_obj->ipsite); This->doc_obj->ipsite = pIPSite; + This->doc_obj->request_uiactivate = TRUE; return S_OK; } @@ -557,6 +566,10 @@ static HRESULT WINAPI OleDocumentView_Show(IOleDocumentView *iface, BOOL fShow) ShowWindow(This->doc_obj->hwnd, SW_SHOW); }else { ShowWindow(This->doc_obj->hwnd, SW_HIDE); + + if(This->doc_obj->in_place_active) + IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This)); + if(This->doc_obj->ip_window) { IOleInPlaceUIWindow_Release(This->doc_obj->ip_window); This->doc_obj->ip_window = NULL; @@ -574,8 +587,35 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f TRACE("(%p)->(%x)\n", This, fUIActivate); if(!This->doc_obj->ipsite) { - FIXME("This->ipsite = NULL\n"); - return E_FAIL; + IOleClientSite *cs = This->doc_obj->client; + IOleInPlaceSite *ips; + + if(!cs) { + WARN("this->ipsite = NULL\n"); + return E_UNEXPECTED; + } + + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSiteWindowless, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSiteEx, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + hres = IOleClientSite_QueryInterface(cs, &IID_IOleInPlaceSite, (void**)&ips); + if(SUCCEEDED(hres)) + This->doc_obj->ipsite = ips; + else { + WARN("this->ipsite = NULL\n"); + return E_NOINTERFACE; + } + } + } + + IOleClientSite_AddRef(This->doc_obj->ipsite); + This->doc_obj->request_uiactivate = FALSE; + HTMLDocument_LockContainer(This->doc_obj, TRUE); } if(fUIActivate) { @@ -711,27 +751,27 @@ static const IOleDocumentViewVtbl OleDocumentViewVtbl = { * IViewObject implementation */ -#define VIEWOBJ_THIS(iface) DEFINE_THIS(HTMLDocument, ViewObject2, iface) +#define VIEWOBJ_THIS(iface) DEFINE_THIS(HTMLDocument, ViewObjectEx, iface) -static HRESULT WINAPI ViewObject_QueryInterface(IViewObject2 *iface, REFIID riid, void **ppvObject) +static HRESULT WINAPI ViewObject_QueryInterface(IViewObjectEx *iface, REFIID riid, void **ppvObject) { HTMLDocument *This = VIEWOBJ_THIS(iface); return IHTMLDocument2_QueryInterface(HTMLDOC(This), riid, ppvObject); } -static ULONG WINAPI ViewObject_AddRef(IViewObject2 *iface) +static ULONG WINAPI ViewObject_AddRef(IViewObjectEx *iface) { HTMLDocument *This = VIEWOBJ_THIS(iface); return IHTMLDocument2_AddRef(HTMLDOC(This)); } -static ULONG WINAPI ViewObject_Release(IViewObject2 *iface) +static ULONG WINAPI ViewObject_Release(IViewObjectEx *iface) { HTMLDocument *This = VIEWOBJ_THIS(iface); return IHTMLDocument2_Release(HTMLDOC(This)); } -static HRESULT WINAPI ViewObject_Draw(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, +static HRESULT WINAPI ViewObject_Draw(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcTargetDev, HDC hdcDraw, LPCRECTL lprcBounds, LPCRECTL lprcWBounds, BOOL (CALLBACK *pfnContinue)(ULONG_PTR dwContinue), ULONG_PTR dwContinue) { @@ -741,7 +781,7 @@ static HRESULT WINAPI ViewObject_Draw(IViewObject2 *iface, DWORD dwDrawAspect, L return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_GetColorSet(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, +static HRESULT WINAPI ViewObject_GetColorSet(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DVTARGETDEVICE *ptd, HDC hicTargetDev, LOGPALETTE **ppColorSet) { HTMLDocument *This = VIEWOBJ_THIS(iface); @@ -749,7 +789,7 @@ static HRESULT WINAPI ViewObject_GetColorSet(IViewObject2 *iface, DWORD dwDrawAs return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_Freeze(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, +static HRESULT WINAPI ViewObject_Freeze(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, void *pvAspect, DWORD *pdwFreeze) { HTMLDocument *This = VIEWOBJ_THIS(iface); @@ -757,28 +797,28 @@ static HRESULT WINAPI ViewObject_Freeze(IViewObject2 *iface, DWORD dwDrawAspect, return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_Unfreeze(IViewObject2 *iface, DWORD dwFreeze) +static HRESULT WINAPI ViewObject_Unfreeze(IViewObjectEx *iface, DWORD dwFreeze) { HTMLDocument *This = VIEWOBJ_THIS(iface); FIXME("(%p)->(%d)\n", This, dwFreeze); return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_SetAdvise(IViewObject2 *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) +static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, DWORD advf, IAdviseSink *pAdvSink) { HTMLDocument *This = VIEWOBJ_THIS(iface); FIXME("(%p)->(%d %d %p)\n", This, aspects, advf, pAdvSink); return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_GetAdvise(IViewObject2 *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) +static HRESULT WINAPI ViewObject_GetAdvise(IViewObjectEx *iface, DWORD *pAspects, DWORD *pAdvf, IAdviseSink **ppAdvSink) { HTMLDocument *This = VIEWOBJ_THIS(iface); FIXME("(%p)->(%p %p %p)\n", This, pAspects, pAdvf, ppAdvSink); return E_NOTIMPL; } -static HRESULT WINAPI ViewObject_GetExtent(IViewObject2 *iface, DWORD dwDrawAspect, LONG lindex, +static HRESULT WINAPI ViewObject_GetExtent(IViewObjectEx *iface, DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE* ptd, LPSIZEL lpsizel) { HTMLDocument *This = VIEWOBJ_THIS(iface); @@ -786,9 +826,49 @@ static HRESULT WINAPI ViewObject_GetExtent(IViewObject2 *iface, DWORD dwDrawAspe return E_NOTIMPL; } +static HRESULT WINAPI ViewObject_GetRect(IViewObjectEx *iface, DWORD dwAspect, LPRECTL pRect) +{ + HTMLDocument *This = VIEWOBJ_THIS(iface); + FIXME("(%p)->(%d %p)\n", This, dwAspect, pRect); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_GetViewStatus(IViewObjectEx *iface, DWORD *pdwStatus) +{ + HTMLDocument *This = VIEWOBJ_THIS(iface); + FIXME("(%p)->(%p)\n", This, pdwStatus); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_QueryHitPoint(IViewObjectEx* iface, DWORD dwAspect, + LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD *pHitResult) +{ + HTMLDocument *This = VIEWOBJ_THIS(iface); + FIXME("(%p)->(%d %p (%d %d) %d %p)\n", This, dwAspect, pRectBounds, ptlLoc.x, + ptlLoc.y, lCloseHint, pHitResult); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_QueryHitRect(IViewObjectEx *iface, DWORD dwAspect, + LPCRECT pRectBounds, LPCRECT pRectLoc, LONG lCloseHint, DWORD *pHitResult) +{ + HTMLDocument *This = VIEWOBJ_THIS(iface); + FIXME("(%p)->(%d %p %p %d %p)\n", This, dwAspect, pRectBounds, pRectLoc, lCloseHint, pHitResult); + return E_NOTIMPL; +} + +static HRESULT WINAPI ViewObject_GetNaturalExtent(IViewObjectEx *iface, DWORD dwAspect, LONG lindex, + DVTARGETDEVICE *ptd, HDC hicTargetDev, DVEXTENTINFO *pExtentInfo, LPSIZEL pSizel) +{ + HTMLDocument *This = VIEWOBJ_THIS(iface); + FIXME("(%p)->(%d %d %p %p %p %p\n", This, dwAspect,lindex, ptd, + hicTargetDev, pExtentInfo, pSizel); + return E_NOTIMPL; +} + #undef VIEWOBJ_THIS -static const IViewObject2Vtbl ViewObjectVtbl = { +static const IViewObjectExVtbl ViewObjectVtbl = { ViewObject_QueryInterface, ViewObject_AddRef, ViewObject_Release, @@ -798,11 +878,16 @@ static const IViewObject2Vtbl ViewObjectVtbl = { ViewObject_Unfreeze, ViewObject_SetAdvise, ViewObject_GetAdvise, - ViewObject_GetExtent + ViewObject_GetExtent, + ViewObject_GetRect, + ViewObject_GetViewStatus, + ViewObject_QueryHitPoint, + ViewObject_QueryHitRect, + ViewObject_GetNaturalExtent }; void HTMLDocument_View_Init(HTMLDocument *This) { This->lpOleDocumentViewVtbl = &OleDocumentViewVtbl; - This->lpViewObject2Vtbl = &ViewObjectVtbl; + This->lpViewObjectExVtbl = &ViewObjectVtbl; } diff --git a/reactos/include/psdk/mshtmdid.h b/reactos/include/psdk/mshtmdid.h index 59b04a4c83d..0d128493dbe 100644 --- a/reactos/include/psdk/mshtmdid.h +++ b/reactos/include/psdk/mshtmdid.h @@ -1781,6 +1781,16 @@ #define DISPID_IHTMLSCREEN_AVAILWIDTH (DISPID_SCREEN+7) #define DISPID_IHTMLSCREEN_FONTSMOOTHINGENABLED (DISPID_SCREEN+8) +/* IHTMLScreen2 */ +#define DISPID_IHTMLSCREEN2_LOGICALXDPI DISPID_SCREEN+9 +#define DISPID_IHTMLSCREEN2_LOGICALYDPI DISPID_SCREEN+10 +#define DISPID_IHTMLSCREEN2_DEVICEXDPI DISPID_SCREEN+11 +#define DISPID_IHTMLSCREEN2_DEVICEYDPI DISPID_SCREEN+12 + +/* IHTMLScreen3 */ +#define DISPID_IHTMLSCREEN3_SYSTEMXDPI DISPID_SCREEN+13 +#define DISPID_IHTMLSCREEN3_SYSTEMYDPI DISPID_SCREEN+14 + /* IHTMLOptionElementFactory */ #define DISPID_IHTMLOPTIONELEMENTFACTORY_CREATE DISPID_VALUE @@ -1812,6 +1822,14 @@ #define DISPID_IHTMLFORMELEMENT__NEWENUM DISPID_NEWENUM #define DISPID_IHTMLFORMELEMENT_ITEM DISPID_VALUE +/* HTMLFormElementEvents */ +#define DISPID_HTMLFORMELEMENTEVENTS_ONSUBMIT DISPID_EVMETH_ONSUBMIT +#define DISPID_HTMLFORMELEMENTEVENTS_ONRESET DISPID_EVMETH_ONRESET + +/* HTMLFormElementEvents2 */ +#define DISPID_HTMLFORMELEMENTEVENTS2_ONSUBMIT DISPID_EVMETH_ONSUBMIT +#define DISPID_HTMLFORMELEMENTEVENTS2_ONRESET DISPID_EVMETH_ONRESET + /* IHTMLStyleSheetsCollection */ #define DISPID_IHTMLSTYLESHEETSCOLLECTION_LENGTH (DISPID_STYLESHEETS_COL+1) #define DISPID_IHTMLSTYLESHEETSCOLLECTION__NEWENUM DISPID_NEWENUM diff --git a/reactos/include/psdk/mshtml.idl b/reactos/include/psdk/mshtml.idl index f004e74ae14..4a182f23bbc 100644 --- a/reactos/include/psdk/mshtml.idl +++ b/reactos/include/psdk/mshtml.idl @@ -6420,6 +6420,513 @@ interface IHTMLFormElement : IDispatch [retval, out] IDispatch **pdisp); } +/***************************************************************************** + * DispHTMLFormElement dispinterface + */ +[ + hidden, + uuid(3050F510-98B5-11CF-BB82-00AA00BDCE0B) +] +dispinterface DispHTMLFormElement +{ +properties: +methods: + WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL; + + [propput, id(DISPID_IHTMLFORMELEMENT_ACTION)] + void action(BSTR v); + + [propget, id(DISPID_IHTMLFORMELEMENT_ACTION)] + BSTR action(); + + [propput, id(DISPID_IHTMLFORMELEMENT_ENCODING)] + void encoding(BSTR v); + + [propget, id(DISPID_IHTMLFORMELEMENT_ENCODING)] + BSTR encoding(); + + [propput, id(DISPID_IHTMLFORMELEMENT_METHOD)] + void method(BSTR v); + + [propget, id(DISPID_IHTMLFORMELEMENT_METHOD)] + BSTR method(); + + [propget, id(DISPID_IHTMLFORMELEMENT_ELEMENTS)] + IDispatch *elements(); + + [propput, id(DISPID_IHTMLFORMELEMENT_TARGET)] + void target(BSTR v); + + [propget, id(DISPID_IHTMLFORMELEMENT_TARGET)] + BSTR target(); + + [propput, id(DISPID_IHTMLFORMELEMENT_NAME)] + void name(BSTR v); + + [propget, id(DISPID_IHTMLFORMELEMENT_NAME)] + BSTR name(); + + [propput, id(DISPID_IHTMLFORMELEMENT_ONSUBMIT)] + void onsubmit(VARIANT v); + + [propget, id(DISPID_IHTMLFORMELEMENT_ONSUBMIT)] + VARIANT onsubmit(); + + [propput, id(DISPID_IHTMLFORMELEMENT_ONRESET)] + void onreset(VARIANT v); + + [propget, id(DISPID_IHTMLFORMELEMENT_ONRESET)] + VARIANT onreset(); + + [id(DISPID_IHTMLFORMELEMENT_SUBMIT)] + void submit(); + + [id(DISPID_IHTMLFORMELEMENT_RESET)] + void reset(); + + [propput, id(DISPID_IHTMLFORMELEMENT_LENGTH)] + void length(long v); + + [propget, id(DISPID_IHTMLFORMELEMENT_LENGTH)] + long length(); + + [propget, id(DISPID_IHTMLFORMELEMENT__NEWENUM), hidden, restricted] + IUnknown *_newEnum(); + + [id(DISPID_IHTMLFORMELEMENT_ITEM)] + IDispatch *item(VARIANT name, VARIANT index); + + [id(DISPID_IHTMLFORMELEMENT_TAGS)] + IDispatch *tags(VARIANT tagName); +} + +[ + hidden, + uuid(3050F364-98B5-11CF-BB82-00AA00BDCE0B) +] +dispinterface HTMLFormElementEvents +{ +properties: +methods: + [id(DISPID_HTMLELEMENTEVENTS_ONHELP)] + VARIANT_BOOL onhelp(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCLICK)] + VARIANT_BOOL onclick(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDBLCLICK)] + VARIANT_BOOL ondblclick(); + + [id(DISPID_HTMLELEMENTEVENTS_ONKEYPRESS)] + VARIANT_BOOL onkeypress(); + + [id(DISPID_HTMLELEMENTEVENTS_ONKEYDOWN)] + void onkeydown(); + + [id(DISPID_HTMLELEMENTEVENTS_ONKEYUP)] + void onkeyup(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT)] + void onmouseout(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER)] + void onmouseover(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEMOVE)] + void onmousemove(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEDOWN)] + void onmousedown(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEUP)] + void onmouseup(); + + [id(DISPID_HTMLELEMENTEVENTS_ONSELECTSTART)] + VARIANT_BOOL onselectstart(); + + [id(DISPID_HTMLELEMENTEVENTS_ONFILTERCHANGE)] + void onfilterchange(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAGSTART)] + VARIANT_BOOL ondragstart(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFOREUPDATE)] + VARIANT_BOOL onbeforeupdate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONAFTERUPDATE)] + void onafterupdate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONERRORUPDATE)] + VARIANT_BOOL onerrorupdate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONROWEXIT)] + VARIANT_BOOL onrowexit(); + + [id(DISPID_HTMLELEMENTEVENTS_ONROWENTER)] + void onrowenter(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDATASETCHANGED)] + void ondatasetchanged(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDATAAVAILABLE)] + void ondataavailable(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDATASETCOMPLETE)] + void ondatasetcomplete(); + + [id(DISPID_HTMLELEMENTEVENTS_ONLOSECAPTURE)] + void onlosecapture(); + + [id(DISPID_HTMLELEMENTEVENTS_ONPROPERTYCHANGE)] + void onpropertychange(); + + [id(DISPID_HTMLELEMENTEVENTS_ONSCROLL)] + void onscroll(); + + [id(DISPID_HTMLELEMENTEVENTS_ONFOCUS)] + void onfocus(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBLUR)] + void onblur(); + + [id(DISPID_HTMLELEMENTEVENTS_ONRESIZE)] + void onresize(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAG)] + VARIANT_BOOL ondrag(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAGEND)] + void ondragend(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAGENTER)] + VARIANT_BOOL ondragenter(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAGOVER)] + VARIANT_BOOL ondragover(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDRAGLEAVE)] + void ondragleave(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDROP)] + VARIANT_BOOL ondrop(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFORECUT)] + VARIANT_BOOL onbeforecut(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCUT)] + VARIANT_BOOL oncut(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFORECOPY)] + VARIANT_BOOL onbeforecopy(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCOPY)] + VARIANT_BOOL oncopy(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFOREPASTE)] + VARIANT_BOOL onbeforepaste(); + + [id(DISPID_HTMLELEMENTEVENTS_ONPASTE)] + VARIANT_BOOL onpaste(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCONTEXTMENU)] + VARIANT_BOOL oncontextmenu(); + + [id(DISPID_HTMLELEMENTEVENTS_ONROWSDELETE)] + void onrowsdelete(); + + [id(DISPID_HTMLELEMENTEVENTS_ONROWSINSERTED)] + void onrowsinserted(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCELLCHANGE)] + void oncellchange(); + + [id(DISPID_HTMLELEMENTEVENTS_ONREADYSTATECHANGE)] + void onreadystatechange(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFOREEDITFOCUS)] + void onbeforeeditfocus(); + + [id(DISPID_HTMLELEMENTEVENTS_ONLAYOUTCOMPLETE)] + void onlayoutcomplete(); + + [id(DISPID_HTMLELEMENTEVENTS_ONPAGE)] + void onpage(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFOREDEACTIVATE)] + VARIANT_BOOL onbeforedeactivate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONBEFOREACTIVATE)] + VARIANT_BOOL onbeforeactivate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOVE)] + void onmove(); + + [id(DISPID_HTMLELEMENTEVENTS_ONCONTROLSELECT)] + VARIANT_BOOL oncontrolselect(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOVESTART)] + VARIANT_BOOL onmovestart(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOVEEND)] + void onmoveend(); + + [id(DISPID_HTMLELEMENTEVENTS_ONRESIZESTART)] + VARIANT_BOOL onresizestart(); + + [id(DISPID_HTMLELEMENTEVENTS_ONRESIZEEND)] + void onresizeend(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEENTER)] + void onmouseenter(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSELEAVE)] + void onmouseleave(); + + [id(DISPID_HTMLELEMENTEVENTS_ONMOUSEWHEEL)] + VARIANT_BOOL onmousewheel(); + + [id(DISPID_HTMLELEMENTEVENTS_ONACTIVATE)] + void onactivate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONDEACTIVATE)] + void ondeactivate(); + + [id(DISPID_HTMLELEMENTEVENTS_ONFOCUSIN)] + void onfocusin(); + + [id(DISPID_HTMLELEMENTEVENTS_ONFOCUSOUT)] + void onfocusout(); + + [id(DISPID_HTMLFORMELEMENTEVENTS_ONSUBMIT)] + VARIANT_BOOL onsubmit(); + + [id(DISPID_HTMLFORMELEMENTEVENTS_ONRESET)] + VARIANT_BOOL onreset(); +}; + +interface IHTMLEventObj; + +[ + hidden, + uuid(3050F614-98B5-11CF-BB82-00AA00BDCE0B) +] +dispinterface HTMLFormElementEvents2 +{ +properties: +methods: + [id(DISPID_HTMLELEMENTEVENTS2_ONHELP)] + VARIANT_BOOL onhelp([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCLICK)] + VARIANT_BOOL onclick([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK)] + VARIANT_BOOL ondblclick([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS)] + VARIANT_BOOL onkeypress([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN)] + void onkeydown([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYUP)] + void onkeyup([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT)] + void onmouseout([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER)] + void onmouseover([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE)] + void onmousemove([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN)] + void onmousedown([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP)] + void onmouseup([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART)] + VARIANT_BOOL onselectstart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE)] + void onfilterchange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART)] + VARIANT_BOOL ondragstart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE)] + VARIANT_BOOL onbeforeupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE)] + void onafterupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE)] + VARIANT_BOOL onerrorupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWEXIT)] + VARIANT_BOOL onrowexit([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWENTER)] + void onrowenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED)] + void ondatasetchanged([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE)] + void ondataavailable([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE)] + void ondatasetcomplete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE)] + void onlosecapture([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE)] + void onpropertychange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONSCROLL)] + void onscroll([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUS)] + void onfocus([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBLUR)] + void onblur([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZE)] + void onresize([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAG)] + VARIANT_BOOL ondrag([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGEND)] + void ondragend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER)] + VARIANT_BOOL ondragenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER)] + VARIANT_BOOL ondragover([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE)] + void ondragleave([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDROP)] + VARIANT_BOOL ondrop([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT)] + VARIANT_BOOL onbeforecut([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCUT)] + VARIANT_BOOL oncut([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY)] + VARIANT_BOOL onbeforecopy([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCOPY)] + VARIANT_BOOL oncopy([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE)] + VARIANT_BOOL onbeforepaste([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPASTE)] + VARIANT_BOOL onpaste([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU)] + VARIANT_BOOL oncontextmenu([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE)] + void onrowsdelete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED)] + void onrowsinserted([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE)] + void oncellchange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE)] + void onreadystatechange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE)] + void onlayoutcomplete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPAGE)] + void onpage([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER)] + void onmouseenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE)] + void onmouseleave([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONACTIVATE)] + void onactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE)] + void ondeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE)] + VARIANT_BOOL onbeforedeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE)] + VARIANT_BOOL onbeforeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN)] + void onfocusin([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT)] + void onfocusout([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVE)] + void onmove([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT)] + VARIANT_BOOL oncontrolselect([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVESTART)] + VARIANT_BOOL onmovestart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVEEND)] + void onmoveend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART)] + VARIANT_BOOL onresizestart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND)] + void onresizeend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)] + VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLFORMELEMENTEVENTS2_ONSUBMIT)] + VARIANT_BOOL onsubmit([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLFORMELEMENTEVENTS2_ONRESET)] + VARIANT_BOOL onreset([in] IHTMLEventObj* pEvtObj); +}; + +[ + noncreatable, + uuid(3050F24D-98B5-11CF-BB82-00AA00BDCE0B) +] +coclass HTMLFormElement +{ + [default] dispinterface DispHTMLFormElement; + [source, default] dispinterface HTMLFormElementEvents; + [source] dispinterface HTMLFormElementEvents2; + interface IHTMLElement; + interface IHTMLElement2; + interface IHTMLElement3; + interface IHTMLElement4; + interface IHTMLUniqueName; + interface IHTMLDOMNode; + interface IHTMLDOMNode2; + interface IHTMLDOMConstructor; + interface IHTMLFormElement; +} + /***************************************************************************** * IHTMLTextContainer interface */ @@ -9758,6 +10265,69 @@ interface IHTMLWindow5 : IDispatch HRESULT XMLHttpRequest([retval, out] VARIANT * p); }; +/***************************************************************************** + * DispHTMLScreen dispinterface + */ +[ + hidden, + uuid(3050f591-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLScreen +{ +properties: +methods: + [propget, id(DISPID_IHTMLSCREEN_COLORDEPTH)] + long colorDepth(); + + [propput, id(DISPID_IHTMLSCREEN_BUFFERDEPTH)] + void bufferDepth(long v); + + [propget, id(DISPID_IHTMLSCREEN_BUFFERDEPTH)] + long bufferDepth(); + + [propget, id(DISPID_IHTMLSCREEN_WIDTH)] + long width(); + + [propget, id(DISPID_IHTMLSCREEN_HEIGHT)] + long height(); + + [propput, id(DISPID_IHTMLSCREEN_UPDATEINTERVAL)] + void updateInterval(long v); + + [propget, id(DISPID_IHTMLSCREEN_UPDATEINTERVAL)] + long updateInterval(); + + [propget, id(DISPID_IHTMLSCREEN_AVAILHEIGHT)] + long availHeight(); + + [propget, id(DISPID_IHTMLSCREEN_AVAILWIDTH)] + long availWidth(); + + [propget, id(DISPID_IHTMLSCREEN_FONTSMOOTHINGENABLED)] + VARIANT_BOOL fontSmoothingEnabled(); + + [propget, id(DISPID_IHTMLSCREEN2_LOGICALXDPI)] + long logicalXDPI(); + + [propget, id(DISPID_IHTMLSCREEN2_LOGICALYDPI)] + long logicalYDPI(); + + [propget, id(DISPID_IHTMLSCREEN2_DEVICEXDPI)] + long deviceXDPI(); + + [propget, id(DISPID_IHTMLSCREEN2_DEVICEYDPI)] + long deviceYDPI(); + + [propget, id(DISPID_IHTMLSCREEN3_SYSTEMXDPI)] + long systemXDPI(); + + [propget, id(DISPID_IHTMLSCREEN3_SYSTEMYDPI)] + long systemYDPI(); + + [propget, id(DISPID_IHTMLDOMCONSTRUCTOR_CONSTRUCTOR), hidden] + IDispatch *constructor(); +} + /***************************************************************************** * DispHTMLWindow2 dispinterface */ @@ -14515,4 +15085,45 @@ interface IHTMLEditServices : IUnknown [in] SELECTION_TYPE eType); } +/***************************************************************************** + * IElementBehaviorSite interface + */ +[ + odl, + uuid(3050F427-98B5-11CF-BB82-00AA00BDCE0B) +] +interface IElementBehaviorSite : IUnknown { + HRESULT GetElement([out, retval] IHTMLElement **ppElement); + HRESULT RegisterNotification([in] long lEvent); +} + +/***************************************************************************** + * IElementBehavior interface + */ +[ + odl, + uuid(3050F425-98B5-11CF-BB82-00AA00BDCE0B) +] +interface IElementBehavior : IUnknown { + HRESULT Init([in] IElementBehaviorSite *pBehaviorSite); + HRESULT Notify([in] long lEvent, [in, out] VARIANT *pVar); + HRESULT Detach(); +} + +/***************************************************************************** + * IElementBehaviorFactory interface + */ +[ + odl, + uuid(3050f429-98b5-11cf-bb82-00aa00bdce0b) +] +interface IElementBehaviorFactory : IUnknown +{ + HRESULT FindBehavior( + [in] BSTR bstrBehavior, + [in] BSTR bstrBehaviorUrl, + [in] IElementBehaviorSite *pSite, + [out] IElementBehavior **ppBehavior); +} + } /* library MSHTML */