Autosyncing with Wine HEAD

svn path=/trunk/; revision=34369
This commit is contained in:
Aleksey Bragin 2008-07-08 16:39:29 +00:00
parent 1e229a53dc
commit 0a953de77e
52 changed files with 13929 additions and 490 deletions

View file

@ -0,0 +1,57 @@
/*
* Danish language support
*
* Copyright (C) 2008 Jens Albretsen <jens@albretsen.dk>
*
* 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
*/
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
{
IDS_HTMLDISABLED "HTML optegning er i øjeblikket deaktiveret."
IDS_HTMLDOCUMENT "HTML dokument"
IDS_DOWNLOADING "Henter..."
IDS_INSTALLING "Installerer..."
}
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 85
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Installere Wine Gecko"
FONT 8, "MS Shell Dlg"
{
LTEXT "Dette program prøver at vise en HTML-side. Wine har brug for Gecko" \
"(Mozillas HTML motor) for at vise denne siden. Vælg Installer hvis " \
"du vil have at Wine skal hente og installere Gecko automatisk.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT
CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12
DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Annuller", IDCANCEL, 140, 60, 50, 15, WS_GROUP | WS_TABSTOP
}
IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Hyperlink"
FONT 8, "MS Shell Dlg"
{
GROUPBOX "Information om Hyperlink'en", IDC_STATIC, 5, 5, 190, 55
LTEXT "&Type:", IDC_STATIC, 10, 22, 20, 10
COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
LTEXT "&URL:", IDC_STATIC, 10, 42, 20, 10
EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
PUSHBUTTON "Annuller", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}

View file

@ -25,4 +25,6 @@ STRINGTABLE DISCARDABLE
{
IDS_HTMLDISABLED "HTML:n näyttäminen on tällähetkellä poistettu käytöstä."
IDS_HTMLDOCUMENT "HTML Dokumentti"
IDS_DOWNLOADING "Downloading..."
IDS_INSTALLING "Installing..."
}

View file

@ -23,4 +23,6 @@ STRINGTABLE DISCARDABLE
{
IDS_HTMLDISABLED "A HTML rajzolás jelenleg le van tiltva."
IDS_HTMLDOCUMENT "HTML Dokumentum"
IDS_DOWNLOADING "Downloading..."
IDS_INSTALLING "Installing..."
}

View file

@ -25,8 +25,8 @@ STRINGTABLE DISCARDABLE
{
IDS_HTMLDISABLED "HTML-tegning er for øyeblikket deaktivert."
IDS_HTMLDOCUMENT "HTML-dokument"
IDS_DOWNLOADING "Laster ned . . ."
IDS_INSTALLING "Installerer . . ."
IDS_DOWNLOADING "Laster ned..."
IDS_INSTALLING "Installerer..."
}
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 85

View file

@ -27,17 +27,17 @@ STRINGTABLE DISCARDABLE
IDS_INSTALLING "Óñòàíîâêà..."
}
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 85
ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 261, 85
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Óñòàíîâêà Wine Gecko"
FONT 8, "MS Shell Dlg"
{
LTEXT "Ýòà ïðîãðàììà ïûòàåòñÿ îòîáðàçèòü HTML ñòðàíèöó. Äëÿ å¸ îòîáðàæåíèÿ Wine íåîáõîäèìî " \
"óñòàíîâèòü Gecko (Mozilla HTML engine). Íàæìèòå êíîïêó óñòàíîâèòü åñëè âû õîòèòå, ÷òî áû Wine " \
"àâòîìàòè÷åñêè çàãðóçèë è óñòàíîâèë Gecko.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT
CONTROL "Ïðîãðåññ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12
DEFPUSHBUTTON "&Óñòàíîâèòü", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Îòìåíà", IDCANCEL, 140, 60, 50, 15, WS_GROUP | WS_TABSTOP
"àâòîìàòè÷åñêè çàãðóçèë è óñòàíîâèë Gecko.", ID_DWL_STATUS, 10, 10, 240, 33, SS_LEFT
CONTROL "Ïðîãðåññ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 46, 240, 12
DEFPUSHBUTTON "&Óñòàíîâèòü", ID_DWL_INSTALL, 200, 63, 50, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Îòìåíà", IDCANCEL, 140, 63, 50, 15, WS_GROUP | WS_TABSTOP
}
IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65

View file

