Jacek Caban : mshtml: Properly expose frame and iframe element' s windows to scripts.

Alexandre Julliard julliard at winehq.org
Tue Sep 4 12:38:37 CDT 2012


Module: wine
Branch: master
Commit: 4ff0a82416e61a99e7b30a0c4c2a525b008bff1a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4ff0a82416e61a99e7b30a0c4c2a525b008bff1a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Sep  4 13:58:39 2012 +0200

mshtml: Properly expose frame and iframe element's windows to scripts.

---

 dlls/mshtml/htmlwindow.c      |   44 ++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/mshtml_private.h  |    3 +-
 dlls/mshtml/tests/jstest.html |    7 ++++++
 3 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 2ec4a7f..2ed3ca7 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -2358,7 +2358,25 @@ static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName,
     if(hres != DISP_E_UNKNOWNNAME)
         return hres;
 
-    if(window->base.inner_window->doc) {
+    if(This->outer_window) {
+        HTMLOuterWindow *frame;
+
+        hres = get_frame_by_name(This->outer_window, bstrName, FALSE, &frame);
+        if(SUCCEEDED(hres) && frame) {
+            global_prop_t *prop;
+
+            IHTMLWindow2_Release(&frame->base.IHTMLWindow2_iface);
+
+            prop = alloc_global_prop(window, GLOBAL_FRAMEVAR, bstrName);
+            if(!prop)
+                return E_OUTOFMEMORY;
+
+            *pid = prop_to_dispid(window, prop);
+            return S_OK;
+        }
+    }
+
+    if(window->doc) {
         global_prop_t *prop;
         IHTMLElement *elem;
 
@@ -2603,6 +2621,30 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
             FIXME("Not supported flags: %x\n", flags);
             return E_NOTIMPL;
         }
+    case GLOBAL_FRAMEVAR:
+        if(!This->base.outer_window)
+            return E_UNEXPECTED;
+
+        switch(flags) {
+        case DISPATCH_PROPERTYGET: {
+            HTMLOuterWindow *frame;
+
+            hres = get_frame_by_name(This->base.outer_window, prop->name, FALSE, &frame);
+            if(FAILED(hres))
+                return hres;
+
+            if(!frame)
+                return DISP_E_MEMBERNOTFOUND;
+
+            V_VT(res) = VT_DISPATCH;
+            V_DISPATCH(res) = (IDispatch*)&frame->base.inner_window->base.IHTMLWindow2_iface;
+            IDispatch_AddRef(V_DISPATCH(res));
+            return S_OK;
+        }
+        default:
+            FIXME("Not supported flags: %x\n", flags);
+            return E_NOTIMPL;
+        }
     case GLOBAL_DISPEXVAR:
         return IDispatchEx_InvokeEx(&This->dispex.IDispatchEx_iface, prop->id, 0, flags, params, res, ei, caller);
     default:
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index f23dc10..9f10382 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -294,7 +294,8 @@ typedef struct ScriptHost ScriptHost;
 typedef enum {
     GLOBAL_SCRIPTVAR,
     GLOBAL_ELEMENTVAR,
-    GLOBAL_DISPEXVAR
+    GLOBAL_DISPEXVAR,
+    GLOBAL_FRAMEVAR
 } global_prop_type_t;
 
 typedef struct {
diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html
index 99eca1a..d9d6da5 100644
--- a/dlls/mshtml/tests/jstest.html
+++ b/dlls/mshtml/tests/jstest.html
@@ -68,6 +68,13 @@ function test_document_name_as_index() {
     ok(window.formname === 1, "window.formname = " + window.formname);
     formname = 2;
     ok(window.formname === 2, "window.formname = " + window.formname);
+
+    document.body.innerHTML = '<iframe id="iframeid"></iframe>';
+    ok("iframeid" in window, "iframeid is not in window");
+    e = document.getElementById("iframeid");
+    ok(!!e, "e is null");
+    ok(iframeid != e, "iframeid == e");
+    ok(iframeid.frameElement === e, "frameid != e.contentWindow");
 }
 
 function test_remove_style_attribute() {




More information about the wine-cvs mailing list