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