mshtml: Reimplement IHTMLElement3::disabled property on top of Gecko attributes.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
696e8faaa9
commit
7eb05c7590
|
@ -218,6 +218,22 @@ static VARIANT_BOOL element_has_attribute(HTMLElement *element, const WCHAR *nam
|
||||||
return variant_bool(NS_SUCCEEDED(nsres) && r);
|
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)
|
HRESULT get_readystate_string(READYSTATE readystate, BSTR *p)
|
||||||
{
|
{
|
||||||
static const LPCWSTR readystate_strs[] = {
|
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)
|
static HRESULT WINAPI HTMLElement3_put_disabled(IHTMLElement3 *iface, VARIANT_BOOL v)
|
||||||
{
|
{
|
||||||
HTMLElement *This = impl_from_IHTMLElement3(iface);
|
HTMLElement *This = impl_from_IHTMLElement3(iface);
|
||||||
VARIANT *var;
|
|
||||||
HRESULT hres;
|
|
||||||
|
|
||||||
TRACE("(%p)->(%x)\n", This, v);
|
TRACE("(%p)->(%x)\n", This, v);
|
||||||
|
|
||||||
if(This->node.vtbl->put_disabled)
|
if(This->node.vtbl->put_disabled)
|
||||||
return This->node.vtbl->put_disabled(&This->node, v);
|
return This->node.vtbl->put_disabled(&This->node, v);
|
||||||
|
|
||||||
hres = dispex_get_dprop_ref(&This->node.event_target.dispex, L"disabled", TRUE, &var);
|
if(!v) return element_remove_attribute(This, L"disabled");
|
||||||
if(FAILED(hres))
|
return elem_string_attr_setter(This, L"disabled", L"");
|
||||||
return hres;
|
|
||||||
|
|
||||||
VariantClear(var);
|
|
||||||
V_VT(var) = VT_BOOL;
|
|
||||||
V_BOOL(var) = v;
|
|
||||||
return S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
|
static HRESULT WINAPI HTMLElement3_get_disabled(IHTMLElement3 *iface, VARIANT_BOOL *p)
|
||||||
{
|
{
|
||||||
HTMLElement *This = impl_from_IHTMLElement3(iface);
|
HTMLElement *This = impl_from_IHTMLElement3(iface);
|
||||||
VARIANT *var;
|
|
||||||
HRESULT hres;
|
|
||||||
|
|
||||||
TRACE("(%p)->(%p)\n", This, p);
|
TRACE("(%p)->(%p)\n", This, p);
|
||||||
|
|
||||||
if(This->node.vtbl->get_disabled)
|
if(This->node.vtbl->get_disabled)
|
||||||
return This->node.vtbl->get_disabled(&This->node, p);
|
return This->node.vtbl->get_disabled(&This->node, p);
|
||||||
|
|
||||||
hres = dispex_get_dprop_ref(&This->node.event_target.dispex, L"disabled", FALSE, &var);
|
*p = variant_bool(element_has_attribute(This, L"disabled"));
|
||||||
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);
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -469,6 +469,34 @@ sync_test("title", function() {
|
||||||
ok(elem.getAttribute("title") === "test", "title attribute = " + elem.getAttribute("title"));
|
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() {
|
sync_test("hasAttribute", function() {
|
||||||
document.body.innerHTML = '<div attr="test"></div>';
|
document.body.innerHTML = '<div attr="test"></div>';
|
||||||
var elem = document.body.firstChild, r;
|
var elem = document.body.firstChild, r;
|
||||||
|
|
Loading…
Reference in New Issue