@ -17,7 +17,7 @@
*/
LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{

View file

@ -0,0 +1,652 @@
/*
* Copyright 2008 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 <stdarg.h>
#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 {
DISPID id;
BSTR name;
tid_t tid;
} func_info_t;
struct dispex_data_t {
DWORD func_cnt;
func_info_t *funcs;
func_info_t **name_table;
struct list entry;
};
typedef struct {
VARIANT var;
LPWSTR name;
} dynamic_prop_t;
struct dispex_dynamic_data_t {
DWORD buf_size;
DWORD prop_cnt;
dynamic_prop_t *props;
};
#define DISPID_DYNPROP_0 0x50000000
#define DISPID_DYNPROP_MAX 0x5fffffff
static ITypeLib *typelib;
static ITypeInfo *typeinfos[LAST_tid];
static struct list dispex_data_list = LIST_INIT(dispex_data_list);
static REFIID tid_ids[] = {
&IID_NULL,
&DIID_DispDOMChildrenCollection,
&DIID_DispHTMLCommentElement,
&DIID_DispHTMLDocument,
&DIID_DispHTMLDOMTextNode,
&DIID_DispHTMLElementCollection,
&DIID_DispHTMLGenericElement,
&DIID_DispHTMLImg,
&DIID_DispHTMLInputElement,
&DIID_DispHTMLOptionElement,
&DIID_DispHTMLSelectElement,
&DIID_DispHTMLStyle,
&DIID_DispHTMLUnknownElement,
&DIID_DispHTMLWindow2,
&IID_IHTMLCommentElement,
&IID_IHTMLDocument2,
&IID_IHTMLDocument3,
&IID_IHTMLDocument4,
&IID_IHTMLDocument5,
&IID_IHTMLDOMChildrenCollection,
&IID_IHTMLDOMNode,
&IID_IHTMLDOMNode2,
&IID_IHTMLDOMTextNode,
&IID_IHTMLElement,
&IID_IHTMLElement2,
&IID_IHTMLElementCollection,
&IID_IHTMLGenericElement,
&IID_IHTMLImgElement,
&IID_IHTMLInputElement,
&IID_IHTMLOptionElement,
&IID_IHTMLSelectElement,
&IID_IHTMLStyle,
&IID_IHTMLWindow2,
&IID_IHTMLWindow3,
&IID_IOmNavigator
};
HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo)
{
HRESULT hres;
if(!typelib) {
ITypeLib *tl;
hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl);
if(FAILED(hres)) {
ERR("LoadRegTypeLib failed: %08x\n", hres);
return hres;
}
if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
ITypeLib_Release(tl);
}
if(!typeinfos[tid]) {
ITypeInfo *typeinfo;
hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo);
if(FAILED(hres)) {
ERR("GetTypeInfoOfGuid(%s) failed: %08x\n", debugstr_guid(tid_ids[tid]), hres);
return hres;
}
if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL))
ITypeInfo_Release(typeinfo);
}
*typeinfo = typeinfos[tid];
return S_OK;
}
void release_typelib(void)
{
dispex_data_t *iter;
unsigned i;
while(!list_empty(&dispex_data_list)) {
iter = LIST_ENTRY(list_head(&dispex_data_list), dispex_data_t, entry);
list_remove(&iter->entry);
for(i=0; i < iter->func_cnt; i++)
SysFreeString(iter->funcs[i].name);
heap_free(iter->funcs);
heap_free(iter->name_table);
heap_free(iter);
}
if(!typelib)
return;
for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
if(typeinfos[i])
ITypeInfo_Release(typeinfos[i]);
ITypeLib_Release(typelib);
}
static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id, ITypeInfo *dti)
{
HRESULT hres;
if(data->func_cnt && data->funcs[data->func_cnt-1].id == id)
return;
if(data->func_cnt == *size)
data->funcs = heap_realloc(data->funcs, (*size <<= 1)*sizeof(func_info_t));
hres = ITypeInfo_GetDocumentation(dti, id, &data->funcs[data->func_cnt].name, NULL, NULL, NULL);
if(FAILED(hres))
return;
data->funcs[data->func_cnt].id = id;
data->funcs[data->func_cnt].tid = tid;
data->func_cnt++;
}
static int dispid_cmp(const void *p1, const void *p2)
{
return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id;
}
static int func_name_cmp(const void *p1, const void *p2)
{
return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name);
}
static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
{
const tid_t *tid = This->data->iface_tids;
FUNCDESC *funcdesc;
dispex_data_t *data;
DWORD size = 16, i;
ITypeInfo *ti, *dti;
HRESULT hres;
TRACE("(%p)\n", This);
hres = get_typeinfo(This->data->disp_tid, &dti);
if(FAILED(hres)) {
ERR("Could not get disp type info: %08x\n", hres);
return NULL;
}
data = heap_alloc(sizeof(dispex_data_t));
data->func_cnt = 0;
data->funcs = heap_alloc(size*sizeof(func_info_t));
list_add_tail(&dispex_data_list, &data->entry);
while(*tid) {
hres = get_typeinfo(*tid, &ti);
if(FAILED(hres))
break;
i=7;
while(1) {
hres = ITypeInfo_GetFuncDesc(ti, i++, &funcdesc);
if(FAILED(hres))
break;
add_func_info(data, &size, *tid, funcdesc->memid, dti);
ITypeInfo_ReleaseFuncDesc(ti, funcdesc);
}
tid++;
}
if(!data->func_cnt) {
heap_free(data->funcs);
data->funcs = NULL;
}else if(data->func_cnt != size) {
data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t));
}
qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp);
if(data->funcs) {
data->name_table = heap_alloc(data->func_cnt * sizeof(func_info_t*));
for(i=0; i < data->func_cnt; i++)
data->name_table[i] = data->funcs+i;
qsort(data->name_table, data->func_cnt, sizeof(func_info_t*), func_name_cmp);
}else {
data->name_table = NULL;
}
return data;
}
static CRITICAL_SECTION cs_dispex_static_data;
static CRITICAL_SECTION_DEBUG cs_dispex_static_data_dbg =
{
0, 0, &cs_dispex_static_data,
{ &cs_dispex_static_data_dbg.ProcessLocksList, &cs_dispex_static_data_dbg.ProcessLocksList },
0, 0, { (DWORD_PTR)(__FILE__ ": dispex_static_data") }
};
static CRITICAL_SECTION cs_dispex_static_data = { &cs_dispex_static_data_dbg, -1, 0, 0, 0, 0 };
static dispex_data_t *get_dispex_data(DispatchEx *This)
{
if(This->data->data)
return This->data->data;
EnterCriticalSection(&cs_dispex_static_data);
if(!This->data->data)
This->data->data = preprocess_dispex_data(This);
LeaveCriticalSection(&cs_dispex_static_data);
return This->data->data;
}
void call_disp_func(HTMLDocument *doc, IDispatch *disp)
{
DISPID named_arg = DISPID_THIS;
VARIANTARG arg;
DISPPARAMS params = {&arg, &named_arg, 1, 1};
EXCEPINFO ei;
IDispatchEx *dispex;
VARIANT res;
HRESULT hres;
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
if(FAILED(hres)) {
FIXME("Could not get IDispatchEx interface: %08x\n", hres);
return;
}
V_VT(&arg) = VT_DISPATCH;
V_DISPATCH(&arg) = (IDispatch*)HTMLWINDOW2(doc->window);
VariantInit(&res);
memset(&ei, 0, sizeof(ei));
hres = IDispatchEx_InvokeEx(dispex, 0, GetUserDefaultLCID(), DISPATCH_METHOD, &params, &res, &ei, NULL);
IDispatchEx_Release(dispex);
TRACE("%p returned %08x\n", disp, hres);
VariantClear(&res);
}
static inline BOOL is_custom_dispid(DISPID id)
{
return MSHTML_DISPID_CUSTOM_MIN <= id && id <= MSHTML_DISPID_CUSTOM_MAX;
}
static inline BOOL is_dynamic_dispid(DISPID id)
{
return DISPID_DYNPROP_0 <= id && id <= DISPID_DYNPROP_MAX;
}
#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface)
static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
return IUnknown_QueryInterface(This->outer, riid, ppv);
}
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
return IUnknown_AddRef(This->outer);
}
static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
return IUnknown_Release(This->outer);
}
static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
TRACE("(%p)->(%p)\n", This, pctinfo);
*pctinfo = 1;
return S_OK;
}
static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
HRESULT hres;
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
hres = get_typeinfo(This->data->disp_tid, ppTInfo);
if(FAILED(hres))
return hres;
ITypeInfo_AddRef(*ppTInfo);
return S_OK;
}
static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
UINT i;
HRESULT hres;
TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
for(i=0; i < cNames; i++) {
hres = IDispatchEx_GetDispID(DISPATCHEX(This), rgszNames[i], 0, rgDispId+i);
if(FAILED(hres))
return hres;
}
return S_OK;
}
static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return IDispatchEx_InvokeEx(DISPATCHEX(This), dispIdMember, lcid, wFlags,
pDispParams, pVarResult, pExcepInfo, NULL);
}
static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
dispex_data_t *data;
int min, max, n, c;
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
if(grfdex & ~(fdexNameCaseSensitive|fdexNameEnsure|fdexNameImplicit))
FIXME("Unsupported grfdex %x\n", grfdex);
data = get_dispex_data(This);
if(!data)
return E_FAIL;
min = 0;
max = data->func_cnt-1;
while(min <= max) {
n = (min+max)/2;
c = strcmpiW(data->name_table[n]->name, bstrName);
if(!c) {
if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName))
break;
*pid = data->name_table[n]->id;
return S_OK;
}
if(c > 0)
max = n-1;
else
min = n+1;
}
if(This->dynamic_data) {
unsigned i;
for(i=0; i < This->dynamic_data->prop_cnt; i++) {
if(!strcmpW(This->dynamic_data->props[i].name, bstrName)) {
*pid = DISPID_DYNPROP_0 + i;
return S_OK;
}
}
}
if(This->data->vtbl && This->data->vtbl->get_dispid) {
HRESULT hres;
hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid);
if(hres != DISP_E_UNKNOWNNAME)
return hres;
}
if(grfdex & fdexNameEnsure) {
TRACE("creating dynamic prop %s\n", debugstr_w(bstrName));
if(!This->dynamic_data) {
This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
This->dynamic_data->props = heap_alloc(This->dynamic_data->buf_size = 4);
}else if(This->dynamic_data->buf_size == This->dynamic_data->prop_cnt) {
This->dynamic_data->props = heap_realloc(This->dynamic_data->props, This->dynamic_data->buf_size<<=1);
}
This->dynamic_data->props[This->dynamic_data->prop_cnt].name = heap_strdupW(bstrName);
VariantInit(&This->dynamic_data->props[This->dynamic_data->prop_cnt].var);
*pid = DISPID_DYNPROP_0 + This->dynamic_data->prop_cnt++;
return S_OK;
}
TRACE("not found %s\n", debugstr_w(bstrName));
return DISP_E_UNKNOWNNAME;
}
static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
IUnknown *unk;
ITypeInfo *ti;
dispex_data_t *data;
UINT argerr=0;
int min, max, n;
HRESULT hres;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
if(is_custom_dispid(id) && This->data->vtbl && This->data->vtbl->invoke)
return This->data->vtbl->invoke(This->outer, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
if(wFlags == DISPATCH_CONSTRUCT) {
FIXME("DISPATCH_CONSTRUCT not implemented\n");
return E_NOTIMPL;
}
if(is_dynamic_dispid(id)) {
DWORD idx = id - DISPID_DYNPROP_0;
VARIANT *var;
if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx)
return DISP_E_UNKNOWNNAME;
var = &This->dynamic_data->props[idx].var;
switch(wFlags) {
case INVOKE_PROPERTYGET:
return VariantCopy(pvarRes, var);
case INVOKE_PROPERTYPUT:
VariantClear(var);
return VariantCopy(var, pdp->rgvarg);
default:
FIXME("unhandled wFlags %x\n", wFlags);
return E_NOTIMPL;
}
}
data = get_dispex_data(This);
if(!data)
return E_FAIL;
min = 0;
max = data->func_cnt-1;
while(min <= max) {
n = (min+max)/2;
if(data->funcs[n].id == id)
break;
if(data->funcs[n].id < id)
min = n+1;
else
max = n-1;
}
if(min > max) {
WARN("invalid id %x\n", id);
return DISP_E_UNKNOWNNAME;
}
hres = get_typeinfo(data->funcs[n].tid, &ti);
if(FAILED(hres)) {
ERR("Could not get type info: %08x\n", hres);
return hres;
}
hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk);
if(FAILED(hres)) {
ERR("Could not get iface: %08x\n", hres);
return E_FAIL;
}
hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr);
IUnknown_Release(unk);
return hres;
}
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
return E_NOTIMPL;
}
static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%x)\n", This, id);
return E_NOTIMPL;
}
static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
return E_NOTIMPL;
}
static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%x %p)\n", This, id, pbstrName);
return E_NOTIMPL;
}
static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
return E_NOTIMPL;
}
static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
{
DispatchEx *This = DISPATCHEX_THIS(iface);
FIXME("(%p)->(%p)\n", This, ppunk);
return E_NOTIMPL;
}
#undef DISPATCHEX_THIS
static IDispatchExVtbl DispatchExVtbl = {
DispatchEx_QueryInterface,
DispatchEx_AddRef,
DispatchEx_Release,
DispatchEx_GetTypeInfoCount,
DispatchEx_GetTypeInfo,
DispatchEx_GetIDsOfNames,
DispatchEx_Invoke,
DispatchEx_GetDispID,
DispatchEx_InvokeEx,
DispatchEx_DeleteMemberByName,
DispatchEx_DeleteMemberByDispID,
DispatchEx_GetMemberProperties,
DispatchEx_GetMemberName,
DispatchEx_GetNextDispID,
DispatchEx_GetNameSpaceParent
};
BOOL dispex_query_interface(DispatchEx *This, REFIID riid, void **ppv)
{
static const IID IID_UndocumentedScriptIface =
{0x719c3050,0xf9d3,0x11cf,{0xa4,0x93,0x00,0x40,0x05,0x23,0xa8,0xa0}};
if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = DISPATCHEX(This);
}else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
*ppv = DISPATCHEX(This);
}else if(IsEqualGUID(&IID_UndocumentedScriptIface, riid)) {
TRACE("(%p)->(IID_UndocumentedScriptIface %p) returning NULL\n", This, ppv);
*ppv = NULL;
}else {
return FALSE;
}
if(*ppv)
IUnknown_AddRef((IUnknown*)*ppv);
return TRUE;
}
void init_dispex(DispatchEx *dispex, IUnknown *outer, dispex_static_data_t *data)
{
dispex->lpIDispatchExVtbl = &DispatchExVtbl;
dispex->outer = outer;
dispex->data = data;
}

View file

@ -481,7 +481,7 @@ static const NodeImplVtbl HTMLAnchorElementImplVtbl = {
HTMLElement *HTMLAnchorElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLAnchorElement *ret = heap_alloc(sizeof(HTMLAnchorElement));
HTMLAnchorElement *ret = heap_alloc_zero(sizeof(HTMLAnchorElement));
HTMLElement_Init(&ret->element);

View file

@ -598,7 +598,7 @@ static const NodeImplVtbl HTMLBodyElementImplVtbl = {
HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLBodyElement *ret = heap_alloc(sizeof(HTMLBodyElement));
HTMLBodyElement *ret = heap_alloc_zero(sizeof(HTMLBodyElement));
nsresult nsres;
TRACE("(%p)->(%p)\n", ret, nselem);

View file

@ -0,0 +1,205 @@
/*
* Copyright 2008 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 <stdarg.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "ole2.h"
#include "mshtml_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct {
HTMLElement element;
const IHTMLCommentElementVtbl *lpIHTMLCommentElementVtbl;
} HTMLCommentElement;
#define HTMLCOMMENT(x) ((IHTMLCommentElement*) &(x)->lpIHTMLCommentElementVtbl)
#define HTMLCOMMENT_THIS(iface) DEFINE_THIS(HTMLCommentElement, IHTMLCommentElement, iface)
static HRESULT WINAPI HTMLCommentElement_QueryInterface(IHTMLCommentElement *iface,
REFIID riid, void **ppv)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
}
static ULONG WINAPI HTMLCommentElement_AddRef(IHTMLCommentElement *iface)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
}
static ULONG WINAPI HTMLCommentElement_Release(IHTMLCommentElement *iface)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
}
static HRESULT WINAPI HTMLCommentElement_GetTypeInfoCount(IHTMLCommentElement *iface, UINT *pctinfo)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_GetTypeInfo(IHTMLCommentElement *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_GetIDsOfNames(IHTMLCommentElement *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_Invoke(IHTMLCommentElement *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_put_text(IHTMLCommentElement *iface, BSTR v)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_get_text(IHTMLCommentElement *iface, BSTR *p)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_put_atomic(IHTMLCommentElement *iface, long v)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLCommentElement_get_atomic(IHTMLCommentElement *iface, long *p)
{
HTMLCommentElement *This = HTMLCOMMENT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
#undef HTMLCOMMENT_THIS
static const IHTMLCommentElementVtbl HTMLCommentElementVtbl = {
HTMLCommentElement_QueryInterface,
HTMLCommentElement_AddRef,
HTMLCommentElement_Release,
HTMLCommentElement_GetTypeInfoCount,
HTMLCommentElement_GetTypeInfo,
HTMLCommentElement_GetIDsOfNames,
HTMLCommentElement_Invoke,
HTMLCommentElement_put_text,
HTMLCommentElement_get_text,
HTMLCommentElement_put_atomic,
HTMLCommentElement_get_atomic
};
#define HTMLCOMMENT_NODE_THIS(iface) DEFINE_THIS2(HTMLCommentElement, element.node, iface)
HRESULT HTMLCommentElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
{
HTMLCommentElement *This = HTMLCOMMENT_NODE_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IHTMLCommentElement, riid)) {
TRACE("(%p)->(IID_IHTMLCommentElement %p)\n", This, ppv);
*ppv = HTMLCOMMENT(This);
}else {
return HTMLElement_QI(&This->element.node, riid, ppv);
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
void HTMLCommentElement_destructor(HTMLDOMNode *iface)
{
HTMLCommentElement *This = HTMLCOMMENT_NODE_THIS(iface);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLCOMMENT_NODE_THIS
static const NodeImplVtbl HTMLCommentElementImplVtbl = {
HTMLCommentElement_QI,
HTMLCommentElement_destructor
};
static const tid_t HTMLCommentElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLCommentElement_tid,
0
};
static dispex_static_data_t HTMLCommentElement_dispex = {
NULL,
DispHTMLCommentElement_tid,
NULL,
HTMLCommentElement_iface_tids
};
HTMLElement *HTMLCommentElement_Create(HTMLDocument *doc, nsIDOMNode *nsnode)
{
HTMLCommentElement *ret = heap_alloc_zero(sizeof(*ret));
ret->element.node.vtbl = &HTMLCommentElementImplVtbl;
ret->lpIHTMLCommentElementVtbl = &HTMLCommentElementVtbl;
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLCOMMENT(ret), &HTMLCommentElement_dispex);
HTMLElement_Init(&ret->element);
HTMLDOMNode_Init(doc, &ret->element.node, nsnode);
return &ret->element;
}

File diff suppressed because it is too large Load diff

View file

@ -108,8 +108,31 @@ static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR t
IHTMLDOMNode **newTextNode)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
FIXME("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode);
return E_NOTIMPL;
nsIDOMDocument *nsdoc;
nsIDOMText *nstext;
HTMLDOMNode *node;
nsAString text_str;
nsresult nsres;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode);
nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
nsAString_Init(&text_str, text);
nsres = nsIDOMDocument_CreateTextNode(nsdoc, &text_str, &nstext);
nsAString_Finish(&text_str);
nsIDOMDocument_Release(nsdoc);
if(NS_FAILED(nsres)) {
ERR("CreateTextNode failed: %08x\n", nsres);
return E_FAIL;
}
node = HTMLDOMTextNode_Create(This, (nsIDOMNode*)nstext);
nsIDOMElement_Release(nstext);
*newTextNode = HTMLDOMNODE(node);
IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
return S_OK;
}
static HRESULT WINAPI HTMLDocument3_get_documentElement(IHTMLDocument3 *iface, IHTMLElement **p)
@ -137,7 +160,7 @@ static HRESULT WINAPI HTMLDocument3_get_documentElement(IHTMLDocument3 *iface, I
ERR("GetDocumentElement failed: %08x\n", nsres);
}
if(nselem) {
node = get_node(This, (nsIDOMNode *)nselem);
node = get_node(This, (nsIDOMNode *)nselem, TRUE);
nsIDOMDocument_Release(nsdoc);
IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)p);
@ -407,8 +430,37 @@ static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v
IHTMLElement **pel)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
return E_NOTIMPL;
nsIDOMDocument *nsdoc = NULL;
nsIDOMElement *nselem = NULL;
HTMLDOMNode *node;
nsAString id_str;
nsresult nsres;
TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel);
*pel = NULL;
if(!This->nscontainer)
return S_OK;
nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc);
if(NS_FAILED(nsres) || !nsdoc)
return S_OK;
nsAString_Init(&id_str, v);
nsIDOMDocument_GetElementById(nsdoc, &id_str, &nselem);
nsIDOMDocument_Release(nsdoc);
nsAString_Finish(&id_str);
if(!nselem) {
*pel = NULL;
return S_OK;
}
node = get_node(This, (nsIDOMNode*)nselem, TRUE);
nsIDOMElement_Release(nselem);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)pel);
}

View file

@ -65,6 +65,15 @@ static void elem_vector_normalize(elem_vector *buf)
buf->size = buf->len;
}
static BOOL is_elem_node(nsIDOMNode *node)
{
PRUint16 type=0;
nsIDOMNode_GetNodeType(node, &type);
return type == ELEMENT_NODE || type == COMMENT_NODE;
}
#define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
#define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface)
@ -138,6 +147,11 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr
WARN("(%p)->(%s . %08x)\n", This, debugstr_w(strAttributeName), lFlags);
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
VariantInit(&AttributeValueChanged);
hres = VariantChangeType(&AttributeValueChanged, &AttributeValue, 0, VT_BSTR);
@ -178,7 +192,13 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr
WARN("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, AttributeValue);
VariantInit(AttributeValue);
if(!This->nselem) {
FIXME("NULL nselem\n");
V_VT(AttributeValue) = VT_NULL;
return S_OK;
}
V_VT(AttributeValue) = VT_NULL;
nsAString_Init(&attr_str, strAttributeName);
nsAString_Init(&value_str, NULL);
@ -206,7 +226,7 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr
TRACE("attr_value=%s\n", debugstr_w(V_BSTR(AttributeValue)));
}
}
}else {
}else if(*value) {
V_VT(AttributeValue) = VT_BSTR;
V_BSTR(AttributeValue) = SysAllocString(value);
TRACE("attr_value=%s\n", debugstr_w(V_BSTR(AttributeValue)));
@ -232,8 +252,23 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA
static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
nsAString classname_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsAString_Init(&classname_str, v);
nsres = nsIDOMHTMLElement_SetClassName(This->nselem, &classname_str);
nsAString_Finish(&classname_str);
if(NS_FAILED(nsres))
ERR("SetClassName failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLElement_get_className(IHTMLElement *iface, BSTR *p)
@ -245,13 +280,18 @@ static HRESULT WINAPI HTMLElement_get_className(IHTMLElement *iface, BSTR *p)
TRACE("(%p)->(%p)\n", This, p);
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsAString_Init(&class_str, NULL);
nsres = nsIDOMHTMLElement_GetClassName(This->nselem, &class_str);
if(NS_SUCCEEDED(nsres)) {
const PRUnichar *class;
nsAString_GetData(&class_str, &class);
*p = SysAllocString(class);
*p = *class ? SysAllocString(class) : NULL;
}else {
ERR("GetClassName failed: %08x\n", nsres);
hres = E_FAIL;
@ -266,15 +306,50 @@ static HRESULT WINAPI HTMLElement_get_className(IHTMLElement *iface, BSTR *p)
static HRESULT WINAPI HTMLElement_put_id(IHTMLElement *iface, BSTR v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
nsAString id_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
if(!This->nselem) {
FIXME("nselem == NULL\n");
return S_OK;
}
nsAString_Init(&id_str, v);
nsres = nsIDOMHTMLElement_SetId(This->nselem, &id_str);
nsAString_Finish(&id_str);
if(NS_FAILED(nsres))
ERR("SetId failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLElement_get_id(IHTMLElement *iface, BSTR *p)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
const PRUnichar *id;
nsAString id_str;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
*p = NULL;
if(!This->nselem)
return S_OK;
nsAString_Init(&id_str, NULL);
nsres = nsIDOMHTMLElement_GetId(This->nselem, &id_str);
nsAString_GetData(&id_str, &id);
if(NS_FAILED(nsres))
ERR("GetId failed: %08x\n", nsres);
else if(*id)
*p = SysAllocString(id);
nsAString_Finish(&id_str);
return S_OK;
}
static HRESULT WINAPI HTMLElement_get_tagName(IHTMLElement *iface, BSTR *p)
@ -286,6 +361,15 @@ static HRESULT WINAPI HTMLElement_get_tagName(IHTMLElement *iface, BSTR *p)
TRACE("(%p)->(%p)\n", This, p);
if(!This->nselem) {
static const WCHAR comment_tagW[] = {'!',0};
WARN("NULL nselem, assuming comment\n");
*p = SysAllocString(comment_tagW);
return S_OK;
}
nsAString_Init(&tag_str, NULL);
nsres = nsIDOMHTMLElement_GetTagName(This->nselem, &tag_str);
if(NS_SUCCEEDED(nsres)) {
@ -316,6 +400,11 @@ static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p)
TRACE("(%p)->(%p)\n", This, p);
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMElementCSSInlineStyle,
(void**)&nselemstyle);
if(NS_FAILED(nsres)) {
@ -354,8 +443,10 @@ static HRESULT WINAPI HTMLElement_get_onhelp(IHTMLElement *iface, VARIANT *p)
static HRESULT WINAPI HTMLElement_put_onclick(IHTMLElement *iface, VARIANT v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
TRACE("(%p)->()\n", This);
return set_node_event(&This->node, EVENTID_CLICK, &v);
}
static HRESULT WINAPI HTMLElement_get_onclick(IHTMLElement *iface, VARIANT *p)
@ -396,8 +487,10 @@ static HRESULT WINAPI HTMLElement_get_onkeydown(IHTMLElement *iface, VARIANT *p)
static HRESULT WINAPI HTMLElement_put_onkeyup(IHTMLElement *iface, VARIANT v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
TRACE("(%p)->()\n", This);
return set_node_event(&This->node, EVENTID_KEYUP, &v);
}
static HRESULT WINAPI HTMLElement_get_onkeyup(IHTMLElement *iface, VARIANT *p)
@ -501,15 +594,41 @@ static HRESULT WINAPI HTMLElement_get_document(IHTMLElement *iface, IDispatch **
static HRESULT WINAPI HTMLElement_put_title(IHTMLElement *iface, BSTR v)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
nsAString title_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
nsAString_Init(&title_str, v);
nsres = nsIDOMHTMLElement_SetTitle(This->nselem, &title_str);
nsAString_Finish(&title_str);
if(NS_FAILED(nsres))
ERR("SetTitle failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLElement_get_title(IHTMLElement *iface, BSTR *p)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsAString title_str;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsAString_Init(&title_str, NULL);
nsres = nsIDOMHTMLElement_GetTitle(This->nselem, &title_str);
if(NS_SUCCEEDED(nsres)) {
const PRUnichar *title;
nsAString_GetData(&title_str, &title);
*p = *title ? SysAllocString(title) : NULL;
}else {
ERR("GetTitle failed: %08x\n", nsres);
return E_FAIL;
}
return S_OK;
}
static HRESULT WINAPI HTMLElement_put_language(IHTMLElement *iface, BSTR v)
@ -593,8 +712,27 @@ static HRESULT WINAPI HTMLElement_get_offsetLeft(IHTMLElement *iface, long *p)
static HRESULT WINAPI HTMLElement_get_offsetTop(IHTMLElement *iface, long *p)
{
HTMLElement *This = HTMLELEM_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
PRInt32 top = 0;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
return E_FAIL;
}
nsres = nsIDOMNSHTMLElement_GetOffsetTop(nselem, &top);
nsIDOMNSHTMLElement_Release(nselem);
if(NS_FAILED(nsres)) {
ERR("GetOffsetTop failed: %08x\n", nsres);
return E_FAIL;
}
*p = top;
return S_OK;
}
static HRESULT WINAPI HTMLElement_get_offsetWidth(IHTMLElement *iface, long *p)
@ -627,6 +765,11 @@ static HRESULT WINAPI HTMLElement_put_innerHTML(IHTMLElement *iface, BSTR v)
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
@ -702,6 +845,11 @@ 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;
@ -1042,7 +1190,6 @@ static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector
nsIDOMNodeList *nsnode_list;
nsIDOMNode *iter;
PRUint32 list_len = 0, i;
PRUint16 node_type;
nsresult nsres;
nsres = nsIDOMNode_GetChildNodes(elem->node.nsnode, &nsnode_list);
@ -1065,9 +1212,8 @@ static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector
continue;
}
nsres = nsIDOMNode_GetNodeType(iter, &node_type);
if(NS_SUCCEEDED(nsres) && node_type == ELEMENT_NODE)
elem_vector_add(buf, HTMLELEM_NODE_THIS(get_node(doc, iter)));
if(is_elem_node(iter))
elem_vector_add(buf, HTMLELEM_NODE_THIS(get_node(doc, iter, TRUE)));
}
}
@ -1089,7 +1235,6 @@ static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector *b
nsIDOMNodeList *nsnode_list;
nsIDOMNode *iter;
PRUint32 list_len = 0, i;
PRUint16 node_type;
nsresult nsres;
nsres = nsIDOMNode_GetChildNodes(elem->nsnode, &nsnode_list);
@ -1109,9 +1254,8 @@ static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector *b
continue;
}
nsres = nsIDOMNode_GetNodeType(iter, &node_type);
if(NS_SUCCEEDED(nsres) && node_type == ELEMENT_NODE) {
HTMLDOMNode *node = get_node(doc, iter);
if(is_elem_node(iter)) {
HTMLDOMNode *node = get_node(doc, iter, TRUE);
elem_vector_add(buf, HTMLELEM_NODE_THIS(node));
create_all_list(doc, node, buf);
@ -1282,17 +1426,34 @@ static const NodeImplVtbl HTMLElementImplVtbl = {
HTMLElement_destructor
};
static const tid_t HTMLElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
0
};
static dispex_static_data_t HTMLElement_dispex = {
NULL,
DispHTMLUnknownElement_tid,
NULL,
HTMLElement_iface_tids
};
void HTMLElement_Init(HTMLElement *This)
{
This->node.vtbl = &HTMLElementImplVtbl;
This->lpHTMLElementVtbl = &HTMLElementVtbl;
ConnectionPointContainer_Init(&This->cp_container, (IUnknown*)HTMLELEM(This));
HTMLElement2_Init(This);
if(!This->node.dispex.data)
init_dispex(&This->node.dispex, (IUnknown*)HTMLELEM(This), &HTMLElement_dispex);
}
HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
HTMLElement *HTMLElement_Create(HTMLDocument *doc, nsIDOMNode *nsnode, BOOL use_generic)
{
nsIDOMHTMLElement *nselem;
HTMLElement *ret = NULL;
@ -1302,6 +1463,7 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
static const WCHAR wszA[] = {'A',0};
static const WCHAR wszBODY[] = {'B','O','D','Y',0};
static const WCHAR wszIMG[] = {'I','M','G',0};
static const WCHAR wszINPUT[] = {'I','N','P','U','T',0};
static const WCHAR wszOPTION[] = {'O','P','T','I','O','N',0};
static const WCHAR wszSCRIPT[] = {'S','C','R','I','P','T',0};
@ -1322,6 +1484,8 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
ret = HTMLAnchorElement_Create(nselem);
else if(!strcmpW(class_name, wszBODY))
ret = HTMLBodyElement_Create(nselem);
else if(!strcmpW(class_name, wszIMG))
ret = HTMLImgElement_Create(nselem);
else if(!strcmpW(class_name, wszINPUT))
ret = HTMLInputElement_Create(nselem);
else if(!strcmpW(class_name, wszOPTION))
@ -1334,20 +1498,27 @@ HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
ret = HTMLTable_Create(nselem);
else if(!strcmpW(class_name, wszTEXTAREA))
ret = HTMLTextAreaElement_Create(nselem);
else if(use_generic)
ret = HTMLGenericElement_Create(nselem);
if(!ret) {
ret = heap_alloc(sizeof(HTMLElement));
ret = heap_alloc_zero(sizeof(HTMLElement));
HTMLElement_Init(ret);
ret->node.vtbl = &HTMLElementImplVtbl;
}
TRACE("%s ret %p\n", debugstr_w(class_name), ret);
nsAString_Finish(&class_name_str);
ret->nselem = nselem;
HTMLDOMNode_Init(doc, &ret->node, (nsIDOMNode*)nselem);
return ret;
}
typedef struct {
DispatchEx dispex;
const IHTMLElementCollectionVtbl *lpHTMLElementCollectionVtbl;
IUnknown *ref_unk;
@ -1371,12 +1542,11 @@ static HRESULT WINAPI HTMLElementCollection_QueryInterface(IHTMLElementCollectio
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = HTMLELEMCOL(This);
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = HTMLELEMCOL(This);
}else if(IsEqualGUID(&IID_IHTMLElementCollection, riid)) {
TRACE("(%p)->(IID_IHTMLElementCollection %p)\n", This, ppv);
*ppv = HTMLELEMCOL(This);
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@ -1493,6 +1663,9 @@ static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name)
static const PRUnichar nameW[] = {'n','a','m','e',0};
if(!elem->nselem)
return FALSE;
nsAString_Init(&nsstr, NULL);
nsIDOMHTMLElement_GetId(elem->nselem, &nsstr);
nsAString_GetData(&nsstr, &str);
@ -1631,6 +1804,51 @@ static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface,
return S_OK;
}
#define DISPID_ELEMCOL_0 MSHTML_DISPID_CUSTOM_MIN
static HRESULT HTMLElementCollection_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid)
{
HTMLElementCollection *This = ELEMCOL_THIS(iface);
WCHAR *ptr;
DWORD idx=0;
for(ptr = name; *ptr && isdigitW(*ptr); ptr++)
idx = idx*10 + (*ptr-'0');
if(*ptr || idx >= This->len)
return DISP_E_UNKNOWNNAME;
*dispid = DISPID_ELEMCOL_0 + idx;
TRACE("ret %x\n", *dispid);
return S_OK;
}
static HRESULT HTMLElementCollection_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
{
HTMLElementCollection *This = ELEMCOL_THIS(iface);
DWORD idx;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
idx = id - DISPID_ELEMCOL_0;
if(idx >= This->len)
return DISP_E_UNKNOWNNAME;
switch(flags) {
case INVOKE_PROPERTYGET:
V_VT(res) = VT_DISPATCH;
V_DISPATCH(res) = (IDispatch*)HTMLELEM(This->elems[idx]);
IHTMLElement_AddRef(HTMLELEM(This->elems[idx]));
break;
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
return S_OK;
}
#undef ELEMCOL_THIS
static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = {
@ -1649,6 +1867,22 @@ static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = {
HTMLElementCollection_tags
};
static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = {
HTMLElementCollection_get_dispid,
HTMLElementCollection_invoke
};
static const tid_t HTMLElementCollection_iface_tids[] = {
IHTMLElementCollection_tid,
0
};
static dispex_static_data_t HTMLElementCollection_dispex = {
&HTMLElementColection_dispex_vtbl,
DispHTMLElementCollection_tid,
NULL,
HTMLElementCollection_iface_tids
};
IHTMLElementCollection *create_all_collection(HTMLDOMNode *node)
{
elem_vector buf = {NULL, 0, 8};
@ -1665,13 +1899,15 @@ IHTMLElementCollection *create_all_collection(HTMLDOMNode *node)
static IHTMLElementCollection *HTMLElementCollection_Create(IUnknown *ref_unk,
HTMLElement **elems, DWORD len)
{
HTMLElementCollection *ret = heap_alloc(sizeof(HTMLElementCollection));
HTMLElementCollection *ret = heap_alloc_zero(sizeof(HTMLElementCollection));
ret->lpHTMLElementCollectionVtbl = &HTMLElementCollectionVtbl;
ret->ref = 1;
ret->elems = elems;
ret->len = len;
init_dispex(&ret->dispex, (IUnknown*)HTMLELEMCOL(ret), &HTMLElementCollection_dispex);
IUnknown_AddRef(ref_unk);
ret->ref_unk = ref_unk;

View file

@ -383,29 +383,82 @@ static HRESULT WINAPI HTMLElement2_removeExpression(IHTMLElement2 *iface, BSTR p
static HRESULT WINAPI HTMLElement2_put_tabIndex(IHTMLElement2 *iface, short v)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)->(%d)\n", This, v);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
nsresult nsres;
TRACE("(%p)->(%d)\n", This, v);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
return S_OK;
}
nsres = nsIDOMNSHTMLElement_SetTabIndex(nselem, v);
nsIDOMNSHTMLElement_Release(nselem);
if(NS_FAILED(nsres))
ERR("GetTabIndex failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLElement2_get_tabIndex(IHTMLElement2 *iface, short *p)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
PRInt32 index = 0;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
return E_FAIL;
}
nsres = nsIDOMNSHTMLElement_GetTabIndex(nselem, &index);
nsIDOMNSHTMLElement_Release(nselem);
if(NS_FAILED(nsres)) {
ERR("GetTabIndex failed: %08x\n", nsres);
return E_FAIL;
}
*p = index;
return S_OK;
}
static HRESULT WINAPI HTMLElement2_focus(IHTMLElement2 *iface)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
nsresult nsres;
TRACE("(%p)\n", This);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
nsIDOMNSHTMLElement_focus(nselem);
nsIDOMNSHTMLElement_Release(nselem);
}else {
ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
}
return S_OK;
}
static HRESULT WINAPI HTMLElement2_put_accessKey(IHTMLElement2 *iface, BSTR v)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
VARIANT var;
static WCHAR accessKeyW[] = {'a','c','c','e','s','s','K','e','y',0};
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
V_VT(&var) = VT_BSTR;
V_BSTR(&var) = v;
return IHTMLElement_setAttribute(HTMLELEM(This), accessKeyW, var, 0);
}
static HRESULT WINAPI HTMLElement2_get_accessKey(IHTMLElement2 *iface, BSTR *p)
@ -481,15 +534,43 @@ static HRESULT WINAPI HTMLElement2_removeFilter(IHTMLElement2 *iface, IUnknown *
static HRESULT WINAPI HTMLElement2_get_clientHeight(IHTMLElement2 *iface, long *p)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
PRInt32 height=0;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
nsIDOMNSHTMLElement_GetClientHeight(nselem, &height);
nsIDOMNSHTMLElement_Release(nselem);
}else {
ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
}
*p = height;
return S_OK;
}
static HRESULT WINAPI HTMLElement2_get_clientWidth(IHTMLElement2 *iface, long *p)
{
HTMLElement *This = HTMLELEM2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNSHTMLElement *nselem;
PRInt32 width=0;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
nsIDOMNSHTMLElement_GetClientWidth(nselem, &width);
nsIDOMNSHTMLElement_Release(nselem);
}else {
ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
}
*p = width;
return S_OK;
}
static HRESULT WINAPI HTMLElement2_get_clientTop(IHTMLElement2 *iface, long *p)
@ -651,6 +732,11 @@ static HRESULT WINAPI HTMLElement2_put_scrollTop(IHTMLElement2 *iface, long v)
TRACE("(%p)->(%ld)\n", This, v);
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
nsIDOMNSHTMLElement_SetScrollTop(nselem, v);
@ -677,6 +763,11 @@ static HRESULT WINAPI HTMLElement2_put_scrollLeft(IHTMLElement2 *iface, long v)
TRACE("(%p)->(%ld)\n", This, v);
if(!This->nselem) {
FIXME("NULL nselem\n");
return E_NOTIMPL;
}
nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
nsIDOMNSHTMLElement_SetScrollLeft(nselem, v);

View file

@ -0,0 +1,490 @@
/*
* Copyright 2008 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 <stdarg.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "ole2.h"
#include "mshtml_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
struct event_target_t {
IDispatch *event_table[EVENTID_LAST];
};
static const WCHAR changeW[] = {'c','h','a','n','g','e',0};
static const WCHAR onchangeW[] = {'o','n','c','h','a','n','g','e',0};
static const WCHAR clickW[] = {'c','l','i','c','k',0};
static const WCHAR onclickW[] = {'o','n','c','l','i','c','k',0};
static const WCHAR keyupW[] = {'k','e','y','u','p',0};
static const WCHAR onkeyupW[] = {'o','n','k','e','y','u','p',0};
static const WCHAR loadW[] = {'l','o','a','d',0};
static const WCHAR onloadW[] = {'o','n','l','o','a','d',0};
typedef struct {
LPCWSTR name;
LPCWSTR attr_name;
DWORD flags;
} event_info_t;
#define EVENT_DEFAULTLISTENER 0x0001
static const event_info_t event_info[] = {
{changeW, onchangeW, EVENT_DEFAULTLISTENER},
{clickW, onclickW, EVENT_DEFAULTLISTENER},
{keyupW, onkeyupW, EVENT_DEFAULTLISTENER},
{loadW, onloadW, 0}
};
eventid_t str_to_eid(LPCWSTR str)
{
int i;
for(i=0; i < sizeof(event_info)/sizeof(event_info[0]); i++) {
if(!strcmpW(event_info[i].name, str))
return i;
}
ERR("unknown type %s\n", debugstr_w(str));
return EVENTID_LAST;
}
typedef struct {
const IHTMLEventObjVtbl *lpIHTMLEventObjVtbl;
LONG ref;
} HTMLEventObj;
#define HTMLEVENTOBJ(x) ((IHTMLEventObj*) &(x)->lpIHTMLEventObjVtbl)
#define HTMLEVENTOBJ_THIS(iface) DEFINE_THIS(HTMLEventObj, IHTMLEventObj, iface)
static HRESULT WINAPI HTMLEventObj_QueryInterface(IHTMLEventObj *iface, REFIID riid, void **ppv)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = HTMLEVENTOBJ(This);
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = HTMLEVENTOBJ(This);
}else if(IsEqualGUID(&IID_IHTMLEventObj, riid)) {
TRACE("(%p)->(IID_IHTMLEventObj %p)\n", This, ppv);
*ppv = HTMLEVENTOBJ(This);
}
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 HTMLEventObj_AddRef(IHTMLEventObj *iface)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
if(!ref)
heap_free(This);
return ref;
}
static HRESULT WINAPI HTMLEventObj_GetTypeInfoCount(IHTMLEventObj *iface, UINT *pctinfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_GetTypeInfo(IHTMLEventObj *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_GetIDsOfNames(IHTMLEventObj *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_Invoke(IHTMLEventObj *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_srcElement(IHTMLEventObj *iface, IHTMLElement **p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_altKey(IHTMLEventObj *iface, VARIANT_BOOL *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_ctrlKey(IHTMLEventObj *iface, VARIANT_BOOL *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_shiftKey(IHTMLEventObj *iface, VARIANT_BOOL *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_put_returnValue(IHTMLEventObj *iface, VARIANT v)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_returnValue(IHTMLEventObj *iface, VARIANT *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_put_cancelBubble(IHTMLEventObj *iface, VARIANT_BOOL v)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%x)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_cancelBubble(IHTMLEventObj *iface, VARIANT_BOOL *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_fromElement(IHTMLEventObj *iface, IHTMLElement **p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_toElement(IHTMLEventObj *iface, IHTMLElement **p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_put_keyCode(IHTMLEventObj *iface, long v)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_keyCode(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_button(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_type(IHTMLEventObj *iface, BSTR *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_qualifier(IHTMLEventObj *iface, BSTR *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_reason(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_x(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_y(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_clientX(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_clientY(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_offsetX(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_offsetY(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_screenX(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_screenY(IHTMLEventObj *iface, long *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLEventObj_get_srcFilter(IHTMLEventObj *iface, IDispatch **p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
#undef HTMLEVENTOBJ_THIS
static const IHTMLEventObjVtbl HTMLEventObjVtbl = {
HTMLEventObj_QueryInterface,
HTMLEventObj_AddRef,
HTMLEventObj_Release,
HTMLEventObj_GetTypeInfoCount,
HTMLEventObj_GetTypeInfo,
HTMLEventObj_GetIDsOfNames,
HTMLEventObj_Invoke,
HTMLEventObj_get_srcElement,
HTMLEventObj_get_altKey,
HTMLEventObj_get_ctrlKey,
HTMLEventObj_get_shiftKey,
HTMLEventObj_put_returnValue,
HTMLEventObj_get_returnValue,
HTMLEventObj_put_cancelBubble,
HTMLEventObj_get_cancelBubble,
HTMLEventObj_get_fromElement,
HTMLEventObj_get_toElement,
HTMLEventObj_put_keyCode,
HTMLEventObj_get_keyCode,
HTMLEventObj_get_button,
HTMLEventObj_get_type,
HTMLEventObj_get_qualifier,
HTMLEventObj_get_reason,
HTMLEventObj_get_x,
HTMLEventObj_get_y,
HTMLEventObj_get_clientX,
HTMLEventObj_get_clientY,
HTMLEventObj_get_offsetX,
HTMLEventObj_get_offsetY,
HTMLEventObj_get_screenX,
HTMLEventObj_get_screenY,
HTMLEventObj_get_srcFilter
};
static IHTMLEventObj *create_event(void)
{
HTMLEventObj *ret;
ret = heap_alloc(sizeof(*ret));
ret->lpIHTMLEventObjVtbl = &HTMLEventObjVtbl;
ret->ref = 1;
return HTMLEVENTOBJ(ret);
}
void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target)
{
HTMLDOMNode *node;
node = get_node(doc, target, FALSE);
if(!node)
return;
if(node->event_target && node->event_target->event_table[eid]) {
doc->window->event = create_event();
TRACE("%s >>>\n", debugstr_w(event_info[eid].name));
call_disp_func(doc, node->event_target->event_table[eid]);
TRACE("%s <<<\n", debugstr_w(event_info[eid].name));
IHTMLEventObj_Release(doc->window->event);
doc->window->event = NULL;
}
}
static HRESULT set_node_event_disp(HTMLDOMNode *node, eventid_t eid, IDispatch *disp)
{
if(!node->event_target)
node->event_target = heap_alloc_zero(sizeof(event_target_t));
else if(node->event_target->event_table[eid])
IDispatch_Release(node->event_target->event_table[eid]);
IDispatch_AddRef(disp);
node->event_target->event_table[eid] = disp;
if((event_info[eid].flags & EVENT_DEFAULTLISTENER) && !node->doc->nscontainer->event_vector[eid]) {
node->doc->nscontainer->event_vector[eid] = TRUE;
add_nsevent_listener(node->doc->nscontainer, event_info[eid].name);
}
return S_OK;
}
HRESULT set_node_event(HTMLDOMNode *node, eventid_t eid, VARIANT *var)
{
switch(V_VT(var)) {
case VT_DISPATCH:
return set_node_event_disp(node, eid, V_DISPATCH(var));
default:
FIXME("not supported vt=%d\n", V_VT(var));
}
return E_NOTIMPL;
}
void check_event_attr(HTMLDocument *doc, nsIDOMElement *nselem)
{
const PRUnichar *attr_value;
nsAString attr_name_str, attr_value_str;
IDispatch *disp;
HTMLDOMNode *node;
int i;
nsresult nsres;
nsAString_Init(&attr_value_str, NULL);
nsAString_Init(&attr_name_str, NULL);
for(i=0; i < EVENTID_LAST; i++) {
nsAString_SetData(&attr_name_str, event_info[i].attr_name);
nsres = nsIDOMElement_GetAttribute(nselem, &attr_name_str, &attr_value_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&attr_value_str, &attr_value);
if(!*attr_value)
continue;
TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value));
disp = script_parse_event(doc, attr_value);
if(disp) {
node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
set_node_event_disp(node, i, disp);
IDispatch_Release(disp);
}
}
}
nsAString_Finish(&attr_value_str);
nsAString_Finish(&attr_name_str);
}
void release_event_target(event_target_t *event_target)
{
int i;
for(i=0; i < EVENTID_LAST; i++) {
if(event_target->event_table[i])
IDispatch_Release(event_target->event_table[i]);
}
heap_free(event_target);
}

View file

@ -0,0 +1,190 @@
/*
* Copyright 2008 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 <stdarg.h>
#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 {
HTMLElement element;
const IHTMLGenericElementVtbl *lpHTMLGenericElementVtbl;
} HTMLGenericElement;
#define HTMLGENERIC(x) ((IHTMLGenericElement*) &(x)->lpHTMLGenericElementVtbl)
#define HTMLGENERIC_THIS(iface) DEFINE_THIS(HTMLGenericElement, HTMLGenericElement, iface)
static HRESULT WINAPI HTMLGenericElement_QueryInterface(IHTMLGenericElement *iface, REFIID riid, void **ppv)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
}
static ULONG WINAPI HTMLGenericElement_AddRef(IHTMLGenericElement *iface)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
}
static ULONG WINAPI HTMLGenericElement_Release(IHTMLGenericElement *iface)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
}
static HRESULT WINAPI HTMLGenericElement_GetTypeInfoCount(IHTMLGenericElement *iface, UINT *pctinfo)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLGenericElement_GetTypeInfo(IHTMLGenericElement *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLGenericElement_GetIDsOfNames(IHTMLGenericElement *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLGenericElement_Invoke(IHTMLGenericElement *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLGenericElement_get_recordset(IHTMLGenericElement *iface, IDispatch **p)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLGenericElement_namedRecordset(IHTMLGenericElement *iface,
BSTR dataMember, VARIANT *hierarchy, IDispatch **ppRecordset)
{
HTMLGenericElement *This = HTMLGENERIC_THIS(iface);
FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(dataMember), hierarchy, ppRecordset);
return E_NOTIMPL;
}
static const IHTMLGenericElementVtbl HTMLGenericElementVtbl = {
HTMLGenericElement_QueryInterface,
HTMLGenericElement_AddRef,
HTMLGenericElement_Release,
HTMLGenericElement_GetTypeInfoCount,
HTMLGenericElement_GetTypeInfo,
HTMLGenericElement_GetIDsOfNames,
HTMLGenericElement_Invoke,
HTMLGenericElement_get_recordset,
HTMLGenericElement_namedRecordset
};
#define HTMLGENERIC_NODE_THIS(iface) DEFINE_THIS2(HTMLGenericElement, element.node, iface)
static HRESULT HTMLGenericElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
{
HTMLGenericElement *This = HTMLGENERIC_NODE_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IHTMLGenericElement, riid)) {
TRACE("(%p)->(IID_IHTMLGenericElement %p)\n", This, ppv);
*ppv = HTMLGENERIC(This);
}else {
return HTMLElement_QI(&This->element.node, riid, ppv);
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
static void HTMLGenericElement_destructor(HTMLDOMNode *iface)
{
HTMLGenericElement *This = HTMLGENERIC_NODE_THIS(iface);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLGENERIC_NODE_THIS
static const NodeImplVtbl HTMLGenericElementImplVtbl = {
HTMLGenericElement_QI,
HTMLGenericElement_destructor
};
static const tid_t HTMLGenericElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLElement2_tid,
IHTMLGenericElement_tid,
0
};
static dispex_static_data_t HTMLGenericElement_dispex = {
NULL,
DispHTMLGenericElement_tid,
NULL,
HTMLGenericElement_iface_tids
};
HTMLElement *HTMLGenericElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLGenericElement *ret;
ret = heap_alloc_zero(sizeof(HTMLGenericElement));
ret->lpHTMLGenericElementVtbl = &HTMLGenericElementVtbl;
ret->element.node.vtbl = &HTMLGenericElementImplVtbl;
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLGENERIC(ret), &HTMLGenericElement_dispex);
HTMLElement_Init(&ret->element);
return &ret->element;
}

View file

@ -0,0 +1,601 @@
/*
* Copyright 2008 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 <stdarg.h>
#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 {
HTMLElement element;
const IHTMLImgElementVtbl *lpHTMLImgElementVtbl;
nsIDOMHTMLImageElement *nsimg;
} HTMLImgElement;
#define HTMLIMG(x) ((IHTMLImgElement*) &(x)->lpHTMLImgElementVtbl)
#define HTMLIMG_THIS(iface) DEFINE_THIS(HTMLImgElement, HTMLImgElement, iface)
static HRESULT WINAPI HTMLImgElement_QueryInterface(IHTMLImgElement *iface, REFIID riid, void **ppv)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->element.node), riid, ppv);
}
static ULONG WINAPI HTMLImgElement_AddRef(IHTMLImgElement *iface)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->element.node));
}
static ULONG WINAPI HTMLImgElement_Release(IHTMLImgElement *iface)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node));
}
static HRESULT WINAPI HTMLImgElement_GetTypeInfoCount(IHTMLImgElement *iface, UINT *pctinfo)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_GetTypeInfo(IHTMLImgElement *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_GetIDsOfNames(IHTMLImgElement *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_Invoke(IHTMLImgElement *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_isMap(IHTMLImgElement *iface, VARIANT_BOOL v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%x)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_isMap(IHTMLImgElement *iface, VARIANT_BOOL *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_useMap(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_useMap(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_mimeType(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_fileSize(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_fileCreatedDate(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_fileModifiedDate(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_fileUpdatedDate(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_protocol(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_href(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_nameProp(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_border(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_border(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_vspace(IHTMLImgElement *iface, long v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_vspace(IHTMLImgElement *iface, long *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_hspace(IHTMLImgElement *iface, long v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_hspace(IHTMLImgElement *iface, long *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_alt(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
nsAString alt_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
nsAString_Init(&alt_str, v);
nsres = nsIDOMHTMLImageElement_SetAlt(This->nsimg, &alt_str);
nsAString_Finish(&alt_str);
if(NS_FAILED(nsres))
ERR("SetAlt failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLImgElement_get_alt(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
nsAString alt_str;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsAString_Init(&alt_str, NULL);
nsres = nsIDOMHTMLImageElement_GetAlt(This->nsimg, &alt_str);
if(NS_SUCCEEDED(nsres)) {
const PRUnichar *alt;
nsAString_GetData(&alt_str, &alt);
*p = *alt ? SysAllocString(alt) : NULL;
}else {
ERR("GetAlt failed: %08x\n", nsres);
}
nsAString_Finish(&alt_str);
return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL;
}
static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
nsAString src_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
nsAString_Init(&src_str, v);
nsres = nsIDOMHTMLImageElement_SetSrc(This->nsimg, &src_str);
nsAString_Finish(&src_str);
if(NS_FAILED(nsres))
ERR("SetSrc failed: %08x\n", nsres);
return NS_OK;
}
static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_lowsrc(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_lowsrc(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_vrml(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_vrml(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_dynsrc(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_dynsrc(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_readyState(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_complete(IHTMLImgElement *iface, VARIANT_BOOL *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_loop(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_loop(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_align(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_align(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_onload(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_onload(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_onerror(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_onerror(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_onabort(IHTMLImgElement *iface, VARIANT v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_onabort(IHTMLImgElement *iface, VARIANT *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_name(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_name(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_width(IHTMLImgElement *iface, long v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_width(IHTMLImgElement *iface, long *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_height(IHTMLImgElement *iface, long v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%ld)\n", This, v);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_height(IHTMLImgElement *iface, long *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_put_start(IHTMLImgElement *iface, BSTR v)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLImgElement_get_start(IHTMLImgElement *iface, BSTR *p)
{
HTMLImgElement *This = HTMLIMG_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
#undef HTMLIMG_THIS
static const IHTMLImgElementVtbl HTMLImgElementVtbl = {
HTMLImgElement_QueryInterface,
HTMLImgElement_AddRef,
HTMLImgElement_Release,
HTMLImgElement_GetTypeInfoCount,
HTMLImgElement_GetTypeInfo,
HTMLImgElement_GetIDsOfNames,
HTMLImgElement_Invoke,
HTMLImgElement_put_isMap,
HTMLImgElement_get_isMap,
HTMLImgElement_put_useMap,
HTMLImgElement_get_useMap,
HTMLImgElement_get_mimeType,
HTMLImgElement_get_fileSize,
HTMLImgElement_get_fileCreatedDate,
HTMLImgElement_get_fileModifiedDate,
HTMLImgElement_get_fileUpdatedDate,
HTMLImgElement_get_protocol,
HTMLImgElement_get_href,
HTMLImgElement_get_nameProp,
HTMLImgElement_put_border,
HTMLImgElement_get_border,
HTMLImgElement_put_vspace,
HTMLImgElement_get_vspace,
HTMLImgElement_put_hspace,
HTMLImgElement_get_hspace,
HTMLImgElement_put_alt,
HTMLImgElement_get_alt,
HTMLImgElement_put_src,
HTMLImgElement_get_src,
HTMLImgElement_put_lowsrc,
HTMLImgElement_get_lowsrc,
HTMLImgElement_put_vrml,
HTMLImgElement_get_vrml,
HTMLImgElement_put_dynsrc,
HTMLImgElement_get_dynsrc,
HTMLImgElement_get_readyState,
HTMLImgElement_get_complete,
HTMLImgElement_put_loop,
HTMLImgElement_get_loop,
HTMLImgElement_put_align,
HTMLImgElement_get_align,
HTMLImgElement_put_onload,
HTMLImgElement_get_onload,
HTMLImgElement_put_onerror,
HTMLImgElement_get_onerror,
HTMLImgElement_put_onabort,
HTMLImgElement_get_onabort,
HTMLImgElement_put_name,
HTMLImgElement_get_name,
HTMLImgElement_put_width,
HTMLImgElement_get_width,
HTMLImgElement_put_height,
HTMLImgElement_get_height,
HTMLImgElement_put_start,
HTMLImgElement_get_start
};
#define HTMLIMG_NODE_THIS(iface) DEFINE_THIS2(HTMLImgElement, element.node, iface)
static HRESULT HTMLImgElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
{
HTMLImgElement *This = HTMLIMG_NODE_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IHTMLImgElement, riid)) {
TRACE("(%p)->(IID_IHTMLImgElement %p)\n", This, ppv);
*ppv = HTMLIMG(This);
}else {
return HTMLElement_QI(&This->element.node, riid, ppv);
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
static void HTMLImgElement_destructor(HTMLDOMNode *iface)
{
HTMLImgElement *This = HTMLIMG_NODE_THIS(iface);
if(This->nsimg)
nsIDOMHTMLImageElement_Release(This->nsimg);
HTMLElement_destructor(&This->element.node);
}
#undef HTMLIMG_NODE_THIS
static const NodeImplVtbl HTMLImgElementImplVtbl = {
HTMLImgElement_QI,
HTMLImgElement_destructor
};
static const tid_t HTMLImgElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLImgElement_tid,
0
};
static dispex_static_data_t HTMLImgElement_dispex = {
NULL,
DispHTMLImg_tid,
NULL,
HTMLImgElement_iface_tids
};
HTMLElement *HTMLImgElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLImgElement *ret = heap_alloc_zero(sizeof(HTMLImgElement));
nsresult nsres;
ret->lpHTMLImgElementVtbl = &HTMLImgElementVtbl;
ret->element.node.vtbl = &HTMLImgElementImplVtbl;
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLImageElement, (void**)&ret->nsimg);
if(NS_FAILED(nsres))
ERR("Could not get nsIDOMHTMLImageElement: %08x\n", nsres);
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLIMG(ret), &HTMLImgElement_dispex);
HTMLElement_Init(&ret->element);
return &ret->element;
}

View file

@ -70,16 +70,16 @@ static ULONG WINAPI HTMLInputElement_Release(IHTMLInputElement *iface)
static HRESULT WINAPI HTMLInputElement_GetTypeInfoCount(IHTMLInputElement *iface, UINT *pctinfo)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
}
static HRESULT WINAPI HTMLInputElement_GetTypeInfo(IHTMLInputElement *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLInputElement_GetIDsOfNames(IHTMLInputElement *iface, REFIID riid,
@ -87,9 +87,9 @@ static HRESULT WINAPI HTMLInputElement_GetIDsOfNames(IHTMLInputElement *iface, R
LCID lcid, DISPID *rgDispId)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames,
cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID dispIdMember,
@ -97,9 +97,9 @@ static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID d
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid, wFlags,
pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v)
@ -137,8 +137,18 @@ static HRESULT WINAPI HTMLInputElement_get_type(IHTMLInputElement *iface, BSTR *
static HRESULT WINAPI HTMLInputElement_put_value(IHTMLInputElement *iface, BSTR v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
nsAString val_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
nsAString_Init(&val_str, v);
nsres = nsIDOMHTMLInputElement_SetValue(This->nsinput, &val_str);
nsAString_Finish(&val_str);
if(NS_FAILED(nsres))
ERR("SetValue failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_value(IHTMLInputElement *iface, BSTR *p)
@ -216,15 +226,28 @@ static HRESULT WINAPI HTMLInputElement_get_status(IHTMLInputElement *iface, VARI
static HRESULT WINAPI HTMLInputElement_put_disabled(IHTMLInputElement *iface, VARIANT_BOOL v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%x)\n", This, v);
return E_NOTIMPL;
nsresult nsres;
TRACE("(%p)->(%x)\n", This, v);
nsres = nsIDOMHTMLInputElement_SetDisabled(This->nsinput, v != VARIANT_FALSE);
if(NS_FAILED(nsres))
ERR("SetDisabled failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_disabled(IHTMLInputElement *iface, VARIANT_BOOL *p)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
PRBool disabled = FALSE;
TRACE("(%p)->(%p)\n", This, p);
nsIDOMHTMLInputElement_GetDisabled(This->nsinput, &disabled);
*p = disabled ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_form(IHTMLInputElement *iface, IHTMLFormElement **p)
@ -1053,16 +1076,32 @@ static const NodeImplVtbl HTMLInputElementImplVtbl = {
HTMLInputElement_destructor
};
static const tid_t HTMLInputElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLInputElement_tid,
0
};
static dispex_static_data_t HTMLInputElement_dispex = {
NULL,
DispHTMLInputElement_tid,
NULL,
HTMLInputElement_iface_tids
};
HTMLElement *HTMLInputElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLInputElement *ret = heap_alloc(sizeof(HTMLInputElement));
HTMLInputElement *ret = heap_alloc_zero(sizeof(HTMLInputElement));
nsresult nsres;
HTMLElement_Init(&ret->element);
ret->lpHTMLInputElementVtbl = &HTMLInputElementVtbl;
ret->element.node.vtbl = &HTMLInputElementImplVtbl;
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLINPUT(ret), &HTMLInputElement_dispex);
HTMLElement_Init(&ret->element);
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLInputElement,
(void**)&ret->nsinput);
if(NS_FAILED(nsres))

View file

@ -31,7 +31,251 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define NSSUPPORTS(x) ((nsISupports*) &(x)->lpSupportsVtbl)
static HTMLDOMNode *get_node_obj(HTMLDocument*,IUnknown*);
typedef struct {
DispatchEx dispex;
const IHTMLDOMChildrenCollectionVtbl *lpIHTMLDOMChildrenCollectionVtbl;
LONG ref;
/* FIXME: implement weak reference */
HTMLDocument *doc;
nsIDOMNodeList *nslist;
} HTMLDOMChildrenCollection;
#define HTMLCHILDCOL(x) ((IHTMLDOMChildrenCollection*) &(x)->lpIHTMLDOMChildrenCollectionVtbl)
#define HTMLCHILDCOL_THIS(iface) DEFINE_THIS(HTMLDOMChildrenCollection, IHTMLDOMChildrenCollection, iface)
static HRESULT WINAPI HTMLDOMChildrenCollection_QueryInterface(IHTMLDOMChildrenCollection *iface, REFIID riid, void **ppv)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = HTMLCHILDCOL(This);
}else if(IsEqualGUID(&IID_IHTMLDOMChildrenCollection, riid)) {
TRACE("(%p)->(IID_IHTMLDOMChildrenCollection %p)\n", This, ppv);
*ppv = HTMLCHILDCOL(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 HTMLDOMChildrenCollection_AddRef(IHTMLDOMChildrenCollection *iface)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
return ref;
}
static ULONG WINAPI HTMLDOMChildrenCollection_Release(IHTMLDOMChildrenCollection *iface)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
nsIDOMNodeList_Release(This->nslist);
heap_free(This);
}
return ref;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_GetTypeInfoCount(IHTMLDOMChildrenCollection *iface, UINT *pctinfo)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_GetTypeInfo(IHTMLDOMChildrenCollection *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_GetIDsOfNames(IHTMLDOMChildrenCollection *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_Invoke(IHTMLDOMChildrenCollection *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_get_length(IHTMLDOMChildrenCollection *iface, long *p)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
PRUint32 length=0;
TRACE("(%p)->(%p)\n", This, p);
nsIDOMNodeList_GetLength(This->nslist, &length);
*p = length;
return S_OK;
}
static HRESULT WINAPI HTMLDOMChildrenCollection__newEnum(IHTMLDOMChildrenCollection *iface, IUnknown **p)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMChildrenCollection_item(IHTMLDOMChildrenCollection *iface, long index, IDispatch **ppItem)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
nsIDOMNode *nsnode = NULL;
PRUint32 length=0;
nsresult nsres;
TRACE("(%p)->(%ld %p)\n", This, index, ppItem);
nsIDOMNodeList_GetLength(This->nslist, &length);
if(index < 0 || index >= length)
return E_INVALIDARG;
nsres = nsIDOMNodeList_Item(This->nslist, index, &nsnode);
if(NS_FAILED(nsres) || !nsnode) {
ERR("Item failed: %08x\n", nsres);
return E_FAIL;
}
*ppItem = (IDispatch*)get_node(This->doc, nsnode, TRUE);
IDispatch_AddRef(*ppItem);
return S_OK;
}
#define DISPID_CHILDCOL_0 MSHTML_DISPID_CUSTOM_MIN
static HRESULT HTMLDOMChildrenCollection_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
WCHAR *ptr;
DWORD idx=0;
PRUint32 len = 0;
for(ptr = name; *ptr && isdigitW(*ptr); ptr++)
idx = idx*10 + (*ptr-'0');
if(*ptr)
return DISP_E_UNKNOWNNAME;
nsIDOMNodeList_GetLength(This->nslist, &len);
if(idx >= len)
return DISP_E_UNKNOWNNAME;
*dispid = DISPID_CHILDCOL_0 + idx;
TRACE("ret %x\n", *dispid);
return S_OK;
}
static HRESULT HTMLDOMChildrenCollection_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
{
HTMLDOMChildrenCollection *This = HTMLCHILDCOL_THIS(iface);
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
switch(flags) {
case INVOKE_PROPERTYGET: {
IDispatch *disp = NULL;
HRESULT hres;
hres = IHTMLDOMChildrenCollection_item(HTMLCHILDCOL(This), id - DISPID_CHILDCOL_0, &disp);
if(0&&FAILED(hres))
return hres;
V_VT(res) = VT_DISPATCH;
V_DISPATCH(res) = disp;
break;
}
default:
FIXME("unimplemented flags %x\n", flags);
return E_NOTIMPL;
}
return S_OK;
}
#undef HTMLCHILDCOL_THIS
static const IHTMLDOMChildrenCollectionVtbl HTMLDOMChildrenCollectionVtbl = {
HTMLDOMChildrenCollection_QueryInterface,
HTMLDOMChildrenCollection_AddRef,
HTMLDOMChildrenCollection_Release,
HTMLDOMChildrenCollection_GetTypeInfoCount,
HTMLDOMChildrenCollection_GetTypeInfo,
HTMLDOMChildrenCollection_GetIDsOfNames,
HTMLDOMChildrenCollection_Invoke,
HTMLDOMChildrenCollection_get_length,
HTMLDOMChildrenCollection__newEnum,
HTMLDOMChildrenCollection_item
};
static const tid_t HTMLDOMChildrenCollection_iface_tids[] = {
IHTMLDOMChildrenCollection_tid,
0
};
static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = {
HTMLDOMChildrenCollection_get_dispid,
HTMLDOMChildrenCollection_invoke
};
static dispex_static_data_t HTMLDOMChildrenCollection_dispex = {
&HTMLDOMChildrenCollection_dispex_vtbl,
DispDOMChildrenCollection_tid,
NULL,
HTMLDOMChildrenCollection_iface_tids
};
static IHTMLDOMChildrenCollection *create_child_collection(HTMLDocument *doc, nsIDOMNodeList *nslist)
{
HTMLDOMChildrenCollection *ret;
ret = heap_alloc_zero(sizeof(*ret));
ret->lpIHTMLDOMChildrenCollectionVtbl = &HTMLDOMChildrenCollectionVtbl;
ret->ref = 1;
nsIDOMNodeList_AddRef(nslist);
ret->nslist = nslist;
ret->doc = doc;
init_dispex(&ret->dispex, (IUnknown*)HTMLCHILDCOL(ret), &HTMLDOMChildrenCollection_dispex);
return HTMLCHILDCOL(ret);
}
#define HTMLDOMNODE_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode, iface)
@ -106,29 +350,98 @@ static HRESULT WINAPI HTMLDOMNode_Invoke(IHTMLDOMNode *iface, DISPID dispIdMembe
static HRESULT WINAPI HTMLDOMNode_get_nodeType(IHTMLDOMNode *iface, long *p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
PRUint16 type = -1;
TRACE("(%p)->(%p)\n", This, p);
nsIDOMNode_GetNodeType(This->nsnode, &type);
switch(type) {
case ELEMENT_NODE:
*p = 1;
break;
case TEXT_NODE:
*p = 3;
break;
case COMMENT_NODE:
*p = 8;
break;
case DOCUMENT_NODE:
*p = 9;
break;
default:
/*
* FIXME:
* According to MSDN only ELEMENT_NODE and TEXT_NODE are supported.
* It needs more tests.
*/
FIXME("type %u\n", type);
*p = 0;
}
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_parentNode(IHTMLDOMNode *iface, IHTMLDOMNode **p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
HTMLDOMNode *node;
nsIDOMNode *nsnode;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMNode_GetParentNode(This->nsnode, &nsnode);
if(NS_FAILED(nsres)) {
ERR("GetParentNode failed: %08x\n", nsres);
return E_FAIL;
}
if(!nsnode) {
*p = NULL;
return S_OK;
}
node = get_node(This->doc, nsnode, TRUE);
*p = HTMLDOMNODE(node);
IHTMLDOMNode_AddRef(*p);
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_hasChildNodes(IHTMLDOMNode *iface, VARIANT_BOOL *fChildren)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, fChildren);
return E_NOTIMPL;
PRBool has_child = FALSE;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, fChildren);
nsres = nsIDOMNode_HasChildNodes(This->nsnode, &has_child);
if(NS_FAILED(nsres))
ERR("HasChildNodes failed: %08x\n", nsres);
*fChildren = has_child ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_childNodes(IHTMLDOMNode *iface, IDispatch **p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNodeList *nslist;
nsresult nsres;
TRACE("(%p)->(%p)\n", This, p);
nsres = nsIDOMNode_GetChildNodes(This->nsnode, &nslist);
if(NS_FAILED(nsres)) {
ERR("GetChildNodes failed: %08x\n", nsres);
return E_FAIL;
}
*p = (IDispatch*)create_child_collection(This->doc, nslist);
nsIDOMNodeList_Release(nslist);
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_attributes(IHTMLDOMNode *iface, IDispatch **p)
@ -146,12 +459,30 @@ static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
static HRESULT WINAPI HTMLDOMNode_removeChild(IHTMLDOMNode *iface, IHTMLDOMNode *oldChild,
IHTMLDOMNode **node)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p %p)\n", This, newChild, node);
return E_NOTIMPL;
HTMLDOMNode *node_obj;
nsIDOMNode *nsnode;
nsresult nsres;
TRACE("(%p)->(%p %p)\n", This, oldChild, node);
node_obj = get_node_obj(This->doc, (IUnknown*)oldChild);
if(!node_obj)
return E_FAIL;
nsres = nsIDOMNode_RemoveChild(This->nsnode, node_obj->nsnode, &nsnode);
if(NS_FAILED(nsres)) {
ERR("RemoveChild failed: %08x\n", nsres);
return E_FAIL;
}
/* FIXME: Make sure that node != newChild */
*node = HTMLDOMNODE(get_node(This->doc, nsnode, TRUE));
IHTMLDOMNode_AddRef(*node);
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_replaceChild(IHTMLDOMNode *iface, IHTMLDOMNode *newChild,
@ -198,8 +529,26 @@ static HRESULT WINAPI HTMLDOMNode_appendChild(IHTMLDOMNode *iface, IHTMLDOMNode
IHTMLDOMNode **node)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p %p)\n", This, newChild, node);
return E_NOTIMPL;
HTMLDOMNode *node_obj;
nsIDOMNode *nsnode;
nsresult nsres;
TRACE("(%p)->(%p %p)\n", This, newChild, node);
node_obj = get_node_obj(This->doc, (IUnknown*)newChild);
if(!node_obj)
return E_FAIL;
nsres = nsIDOMNode_AppendChild(This->nsnode, node_obj->nsnode, &nsnode);
if(NS_FAILED(nsres)) {
ERR("AppendChild failed: %08x\n", nsres);
return E_FAIL;
}
/* FIXME: Make sure that node != newChild */
*node = HTMLDOMNODE(get_node(This->doc, nsnode, TRUE));
IHTMLDOMNode_AddRef(*node);
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p)
@ -234,29 +583,87 @@ static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p)
static HRESULT WINAPI HTMLDOMNode_put_nodeValue(IHTMLDOMNode *iface, VARIANT v)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->()\n", This);
TRACE("(%p)->()\n", This);
switch(V_VT(&v)) {
case VT_BSTR: {
nsAString val_str;
TRACE("bstr %s\n", debugstr_w(V_BSTR(&v)));
nsAString_Init(&val_str, V_BSTR(&v));
nsIDOMNode_SetNodeValue(This->nsnode, &val_str);
nsAString_Finish(&val_str);
return S_OK;
}
default:
FIXME("unsupported vt %d\n", V_VT(&v));
}
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode_get_nodeValue(IHTMLDOMNode *iface, VARIANT *p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
const PRUnichar *val;
nsAString val_str;
TRACE("(%p)->(%p)\n", This, p);
nsAString_Init(&val_str, NULL);
nsIDOMNode_GetNodeValue(This->nsnode, &val_str);
nsAString_GetData(&val_str, &val);
if(*val) {
V_VT(p) = VT_BSTR;
V_BSTR(p) = SysAllocString(val);
}else {
V_VT(p) = VT_NULL;
}
nsAString_Finish(&val_str);
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_firstChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNode *nschild = NULL;
TRACE("(%p)->(%p)\n", This, p);
nsIDOMNode_GetFirstChild(This->nsnode, &nschild);
if(nschild) {
*p = HTMLDOMNODE(get_node(This->doc, nschild, TRUE));
IHTMLDOMNode_AddRef(*p);
}else {
*p = NULL;
}
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_lastChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
nsIDOMNode *nschild = NULL;
TRACE("(%p)->(%p)\n", This, p);
nsIDOMNode_GetLastChild(This->nsnode, &nschild);
if(nschild) {
*p = HTMLDOMNODE(get_node(This->doc, nschild, TRUE));
IHTMLDOMNode_AddRef(*p);
}else {
*p = NULL;
}
return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_previousSibling(IHTMLDOMNode *iface, IHTMLDOMNode **p)
@ -273,6 +680,8 @@ static HRESULT WINAPI HTMLDOMNode_get_nextSibling(IHTMLDOMNode *iface, IHTMLDOMN
return E_NOTIMPL;
}
#undef HTMLDOMNODE_THIS
static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl = {
HTMLDOMNode_QueryInterface,
HTMLDOMNode_AddRef,
@ -303,6 +712,85 @@ static const IHTMLDOMNodeVtbl HTMLDOMNodeVtbl = {
HTMLDOMNode_get_nextSibling
};
#define HTMLDOMNODE2_THIS(iface) DEFINE_THIS(HTMLDOMNode, HTMLDOMNode2, iface)
static HRESULT WINAPI HTMLDOMNode2_QueryInterface(IHTMLDOMNode2 *iface,
REFIID riid, void **ppv)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(This), riid, ppv);
}
static ULONG WINAPI HTMLDOMNode2_AddRef(IHTMLDOMNode2 *iface)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
return IHTMLDOMNode_AddRef(HTMLDOMNODE(This));
}
static ULONG WINAPI HTMLDOMNode2_Release(IHTMLDOMNode2 *iface)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
return IHTMLDOMNode_Release(HTMLDOMNODE(This));
}
static HRESULT WINAPI HTMLDOMNode2_GetTypeInfoCount(IHTMLDOMNode2 *iface, UINT *pctinfo)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode2_GetTypeInfo(IHTMLDOMNode2 *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode2_GetIDsOfNames(IHTMLDOMNode2 *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode2_Invoke(IHTMLDOMNode2 *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMNode2_get_ownerDocument(IHTMLDOMNode2 *iface, IDispatch **p)
{
HTMLDOMNode *This = HTMLDOMNODE2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
#undef HTMLDOMNODE2_THIS
static const IHTMLDOMNode2Vtbl HTMLDOMNode2Vtbl = {
HTMLDOMNode2_QueryInterface,
HTMLDOMNode2_AddRef,
HTMLDOMNode2_Release,
HTMLDOMNode2_GetTypeInfoCount,
HTMLDOMNode2_GetTypeInfo,
HTMLDOMNode2_GetIDsOfNames,
HTMLDOMNode2_Invoke,
HTMLDOMNode2_get_ownerDocument
};
HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv)
{
*ppv = NULL;
@ -313,9 +801,22 @@ HRESULT HTMLDOMNode_QI(HTMLDOMNode *This, REFIID riid, void **ppv)
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = HTMLDOMNODE(This);
}else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
if(This->dispex.data) {
TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
*ppv = DISPATCHEX(&This->dispex);
}else {
FIXME("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
return E_NOINTERFACE;
}
}else if(IsEqualGUID(&IID_IHTMLDOMNode, riid)) {
TRACE("(%p)->(IID_IHTMLDOMNode %p)\n", This, ppv);
*ppv = HTMLDOMNODE(This);
}else if(IsEqualGUID(&IID_IHTMLDOMNode2, riid)) {
TRACE("(%p)->(IID_IHTMLDOMNode2 %p)\n", This, ppv);
*ppv = HTMLDOMNODE2(This);
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@ -331,6 +832,8 @@ void HTMLDOMNode_destructor(HTMLDOMNode *This)
{
if(This->nsnode)
nsIDOMNode_Release(This->nsnode);
if(This->event_target)
release_event_target(This->event_target);
}
static const NodeImplVtbl HTMLDOMNodeImplVtbl = {
@ -338,6 +841,20 @@ static const NodeImplVtbl HTMLDOMNodeImplVtbl = {
HTMLDOMNode_destructor
};
void HTMLDOMNode_Init(HTMLDocument *doc, HTMLDOMNode *node, nsIDOMNode *nsnode)
{
node->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
node->lpHTMLDOMNode2Vtbl = &HTMLDOMNode2Vtbl;
node->ref = 1;
node->doc = doc;
nsIDOMNode_AddRef(nsnode);
node->nsnode = nsnode;
node->next = doc->nodes;
doc->nodes = node;
}
static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode)
{
HTMLDOMNode *ret;
@ -347,19 +864,21 @@ static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode)
switch(node_type) {
case ELEMENT_NODE:
ret = &HTMLElement_Create(nsnode)->node;
ret = &HTMLElement_Create(doc, nsnode, FALSE)->node;
break;
case TEXT_NODE:
ret = HTMLDOMTextNode_Create(doc, nsnode);
break;
case COMMENT_NODE:
ret = &HTMLCommentElement_Create(doc, nsnode)->node;
break;
default:
ret = heap_alloc(sizeof(HTMLDOMNode));
ret = heap_alloc_zero(sizeof(HTMLDOMNode));
ret->vtbl = &HTMLDOMNodeImplVtbl;
HTMLDOMNode_Init(doc, ret, nsnode);
}
ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl;
ret->ref = 1;
ret->doc = doc;
nsIDOMNode_AddRef(nsnode);
ret->nsnode = nsnode;
TRACE("type %d ret %p\n", node_type, ret);
return ret;
}
@ -370,9 +889,9 @@ static HTMLDOMNode *create_node(HTMLDocument *doc, nsIDOMNode *nsnode)
* (better) find a way to store HTMLDOMelement pointer in nsIDOMNode.
*/
HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode)
HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode, BOOL create)
{
HTMLDOMNode *iter = This->nodes, *ret;
HTMLDOMNode *iter = This->nodes;
while(iter) {
if(iter->nsnode == nsnode)
@ -380,15 +899,33 @@ HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode)
iter = iter->next;
}
if(iter)
if(iter || !create)
return iter;
ret = create_node(This, nsnode);
return create_node(This, nsnode);
}
ret->next = This->nodes;
This->nodes = ret;
/*
* FIXME
* We should use better way for getting node object (like private interface)
* or avoid it at all.
*/
static HTMLDOMNode *get_node_obj(HTMLDocument *This, IUnknown *iface)
{
HTMLDOMNode *iter = This->nodes;
IHTMLDOMNode *node;
return ret;
IUnknown_QueryInterface(iface, &IID_IHTMLDOMNode, (void**)&node);
IHTMLDOMNode_Release(node);
while(iter) {
if(HTMLDOMNODE(iter) == node)
return iter;
iter = iter->next;
}
FIXME("Not found %p\n", iface);
return NULL;
}
void release_nodes(HTMLDocument *This)

