-- v5: mshtml: Don't expose some props from document prototype depending on mode. mshtml: Expose the right props from document fragments. mshtml: Use DocumentPrototype as the document's prototype for modes prior mshtml: Move HTMLDocument prototype props to the Document prototype.
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 3 ++ dlls/mshtml/tests/documentmode.js | 50 +++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 853a75cfaaf..1ff8eaf4c19 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5708,6 +5708,9 @@ static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t dispex_static_data_t Document_dispex = { .id = PROT_Document, .prototype_id = PROT_Node, + .disp_tid = DispHTMLDocument_tid, + .iface_tids = HTMLDocumentNode_iface_tids, + .init_info = HTMLDocumentNode_init_dispex_info, };
dispex_static_data_t HTMLDocument_dispex = { diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 14c73550949..aa47927a284 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3694,6 +3694,54 @@ sync_test("prototype props", function() { check(Comment, [ "text" ]); check(CSSStyleRule, [ "readOnly", "selectorText", "style" ]); check(CustomEvent, [ "detail", "initCustomEvent" ]); + check(Document, [ + "Script", "URL", "URLUnencoded", "activeElement", "adoptNode", "alinkColor", "all", "anchors", "applets", ["attachEvent",9,10], + "bgColor", "body", ["captureEvents",11], "characterSet", "charset", ["clear",10], "close", "compatMode", "compatible", "cookie", + "createAttribute", "createAttributeNS", "createCDATASection", "createComment", "createDocumentFragment", "createElement", + "createElementNS", "createEvent", ["createEventObject",9,10], "createNodeIterator", "createProcessingInstruction", "createRange", + ["createStyleSheet",9,10], "createTextNode", "createTreeWalker", "defaultCharset", "defaultView", "designMode", + ["detachEvent",9,10], "dir", "doctype", "documentElement", "documentMode", "domain", "elementFromPoint", "embeds", "execCommand", + "execCommandShowHelp", "fgColor", "fileCreatedDate", "fileModifiedDate", ["fileSize",9,10], "fileUpdatedDate", ["fireEvent",9,10], + "focus", "forms", "frames", "getElementById", "getElementsByClassName", "getElementsByName", "getElementsByTagName", + "getElementsByTagNameNS", "getSelection", "hasFocus", "head", ["hidden",10], "images", "implementation", "importNode", + "inputEncoding", "lastModified", "linkColor", "links", "location", "media", "mimeType", ["msCSSOMElementFloatMetrics",10], + "msCapsLockWarningOff", ["msElementsFromPoint",10], ["msElementsFromRect",10], ["msExitFullscreen",11], ["msFullscreenElement",11], + ["msFullscreenEnabled",11], ["msHidden",10], ["msVisibilityState",10], "nameProp", ["namespaces",9,9], "onabort", "onactivate", + ["onafterupdate",9,10], "onbeforeactivate", "onbeforedeactivate", ["onbeforeeditfocus",9,10], ["onbeforeupdate",9,10], "onblur", + "oncanplay", "oncanplaythrough", ["oncellchange",9,10], "onchange", "onclick", "oncontextmenu", ["oncontrolselect",9,10], + ["ondataavailable",9,10], ["ondatasetchanged",9,10], ["ondatasetcomplete",9,10], "ondblclick", "ondeactivate", "ondrag", "ondragend", + "ondragenter", "ondragleave", "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied", "onended", "onerror", + ["onerrorupdate",9,10], "onfocus", "onfocusin", "onfocusout", "onhelp", "oninput", "onkeydown", "onkeypress", "onkeyup", "onload", + "onloadeddata", "onloadedmetadata", "onloadstart", "onmousedown", "onmousemove", "onmouseout", "onmouseover", "onmouseup", + "onmousewheel", ["onmscontentzoom",10], ["onmsfullscreenchange",11], ["onmsfullscreenerror",11], ["onmsgesturechange",10], + ["onmsgesturedoubletap",10], ["onmsgestureend",10], ["onmsgesturehold",10], ["onmsgesturestart",10], ["onmsgesturetap",10], + ["onmsinertiastart",10], ["onmsmanipulationstatechanged",10], ["onmspointercancel",10], ["onmspointerdown",10], + ["onmspointerenter",11], ["onmspointerhover",10,10,v == 10], ["onmspointerleave",11], ["onmspointermove",10], ["onmspointerout",10], + ["onmspointerover",10], ["onmspointerup",10], "onmssitemodejumplistitemremoved", "onmsthumbnailclick", "onpause", "onplay", + "onplaying", ["onpointercancel",11], ["onpointerdown",11], ["onpointerenter",11], ["onpointerleave",11], ["onpointermove",11], + ["onpointerout",11], ["onpointerover",11], ["onpointerup",11], "onprogress", ["onpropertychange",9,10], "onratechange", + "onreadystatechange", "onreset", ["onrowenter",9,10], ["onrowexit",9,10], ["onrowsdelete",9,10], ["onrowsinserted",9,10], "onscroll", + "onseeked", "onseeking", "onselect", "onselectionchange", "onselectstart", "onstalled", "onstop", "onstoragecommit", "onsubmit", + "onsuspend", "ontimeupdate", "onvolumechange", "onwaiting", "open", "parentWindow", "plugins", "protocol", "queryCommandEnabled", + "queryCommandIndeterm", "queryCommandState", "queryCommandSupported", "queryCommandText", "queryCommandValue", "querySelector", + "querySelectorAll", "readyState", "referrer", "releaseCapture", ["releaseEvents",11], "removeNode", "replaceNode", "rootElement", + "scripts", "security", ["selection",9,10], "styleSheets", "swapNode", "title", "uniqueID", "updateSettings", ["visibilityState",10], + "vlinkColor", "write", "writeln", "xmlEncoding", "xmlStandalone", "xmlVersion" + ], [ + ["captureEvents",11], ["clear",9,9], "createDocumentFromUrl", ["createEventObject",11], "createNodeIterator", "createRange", + "createRenderStyle", "createTreeWalker", "expando", ["fireEvent",11], ["hidden",10], "msCapsLockWarningOff", + ["msCSSOMElementFloatMetrics",10], ["msElementsFromPoint",10], ["msElementsFromRect",10], ["msExitFullscreen",11], + ["msFullscreenElement",11], ["msFullscreenEnabled",11], ["msHidden",10], ["msVisibilityState",10], ["namespaces",10], + ["onafterupdate",11], ["onbeforeeditfocus",11], ["onbeforeupdate",11], ["oncellchange",11], ["oncontrolselect",11], + ["ondataavailable",11], ["ondatasetchanged",11], ["ondatasetcomplete",11], ["onerrorupdate",11], ["onmscontentzoom",10], + ["onmsfullscreenchange",11], ["onmsfullscreenerror",11], ["onmsgesturechange",10], ["onmsgesturedoubletap",10], ["onmsgestureend",10], + ["onmsgesturehold",10], ["onmsgesturestart",10], ["onmsgesturetap",10], ["onmsinertiastart",10], ["onmsmanipulationstatechanged",10], + ["onmspointercancel",10], ["onmspointerdown",10], ["onmspointerenter",11], ["onmspointerhover",10,10], ["onmspointerleave",11], + ["onmspointermove",10], ["onmspointerout",10], ["onmspointerover",10], ["onmspointerup",10], ["onpointercancel",11], ["onpointerdown",11], + ["onpointerenter",11], ["onpointerleave",11], ["onpointermove",11], ["onpointerout",11], ["onpointerover",11], ["onpointerup",11], + ["onpropertychange",11], ["onrowenter",11], ["onrowexit",11], ["onrowsdelete",11], ["onrowsinserted",11], "recalc", ["releaseEvents",11], + "rootElement", "toString", ["visibilityState",10] + ]); check(DocumentType, [ "entities", "internalSubset", "name", "notations", "publicId", "systemId" ]); check(Element, [ "childElementCount", "clientHeight", "clientLeft", "clientTop", "clientWidth", ["fireEvent",9,10], "firstElementChild", @@ -3722,6 +3770,8 @@ sync_test("prototype props", function() { "defaultPrevented", "eventPhase", "initEvent", "isTrusted", "preventDefault", "srcElement", "stopImmediatePropagation", "stopPropagation", "target", "timeStamp", "type" ], [ "AT_TARGET", "BUBBLING_PHASE", "CAPTURING_PHASE" ]); + if(v >= 11) + check(HTMLDocument, []); check(HTMLElement, [ "accessKey", ["addBehavior",9,10], ["addFilter",9,9], ["all",9,10], "applyElement", ["attachEvent",9,10], ["behaviorUrns",9,10], "blur", "canHaveChildren", "canHaveHTML", "children", ["classList",10], "className", "clearAttributes", "click", "componentFromPoint", "contains",
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 68 ++++++++++++++++--------------- dlls/mshtml/htmldoc.c | 8 +++- dlls/mshtml/htmlwindow.c | 3 +- dlls/mshtml/mshtml_private.h | 7 ++-- dlls/mshtml/tests/documentmode.js | 10 +++-- dlls/mshtml/tests/events.c | 1 - 6 files changed, 56 insertions(+), 41 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 823b7283d7a..77eec049912 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1861,34 +1861,6 @@ HRESULT remove_attribute(DispatchEx *This, DISPID id, VARIANT_BOOL *success) } }
-HRESULT dispex_to_string(DispatchEx *dispex, BSTR *ret) -{ - static const WCHAR prefix[8] = L"[object "; - static const WCHAR suffix[] = L"]"; - WCHAR buf[ARRAY_SIZE(prefix) + ARRAY_SIZE(dispex->info->desc->prototype_name) + ARRAY_SIZE(suffix)], *p = buf; - compat_mode_t compat_mode = dispex_compat_mode(dispex); - const char *name = dispex->info->name; - - if(!ret) - return E_INVALIDARG; - - memcpy(p, prefix, sizeof(prefix)); - p += ARRAY_SIZE(prefix); - if(compat_mode < COMPAT_MODE_IE9) - p--; - else { - if(dispex->info->vtbl->get_name) - name = dispex->info->vtbl->get_name(dispex); - while(*name) - *p++ = *name++; - assert(p + ARRAY_SIZE(suffix) - buf <= ARRAY_SIZE(buf)); - } - memcpy(p, suffix, sizeof(suffix)); - - *ret = SysAllocString(buf); - return *ret ? S_OK : E_OUTOFMEMORY; -} - static dispex_data_t *ensure_dispex_info(dispex_static_data_t *desc, compat_mode_t compat_mode) { if(!desc->info_cache[compat_mode]) { @@ -1933,22 +1905,23 @@ static BOOL ensure_real_info(DispatchEx *dispex) compat_mode_t compat_mode; HTMLInnerWindow *script_global; DispatchEx *prototype = NULL; + dispex_static_data_t *data;
if(dispex->info != dispex->info->desc->delayed_init_info) return TRUE;
- script_global = dispex->info->vtbl->get_script_global(dispex); + script_global = dispex->info->vtbl->get_script_global(dispex, &data); compat_mode = script_global->doc->document_mode;
- if(compat_mode >= COMPAT_MODE_IE9 && dispex->info->desc->id) { - HRESULT hres = get_prototype(script_global, dispex->info->desc->id, &prototype); + if(compat_mode >= COMPAT_MODE_IE9 && data->id) { + HRESULT hres = get_prototype(script_global, data->id, &prototype); if(FAILED(hres)) { ERR("could not get prototype: %08lx\n", hres); return FALSE; } }
- if (!(dispex->info = ensure_dispex_info(dispex->info->desc, compat_mode))) + if(!(dispex->info = ensure_dispex_info(data, compat_mode))) return FALSE; init_host_object(dispex, script_global, prototype); return TRUE; @@ -1961,6 +1934,37 @@ compat_mode_t dispex_compat_mode(DispatchEx *dispex) return dispex->info->compat_mode; }
+HRESULT dispex_to_string(DispatchEx *dispex, BSTR *ret) +{ + static const WCHAR prefix[8] = L"[object "; + static const WCHAR suffix[] = L"]"; + WCHAR buf[ARRAY_SIZE(prefix) + ARRAY_SIZE(dispex->info->desc->prototype_name) + ARRAY_SIZE(suffix)], *p = buf; + compat_mode_t compat_mode = dispex_compat_mode(dispex); + const char *name; + + if(!ret) + return E_INVALIDARG; + + memcpy(p, prefix, sizeof(prefix)); + p += ARRAY_SIZE(prefix); + if(compat_mode < COMPAT_MODE_IE9) + p--; + else { + if(!ensure_real_info(dispex)) + return E_OUTOFMEMORY; + name = dispex->info->name; + if(dispex->info->vtbl->get_name) + name = dispex->info->vtbl->get_name(dispex); + while(*name) + *p++ = *name++; + assert(p + ARRAY_SIZE(suffix) - buf <= ARRAY_SIZE(buf)); + } + memcpy(p, suffix, sizeof(suffix)); + + *ret = SysAllocString(buf); + return *ret ? S_OK : E_OUTOFMEMORY; +} + static inline DispatchEx *impl_from_IWineJSDispatchHost(IWineJSDispatchHost *iface) { return CONTAINING_RECORD(iface, DispatchEx, IWineJSDispatchHost_iface); diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 1ff8eaf4c19..8c26292ee85 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5532,13 +5532,17 @@ static HRESULT HTMLDocumentNode_get_prop_desc(DispatchEx *dispex, DISPID id, str return S_OK; }
-static HTMLInnerWindow *HTMLDocumentNode_get_script_global(DispatchEx *dispex) +static HTMLInnerWindow *HTMLDocumentNode_get_script_global(DispatchEx *dispex, dispex_static_data_t **dispex_data) { HTMLDocumentNode *This = impl_from_DispatchEx(dispex);
TRACE("(%p) using %u compat mode\n", This, This->document_mode);
lock_document_mode(This); + if(This->node.vtbl != &HTMLDocumentNodeImplVtbl) + *dispex_data = &DocumentFragment_dispex; + else + *dispex_data = This->document_mode < COMPAT_MODE_IE11 ? &Document_dispex : &HTMLDocument_dispex; return This->script_global; }
@@ -5708,6 +5712,7 @@ static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t dispex_static_data_t Document_dispex = { .id = PROT_Document, .prototype_id = PROT_Node, + .vtbl = &HTMLDocument_event_target_vtbl.dispex_vtbl, .disp_tid = DispHTMLDocument_tid, .iface_tids = HTMLDocumentNode_iface_tids, .init_info = HTMLDocumentNode_init_dispex_info, @@ -5720,6 +5725,7 @@ dispex_static_data_t HTMLDocument_dispex = { .disp_tid = DispHTMLDocument_tid, .iface_tids = HTMLDocumentNode_iface_tids, .init_info = HTMLDocumentNode_init_dispex_info, + .min_compat_mode = COMPAT_MODE_IE11, };
static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindow *window, HTMLInnerWindow *script_global) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 3624c128cca..22e1efb3171 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4058,10 +4058,11 @@ HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_ return hres; }
-static HTMLInnerWindow *HTMLWindow_get_script_global(DispatchEx *dispex) +static HTMLInnerWindow *HTMLWindow_get_script_global(DispatchEx *dispex, dispex_static_data_t **dispex_data) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); lock_document_mode(This->doc); + *dispex_data = &Window_dispex; return This; }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 19a546e269f..f3ba8f75c15 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -351,6 +351,7 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
typedef struct DispatchEx DispatchEx; typedef struct nsCycleCollectionTraversalCallback nsCycleCollectionTraversalCallback; +typedef struct dispex_static_data_t dispex_static_data_t;
typedef struct { UINT_PTR x; @@ -402,7 +403,7 @@ typedef struct { HRESULT (*disp_invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
/* Used by objects that want to delay their compat mode initialization until actually needed */ - HTMLInnerWindow *(*get_script_global)(DispatchEx*); + HTMLInnerWindow *(*get_script_global)(DispatchEx*,dispex_static_data_t**);
/* Used by objects that want to populate some dynamic props on initialization */ HRESULT (*populate_props)(DispatchEx*); @@ -510,7 +511,7 @@ typedef enum { PROT_LAST, } prototype_id_t;
-typedef struct { +struct dispex_static_data_t { const char *name; const dispex_static_data_vtbl_t *vtbl; const tid_t disp_tid; @@ -527,7 +528,7 @@ typedef struct { compat_mode_t min_compat_mode; compat_mode_t max_compat_mode; char prototype_name[64]; -} dispex_static_data_t; +};
#define X(name) extern dispex_static_data_t name ## _dispex; ALL_PROTOTYPES diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index aa47927a284..a943fcbe532 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -300,7 +300,7 @@ sync_test("builtin_toString", function() { if(clientRects) test("clientRect", clientRects[0], "ClientRect"); if(clientRects) test("clientRects", clientRects, "ClientRectList"); if(currentStyle) test("currentStyle", currentStyle, "MSCurrentStyleCSSProperties"); - if(v >= 11 /* todo_wine */) test("document", document, v < 11 ? "Document" : "HTMLDocument"); + test("document", document, v < 11 ? "Document" : "HTMLDocument"); test("elements", document.getElementsByTagName("body"), "HTMLCollection"); test("history", window.history, "History"); test("implementation", document.implementation, "DOMImplementation"); @@ -675,6 +675,8 @@ sync_test("window_props", function() { test_exposed("performance", true); test_exposed("console", v >= 10); test_exposed("matchMedia", v >= 10); + test_exposed("Document", v >= 9); + test_exposed("HTMLDocument", v === 8 || v >= 11, v === 8); test_exposed("MutationObserver", v >= 11); test_exposed("PageTransitionEvent", v >= 11); test_exposed("ProgressEvent", v >= 10); @@ -3481,11 +3483,13 @@ sync_test("prototypes", function() { check(Node.prototype, Object.prototype, "node prototype"); check(sessionStorage, Storage.prototype, "storage"); check(Storage.prototype, Object.prototype, "storage prototype"); - if(v >= 11) { + if(v < 11) + check(document, Document.prototype, "html document"); + else { check(document, HTMLDocument.prototype, "html document"); check(HTMLDocument.prototype, Document.prototype, "html document prototype"); - check(Document.prototype, Node.prototype, "document prototype"); } + check(Document.prototype, Node.prototype, "document prototype"); check(window, Window.prototype, "window"); check(Window.prototype, Object.prototype, "window prototype"); check(new XMLHttpRequest(), XMLHttpRequest.prototype, "xhr"); diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 6950c1e2a08..135b5ab4060 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -4209,7 +4209,6 @@ static void test_doc_obj(IHTMLDocument2 *doc) bstr = NULL; hres = IHTMLDocument2_toString(doc, &bstr); ok(hres == S_OK, "toString failed: %08lx\n", hres); - todo_wine_if(document_mode >= 9) ok(!wcscmp(bstr, (document_mode < 9 ? L"[object]" : L"[object Document]")), "toString returned %s\n", wine_dbgstr_w(bstr)); SysFreeString(bstr);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 27 +++++++++++++++++++++++++-- dlls/mshtml/tests/documentmode.js | 24 ++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 15 +++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 8c26292ee85..ec77b1a759c 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5829,13 +5829,36 @@ HRESULT create_document_node(nsIDOMDocument *nsdoc, GeckoBrowser *browser, HTMLI return S_OK; }
+static void DocumentFragment_init_dispex_info(dispex_data_t *info, compat_mode_t mode) +{ + static const DISPID document3_dispids[] = { + DISPID_IHTMLDOCUMENT3_ATTACHEVENT, + DISPID_IHTMLDOCUMENT3_DETACHEVENT, + DISPID_UNKNOWN + }; + + if(mode < COMPAT_MODE_IE9) { + HTMLDocumentNode_init_dispex_info(info, mode); + dispex_info_add_interface(info, IHTMLDocument4_tid, NULL); + dispex_info_add_interface(info, IHTMLDocument5_tid, NULL); + } else if(mode < COMPAT_MODE_IE11) { + dispex_info_add_dispids(info, IHTMLDocument3_tid, document3_dispids); + } +} + +static const tid_t DocumentFragment_iface_tids[] = { + IHTMLDOMNode_tid, + IHTMLDOMNode2_tid, + IDocumentSelector_tid, + 0 +}; dispex_static_data_t DocumentFragment_dispex = { .id = PROT_DocumentFragment, .prototype_id = PROT_Node, .vtbl = &HTMLDocument_event_target_vtbl.dispex_vtbl, .disp_tid = DispHTMLDocument_tid, - .iface_tids = HTMLDocumentNode_iface_tids, - .init_info = HTMLDocumentNode_init_dispex_info, + .iface_tids = DocumentFragment_iface_tids, + .init_info = DocumentFragment_init_dispex_info, };
static HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node, HTMLDocumentNode **ret) diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index a943fcbe532..c98fd072e87 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -607,13 +607,32 @@ sync_test("docfrag_props", function() {
function test_exposed(prop, expect) { if(expect) - ok(prop in docfrag, prop + " not found in document fragent."); + ok(prop in docfrag, prop + " not found in document fragment."); else - ok(!(prop in docfrag), prop + " found in document fragent."); + ok(!(prop in docfrag), prop + " found in document fragment."); }
var v = document.documentMode;
+ test_exposed("attachEvent", v < 11); + test_exposed("detachEvent", v < 11); + test_exposed("createStyleSheet", v < 9); + test_exposed("fileSize", v < 9); + test_exposed("selection", v < 9); + test_exposed("doctype", v < 9); + test_exposed("onstorage", v < 9); + test_exposed("textContent", v >= 9); + test_exposed("prefix", v >= 9); + test_exposed("ownerDocument", true); + test_exposed("removeNode", true); + test_exposed("replaceNode", true); + test_exposed("swapNode", true); + test_exposed("defaultView", false); + test_exposed("head", false); + test_exposed("addEventListener", v >= 9); + test_exposed("removeEventListener", v >= 9); + test_exposed("dispatchEvent", v >= 9); + test_exposed("createEvent", false); test_exposed("compareDocumentPosition", v >= 9); });
@@ -3746,6 +3765,7 @@ sync_test("prototype props", function() { ["onpropertychange",11], ["onrowenter",11], ["onrowexit",11], ["onrowsdelete",11], ["onrowsinserted",11], "recalc", ["releaseEvents",11], "rootElement", "toString", ["visibilityState",10] ]); + check(DocumentFragment, [ ["attachEvent",9,10], ["detachEvent",9,10], "querySelector", "querySelectorAll", "removeNode", "replaceNode", "swapNode" ]); check(DocumentType, [ "entities", "internalSubset", "name", "notations", "publicId", "systemId" ]); check(Element, [ "childElementCount", "clientHeight", "clientLeft", "clientTop", "clientWidth", ["fireEvent",9,10], "firstElementChild", diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 65085f8cef5..af03e660fe5 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -103,6 +103,9 @@ static const char frameset_str[] = static const char emptydiv_str[] = "<html><head><title>emptydiv test</title></head>" "<body><div id="divid"></div></body></html>"; +static const char emptydiv_ie9_str[] = + "<html><head><meta http-equiv="x-ua-compatible" content="IE=9"/><title>emptydiv test</title></head>" + "<body><div id="divid"></div></body></html>"; static const char noscript_str[] = "<html><head><title>noscript test</title><noscript><style>.body { margin-right: 0px; }</style></noscript></head>" "<body><noscript><div>test</div></noscript></body></html>"; @@ -11085,6 +11088,8 @@ static void test_docfrag(IHTMLDocument2 *doc) frag = create_docfrag(doc);
test_disp((IUnknown*)frag, &DIID_DispHTMLDocument, &CLSID_HTMLDocument, L"[object]"); + if(is_ie9plus) + test_ifaces((IUnknown*)frag, doc_node_iids);
frag_body = (void*)0xdeadbeef; hres = IHTMLDocument2_get_body(frag, &frag_body); @@ -11118,6 +11123,11 @@ static void test_docfrag(IHTMLDocument2 *doc) test_node_append_child_discard((IUnknown*)div, (IUnknown*)frag); IHTMLElement_Release(div);
+ if(compat_mode >= COMPAT_IE9) { + IHTMLDocument2_Release(frag); + return; + } + hres = IHTMLDocument2_get_all(doc, &col); ok(hres == S_OK, "get_all failed: %08lx\n", hres); test_elem_collection((IUnknown*)col, all_types, ARRAY_SIZE(all_types)); @@ -12262,6 +12272,11 @@ START_TEST(dom) run_domtest(emptydiv_str, test_docfrag); run_domtest(doc_blank, test_replacechild_elems); run_domtest(doctype_str, test_doctype); + if(is_ie9plus) { + compat_mode = COMPAT_IE9; + run_domtest(emptydiv_ie9_str, test_docfrag); + compat_mode = COMPAT_NONE; + }
test_quirks_mode(); test_document_mode_lock();
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmldoc.c | 71 +++++++++++++++++++++++++------ dlls/mshtml/tests/documentmode.js | 10 ++--- 2 files changed, 62 insertions(+), 19 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index ec77b1a759c..6ae7ccb36e4 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5659,7 +5659,6 @@ static const NodeImplVtbl HTMLDocumentFragmentImplVtbl = {
static const tid_t HTMLDocumentNode_iface_tids[] = { IHTMLDOMNode_tid, - IHTMLDocument4_tid, IHTMLDocument5_tid, IDocumentSelector_tid, 0 @@ -5667,24 +5666,67 @@ static const tid_t HTMLDocumentNode_iface_tids[] = {
static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t mode) { - static const dispex_hook_t document2_hooks[] = { + static const dispex_hook_t document2_ie9_hooks[] = { + {DISPID_IHTMLDOCUMENT2_CLEAR}, + {DISPID_IHTMLDOCUMENT2_EXPANDO}, + {DISPID_IHTMLDOCUMENT2_TOSTRING}, {DISPID_IHTMLDOCUMENT2_URL, NULL, L"URL"}, {DISPID_IHTMLDOCUMENT2_LOCATION, HTMLDocumentNode_location_hook}, {DISPID_UNKNOWN} }; static const dispex_hook_t document2_ie11_hooks[] = { - {DISPID_IHTMLDOCUMENT2_URL, NULL, L"URL"}, - {DISPID_IHTMLDOCUMENT2_LOCATION, HTMLDocumentNode_location_hook}, - {DISPID_IHTMLDOCUMENT2_CREATESTYLESHEET, NULL}, - {DISPID_IHTMLDOCUMENT2_FILESIZE, NULL}, - {DISPID_IHTMLDOCUMENT2_SELECTION, NULL}, + {DISPID_IHTMLDOCUMENT2_CREATESTYLESHEET}, + {DISPID_IHTMLDOCUMENT2_FILESIZE}, + {DISPID_IHTMLDOCUMENT2_SELECTION}, + {DISPID_IHTMLDOCUMENT2_ONAFTERUPDATE}, + {DISPID_IHTMLDOCUMENT2_ONROWEXIT}, + {DISPID_IHTMLDOCUMENT2_ONROWENTER}, + {DISPID_IHTMLDOCUMENT2_ONBEFOREUPDATE}, + {DISPID_IHTMLDOCUMENT2_ONERRORUPDATE}, + + /* IE10+ */ + {DISPID_IHTMLDOCUMENT2_EXPANDO}, + {DISPID_IHTMLDOCUMENT2_TOSTRING}, + + /* all modes */ + {DISPID_IHTMLDOCUMENT2_URL, NULL, L"URL"}, + {DISPID_IHTMLDOCUMENT2_LOCATION, HTMLDocumentNode_location_hook}, {DISPID_UNKNOWN} }; + const dispex_hook_t *const document2_ie10_hooks = document2_ie11_hooks + 8; + const dispex_hook_t *const document2_hooks = document2_ie10_hooks + 2; static const dispex_hook_t document3_ie11_hooks[] = { - {DISPID_IHTMLDOCUMENT3_ATTACHEVENT, NULL}, - {DISPID_IHTMLDOCUMENT3_DETACHEVENT, NULL}, + {DISPID_IHTMLDOCUMENT3_ATTACHEVENT}, + {DISPID_IHTMLDOCUMENT3_DETACHEVENT}, + {DISPID_IHTMLDOCUMENT3_ONROWSDELETE}, + {DISPID_IHTMLDOCUMENT3_ONROWSINSERTED}, + {DISPID_IHTMLDOCUMENT3_ONCELLCHANGE}, + {DISPID_IHTMLDOCUMENT3_ONDATASETCHANGED}, + {DISPID_IHTMLDOCUMENT3_ONDATAAVAILABLE}, + {DISPID_IHTMLDOCUMENT3_ONDATASETCOMPLETE}, + {DISPID_IHTMLDOCUMENT3_ONPROPERTYCHANGE}, + {DISPID_IHTMLDOCUMENT3_ONBEFOREEDITFOCUS}, + + /* IE9+ */ + {DISPID_IHTMLDOCUMENT3_RECALC}, + {DISPID_UNKNOWN} + }; + const dispex_hook_t *const document3_ie9_hooks = document3_ie11_hooks + 10; + static const dispex_hook_t document4_ie11_hooks[] = { + {DISPID_IHTMLDOCUMENT4_CREATEEVENTOBJECT}, + {DISPID_IHTMLDOCUMENT4_FIREEVENT}, + {DISPID_IHTMLDOCUMENT4_ONCONTROLSELECT}, + + /* IE10+ */ + {DISPID_IHTMLDOCUMENT4_NAMESPACES}, + + /* IE9+ */ + {DISPID_IHTMLDOCUMENT4_CREATEDOCUMENTFROMURL}, + {DISPID_IHTMLDOCUMENT4_CREATERENDERSTYLE}, {DISPID_UNKNOWN} }; + const dispex_hook_t *const document4_ie10_hooks = document4_ie11_hooks + 3; + const dispex_hook_t *const document4_ie9_hooks = document4_ie10_hooks + 1; static const dispex_hook_t document6_ie9_hooks[] = { {DISPID_IHTMLDOCUMENT6_ONSTORAGE}, {DISPID_UNKNOWN} @@ -5704,9 +5746,15 @@ static void HTMLDocumentNode_init_dispex_info(dispex_data_t *info, compat_mode_t dispex_info_add_interface(info, IHTMLDocument6_tid, NULL); }else { dispex_info_add_interface(info, IHTMLDocument6_tid, mode >= COMPAT_MODE_IE9 ? document6_ie9_hooks : NULL); - dispex_info_add_interface(info, IHTMLDocument3_tid, mode >= COMPAT_MODE_IE11 ? document3_ie11_hooks : NULL); + dispex_info_add_interface(info, IHTMLDocument3_tid, mode >= COMPAT_MODE_IE11 ? document3_ie11_hooks : + mode >= COMPAT_MODE_IE9 ? document3_ie9_hooks : NULL); } - dispex_info_add_interface(info, IHTMLDocument2_tid, mode >= COMPAT_MODE_IE11 ? document2_ie11_hooks : document2_hooks); + dispex_info_add_interface(info, IHTMLDocument2_tid, mode >= COMPAT_MODE_IE11 ? document2_ie11_hooks : + mode >= COMPAT_MODE_IE10 ? document2_ie10_hooks : + mode >= COMPAT_MODE_IE9 ? document2_ie9_hooks : document2_hooks); + dispex_info_add_interface(info, IHTMLDocument4_tid, mode >= COMPAT_MODE_IE11 ? document4_ie11_hooks : + mode >= COMPAT_MODE_IE10 ? document4_ie10_hooks : + mode >= COMPAT_MODE_IE9 ? document4_ie9_hooks : NULL); }
dispex_static_data_t Document_dispex = { @@ -5839,7 +5887,6 @@ static void DocumentFragment_init_dispex_info(dispex_data_t *info, compat_mode_t
if(mode < COMPAT_MODE_IE9) { HTMLDocumentNode_init_dispex_info(info, mode); - dispex_info_add_interface(info, IHTMLDocument4_tid, NULL); dispex_info_add_interface(info, IHTMLDocument5_tid, NULL); } else if(mode < COMPAT_MODE_IE11) { dispex_info_add_dispids(info, IHTMLDocument3_tid, document3_dispids); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index c98fd072e87..672b8d92bd4 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -3751,19 +3751,15 @@ sync_test("prototype props", function() { "scripts", "security", ["selection",9,10], "styleSheets", "swapNode", "title", "uniqueID", "updateSettings", ["visibilityState",10], "vlinkColor", "write", "writeln", "xmlEncoding", "xmlStandalone", "xmlVersion" ], [ - ["captureEvents",11], ["clear",9,9], "createDocumentFromUrl", ["createEventObject",11], "createNodeIterator", "createRange", - "createRenderStyle", "createTreeWalker", "expando", ["fireEvent",11], ["hidden",10], "msCapsLockWarningOff", + ["captureEvents",11], "createNodeIterator", "createRange", "createTreeWalker", ["hidden",10], "msCapsLockWarningOff", ["msCSSOMElementFloatMetrics",10], ["msElementsFromPoint",10], ["msElementsFromRect",10], ["msExitFullscreen",11], - ["msFullscreenElement",11], ["msFullscreenEnabled",11], ["msHidden",10], ["msVisibilityState",10], ["namespaces",10], - ["onafterupdate",11], ["onbeforeeditfocus",11], ["onbeforeupdate",11], ["oncellchange",11], ["oncontrolselect",11], - ["ondataavailable",11], ["ondatasetchanged",11], ["ondatasetcomplete",11], ["onerrorupdate",11], ["onmscontentzoom",10], + ["msFullscreenElement",11], ["msFullscreenEnabled",11], ["msHidden",10], ["msVisibilityState",10], ["onmscontentzoom",10], ["onmsfullscreenchange",11], ["onmsfullscreenerror",11], ["onmsgesturechange",10], ["onmsgesturedoubletap",10], ["onmsgestureend",10], ["onmsgesturehold",10], ["onmsgesturestart",10], ["onmsgesturetap",10], ["onmsinertiastart",10], ["onmsmanipulationstatechanged",10], ["onmspointercancel",10], ["onmspointerdown",10], ["onmspointerenter",11], ["onmspointerhover",10,10], ["onmspointerleave",11], ["onmspointermove",10], ["onmspointerout",10], ["onmspointerover",10], ["onmspointerup",10], ["onpointercancel",11], ["onpointerdown",11], ["onpointerenter",11], ["onpointerleave",11], ["onpointermove",11], ["onpointerout",11], ["onpointerover",11], ["onpointerup",11], - ["onpropertychange",11], ["onrowenter",11], ["onrowexit",11], ["onrowsdelete",11], ["onrowsinserted",11], "recalc", ["releaseEvents",11], - "rootElement", "toString", ["visibilityState",10] + ["releaseEvents",11], "rootElement", ["visibilityState",10] ]); check(DocumentFragment, [ ["attachEvent",9,10], ["detachEvent",9,10], "querySelector", "querySelectorAll", "removeNode", "replaceNode", "swapNode" ]); check(DocumentType, [ "entities", "internalSubset", "name", "notations", "publicId", "systemId" ]);
This merge request was approved by Jacek Caban.