Jacek Caban : mshtml: Forward IHTMLelement3::[get|put] _disabled to child object if possible.

Alexandre Julliard julliard at winehq.org
Fri Oct 10 08:06:41 CDT 2008


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Oct  9 15:26:41 2008 -0500

mshtml: Forward IHTMLelement3::[get|put]_disabled to child object if possible.

---

 dlls/mshtml/htmlelem3.c      |   17 +++++++++++++--
 dlls/mshtml/htmlinput.c      |   16 ++++++++++++++-
 dlls/mshtml/htmlselect.c     |   16 ++++++++++++++-
 dlls/mshtml/htmltextarea.c   |   16 ++++++++++++++-
 dlls/mshtml/mshtml_private.h |    2 +
 dlls/mshtml/tests/dom.c      |   45 +++++++++++++++++++++++++++++++++++++++++-
 6 files changed, 105 insertions(+), 7 deletions(-)

diff --git a/dlls/mshtml/htmlelem3.c b/dlls/mshtml/htmlelem3.c
index f85b065..05805b9 100644
--- a/dlls/mshtml/htmlelem3.c
+++ b/dlls/mshtml/htmlelem3.c
@@ -205,15 +205,26 @@ static HRESULT WINAPI HTMLElement3_get_hideFocus(IHTMLElement3 *iface, VARIANT_B
 static HRESULT WINAPI HTMLElement3_put_disabled(IHTMLElement3 *iface, VARIANT_BOOL v)
 {
     HTMLElement *This = HTMLELEM3_THIS(iface);
-    FIXME("(%p)->(%x)\n", This, v);
-    return S_OK;
+
+    TRACE("(%p)->(%x)\n", This, v);
+
+    if(This->node.vtbl->put_disabled)
+        return This->node.vtbl->put_disabled(&This->node, v);
+
+    FIXME("No implementation for element\n");
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
 {
     HTMLElement *This = HTMLELEM3_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    if(This->node.vtbl->get_disabled)
+        return This->node.vtbl->get_disabled(&This->node, p);
+
+    FIXME("No implementation for element\n");
     return E_NOTIMPL;
 }
 
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 028201a..1029916 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -1064,11 +1064,25 @@ static void HTMLInputElement_destructor(HTMLDOMNode *iface)
     HTMLElement_destructor(&This->element.node);
 }
 
+static HRESULT HTMLInputElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
+{
+    HTMLInputElement *This = HTMLINPUT_NODE_THIS(iface);
+    return IHTMLInputElement_put_disabled(HTMLINPUT(This), v);
+}
+
+static HRESULT HTMLInputElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
+{
+    HTMLInputElement *This = HTMLINPUT_NODE_THIS(iface);
+    return IHTMLInputElement_get_disabled(HTMLINPUT(This), p);
+}
+
 #undef HTMLINPUT_NODE_THIS
 
 static const NodeImplVtbl HTMLInputElementImplVtbl = {
     HTMLInputElement_QI,
-    HTMLInputElement_destructor
+    HTMLInputElement_destructor,
+    HTMLInputElementImpl_put_disabled,
+    HTMLInputElementImpl_get_disabled,
 };
 
 static const tid_t HTMLInputElement_iface_tids[] = {
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c
index 9c7cf71..eaa2815 100644
--- a/dlls/mshtml/htmlselect.c
+++ b/dlls/mshtml/htmlselect.c
@@ -442,11 +442,25 @@ static void HTMLSelectElement_destructor(HTMLDOMNode *iface)
     HTMLElement_destructor(&This->element.node);
 }
 
+static HRESULT HTMLSelectElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
+{
+    HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface);
+    return IHTMLSelectElement_put_disabled(HTMLSELECT(This), v);
+}
+
+static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
+{
+    HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface);
+    return IHTMLSelectElement_get_disabled(HTMLSELECT(This), p);
+}
+
 #undef HTMLSELECT_NODE_THIS
 
 static const NodeImplVtbl HTMLSelectElementImplVtbl = {
     HTMLSelectElement_QI,
-    HTMLSelectElement_destructor
+    HTMLSelectElement_destructor,
+    HTMLSelectElementImpl_put_disabled,
+    HTMLSelectElementImpl_get_disabled
 };
 
 static const tid_t HTMLSelectElement_tids[] = {
diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c
index 96df5f8..9db2c98 100644
--- a/dlls/mshtml/htmltextarea.c
+++ b/dlls/mshtml/htmltextarea.c
@@ -388,11 +388,25 @@ static void HTMLTextAreaElement_destructor(HTMLDOMNode *iface)
     HTMLElement_destructor(&This->element.node);
 }
 
