From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlwindow.c | 2 +- dlls/mshtml/mshtml_private.h | 2 +- dlls/mshtml/omnavigator.c | 5 ++-- dlls/mshtml/tests/documentmode.js | 2 +- dlls/mshtml/tests/es5.js | 45 +++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 5 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 31976b73d04..7cf4bf9738b 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -1216,7 +1216,7 @@ static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen ** if(!window->screen) { HRESULT hres;
- hres = create_html_screen(dispex_compat_mode(&window->event_target.dispex), &window->screen); + hres = create_html_screen(window, &window->screen); if(FAILED(hres)) return hres; } diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 461eb3a93f2..a5e0f309ed9 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1040,7 +1040,7 @@ HRESULT HTMLImageElementFactory_Create(HTMLInnerWindow*,HTMLImageElementFactory* HRESULT HTMLXMLHttpRequestFactory_Create(HTMLInnerWindow*,HTMLXMLHttpRequestFactory**); HRESULT create_location(HTMLOuterWindow*,HTMLLocation**); HRESULT create_navigator(compat_mode_t,IOmNavigator**); -HRESULT create_html_screen(compat_mode_t,IHTMLScreen**); +HRESULT create_html_screen(HTMLInnerWindow*,IHTMLScreen**); HRESULT create_performance(HTMLInnerWindow*,IHTMLPerformance**); HRESULT create_history(HTMLInnerWindow*,OmHistory**); HRESULT create_namespace_collection(compat_mode_t,IHTMLNamespaceCollection**); diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 4ee76a585a1..88dfa1b5bf9 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -425,7 +425,7 @@ static dispex_static_data_t HTMLScreen_dispex = { HTMLScreen_iface_tids };
-HRESULT create_html_screen(compat_mode_t compat_mode, IHTMLScreen **ret) +HRESULT create_html_screen(HTMLInnerWindow *window, IHTMLScreen **ret) { HTMLScreen *screen;
@@ -435,7 +435,8 @@ HRESULT create_html_screen(compat_mode_t compat_mode, IHTMLScreen **ret)
screen->IHTMLScreen_iface.lpVtbl = &HTMLSreenVtbl;
- init_dispatch(&screen->dispex, &HTMLScreen_dispex, NULL, compat_mode); + init_dispatch(&screen->dispex, &HTMLScreen_dispex, window, + dispex_compat_mode(&window->event_target.dispex));
*ret = &screen->IHTMLScreen_iface; return S_OK; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index c8ce01b0443..2cffff79479 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -242,7 +242,7 @@ sync_test("builtin_toString", function() { ok(s === (tostr ? tostr : (v < 9 ? "[object]" : "[object " + name + "]")), msg + " toString returned " + s); } s = Object.prototype.toString.call(obj); - todo_wine_if(v >= 9 && name != "Object"). + todo_wine_if(v >= 9 && name != "Object" && name != "Screen"). ok(s === (v < 9 ? "[object Object]" : "[object " + name + "]"), msg + " Object.toString returned " + s); }
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 353d0b0b5c0..b1340918fad 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2601,3 +2601,48 @@ sync_test("initProgressEvent", function() { ok(e.loaded === 99, "loaded after re-init = " + e.loaded); ok(e.total === 50, "total after re-init = " + e.total); }); + +sync_test("screen", function() { + var o = screen; + + ok(typeof(o) == "object", "typeof(o) = " + typeof(o)); + ok(o instanceof Object, "o is not an instance of Object"); + + o.prop = 1; + ok(o.prop === 1, "o.prop = " + o.prop); + ok(o.hasOwnProperty("prop"), 'o.hasOwnProperty("prop") = ' + o.hasOwnProperty("prop")); + test_own_data_prop_desc(o, "prop", true, true, true); + + Object.defineProperty(o, "defprop", {writable: false, enumerable: false, configurable: true, value: 2}); + ok(o.defprop === 2, "o.prop = " + o.prop); + test_own_data_prop_desc(o, "defprop", false, false, true); + + ok(typeof(Object.keys(o)) === "object", "Object.keys(o) = " + Object.keys(o)); + ok(Object.isExtensible(o) === true, "Object.isExtensible(o) = " + Object.isExtensible(o)); + ok(Object.isFrozen(o) === false, "Object.isFrozen(o) = " + Object.isFrozen(o)); + ok(Object.isSealed(o) === false, "Object.isSealed(o) = " + Object.isSealed(o)); + + Object.seal(o); + test_own_data_prop_desc(o, "prop", true, true, false); + test_own_data_prop_desc(o, "defprop", false, false, false); + ok(Object.isExtensible(o) === false, "Object.isExtensible(o) = " + Object.isExtensible(o)); + ok(Object.isFrozen(o) === false, "Object.isFrozen(o) = " + Object.isFrozen(o)); + ok(Object.isSealed(o) === true, "Object.isSealed(o) = " + Object.isSealed(o)); + + o.prop2 = 3; + ok(!("prop2" in o), "o.prop2 = " + o.prop2); + + function check_enum(o, name) { + var ret = 0; + for(var iter in o) { + if(iter == name) ret++; + } + ok(ret < 2, name + " enumerated " + ret + " times"); + return ret != 0; + } + ok(check_enum(o, "width"), "width not enumerated"); + ok(check_enum(o, "height"), "height not enumerated"); + ok(check_enum(o, "prop"), "prop not enumerated"); + ok(!check_enum(o, "defprop"), "defprop enumerated"); + ok(!check_enum(o, "prop2"), "prop2 enumerated"); +});