mshtml: Expose XMLHttpRequest constructor to scripts.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2016-02-24 15:21:24 +01:00 committed by Alexandre Julliard
parent 5996de5c2e
commit c0fda9824e
5 changed files with 69 additions and 20 deletions

View file

@ -241,8 +241,8 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN
if(info == data->funcs+data->func_cnt) {
if(data->func_cnt == *size)
data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t));
info = data->funcs+data->func_cnt;
hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL);
if(FAILED(hres))
return;
@ -315,6 +315,31 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN
}
}
static HRESULT process_interface(dispex_data_t *data, tid_t tid, ITypeInfo *disp_typeinfo, DWORD *size)
{
unsigned i = 7; /* skip IDispatch functions */
ITypeInfo *typeinfo;
FUNCDESC *funcdesc;
HRESULT hres;
hres = get_typeinfo(tid, &typeinfo);
if(FAILED(hres))
return hres;
while(1) {
hres = ITypeInfo_GetFuncDesc(typeinfo, i++, &funcdesc);
if(FAILED(hres))
break;
TRACE("adding...\n");
add_func_info(data, size, tid, funcdesc, disp_typeinfo ? disp_typeinfo : typeinfo);
ITypeInfo_ReleaseFuncDesc(typeinfo, funcdesc);
}
return S_OK;
}
static int dispid_cmp(const void *p1, const void *p2)
{
return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id;
@ -327,11 +352,10 @@ static int func_name_cmp(const void *p1, const void *p2)
static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
{
const tid_t *tid = This->data->iface_tids;
FUNCDESC *funcdesc;
const tid_t *tid;
dispex_data_t *data;
DWORD size = 16, i;
ITypeInfo *ti, *dti;
ITypeInfo *dti;
HRESULT hres;
TRACE("(%p)\n", This);
@ -359,24 +383,15 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
}
list_add_tail(&dispex_data_list, &data->entry);
while(*tid) {
hres = get_typeinfo(*tid, &ti);
for(tid = This->data->iface_tids; *tid; tid++) {
hres = process_interface(data, *tid, dti, &size);
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, dti);
ITypeInfo_ReleaseFuncDesc(ti, funcdesc);
}
tid++;
}
if(This->data->additional_tid)
process_interface(data, This->data->additional_tid, NULL, &size);
if(!data->func_cnt) {
heap_free(data->funcs);
data->name_table = NULL;
@ -392,7 +407,6 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
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);
return data;
}

View file

@ -2939,7 +2939,8 @@ static dispex_static_data_t HTMLWindow_dispex = {
&HTMLWindow_dispex_vtbl,
DispHTMLWindow2_tid,
NULL,
HTMLWindow_iface_tids
HTMLWindow_iface_tids,
IHTMLWindow5_tid
};
static void *alloc_window(size_t size)

View file

@ -248,6 +248,7 @@ typedef struct {
const tid_t disp_tid;
dispex_data_t *data;
const tid_t* const iface_tids;
const tid_t additional_tid;
} dispex_static_data_t;
struct DispatchEx {

View file

@ -6598,6 +6598,28 @@ static void test_dom_implementation(IHTMLDocument2 *doc)
IHTMLDOMImplementation_Release(dom_implementation);
}
static void test_xhr(IHTMLDocument2 *doc)
{
IHTMLWindow2 *window;
IDispatchEx *dispex;
DISPID id;
BSTR str;
HRESULT hres;
hres = IHTMLDocument2_get_parentWindow(doc, &window);
ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
hres = IHTMLWindow2_QueryInterface(window, &IID_IDispatchEx, (void**)&dispex);
ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
str = a2bstr("XMLHttpRequest");
hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
SysFreeString(str);
IHTMLWindow2_Release(window);
}
static void test_defaults(IHTMLDocument2 *doc)
{
IHTMLStyleSheetsCollection *stylesheetcol;
@ -6670,6 +6692,8 @@ static void test_defaults(IHTMLDocument2 *doc)
IHTMLElementCollection_Release(collection);
}
test_xhr(doc);
hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
ok(hres == S_OK, "Could not get IHTMBodyElement: %08x\n", hres);
test_default_body(body);

View file

@ -354,6 +354,14 @@ function test_text_node() {
ok(text2.data == "testing", "text2.data = " + text2.data);
}
function test_xhr() {
ok("XMLHttpRequest" in window, "XMLHttpRequest not found in window object\n");
ok(typeof(XMLHttpRequest) === "object", "typeof(XMLHttpRequest) = " + typeof(XMLHttpRequest));
var xhr = new XMLHttpRequest();
ok(typeof(xhr) === "object", "typeof(xhr) = " + typeof(xhr));
}
var globalVar = false;
function runTests() {
@ -379,6 +387,7 @@ function runTests() {
test_whitespace_nodes();
test_language_attribute();
test_text_node();
test_xhr();
var r = window.execScript("globalVar = true;");
ok(r === undefined, "execScript returned " + r);