Jacek Caban : mshtml: Expose XMLHttpRequest constructor to scripts.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Feb 24 11:01:43 CST 2016
Module: wine
Branch: master
Commit: c0fda9824e213e5a779bddfba6052dfc20b9c8d3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0fda9824e213e5a779bddfba6052dfc20b9c8d3
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Feb 24 15:21:24 2016 +0100
mshtml: Expose XMLHttpRequest constructor to scripts.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/dispex.c | 52 +++++++++++++++++++++++++++----------------
dlls/mshtml/htmlwindow.c | 3 ++-
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/tests/dom.c | 24 ++++++++++++++++++++
dlls/mshtml/tests/jstest.html | 9 ++++++++
5 files changed, 69 insertions(+), 20 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 3980daf..90e5c72 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -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;
}
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index d7d133a..f203405 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -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)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 1f0255f..f4e6668 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -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 {
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 4b2b825..e27339a 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -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);
diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html
index f0d3e3b..2a5a447 100644
--- a/dlls/mshtml/tests/jstest.html
+++ b/dlls/mshtml/tests/jstest.html
@@ -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);
More information about the wine-cvs
mailing list