Commit d3d8d4f3 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Use IE version dependent on compatibility mode for conditional comments.

parent ce80f1e4
......@@ -3096,16 +3096,6 @@ static HRESULT WINAPI HTMLDocument6_get_documentMode(IHTMLDocument6 *iface, VARI
{
HTMLDocument *This = impl_from_IHTMLDocument6(iface);
static const int docmode_values[] = {
5, /* DOCMODE_QUIRKS */
5, /* DOCMODE_IE5 */
7, /* DOCMODE_IE7 */
8, /* DOCMODE_IE8 */
9, /* DOCMODE_IE8 */
10, /* DOCMODE_IE10 */
11 /* DOCMODE_IE11 */
};
TRACE("(%p)->(%p)\n", This, p);
if(!This->doc_node) {
......@@ -3113,10 +3103,8 @@ static HRESULT WINAPI HTMLDocument6_get_documentMode(IHTMLDocument6 *iface, VARI
return E_UNEXPECTED;
}
assert(This->doc_node->document_mode < sizeof(docmode_values)/sizeof(*docmode_values));
V_VT(p) = VT_I4;
V_I4(p) = docmode_values[This->doc_node->document_mode];
V_I4(p) = compat_mode_info[This->doc_node->document_mode].document_mode;
return S_OK;
}
......
......@@ -244,6 +244,13 @@ typedef enum {
#define COMPAT_MODE_CNT (COMPAT_MODE_IE11+1)
#define COMPAT_MODE_NONE COMPAT_MODE_QUIRKS
typedef struct {
unsigned document_mode;
unsigned ie_version;
} compat_mode_info_t;
extern const compat_mode_info_t compat_mode_info[COMPAT_MODE_CNT] DECLSPEC_HIDDEN;
typedef struct dispex_data_t dispex_data_t;
typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
......
......@@ -39,8 +39,15 @@
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
#define IE_MAJOR_VERSION 7
#define IE_MINOR_VERSION 0
const compat_mode_info_t compat_mode_info[] = {
{ 5, 7 }, /* DOCMODE_QUIRKS */
{ 5, 5 }, /* DOCMODE_IE5 */
{ 7, 7 }, /* DOCMODE_IE7 */
{ 8, 8 }, /* DOCMODE_IE8 */
{ 9, 9 }, /* DOCMODE_IE8 */
{ 10, 10 }, /* DOCMODE_IE10 */
{ 11, 11 } /* DOCMODE_IE11 */
};
static const IID NS_ICONTENTUTILS_CID =
{0x762C4AE7,0xB923,0x422F,{0xB9,0x7E,0xB9,0xBF,0xC1,0xEF,0x7B,0xF0}};
......@@ -49,7 +56,7 @@ static nsIContentUtils *content_utils;
static PRUnichar *handle_insert_comment(HTMLDocumentNode *doc, const PRUnichar *comment)
{
int majorv = 0, minorv = 0;
unsigned majorv = 0, minorv = 0, compat_version;
const PRUnichar *ptr, *end;
PRUnichar *buf;
DWORD len;
......@@ -130,33 +137,35 @@ static PRUnichar *handle_insert_comment(HTMLDocumentNode *doc, const PRUnichar *
if(memcmp(end, endifW, sizeof(endifW)))
return NULL;
compat_version = compat_mode_info[doc->document_mode].ie_version;
if(compat_version > 8) {
/*
* Ideally we should handle higher versions, but right now it would cause more problems than it's worth.
* We should revisit that once more IE9 features are implemented, most notably new events APIs.
*/
WARN("Using compat version 8\n");
compat_version = 8;
}
switch(cmpt) {
case CMP_EQ:
if(majorv == IE_MAJOR_VERSION && minorv == IE_MINOR_VERSION)
if(compat_version == majorv && !minorv)
break;
return NULL;
case CMP_LT:
if(majorv > IE_MAJOR_VERSION)
break;
if(majorv == IE_MAJOR_VERSION && minorv > IE_MINOR_VERSION)
if(compat_version < majorv || (compat_version == majorv && minorv))
break;
return NULL;
case CMP_LTE:
if(majorv > IE_MAJOR_VERSION)
break;
if(majorv == IE_MAJOR_VERSION && minorv >= IE_MINOR_VERSION)
if(compat_version <= majorv)
break;
return NULL;
case CMP_GT:
if(majorv < IE_MAJOR_VERSION)
break;
if(majorv == IE_MAJOR_VERSION && minorv < IE_MINOR_VERSION)
if(compat_version > majorv)
break;
return NULL;
case CMP_GTE:
if(majorv < IE_MAJOR_VERSION)
break;
if(majorv == IE_MAJOR_VERSION && minorv <= IE_MINOR_VERSION)
if(compat_version >= majorv || (compat_version == majorv && !minorv))
break;
return NULL;
}
......
......@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
var compat_version;
function test_elem_props() {
var elem = document.documentElement;
......@@ -35,17 +37,17 @@ function test_elem_props() {
}
function test_doc_mode() {
var opt = parseInt(document.location.search.substring(1));
compat_version = parseInt(document.location.search.substring(1));
trace("Testing document mode " + opt);
trace("Testing compatibility mode " + compat_version);
if(opt > document.documentMode) {
win_skip("Document mode not supported (expected " + opt + " got " + document.documentMode + ")");
if(compat_version > 6 && compat_version > document.documentMode) {
win_skip("Document mode not supported (expected " + compat_version + " got " + document.documentMode + ")");
reportSuccess();
return;
}
ok(opt === document.documentMode, "documentMode = " + document.documentMode);
ok(Math.max(compat_version, 5) === document.documentMode, "documentMode = " + document.documentMode);
if(document.documentMode > 5)
ok(document.compatMode === "CSS1Compat", "document.compatMode = " + document.compatMode);
......@@ -55,7 +57,44 @@ function test_doc_mode() {
next_test();
}
function test_conditional_comments() {
var div = document.createElement("div");
document.body.appendChild(div);
function test_version(v) {
var version = compat_version ? compat_version : 7;
/* Uncomment and fix tests below once we support that. */
if(version >= 9)
return;
div.innerHTML = "<!--[if lte IE " + v + "]>true<![endif]-->";
ok(div.innerText === (version <= v ? "true" : ""),
"div.innerText = " + div.innerText + " for version (<=) " + v);
div.innerHTML = "<!--[if lt IE " + v + "]>true<![endif]-->";
ok(div.innerText === (version < v ? "true" : ""),
"div.innerText = " + div.innerText + " for version (<) " + v);
div.innerHTML = "<!--[if gte IE " + v + "]>true<![endif]-->";
ok(div.innerText === (version >= v ? "true" : ""),
"div.innerText = " + div.innerText + " for version (>=) " + v);
div.innerHTML = "<!--[if gt IE " + v + "]>true<![endif]-->";
ok(div.innerText === (version > v ? "true" : ""),
"div.innerText = " + div.innerText + " for version (>) " + v);
}
test_version(5);
test_version(6);
test_version(7);
test_version(8);
next_test();
}
var tests = [
test_doc_mode,
test_elem_props
test_elem_props,
test_conditional_comments
];
......@@ -3462,7 +3462,7 @@ static void run_js_tests(void)
run_script_as_http_with_mode("navigation.js", NULL, NULL);
run_script_as_http_with_mode("navigation.js", NULL, "11");
run_script_as_http_with_mode("documentmode.js", "?5", NULL);
run_script_as_http_with_mode("documentmode.js", "?0", NULL);
run_script_as_http_with_mode("documentmode.js", "?5", "5");
run_script_as_http_with_mode("documentmode.js", "?5", "6");
run_script_as_http_with_mode("documentmode.js", "?7", "7");
......
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