2015-11-14 17:33 GMT+08:00 Zhenbo Li <litimetal@gmail.com>:Also, I found that there was a hidden bug: As we will test these urls for responseXML: static const char xml_url[] = "http://test.winehq.org/tests/xmltest.xml"; static const char large_page_url[] = "http://test.winehq.org/tests/data.php"; char large_page_url is not a valid xml file, but native mshtml.dll can handle it properly. It shows we can't just past the responseText to msxml3.dll. I'll check it more carefully it later.Hi, sorry for my late reply. I tested it on testbot, and found that Windows mshtml.dll would return an empty xml object
static BOOL doc_complete; static IHTMLDocument2 *notif_doc; +static BOOL ILLEGAL_XML;
@@ -334,8 +337,52 @@ static HRESULT WINAPI HTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest *i
static HRESULT WINAPI HTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest *iface, IDispatch **p)
{
HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ IXMLDOMDocument *xmldoc = NULL;
+ BSTR str;
+ HRESULT hres;
+ VARIANT_BOOL vbool;
+ IObjectSafety *safety;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ hres = CoCreateInstance(&CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void**)&xmldoc);
+ if(FAILED(hres)) {
+ ERR("CoCreateInstance failed: %08x\n", hres);
+ return hres;
+ }
+
+ hres = IHTMLXMLHttpRequest_get_responseText(iface, &str);
+ if(FAILED(hres)) {
+ IXMLDOMDocument_Release(xmldoc);
+ ERR("get_responseText failed: %08x\n", hres);
+ return hres;
+ }
+
+ hres = IXMLDOMDocument_loadXML(xmldoc, str, &vbool);
+ SysFreeString(str);
+ if(hres != S_OK || vbool != VARIANT_TRUE) {
+ ERR("loadXML failed: %08x, returning an cmpty xmldoc\n", hres);
+ }
+
+ hres = IXMLDOMDocument_QueryInterface(xmldoc, &IID_IObjectSafety, (void**)&safety);
+ if(SUCCEEDED(hres)) {
+ hres = IObjectSafety_SetInterfaceSafetyOptions(safety, NULL,
+ INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER,
+ INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA | INTERFACE_USES_SECURITY_MANAGER);
+ IObjectSafety_Release(safety);
+ if(FAILED(hres)) {