View file

@ -331,16 +331,32 @@ static const NodeImplVtbl HTMLOptionElementImplVtbl = {
HTMLOptionElement_destructor
};
static const tid_t HTMLOptionElement_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLOptionElement_tid,
0
};
static dispex_static_data_t HTMLOptionElement_dispex = {
NULL,
DispHTMLOptionElement_tid,
NULL,
HTMLOptionElement_iface_tids
};
HTMLElement *HTMLOptionElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLOptionElement *ret = heap_alloc(sizeof(HTMLOptionElement));
HTMLOptionElement *ret = heap_alloc_zero(sizeof(HTMLOptionElement));
nsresult nsres;
HTMLElement_Init(&ret->element);
ret->lpHTMLOptionElementVtbl = &HTMLOptionElementVtbl;
ret->element.node.vtbl = &HTMLOptionElementImplVtbl;
HTMLElement_Init(&ret->element);
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLOPTION(ret), &HTMLOptionElement_dispex);
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLOptionElement, (void**)&ret->nsoption);
if(NS_FAILED(nsres))
ERR("Could not get nsIDOMHTMLOptionElement interface: %08x\n", nsres);
@ -469,7 +485,7 @@ static HRESULT WINAPI HTMLOptionElementFactory_create(IHTMLOptionElementFactory
return E_FAIL;
}
hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(get_node(This->doc, (nsIDOMNode*)nselem)),
hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(get_node(This->doc, (nsIDOMNode*)nselem, TRUE)),
&IID_IHTMLOptionElement, (void**)optelem);
nsIDOMElement_Release(nselem);

View file

@ -288,7 +288,7 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = {
HTMLElement *HTMLScriptElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLScriptElement *ret = heap_alloc(sizeof(HTMLScriptElement));
HTMLScriptElement *ret = heap_alloc_zero(sizeof(HTMLScriptElement));
nsresult nsres;
HTMLElement_Init(&ret->element);

View file

@ -68,16 +68,16 @@ static ULONG WINAPI HTMLSelectElement_Release(IHTMLSelectElement *iface)
static HRESULT WINAPI HTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement *iface, UINT *pctinfo)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->element.node.dispex), pctinfo);
}
static HRESULT WINAPI HTMLSelectElement_GetTypeInfo(IHTMLSelectElement *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->element.node.dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement *iface, REFIID riid,
@ -85,9 +85,8 @@ static HRESULT WINAPI HTMLSelectElement_GetIDsOfNames(IHTMLSelectElement *iface,
LCID lcid, DISPID *rgDispId)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLSelectElement_Invoke(IHTMLSelectElement *iface, DISPID dispIdMember,
@ -95,9 +94,9 @@ static HRESULT WINAPI HTMLSelectElement_Invoke(IHTMLSelectElement *iface, DISPID
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
return IDispatchEx_Invoke(DISPATCHEX(&This->element.node.dispex), dispIdMember, riid, lcid,
wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLSelectElement_put_size(IHTMLSelectElement *iface, long v)
@ -177,8 +176,10 @@ static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, I
static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
TRACE("(%p)->()\n", This);
return set_node_event(&This->element.node, EVENTID_CHANGE, &v);
}
static HRESULT WINAPI HTMLSelectElement_get_onchange(IHTMLSelectElement *iface, VARIANT *p)
@ -221,15 +222,43 @@ static HRESULT WINAPI HTMLSelectElement_get_selectedIndex(IHTMLSelectElement *if
static HRESULT WINAPI HTMLSelectElement_get_type(IHTMLSelectElement *iface, BSTR *p)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
const PRUnichar *type;
nsAString type_str;
nsresult nsres;
HRESULT hres = S_OK;
TRACE("(%p)->(%p)\n", This, p);
nsAString_Init(&type_str, NULL);
nsres = nsIDOMHTMLSelectElement_GetType(This->nsselect, &type_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&type_str, &type);
*p = *type ? SysAllocString(type) : NULL;
}else {
ERR("GetType failed: %08x\n", nsres);
hres = E_FAIL;
}
nsAString_Finish(&type_str);
return hres;
}
static HRESULT WINAPI HTMLSelectElement_put_value(IHTMLSelectElement *iface, BSTR v)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
nsAString value_str;
nsresult nsres;
TRACE("(%p)->(%s)\n", This, debugstr_w(v));
nsAString_Init(&value_str, v);
nsres = nsIDOMHTMLSelectElement_SetValue(This->nsselect, &value_str);
nsAString_Finish(&value_str);
if(NS_FAILED(nsres))
ERR("SetValue failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLSelectElement_get_value(IHTMLSelectElement *iface, BSTR *p)
@ -246,7 +275,7 @@ static HRESULT WINAPI HTMLSelectElement_get_value(IHTMLSelectElement *iface, BST
nsres = nsIDOMHTMLSelectElement_GetValue(This->nsselect, &value_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&value_str, &value);
*p = SysAllocString(value);
*p = *value ? SysAllocString(value) : NULL;
}else {
ERR("GetValue failed: %08x\n", nsres);
}
@ -420,16 +449,33 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = {
HTMLSelectElement_destructor
};
static const tid_t HTMLSelectElement_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLSelectElement_tid,
0
};
static dispex_static_data_t HTMLSelectElement_dispex = {
NULL,
DispHTMLSelectElement_tid,
NULL,
HTMLSelectElement_tids
};
HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLSelectElement *ret = heap_alloc(sizeof(HTMLSelectElement));
HTMLSelectElement *ret = heap_alloc_zero(sizeof(HTMLSelectElement));
nsresult nsres;
HTMLElement_Init(&ret->element);
ret->lpHTMLSelectElementVtbl = &HTMLSelectElementVtbl;
ret->element.node.vtbl = &HTMLSelectElementImplVtbl;
init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLSELECT(ret), &HTMLSelectElement_dispex);
HTMLElement_Init(&ret->element);
nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLSelectElement,
(void**)&ret->nsselect);
if(NS_FAILED(nsres))

View file

@ -33,6 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct {
DispatchEx dispex;
const IHTMLStyleVtbl *lpHTMLStyleVtbl;
LONG ref;
@ -40,10 +41,14 @@ typedef struct {
nsIDOMCSSStyleDeclaration *nsstyle;
} HTMLStyle;
#define HTMLSTYLE(x) ((IHTMLStyle*) &(x)->lpHTMLStyleVtbl);
#define HTMLSTYLE(x) ((IHTMLStyle*) &(x)->lpHTMLStyleVtbl)
static const WCHAR attrBackground[] =
{'b','a','c','k','g','r','o','u','n','d',0};
static const WCHAR attrBackgroundColor[] =
{'b','a','c','k','g','r','o','u','n','d','-','c','o','l','o','r',0};
static const WCHAR attrBackgroundImage[] =
{'b','a','c','k','g','r','o','u','n','d','-','i','m','a','g','e',0};
static const WCHAR attrBorderLeft[] =
{'b','o','r','d','e','r','-','l','e','f','t',0};
static const WCHAR attrColor[] =
@ -68,6 +73,8 @@ static const WCHAR attrTextDecoration[] =
{'t','e','x','t','-','d','e','c','o','r','a','t','i','o','n',0};
static const WCHAR attrVisibility[] =
{'v','i','s','i','b','i','l','i','t','y',0};
static const WCHAR attrWidth[] =
{'w','i','d','t','h',0};
static const WCHAR valLineThrough[] =
{'l','i','n','e','-','t','h','r','o','u','g','h',0};
@ -113,7 +120,27 @@ static LPWSTR fix_px_value(LPCWSTR val)
return NULL;
}
static LPWSTR fix_url_value(LPCWSTR val)
{
WCHAR *ret, *ptr;
static const WCHAR urlW[] = {'u','r','l','('};
if(strncmpW(val, urlW, sizeof(urlW)/sizeof(WCHAR)) || !strchrW(val, '\\'))
return NULL;
ret = heap_strdupW(val);
for(ptr = ret; *ptr; ptr++) {
if(*ptr == '\\')
*ptr = '/';
}
return ret;
}
#define ATTR_FIX_PX 1
#define ATTR_FIX_URL 2
static HRESULT set_style_attr(HTMLStyle *This, LPCWSTR name, LPCWSTR value, DWORD flags)
{
@ -127,6 +154,8 @@ static HRESULT set_style_attr(HTMLStyle *This, LPCWSTR name, LPCWSTR value, DWOR
if(flags & ATTR_FIX_PX)
val = fix_px_value(value);
if(flags & ATTR_FIX_URL)
val = fix_url_value(value);
nsAString_Init(&str_name, name);
nsAString_Init(&str_value, val ? val : value);
@ -208,12 +237,11 @@ static HRESULT WINAPI HTMLStyle_QueryInterface(IHTMLStyle *iface, REFIID riid, v
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = HTMLSTYLE(This);
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = HTMLSTYLE(This);
}else if(IsEqualGUID(&IID_IHTMLStyle, riid)) {
TRACE("(%p)->(IID_IHTMLStyle %p)\n", This, ppv);
*ppv = HTMLSTYLE(This);
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@ -390,7 +418,18 @@ static HRESULT WINAPI HTMLStyle_get_font(IHTMLStyle *iface, BSTR *p)
static HRESULT WINAPI HTMLStyle_put_color(IHTMLStyle *iface, VARIANT v)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
FIXME("(%p)->(v%d)\n", This, V_VT(&v));
TRACE("(%p)->(v%d)\n", This, V_VT(&v));
switch(V_VT(&v)) {
case VT_BSTR:
TRACE("%s\n", debugstr_w(V_BSTR(&v)));
return set_style_attr(This, attrColor, V_BSTR(&v), 0);
default:
FIXME("unsupported vt=%d\n", V_VT(&v));
}
return E_NOTIMPL;
}
@ -407,8 +446,10 @@ static HRESULT WINAPI HTMLStyle_get_color(IHTMLStyle *iface, VARIANT *p)
static HRESULT WINAPI HTMLStyle_put_background(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, attrBackground, v, 0);
}
static HRESULT WINAPI HTMLStyle_get_background(IHTMLStyle *iface, BSTR *p)
@ -451,8 +492,10 @@ static HRESULT WINAPI HTMLStyle_get_backgroundColor(IHTMLStyle *iface, VARIANT *
static HRESULT WINAPI HTMLStyle_put_backgroundImage(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, attrBackgroundImage, v, ATTR_FIX_URL);
}
static HRESULT WINAPI HTMLStyle_get_backgroundImage(IHTMLStyle *iface, BSTR *p)
@ -1196,15 +1239,28 @@ static HRESULT WINAPI HTMLStyle_get_borderLeftStyle(IHTMLStyle *iface, BSTR *p)
static HRESULT WINAPI HTMLStyle_put_width(IHTMLStyle *iface, VARIANT v)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
FIXME("(%p)->(v%d)\n", This, V_VT(&v));
TRACE("(%p)->(v%d)\n", This, V_VT(&v));
switch(V_VT(&v)) {
case VT_BSTR:
TRACE("%s\n", debugstr_w(V_BSTR(&v)));
return set_style_attr(This, attrWidth, V_BSTR(&v), 0);
default:
FIXME("unsupported vt %d\n", V_VT(&v));
}
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLStyle_get_width(IHTMLStyle *iface, VARIANT *p)
{
HTMLStyle *This = HTMLSTYLE_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
TRACE("(%p)->(%p)\n", This, p);
V_VT(p) = VT_BSTR;
return get_style_attr(This, attrWidth, &V_BSTR(p));
}
static HRESULT WINAPI HTMLStyle_put_height(IHTMLStyle *iface, VARIANT v)
@ -1837,6 +1893,17 @@ static const IHTMLStyleVtbl HTMLStyleVtbl = {
HTMLStyle_toString
};
static const tid_t HTMLStyle_iface_tids[] = {
IHTMLStyle_tid,
0
};
static dispex_static_data_t HTMLStyle_dispex = {
NULL,
DispHTMLStyle_tid,
NULL,
HTMLStyle_iface_tids
};
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle)
{
HTMLStyle *ret = heap_alloc(sizeof(HTMLStyle));
@ -1847,5 +1914,7 @@ IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration *nsstyle)
nsIDOMCSSStyleDeclaration_AddRef(nsstyle);
init_dispex(&ret->dispex, (IUnknown*)HTMLSTYLE(ret), &HTMLStyle_dispex);
return HTMLSTYLE(ret);
}

View file

