Jacek Caban : mshtml: Addeed IHTMLDocument5::createAttribute implementation .

Alexandre Julliard julliard at winehq.org
Wed Feb 20 14:01:14 CST 2013


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Feb 20 15:21:15 2013 +0100

mshtml: Addeed IHTMLDocument5::createAttribute implementation.

---

 dlls/mshtml/htmlattr.c       |   48 ++++++++++++++++++++++++++++-------------
 dlls/mshtml/htmldoc5.c       |   13 +++++++++-
 dlls/mshtml/htmlelem.c       |    2 +-
 dlls/mshtml/mshtml_private.h |    6 +++-
 4 files changed, 49 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c
index 5d4c2b4..4c4d8a4 100644
--- a/dlls/mshtml/htmlattr.c
+++ b/dlls/mshtml/htmlattr.c
@@ -81,6 +81,7 @@ static ULONG WINAPI HTMLDOMAttribute_Release(IHTMLDOMAttribute *iface)
     if(!ref) {
         assert(!This->elem);
         release_dispex(&This->dispex);
+        heap_free(This->name);
         heap_free(This);
     }
 
@@ -124,6 +125,11 @@ static HRESULT WINAPI HTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute *iface, BS
 
     TRACE("(%p)->(%p)\n", This, p);
 
+    if(!This->elem) {
+        FIXME("NULL This->elem\n");
+        return E_UNEXPECTED;
+    }
+
     return IDispatchEx_GetMemberName(&This->elem->node.dispex.IDispatchEx_iface, This->dispid, p);
 }
 
@@ -163,16 +169,16 @@ static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, V
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    if(get_dispid_type(This->dispid) != DISPEXPROP_BUILTIN) {
-        *p = VARIANT_TRUE;
-        return S_OK;
-    }
-
     if(!This->elem || !This->elem->nselem) {
         FIXME("NULL This->elem\n");
         return E_UNEXPECTED;
     }
 
+    if(get_dispid_type(This->dispid) != DISPEXPROP_BUILTIN) {
+        *p = VARIANT_TRUE;
+        return S_OK;
+    }
+
     hres = IDispatchEx_GetMemberName(&This->elem->node.dispex.IDispatchEx_iface, This->dispid, &name);
     if(FAILED(hres))
         return hres;
@@ -221,7 +227,7 @@ static dispex_static_data_t HTMLDOMAttribute_dispex = {
     HTMLDOMAttribute_iface_tids
 };
 
-HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, DISPID dispid, HTMLDOMAttribute **attr)
+HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dispid, HTMLDOMAttribute **attr)
 {
     HTMLAttributeCollection *col;
     HTMLDOMAttribute *ret;
@@ -231,23 +237,35 @@ HRESULT HTMLDOMAttribute_Create(HTMLElement *elem, DISPID dispid, HTMLDOMAttribu
     if(!ret)
         return E_OUTOFMEMORY;
 
-    hres = HTMLElement_get_attr_col(&elem->node, &col);
-    if(FAILED(hres)) {
-        heap_free(ret);
-        return hres;
-    }
-    IHTMLAttributeCollection_Release(&col->IHTMLAttributeCollection_iface);
-
     ret->IHTMLDOMAttribute_iface.lpVtbl = &HTMLDOMAttributeVtbl;
     ret->ref = 1;
-
     ret->dispid = dispid;
     ret->elem = elem;
-    list_add_tail(&elem->attrs->attrs, &ret->entry);
 
     init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLDOMAttribute_iface,
             &HTMLDOMAttribute_dispex);
 
+    /* For attributes attached to an element, (elem,dispid) pair should be valid used for its operation. */
+    if(elem) {
+        hres = HTMLElement_get_attr_col(&elem->node, &col);
+        if(FAILED(hres)) {
+            IHTMLDOMAttribute_Release(&ret->IHTMLDOMAttribute_iface);
+            return hres;
+        }
+        IHTMLAttributeCollection_Release(&col->IHTMLAttributeCollection_iface);
+
+        list_add_tail(&elem->attrs->attrs, &ret->entry);
+    }
+
+    /* For detached attributes we may still do most operations if we have its name available. */
+    if(name) {
+        ret->name = heap_strdupW(name);
+        if(!ret->name) {
+            IHTMLDOMAttribute_Release(&ret->IHTMLDOMAttribute_iface);
+            return E_OUTOFMEMORY;
+        }
+    }
+
     *attr = ret;
     return S_OK;
 }
diff --git a/dlls/mshtml/htmldoc5.c b/dlls/mshtml/htmldoc5.c
index edf8109..8871934 100644
--- a/dlls/mshtml/htmldoc5.c
+++ b/dlls/mshtml/htmldoc5.c
@@ -120,8 +120,17 @@ static HRESULT WINAPI HTMLDocument5_createAttribute(IHTMLDocument5 *iface, BSTR
         IHTMLDOMAttribute **ppattribute)
 {
     HTMLDocument *This = impl_from_IHTMLDocument5(iface);
-    FIXME("(%p)->(%s %p)\n", This, debugstr_w(bstrattrName), ppattribute);
-    return E_NOTIMPL;
+    HTMLDOMAttribute *attr;
+    HRESULT hres;
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrattrName), ppattribute);
+
+    hres = HTMLDOMAttribute_Create(bstrattrName, NULL, 0, &attr);
+    if(FAILED(hres))
+        return hres;
+
+    *ppattribute = &attr->IHTMLDOMAttribute_iface;
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bstrdata,
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index 6867a17..8239973 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -2246,7 +2246,7 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG
             return E_UNEXPECTED;
         }
 
-        hres = HTMLDOMAttribute_Create(This->elem, id, attr);
+        hres = HTMLDOMAttribute_Create(NULL, This->elem, id, attr);
         if(FAILED(hres))
             return hres;
     }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 75200c4..38aaa24 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -852,12 +852,14 @@ typedef struct {
 
     LONG ref;
 
-    DISPID dispid;
+    WCHAR *name;
+
     HTMLElement *elem;
+    DISPID dispid;
     struct list entry;
 } HTMLDOMAttribute;
 
-HRESULT HTMLDOMAttribute_Create(HTMLElement*,DISPID,HTMLDOMAttribute**) DECLSPEC_HIDDEN;
+HRESULT HTMLDOMAttribute_Create(const WCHAR*,HTMLElement*,DISPID,HTMLDOMAttribute**) DECLSPEC_HIDDEN;
 
 HRESULT HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLElement**) DECLSPEC_HIDDEN;
 HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list