mshtml: Added IHTMLElement::get_sourceIndex implementation.
This commit is contained in:
parent
52fee14932
commit
063ef3ca0e
|
@ -907,8 +907,10 @@ static HRESULT WINAPI HTMLElement_contains(IHTMLElement *iface, IHTMLElement *pC
|
|||
static HRESULT WINAPI HTMLElement_get_sourceIndex(IHTMLElement *iface, LONG *p)
|
||||
{
|
||||
HTMLElement *This = impl_from_IHTMLElement(iface);
|
||||
FIXME("(%p)->(%p)\n", This, p);
|
||||
return E_NOTIMPL;
|
||||
|
||||
TRACE("(%p)->(%p)\n", This, p);
|
||||
|
||||
return get_elem_source_index(This, p);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI HTMLElement_get_recordNumber(IHTMLElement *iface, VARIANT *p)
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <assert.h>
|
||||
|
||||
#define COBJMACROS
|
||||
|
||||
|
@ -746,6 +747,75 @@ IHTMLElementCollection *create_collection_from_htmlcol(HTMLDocumentNode *doc, ns
|
|||
return HTMLElementCollection_Create(buf.buf, buf.len);
|
||||
}
|
||||
|
||||
HRESULT get_elem_source_index(HTMLElement *elem, LONG *ret)
|
||||
{
|
||||
elem_vector_t buf = {NULL, 0, 8};
|
||||
nsIDOMNode *parent_node, *iter;
|
||||
UINT16 parent_type;
|
||||
HTMLDOMNode *node;
|
||||
int i;
|
||||
nsresult nsres;
|
||||
HRESULT hres;
|
||||
|
||||
iter = elem->node.nsnode;
|
||||
nsIDOMNode_AddRef(iter);
|
||||
|
||||
/* Find document or document fragment parent. */
|
||||
while(1) {
|
||||
nsres = nsIDOMNode_GetParentNode(iter, &parent_node);
|
||||
nsIDOMNode_Release(iter);
|
||||
assert(nsres == NS_OK);
|
||||
if(!parent_node)
|
||||
break;
|
||||
|
||||
nsres = nsIDOMNode_GetNodeType(parent_node, &parent_type);
|
||||
assert(nsres == NS_OK);
|
||||
|
||||
if(parent_type != ELEMENT_NODE) {
|
||||
if(parent_type != DOCUMENT_NODE && parent_type != DOCUMENT_FRAGMENT_NODE)
|
||||
FIXME("Unexpected parent_type %d\n", parent_type);
|
||||
break;
|
||||
}
|
||||
|
||||
iter = parent_node;
|
||||
}
|
||||
|
||||
if(!parent_node) {
|
||||
*ret = -1;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
hres = get_node(elem->node.doc, parent_node, TRUE, &node);
|
||||
nsIDOMNode_Release(parent_node);
|
||||
if(FAILED(hres))
|
||||
return hres;
|
||||
|
||||
|
||||
/* Create all children collection and find the element in it.
|
||||
* This could be optimized if we ever find the reason. */
|
||||
buf.buf = heap_alloc(buf.size*sizeof(*buf.buf));
|
||||
if(!buf.buf) {
|
||||
IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface);
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
create_all_list(elem->node.doc, node, &buf);
|
||||
|
||||
for(i=0; i < buf.len; i++) {
|
||||
if(buf.buf[i] == elem)
|
||||
break;
|
||||
}
|
||||
IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface);
|
||||
heap_free(buf.buf);
|
||||
if(i == buf.len) {
|
||||
FIXME("The element is not in parent's child list?\n");
|
||||
return E_UNEXPECTED;
|
||||
}
|
||||
|
||||
*ret = i;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static IHTMLElementCollection *HTMLElementCollection_Create(HTMLElement **elems, DWORD len)
|
||||
{
|
||||
HTMLElementCollection *ret = heap_alloc_zero(sizeof(HTMLElementCollection));
|
||||
|
|
|
@ -961,6 +961,7 @@ HRESULT wrap_iface(IUnknown*,IUnknown*,IUnknown**) DECLSPEC_HIDDEN;
|
|||
IHTMLElementCollection *create_all_collection(HTMLDOMNode*,BOOL) DECLSPEC_HIDDEN;
|
||||
IHTMLElementCollection *create_collection_from_nodelist(HTMLDocumentNode*,nsIDOMNodeList*) DECLSPEC_HIDDEN;
|
||||
IHTMLElementCollection *create_collection_from_htmlcol(HTMLDocumentNode*,nsIDOMHTMLCollection*) DECLSPEC_HIDDEN;
|
||||
HRESULT get_elem_source_index(HTMLElement*,LONG*) DECLSPEC_HIDDEN;
|
||||
|
||||
nsresult get_elem_attr_value(nsIDOMHTMLElement*,const WCHAR*,nsAString*,const PRUnichar**) DECLSPEC_HIDDEN;
|
||||
HRESULT elem_string_attr_getter(HTMLElement*,const WCHAR*,BOOL,BSTR*) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -1142,6 +1142,17 @@ static void _test_elem_offset(unsigned line, IUnknown *unk, const char *parent_t
|
|||
IHTMLElement_Release(elem);
|
||||
}
|
||||
|
||||
#define test_elem_source_index(a,b) _test_elem_source_index(__LINE__,a,b)
|
||||
static void _test_elem_source_index(unsigned line, IHTMLElement *elem, int index)
|
||||
{
|
||||
LONG l = 0xdeadbeef;
|
||||
HRESULT hres;
|
||||
|
||||
hres = IHTMLElement_get_sourceIndex(elem, &l);
|
||||
ok_(__FILE__,line)(hres == S_OK, "get_sourceIndex failed: %08x\n", hres);
|
||||
ok_(__FILE__,line)(l == index, "sourceIndex = %d, expected %d\n", l, index);
|
||||
}
|
||||
|
||||
#define get_doc_node(d) _get_doc_node(__LINE__,d)
|
||||
static IHTMLDocument2 *_get_doc_node(unsigned line, IHTMLDocument2 *doc)
|
||||
{
|
||||
|
@ -2105,6 +2116,26 @@ static void _test_range_parent(unsigned line, IHTMLTxtRange *range, elem_type_t
|
|||
IHTMLElement_Release(elem);
|
||||
}
|
||||
|
||||
#define get_elem_col_item_idx(a,b) _get_elem_col_item_idx(__LINE__,a,b)
|
||||
static IHTMLElement *_get_elem_col_item_idx(unsigned line, IHTMLElementCollection *col, int i)
|
||||
{
|
||||
VARIANT name, index;
|
||||
IHTMLElement *elem;
|
||||
IDispatch *disp;
|
||||
HRESULT hres;
|
||||
|
||||
V_VT(&index) = VT_EMPTY;
|
||||
V_VT(&name) = VT_I4;
|
||||
V_I4(&name) = i;
|
||||
hres = IHTMLElementCollection_item(col, name, index, &disp);
|
||||
ok_(__FILE__,line)(hres == S_OK, "item failed: %08x\n", hres);
|
||||
ok_(__FILE__,line)(disp != NULL, "disp == NULL\n");
|
||||
|
||||
elem = _get_elem_iface(line, (IUnknown*)disp);
|
||||
IDispatch_Release(disp);
|
||||
return elem;
|
||||
}
|
||||
|
||||
#define test_elem_collection(c,t,l) _test_elem_collection(__LINE__,c,t,l)
|
||||
static void _test_elem_collection(unsigned line, IUnknown *unk,
|
||||
const elem_type_t *elem_types, LONG exlen)
|
||||
|
@ -2290,20 +2321,8 @@ static void _test_elem_getelembytag(unsigned line, IUnknown *unk, elem_type_t ty
|
|||
|
||||
HeapFree(GetProcessHeap(), 0, types);
|
||||
|
||||
if(ret) {
|
||||
IDispatch *disp;
|
||||
VARIANT v;
|
||||
|
||||
V_VT(&v) = VT_I4;
|
||||
V_I4(&v) = 0;
|
||||
disp = NULL;
|
||||
hres = IHTMLElementCollection_item(col, v, v, &disp);
|
||||
ok(hres == S_OK, "item failed: %08x\n", hres);
|
||||
ok(disp != NULL, "disp == NULL\n");
|
||||
*ret = _get_elem_iface(line, (IUnknown*)disp);
|
||||
IDispatch_Release(disp);
|
||||
}
|
||||
|
||||
if(ret)
|
||||
*ret = get_elem_col_item_idx(col, 0);
|
||||
IHTMLElementCollection_Release(col);
|
||||
}
|
||||
|
||||
|
@ -6909,6 +6928,15 @@ static void test_elems(IHTMLDocument2 *doc)
|
|||
ok(hres == S_OK, "get_all failed: %08x\n", hres);
|
||||
test_elem_collection((IUnknown*)col, all_types, sizeof(all_types)/sizeof(all_types[0]));
|
||||
test_elem_col_item(col, "x", item_types, sizeof(item_types)/sizeof(item_types[0]));
|
||||
|
||||
elem = get_elem_col_item_idx(col, 0);
|
||||
test_elem_source_index(elem, 0);
|
||||
IHTMLElement_Release(elem);
|
||||
|
||||
elem = get_elem_col_item_idx(col, 3);
|
||||
test_elem_source_index(elem, 3);
|
||||
IHTMLElement_Release(elem);
|
||||
|
||||
IHTMLElementCollection_Release(col);
|
||||
|
||||
hres = IHTMLDocument2_get_images(doc, &collection);
|
||||
|
@ -7012,6 +7040,7 @@ static void test_elems(IHTMLDocument2 *doc)
|
|||
|
||||
elem2 = test_elem_get_parent((IUnknown*)elem3);
|
||||
ok(elem2 == NULL, "elem2 != NULL\n");
|
||||
test_elem_source_index(elem3, 0);
|
||||
IHTMLElement_Release(elem3);
|
||||
|
||||
test_elem_getelembytag((IUnknown*)elem, ET_OPTION, 2, NULL);
|
||||
|
@ -7737,6 +7766,7 @@ static void test_create_elems(IHTMLDocument2 *doc)
|
|||
ok(type == 1, "type=%d\n", type);
|
||||
test_ifaces((IUnknown*)elem, elem_iids);
|
||||
test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement, "[object]");
|
||||
test_elem_source_index(elem, -1);
|
||||
|
||||
body = doc_get_body(doc);
|
||||
test_node_has_child((IUnknown*)body, VARIANT_FALSE);
|
||||
|
@ -8333,7 +8363,9 @@ static void test_docfrag(IHTMLDocument2 *doc)
|
|||
ok(location == (void*)0xdeadbeef, "location changed\n");
|
||||
|
||||
br = test_create_elem(doc, "BR");
|
||||
test_elem_source_index(br, -1);
|
||||
test_node_append_child((IUnknown*)frag, (IUnknown*)br);
|
||||
test_elem_source_index(br, 0);
|
||||
IHTMLElement_Release(br);
|
||||
|
||||
div = get_elem_by_id(doc, "divid", TRUE);
|
||||
|
|
Loading…
Reference in New Issue