@ -546,7 +546,7 @@ static const NodeImplVtbl HTMLTableImplVtbl = {
HTMLElement *HTMLTable_Create(nsIDOMHTMLElement *nselem)
{
HTMLTable *ret = heap_alloc(sizeof(HTMLTable));
HTMLTable *ret = heap_alloc_zero(sizeof(HTMLTable));
HTMLElement_Init(&ret->element);

View file

@ -402,7 +402,7 @@ static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
HTMLElement *HTMLTextAreaElement_Create(nsIDOMHTMLElement *nselem)
{
HTMLTextAreaElement *ret = heap_alloc(sizeof(HTMLTextAreaElement));
HTMLTextAreaElement *ret = heap_alloc_zero(sizeof(HTMLTextAreaElement));
nsresult nsres;
HTMLElement_Init(&ret->element);

View file

@ -0,0 +1,213 @@
/*
* Copyright 2008 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 <stdarg.h>
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
#include "winuser.h"
#include "ole2.h"
#include "mshtml_private.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct {
HTMLDOMNode node;
const IHTMLDOMTextNodeVtbl *lpIHTMLDOMTextNodeVtbl;
} HTMLDOMTextNode;
#define HTMLTEXT(x) ((IHTMLDOMTextNode*) &(x)->lpIHTMLDOMTextNodeVtbl)
#define HTMLTEXT_THIS(iface) DEFINE_THIS(HTMLDOMTextNode, IHTMLDOMTextNode, iface)
#define HTMLTEXT_NODE_THIS(iface) DEFINE_THIS2(HTMLDOMTextNode, node, iface)
static HRESULT WINAPI HTMLDOMTextNode_QueryInterface(IHTMLDOMTextNode *iface,
REFIID riid, void **ppv)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->node), riid, ppv);
}
static ULONG WINAPI HTMLDOMTextNode_AddRef(IHTMLDOMTextNode *iface)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->node));
}
static ULONG WINAPI HTMLDOMTextNode_Release(IHTMLDOMTextNode *iface)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
return IHTMLDOMNode_Release(HTMLDOMNODE(&This->node));
}
static HRESULT WINAPI HTMLDOMTextNode_GetTypeInfoCount(IHTMLDOMTextNode *iface, UINT *pctinfo)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%p)\n", This, pctinfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_GetTypeInfo(IHTMLDOMTextNode *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_GetIDsOfNames(IHTMLDOMTextNode *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_Invoke(IHTMLDOMTextNode *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_put_data(IHTMLDOMTextNode *iface, BSTR v)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%s)\n", This, debugstr_w(v));
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_get_data(IHTMLDOMTextNode *iface, BSTR *p)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_toString(IHTMLDOMTextNode *iface, BSTR *String)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%p)\n", This, String);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_get_length(IHTMLDOMTextNode *iface, long *p)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLDOMTextNode_splitText(IHTMLDOMTextNode *iface, long offset, IHTMLDOMNode **pRetNode)
{
HTMLDOMTextNode *This = HTMLTEXT_THIS(iface);
FIXME("(%p)->(%ld %p)\n", This, offset, pRetNode);
return E_NOTIMPL;
}
#undef HTMLTEXT_THIS
static const IHTMLDOMTextNodeVtbl HTMLDOMTextNodeVtbl = {
HTMLDOMTextNode_QueryInterface,
HTMLDOMTextNode_AddRef,
HTMLDOMTextNode_Release,
HTMLDOMTextNode_GetTypeInfoCount,
HTMLDOMTextNode_GetTypeInfo,
HTMLDOMTextNode_GetIDsOfNames,
HTMLDOMTextNode_Invoke,
HTMLDOMTextNode_put_data,
HTMLDOMTextNode_get_data,
HTMLDOMTextNode_toString,
HTMLDOMTextNode_get_length,
HTMLDOMTextNode_splitText
};
#define HTMLTEXT_NODE_THIS(iface) DEFINE_THIS2(HTMLDOMTextNode, node, iface)
HRESULT HTMLDOMTextNode_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
{
HTMLDOMTextNode *This = HTMLTEXT_NODE_THIS(iface);
*ppv = NULL;
if(IsEqualGUID(&IID_IHTMLDOMTextNode, riid)) {
TRACE("(%p)->(IID_IHTMLDOMTextNode %p)\n", This, ppv);
*ppv = HTMLTEXT(This);
}else {
return HTMLDOMNode_QI(&This->node, riid, ppv);
}
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
void HTMLDOMTextNode_destructor(HTMLDOMNode *iface)
{
HTMLDOMTextNode *This = HTMLTEXT_NODE_THIS(iface);
HTMLDOMNode_destructor(&This->node);
}
#undef HTMLTEXT_NODE_THIS
static const NodeImplVtbl HTMLDOMTextNodeImplVtbl = {
HTMLDOMTextNode_QI,
HTMLDOMTextNode_destructor
};
static const tid_t HTMLDOMTextNode_iface_tids[] = {
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLDOMTextNode_tid,
0
};
static dispex_static_data_t HTMLDOMTextNode_dispex = {
NULL,
DispHTMLDOMTextNode_tid,
0,
HTMLDOMTextNode_iface_tids
};
HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocument *doc, nsIDOMNode *nsnode)
{
HTMLDOMTextNode *ret ;
ret = heap_alloc_zero(sizeof(*ret));
ret->node.vtbl = &HTMLDOMTextNodeImplVtbl;
ret->lpIHTMLDOMTextNodeVtbl = &HTMLDOMTextNodeVtbl;
init_dispex(&ret->node.dispex, (IUnknown*)HTMLTEXT(ret), &HTMLDOMTextNode_dispex);
HTMLDOMNode_Init(doc, &ret->node, nsnode);
return &ret->node;
}

View file

@ -33,10 +33,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
static struct list window_list = LIST_INIT(window_list);
#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
@ -49,12 +49,20 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = HTMLWINDOW2(This);
}else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
*ppv = DISPATCHEX(This);
}else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
*ppv = HTMLWINDOW2(This);
}else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
*ppv = HTMLWINDOW2(This);
}else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
*ppv = HTMLWINDOW3(This);
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@ -95,25 +103,15 @@ static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pc
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
TRACE("(%p)->(%p)\n", This, pctinfo);
*pctinfo = 1;
return S_OK;
return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
}
static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
HRESULT hres;
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
hres = get_typeinfo(IHTMLWindow2_tid, ppTInfo);
if(SUCCEEDED(hres))
ITypeInfo_AddRef(*ppTInfo);
return hres;
return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid,
@ -121,17 +119,8 @@ static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid
LCID lcid, DISPID *rgDispId)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
ITypeInfo *typeinfo;
HRESULT hres;
TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
hres = get_typeinfo(IHTMLWindow2_tid, &typeinfo);
if(SUCCEEDED(hres))
hres = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
return hres;
return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember,
@ -139,18 +128,9 @@ static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMembe
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
ITypeInfo *typeinfo;
HRESULT hres;
TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
hres = get_typeinfo(IHTMLWindow2_tid, &typeinfo);
if(SUCCEEDED(hres))
hres = ITypeInfo_Invoke(typeinfo, HTMLWINDOW2(This), dispIdMember, wFlags, pDispParams,
pVarResult, pExcepInfo, puArgErr);
return hres;
return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
@ -206,15 +186,23 @@ static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expressio
long msec, VARIANT *language, long *timerID)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
return E_NOTIMPL;
VARIANT expr_var;
TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
V_VT(&expr_var) = VT_BSTR;
V_BSTR(&expr_var) = expression;
return IHTMLWindow3_setTimeout(HTMLWINDOW3(This), &expr_var, msec, language, timerID);
}
static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, long timerID)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%ld)\n", This, timerID);
return E_NOTIMPL;
TRACE("(%p)->(%ld)\n", This, timerID);
return clear_task_timer(This->doc, FALSE, timerID);
}
static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
@ -335,8 +323,13 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
TRACE("(%p)->(%p)\n", This, p);
/* FIXME: We should return kind of proxy window here. */
IHTMLWindow2_AddRef(HTMLWINDOW2(This));
*p = HTMLWINDOW2(This);
return S_OK;
}
static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
@ -349,8 +342,13 @@ static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
TRACE("(%p)->(%p)\n", This, p);
/* FIXME: We should return kind of proxy window here. */
IHTMLWindow2_AddRef(HTMLWINDOW2(This));
*p = HTMLWINDOW2(This);
return S_OK;
}
static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
@ -489,8 +487,18 @@ static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
TRACE("(%p)->(%p)\n", This, p);
if(This->doc) {
/* FIXME: We should return a wrapper object here */
*p = HTMLDOC(This->doc);
IHTMLDocument2_AddRef(*p);
}else {
*p = NULL;
}
return S_OK;
}
static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
@ -584,15 +592,22 @@ static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expressi
long msec, VARIANT *language, long *timerID)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
return E_NOTIMPL;
VARIANT expr;
TRACE("(%p)->(%s %ld %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
V_VT(&expr) = VT_BSTR;
V_BSTR(&expr) = expression;
return IHTMLWindow3_setInterval(HTMLWINDOW3(This), &expr, msec, language, timerID);
}
static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, long timerID)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%ld)\n", This, timerID);
return E_NOTIMPL;
TRACE("(%p)->(%ld)\n", This, timerID);
return clear_task_timer(This->doc, TRUE, timerID);
}
static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
@ -627,15 +642,29 @@ static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, long x, long y)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%ld %ld)\n", This, x, y);
return E_NOTIMPL;
nsresult nsres;
TRACE("(%p)->(%ld %ld)\n", This, x, y);
nsres = nsIDOMWindow_ScrollBy(This->nswindow, x, y);
if(NS_FAILED(nsres))
ERR("ScrollBy failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, long x, long y)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
FIXME("(%p)->(%ld %ld)\n", This, x, y);
return E_NOTIMPL;
nsresult nsres;
TRACE("(%p)->(%ld %ld)\n", This, x, y);
nsres = nsIDOMWindow_ScrollTo(This->nswindow, x, y);
if(NS_FAILED(nsres))
ERR("ScrollTo failed: %08x\n", nsres);
return S_OK;
}
static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, long x, long y)
@ -762,6 +791,392 @@ static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
HTMLWindow2_get_external
};
#define HTMLWINDOW3_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow3, iface)
static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID riid, void **ppv)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
}
static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
}
static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IHTMLWindow2_Release(HTMLWINDOW2(This));
}
static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
}
static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, long *p)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_get_screenTop(IHTMLWindow3 *iface, long *p)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp, VARIANT_BOOL *pfResult)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, long msec, VARIANT *language,
BOOL interval, long *timer_id)
{
IDispatch *disp = NULL;
switch(V_VT(expr)) {
case VT_DISPATCH:
disp = V_DISPATCH(expr);
IDispatch_AddRef(disp);
break;
case VT_BSTR:
disp = script_parse_event(This->doc, V_BSTR(expr));
break;
default:
FIXME("unimplemented vt=%d\n", V_VT(expr));
return E_NOTIMPL;
}
if(!disp)
return E_FAIL;
*timer_id = set_task_timer(This->doc, msec, interval, disp);
IDispatch_Release(disp);
return S_OK;
}
static HRESULT WINAPI HTMLWindow3_setTimeout(IHTMLWindow3 *iface, VARIANT *expression, long msec,
VARIANT *language, long *timerID)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
TRACE("(%p)->(%p(%d) %ld %p %p)\n", This, expression, V_VT(expression), msec, language, timerID);
return window_set_timer(This, expression, msec, language, FALSE, timerID);
}
static HRESULT WINAPI HTMLWindow3_setInterval(IHTMLWindow3 *iface, VARIANT *expression, long msec,
VARIANT *language, long *timerID)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
TRACE("(%p)->(%p %ld %p %p)\n", This, expression, msec, language, timerID);
return window_set_timer(This, expression, msec, language, TRUE, timerID);
}
static HRESULT WINAPI HTMLWindow3_print(IHTMLWindow3 *iface)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_put_onbeforeprint(IHTMLWindow3 *iface, VARIANT v)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_get_onbeforeprint(IHTMLWindow3 *iface, VARIANT *p)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_put_onafterprint(IHTMLWindow3 *iface, VARIANT v)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->()\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_get_onafterprint(IHTMLWindow3 *iface, VARIANT *p)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_get_clipboardData(IHTMLWindow3 *iface, IHTMLDataTransfer **p)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%p)\n", This, p);
return E_NOTIMPL;
}
static HRESULT WINAPI HTMLWindow3_showModelessDialog(IHTMLWindow3 *iface, BSTR url,
VARIANT *varArgIn, VARIANT *options, IHTMLWindow2 **pDialog)
{
HTMLWindow *This = HTMLWINDOW3_THIS(iface);
FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(url), varArgIn, options, pDialog);
return E_NOTIMPL;
}
#undef HTMLWINDOW3_THIS
static const IHTMLWindow3Vtbl HTMLWindow3Vtbl = {
HTMLWindow3_QueryInterface,
HTMLWindow3_AddRef,
HTMLWindow3_Release,
HTMLWindow3_GetTypeInfoCount,
HTMLWindow3_GetTypeInfo,
HTMLWindow3_GetIDsOfNames,
HTMLWindow3_Invoke,
HTMLWindow3_get_screenLeft,
HTMLWindow3_get_screenTop,
HTMLWindow3_attachEvent,
HTMLWindow3_detachEvent,
HTMLWindow3_setTimeout,
HTMLWindow3_setInterval,
HTMLWindow3_print,
HTMLWindow3_put_onbeforeprint,
HTMLWindow3_get_onbeforeprint,
HTMLWindow3_put_onafterprint,
HTMLWindow3_get_onafterprint,
HTMLWindow3_get_clipboardData,
HTMLWindow3_showModelessDialog
};
#define DISPEX_THIS(iface) DEFINE_THIS(HTMLWindow, IDispatchEx, iface)
static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
{
HTMLWindow *This = DISPEX_THIS(iface);
return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
}
static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
{
HTMLWindow *This = DISPEX_THIS(iface);
return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
}
static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
{
HTMLWindow *This = DISPEX_THIS(iface);
return IHTMLWindow2_Release(HTMLWINDOW2(This));
}
static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%p)\n", This, pctinfo);
return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
}
static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
LPOLESTR *rgszNames, UINT cNames,
LCID lcid, DISPID *rgDispId)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
/* FIXME: Use script dispatch */
return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
/* FIXME: Use script dispatch */
return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
return IDispatchEx_GetDispID(DISPATCHEX(&This->dispex), bstrName, grfdex, pid);
}
static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
return IDispatchEx_InvokeEx(DISPATCHEX(&This->dispex), id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
}
static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex);
return IDispatchEx_DeleteMemberByName(DISPATCHEX(&This->dispex), bstrName, grfdex);
}
static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%x)\n", This, id);
return IDispatchEx_DeleteMemberByDispID(DISPATCHEX(&This->dispex), id);
}
static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex);
return IDispatchEx_GetMemberProperties(DISPATCHEX(&This->dispex), id, grfdexFetch, pgrfdex);
}
static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%x %p)\n", This, id, pbstrName);
return IDispatchEx_GetMemberName(DISPATCHEX(&This->dispex), id, pbstrName);
}
static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%x %x %p)\n", This, grfdex, id, pid);
return IDispatchEx_GetNextDispID(DISPATCHEX(&This->dispex), grfdex, id, pid);
}
static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
{
HTMLWindow *This = DISPEX_THIS(iface);
TRACE("(%p)->(%p)\n", This, ppunk);
*ppunk = NULL;
return S_OK;
}
#undef DISPEX_THIS
static const IDispatchExVtbl WindowDispExVtbl = {
WindowDispEx_QueryInterface,
WindowDispEx_AddRef,
WindowDispEx_Release,
WindowDispEx_GetTypeInfoCount,
WindowDispEx_GetTypeInfo,
WindowDispEx_GetIDsOfNames,
WindowDispEx_Invoke,
WindowDispEx_GetDispID,
WindowDispEx_InvokeEx,
WindowDispEx_DeleteMemberByName,
WindowDispEx_DeleteMemberByDispID,
WindowDispEx_GetMemberProperties,
WindowDispEx_GetMemberName,
WindowDispEx_GetNextDispID,
WindowDispEx_GetNameSpaceParent
};
static const tid_t HTMLWindow_iface_tids[] = {
IHTMLWindow2_tid,
IHTMLWindow3_tid,
0
};
static dispex_static_data_t HTMLWindow_dispex = {
NULL,
DispHTMLWindow2_tid,
NULL,
HTMLWindow_iface_tids
};
static const char wineConfig_func[] =
"window.__defineGetter__(\"external\",function() {\n"
" return window.__wineWindow__.external;\n"
@ -869,10 +1284,13 @@ HTMLWindow *HTMLWindow_Create(HTMLDocument *doc)
HTMLWindow *ret = heap_alloc(sizeof(HTMLWindow));
ret->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl;
ret->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl;
ret->lpIDispatchExVtbl = &WindowDispExVtbl;
ret->ref = 1;
ret->nswindow = NULL;
ret->doc = doc;
init_dispex(&ret->dispex, (IUnknown*)HTMLWINDOW2(ret), &HTMLWindow_dispex);
if(doc->nscontainer) {
nsresult nsres;

View file

@ -93,7 +93,7 @@ static void set_registry(LPCSTR install_dir)
WCHAR mshtml_key[100];
LPWSTR gecko_path;
HKEY hkey;
DWORD res, len, size;
DWORD res, len;
static const WCHAR wszGeckoPath[] = {'G','e','c','k','o','P','a','t','h',0};
static const WCHAR wszWineGecko[] = {'w','i','n','e','_','g','e','c','k','o',0};
@ -120,7 +120,6 @@ static void set_registry(LPCSTR install_dir)
memcpy(gecko_path+len, wszWineGecko, sizeof(wszWineGecko));
size = len*sizeof(WCHAR)+sizeof(wszWineGecko);
res = RegSetValueExW(hkey, wszGeckoPath, 0, REG_SZ, (LPVOID)gecko_path,
len*sizeof(WCHAR)+sizeof(wszWineGecko));
heap_free(gecko_path);
@ -203,7 +202,7 @@ static BOOL install_from_unix_file(const char *file_name)
}
dos_file_name = wine_get_dos_file_name(file_name);
if(!file_name) {
if(!dos_file_name) {
ERR("Could not get dos file name of %s\n", debugstr_a(file_name));
return FALSE;
}

View file

@ -49,47 +49,6 @@ DWORD mshtml_tls = 0;
static HINSTANCE shdoclc = NULL;
static ITypeLib *typelib;
static ITypeInfo *typeinfos[LAST_tid];
static REFIID tid_ids[] = {
&IID_IHTMLWindow2
};
HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo)
{
HRESULT hres;
if(!typelib) {
ITypeLib *tl;
hres = LoadRegTypeLib(&LIBID_MSHTML, 4, 0, LOCALE_SYSTEM_DEFAULT, &tl);
if(FAILED(hres)) {
ERR("LoadRegTypeLib failed: %08x\n", hres);
return hres;
}
if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
ITypeLib_Release(tl);
}
if(!typeinfos[tid]) {
ITypeInfo *typeinfo;
hres = ITypeLib_GetTypeInfoOfGuid(typelib, tid_ids[tid], &typeinfo);
if(FAILED(hres)) {
ERR("GetTypeInfoOfGuid failed: %08x\n", hres);
return hres;
}
if(InterlockedCompareExchangePointer((void**)(typeinfos+tid), typeinfo, NULL))
ITypeInfo_Release(typeinfo);
}
*typeinfo = typeinfos[tid];
return S_OK;
}
static void thread_detach(void)
{
thread_data_t *thread_data;
@ -107,16 +66,7 @@ static void thread_detach(void)
static void process_detach(void)
{
close_gecko();
if(typelib) {
unsigned i;
for(i=0; i < sizeof(typeinfos)/sizeof(*typeinfos); i++)
if(typeinfos[i])
ITypeInfo_Release(typeinfos[i]);
ITypeLib_Release(typelib);
}
release_typelib();
if(shdoclc)
FreeLibrary(shdoclc);

View file

@ -290,7 +290,7 @@ HKCR,"MIME\Database\Content Type\image/gif","CLSID",,"%CLSID_HTMLDocument%"
HKCR,"MIME\Database\Content Type\image/gif","Extension",,".gif"
HKCR,"MIME\Database\Content Type\image/gif","Image Filter CLSID",,"%CLSID_IImageDecodeFilter%"
HKCR,"MIME\Database\Content Type\image/gif\Bits","0",1,04,00,00,00,FF,FF,FF,FF,47,49,46,38
HKCR,".gif",,,"giffile"
HKCR,".gif",,2,"giffile"
HKCR,".gif","Content Type",,"image/gif"
HKCR,"giffile",,,"GIF Image"
HKCR,"giffile\CLSID",,,"%CLSID_HTMLDocument%"
@ -329,7 +329,7 @@ HKCR,"MIME\Database\Content Type\image/x-icon","Image Filter CLSID",,"%CLSID_IIm
HKCR,".ico","Content Type",,"image/x-icon"
;; JPE
HKCR,".jpe",,,"jpegfile"
HKCR,".jpe",,2,"jpegfile"
HKCR,".jpe","Content Type",,"image/jpeg"
HKCR,"jpegfile",,,"JPEG Image"
HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%"
@ -344,7 +344,7 @@ HKCR,"MIME\Database\Content Type\image/jpeg","CLSID",,"%CLSID_HTMLDocument%"
HKCR,"MIME\Database\Content Type\image/jpeg","Extension",,".jpg"
HKCR,"MIME\Database\Content Type\image/jpeg\Bits","0",1,02,00,00,00,FF,FF,FF,D8
HKCR,"MIME\Database\Content Type\image/jpeg","Image Filter CLSID",,"%CLSID_IImageDecodeFilter%"
HKCR,".jpeg",,,"jpegfile"
HKCR,".jpeg",,2,"jpegfile"
HKCR,".jpeg","Content Type",,"image/jpeg"
HKCR,"jpegfile",,,"JPEG Image"
HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%"
@ -355,7 +355,7 @@ HKCR,"jpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL"
;; HKCR,"jpegfile\DefaultIcon",,,"%IEXPLORE%,8"
;; JPG
HKCR,".jpg",,,"jpegfile"
HKCR,".jpg",,2,"jpegfile"
HKCR,".jpg","Content Type",,"image/jpeg"
HKCR,"jpegfile",,,"JPEG Image"
HKCR,"jpegfile\CLSID",,,"%CLSID_HTMLDocument%"
@ -367,9 +367,9 @@ HKCR,"jpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL"
;; MHTML
HKCR,"MIME\Database\Content Type\message/rfc822","CLSID",,"%CLSID_MHTMLDocument%"
HKCR,".mhtml",,,"mhtmlfile"
HKCR,".mhtml",,2,"mhtmlfile"
HKCR,".mhtml","Content Type",,"message/rfc822"
HKCR,".mht",,,"mhtmlfile"
HKCR,".mht",,2,"mhtmlfile"
HKCR,".mht","Content Type",,"message/rfc822"
HKCR,"mhtmlfile",,,"MHTML Document"
HKCR,"mhtmlfile\BrowseInPlace",,,""
@ -380,7 +380,7 @@ HKCR,"MIME\Database\Content Type\image/pjpeg","CLSID",,"%CLSID_HTMLDocument%"
HKCR,"MIME\Database\Content Type\image/pjpeg","Extension",,".jpg"
HKCR,"MIME\Database\Content Type\image/pjpeg\Bits","0",1,02,00,00,00,FF,FF,FF,D8
HKCR,"MIME\Database\Content Type\image/pjpeg","Image Filter CLSID",,"%CLSID_IImageDecodeFilter%"
HKCR,".jfif",,,"pjpegfile"
HKCR,".jfif",,2,"pjpegfile"
HKCR,".jfif","Content Type",,"image/jpeg"
HKCR,"pjpegfile",,,"JPEG Image"
HKCR,"pjpegfile\CLSID",,,"%CLSID_HTMLDocument%"
@ -393,7 +393,7 @@ HKCR,"pjpegfile\shell\open\ddeexec\Topic",,,"WWW_OpenURL"
;; PNG
HKCR,"MIME\Database\Content Type\image/png","Extension",,".png"
HKCR,"MIME\Database\Content Type\image/x-png","Extension",,".png"
HKCR,".png",,,"pngfile"
HKCR,".png",,2,"pngfile"
HKCR,".png","Content Type",,"image/png"
HKCR,"pngfile",,,"PNG Image"
HKCR,"pngfile\CLSID",,,"%CLSID_HTMLDocument%"

View file

@ -2,7 +2,7 @@
<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
<group>
<module name="mshtml" type="win32dll" baseaddress="${BASEADDRESS_MSHTML}" installbase="system32" installname="mshtml.dll" allowwarnings="true">
<!--autoregister infsection="OleControlDlls" type="Both" /-->
<autoregister infsection="OleControlDlls" type="Both" />
<importlibrary definition="mshtml.spec.def" />
<include base="mshtml">.</include>
<include base="ReactOS">include/reactos/wine</include>
@ -10,15 +10,20 @@
<define name="WINVER">0x600</define>
<define name="_WIN32_WINNT">0x600</define>
<file>conpoint.c</file>
<file>dispex.c</file>
<file>editor.c</file>
<file>hlink.c</file>
<file>htmlanchor.c</file>
<file>htmlbody.c</file>
<file>htmlcomment.c</file>
<file>htmldoc.c</file>
<file>htmldoc3.c</file>
<file>htmldoc5.c</file>
<file>htmlelem.c</file>
<file>htmlelem2.c</file>
<file>htmlevent.c</file>
<file>htmlgeneric.c</file>
<file>htmlimg.c</file>
<file>htmlinput.c</file>
<file>htmllocation.c</file>
<file>htmlnode.c</file>
@ -28,8 +33,9 @@
<file>htmlstyle.c</file>
<file>htmlstylesheet.c</file>
<file>htmltable.c</file>
<file>htmltextcont.c</file>
<file>htmltextarea.c</file>
<file>htmltextcont.c</file>
<file>htmltextnode.c</file>
<file>htmlwindow.c</file>
<file>install.c</file>
<file>loadopts.c</file>
@ -52,10 +58,11 @@
<file>txtrange.c</file>
<file>view.c</file>
<file>rsrc.rc</file>
<file>nsiface.idl</file>
<include base="mshtml" root="intermediate">.</include>
<file>mshtml.spec</file>
<library>wine</library>
<library>strmiids</library>
<library>uuid</library>
<library>urlmon</library>
<library>shlwapi</library>
<library>ole32</library>
@ -64,7 +71,10 @@
<library>gdi32</library>
<library>advapi32</library>
<library>kernel32</library>
<library>uuid</library>
<library>ntdll</library>
<dependency>mshtml_nsiface_header</dependency>
</module>
<module name="mshtml_nsiface_header" type="idlheader" allowwarnings="true">
<file>nsiface.idl</file>
</module>
</group>

View file

@ -1,5 +1,5 @@
/*
* Copyright 2005-2006 Jacek Caban for CodeWeavers
* Copyright 2005-2008 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
@ -21,6 +21,7 @@
#include "mshtml.h"
#include "mshtmhst.h"
#include "hlink.h"
#include "dispex.h"
#include "wine/list.h"
#include "wine/unicode.h"
@ -55,15 +56,99 @@ 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 */
typedef enum {
NULL_tid,
DispDOMChildrenCollection_tid,
DispHTMLCommentElement_tid,
DispHTMLDocument_tid,
DispHTMLDOMTextNode_tid,
DispHTMLElementCollection_tid,
DispHTMLGenericElement_tid,
DispHTMLImg_tid,
DispHTMLInputElement_tid,
DispHTMLOptionElement_tid,
DispHTMLSelectElement_tid,
DispHTMLStyle_tid,
DispHTMLUnknownElement_tid,
DispHTMLWindow2_tid,
IHTMLCommentElement_tid,
IHTMLDocument2_tid,
IHTMLDocument3_tid,
IHTMLDocument4_tid,
IHTMLDocument5_tid,
IHTMLDOMChildrenCollection_tid,
IHTMLDOMNode_tid,
IHTMLDOMNode2_tid,
IHTMLDOMTextNode_tid,
IHTMLElement_tid,
IHTMLElement2_tid,
IHTMLElementCollection_tid,
IHTMLGenericElement_tid,
IHTMLImgElement_tid,
IHTMLInputElement_tid,
IHTMLOptionElement_tid,
IHTMLSelectElement_tid,
IHTMLStyle_tid,
IHTMLWindow2_tid,
IHTMLWindow3_tid,
IOmNavigator_tid,
LAST_tid
} tid_t;
typedef enum {
EVENTID_CHANGE,
EVENTID_CLICK,
EVENTID_KEYUP,
EVENTID_LOAD,
EVENTID_LAST
} eventid_t;
typedef struct dispex_data_t dispex_data_t;
typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
typedef struct {
HRESULT (*get_dispid)(IUnknown*,BSTR,DWORD,DISPID*);
HRESULT (*invoke)(IUnknown*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
} dispex_static_data_vtbl_t;
typedef struct {
const dispex_static_data_vtbl_t *vtbl;
const tid_t disp_tid;
dispex_data_t *data;
const tid_t* const iface_tids;
} dispex_static_data_t;
typedef struct {
const IDispatchExVtbl *lpIDispatchExVtbl;
IUnknown *outer;
dispex_static_data_t *data;
dispex_dynamic_data_t *dynamic_data;
} DispatchEx;
void init_dispex(DispatchEx*,IUnknown*,dispex_static_data_t*);
BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
typedef struct {
DispatchEx dispex;
const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl;
const IHTMLWindow3Vtbl *lpHTMLWindow3Vtbl;
const IDispatchExVtbl *lpIDispatchExVtbl;
LONG ref;
HTMLDocument *doc;
nsIDOMWindow *nswindow;
IHTMLEventObj *event;
struct list entry;
} HTMLWindow;
@ -114,6 +199,7 @@ typedef struct {
} HTMLOptionElementFactory;
struct HTMLDocument {
DispatchEx dispex;
const IHTMLDocument2Vtbl *lpHTMLDocument2Vtbl;
const IHTMLDocument3Vtbl *lpHTMLDocument3Vtbl;
const IHTMLDocument4Vtbl *lpHTMLDocument4Vtbl;
@ -133,6 +219,7 @@ struct HTMLDocument {
const IHlinkTargetVtbl *lpHlinkTargetVtbl;
const IPersistStreamInitVtbl *lpPersistStreamInitVtbl;
const ICustomDocVtbl *lpCustomDocVtbl;
const IDispatchExVtbl *lpIDispatchExVtbl;
LONG ref;
@ -205,6 +292,7 @@ struct NSContainer {
nsEventListener keypress_listener;
nsEventListener load_listener;
nsEventListener node_insert_listener;
nsEventListener htmlevent_listener;
nsIWebBrowser *webbrowser;
nsIWebNavigation *navigation;
@ -225,6 +313,8 @@ struct NSContainer {
nsChannelBSC *bscallback; /* hack */
HWND reset_focus; /* hack */
BOOL event_vector[EVENTID_LAST];
};
typedef struct {
@ -251,13 +341,16 @@ typedef struct {
} NodeImplVtbl;
struct HTMLDOMNode {
const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl;
DispatchEx dispex;
const IHTMLDOMNodeVtbl *lpHTMLDOMNodeVtbl;
const IHTMLDOMNode2Vtbl *lpHTMLDOMNode2Vtbl;
const NodeImplVtbl *vtbl;
LONG ref;
nsIDOMNode *nsnode;
HTMLDocument *doc;
event_target_t *event_target;
HTMLDOMNode *next;
};
@ -281,6 +374,7 @@ typedef struct {
} HTMLTextContainer;
#define HTMLWINDOW2(x) ((IHTMLWindow2*) &(x)->lpHTMLWindow2Vtbl)
#define HTMLWINDOW3(x) ((IHTMLWindow3*) &(x)->lpHTMLWindow3Vtbl)
#define HTMLDOC(x) ((IHTMLDocument2*) &(x)->lpHTMLDocument2Vtbl)
#define HTMLDOC3(x) ((IHTMLDocument3*) &(x)->lpHTMLDocument3Vtbl)
@ -328,12 +422,15 @@ typedef struct {
#define HTMLELEM(x) ((IHTMLElement*) &(x)->lpHTMLElementVtbl)
#define HTMLELEM2(x) ((IHTMLElement2*) &(x)->lpHTMLElement2Vtbl)
#define HTMLDOMNODE(x) ((IHTMLDOMNode*) &(x)->lpHTMLDOMNodeVtbl)
#define HTMLDOMNODE2(x) ((IHTMLDOMNode2*) &(x)->lpHTMLDOMNode2Vtbl)
#define HTMLTEXTCONT(x) ((IHTMLTextContainer*) &(x)->lpHTMLTextContainerVtbl)
#define HTMLOPTFACTORY(x) ((IHTMLOptionElementFactory*) &(x)->lpHTMLOptionElementFactoryVtbl)
#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl)
#define DISPATCHEX(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl)
#define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc)))
#define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface)
@ -405,13 +502,20 @@ nsIWritableVariant *create_nsvariant(void);
void nsnode_to_nsstring(nsIDOMNode*,nsAString*);
void get_editor_controller(NSContainer*);
void init_nsevents(NSContainer*);
void add_nsevent_listener(NSContainer*,LPCWSTR);
nsresult get_nsinterface(nsISupports*,REFIID,void**);
void check_event_attr(HTMLDocument*,nsIDOMElement*);
void release_event_target(event_target_t*);
void fire_event(HTMLDocument*,eventid_t,nsIDOMNode*);
HRESULT set_node_event(HTMLDOMNode*,eventid_t,VARIANT*);
eventid_t str_to_eid(LPCWSTR);
void set_document_bscallback(HTMLDocument*,nsChannelBSC*);
void set_current_mon(HTMLDocument*,IMoniker*);
HRESULT start_binding(HTMLDocument*,BSCallback*,IBindCtx*);
HRESULT bind_mon_to_buffer(HTMLDocument*,IMoniker*,void**);
HRESULT bind_mon_to_buffer(HTMLDocument*,IMoniker*,void**,DWORD*);
nsChannelBSC *create_channelbsc(IMoniker*);
HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*);
@ -427,16 +531,22 @@ IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetLis
void detach_selection(HTMLDocument*);
void detach_ranges(HTMLDocument*);
HTMLElement *HTMLElement_Create(nsIDOMNode*);
HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocument*,nsIDOMNode*);
HTMLElement *HTMLElement_Create(HTMLDocument*,nsIDOMNode*,BOOL);
HTMLElement *HTMLCommentElement_Create(HTMLDocument*,nsIDOMNode*);
HTMLElement *HTMLAnchorElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLImgElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLInputElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLOptionElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLScriptElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLSelectElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLTable_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLTextAreaElement_Create(nsIDOMHTMLElement*);
HTMLElement *HTMLGenericElement_Create(nsIDOMHTMLElement*);
void HTMLDOMNode_Init(HTMLDocument*,HTMLDOMNode*,nsIDOMNode*);
void HTMLElement_Init(HTMLElement*);
void HTMLElement2_Init(HTMLElement*);
void HTMLTextContainer_Init(HTMLTextContainer*);
@ -447,12 +557,13 @@ void HTMLDOMNode_destructor(HTMLDOMNode*);
HRESULT HTMLElement_QI(HTMLDOMNode*,REFIID,void**);
void HTMLElement_destructor(HTMLDOMNode*);
HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*);
HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*,BOOL);
void release_nodes(HTMLDocument*);
void release_script_hosts(HTMLDocument*);
void connect_scripts(HTMLDocument*);
void doc_insert_script(HTMLDocument*,nsIDOMHTMLScriptElement*);
IDispatch *script_parse_event(HTMLDocument*,LPCWSTR);
IHTMLElementCollection *create_all_collection(HTMLDOMNode*);
@ -506,20 +617,19 @@ typedef struct {
HWND thread_hwnd;
task_t *task_queue_head;
task_t *task_queue_tail;
struct list timer_list;
} thread_data_t;
thread_data_t *get_thread_data(BOOL);
HWND get_thread_hwnd(void);
void push_task(task_t*);
void remove_doc_tasks(const HTMLDocument*);
DWORD set_task_timer(HTMLDocument*,DWORD,BOOL,IDispatch*);
HRESULT clear_task_timer(HTMLDocument*,BOOL,DWORD);
/* typelibs */
enum tid_t {
IHTMLWindow2_tid,
LAST_tid
};
HRESULT get_typeinfo(enum tid_t, ITypeInfo**);
HRESULT get_typeinfo(tid_t,ITypeInfo**);
void release_typelib(void);
void call_disp_func(HTMLDocument*,IDispatch*);
DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);

View file

@ -807,7 +807,7 @@ static BufferBSC *create_bufferbsc(IMoniker *mon)
return ret;
}
HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf)
HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf, DWORD *size)
{
BufferBSC *bsc = create_bufferbsc(mon);
HRESULT hres;
@ -820,6 +820,7 @@ HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf)
if(SUCCEEDED(hres)) {
*buf = bsc->buf;
bsc->buf = NULL;
*size = bsc->bsc.readed;
bsc->size = 0;
}
}

