diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 793bbb9d974..ed799d2e749 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -373,6 +373,22 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This) data->funcs = heap_realloc(data->funcs, data->func_cnt * sizeof(func_info_t)); qsort(data->funcs, data->func_cnt, sizeof(func_info_t), dispid_cmp); + for(i = 1; i < data->func_cnt && data->funcs[i-1].id != data->funcs[i].id; i++); + if(i < data->func_cnt) { + unsigned j = i--; + + /* We have at least one duplicated property. This may happen if more than one + * interface implements the same property. We have to remove these duplicated + * entries. */ + + while(j < data->func_cnt) { + while(j+1 < data->func_cnt && data->funcs[j+1].id == data->funcs[j].id) + j++; + data->funcs[i++] = data->funcs[j++]; + } + data->func_cnt = i; + } + data->name_table = heap_alloc(data->func_cnt * sizeof(func_info_t*)); for(i=0; i < data->func_cnt; i++) data->name_table[i] = data->funcs+i; diff --git a/dlls/mshtml/tests/jstest.html b/dlls/mshtml/tests/jstest.html index 2bd87b1b89a..ebf28618b89 100644 --- a/dlls/mshtml/tests/jstest.html +++ b/dlls/mshtml/tests/jstest.html @@ -165,6 +165,18 @@ function test_override_functions() { ok(tmp === "test", "div.addBehavior() = " + tmp); } +function test_forin() { + var cnt=0; + + document.body.innerHTML = ''; + + for(var x in document.getElementById("aid")) { + cnt++; + } + + ok(cnt > 100, "cnt = " + cnt); +} + var globalVar = false; function runTests() { @@ -185,6 +197,7 @@ function runTests() { test_attribute_collection(); test_arg_conv(); test_override_functions(); + test_forin(); var r = window.execScript("globalVar = true;"); ok(r === undefined, "execScript returned " + r);