diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index d9ecf9d3d29..b6f66627dd9 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3974,6 +3974,44 @@ HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, return hres; } +static HRESULT HTMLWindow_delete(DispatchEx *dispex, DISPID id) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; + global_prop_t *prop; + HRESULT hres = S_OK; + + if(idx >= This->global_prop_cnt) + return DISP_E_MEMBERNOTFOUND; + + prop = This->global_props + idx; + switch(prop->type) { + case GLOBAL_SCRIPTVAR: { + IDispatchEx *iface; + IDispatch *disp; + + disp = get_script_disp(prop->script_host); + if(!disp) + return E_UNEXPECTED; + + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&iface); + if(SUCCEEDED(hres)) { + hres = IDispatchEx_DeleteMemberByDispID(iface, prop->id); + IDispatchEx_Release(iface); + }else { + WARN("No IDispatchEx, so can't delete\n"); + hres = S_OK; + } + IDispatch_Release(disp); + break; + } + default: + break; + } + + return hres; +} + static HRESULT HTMLWindow_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pid) { DWORD idx = (id == DISPID_STARTENUM) ? 0 : id - MSHTML_DISPID_CUSTOM_MIN + 1; @@ -4200,6 +4238,7 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .lookup_dispid = HTMLWindow_lookup_dispid, .find_dispid = HTMLWindow_find_dispid, .invoke = HTMLWindow_invoke, + .delete = HTMLWindow_delete, .next_dispid = HTMLWindow_next_dispid, .get_prop_desc = HTMLWindow_get_prop_desc, .get_script_global = HTMLWindow_get_script_global, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index ca89fdadbdb..0ee20de7a90 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1386,7 +1386,6 @@ sync_test("delete_prop", function() { r = (delete window.encodeURIComponent); ok(v >= 9, "did not get an expect exception deleting encodeURIComponent"); ok(r, "delete returned " + r); - todo_wine. ok(!("encodeURIComponent" in obj), "encodeURIComponent is still in obj"); window.encodeURIComponent = prop; }catch(ex) { @@ -1424,7 +1423,6 @@ sync_test("delete_prop", function() { ok(r, "did not get an expected globalprop2 exception"); }else { ok(!r, "got an unexpected exception"); - todo_wine. ok(!("globalprop2" in obj), "globalprop2 is still in obj"); } @@ -1457,7 +1455,6 @@ sync_test("delete_prop", function() { r = (delete window.globalprop5); ok(v >= 9, "did not get an expected exception deleting globalprop5"); ok(r, "delete returned " + r); - todo_wine. ok(!("globalprop5" in obj), "globalprop5 is still in obj"); }catch(ex) { ok(v < 9, "expected exception deleting globalprop5");