Jacek Caban : mshtml: Support X-UA-Compatible HTTP header.

Alexandre Julliard julliard at winehq.org
Mon Feb 26 13:42:21 CST 2018


Module: wine
Branch: master
Commit: 9ae8b8c00f2cca205fdf4ce76e221778b7dfbea7
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9ae8b8c00f2cca205fdf4ce76e221778b7dfbea7

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Feb 26 18:21:11 2018 +0100

mshtml: Support X-UA-Compatible HTTP header.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/binding.h  |  1 +
 dlls/mshtml/mutation.c | 36 ++++++++++++++++++++++++++++++++++++
 dlls/mshtml/navigate.c |  9 ++++++++-
 3 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index 71c477a..f754bad 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -147,6 +147,7 @@ HRESULT load_uri(HTMLOuterWindow*,IUri*,DWORD) DECLSPEC_HIDDEN;
 HRESULT navigate_new_window(HTMLOuterWindow*,IUri*,const WCHAR*,request_data_t*,IHTMLWindow2**) DECLSPEC_HIDDEN;
 HRESULT navigate_url(HTMLOuterWindow*,const WCHAR*,IUri*,DWORD) DECLSPEC_HIDDEN;
 HRESULT submit_form(HTMLOuterWindow*,const WCHAR*,IUri*,nsIInputStream*) DECLSPEC_HIDDEN;
+void process_document_response_headers(HTMLDocumentNode*,IBinding*) DECLSPEC_HIDDEN;
 
 void init_bscallback(BSCallback*,const BSCallbackVtbl*,IMoniker*,DWORD) DECLSPEC_HIDDEN;
 HRESULT create_channelbsc(IMoniker*,const WCHAR*,BYTE*,DWORD,BOOL,nsChannelBSC**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c
index 4e1e053..555a99b 100644
--- a/dlls/mshtml/mutation.c
+++ b/dlls/mshtml/mutation.c
@@ -29,6 +29,7 @@
 #include "winreg.h"
 #include "ole2.h"
 #include "shlguid.h"
+#include "wininet.h"
 
 #include "mshtml_private.h"
 #include "htmlscript.h"
@@ -394,6 +395,8 @@ static BOOL parse_ua_compatible(const WCHAR *p, compat_mode_t *r)
 
     static const WCHAR edgeW[] = {'e','d','g','e',0};
 
+    TRACE("%s\n", debugstr_w(p));
+
     if(p[0] != 'I' || p[1] != 'E' || p[2] != '=')
         return FALSE;
     p += 3;
@@ -432,6 +435,39 @@ static BOOL parse_ua_compatible(const WCHAR *p, compat_mode_t *r)
     return TRUE;
 }
 
+void process_document_response_headers(HTMLDocumentNode *doc, IBinding *binding)
+{
+    IWinInetHttpInfo *http_info;
+    char buf[1024];
+    DWORD size;
+    HRESULT hres;
+
+    hres = IBinding_QueryInterface(binding, &IID_IWinInetHttpInfo, (void**)&http_info);
+    if(FAILED(hres)) {
+        TRACE("No IWinInetHttpInfo\n");
+        return;
+    }
+
+    size = sizeof(buf);
+    strcpy(buf, "X-UA-Compatible");
+    hres = IWinInetHttpInfo_QueryInfo(http_info, HTTP_QUERY_CUSTOM, buf, &size, NULL, NULL);
+    if(hres == S_OK && size) {
+        compat_mode_t document_mode;
+        WCHAR *header;
+
+        TRACE("size %u\n", size);
+
+        header = heap_strdupAtoW(buf);
+        if(header && parse_ua_compatible(header, &document_mode)) {
+            TRACE("setting document mode %d\n", document_mode);
+            doc->document_mode = document_mode;
+        }
+        heap_free(header);
+    }
+
+    IWinInetHttpInfo_Release(http_info);
+}
+
 static void process_meta_element(HTMLDocumentNode *doc, nsIDOMHTMLMetaElement *meta_element)
 {
     nsAString http_equiv_str, content_str;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index a8d3330..9d6076d 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1003,9 +1003,16 @@ static HRESULT on_start_nsrequest(nsChannelBSC *This)
     }
 
     if(This->is_doc_channel) {
+        HRESULT hres;
+
         if(!This->bsc.window)
             return E_ABORT; /* Binding aborted in OnStartRequest call. */
-        update_window_doc(This->bsc.window);
+        hres = update_window_doc(This->bsc.window);
+        if(FAILED(hres))
+            return hres;
+
+        if(This->bsc.binding)
+            process_document_response_headers(This->bsc.window->doc, This->bsc.binding);
         if(This->bsc.window->base.outer_window->readystate != READYSTATE_LOADING)
             set_ready_state(This->bsc.window->base.outer_window, READYSTATE_LOADING);
     }




More information about the wine-cvs mailing list