View file

@ -301,6 +301,65 @@ static void set_lang(nsIPrefBranch *pref)
ERR("SetCharPref failed: %08x\n", nsres);
}
static void set_proxy(nsIPrefBranch *pref)
{
char proxy[512];
char * proxy_port;
int proxy_port_num;
DWORD enabled = 0, res, size, type;
HKEY hkey;
nsresult nsres;
static const WCHAR proxy_keyW[] =
{'S','o','f','t','w','a','r','e',
'\\','M','i','c','r','o','s','o','f','t',
'\\','W','i','n','d','o','w','s',
'\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n',
'\\','I','n','t','e','r','n','e','t',' ','S','e','t','t','i','n','g','s',0};
res = RegOpenKeyW(HKEY_CURRENT_USER, proxy_keyW, &hkey);
if(res != ERROR_SUCCESS)
return;
size = sizeof(enabled);
res = RegQueryValueExA(hkey, "ProxyEnable", 0, &type, (LPBYTE)&enabled, &size);
if(res != ERROR_SUCCESS || type != REG_DWORD || enabled == 0)
{
RegCloseKey(hkey);
return;
}
size = sizeof(proxy);
res = RegQueryValueExA(hkey, "ProxyServer", 0, &type, (LPBYTE)proxy, &size);
RegCloseKey(hkey);
if(res != ERROR_SUCCESS || type != REG_SZ)
return;
proxy_port = strchr(proxy, ':');
if (!proxy_port)
return;
*proxy_port = 0;
proxy_port_num = atoi(proxy_port + 1);
TRACE("Setting proxy to %s, port %d\n", debugstr_a(proxy), proxy_port_num);
nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.type", 1);
if(NS_FAILED(nsres))
ERR("SetIntPref network.proxy.type failed: %08x\n", nsres);
nsres = nsIPrefBranch_SetCharPref(pref, "network.proxy.http", proxy);
if(NS_FAILED(nsres))
ERR("SetCharPref network.proxy.http failed: %08x\n", nsres);
nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.http_port", proxy_port_num);
if(NS_FAILED(nsres))
ERR("SetIntPref network.proxy.http_port failed: %08x\n", nsres);
nsres = nsIPrefBranch_SetCharPref(pref, "network.proxy.ssl", proxy);
if(NS_FAILED(nsres))
ERR("SetCharPref network.proxy.ssl failed: %08x\n", nsres);
nsres = nsIPrefBranch_SetIntPref(pref, "network.proxy.ssl_port", proxy_port_num);
if(NS_FAILED(nsres))
ERR("SetIntPref network.proxy.ssl_port failed: %08x\n", nsres);
}
static void set_bool_pref(nsIPrefBranch *pref, const char *pref_name, BOOL val)
{
nsresult nsres;
@ -347,6 +406,7 @@ static void set_profile(void)
}
set_lang(pref);
set_proxy(pref);
set_bool_pref(pref, "security.warn_entering_secure", FALSE);
set_bool_pref(pref, "security.warn_submit_insecure", FALSE);
@ -1073,7 +1133,7 @@ static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuList
FIXME("aContextFlags=%08x\n", aContextFlags);
};
show_context_menu(This->doc, dwID, &pt, (IDispatch*)HTMLDOMNODE(get_node(This->doc, aNode)));
show_context_menu(This->doc, dwID, &pt, (IDispatch*)HTMLDOMNODE(get_node(This->doc, aNode, TRUE)));
return NS_OK;
}
@ -1418,7 +1478,7 @@ static nsrefcnt NSAPI nsTooltipListener_AddRef(nsITooltipListener *iface)
static nsrefcnt NSAPI nsTooltipListener_Release(nsITooltipListener *iface)
{
NSContainer *This = NSTOOLTIP_THIS(iface);
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
}
static nsresult NSAPI nsTooltipListener_OnShowTooltip(nsITooltipListener *iface,
@ -1583,7 +1643,7 @@ NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
if(!load_gecko(FALSE))
return NULL;
ret = heap_alloc(sizeof(NSContainer));
ret = heap_alloc_zero(sizeof(NSContainer));
ret->lpWebBrowserChromeVtbl = &nsWebBrowserChromeVtbl;
ret->lpContextMenuListenerVtbl = &nsContextMenuListenerVtbl;
@ -1596,11 +1656,6 @@ NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
ret->doc = doc;
ret->ref = 1;
ret->bscallback = NULL;
ret->content_listener = NULL;
ret->editor_controller = NULL;
ret->editor = NULL;
ret->reset_focus = NULL;
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_WEBBROWSER_CONTRACTID,
NULL, &IID_nsIWebBrowser, (void**)&ret->webbrowser);
@ -1693,6 +1748,8 @@ void NSContainer_Release(NSContainer *This)
{
TRACE("(%p)\n", This);
This->doc = NULL;
ShowWindow(This->hwnd, SW_HIDE);
SetParent(This->hwnd, NULL);

View file

@ -129,6 +129,9 @@ static nsresult NSAPI handle_keypress(nsIDOMEventListener *iface,
static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event)
{
NSContainer *This = NSEVENTLIST_THIS(iface)->This;
nsIDOMHTMLDocument *nshtmldoc;
nsIDOMHTMLElement *nsbody = NULL;
nsIDOMDocument *nsdoc;
task_t *task;
TRACE("(%p)\n", This);
@ -159,6 +162,19 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
*/
push_task(task);
nsIWebNavigation_GetDocument(This->navigation, &nsdoc);
nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMHTMLDocument, (void**)&nshtmldoc);
nsIDOMDocument_Release(nsdoc);
nsIDOMHTMLDocument_GetBody(nshtmldoc, &nsbody);
nsIDOMHTMLDocument_Release(nshtmldoc);
if(nsbody) {
fire_event(This->doc, EVENTID_LOAD, (nsIDOMNode*)nsbody);
nsIDOMHTMLElement_Release(nsbody);
}
return NS_OK;
}
@ -167,6 +183,7 @@ static nsresult NSAPI handle_node_insert(nsIDOMEventListener *iface, nsIDOMEvent
NSContainer *This = NSEVENTLIST_THIS(iface)->This;
nsIDOMHTMLScriptElement *script;
nsIDOMEventTarget *target;
nsIDOMElement *elem;
nsresult nsres;
TRACE("(%p %p)\n", This, event);
@ -174,16 +191,59 @@ static nsresult NSAPI handle_node_insert(nsIDOMEventListener *iface, nsIDOMEvent
nsres = nsIDOMEvent_GetTarget(event, &target);
if(NS_FAILED(nsres)) {
ERR("GetTarget failed: %08x\n", nsres);
return nsres;
return NS_OK;
}
nsres = nsISupports_QueryInterface(target, &IID_nsIDOMHTMLScriptElement, (void**)&script);
nsres = nsIDOMEventTarget_QueryInterface(target, &IID_nsIDOMElement, (void**)&elem);
nsIDOMEventTarget_Release(target);
if(NS_FAILED(nsres))
return NS_OK;
nsres = nsIDOMElement_QueryInterface(elem, &IID_nsIDOMHTMLScriptElement, (void**)&script);
if(SUCCEEDED(nsres)) {
doc_insert_script(This->doc, script);
nsIDOMHTMLScriptElement_Release(script);
}
nsIDOMEventTarget_Release(target);
check_event_attr(This->doc, elem);
nsIDOMNode_Release(elem);
return NS_OK;
}
static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *event)
{
NSContainer *This = NSEVENTLIST_THIS(iface)->This;
const PRUnichar *type;
nsIDOMEventTarget *event_target;
nsIDOMNode *nsnode;
nsAString type_str;
eventid_t eid;
nsresult nsres;
nsAString_Init(&type_str, NULL);
nsIDOMEvent_GetType(event, &type_str);
nsAString_GetData(&type_str, &type);
eid = str_to_eid(type);
nsAString_Finish(&type_str);
nsres = nsIDOMEvent_GetTarget(event, &event_target);
if(NS_FAILED(nsres) || !event_target) {
ERR("GetEventTarget failed: %08x\n", nsres);
return NS_OK;
}
nsres = nsIDOMEventTarget_QueryInterface(event_target, &IID_nsIDOMNode, (void**)&nsnode);
nsIDOMEventTarget_Release(event_target);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNode: %08x\n", nsres);
return NS_OK;
}
fire_event(This->doc, eid, nsnode);
nsIDOMNode_Release(nsnode);
return NS_OK;
}
@ -202,6 +262,7 @@ static const nsIDOMEventListenerVtbl focus_vtbl = EVENTLISTENER_VTBL(handle_
static const nsIDOMEventListenerVtbl keypress_vtbl = EVENTLISTENER_VTBL(handle_keypress);
static const nsIDOMEventListenerVtbl load_vtbl = EVENTLISTENER_VTBL(handle_load);
static const nsIDOMEventListenerVtbl node_insert_vtbl = EVENTLISTENER_VTBL(handle_node_insert);
static const nsIDOMEventListenerVtbl htmlevent_vtbl = EVENTLISTENER_VTBL(handle_htmlevent);
static void init_event(nsIDOMEventTarget *target, const PRUnichar *type,
nsIDOMEventListener *listener, BOOL capture)
@ -224,6 +285,29 @@ static void init_listener(nsEventListener *This, NSContainer *container,
This->This = container;
}
void add_nsevent_listener(NSContainer *container, LPCWSTR type)
{
nsIDOMWindow *dom_window;
nsIDOMEventTarget *target;
nsresult nsres;
nsres = nsIWebBrowser_GetContentDOMWindow(container->webbrowser, &dom_window);
if(NS_FAILED(nsres)) {
ERR("GetContentDOMWindow failed: %08x\n", nsres);
return;
}
nsres = nsIDOMWindow_QueryInterface(dom_window, &IID_nsIDOMEventTarget, (void**)&target);
nsIDOMWindow_Release(dom_window);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres);
return;
}
init_event(target, type, NSEVENTLIST(&container->htmlevent_listener), TRUE);
nsIDOMEventTarget_Release(target);
}
void init_nsevents(NSContainer *This)
{
nsIDOMWindow *dom_window;
@ -242,6 +326,7 @@ void init_nsevents(NSContainer *This)
init_listener(&This->keypress_listener, This, &keypress_vtbl);
init_listener(&This->load_listener, This, &load_vtbl);
init_listener(&This->node_insert_listener, This, &node_insert_vtbl);
init_listener(&This->htmlevent_listener, This, &htmlevent_vtbl);
nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window);
if(NS_FAILED(nsres)) {

View file

@ -18,9 +18,9 @@
/*
* NOTE:
* This file is not an usual idl file. Interfaces in this file are XPCOM interfaces
* (NOT MSCOM!), but we generate the header file with WIDL compatibile with XPCOM,
* useable in C code.
* This file is not a typical idl file. Interfaces in this file are XPCOM
* interfaces (NOT MSCOM!), but we generate the header file with WIDL
* compatible with XPCOM, usable in C code.
*/
cpp_quote("#define GECKO_VERSION \"0.1.0\"")
@ -1295,6 +1295,39 @@ interface nsIDOMHTMLScriptElement : nsIDOMHTMLElement
nsresult SetType(const nsAString *aType);
}
[
object,
uuid(a6cf90ab-15b3-11d2-932e-00805f8add32),
local
]
interface nsIDOMHTMLImageElement : nsIDOMHTMLElement
{
nsresult GetName(nsAString *aName);
nsresult SetName(const nsAString *aName);
nsresult GetAlign(nsAString *aAlign);
nsresult SetAlign(const nsAString *aAlign);
nsresult GetAlt(nsAString *aAlt);
nsresult SetAlt(const nsAString *aAlt);
nsresult GetBorder(nsAString *aBorder);
nsresult SetBorder(const nsAString *aBorder);
nsresult GetHeight(PRInt32 *aHeight);
nsresult SetHeight(PRInt32 aHeight);
nsresult GetHspace(PRInt32 *aHspace);
nsresult SetHspace(PRInt32 aHspace);
nsresult GetIsMap(PRBool *aIsMap);
nsresult SetIsMap(PRBool aIsMap);
nsresult GetLongDesc(nsAString *aLongDesc);
nsresult SetLongDesc(const nsAString *aLongDesc);
nsresult GetSrc(nsAString *aSrc);
nsresult SetSrc(const nsAString *aSrc);
nsresult GetUseMap(nsAString *aUseMap);
nsresult SetUseMap(const nsAString *aUseMap);
nsresult GetVspace(PRInt32 *aVspace);
nsresult SetVspace(PRInt32 aVspace);
nsresult GetWidth(PRInt32 *aWidth);
nsresult SetWidth(PRInt32 aWidth);
}
[
object,
uuid(94928ab3-8b63-11d3-989d-001083010e9b),

View file

@ -2040,7 +2040,6 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
const char *aOriginCharset, nsIURI *aBaseURI, nsIURI **_retval)
{
const char *spec = NULL;
nsACString spec_str;
NSContainer *nscontainer = NULL;
nsIURI *uri = NULL;
LPCWSTR base_wine_url = NULL;
@ -2078,9 +2077,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
nsACString_Finish(&base_uri_str);
}
nsACString_Init(&spec_str, spec);
nsres = nsIIOService_NewURI(nsio, &spec_str, aOriginCharset, aBaseURI, &uri);
nsACString_Finish(&spec_str);
nsres = nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, &uri);
if(NS_FAILED(nsres))
TRACE("NewURI failed: %08x\n", nsres);

View file

