Jacek Caban : mshtml: Add IHTMLRectCollection implementation.
Alexandre Julliard
julliard at winehq.org
Wed Mar 27 17:27:37 CDT 2019
Module: wine
Branch: master
Commit: 46de3fcf1d4a950c02692143be97462460503010
URL: https://source.winehq.org/git/wine.git/?a=commit;h=46de3fcf1d4a950c02692143be97462460503010
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Mar 27 18:52:57 2019 +0100
mshtml: Add IHTMLRectCollection implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/htmlelem.c | 83 +++++++++++++++++++++++++++++++++++++++++--
dlls/mshtml/tests/elements.js | 18 ++++++++++
2 files changed, 98 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c
index b14ecc1..da7b6cf 100644
--- a/dlls/mshtml/htmlelem.c
+++ b/dlls/mshtml/htmlelem.c
@@ -650,8 +650,15 @@ static HRESULT WINAPI HTMLRectCollection_Invoke(IHTMLRectCollection *iface, DISP
static HRESULT WINAPI HTMLRectCollection_get_length(IHTMLRectCollection *iface, LONG *p)
{
HTMLRectCollection *This = impl_from_IHTMLRectCollection(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ UINT32 length;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMClientRectList_GetLength(This->rect_list, &length);
+ assert(nsres == NS_OK);
+ *p = length;
+ return S_OK;
}
static HRESULT WINAPI HTMLRectCollection_get__newEnum(IHTMLRectCollection *iface, IUnknown **p)
@@ -681,12 +688,82 @@ static const IHTMLRectCollectionVtbl HTMLRectCollectionVtbl = {
HTMLRectCollection_item
};
+static inline HTMLRectCollection *HTMLRectCollection_from_DispatchEx(DispatchEx *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLRectCollection, dispex);
+}
+
+static HRESULT HTMLRectCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid)
+{
+ HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex);
+ UINT32 len = 0;
+ DWORD idx = 0;
+ WCHAR *ptr;
+
+ for(ptr = name; *ptr && isdigitW(*ptr); ptr++)
+ idx = idx*10 + (*ptr-'0');
+ if(*ptr)
+ return DISP_E_UNKNOWNNAME;
+
+ nsIDOMClientRectList_GetLength(This->rect_list, &len);
+ if(idx >= len)
+ return DISP_E_UNKNOWNNAME;
+
+ *dispid = MSHTML_DISPID_CUSTOM_MIN + idx;
+ TRACE("ret %x\n", *dispid);
+ return S_OK;
+}
+
+static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex);
+
+ TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ nsIDOMClientRect *rect;
+ IHTMLRect *html_rect;
+ nsresult nsres;
+ HRESULT hres;
+
+ nsres = nsIDOMClientRectList_Item(This->rect_list, id - MSHTML_DISPID_CUSTOM_MIN, &rect);
+ if(NS_FAILED(nsres) || !rect) {
+ WARN("Unknown item\n");
+ return DISP_E_UNKNOWNNAME;
+ }
+
+ hres = create_html_rect(rect, &html_rect);
+ nsIDOMClientRect_Release(rect);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = (IDispatch*)html_rect;
+ break;
+ }
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = {
+ NULL,
+ HTMLRectCollection_get_dispid,
+ HTMLRectCollection_invoke,
+ NULL
+};
static const tid_t HTMLRectCollection_iface_tids[] = {
IHTMLRectCollection_tid,
0
};
static dispex_static_data_t HTMLRectCollection_dispex = {
- NULL,
+ &HTMLRectCollection_dispex_vtbl,
IHTMLRectCollection_tid,
HTMLRectCollection_iface_tids
};
diff --git a/dlls/mshtml/tests/elements.js b/dlls/mshtml/tests/elements.js
index 1498e1f..5077885 100644
--- a/dlls/mshtml/tests/elements.js
+++ b/dlls/mshtml/tests/elements.js
@@ -211,6 +211,23 @@ function test_compare_position() {
next_test();
}
+function test_rects() {
+ document.body.innerHTML = '<div>test</div>';
+ var elem = document.body.firstChild;
+ var rects = elem.getClientRects();
+ var rect = elem.getBoundingClientRect();
+
+ ok(rects.length === 1, "rect.length = " + rects.length);
+ ok(rects[0].top === rect.top, "rects[0].top = " + rects[0].top + " rect.top = " + rect.top);
+ ok(rects[0].bottom === rect.bottom, "rects[0].bottom = " + rects[0].bottom + " rect.bottom = " + rect.bottom);
+
+ elem = document.createElement("style");
+ rects = elem.getClientRects();
+ ok(rects.length === 0, "rect.length = " + rects.length);
+
+ next_test();
+}
+
function test_document_owner() {
var node;
@@ -339,6 +356,7 @@ var tests = [
test_anchor,
test_query_selector,
test_compare_position,
+ test_rects,
test_document_owner,
test_style_properties,
test_storage
More information about the wine-cvs
mailing list