Piotr Caban : mshtml: Populate dynamic properties table in get_dynamic_data .

Alexandre Julliard julliard at winehq.org
Tue Aug 23 12:45:05 CDT 2011


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Aug 23 11:33:18 2011 +0200

mshtml: Populate dynamic properties table in get_dynamic_data.

---

 dlls/mshtml/dispex.c         |   30 ++++++++------
 dlls/mshtml/htmldoc.c        |    3 +-
 dlls/mshtml/htmlelem.c       |   88 +++++++++++++++++++++++++++++++++++++++++-
 dlls/mshtml/htmlelemcol.c    |    3 +-
 dlls/mshtml/htmlimg.c        |    1 +
 dlls/mshtml/htmlnode.c       |    3 +-
 dlls/mshtml/htmlstyle.c      |    1 +
 dlls/mshtml/htmlwindow.c     |    3 +-
 dlls/mshtml/mshtml_private.h |    1 +
 9 files changed, 114 insertions(+), 19 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index b1f9a12..6d175f4 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -366,11 +366,19 @@ static HRESULT variant_copy(VARIANT *dest, VARIANT *src)
     return VariantCopy(dest, src);
 }
 
-static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This, BOOL alloc)
+static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This)
 {
-    return !alloc || This->dynamic_data
-        ? This->dynamic_data
-        : (This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t)));
+    if(This->dynamic_data)
+        return This->dynamic_data;
+
+    This->dynamic_data = heap_alloc_zero(sizeof(dispex_dynamic_data_t));
+    if(!This->dynamic_data)
+        return NULL;
+
+    if(This->data->vtbl && This->data->vtbl->populate_props)
+        This->data->vtbl->populate_props(This);
+
+    return This->dynamic_data;
 }
 
 static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags, dynamic_prop_t **ret)
@@ -379,14 +387,9 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags
     dispex_dynamic_data_t *data;
     dynamic_prop_t *prop;
 