+static HRESULT HTMLTextAreaElementImpl_put_disabled(HTMLDOMNode *iface, VARIANT_BOOL v)
+{
+    HTMLTextAreaElement *This = HTMLTXTAREA_NODE_THIS(iface);
+    return IHTMLTextAreaElement_put_disabled(HTMLTXTAREA(This), v);
+}
+
+static HRESULT HTMLTextAreaElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BOOL *p)
+{
+    HTMLTextAreaElement *This = HTMLTXTAREA_NODE_THIS(iface);
+    return IHTMLTextAreaElement_get_disabled(HTMLTXTAREA(This), p);
+}
+
 #undef HTMLTXTAREA_NODE_THIS
 
 static const NodeImplVtbl HTMLTextAreaElementImplVtbl = {
     HTMLTextAreaElement_QI,
-    HTMLTextAreaElement_destructor
+    HTMLTextAreaElement_destructor,
+    HTMLTextAreaElementImpl_put_disabled,
+    HTMLTextAreaElementImpl_get_disabled
 };
 
 HTMLElement *HTMLTextAreaElement_Create(nsIDOMHTMLElement *nselem)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 7243600..3ebd655 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -361,6 +361,8 @@ typedef struct {
 typedef struct {
     HRESULT (*qi)(HTMLDOMNode*,REFIID,void**);
     void (*destructor)(HTMLDOMNode*);
+    HRESULT (*put_disabled)(HTMLDOMNode*,VARIANT_BOOL);
+    HRESULT (*get_disabled)(HTMLDOMNode*,VARIANT_BOOL*);
 } NodeImplVtbl;
 
 struct HTMLDOMNode {
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 82dd655..463bc5c 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Jacek Caban for CodeWeavers
+ * Copyright 2007-2008 Jacek Caban for CodeWeavers
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -471,6 +471,17 @@ static IHTMLElement2 *_get_elem2_iface(unsigned line, IUnknown *unk)
     return elem;
 }
 
+#define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
+static IHTMLElement3 *_get_elem3_iface(unsigned line, IUnknown *unk)
+{
+    IHTMLElement3 *elem;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IHTMLElement3, (void**)&elem);
+    ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLElement3: %08x\n", hres);
+    return elem;
+}
+
 #define get_node_iface(u) _get_node_iface(__LINE__,u)
 static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk)
 {
@@ -1059,6 +1070,32 @@ static IHTMLElement *_test_elem_get_parent(unsigned line, IUnknown *unk)
     return parent;
 }
 
+#define test_elem3_get_disabled(i,b) _test_elem3_get_disabled(__LINE__,i,b)
+static void _test_elem3_get_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL exb)
+{
+    IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
+    VARIANT_BOOL disabled = 100;
+    HRESULT hres;
+
+    hres = IHTMLElement3_get_disabled(elem3, &disabled);
+    ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
+    ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
+    IHTMLElement3_Release(elem3);
+}
+
+#define test_elem3_set_disabled(i,b) _test_elem3_set_disabled(__LINE__,i,b)
+static void _test_elem3_set_disabled(unsigned line, IUnknown *unk, VARIANT_BOOL b)
+{
+    IHTMLElement3 *elem3 = _get_elem3_iface(line, unk);
+    HRESULT hres;
+
+    hres = IHTMLElement3_put_disabled(elem3, b);
+    ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
+
+    IHTMLElement3_Release(elem3);
+    _test_elem3_get_disabled(line, unk, b);
+}
+
 #define elem_get_scroll_height(u) _elem_get_scroll_height(__LINE__,u)
 static long _elem_get_scroll_height(unsigned line, IUnknown *unk)
 {
@@ -1206,6 +1243,8 @@ static void _test_input_get_disabled(unsigned line, IHTMLInputElement *input, VA
     hres = IHTMLInputElement_get_disabled(input, &disabled);
     ok_(__FILE__,line) (hres == S_OK, "get_disabled failed: %08x\n", hres);
     ok_(__FILE__,line) (disabled == exb, "disabled=%x, expected %x\n", disabled, exb);
+
+    _test_elem3_get_disabled(line, (IUnknown*)input, exb);
 }
 
 #define test_input_set_disabled(i,b) _test_input_set_disabled(__LINE__,i,b)
@@ -2838,6 +2877,10 @@ static void test_elems(IHTMLDocument2 *doc)
         test_input_get_disabled(input, VARIANT_FALSE);
         test_input_set_disabled(input, VARIANT_TRUE);
         test_input_set_disabled(input, VARIANT_FALSE);
+        test_elem3_set_disabled((IUnknown*)input, VARIANT_TRUE);
+        test_input_get_disabled(input, VARIANT_TRUE);
+        test_elem3_set_disabled((IUnknown*)input, VARIANT_FALSE);
+        test_input_get_disabled(input, VARIANT_FALSE);
         test_elem_client_size((IUnknown*)elem);
 
         test_node_get_value_str((IUnknown*)elem, NULL);




More information about the wine-cvs mailing list