@ -61,6 +61,32 @@ static ULONG WINAPI OleObject_Release(IOleObject *iface)
return IHTMLDocument2_Release(HTMLDOC(This));
}
static void update_hostinfo(HTMLDocument *This, DOCHOSTUIINFO *hostinfo)
{
nsIScrollable *scrollable;
nsresult nsres;
if(!This->nscontainer)
return;
nsres = nsIWebBrowser_QueryInterface(This->nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
if(NS_SUCCEEDED(nsres)) {
nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_Y,
(hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO) ? Scrollbar_Never : Scrollbar_Always);
if(NS_FAILED(nsres))
ERR("Could not set default Y scrollbar prefs: %08x\n", nsres);
nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable, ScrollOrientation_X,
hostinfo->dwFlags & DOCHOSTUIFLAG_SCROLL_NO ? Scrollbar_Never : Scrollbar_Auto);
if(NS_FAILED(nsres))
ERR("Could not set default X scrollbar prefs: %08x\n", nsres);
nsIScrollable_Release(scrollable);
}else {
ERR("Could not get nsIScrollable: %08x\n", nsres);
}
}
static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite *pClientSite)
{
HTMLDocument *This = OLEOBJ_THIS(iface);
@ -103,6 +129,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
TRACE("hostinfo = {%u %08x %08x %s %s}\n",
hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
update_hostinfo(This, &hostinfo);
This->hostinfo = hostinfo;
}

View file

@ -32,6 +32,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
typedef struct {
DispatchEx dispex;
const IOmNavigatorVtbl *lpIOmNavigatorVtbl;
LONG ref;
@ -50,12 +51,11 @@ static HRESULT WINAPI OmNavigator_QueryInterface(IOmNavigator *iface, REFIID rii
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = OMNAVIGATOR(This);
}else if(IsEqualGUID(&IID_IDispatch, riid)) {
TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
*ppv = OMNAVIGATOR(This);
}else if(IsEqualGUID(&IID_IOmNavigator, riid)) {
TRACE("(%p)->(IID_IOmNavigator %p)\n", This, ppv);
*ppv = OMNAVIGATOR(This);
}else if(dispex_query_interface(&This->dispex, riid, ppv)) {
return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@ -101,8 +101,8 @@ static HRESULT WINAPI OmNavigator_GetTypeInfo(IOmNavigator *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
return E_NOTIMPL;
return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI OmNavigator_GetIDsOfNames(IOmNavigator *iface, REFIID riid,
@ -110,9 +110,8 @@ static HRESULT WINAPI OmNavigator_GetIDsOfNames(IOmNavigator *iface, REFIID riid
LCID lcid, DISPID *rgDispId)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
lcid, rgDispId);
return E_NOTIMPL;
return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI OmNavigator_Invoke(IOmNavigator *iface, DISPID dispIdMember,
@ -120,9 +119,9 @@ static HRESULT WINAPI OmNavigator_Invoke(IOmNavigator *iface, DISPID dispIdMembe
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
return E_NOTIMPL;
return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid, wFlags, pDispParams,
pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI OmNavigator_get_appCodeName(IOmNavigator *iface, BSTR *p)
@ -297,13 +296,26 @@ static const IOmNavigatorVtbl OmNavigatorVtbl = {
OmNavigator_get_userProfile
};
static const tid_t OmNavigator_iface_tids[] = {
IOmNavigator_tid,
0
};
static dispex_static_data_t OmNavigator_dispex = {
NULL,
IOmNavigator_tid,
NULL,
OmNavigator_iface_tids
};
IOmNavigator *OmNavigator_Create(void)
{
OmNavigator *ret;
ret = heap_alloc(sizeof(*ret));
ret = heap_alloc_zero(sizeof(*ret));
ret->lpIOmNavigatorVtbl = &OmNavigatorVtbl;
ret->ref = 1;
init_dispex(&ret->dispex, (IUnknown*)OMNAVIGATOR(ret), &OmNavigator_dispex);
return OMNAVIGATOR(ret);
}

View file

@ -483,6 +483,9 @@ static HRESULT WINAPI AboutProtocolInfo_QueryInfo(IInternetProtocolInfo *iface,
case QUERY_IS_SAFE:
FIXME("Unsupported option QUERY_IS_SAFE\n");
return E_NOTIMPL;
case QUERY_USES_HISTORYFOLDER:
FIXME("Unsupported option QUERY_USES_HISTORYFOLDER\n");
return E_FAIL;
default:
return E_FAIL;
}

View file

@ -34,6 +34,7 @@
#include "wine/wine_common_ver.rc"
#include "Bg.rc"
#include "Da.rc"
#include "De.rc"
#include "En.rc"
#include "Es.rc"

View file

@ -27,6 +27,7 @@
#include "winuser.h"
#include "ole2.h"
#include "activscp.h"
#include "activdbg.h"
#include "objsafe.h"
#include "wine/debug.h"
@ -36,6 +37,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
static const WCHAR windowW[] = {'w','i','n','d','o','w',0};
static const WCHAR emptyW[] = {0};
static const CLSID CLSID_JScript =
{0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}};
@ -44,11 +46,13 @@ typedef struct {
const IActiveScriptSiteVtbl *lpIActiveScriptSiteVtbl;
const IActiveScriptSiteInterruptPollVtbl *lpIActiveScriptSiteInterruptPollVtbl;
const IActiveScriptSiteWindowVtbl *lpIActiveScriptSiteWindowVtbl;
const IActiveScriptSiteDebug32Vtbl *lpIActiveScriptSiteDebug32Vtbl;
LONG ref;
IActiveScript *script;
IActiveScriptParse *parse;
IActiveScriptParseProcedure *parse_proc;
SCRIPTSTATE script_state;
@ -61,6 +65,7 @@ typedef struct {
#define ACTSCPSITE(x) ((IActiveScriptSite*) &(x)->lpIActiveScriptSiteVtbl)
#define ACTSCPPOLL(x) ((IActiveScriptSiteInterruptPoll*) &(x)->lpIActiveScriptSiteInterruptPollVtbl)
#define ACTSCPWIN(x) ((IActiveScriptSiteWindow*) &(x)->lpIActiveScriptSiteWindowVtbl)
#define ACTSCPDBG32(x) ((IActiveScriptSiteDebug32*) &(x)->lpIActiveScriptSiteDebug32Vtbl)
static BOOL init_script_engine(ScriptHost *script_host)
{
@ -144,7 +149,12 @@ static BOOL init_script_engine(ScriptHost *script_host)
if(FAILED(hres))
WARN("AddNamedItem failed: %08x\n", hres);
/* FIXME: QI for IActiveScriptParseProcedure2 and IActiveScriptParseProcedure */
hres = IActiveScript_QueryInterface(script_host->script, &IID_IActiveScriptParseProcedure2,
(void**)&script_host->parse_proc);
if(FAILED(hres)) {
/* FIXME: QI for IActiveScriptParseProcedure */
WARN("Could not get IActiveScriptParseProcedure iface: %08x\n", hres);
}
return TRUE;
}
@ -164,6 +174,11 @@ static void release_script_engine(ScriptHost *This)
IActiveScript_Close(This->script);
default:
if(This->parse_proc) {
IActiveScriptParseProcedure_Release(This->parse_proc);
This->parse_proc = NULL;
}
if(This->parse) {
IActiveScriptParse_Release(This->parse);
This->parse = NULL;
@ -205,6 +220,9 @@ static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface,
}else if(IsEqualGUID(&IID_IActiveScriptSiteWindow, riid)) {
TRACE("(%p)->(IID_IActiveScriptSiteWindow %p)\n", This, ppv);
*ppv = ACTSCPWIN(This);
}else if(IsEqualGUID(&IID_IActiveScriptSiteDebug32, riid)) {
TRACE("(%p)->(IID_IActiveScriptSiteDebug32 %p)\n", This, ppv);
*ppv = ACTSCPDBG32(This);
}else {
FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
return E_NOINTERFACE;
@ -368,8 +386,10 @@ static ULONG WINAPI ActiveScriptSiteInterruptPoll_Release(IActiveScriptSiteInter
static HRESULT WINAPI ActiveScriptSiteInterruptPoll_QueryContinue(IActiveScriptSiteInterruptPoll *iface)
{
ScriptHost *This = ACTSCPPOLL_THIS(iface);
FIXME("(%p)\n", This);
return E_NOTIMPL;
TRACE("(%p)\n", This);
return S_OK;
}
#undef ACTSCPPOLL_THIS
@ -426,7 +446,71 @@ static const IActiveScriptSiteWindowVtbl ActiveScriptSiteWindowVtbl = {
ActiveScriptSiteWindow_EnableModeless
};
static ScriptHost *create_script_host(HTMLDocument *doc, GUID *guid)
#define ACTSCPDBG32_THIS(iface) DEFINE_THIS(ScriptHost, IActiveScriptSiteDebug32, iface)
static HRESULT WINAPI ActiveScriptSiteDebug32_QueryInterface(IActiveScriptSiteDebug32 *iface,
REFIID riid, void **ppv)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
return IActiveScriptSite_QueryInterface(ACTSCPSITE(This), riid, ppv);
}
static ULONG WINAPI ActiveScriptSiteDebug32_AddRef(IActiveScriptSiteDebug32 *iface)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
return IActiveScriptSite_AddRef(ACTSCPSITE(This));
}
static ULONG WINAPI ActiveScriptSiteDebug32_Release(IActiveScriptSiteDebug32 *iface)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
return IActiveScriptSite_Release(ACTSCPSITE(This));
}
static HRESULT WINAPI ActiveScriptSiteDebug32_GetDocumentContextFromPosition(IActiveScriptSiteDebug32 *iface,
DWORD dwSourceContext, ULONG uCharacterOffset, ULONG uNumChars, IDebugDocumentContext **ppsc)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
FIXME("(%p)->(%x %u %u %p)\n", This, dwSourceContext, uCharacterOffset, uNumChars, ppsc);
return E_NOTIMPL;
}
static HRESULT WINAPI ActiveScriptSiteDebug32_GetApplication(IActiveScriptSiteDebug32 *iface, IDebugApplication32 **ppda)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
FIXME("(%p)->(%p)\n", This, ppda);
return E_NOTIMPL;
}
static HRESULT WINAPI ActiveScriptSiteDebug32_GetRootApplicationNode(IActiveScriptSiteDebug32 *iface,
IDebugApplicationNode **ppdanRoot)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
FIXME("(%p)->(%p)\n", This, ppdanRoot);
return E_NOTIMPL;
}
static HRESULT WINAPI ActiveScriptSiteDebug32_OnScriptErrorDebug(IActiveScriptSiteDebug32 *iface,
IActiveScriptErrorDebug *pErrorDebug, BOOL *pfEnterDebugger, BOOL *pfCallOnScriptErrorWhenContinuing)
{
ScriptHost *This = ACTSCPDBG32_THIS(iface);
FIXME("(%p)->(%p %p %p)\n", This, pErrorDebug, pfEnterDebugger, pfCallOnScriptErrorWhenContinuing);
return E_NOTIMPL;
}
#undef ACTSCPDBG32_THIS
static const IActiveScriptSiteDebug32Vtbl ActiveScriptSiteDebug32Vtbl = {
ActiveScriptSiteDebug32_QueryInterface,
ActiveScriptSiteDebug32_AddRef,
ActiveScriptSiteDebug32_Release,
ActiveScriptSiteDebug32_GetDocumentContextFromPosition,
ActiveScriptSiteDebug32_GetApplication,
ActiveScriptSiteDebug32_GetRootApplicationNode,
ActiveScriptSiteDebug32_OnScriptErrorDebug
};
static ScriptHost *create_script_host(HTMLDocument *doc, const GUID *guid)
{
ScriptHost *ret;
HRESULT hres;
@ -435,6 +519,7 @@ static ScriptHost *create_script_host(HTMLDocument *doc, GUID *guid)
ret->lpIActiveScriptSiteVtbl = &ActiveScriptSiteVtbl;
ret->lpIActiveScriptSiteInterruptPollVtbl = &ActiveScriptSiteInterruptPollVtbl;
ret->lpIActiveScriptSiteWindowVtbl = &ActiveScriptSiteWindowVtbl;
ret->lpIActiveScriptSiteDebug32Vtbl = &ActiveScriptSiteDebug32Vtbl;
ret->ref = 1;
ret->doc = doc;
ret->script_state = SCRIPTSTATE_UNINITIALIZED;
@ -477,6 +562,7 @@ static void parse_extern_script(ScriptHost *script_host, LPCWSTR src)
IMoniker *mon;
char *buf;
WCHAR *text;
DWORD len, size=0;
HRESULT hres;
static const WCHAR wine_schemaW[] = {'w','i','n','e',':'};
@ -488,13 +574,16 @@ static void parse_extern_script(ScriptHost *script_host, LPCWSTR src)
if(FAILED(hres))
return;
hres = bind_mon_to_buffer(script_host->doc, mon, (void**)&buf);
hres = bind_mon_to_buffer(script_host->doc, mon, (void**)&buf, &size);
IMoniker_Release(mon);
if(FAILED(hres))
return;
text = heap_strdupAtoW(buf);
len = MultiByteToWideChar(CP_ACP, 0, buf, size, NULL, 0);
text = heap_alloc((len+1)*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, buf, size, text, len);
heap_free(buf);
text[len] = 0;
parse_text(script_host, text);
@ -619,34 +708,34 @@ static BOOL get_script_guid(nsIDOMHTMLScriptElement *nsscript, GUID *guid)
return ret;
}
static ScriptHost *get_script_host(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript)
static ScriptHost *get_script_host(HTMLDocument *doc, const GUID *guid)
{
ScriptHost *iter;
GUID guid;
if(!get_script_guid(nsscript, &guid)) {
WARN("Could not find script GUID\n");
return NULL;
}
if(IsEqualGUID(&CLSID_JScript, &guid)) {
if(IsEqualGUID(&CLSID_JScript, guid)) {
FIXME("Ignoring JScript\n");
return NULL;
}
LIST_FOR_EACH_ENTRY(iter, &doc->script_hosts, ScriptHost, entry) {
if(IsEqualGUID(&guid, &iter->guid))
if(IsEqualGUID(guid, &iter->guid))
return iter;
}
return create_script_host(doc, &guid);
return create_script_host(doc, guid);
}
void doc_insert_script(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript)
{
ScriptHost *script_host;
GUID guid;
script_host = get_script_host(doc, nsscript);
if(!get_script_guid(nsscript, &guid)) {
WARN("Could not find script GUID\n");
return;
}
script_host = get_script_host(doc, &guid);
if(!script_host)
return;
@ -654,6 +743,55 @@ void doc_insert_script(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript)
parse_script_elem(script_host, nsscript);
}
IDispatch *script_parse_event(HTMLDocument *doc, LPCWSTR text)
{
ScriptHost *script_host;
GUID guid = CLSID_JScript;
const WCHAR *ptr;
IDispatch *disp;
HRESULT hres;
static const WCHAR delimiterW[] = {'\"',0};
for(ptr = text; isalnumW(*ptr); ptr++);
if(*ptr == ':') {
LPWSTR language;
BOOL b;
language = heap_alloc((ptr-text+1)*sizeof(WCHAR));
memcpy(language, text, (ptr-text)*sizeof(WCHAR));
language[ptr-text] = 0;
b = get_guid_from_language(language, &guid);
heap_free(language);
if(!b) {
WARN("Could not find language\n");
return NULL;
}
ptr++;
}else {
ptr = text;
}
script_host = get_script_host(doc, &guid);
if(!script_host || !script_host->parse_proc)
return NULL;
hres = IActiveScriptParseProcedure_ParseProcedureText(script_host->parse_proc, ptr, NULL, emptyW,
NULL, NULL, delimiterW, 0 /* FIXME */, 0,
SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
if(FAILED(hres)) {
WARN("ParseProcedureText failed: %08x\n", hres);
return NULL;
}
TRACE("ret %p\n", disp);
return disp;
}
void release_script_hosts(HTMLDocument *doc)
{
ScriptHost *iter;

View file

@ -28,6 +28,7 @@
#include "winuser.h"
#include "ole2.h"
#include "mshtmcid.h"
#include "shlguid.h"
#include "wine/debug.h"
@ -36,6 +37,17 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define WM_PROCESSTASK 0x8008
#define TIMER_ID 0x3000
typedef struct {
HTMLDocument *doc;
DWORD id;
DWORD time;
DWORD interval;
IDispatch *disp;
struct list entry;
} task_timer_t;
void push_task(task_t *task)
{
@ -66,11 +78,33 @@ static task_t *pop_task(void)
return task;
}
static void release_task_timer(HWND thread_hwnd, task_timer_t *timer)
{
list_remove(&timer->entry);
IDispatch_Release(timer->disp);
heap_free(timer);
}
void remove_doc_tasks(const HTMLDocument *doc)
{
thread_data_t *thread_data = get_thread_data(FALSE);
struct list *liter, *ltmp;
task_timer_t *timer;
task_t *iter, *tmp;
LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->timer_list) {
timer = LIST_ENTRY(liter, task_timer_t, entry);
if(timer->doc == doc)
release_task_timer(thread_data->thread_hwnd, timer);
}
if(!list_empty(&thread_data->timer_list)) {
timer = LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry);
SetTimer(thread_data->thread_hwnd, TIMER_ID, timer->time - GetTickCount(), NULL);
}
if(!thread_data)
return;
@ -90,6 +124,70 @@ void remove_doc_tasks(const HTMLDocument *doc)
}
}
static BOOL queue_timer(thread_data_t *thread_data, task_timer_t *timer)
{
task_timer_t *iter;
if(list_empty(&thread_data->timer_list)
|| LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry)->time > timer->time) {
list_add_head(&thread_data->timer_list, &timer->entry);
return TRUE;
}
LIST_FOR_EACH_ENTRY(iter, &thread_data->timer_list, task_timer_t, entry) {
if(iter->time > timer->time) {
list_add_tail(&iter->entry, &timer->entry);
return FALSE;
}
}
list_add_tail(&thread_data->timer_list, &timer->entry);
return FALSE;
}
DWORD set_task_timer(HTMLDocument *doc, DWORD msec, BOOL interval, IDispatch *disp)
{
thread_data_t *thread_data = get_thread_data(TRUE);
task_timer_t *timer;
DWORD tc = GetTickCount();
static DWORD id_cnt = 0x20000000;
timer = heap_alloc(sizeof(task_timer_t));
timer->id = id_cnt++;
timer->doc = doc;
timer->time = tc + msec;
timer->interval = interval ? msec : 0;
IDispatch_AddRef(disp);
timer->disp = disp;
if(queue_timer(thread_data, timer))
SetTimer(thread_data->thread_hwnd, TIMER_ID, msec, NULL);
return timer->id;
}
HRESULT clear_task_timer(HTMLDocument *doc, BOOL interval, DWORD id)
{
thread_data_t *thread_data = get_thread_data(FALSE);
task_timer_t *iter;
if(!thread_data)
return S_OK;
LIST_FOR_EACH_ENTRY(iter, &thread_data->timer_list, task_timer_t, entry) {
if(iter->id == id && iter->doc == doc && (iter->interval == 0) == !interval) {
release_task_timer(thread_data->thread_hwnd, iter);
return S_OK;
}
}
WARN("timet not found\n");
return S_OK;
}
static void set_downloading(HTMLDocument *doc)
{
IOleCommandTarget *olecmd;
@ -126,6 +224,27 @@ static void set_downloading(HTMLDocument *doc)
}
}
/* Calls undocumented 69 cmd of CGID_Explorer */
static void call_explorer_69(HTMLDocument *doc)
{
IOleCommandTarget *olecmd;
VARIANT var;
HRESULT hres;
if(!doc->client)
return;
hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
if(FAILED(hres))
return;
VariantInit(&var);
hres = IOleCommandTarget_Exec(olecmd, &CGID_Explorer, 69, 0, NULL, &var);
IOleCommandTarget_Release(olecmd);
if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL)
FIXME("handle result\n");
}
static void set_parsecomplete(HTMLDocument *doc)
{
IOleCommandTarget *olecmd = NULL;
@ -135,7 +254,9 @@ static void set_parsecomplete(HTMLDocument *doc)
if(doc->usermode == EDITMODE)
init_editor(doc);
call_explorer_69(doc);
call_property_onchanged(&doc->cp_propnotif, 1005);
call_explorer_69(doc);
doc->readystate = READYSTATE_INTERACTIVE;
call_property_onchanged(&doc->cp_propnotif, DISPID_READYSTATE);
@ -156,6 +277,7 @@ static void set_parsecomplete(HTMLDocument *doc)
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);
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL);
@ -238,6 +360,40 @@ static void process_task(task_t *task)
}
}
static LRESULT process_timer(void)
{
thread_data_t *thread_data = get_thread_data(TRUE);
DWORD tc;
task_timer_t *timer;
TRACE("\n");
while(!list_empty(&thread_data->timer_list)) {
timer = LIST_ENTRY(list_head(&thread_data->timer_list), task_timer_t, entry);
tc = GetTickCount();
if(timer->time > tc) {
SetTimer(thread_data->thread_hwnd, TIMER_ID, timer->time-tc, NULL);
return 0;
}
list_remove(&timer->entry);
list_init(&timer->entry);
call_disp_func(timer->doc, timer->disp);
if(timer->interval) {
timer->time += timer->interval;
queue_timer(thread_data, timer);
}else {
release_task_timer(thread_data->thread_hwnd, timer);
}
}
KillTimer(thread_data->thread_hwnd, TIMER_ID);
return 0;
}
static LRESULT WINAPI hidden_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg) {
@ -252,6 +408,8 @@ static LRESULT WINAPI hidden_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
}
return 0;
case WM_TIMER:
return process_timer();
}
if(msg > WM_USER)
@ -307,6 +465,7 @@ thread_data_t *get_thread_data(BOOL create)
if(!thread_data && create) {
thread_data = heap_alloc_zero(sizeof(thread_data_t));
TlsSetValue(mshtml_tls, thread_data);
list_init(&thread_data->timer_list);
}
return thread_data;

View file

@ -202,11 +202,6 @@ static void wstrbuf_append_len(wstrbuf_t *buf, LPCWSTR str, int len)
buf->buf[buf->len] = 0;
}
static inline void wstrbuf_append(wstrbuf_t *buf, LPCWSTR str)
{
wstrbuf_append_len(buf, str, strlenW(str));
}
static void wstrbuf_append_nodetxt(wstrbuf_t *buf, LPCWSTR str, int len)
{
const WCHAR *s = str;
@ -616,6 +611,7 @@ static WCHAR next_char(const dompos_t *pos, dompos_t *new_pos)
case TEXT_NODE:
tmp_pos.node = iter;
tmp_pos.type = TEXT_NODE;
tmp_pos.off = 0;
dompos_addref(&tmp_pos);
p = tmp_pos.p;
@ -731,6 +727,7 @@ static WCHAR prev_char(HTMLTxtRange *This, const dompos_t *pos, dompos_t *new_po
tmp_pos.node = iter;
tmp_pos.type = TEXT_NODE;
tmp_pos.off = 0;
dompos_addref(&tmp_pos);
p = tmp_pos.p + strlenW(tmp_pos.p)-1;
@ -1183,7 +1180,7 @@ static HRESULT WINAPI HTMLTxtRange_parentElement(IHTMLTxtRange *iface, IHTMLElem
return S_OK;
}
node = get_node(This->doc, nsnode);
node = get_node(This->doc, nsnode, TRUE);
nsIDOMNode_Release(nsnode);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)parent);

View file

@ -0,0 +1,29 @@
/*
* Copyright 2008 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
*/
#ifndef DO_NO_IMPORTS
import "ocidl.idl";
import "oleidl.idl";
import "oaidl.idl";
#endif
cpp_quote("#ifndef _NO_AUTHOR_GUIDS")
cpp_quote("DEFINE_GUID(CATID_ActiveScriptAuthor, 0xaee2a92,0xbcbb,0x11d0,0x8c,0x72,0x0,0xc0,0x4f,0xc2,0xb0,0x85);")
cpp_quote("#endif")

View file

