Commit fa63e870 authored by Gabriel Ivăncescu's avatar Gabriel Ivăncescu Committed by Alexandre Julliard

mshtml: Return undefined from window.XMLHttpRequest for uninitialized documents.

parent c2b55387
...@@ -2038,6 +2038,11 @@ static HRESULT WINAPI HTMLWindow5_get_XMLHttpRequest(IHTMLWindow5 *iface, VARIAN ...@@ -2038,6 +2038,11 @@ static HRESULT WINAPI HTMLWindow5_get_XMLHttpRequest(IHTMLWindow5 *iface, VARIAN
TRACE("(%p)->(%p)\n", This, p); TRACE("(%p)->(%p)\n", This, p);
if(This->outer_window->readystate == READYSTATE_UNINITIALIZED) {
V_VT(p) = VT_EMPTY;
return S_OK;
}
if(!window->xhr_factory) { if(!window->xhr_factory) {
HRESULT hres; HRESULT hres;
......
...@@ -11800,12 +11800,23 @@ static void test_quirks_mode(void) ...@@ -11800,12 +11800,23 @@ static void test_quirks_mode(void)
static void test_document_mode_lock(void) static void test_document_mode_lock(void)
{ {
IHTMLOptionElementFactory *option, *option2;
IHTMLDocument2 *doc, *doc_node, *doc_node2;
IHTMLImageElementFactory *image, *image2;
IOmNavigator *navigator, *navigator2;
IHTMLLocation *location, *location2;
IHTMLPerformance *perf, *perf2;
IOmHistory *history, *history2;
IHTMLScreen *screen, *screen2;
IEventTarget *event_target; IEventTarget *event_target;
IPersistStreamInit *init; IPersistStreamInit *init;
IHTMLDocument2 *doc; IHTMLWindow7 *window7;
IHTMLWindow5 *window5;
IHTMLWindow2 *window;
IStream *stream; IStream *stream;
HRESULT hres; HRESULT hres;
HGLOBAL mem; HGLOBAL mem;
VARIANT var;
SIZE_T len; SIZE_T len;
MSG msg; MSG msg;
...@@ -11818,6 +11829,49 @@ static void test_document_mode_lock(void) ...@@ -11818,6 +11829,49 @@ static void test_document_mode_lock(void)
ok(hres == E_NOINTERFACE, "QueryInterface(IID_IEventTarget) returned %08lx.\n", hres); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IEventTarget) returned %08lx.\n", hres);
ok(event_target == NULL, "event_target != NULL\n"); ok(event_target == NULL, "event_target != NULL\n");
hres = IHTMLDocument2_get_parentWindow(doc, &window);
ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
hres = IHTMLWindow2_get_document(window, &doc_node);
ok(hres == S_OK, "get_document failed: %08lx\n", hres);
hres = IHTMLWindow2_get_location(window, &location);
ok(hres == S_OK, "get_location failed: %08lx\n", hres);
hres = IHTMLWindow2_get_navigator(window, &navigator);
ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
hres = IHTMLWindow2_get_history(window, &history);
ok(hres == S_OK, "get_history failed: %08lx\n", hres);
hres = IHTMLWindow2_get_screen(window, &screen);
ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
hres = IHTMLWindow2_get_Image(window, &image);
ok(hres == S_OK, "get_image failed: %08lx\n", hres);
hres = IHTMLWindow2_get_Option(window, &option);
ok(hres == S_OK, "get_option failed: %08lx\n", hres);
V_VT(&var) = VT_NULL;
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
ok(hres == S_OK, "Could not get IHTMLWindow5: %08lx\n", hres);
hres = IHTMLWindow5_get_XMLHttpRequest(window5, &var);
ok(hres == S_OK, "get_XMLHttpRequest failed: %08lx\n", hres);
ok(V_VT(&var) == VT_EMPTY, "V_VT(XMLHttpRequest) = %d\n", V_VT(&var));
IHTMLWindow5_Release(window5);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
hres = IHTMLWindow7_get_performance(window7, &var);
ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
ok(V_VT(&var) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&var));
hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLPerformance, (void**)&perf);
ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
IHTMLWindow7_Release(window7);
IHTMLWindow2_Release(window);
VariantClear(&var);
len = strlen(doc_blank_ie9); len = strlen(doc_blank_ie9);
mem = GlobalAlloc(0, len); mem = GlobalAlloc(0, len);
memcpy(mem, doc_blank_ie9, len); memcpy(mem, doc_blank_ie9, len);
...@@ -11844,6 +11898,64 @@ static void test_document_mode_lock(void) ...@@ -11844,6 +11898,64 @@ static void test_document_mode_lock(void)
ok(event_target != NULL, "event_target == NULL\n"); ok(event_target != NULL, "event_target == NULL\n");
IEventTarget_Release(event_target); IEventTarget_Release(event_target);
hres = IHTMLDocument2_get_parentWindow(doc, &window);
ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
hres = IHTMLWindow2_get_document(window, &doc_node2);
ok(hres == S_OK, "get_document failed: %08lx\n", hres);
ok(doc_node != doc_node2, "doc_node == doc_node2\n");
IHTMLDocument2_Release(doc_node2);
IHTMLDocument2_Release(doc_node);
hres = IHTMLWindow2_get_location(window, &location2);
ok(hres == S_OK, "get_location failed: %08lx\n", hres);
todo_wine
ok(location == location2, "location != location2\n");
IHTMLLocation_Release(location2);
IHTMLLocation_Release(location);
hres = IHTMLWindow2_get_navigator(window, &navigator2);
ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
ok(navigator != navigator2, "navigator == navigator2\n");
IOmNavigator_Release(navigator2);
IOmNavigator_Release(navigator);
hres = IHTMLWindow2_get_history(window, &history2);
ok(hres == S_OK, "get_history failed: %08lx\n", hres);
ok(history != history2, "history == history2\n");
IOmHistory_Release(history2);
IOmHistory_Release(history);
hres = IHTMLWindow2_get_screen(window, &screen2);
ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
ok(screen != screen2, "screen == screen2\n");
IHTMLScreen_Release(screen2);
IHTMLScreen_Release(screen);
hres = IHTMLWindow2_get_Image(window, &image2);
ok(hres == S_OK, "get_image failed: %08lx\n", hres);
ok(image != image2, "image == image2\n");
IHTMLImageElementFactory_Release(image2);
IHTMLImageElementFactory_Release(image);
hres = IHTMLWindow2_get_Option(window, &option2);
ok(hres == S_OK, "get_option failed: %08lx\n", hres);
ok(option != option2, "option == option2\n");
IHTMLOptionElementFactory_Release(option2);
IHTMLOptionElementFactory_Release(option);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
hres = IHTMLWindow7_get_performance(window7, &var);
ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
ok(V_VT(&var) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&var));
hres = IDispatch_QueryInterface(V_DISPATCH(&var), &IID_IHTMLPerformance, (void**)&perf2);
ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
ok(perf != perf2, "perf == perf2\n");
IHTMLWindow7_Release(window7);
IHTMLWindow2_Release(window);
VariantClear(&var);
set_client_site(doc, FALSE); set_client_site(doc, FALSE);
IHTMLDocument2_Release(doc); IHTMLDocument2_Release(doc);
} }
......
...@@ -3135,9 +3135,22 @@ static void test_iframe_connections(IHTMLDocument2 *doc) ...@@ -3135,9 +3135,22 @@ static void test_iframe_connections(IHTMLDocument2 *doc)
static void test_doc_obj(IHTMLDocument2 *doc) static void test_doc_obj(IHTMLDocument2 *doc)
{ {
DISPID dispid, import_node_id, has_own_prop_id; DISPID dispid, import_node_id, has_own_prop_id;
IHTMLOptionElementFactory *option, *option2;
IHTMLImageElementFactory *image, *image2;
IHTMLXMLHttpRequestFactory *xhr, *xhr2;
IHTMLDocument2 *doc_node, *doc_node2;
IOmNavigator *navigator, *navigator2;
IHTMLLocation *location, *location2;
int orig_doc_mode = document_mode; int orig_doc_mode = document_mode;
IHTMLStorage *storage, *storage2;
IHTMLPerformance *perf, *perf2;
IOmHistory *history, *history2;
IHTMLScreen *screen, *screen2;
IEventTarget *event_target; IEventTarget *event_target;
DISPPARAMS dp = { 0 }; DISPPARAMS dp = { 0 };
IHTMLWindow7 *window7;
IHTMLWindow6 *window6;
IHTMLWindow5 *window5;
IDispatchEx *dispex; IDispatchEx *dispex;
IHTMLElement *body; IHTMLElement *body;
VARIANT res, arg; VARIANT res, arg;
...@@ -3246,6 +3259,54 @@ static void test_doc_obj(IHTMLDocument2 *doc) ...@@ -3246,6 +3259,54 @@ static void test_doc_obj(IHTMLDocument2 *doc)
SysFreeString(V_BSTR(&arg)); SysFreeString(V_BSTR(&arg));
} }
/* test window props during navigation */
hres = IHTMLWindow2_get_document(window, &doc_node);
ok(hres == S_OK, "get_document failed: %08lx\n", hres);
hres = IHTMLWindow2_get_location(window, &location);
ok(hres == S_OK, "get_location failed: %08lx\n", hres);
hres = IHTMLWindow2_get_navigator(window, &navigator);
ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
hres = IHTMLWindow2_get_history(window, &history);
ok(hres == S_OK, "get_history failed: %08lx\n", hres);
hres = IHTMLWindow2_get_screen(window, &screen);
ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
hres = IHTMLWindow2_get_Image(window, &image);
ok(hres == S_OK, "get_image failed: %08lx\n", hres);
hres = IHTMLWindow2_get_Option(window, &option);
ok(hres == S_OK, "get_option failed: %08lx\n", hres);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
ok(hres == S_OK, "Could not get IHTMLWindow5: %08lx\n", hres);
hres = IHTMLWindow5_get_XMLHttpRequest(window5, &res);
ok(hres == S_OK, "get_XMLHttpRequest failed: %08lx\n", hres);
ok(V_VT(&res) == VT_DISPATCH, "V_VT(XMLHttpRequest) = %d\n", V_VT(&res));
hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLXMLHttpRequestFactory, (void**)&xhr);
ok(hres == S_OK, "Could not get IHTMLXMLHttpRequestFactory: %08lx\n", hres);
IHTMLWindow5_Release(window5);
VariantClear(&res);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
ok(hres == S_OK, "Could not get IHTMLWindow6: %08lx\n", hres);
hres = IHTMLWindow6_get_sessionStorage(window6, &storage);
ok(hres == S_OK, "get_sessionStorage failed: %08lx\n", hres);
IHTMLWindow6_Release(window6);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
hres = IHTMLWindow7_get_performance(window7, &res);
ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
ok(V_VT(&res) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&res));
hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLPerformance, (void**)&perf);
ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
IHTMLWindow7_Release(window7);
VariantClear(&res);
/* Navigate to a different document mode page, checking using the same doc obj. /* Navigate to a different document mode page, checking using the same doc obj.
Test that it breaks COM rules, since IEventTarget is conditionally exposed. Test that it breaks COM rules, since IEventTarget is conditionally exposed.
All the events registered on the old doc node are also removed. All the events registered on the old doc node are also removed.
...@@ -3286,6 +3347,84 @@ static void test_doc_obj(IHTMLDocument2 *doc) ...@@ -3286,6 +3347,84 @@ static void test_doc_obj(IHTMLDocument2 *doc)
ok(hres == S_OK, "GetIDsOfNames(importNode) returned: %08lx\n", hres); ok(hres == S_OK, "GetIDsOfNames(importNode) returned: %08lx\n", hres);
ok(dispid != import_node_id, "importNode on new doc node == old created importNode\n"); ok(dispid != import_node_id, "importNode on new doc node == old created importNode\n");
} }
hres = IHTMLWindow2_get_document(window, &doc_node2);
ok(hres == S_OK, "get_document failed: %08lx\n", hres);
ok(doc_node != doc_node2, "doc_node == doc_node2\n");
IHTMLDocument2_Release(doc_node2);
IHTMLDocument2_Release(doc_node);
hres = IHTMLWindow2_get_location(window, &location2);
ok(hres == S_OK, "get_location failed: %08lx\n", hres);
todo_wine
ok(location == location2, "location != location2\n");
IHTMLLocation_Release(location2);
IHTMLLocation_Release(location);
hres = IHTMLWindow2_get_navigator(window, &navigator2);
ok(hres == S_OK, "get_navigator failed: %08lx\n", hres);
ok(navigator != navigator2, "navigator == navigator2\n");
IOmNavigator_Release(navigator2);
IOmNavigator_Release(navigator);
hres = IHTMLWindow2_get_history(window, &history2);
ok(hres == S_OK, "get_history failed: %08lx\n", hres);
ok(history != history2, "history == history2\n");
IOmHistory_Release(history2);
IOmHistory_Release(history);
hres = IHTMLWindow2_get_screen(window, &screen2);
ok(hres == S_OK, "get_screen failed: %08lx\n", hres);
ok(screen != screen2, "screen == screen2\n");
IHTMLScreen_Release(screen2);
IHTMLScreen_Release(screen);
hres = IHTMLWindow2_get_Image(window, &image2);
ok(hres == S_OK, "get_image failed: %08lx\n", hres);
ok(image != image2, "image == image2\n");
IHTMLImageElementFactory_Release(image2);
IHTMLImageElementFactory_Release(image);
hres = IHTMLWindow2_get_Option(window, &option2);
ok(hres == S_OK, "get_option failed: %08lx\n", hres);
ok(option != option2, "option == option2\n");
IHTMLOptionElementFactory_Release(option2);
IHTMLOptionElementFactory_Release(option);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow5, (void**)&window5);
ok(hres == S_OK, "Could not get IHTMLWindow5: %08lx\n", hres);
hres = IHTMLWindow5_get_XMLHttpRequest(window5, &res);
ok(hres == S_OK, "get_XMLHttpRequest failed: %08lx\n", hres);
ok(V_VT(&res) == VT_DISPATCH, "V_VT(XMLHttpRequest) = %d\n", V_VT(&res));
hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLXMLHttpRequestFactory, (void**)&xhr2);
ok(hres == S_OK, "Could not get IHTMLXMLHttpRequestFactory: %08lx\n", hres);
ok(xhr != xhr2, "xhr == xhr2\n");
IHTMLXMLHttpRequestFactory_Release(xhr2);
IHTMLXMLHttpRequestFactory_Release(xhr);
IHTMLWindow5_Release(window5);
VariantClear(&res);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
ok(hres == S_OK, "Could not get IHTMLWindow6: %08lx\n", hres);
hres = IHTMLWindow6_get_sessionStorage(window6, &storage2);
ok(hres == S_OK, "get_sessionStorage failed: %08lx\n", hres);
ok(storage != storage2, "storage == storage2\n");
IHTMLStorage_Release(storage2);
IHTMLStorage_Release(storage);
IHTMLWindow6_Release(window6);
hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow7, (void**)&window7);
ok(hres == S_OK, "Could not get IHTMLWindow7: %08lx\n", hres);
hres = IHTMLWindow7_get_performance(window7, &res);
ok(hres == S_OK, "get_performance failed: %08lx\n", hres);
ok(V_VT(&res) == VT_DISPATCH, "V_VT(performance) = %d\n", V_VT(&res));
hres = IDispatch_QueryInterface(V_DISPATCH(&res), &IID_IHTMLPerformance, (void**)&perf2);
ok(hres == S_OK, "Could not get IHTMLPerformance: %08lx\n", hres);
ok(perf != perf2, "perf == perf2\n");
IHTMLPerformance_Release(perf2);
IHTMLPerformance_Release(perf);
IHTMLWindow7_Release(window7);
VariantClear(&res);
} }
static void test_create_event(IHTMLDocument2 *doc) static void test_create_event(IHTMLDocument2 *doc)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment