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:
parent
5996de5c2e
commit
c0fda9824e
@ -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(info == data->funcs+data->func_cnt) {
|
||||||
if(data->func_cnt == *size)
|
if(data->func_cnt == *size)
|
||||||
data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t));
|
data->funcs = heap_realloc_zero(data->funcs, (*size <<= 1)*sizeof(func_info_t));
|
||||||
|
|
||||||
info = data->funcs+data->func_cnt;
|
info = data->funcs+data->func_cnt;
|
||||||
|
|
||||||
hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL);
|
hres = ITypeInfo_GetDocumentation(dti, desc->memid, &info->name, NULL, NULL, NULL);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
return;
|
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)
|
static int dispid_cmp(const void *p1, const void *p2)
|
||||||
{
|
{
|
||||||
return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id;
|
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)
|
static dispex_data_t *preprocess_dispex_data(DispatchEx *This)
|
||||||
{
|
{
|
||||||
const tid_t *tid = This->data->iface_tids;
|
const tid_t *tid;
|
||||||
FUNCDESC *funcdesc;
|
|
||||||
dispex_data_t *data;
|
dispex_data_t *data;
|
||||||
DWORD size = 16, i;
|
DWORD size = 16, i;
|
||||||
ITypeInfo *ti, *dti;
|
ITypeInfo *dti;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
TRACE("(%p)\n", This);
|
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);
|
list_add_tail(&dispex_data_list, &data->entry);
|
||||||
|
|
||||||
while(*tid) {
|
for(tid = This->data->iface_tids; *tid; tid++) {
|
||||||
hres = get_typeinfo(*tid, &ti);
|
hres = process_interface(data, *tid, dti, &size);
|
||||||
if(FAILED(hres))
|
if(FAILED(hres))
|
||||||
break;
|
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) {
|
if(!data->func_cnt) {
|
||||||
heap_free(data->funcs);
|
heap_free(data->funcs);
|
||||||
data->name_table = NULL;
|
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++)
|
for(i=0; i < data->func_cnt; i++)
|
||||||
data->name_table[i] = data->funcs+i;
|
data->name_table[i] = data->funcs+i;
|
||||||
qsort(data->name_table, data->func_cnt, sizeof(func_info_t*), func_name_cmp);
|
qsort(data->name_table, data->func_cnt, sizeof(func_info_t*), func_name_cmp);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2939,7 +2939,8 @@ static dispex_static_data_t HTMLWindow_dispex = {
|
|||||||
&HTMLWindow_dispex_vtbl,
|
&HTMLWindow_dispex_vtbl,
|
||||||
DispHTMLWindow2_tid,
|
DispHTMLWindow2_tid,
|
||||||
NULL,
|
NULL,
|
||||||
HTMLWindow_iface_tids
|
HTMLWindow_iface_tids,
|
||||||
|
IHTMLWindow5_tid
|
||||||
};
|
};
|
||||||
|
|
||||||
static void *alloc_window(size_t size)
|
static void *alloc_window(size_t size)
|
||||||
|
@ -248,6 +248,7 @@ typedef struct {
|
|||||||
const tid_t disp_tid;
|
const tid_t disp_tid;
|
||||||
dispex_data_t *data;
|
dispex_data_t *data;
|
||||||
const tid_t* const iface_tids;
|
const tid_t* const iface_tids;
|
||||||
|
const tid_t additional_tid;
|
||||||
} dispex_static_data_t;
|
} dispex_static_data_t;
|
||||||
|
|
||||||
struct DispatchEx {
|
struct DispatchEx {
|
||||||
|
@ -6598,6 +6598,28 @@ static void test_dom_implementation(IHTMLDocument2 *doc)
|
|||||||
IHTMLDOMImplementation_Release(dom_implementation);
|
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)
|
static void test_defaults(IHTMLDocument2 *doc)
|
||||||
{
|
{
|
||||||
IHTMLStyleSheetsCollection *stylesheetcol;
|
IHTMLStyleSheetsCollection *stylesheetcol;
|
||||||
@ -6670,6 +6692,8 @@ static void test_defaults(IHTMLDocument2 *doc)
|
|||||||
IHTMLElementCollection_Release(collection);
|
IHTMLElementCollection_Release(collection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_xhr(doc);
|
||||||
|
|
||||||
hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
|
hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLBodyElement, (void**)&body);
|
||||||
ok(hres == S_OK, "Could not get IHTMBodyElement: %08x\n", hres);
|
ok(hres == S_OK, "Could not get IHTMBodyElement: %08x\n", hres);
|
||||||
test_default_body(body);
|
test_default_body(body);
|
||||||
|
@ -354,6 +354,14 @@ function test_text_node() {
|
|||||||
ok(text2.data == "testing", "text2.data = " + text2.data);
|
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;
|
var globalVar = false;
|
||||||
|
|
||||||
function runTests() {
|
function runTests() {
|
||||||
@ -379,6 +387,7 @@ function runTests() {
|
|||||||
test_whitespace_nodes();
|
test_whitespace_nodes();
|
||||||
test_language_attribute();
|
test_language_attribute();
|
||||||
test_text_node();
|
test_text_node();
|
||||||
|
test_xhr();
|
||||||
|
|
||||||
var r = window.execScript("globalVar = true;");
|
var r = window.execScript("globalVar = true;");
|
||||||
ok(r === undefined, "execScript returned " + r);
|
ok(r === undefined, "execScript returned " + r);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user