Jacek Caban : mshtml: Reimplement IHTMLElement3::disabled property on top of Gecko attributes.

Alexandre Julliard julliard at winehq.org
Fri Apr 23 15:20:18 CDT 2021


Module: wine
Branch: master
Commit: 7eb05c759049ae71a8002e03381d16445acc7c4c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7eb05c759049ae71a8002e03381d16445acc7c4c

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr 23 19:40:08 2021 +0200

mshtml: Reimplement IHTMLElement3::disabled property on top of Gecko attributes.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlelem.c   | 45 +++++++++++++++++++--------------------------
 dlls/mshtml/tests/dom.js | 28 ++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 26 deletions(-)

diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index ea6f7cd64c6..011a06298c2 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -218,6 +218,22 @@ static VARIANT_BOOL element_has_attribute(HTMLElement *element, const WCHAR *nam
     return variant_bool(NS_SUCCEEDED(nsres) && r);
 }
 
+static HRESULT element_remove_attribute(HTMLElement *element, const WCHAR *name)
+{
+    nsAString name_str;
+    nsresult nsres;
+
+    if(!element->dom_element) {
+        WARN("no DOM element\n");
+        return S_OK;
+    }
+
+    nsAString_InitDepend(&name_str, name);
+    nsres = nsIDOMElement_RemoveAttribute(element->dom_element, &name_str);
+    nsAString_Finish(&name_str);
+    return map_nsresult(nsres);
+}
+
 HRESULT get_readystate_string(READYSTATE readystate, BSTR *p)
 {
     static const LPCWSTR readystate_strs[] = {
@@ -3775,49 +3791,26 @@ static HRESULT WINAPI HTMLElement3_get_hideFocus(IHTMLElement3 *iface, VARIANT_B
 static HRESULT WINAPI HTMLElement3_put_disabled(IHTMLElement3 *iface, VARIANT_BOOL v)
 {
     HTMLElement *This = impl_from_IHTMLElement3(iface);
-    VARIANT *var;
-    HRESULT hres;
 
     TRACE("(%p)->(%x)\n", This, v);
 
     if(This->node.vtbl->put_disabled)
         return This->node.vtbl->put_disabled(&This->node, v);
 
-    hres = dispex_get_dprop_ref(&This->node.event_target.dispex, L"disabled", TRUE, &var);
-    if(FAILED(hres))
-        return hres;
-
-    VariantClear(var);
-    V_VT(var) = VT_BOOL;
-    V_BOOL(var) = v;
-    return S_OK;
+    if(!v) return element_remove_attribute(This, L"disabled");
+    return elem_string_attr_setter(This, L"disabled", L"");
 }
 
 static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
 {
     HTMLElement *This = impl_from_IHTMLElement3(iface);
-    VARIANT *var;
-    HRESULT hres;
 
     TRACE("(%p)->(%p)\n", This, p);
 
     if(This->node.vtbl->get_disabled)
         return This->node.vtbl->get_disabled(&This->node, p);
 
-    hres = dispex_get_dprop_ref(&This->node.event_target.dispex, L"disabled", FALSE, &var);
-    if(hres == DISP_E_UNKNOWNNAME) {
-        *p = VARIANT_FALSE;
-        return S_OK;
-    }
-    if(FAILED(hres))
-        return hres;
-
-    if(V_VT(var) != VT_BOOL) {
-        FIXME("value is %s\n", debugstr_variant(var));
-        return E_NOTIMPL;
-    }
-
-    *p = V_BOOL(var);
+    *p = variant_bool(element_has_attribute(This, L"disabled"));
     return S_OK;
 }
 
diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js
index 9edaf9befbc..6a84dd3a032 100644
--- a/dlls/mshtml/tests/dom.js
+++ b/dlls/mshtml/tests/dom.js
@@ -469,6 +469,34 @@ sync_test("title", function() {
     ok(elem.getAttribute("title") === "test", "title attribute = " + elem.getAttribute("title"));
 });
 
+sync_test("disabled", function() {
+    var elem = document.createElement("div");
+    document.body.appendChild(elem);
+    ok(elem.disabled === false, "div.disabled = " + elem.disabled);
+    todo_wine.
+    ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
+
+    elem.disabled = true;
+    ok(elem.disabled === true, "div.disabled = " + elem.disabled);
+    todo_wine.
+    ok(elem.getAttribute("disabled") === "", "disabled attribute = " + elem.getAttribute("disabled") + " expected \"\"");
+
+    elem.disabled = false;
+    ok(elem.disabled === false, "div.disabled = " + elem.disabled);
+    todo_wine.
+    ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
+
+    elem.setAttribute("disabled", "false");
+    ok(elem.disabled === true, "div.disabled = " + elem.disabled);
+    todo_wine.
+    ok(elem.getAttribute("disabled") === "false", "disabled attribute = " + elem.getAttribute("disabled"));
+
+    elem.removeAttribute("disabled");
+    ok(elem.disabled === false, "div.disabled = " + elem.disabled);
+    todo_wine.
+    ok(elem.getAttribute("disabled") === null, "disabled attribute = " + elem.getAttribute("disabled") + " expected null");
+});
+
 sync_test("hasAttribute", function() {
     document.body.innerHTML = '<div attr="test"></div>';
     var elem = document.body.firstChild, r;




More information about the wine-cvs mailing list