@ -0,0 +1,383 @@
/*
* Copyright 2008 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
*/
import "ocidl.idl";
import "activscp.idl";
/* import "dbgprop.idl"; */
interface IDebugDocumentContext;
interface IRemoteDebugApplication;
/* FIXME: */
interface IEnumDebugStackFrames;
interface IDebugStackFrame;
interface IApplicationDebugger;
interface IEnumRemoteDebugApplicationThreads;
interface IDebugApplicationNode;
interface IEnumDebugExpressionContexts;
interface IDebugApplicationThread;
interface IDebugSyncOperation;
interface IDebugAsyncOperation;
interface IDebugStackFrameSniffer;
interface IDebugThreadCall32;
interface IActiveScriptErrorDebug;
interface IProvideExpressionContexts;
typedef enum tagBREAKPOINT_STATE {
BREAKPOINT_DELETED,
BREAKPOINT_DISABLED,
BREAKPOINT_ENABLED
} BREAKPOINT_STATE;
typedef DWORD APPBREAKFLAGS;
typedef enum tagBREAKREASON {
BREAKREASON_STEP,
BREAKREASON_BREAKPOINT,
BREAKREASON_DEBUGGER_BLOCK,
BREAKREASON_HOST_INITIATED,
BREAKREASON_LANGUAGE_INITIATED,
BREAKREASON_DEBUGGER_HALT,
BREAKREASON_ERROR,
BREAKREASON_JIT
} BREAKREASON;
typedef enum tagBREAKRESUME_ACTION {
BREAKRESUMEACTION_ABORT,
BREAKRESUMEACTION_CONTINUE,
BREAKRESUMEACTION_STEP_INTO,
BREAKRESUMEACTION_STEP_OVER,
BREAKRESUMEACTION_STEP_OUT,
BREAKRESUMEACTION_IGNORE
} BREAKRESUMEACTION;
typedef enum tagDOCUMENTNAMETYPE {
DOCUMENTNAMETYPE_APPNODE,
DOCUMENTNAMETYPE_TITLE,
DOCUMENTNAMETYPE_FILE_TAIL,
DOCUMENTNAMETYPE_URL
} DOCUMENTNAMETYPE;
typedef enum tagERRORRESUMEACTION {
ERRORRESUMEACTION_ReexecuteErrorStatement,
ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller,
ERRORRESUMEACTION_SkipErrorStatement,
} ERRORRESUMEACTION;
/************************************************************
* interface IDebugDocumentInfo
*/
[
object,
uuid(51973c1f-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IDebugDocumentInfo : IUnknown
{
HRESULT GetName(
[in] DOCUMENTNAMETYPE dnt,
[out] BSTR *pbstrName);
HRESULT GetDocumentClassId(
[out] CLSID *pclsidDocument);
}
/************************************************************
* interface IDebugDocument
*/
[
object,
uuid(51973c21-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IDebugDocument : IDebugDocumentInfo
{
}
/************************************************************
* interface IDebugCodeContext
*/
[
object,
uuid(51973c13-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IDebugCodeContext : IUnknown
{
HRESULT GetDocumentContext(
[out] IDebugDocumentContext **ppsc);
HRESULT SetBreakPoint(
[in] BREAKPOINT_STATE bps);
}
/************************************************************
* interface IEnumDebugCodeContexts
*/
[
object,
uuid(51973c1d-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IEnumDebugCodeContexts : IUnknown
{
HRESULT Next(
[in] ULONG celt,
[out] IDebugCodeContext **pscc,
[out] ULONG *pceltFetched);
HRESULT Skip(
[in] ULONG celt);
HRESULT Reset();
HRESULT Clone(
[out] IEnumDebugCodeContexts **ppescc);
}
/************************************************************
* interface IDebugDocumentContext
*/
[
object,
uuid(51973c28-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IDebugDocumentContext : IUnknown
{
HRESULT GetDocument(
[out] IDebugDocument **ppsd);
HRESULT EnumCodeContexts(
[out] IEnumDebugCodeContexts **ppescc);
}
/************************************************************
* interface IRemoteDebugApplicationThread
*/
[
object,
uuid(51973c37-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique)
]
interface IRemoteDebugApplicationThread : IUnknown
{
HRESULT GetSystemThreadId(
[out] DWORD *dwThreadId);
HRESULT GetApplication(
[out] IRemoteDebugApplication **pprda);
HRESULT EnumStackFrames(
[out] IEnumDebugStackFrames **ppedsf);
HRESULT GetDescription(
[out] BSTR *pbstrDescription,
[out] BSTR *pbstrState);
HRESULT SetNextStatement(
[in] IDebugStackFrame *pStackFrame,
[in] IDebugCodeContext *pCodeContext);
HRESULT GetState(
[out] DWORD *pState);
HRESULT Suspend(
[out] DWORD *pdwCount);
HRESULT Resume(
[out] DWORD *pdwCount);
HRESULT GetSuspendCount(
[out] DWORD *pdwCount);
}
/************************************************************
* interface IRemoteDebugApplication
*/
[
object,
uuid(51973c30-cb0c-11d0-b5c9-00a0244Aae7a),
pointer_default(unique)
]
interface IRemoteDebugApplication : IUnknown
{
HRESULT ResumeFromBreakPoint(
[in] IRemoteDebugApplicationThread *prptFocus,
[in] BREAKRESUMEACTION bra,
[in] ERRORRESUMEACTION era);
HRESULT CauseBreak();
HRESULT ConnectDebugger(
[in] IApplicationDebugger *pad);
HRESULT DisconnectDebugger();
HRESULT GetDebugger(
[out] IApplicationDebugger **pad);
HRESULT CreateInstanceAtApplication(
[in] REFCLSID rclsid,
[in] IUnknown *pUnkOuter,
[in] DWORD dwClsContext,
[in] REFIID riid,
[out, iid_is(riid)] IUnknown **ppvObject);
HRESULT QueryAlive();
HRESULT EnumThreads(
[out] IEnumRemoteDebugApplicationThreads **pperdat);
HRESULT GetName(
[out] BSTR *pbstrName);
HRESULT GetRootNode(
[out] IDebugApplicationNode **ppdanRoot);
HRESULT EnumGlobalExpressionContexts(
[out] IEnumDebugExpressionContexts **ppedec);
}
/************************************************************
* interface IDebugApplication32
*/
[
object,
uuid(51973c32-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique),
local
]
interface IDebugApplication32 : IRemoteDebugApplication
{
HRESULT SetName(
[in] LPCOLESTR pstrName);
HRESULT StepOutComplete();
HRESULT DebugOutput(
[in] LPCOLESTR pstr);
HRESULT StartDebugSession();
HRESULT HandleBreakPoint(
[in] BREAKREASON br,
[out] BREAKRESUMEACTION *pbra);
HRESULT Close();
HRESULT GetBreakFlags(
[out] APPBREAKFLAGS *pabf,
[out] IRemoteDebugApplicationThread **pprdatSteppingThread);
HRESULT GetCurrentThread(
[out] IDebugApplicationThread **pat);
HRESULT CreateAsyncDebugOperation(
[in] IDebugSyncOperation *psdo,
[out] IDebugAsyncOperation **ppado);
HRESULT AddStackFrameSniffer(
[in] IDebugStackFrameSniffer *pdsfs,
[out] DWORD *pdwCookie);
HRESULT RemoveStackFrameSniffer(
[in] DWORD dwCookie);
HRESULT QueryCurrentThreadIsDebuggerThread();
HRESULT SynchronousCallInDebuggerThread(
[in] IDebugThreadCall32 *pptc,
[in] DWORD dwParam1,
[in] DWORD dwParam2,
[in] DWORD dwParam3);
HRESULT CreateApplicationNode(
[out] IDebugApplicationNode **ppdanNew);
HRESULT FireDebuggerEvent(
[in] REFGUID riid,
[in] IUnknown *punk);
HRESULT HandleRuntimeError(
[in] IActiveScriptErrorDebug *pErrorDebug,
[in] IActiveScriptSite *pScriptSite,
[out] BREAKRESUMEACTION *pbra,
[out] ERRORRESUMEACTION *perra,
[out] BOOL *pfCallOnScriptError);
BOOL FCanJitDebug();
BOOL FIsAutoJitDebugEnabled();
HRESULT AddGlobalExpressionContextProvider(
[in] IProvideExpressionContexts *pdsfs,
[out] DWORD *pdwCookie);
HRESULT RemoveGlobalExpressionContextProvider(
[in] DWORD dwCookie);
}
/************************************************************
* interface IActiveScriptSiteDebug32
*/
[
object,
uuid(51973c11-cb0c-11d0-b5c9-00a0244a0e7a),
pointer_default(unique),
local
]
interface IActiveScriptSiteDebug32 : IUnknown
{
HRESULT GetDocumentContextFromPosition(
[in] DWORD dwSourceContext,
[in] ULONG uCharacterOffset,
[in] ULONG uNumChars,
[out] IDebugDocumentContext **ppsc);
HRESULT GetApplication(
[out] IDebugApplication32 **ppda);
HRESULT GetRootApplicationNode(
[out] IDebugApplicationNode **ppdanRoot);
HRESULT OnScriptErrorDebug(
[in] IActiveScriptErrorDebug *pErrorDebug,
[out] BOOL *pfEnterDebugger,
[out] BOOL *pfCallOnScriptErrorWhenContinuing);
}
cpp_quote("#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS")
cpp_quote("#ifdef _WIN64")
cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug64")
cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug64")
cpp_quote("#define IDebugApplication IDebugApplication64")
cpp_quote("#define IID_IDebugApplication IID_IDebugApplication64")
cpp_quote("#else")
cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug32")
cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug32")
cpp_quote("#define IDebugApplication IDebugApplication32")
cpp_quote("#define IID_IDebugApplication IID_IDebugApplication32")
cpp_quote("#endif")
cpp_quote("#endif")

View file

@ -21,6 +21,7 @@
#define DISPID_NORMAL_FIRST 1000
#define DISPID_OMDOCUMENT DISPID_NORMAL_FIRST
#define DISPID_DATATRANSFER DISPID_NORMAL_FIRST
#define DISPID_ANCHOR DISPID_NORMAL_FIRST
#define DISPID_BLOCK DISPID_NORMAL_FIRST
#define DISPID_BR DISPID_NORMAL_FIRST
@ -90,6 +91,8 @@
#define DISPID_OMDOCUMENT DISPID_NORMAL_FIRST
#define DISPID_SCREEN DISPID_NORMAL_FIRST
#define DISPID_DOMATTRIBUTE DISPID_NORMAL_FIRST
#define DISPID_DOMTEXTNODE DISPID_NORMAL_FIRST
#define DISPID_GENERIC DISPID_NORMAL_FIRST
#define DISPID_DOMIMPLEMENTATION DISPID_NORMAL_FIRST
#define DISPID_COLLECTION (DISPID_NORMAL_FIRST+500)
@ -984,6 +987,17 @@
#define DISPID_IHTMLELEMENTCOLLECTION__NEWENUM DISPID_NEWENUM
#define DISPID_IHTMLELEMENTCOLLECTION_ITEM DISPID_VALUE
/* IHTMLElementCollection2 */
#define DISPID_IHTMLELEMENTCOLLECTION2_URNS DISPID_COLLECTION+5
/* IHTMLElementCollection3 */
#define DISPID_IHTMLELEMENTCOLLECTION3_NAMEDITEM DISPID_COLLECTION+6
/* IHTMLDOMChildrenCollection */
#define DISPID_IHTMLDOMCHILDRENCOLLECTION_LENGTH DISPID_COLLECTION
#define DISPID_IHTMLDOMCHILDRENCOLLECTION__NEWENUM DISPID_NEWENUM
#define DISPID_IHTMLDOMCHILDRENCOLLECTION_ITEM DISPID_VALUE
/* HTMLElementEvents */
#define DISPID_HTMLELEMENTEVENTS_ONHELP DISPID_EVMETH_ONHELP
#define DISPID_HTMLELEMENTEVENTS_ONCLICK DISPID_EVMETH_ONCLICK
@ -1107,7 +1121,7 @@
#define DISPID_IHTMLELEMENT_ONDATASETCOMPLETE DISPID_EVPROP_ONDATASETCOMPLETE
#define DISPID_IHTMLELEMENT_ONFILTERCHANGE DISPID_EVPROP_ONFILTER
/* IHTMLelement2 */
/* IHTMLElement2 */
#define DISPID_IHTMLELEMENT2_SCOPENAME DISPID_ELEMENT+39
#define DISPID_IHTMLELEMENT2_SETCAPTURE DISPID_ELEMENT+40
#define DISPID_IHTMLELEMENT2_RELEASECAPTURE DISPID_ELEMENT+41
@ -1177,6 +1191,57 @@
#define DISPID_IHTMLELEMENT2_READYSTATEVALUE DISPID_ELEMENT+84
#define DISPID_IHTMLELEMENT2_GETELEMENTSBYTAGNAME DISPID_ELEMENT+85
/* IHTMLElement3 */
#define DISPID_IHTMLELEMENT3_MERGEATTRIBUTES DISPID_ELEMENT+96
#define DISPID_IHTMLELEMENT3_ISMULTILINE DISPID_ELEMENT+97
#define DISPID_IHTMLELEMENT3_CANHAVEHTML DISPID_ELEMENT+98
#define DISPID_IHTMLELEMENT3_ONLAYOUTCOMPLETE DISPID_EVPROP_ONLAYOUTCOMPLETE
#define DISPID_IHTMLELEMENT3_ONPAGE DISPID_EVPROP_ONPAGE
#define DISPID_IHTMLELEMENT3_INFLATEBLOCK DISPID_ELEMENT+100
#define DISPID_IHTMLELEMENT3_ONBEFOREDEACTIVATE DISPID_EVPROP_ONBEFOREDEACTIVATE
#define DISPID_IHTMLELEMENT3_SETACTIVE DISPID_ELEMENT+101
#define DISPID_IHTMLELEMENT3_CONTENTEDITABLE DISPID_A_EDITABLE
#define DISPID_IHTMLELEMENT3_ISCONTENTEDITABLE DISPID_ELEMENT+102
#define DISPID_IHTMLELEMENT3_HIDEFOCUS DISPID_A_HIDEFOCUS
#define DISPID_IHTMLELEMENT3_DISABLED STDPROPID_XOBJ_DISABLED
#define DISPID_IHTMLELEMENT3_ISDISABLED DISPID_ELEMENT+105
#define DISPID_IHTMLELEMENT3_ONMOVE DISPID_EVPROP_ONMOVE
#define DISPID_IHTMLELEMENT3_ONCONTROLSELECT DISPID_EVPROP_ONCONTROLSELECT
#define DISPID_IHTMLELEMENT3_FIREEVENT DISPID_ELEMENT+106
#define DISPID_IHTMLELEMENT3_ONRESIZESTART DISPID_EVPROP_ONRESIZESTART
#define DISPID_IHTMLELEMENT3_ONRESIZEEND DISPID_EVPROP_ONRESIZEEND
#define DISPID_IHTMLELEMENT3_ONMOVESTART DISPID_EVPROP_ONMOVESTART
#define DISPID_IHTMLELEMENT3_ONMOVEEND DISPID_EVPROP_ONMOVEEND
#define DISPID_IHTMLELEMENT3_ONMOUSEENTER DISPID_EVPROP_ONMOUSEENTER
#define DISPID_IHTMLELEMENT3_ONMOUSELEAVE DISPID_EVPROP_ONMOUSELEAVE
#define DISPID_IHTMLELEMENT3_ONACTIVATE DISPID_EVPROP_ONACTIVATE
#define DISPID_IHTMLELEMENT3_ONDEACTIVATE DISPID_EVPROP_ONDEACTIVATE
#define DISPID_IHTMLELEMENT3_DRAGDROP DISPID_ELEMENT+107
#define DISPID_IHTMLELEMENT3_GLYPHMODE DISPID_ELEMENT+108
/* IHTMLElement4 */
#define DISPID_IHTMLELEMENT4_ONMOUSEWHEEL DISPID_EVPROP_ONMOUSEWHEEL
#define DISPID_IHTMLELEMENT4_NORMALIZE DISPID_ELEMENT+112
#define DISPID_IHTMLELEMENT4_GETATTRIBUTENODE DISPID_ELEMENT+109
#define DISPID_IHTMLELEMENT4_SETATTRIBUTENODE DISPID_ELEMENT+110
#define DISPID_IHTMLELEMENT4_REMOVEATTRIBUTENODE DISPID_ELEMENT+111
#define DISPID_IHTMLELEMENT4_ONBEFOREACTIVATE DISPID_EVPROP_ONBEFOREACTIVATE
#define DISPID_IHTMLELEMENT4_ONFOCUSIN DISPID_EVPROP_ONFOCUSIN
#define DISPID_IHTMLELEMENT4_ONFOCUSOUT DISPID_EVPROP_ONFOCUSOUT
/* IHTMLGenericElement */
#define DISPID_IHTMLGENERICELEMENT_RECORDSET DISPID_GENERIC+1
#define DISPID_IHTMLGENERICELEMENT_NAMEDRECORDSET DISPID_GENERIC+2
/* IHTMLUniqueName */
#define DISPID_IHTMLUNIQUENAME_UNIQUENUMBER DISPID_ELEMENT+54
#define DISPID_IHTMLUNIQUENAME_UNIQUEID DISPID_ELEMENT+55
/* IHTMLDatabinding */
#define DISPID_IHTMLDATABINDING_DATAFLD DISPID_ELEMENT+21
#define DISPID_IHTMLDATABINDING_DATASRC DISPID_ELEMENT+22
#define DISPID_IHTMLDATABINDING_DATAFORMATAS DISPID_ELEMENT+23
/* IHTMLStyle */
#define DISPID_IHTMLSTYLE_PIXELTOP DISPID_STYLE
#define DISPID_IHTMLSTYLE_PIXELLEFT (DISPID_STYLE+1)
@ -1271,6 +1336,62 @@
#define DISPID_IHTMLSTYLE_TEXTALIGN STDPROPID_XOBJ_BLOCKALIGN
#define DISPID_IHTMLSTYLE_BACKGROUNDCOLOR DISPID_BACKCOLOR
/* IHTMLStyle2 */
#define DISPID_IHTMLSTYLE2_TABLELAYOUT DISPID_A_TABLELAYOUT
#define DISPID_IHTMLSTYLE2_BORDERCOLLAPSE DISPID_A_BORDERCOLLAPSE
#define DISPID_IHTMLSTYLE2_DIRECTION DISPID_A_DIRECTION
#define DISPID_IHTMLSTYLE2_BEHAVIOR DISPID_A_BEHAVIOR
#define DISPID_IHTMLSTYLE2_SETEXPRESSION DISPID_HTMLOBJECT+4
#define DISPID_IHTMLSTYLE2_GETEXPRESSION DISPID_HTMLOBJECT+5
#define DISPID_IHTMLSTYLE2_REMOVEEXPRESSION DISPID_HTMLOBJECT+6
#define DISPID_IHTMLSTYLE2_POSITION DISPID_A_POSITION
#define DISPID_IHTMLSTYLE2_UNICODEBIDI DISPID_A_UNICODEBIDI
#define DISPID_IHTMLSTYLE2_BOTTOM STDPROPID_XOBJ_BOTTOM
#define DISPID_IHTMLSTYLE2_RIGHT STDPROPID_XOBJ_RIGHT
#define DISPID_IHTMLSTYLE2_PIXELBOTTOM DISPID_STYLE+9
#define DISPID_IHTMLSTYLE2_PIXELRIGHT DISPID_STYLE+10
#define DISPID_IHTMLSTYLE2_POSBOTTOM DISPID_STYLE+11
#define DISPID_IHTMLSTYLE2_POSRIGHT DISPID_STYLE+12
#define DISPID_IHTMLSTYLE2_IMEMODE DISPID_A_IMEMODE
#define DISPID_IHTMLSTYLE2_RUBYALIGN DISPID_A_RUBYALIGN
#define DISPID_IHTMLSTYLE2_RUBYPOSITION DISPID_A_RUBYPOSITION
#define DISPID_IHTMLSTYLE2_RUBYOVERHANG DISPID_A_RUBYOVERHANG
#define DISPID_IHTMLSTYLE2_LAYOUTGRIDCHAR DISPID_A_LAYOUTGRIDCHAR
#define DISPID_IHTMLSTYLE2_LAYOUTGRIDLINE DISPID_A_LAYOUTGRIDLINE
#define DISPID_IHTMLSTYLE2_LAYOUTGRIDMODE DISPID_A_LAYOUTGRIDMODE
#define DISPID_IHTMLSTYLE2_LAYOUTGRIDTYPE DISPID_A_LAYOUTGRIDTYPE
#define DISPID_IHTMLSTYLE2_LAYOUTGRID DISPID_A_LAYOUTGRID
#define DISPID_IHTMLSTYLE2_WORDBREAK DISPID_A_WORDBREAK
#define DISPID_IHTMLSTYLE2_LINEBREAK DISPID_A_LINEBREAK
#define DISPID_IHTMLSTYLE2_TEXTJUSTIFY DISPID_A_TEXTJUSTIFY
#define DISPID_IHTMLSTYLE2_TEXTJUSTIFYTRIM DISPID_A_TEXTJUSTIFYTRIM
#define DISPID_IHTMLSTYLE2_TEXTKASHIDA DISPID_A_TEXTKASHIDA
#define DISPID_IHTMLSTYLE2_TEXTAUTOSPACE DISPID_A_TEXTAUTOSPACE
#define DISPID_IHTMLSTYLE2_OVERFLOWX DISPID_A_OVERFLOWX
#define DISPID_IHTMLSTYLE2_OVERFLOWY DISPID_A_OVERFLOWY
#define DISPID_IHTMLSTYLE2_ACCELERATOR DISPID_A_ACCELERATOR
/* IHTMLStyle3 */
#define DISPID_IHTMLSTYLE3_LAYOUTFLOW DISPID_A_LAYOUTFLOW
#define DISPID_IHTMLSTYLE3_ZOOM DISPID_A_ZOOM
#define DISPID_IHTMLSTYLE3_WORDWRAP DISPID_A_WORDWRAP
#define DISPID_IHTMLSTYLE3_TEXTUNDERLINEPOSITION DISPID_A_TEXTUNDERLINEPOSITION
#define DISPID_IHTMLSTYLE3_SCROLLBARBASECOLOR DISPID_A_SCROLLBARBASECOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARFACECOLOR DISPID_A_SCROLLBARFACECOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBAR3DLIGHTCOLOR DISPID_A_SCROLLBAR3DLIGHTCOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARSHADOWCOLOR DISPID_A_SCROLLBARSHADOWCOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARHIGHLIGHTCOLOR DISPID_A_SCROLLBARHIGHLIGHTCOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARDARKSHADOWCOLOR DISPID_A_SCROLLBARDARKSHADOWCOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARARROWCOLOR DISPID_A_SCROLLBARARROWCOLOR
#define DISPID_IHTMLSTYLE3_SCROLLBARTRACKCOLOR DISPID_A_SCROLLBARTRACKCOLOR
#define DISPID_IHTMLSTYLE3_WRITINGMODE DISPID_A_WRITINGMODE
#define DISPID_IHTMLSTYLE3_TEXTALIGNLAST DISPID_A_TEXTALIGNLAST
#define DISPID_IHTMLSTYLE3_TEXTKASHIDASPACE DISPID_A_TEXTKASHIDASPACE
/* IHTMLStyle4 */
#define DISPID_IHTMLSTYLE4_TEXTOVERFLOW DISPID_A_TEXTOVERFLOW
#define DISPID_IHTMLSTYLE4_MINHEIGHT DISPID_A_MINHEIGHT
/* IHTMLFiltersCollection */
#define DISPID_IHTMLFILTERSCOLLECTION_LENGTH (DISPID_FILTERS+1)
#define DISPID_IHTMLFILTERSCOLLECTION__NEWENUM DISPID_NEWENUM
@ -1321,7 +1442,7 @@
#define DISPID_IHTMLWINDOW2_FRAMES 1100
#define DISPID_IHTMLWINDOW2_DEFAULTSTATUS 1101
#define DISPID_IHTMLWINDOW2_STATUS 1102
#define DISPID_IHTMLWINDOW2_SETTIMEOUT 1103
#define DISPID_IHTMLWINDOW2_SETTIMEOUT 1172
#define DISPID_IHTMLWINDOW2_CLEARTIMEOUT 1104
#define DISPID_IHTMLWINDOW2_ALERT 1105
#define DISPID_IHTMLWINDOW2_CONFIRM 1110
@ -1338,7 +1459,7 @@
#define DISPID_IHTMLWINDOW2_BLUR 1159
#define DISPID_IHTMLWINDOW2_SCROLL 1160
#define DISPID_IHTMLWINDOW2_CLIENTINFORMATION 1161
#define DISPID_IHTMLWINDOW2_SETINTERVAL 1162
#define DISPID_IHTMLWINDOW2_SETINTERVAL 1173
#define DISPID_IHTMLWINDOW2_CLEARINTERVAL 1163
#define DISPID_IHTMLWINDOW2_OFFSCREENBUFFERING 1164
#define DISPID_IHTMLWINDOW2_EXECSCRIPT 1165
@ -1356,6 +1477,23 @@
#define DISPID_IHTMLWINDOW2_ONRESIZE DISPID_EVPROP_ONRESIZE
#define DISPID_IHTMLWINDOW2_ONSCROLL DISPID_EVPROP_ONSCROLL
/* IHTMLWindow3 */
#define DISPID_IHTMLWINDOW3_SCREENLEFT 1170
#define DISPID_IHTMLWINDOW3_SCREENTOP 1171
#define DISPID_IHTMLWINDOW3_ATTACHEVENT DISPID_HTMLOBJECT+7
#define DISPID_IHTMLWINDOW3_DETACHEVENT DISPID_HTMLOBJECT+8
#define DISPID_IHTMLWINDOW3_SETTIMEOUT 1103
#define DISPID_IHTMLWINDOW3_SETINTERVAL 1162
#define DISPID_IHTMLWINDOW3_PRINT 1174
#define DISPID_IHTMLWINDOW3_ONBEFOREPRINT DISPID_EVPROP_ONBEFOREPRINT
#define DISPID_IHTMLWINDOW3_ONAFTERPRINT DISPID_EVPROP_ONAFTERPRINT
#define DISPID_IHTMLWINDOW3_CLIPBOARDDATA 1175
#define DISPID_IHTMLWINDOW3_SHOWMODELESSDIALOG 1176
/* IHTMLWindow4 */
#define DISPID_IHTMLWINDOW4_CREATEPOPUP 1180
#define DISPID_IHTMLWINDOW4_FRAMEELEMENT 1181
/* IHTMLImageElementFactory */
#define DISPID_IHTMLIMAGEELEMENTFACTORY_CREATE DISPID_VALUE
@ -1390,6 +1528,9 @@
#define DISPID_IHTMLIMGELEMENT_HEIGHT STDPROPID_XOBJ_HEIGHT
#define DISPID_IHTMLIMGELEMENT_START DISPID_IMGBASE+13
/* IHTMLImgElement2 */
#define DISPID_IHTMLIMGELEMENT2_LONGDESC DISPID_IMG+19
/* IOmHistory */
#define DISPID_IOMHISTORY_LENGTH DISPID_HISTORY
#define DISPID_IOMHISTORY_BACK (DISPID_HISTORY+1)
@ -1436,6 +1577,13 @@
#define DISPID_IHTMLOPSPROFILE_DOREADREQUEST 8
#define DISPID_IHTMLOPSPROFILE_DOWRITEREQUEST 9
/* IHTMLDataTransfer */
#define DISPID_IHTMLDATATRANSFER_SETDATA DISPID_DATATRANSFER+1
#define DISPID_IHTMLDATATRANSFER_GETDATA DISPID_DATATRANSFER+2
#define DISPID_IHTMLDATATRANSFER_CLEARDATA DISPID_DATATRANSFER+3
#define DISPID_IHTMLDATATRANSFER_DROPEFFECT DISPID_DATATRANSFER+4
#define DISPID_IHTMLDATATRANSFER_EFFECTALLOWED DISPID_DATATRANSFER+5
/* IHTMLEventObj */
#define DISPID_IHTMLEVENTOBJ_SRCELEMENT (DISPID_EVENTOBJ+1)
#define DISPID_IHTMLEVENTOBJ_ALTKEY (DISPID_EVENTOBJ+2)
@ -1481,6 +1629,9 @@
#define DISPID_IHTMLOPTIONELEMENT_TEXT (DISPID_OPTION+4)
#define DISPID_IHTMLOPTIONELEMENT_FORM (DISPID_OPTION+6)
/* IHTMLOptionElement3 */
#define DISPID_IHTMLOPTIONELEMENT3_LABEL DISPID_OPTION+7
/* IHTMLFormElement */
#define DISPID_IHTMLFORMELEMENT_ACTION (DISPID_FORM+1)
#define DISPID_IHTMLFORMELEMENT_DIR (DISPID_FORM+2)
@ -1639,6 +1790,19 @@
/* IHTMLDOMNode2 */
#define DISPID_IHTMLDOMNODE2_OWNERDOCUMENT DISPID_ELEMENT+113
/* IHTMLDOMTextNode */
#define DISPID_IHTMLDOMTEXTNODE_DATA DISPID_DOMTEXTNODE
#define DISPID_IHTMLDOMTEXTNODE_TOSTRING DISPID_DOMTEXTNODE+1
#define DISPID_IHTMLDOMTEXTNODE_LENGTH DISPID_DOMTEXTNODE+2
#define DISPID_IHTMLDOMTEXTNODE_SPLITTEXT DISPID_DOMTEXTNODE+3
/* IHTMLDOMTextNode2 */
#define DISPID_IHTMLDOMTEXTNODE2_SUBSTRINGDATA DISPID_DOMTEXTNODE+4
#define DISPID_IHTMLDOMTEXTNODE2_APPENDDATA DISPID_DOMTEXTNODE+5
#define DISPID_IHTMLDOMTEXTNODE2_INSERTDATA DISPID_DOMTEXTNODE+6
#define DISPID_IHTMLDOMTEXTNODE2_DELETEDATA DISPID_DOMTEXTNODE+7
#define DISPID_IHTMLDOMTEXTNODE2_REPLACEDATA DISPID_DOMTEXTNODE+8
/* IHTMLRenderStyle */
#define DISPID_IHTMLRENDERSTYLE_TEXTLINETHROUGHSTYLE DISPID_A_TEXTLINETHROUGHSTYLE
#define DISPID_IHTMLRENDERSTYLE_TEXTUNDERLINESTYLE DISPID_A_TEXTUNDERLINESTYLE
@ -1792,6 +1956,10 @@
#define DISPID_IHTMLINPUTELEMENT_HEIGHT STDPROPID_XOBJ_HEIGHT
#define DISPID_IHTMLINPUTELEMENT_START DISPID_INPUT+20
/* IHTMLInputElement2 */
#define DISPID_IHTMLINPUTELEMENT2_ACCEPT DISPID_INPUT+22
#define DISPID_IHTMLINPUTELEMENT2_USEMAP DISPID_INPUT+23
/* IHTMLInputTextElement */
#define DISPID_IHTMLINPUTTEXTELEMENT_TYPE DISPID_INPUT
#define DISPID_IHTMLINPUTTEXTELEMENT_VALUE DISPID_A_VALUE
@ -1826,6 +1994,12 @@
#define DISPID_IHTMLSELECTELEMENT_ITEM DISPID_VALUE
#define DISPID_IHTMLSELECTELEMENT_TAGS DISPID_COLLECTION+2
/* IHTMLSelectElement2 */
#define DISPID_IHTMLSELECTELEMENT2_URNS DISPID_COLLECTION+5
/* IHTMLSelectElement4 */
#define DISPID_IHTMLSELECTELEMENT4_NAMEDITEM DISPID_COLLECTION+6
/* IHTMLRect */
#define DISPID_IHTMLRECT_LEFT DISPID_OMRECT+1
#define DISPID_IHTMLRECT_TOP DISPID_OMRECT+2
@ -1950,6 +2124,19 @@
#define DISPID_IHTMLTABLECAPTION_ALIGN STDPROPID_XOBJ_BLOCKALIGN
#define DISPID_IHTMLTABLECAPTION_VALIGN DISPID_A_TABLEVALIGN
/* IHTMLCommentElement */
#define DISPID_IHTMLCOMMENTELEMENT_TEXT DISPID_COMMENTPDL+1
#define DISPID_IHTMLCOMMENTELEMENT_ATOMIC DISPID_COMMENTPDL+2
/* IHTMLCommentElement2 */
#define DISPID_IHTMLCOMMENTELEMENT2_DATA DISPID_COMMENTPDL+3
#define DISPID_IHTMLCOMMENTELEMENT2_LENGTH DISPID_COMMENTPDL+4
#define DISPID_IHTMLCOMMENTELEMENT2_SUBSTRINGDATA DISPID_COMMENTPDL+5
#define DISPID_IHTMLCOMMENTELEMENT2_APPENDDATA DISPID_COMMENTPDL+6
#define DISPID_IHTMLCOMMENTELEMENT2_INSERTDATA DISPID_COMMENTPDL+7
#define DISPID_IHTMLCOMMENTELEMENT2_DELETEDATA DISPID_COMMENTPDL+8
#define DISPID_IHTMLCOMMENTELEMENT2_REPLACEDATA DISPID_COMMENTPDL+9
/* IHTMLTable */
#define DISPID_IHTMLTABLE_COLS DISPID_TABLE+1
#define DISPID_IHTMLTABLE_BORDER DISPID_TABLE+2
@ -2006,6 +2193,17 @@
/* IHTMLScriptElement2 */
#define DISPID_IHTMLSCRIPTELEMENT2_CHARSET DISPID_SCRIPT+10
/* IHTMLFrameBase */
#define DISPID_IHTMLFRAMEBASE_SRC DISPID_FRAMESITE+0
#define DISPID_IHTMLFRAMEBASE_NAME STDPROPID_XOBJ_NAME
#define DISPID_IHTMLFRAMEBASE_BORDER DISPID_FRAMESITE+2
#define DISPID_IHTMLFRAMEBASE_FRAMEBORDER DISPID_FRAMESITE+3
#define DISPID_IHTMLFRAMEBASE_FRAMESPACING DISPID_FRAMESITE+4
#define DISPID_IHTMLFRAMEBASE_MARGINWIDTH DISPID_FRAMESITE+5
#define DISPID_IHTMLFRAMEBASE_MARGINHEIGHT DISPID_FRAMESITE+6
#define DISPID_IHTMLFRAMEBASE_NORESIZE DISPID_FRAMESITE+7
#define DISPID_IHTMLFRAMEBASE_SCROLLING DISPID_FRAMESITE+8
/* IHTMLFrameBase2 */
#define DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW DISPID_FRAMESITE+9
#define DISPID_IHTMLFRAMEBASE2_ONLOAD DISPID_EVPROP_ONLOAD

View file

@ -157,9 +157,9 @@ interface IDocHostUIHandler : IUnknown
} DOCHOSTUIINFO;
HRESULT ShowContextMenu(
[in] DWORD dwID,
[in] POINT *ppt,
[in] IUnknown *pcmdtReserved,
[in] DWORD dwID,
[in] POINT *ppt,
[in] IUnknown *pcmdtReserved,
[in] IDispatch *pdispReserved);
HRESULT GetHostInfo([in, out] DOCHOSTUIINFO *pInfo);
@ -188,7 +188,7 @@ interface IDocHostUIHandler : IUnknown
HRESULT TranslateAccelerator(
[in] LPMSG lpMsg,
[in] const GUID *pguidCmdGroup,
[in] const GUID *pguidCmdGroup,
[in] DWORD nCmdID);
HRESULT GetOptionKeyPath(
@ -196,7 +196,7 @@ interface IDocHostUIHandler : IUnknown
[in] DWORD dw);
HRESULT GetDropTarget(
[in] IDropTarget *pDropTarget,
[in] IDropTarget *pDropTarget,
[out] IDropTarget **ppDropTarget);
HRESULT GetExternal([out] IDispatch **ppDispatch);

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,8 @@
<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../../tools/rbuild/project.dtd">
<module name="psdk" type="idlheader">
<file>activaut.idl</file>
<file>activdbg.idl</file>
<file>activscp.idl</file>
<file>control.idl</file>
<file>dimm.idl</file>

View file

@ -41,7 +41,7 @@ typedef enum _ADDURL_FLAG
interface IEnumSTATURL : IUnknown
{
typedef [unique] IEnumSTATURL *LPENUMSTATURL;
typedef struct _STATURL
{
DWORD cbSize;
@ -78,7 +78,7 @@ interface IEnumSTATURL : IUnknown
interface IUrlHistoryStg : IUnknown
{
typedef [unique] IUrlHistoryStg *LPURLHISTORYSTG;
HRESULT AddUrl(
[in] LPCOLESTR pocsUrl,
[in, unique] LPCOLESTR pocsTitle,
@ -92,14 +92,14 @@ interface IUrlHistoryStg : IUnknown
[in] LPCOLESTR pocsUrl,
[in] DWORD dwFlags,
[in, out, unique] LPSTATURL lpSTATURL);
HRESULT BindToObject(
[in] LPCOLESTR pocsUrl,
[in] REFIID riid,
[out, iid_is(riid)] void **ppvOut);
HRESULT EnumUrls(
[out] IEnumSTATURL **ppEnum);
[out] IEnumSTATURL **ppEnum);
}
/*****************************************************************************

View file

@ -833,7 +833,8 @@ interface IInternetProtocolInfo : IUnknown
QUERY_IS_CACHED_OR_MAPPED,
QUERY_USES_CACHE,
QUERY_IS_SECURE,
QUERY_IS_SAFE
QUERY_IS_SAFE,
QUERY_USES_HISTORYFOLDER
} QUERYOPTION;
HRESULT ParseUrl(