Alexandre Julliard pushed to branch master at wine / wine

Commits:

8 changed files:

Changes:

  • dlls/jscript/dispex.c
    ... ... @@ -318,13 +318,14 @@ static HRESULT find_external_prop(jsdisp_t *This, const WCHAR *name, BOOL case_i
    318 318
         return S_OK;
    
    319 319
     }
    
    320 320
     
    
    321
    -static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, dispex_prop_t **ret)
    
    321
    +static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens,
    
    322
    +                              dispex_prop_t *prop, dispex_prop_t **ret)
    
    322 323
     {
    
    323 324
         const builtin_prop_t *builtin;
    
    324
    -    dispex_prop_t *prop;
    
    325 325
         HRESULT hres;
    
    326 326
     
    
    327
    -    prop = lookup_dispex_prop(This, hash, name, case_insens);
    
    327
    +    if(!prop)
    
    328
    +        prop = lookup_dispex_prop(This, hash, name, case_insens);
    
    328 329
         if(prop && prop->type != PROP_DELETED) {
    
    329 330
             *ret = prop;
    
    330 331
             return S_OK;
    
    ... ... @@ -367,43 +368,52 @@ static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name,
    367 368
         return hres;
    
    368 369
     }
    
    369 370
     
    
    370
    -static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, dispex_prop_t **ret)
    
    371
    +static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens,
    
    372
    +                                   dispex_prop_t *own_prop, dispex_prop_t **ret)
    
    371 373
     {
    
    372
    -    dispex_prop_t *prop, *del=NULL;
    
    374
    +    dispex_prop_t *prot_prop = NULL;
    
    373 375
         HRESULT hres;
    
    374 376
     
    
    375
    -    hres = find_prop_name(This, hash, name, case_insens, &prop);
    
    377
    +    hres = find_prop_name(This, hash, name, case_insens, own_prop, &own_prop);
    
    376 378
         if(FAILED(hres))
    
    377 379
             return hres;
    
    378
    -    if(prop && prop->type==PROP_DELETED) {
    
    379
    -        del = prop;
    
    380
    -    } else if(prop) {
    
    381
    -        fix_protref_prop(This, prop);
    
    382
    -        *ret = prop;
    
    383
    -        return S_OK;
    
    380
    +    if(own_prop) {
    
    381
    +        if(own_prop->type == PROP_PROTREF) {
    
    382
    +            prot_prop = &This->prototype->props[own_prop->u.ref];
    
    383
    +        }else if(own_prop->type != PROP_DELETED) {
    
    384
    +            *ret = own_prop;
    
    385
    +            return S_OK;
    
    386
    +        }
    
    384 387
         }
    
    385 388
     
    
    386 389
         if(This->prototype) {
    
    387
    -        hres = find_prop_name_prot(This->prototype, hash, name, case_insens, &prop);
    
    390
    +        hres = find_prop_name_prot(This->prototype, hash, name, case_insens, prot_prop, &prot_prop);
    
    388 391
             if(FAILED(hres))
    
    389 392
                 return hres;
    
    390
    -        if(prop && prop->type != PROP_DELETED) {
    
    391
    -            if(del) {
    
    392
    -                del->type = PROP_PROTREF;
    
    393
    -                del->u.ref = prop - This->prototype->props;
    
    394
    -                prop = del;
    
    393
    +        if(prot_prop && prot_prop->type != PROP_DELETED) {
    
    394
    +            if(own_prop && case_insens && wcscmp(prot_prop->name, own_prop->name)) {
    
    395
    +                hres = find_prop_name(This, prot_prop->hash, prot_prop->name, FALSE, NULL, &own_prop);
    
    396
    +                if(FAILED(hres))
    
    397
    +                    return hres;
    
    398
    +                if(own_prop && own_prop->type != PROP_DELETED) {
    
    399
    +                    *ret = own_prop;
    
    400
    +                    return S_OK;
    
    401
    +                }
    
    402
    +            }
    
    403
    +            if(own_prop) {
    
    404
    +                own_prop->type = PROP_PROTREF;
    
    405
    +                own_prop->u.ref = prot_prop - This->prototype->props;
    
    395 406
                 }else {
    
    396
    -                prop = alloc_protref(This, prop->name, prop - This->prototype->props);
    
    397
    -                if(!prop)
    
    407
    +                own_prop = alloc_protref(This, prot_prop->name, prot_prop - This->prototype->props);
    
    408
    +                if(!own_prop)
    
    398 409
                         return E_OUTOFMEMORY;
    
    399 410
                 }
    
    400
    -
    
    401
    -            *ret = prop;
    
    402
    -            return S_OK;
    
    411
    +        }else if(own_prop) {
    
    412
    +            own_prop->type = PROP_DELETED;
    
    403 413
             }
    
    404 414
         }
    
    405 415
     
    
    406
    -    *ret = del;
    
    416
    +    *ret = own_prop;
    
    407 417
         return S_OK;
    
    408 418
     }
    
    409 419
     
    
    ... ... @@ -412,7 +422,7 @@ static HRESULT ensure_prop_name(jsdisp_t *This, const WCHAR *name, DWORD create_
    412 422
         dispex_prop_t *prop;
    
    413 423
         HRESULT hres;
    
    414 424
     
    
    415
    -    hres = find_prop_name_prot(This, string_hash(name), name, case_insens, &prop);
    
    425
    +    hres = find_prop_name_prot(This, string_hash(name), name, case_insens, NULL, &prop);
    
    416 426
         if(SUCCEEDED(hres) && (!prop || prop->type == PROP_DELETED)) {
    
    417 427
             TRACE("creating prop %s flags %lx\n", debugstr_w(name), create_flags);
    
    418 428
     
    
    ... ... @@ -742,7 +752,7 @@ static HRESULT fill_protrefs(jsdisp_t *This)
    742 752
             return hres;
    
    743 753
     
    
    744 754
         for(iter = This->prototype->props; iter < This->prototype->props+This->prototype->prop_cnt; iter++) {
    
    745
    -        hres = find_prop_name(This, iter->hash, iter->name, FALSE, &prop);
    
    755
    +        hres = find_prop_name(This, iter->hash, iter->name, FALSE, NULL, &prop);
    
    746 756
             if(FAILED(hres))
    
    747 757
                 return hres;
    
    748 758
             if(!prop || prop->type==PROP_DELETED) {
    
    ... ... @@ -2230,7 +2240,7 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IWineJSDispatch *iface, BSTR
    2230 2240
         if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK))
    
    2231 2241
             FIXME("Unsupported grfdex %lx\n", grfdex);
    
    2232 2242
     
    
    2233
    -    hres = find_prop_name(This, string_hash(bstrName), bstrName, grfdex & fdexNameCaseInsensitive, &prop);
    
    2243
    +    hres = find_prop_name(This, string_hash(bstrName), bstrName, grfdex & fdexNameCaseInsensitive, NULL, &prop);
    
    2234 2244
         if(FAILED(hres))
    
    2235 2245
             return hres;
    
    2236 2246
         if(!prop) {
    
    ... ... @@ -2420,7 +2430,7 @@ HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const built
    2420 2430
         dispex_prop_t *prop;
    
    2421 2431
         HRESULT hres;
    
    2422 2432
     
    
    2423
    -    hres = find_prop_name_prot(constr, string_hash(L"prototype"), L"prototype", FALSE, &prop);
    
    2433
    +    hres = find_prop_name_prot(constr, string_hash(L"prototype"), L"prototype", FALSE, NULL, &prop);
    
    2424 2434
         if(SUCCEEDED(hres) && prop && prop->type!=PROP_DELETED) {
    
    2425 2435
             jsval_t val;
    
    2426 2436
     
    
    ... ... @@ -2461,7 +2471,7 @@ HRESULT jsdisp_get_id(jsdisp_t *jsdisp, const WCHAR *name, DWORD flags, DISPID *
    2461 2471
             hres = ensure_prop_name(jsdisp, name, PROPF_ENUMERABLE | PROPF_CONFIGURABLE | PROPF_WRITABLE,
    
    2462 2472
                                     flags & fdexNameCaseInsensitive, &prop);
    
    2463 2473
         else
    
    2464
    -        hres = find_prop_name_prot(jsdisp, string_hash(name), name, flags & fdexNameCaseInsensitive, &prop);
    
    2474
    +        hres = find_prop_name_prot(jsdisp, string_hash(name), name, flags & fdexNameCaseInsensitive, NULL, &prop);
    
    2465 2475
         if(FAILED(hres))
    
    2466 2476
             return hres;
    
    2467 2477
     
    
    ... ... @@ -2522,7 +2532,7 @@ HRESULT jsdisp_call_name(jsdisp_t *disp, const WCHAR *name, WORD flags, unsigned
    2522 2532
         dispex_prop_t *prop;
    
    2523 2533
         HRESULT hres;
    
    2524 2534
     
    
    2525
    -    hres = find_prop_name_prot(disp, string_hash(name), name, FALSE, &prop);
    
    2535
    +    hres = find_prop_name_prot(disp, string_hash(name), name, FALSE, NULL, &prop);
    
    2526 2536
         if(FAILED(hres))
    
    2527 2537
             return hres;
    
    2528 2538
     
    
    ... ... @@ -2752,7 +2762,7 @@ HRESULT jsdisp_propput(jsdisp_t *obj, const WCHAR *name, DWORD flags, BOOL throw
    2752 2762
         if(obj->extensible)
    
    2753 2763
             hres = ensure_prop_name(obj, name, flags, FALSE, &prop);
    
    2754 2764
         else
    
    2755
    -        hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop);
    
    2765
    +        hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop);
    
    2756 2766
         if(FAILED(hres))
    
    2757 2767
             return hres;
    
    2758 2768
         if(!prop || (prop->type == PROP_DELETED && !obj->extensible))
    
    ... ... @@ -2853,7 +2863,7 @@ HRESULT jsdisp_propget_name(jsdisp_t *obj, const WCHAR *name, jsval_t *val)
    2853 2863
         dispex_prop_t *prop;
    
    2854 2864
         HRESULT hres;
    
    2855 2865
     
    
    2856
    -    hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, &prop);
    
    2866
    +    hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, NULL, &prop);
    
    2857 2867
         if(FAILED(hres))
    
    2858 2868
             return hres;
    
    2859 2869
     
    
    ... ... @@ -2873,7 +2883,7 @@ HRESULT jsdisp_get_idx(jsdisp_t *obj, DWORD idx, jsval_t *r)
    2873 2883
     
    
    2874 2884
         swprintf(name, ARRAY_SIZE(name), L"%d", idx);
    
    2875 2885
     
    
    2876
    -    hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, &prop);
    
    2886
    +    hres = find_prop_name_prot(obj, string_hash(name), name, FALSE, NULL, &prop);
    
    2877 2887
         if(FAILED(hres))
    
    2878 2888
             return hres;
    
    2879 2889
     
    
    ... ... @@ -2930,7 +2940,7 @@ HRESULT jsdisp_delete_idx(jsdisp_t *obj, DWORD idx)
    2930 2940
     
    
    2931 2941
         swprintf(buf, ARRAY_SIZE(buf), L"%d", idx);
    
    2932 2942
     
    
    2933
    -    hres = find_prop_name(obj, string_hash(buf), buf, FALSE, &prop);
    
    2943
    +    hres = find_prop_name(obj, string_hash(buf), buf, FALSE, NULL, &prop);
    
    2934 2944
         if(FAILED(hres) || !prop)
    
    2935 2945
             return hres;
    
    2936 2946
     
    
    ... ... @@ -3026,7 +3036,7 @@ HRESULT disp_delete_name(script_ctx_t *ctx, IDispatch *disp, jsstr_t *name, BOOL
    3026 3036
                 return E_OUTOFMEMORY;
    
    3027 3037
             }
    
    3028 3038
     
    
    3029
    -        hres = find_prop_name(jsdisp, string_hash(ptr), ptr, FALSE, &prop);
    
    3039
    +        hres = find_prop_name(jsdisp, string_hash(ptr), ptr, FALSE, NULL, &prop);
    
    3030 3040
             if(prop) {
    
    3031 3041
                 hres = delete_prop(prop, ret);
    
    3032 3042
             }else {
    
    ... ... @@ -3073,7 +3083,7 @@ HRESULT jsdisp_get_own_property(jsdisp_t *obj, const WCHAR *name, BOOL flags_onl
    3073 3083
         dispex_prop_t *prop;
    
    3074 3084
         HRESULT hres;
    
    3075 3085
     
    
    3076
    -    hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop);
    
    3086
    +    hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop);
    
    3077 3087
         if(FAILED(hres))
    
    3078 3088
             return hres;
    
    3079 3089
     
    
    ... ... @@ -3117,7 +3127,7 @@ HRESULT jsdisp_define_property(jsdisp_t *obj, const WCHAR *name, property_desc_t
    3117 3127
         dispex_prop_t *prop;
    
    3118 3128
         HRESULT hres;
    
    3119 3129
     
    
    3120
    -    hres = find_prop_name(obj, string_hash(name), name, FALSE, &prop);
    
    3130
    +    hres = find_prop_name(obj, string_hash(name), name, FALSE, NULL, &prop);
    
    3121 3131
         if(FAILED(hres))
    
    3122 3132
             return hres;
    
    3123 3133
     
    
    ... ... @@ -3408,7 +3418,7 @@ static HRESULT HostObject_to_string(jsdisp_t *jsdisp, jsstr_t **ret)
    3408 3418
     }
    
    3409 3419
     
    
    3410 3420
     static const builtin_info_t HostObject_info = {
    
    3411
    -    .class       = JSCLASS_OBJECT,
    
    3421
    +    .class       = JSCLASS_HOST,
    
    3412 3422
         .addref      = HostObject_addref,
    
    3413 3423
         .release     = HostObject_release,
    
    3414 3424
         .lookup_prop = HostObject_lookup_prop,
    

  • dlls/jscript/jscript.h
    ... ... @@ -119,6 +119,7 @@ typedef enum {
    119 119
         JSCLASS_MAP,
    
    120 120
         JSCLASS_SET,
    
    121 121
         JSCLASS_WEAKMAP,
    
    122
    +    JSCLASS_HOST,
    
    122 123
     } jsclass_t;
    
    123 124
     
    
    124 125
     jsdisp_t *iface_to_jsdisp(IDispatch*);
    

  • dlls/jscript/object.c
    ... ... @@ -55,7 +55,8 @@ static HRESULT Object_toString(script_ctx_t *ctx, jsval_t vthis, WORD flags, uns
    55 55
             L"[object Object]",
    
    56 56
             L"[object Object]",
    
    57 57
             L"[object Object]",
    
    58
    -        L"[object Object]"
    
    58
    +        L"[object Object]",
    
    59
    +        NULL
    
    59 60
         };
    
    60 61
     
    
    61 62
         TRACE("\n");
    

  • dlls/mshtml/dispex.c
    ... ... @@ -2169,6 +2169,20 @@ HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret)
    2169 2169
         HRESULT hres;
    
    2170 2170
     
    
    2171 2171
         if(is_custom_dispid(id)) {
    
    2172
    +        if(dispex->info->desc->vtbl->get_prop_desc) {
    
    2173
    +            struct property_info desc;
    
    2174
    +            WCHAR buf[12];
    
    2175
    +
    
    2176
    +            hres = dispex->info->desc->vtbl->get_prop_desc(dispex, id, &desc);
    
    2177
    +            if(FAILED(hres))
    
    2178
    +                return hres;
    
    2179
    +            if(!desc.name) {
    
    2180
    +                swprintf(buf, ARRAYSIZE(buf), L"%u", desc.index);
    
    2181
    +                desc.name = buf;
    
    2182
    +            }
    
    2183
    +            *ret = SysAllocString(desc.name);
    
    2184
    +            return *ret ? S_OK : E_OUTOFMEMORY;
    
    2185
    +        }
    
    2172 2186
             if(dispex->info->desc->vtbl->get_name)
    
    2173 2187
                 return dispex->info->desc->vtbl->get_name(dispex, id, ret);
    
    2174 2188
             return DISP_E_MEMBERNOTFOUND;
    
    ... ... @@ -2299,33 +2313,67 @@ static HRESULT WINAPI JSDispatchHost_GetJSDispatch(IWineJSDispatchHost *iface, I
    2299 2313
         return S_OK;
    
    2300 2314
     }
    
    2301 2315
     
    
    2316
    +HRESULT dispex_index_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc)
    
    2317
    +{
    
    2318
    +    desc->id = id;
    
    2319
    +    desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE;
    
    2320
    +    if(dispex->info->desc->vtbl->next_dispid)
    
    2321
    +        desc->flags |= PROPF_ENUMERABLE;
    
    2322
    +    desc->name = NULL;
    
    2323
    +    desc->index = id - MSHTML_DISPID_CUSTOM_MIN;
    
    2324
    +    desc->func_iid = 0;
    
    2325
    +    return S_OK;
    
    2326
    +}
    
    2327
    +
    
    2328
    +static HRESULT get_host_property_descriptor(DispatchEx *This, DISPID id, struct property_info *desc)
    
    2329
    +{
    
    2330
    +    HRESULT hres;
    
    2331
    +
    
    2332
    +    desc->id = id;
    
    2333
    +
    
    2334
    +    switch(get_dispid_type(id)) {
    
    2335
    +    case DISPEXPROP_BUILTIN: {
    
    2336
    +        func_info_t *func;
    
    2337
    +
    
    2338
    +        hres = get_builtin_func(This->info, id, &func);
    
    2339
    +        if(FAILED(hres))
    
    2340
    +            return hres;
    
    2341
    +        desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE;
    
    2342
    +        desc->name = func->name;
    
    2343
    +        if(func->func_disp_idx < 0) {
    
    2344
    +            desc->flags |= PROPF_ENUMERABLE;
    
    2345
    +            desc->func_iid = 0;
    
    2346
    +        }else {
    
    2347
    +            desc->func_iid = func->tid;
    
    2348
    +        }
    
    2349
    +        break;
    
    2350
    +    }
    
    2351
    +    case DISPEXPROP_DYNAMIC:
    
    2352
    +        desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE;
    
    2353
    +        desc->name = This->dynamic_data->props[id - DISPID_DYNPROP_0].name;
    
    2354
    +        desc->func_iid = 0;
    
    2355
    +        break;
    
    2356
    +    case DISPEXPROP_CUSTOM:
    
    2357
    +        return This->info->desc->vtbl->get_prop_desc(This, id, desc);
    
    2358
    +    }
    
    2359
    +
    
    2360
    +    return S_OK;
    
    2361
    +}
    
    2362
    +
    
    2302 2363
     static HRESULT WINAPI JSDispatchHost_LookupProperty(IWineJSDispatchHost *iface, const WCHAR *name, DWORD flags,
    
    2303 2364
                                                         struct property_info *desc)
    
    2304 2365
     {
    
    2305 2366
         DispatchEx *This = impl_from_IWineJSDispatchHost(iface);
    
    2306
    -    func_info_t *func;
    
    2307 2367
         DISPID id;
    
    2308 2368
         HRESULT hres;
    
    2309 2369
     
    
    2310 2370
         TRACE("%s (%p)->(%s)\n", This->info->desc->name, This, debugstr_w(name));
    
    2311 2371
     
    
    2312
    -    hres = get_builtin_id(This, name, flags, &id);
    
    2372
    +    hres = dispex_get_id(This, name, flags, &id);
    
    2313 2373
         if(FAILED(hres))
    
    2314 2374
             return hres;
    
    2315 2375
     
    
    2316
    -    hres = get_builtin_func(This->info, id, &func);
    
    2317
    -    if(FAILED(hres))
    
    2318
    -        return hres;
    
    2319
    -    desc->id = id;
    
    2320
    -    desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE;
    
    2321
    -    if(func->func_disp_idx < 0) {
    
    2322
    -        desc->flags |= PROPF_ENUMERABLE;
    
    2323
    -        desc->func_iid = 0;
    
    2324
    -    }else {
    
    2325
    -        desc->func_iid = func->tid;
    
    2326
    -    }
    
    2327
    -    desc->name = func->name;
    
    2328
    -    return S_OK;
    
    2376
    +    return get_host_property_descriptor(This, id, desc);
    
    2329 2377
     }
    
    2330 2378
     
    
    2331 2379
     static HRESULT WINAPI JSDispatchHost_NextProperty(IWineJSDispatchHost *iface, DISPID id, struct property_info *desc)
    

  • dlls/mshtml/htmlelem.c
    ... ... @@ -1073,21 +1073,6 @@ static HRESULT HTMLRectCollection_get_dispid(DispatchEx *dispex, const WCHAR *na
    1073 1073
         return S_OK;
    
    1074 1074
     }
    
    1075 1075
     
    
    1076
    -static HRESULT HTMLRectCollection_get_name(DispatchEx *dispex, DISPID id, BSTR *name)
    
    1077
    -{
    
    1078
    -    HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex);
    
    1079
    -    DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN;
    
    1080
    -    UINT32 len = 0;
    
    1081
    -    WCHAR buf[11];
    
    1082
    -
    
    1083
    -    nsIDOMClientRectList_GetLength(This->rect_list, &len);
    
    1084
    -    if(idx >= len)
    
    1085
    -        return DISP_E_MEMBERNOTFOUND;
    
    1086
    -
    
    1087
    -    len = swprintf(buf, ARRAY_SIZE(buf), L"%u", idx);
    
    1088
    -    return (*name = SysAllocStringLen(buf, len)) ? S_OK : E_OUTOFMEMORY;
    
    1089
    -}
    
    1090
    -
    
    1091 1076
     static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
    
    1092 1077
             VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
    
    1093 1078
     {
    
    ... ... @@ -1132,7 +1117,7 @@ static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = {
    1132 1117
         .traverse         = HTMLRectCollection_traverse,
    
    1133 1118
         .unlink           = HTMLRectCollection_unlink,
    
    1134 1119
         .get_dispid       = HTMLRectCollection_get_dispid,
    
    1135
    -    .get_name         = HTMLRectCollection_get_name,
    
    1120
    +    .get_prop_desc    = dispex_index_prop_desc,
    
    1136 1121
         .invoke           = HTMLRectCollection_invoke,
    
    1137 1122
     };
    
    1138 1123
     static const tid_t HTMLRectCollection_iface_tids[] = {
    
    ... ... @@ -3053,7 +3038,7 @@ static HRESULT WINAPI HTMLElement2_getClientRects(IHTMLElement2 *iface, IHTMLRec
    3053 3038
     
    
    3054 3039
         rects->IHTMLRectCollection_iface.lpVtbl = &HTMLRectCollectionVtbl;
    
    3055 3040
         rects->rect_list = rect_list;
    
    3056
    -    init_dispatch(&rects->dispex, &HTMLRectCollection_dispex, NULL,
    
    3041
    +    init_dispatch(&rects->dispex, &HTMLRectCollection_dispex, This->node.doc->script_global,
    
    3057 3042
                       dispex_compat_mode(&This->node.event_target.dispex));
    
    3058 3043
     
    
    3059 3044
         *pRectCol = &rects->IHTMLRectCollection_iface;
    

  • dlls/mshtml/mshtml_private.h
    ... ... @@ -392,6 +392,7 @@ typedef struct {
    392 392
         HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
    
    393 393
         HRESULT (*delete)(DispatchEx*,DISPID);
    
    394 394
         HRESULT (*next_dispid)(DispatchEx*,DISPID,DISPID*);
    
    395
    +    HRESULT (*get_prop_desc)(DispatchEx*,DISPID,struct property_info*);
    
    395 396
     
    
    396 397
         /* Similar to invoke, but allows overriding all dispids */
    
    397 398
         HRESULT (*disp_invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
    
    ... ... @@ -515,6 +516,7 @@ HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EX
    515 516
     HRESULT dispex_get_id(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *pid);
    
    516 517
     HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret);
    
    517 518
     HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret);
    
    519
    +HRESULT dispex_index_prop_desc(DispatchEx*,DISPID,struct property_info*);
    
    518 520
     
    
    519 521
     typedef enum {
    
    520 522
         DISPEXPROP_CUSTOM,
    

  • dlls/mshtml/tests/documentmode.js
    ... ... @@ -294,7 +294,7 @@ sync_test("builtin_toString", function() {
    294 294
         if(false /* todo_wine */) test("attributes", e.attributes, "NamedNodeMap");
    
    295 295
         test("childNodes", document.body.childNodes, "NodeList", null, true);
    
    296 296
         if(clientRects) test("clientRect", clientRects[0], "ClientRect", null, true);
    
    297
    -    if(clientRects) test("clientRects", clientRects, "ClientRectList", null, true);
    
    297
    +    if(clientRects) test("clientRects", clientRects, "ClientRectList");
    
    298 298
         if(currentStyle) test("currentStyle", currentStyle, "MSCurrentStyleCSSProperties", null, true);
    
    299 299
         if(v >= 11 /* todo_wine */) test("document", document, v < 11 ? "Document" : "HTMLDocument", null, true);
    
    300 300
         test("elements", document.getElementsByTagName("body"), "HTMLCollection", null, true);
    

  • dlls/mshtml/tests/dom.js
    ... ... @@ -331,6 +331,18 @@ sync_test("rects", function() {
    331 331
         ok(rects.length === 1, "rect.length = " + rects.length);
    
    332 332
         ok(rects[0].top === rect.top, "rects[0].top = " + rects[0].top + " rect.top = " + rect.top);
    
    333 333
         ok(rects[0].bottom === rect.bottom, "rects[0].bottom = " + rects[0].bottom + " rect.bottom = " + rect.bottom);
    
    334
    +
    
    335
    +    ok("" + rects[0] === "[object ClientRect]", "rects[0] = " + rects[0]);
    
    336
    +    ok(rects.hasOwnProperty("0"), 'rects.hasOwnProperty("0") = ' + rects.hasOwnProperty("0"));
    
    337
    +    todo_wine.
    
    338
    +    ok(rects.hasOwnProperty("1"), 'rects.hasOwnProperty("1") = ' + rects.hasOwnProperty("1"));
    
    339
    +    var desc = Object.getOwnPropertyDescriptor(rects, "0");
    
    340
    +    ok(desc.writable === true, "writable = " + desc.writable);
    
    341
    +    todo_wine.
    
    342
    +    ok(desc.enumerable === true, "enumerable = " + desc.enumerable);
    
    343
    +    ok(desc.configurable === true, "configurable = " + desc.configurable);
    
    344
    +    ok("" + desc.value === "[object ClientRect]", "desc.value = " + desc.value);
    
    345
    +
    
    334 346
         ok(rect.height === rect.bottom - rect.top, "rect.height = " + rect.height + " rect.bottom = " + rect.bottom + " rect.top = " + rect.top);
    
    335 347
         ok(rect.width === rect.right - rect.left, "rect.width = " + rect.width + " rect.right = " + rect.right + " rect.left = " + rect.left);
    
    336 348