-    data = get_dynamic_data(This, alloc);
-    if(!data) {
-        if(alloc)
-            return E_OUTOFMEMORY;
-
-        TRACE("not found %s\n", debugstr_w(name));
-        return DISP_E_UNKNOWNNAME;
-    }
+    data = get_dynamic_data(This);
+    if(!data)
+        return E_OUTOFMEMORY;
 
     for(prop = data->props; prop < data->props+data->prop_cnt; prop++) {
         if(flags & fdexNameCaseInsensitive ? !strcmpiW(prop->name, name) : !strcmpW(prop->name, name)) {
@@ -570,6 +573,7 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR
 static const dispex_static_data_vtbl_t function_dispex_vtbl = {
     function_value,
     NULL,
+    NULL,
     NULL
 };
 
@@ -625,7 +629,7 @@ static HRESULT function_invoke(DispatchEx *This, func_info_t *func, WORD flags,
             return S_OK;
         }
 
-        dynamic_data = get_dynamic_data(This, TRUE);
+        dynamic_data = get_dynamic_data(This);
         if(!dynamic_data)
             return E_OUTOFMEMORY;
 
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index f625602..0636a04 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -2119,7 +2119,8 @@ static HRESULT HTMLDocumentNode_invoke(DispatchEx *dispex, DISPID id, LCID lcid,
 static const dispex_static_data_vtbl_t HTMLDocumentNode_dispex_vtbl = {
     NULL,
     NULL,
-    HTMLDocumentNode_invoke
+    HTMLDocumentNode_invoke,
+    NULL
 };
 
 static const NodeImplVtbl HTMLDocumentFragmentImplVtbl = {
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 5d1d3af..d76f771 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -1778,6 +1778,88 @@ static HRESULT HTMLElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid,
     return E_NOTIMPL;
 }
 
+static HRESULT HTMLElement_populate_props(DispatchEx *dispex)
+{
+    HTMLElement *This = impl_from_DispatchEx(dispex);
+    nsIDOMNamedNodeMap *attrs;
+    nsIDOMNode *node;
+    nsAString nsstr;
+    const PRUnichar *str;
+    BSTR name;
+    VARIANT value;
+    unsigned i;
+    PRUint32 len;
+    DISPID id;
+    nsresult nsres;
+    HRESULT hres;
+
+    if(!This->nselem)
+        return S_FALSE;
+
+    nsres = nsIDOMHTMLElement_GetAttributes(This->nselem, &attrs);
+    if(NS_FAILED(nsres))
+        return E_FAIL;
+
+    nsres = nsIDOMNamedNodeMap_GetLength(attrs, &len);
+    if(NS_FAILED(nsres)) {
+        nsIDOMNamedNodeMap_Release(attrs);
+        return E_FAIL;
+    }
+
+    nsAString_Init(&nsstr, NULL);
+    for(i=0; i<len; i++) {
+        nsres = nsIDOMNamedNodeMap_Item(attrs, i, &node);
+        if(NS_FAILED(nsres))
+            continue;
+
+        nsres = nsIDOMNode_GetNodeName(node, &nsstr);
+        if(NS_FAILED(nsres)) {
+            nsIDOMNode_Release(node);
+            continue;
+        }
+
+        nsAString_GetData(&nsstr, &str);
+        name = SysAllocString(str);
+        if(!name) {
+            nsIDOMNode_Release(node);
+            continue;
+        }
+
+        hres = IDispatchEx_GetDispID(&dispex->IDispatchEx_iface, name, fdexNameCaseInsensitive, &id);
+        if(hres != DISP_E_UNKNOWNNAME) {
+            nsIDOMNode_Release(node);
+            SysFreeString(name);
+            continue;
+        }
+
+        nsres = nsIDOMNode_GetNodeValue(node, &nsstr);
+        nsIDOMNode_Release(node);
+        if(NS_FAILED(nsres)) {
+            SysFreeString(name);
+            continue;
+        }
+
+        nsAString_GetData(&nsstr, &str);
+        V_VT(&value) = VT_BSTR;
+        if(*str) {
+            V_BSTR(&value) = SysAllocString(str);
+            if(!V_BSTR(&value)) {
+                SysFreeString(name);
+                continue;
+            }
+        } else
+            V_BSTR(&value) = NULL;
+
+        IHTMLElement_setAttribute(&This->IHTMLElement_iface, name, value, 0);
+        SysFreeString(name);
+        VariantClear(&value);
+    }
+    nsAString_Finish(&nsstr);
+
+    nsIDOMNamedNodeMap_Release(attrs);
+    return S_OK;
+}
+
 static const tid_t HTMLElement_iface_tids[] = {
     HTMLELEMENT_TIDS,
     0
@@ -1786,7 +1868,8 @@ static const tid_t HTMLElement_iface_tids[] = {
 static dispex_static_data_vtbl_t HTMLElement_dispex_vtbl = {
     NULL,
     HTMLElement_get_dispid,
-    HTMLElement_invoke
+    HTMLElement_invoke,
+    HTMLElement_populate_props
 };
 
 static dispex_static_data_t HTMLElement_dispex = {
@@ -2017,7 +2100,8 @@ static HRESULT HTMLFiltersCollection_invoke(DispatchEx *dispex, DISPID id, LCID
 static const dispex_static_data_vtbl_t HTMLFiltersCollection_dispex_vtbl = {
     NULL,
     HTMLFiltersCollection_get_dispid,
-    HTMLFiltersCollection_invoke
+    HTMLFiltersCollection_invoke,
+    NULL
 };
 
 static const tid_t HTMLFiltersCollection_iface_tids[] = {
diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c
index c87485e..b5dbc0f 100644
--- a/dlls/mshtml/htmlelemcol.c
+++ b/dlls/mshtml/htmlelemcol.c
@@ -470,7 +470,8 @@ static HRESULT HTMLElementCollection_invoke(DispatchEx *dispex, DISPID id, LCID
 static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = {
     NULL,
     HTMLElementCollection_get_dispid,
-    HTMLElementCollection_invoke
+    HTMLElementCollection_invoke,
+    NULL
 };
 
 static const tid_t HTMLElementCollection_iface_tids[] = {
diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index 2f72484..c984fbd 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -921,6 +921,7 @@ static const tid_t HTMLImageElementFactory_iface_tids[] = {
 static const dispex_static_data_vtbl_t HTMLImageElementFactory_dispex_vtbl = {
     HTMLImageElementFactory_value,
     NULL,
+    NULL,
     NULL
 };
 
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index d297d5b..7afccd6 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -260,7 +260,8 @@ static HRESULT HTMLDOMChildrenCollection_invoke(DispatchEx *dispex, DISPID id, L
 static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = {
     NULL,
     HTMLDOMChildrenCollection_get_dispid,
-    HTMLDOMChildrenCollection_invoke
+    HTMLDOMChildrenCollection_invoke,
+    NULL
 };
 
 static const tid_t HTMLDOMChildrenCollection_iface_tids[] = {
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index c835880..a9c6133 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -3063,6 +3063,7 @@ static HRESULT HTMLStyle_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags,
 static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = {
     NULL,
     HTMLStyle_get_dispid,
+    NULL,
     NULL
 };
 
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 1ded796..d57760f 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -2330,7 +2330,8 @@ static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD
 static const dispex_static_data_vtbl_t HTMLWindow_dispex_vtbl = {
     NULL,
     NULL,
-    HTMLWindow_invoke
+    HTMLWindow_invoke,
+    NULL
 };
 
 static const tid_t HTMLWindow_iface_tids[] = {
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cc92d2f..eac02d9 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -190,6 +190,7 @@ typedef struct {
     HRESULT (*value)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
     HRESULT (*get_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
     HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
+    HRESULT (*populate_props)(DispatchEx*);
 } dispex_static_data_vtbl_t;
 
 typedef struct {




More information about the wine-cvs mailing list