[PATCH v3 3/3] mshtml: Add console object stub implementation.

Jacek Caban jacek at codeweavers.com
Wed Jul 7 10:27:53 CDT 2021


Hi Paul,

On 7/7/21 2:03 PM, Paul Gofman wrote:
> Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
> ---
> v3:
>      - add console getter interface to HTMLWindow.
>
>   dlls/mshtml/Makefile.in              |   1 +
>   dlls/mshtml/console.c                | 294 +++++++++++++++++++++++++++


We already have more files than we should in mshtml, this could go to 
omnavigator.c instead.


> +void create_console(IWineMSHTMLConsole **ret)
> +{
> +    struct console *obj;
> +
> +    obj = heap_alloc_zero(sizeof(*obj));
> +    if(!obj)
> +    {
> +        ERR("No memory.\n");
> +        return;
> +    }
> +
> +    obj->IWineMSHTMLConsole_iface.lpVtbl = &WineMSHTMLConsoleVtbl;
> +    obj->ref = 1;
> +    init_dispatch(&obj->dispex, (IUnknown*)&obj->IWineMSHTMLConsole_iface, &console_dispex, COMPAT_MODE_NONE);


Compat mode affects some basic IDispatchEx behaviour now, so it should 
be specified properly here. For that, you will probably want to delay 
object creation.


> +
> +    *ret = &obj->IWineMSHTMLConsole_iface;
> +}
> diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
> index 6d248691d6b..e0c2ea2c121 100644
> --- a/dlls/mshtml/dispex.c
> +++ b/dlls/mshtml/dispex.c
> @@ -111,7 +111,7 @@ struct dispex_dynamic_data_t {
>   
>   #define FDEX_VERSION_MASK 0xf0000000
>   
> -static ITypeLib *typelib;
> +static ITypeLib *typelib, *typelib_private;
>   static ITypeInfo *typeinfos[LAST_tid];
>   static struct list dispex_data_list = LIST_INIT(dispex_data_list);
>   
> @@ -119,6 +119,8 @@ static REFIID tid_ids[] = {
>   #define XIID(iface) &IID_ ## iface,
>   #define XDIID(iface) &DIID_ ## iface,
>   TID_LIST
> +    NULL,
> +PRIVATE_TID_LIST
>   #undef XIID
>   #undef XDIID
>   };
> @@ -136,7 +138,17 @@ static HRESULT load_typelib(void)
>   
>       if(InterlockedCompareExchangePointer((void**)&typelib, tl, NULL))
>           ITypeLib_Release(tl);
> -    return hres;
> +
> +    hres = LoadTypeLibEx(L"mshtml.dll\\1", REGKIND_NONE, &tl);


It would be better to use something like GetModuleFileName() instead of 
hardcoding it.


> diff --git a/dlls/mshtml/mshtml_private_iface.idl b/dlls/mshtml/mshtml_private_iface.idl
> index 60ad70eede7..d721d09190a 100644
> --- a/dlls/mshtml/mshtml_private_iface.idl
> +++ b/dlls/mshtml/mshtml_private_iface.idl
> @@ -30,4 +30,119 @@ import "dispex.idl";
>   ]
>   library MSHTML_private
>   {
> +
> +importlib("stdole2.tlb");
> +
> +[
> +    odl,
> +    oleautomation,
> +    dual,
> +    hidden,
> +    uuid(fd55b4b6-2813-4fb4-829d-380099474ab1)
> +]
> +interface IWineMSHTMLConsole : IDispatch
> +{
> +    [id(1)]
> +    HRESULT assert([in] VARIANT_BOOL *assertion,
> +                   [in, optional] VARIANT *varargStart);
> +    [id(2)]
> +    HRESULT clear();
> +    [id(3)]
> +    HRESULT count([in, optional] VARIANT *label);
> +    [id(4)]
> +    HRESULT debug([in, optional] VARIANT *varargStart);
> +    [id(5)]
> +    HRESULT dir([in, optional] VARIANT *object);
> +    [id(6)]
> +    HRESULT dirxml([in, optional] VARIANT *object);
> +    [id(7)]
> +    HRESULT error([in, optional] VARIANT *varargStart);
> +    [id(8)]
> +    HRESULT group([in, optional] VARIANT *label);
> +    [id(9)]
> +    HRESULT groupCollapsed([in, optional] VARIANT *label);
> +    [id(10)]
> +    HRESULT groupEnd();
> +    [id(11)]
> +    HRESULT info([in, optional] VARIANT *varargStart);
> +    [id(12)]
> +    HRESULT log([in, optional] VARIANT *varargStart);
> +    [id(13)]
> +    HRESULT time([in, optional] VARIANT *label);
> +    [id(14)]
> +    HRESULT timeEnd([in, optional] VARIANT *label);
> +    [id(15)]
> +    HRESULT trace([in, optional] VARIANT *varargStart);
> +    [id(16)]
> +    HRESULT warn([in, optional] VARIANT *varargStart);
> +}
> +
> +[
> +    hidden,
> +    uuid(b61c3206-7c3d-4b56-bf16-a9f264747f58)
> +]
> +dispinterface DispWineMSHTMLConsole
> +{
> +properties:
> +methods:
> +    [id(1)]
> +    void assert([in] VARIANT_BOOL *assertion,
> +                [in, optional] VARIANT *varargStart);
> +    [id(2)]
> +    void clear();
> +    [id(3)]
> +    void count([in, optional] VARIANT *label);
> +    [id(4)]
> +    void debug([in, optional] VARIANT *varargStart);
> +    [id(5)]
> +    void dir([in, optional] VARIANT *object);
> +    [id(6)]
> +    void dirxml([in, optional] VARIANT *object);
> +    [id(7)]
> +    void error([in, optional] VARIANT *varargStart);
> +    [id(8)]
> +    void group([in, optional] VARIANT *label);
> +    [id(9)]
> +    void groupCollapsed([in, optional] VARIANT *label);
> +    [id(10)]
> +    void groupEnd();
> +    [id(11)]
> +    void info([in, optional] VARIANT *varargStart);
> +    [id(12)]
> +    void log([in, optional] VARIANT *varargStart);
> +    [id(13)]
> +    void time([in, optional] VARIANT *label);
> +    [id(14)]
> +    void timeEnd([in, optional] VARIANT *label);
> +    [id(15)]
> +    void trace([in, optional] VARIANT *varargStart);
> +    [id(16)]
> +    void warn([in, optional] VARIANT *varargStart);
> +}


You shouldn't need dispinterface at all.


> +
> +[
> +    odl,
> +    oleautomation,
> +    dual,
> +    hidden,
> +    uuid(1b5939fc-8f84-43f3-8d89-f9a92069fad7)
> +]
> +interface IWineConsoleGetter : IDispatch
> +{
> +    [propget, id(1)]
> +    HRESULT console([retval, out] IDispatch **console);
> +}


It would be have a more generic name for this. I was hoping that we 
could use it for requestAnimationFrame as well (which would be a nice 
excuse to introduce it in a separated patch).


> +
> +[
> +    hidden,
> +    uuid(b84d405a-8057-4cc7-86c6-e872bb6205ad)
> +]
> +dispinterface DispWineConsoleGetter
> +{
> +properties:
> +methods:
> +    [propget, id(1)]
> +    IDispatch *console();
> +}


Same here, dispinterface is not needed.


>   } /* library MSHTML_private */
> diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
> index a520253569c..e57aed5ca35 100644
> --- a/dlls/mshtml/tests/es5.js
> +++ b/dlls/mshtml/tests/es5.js
> @@ -1448,3 +1448,67 @@ sync_test("functions scope", function() {
>       ok(val == 8, "val != 8");
>       ok(w == 9, "w != 9");
>   });
> +
> +sync_test("console", function() {
> +    var except
> +
> +    window.console.log('1', '2');
> +    console.info('1', '2', '3');
> +    console.info();
> +    console.log();
> +    console.trace();
> +    console.warn();
> +    console.debug();
> +    console.error();
> +
> +    console.assert(false, '1');
> +    console.assert(true, '1');
> +    console.assert('1');
> +
> +    console.clear();
> +    console.count('1');
> +    console.count(1);
> +
> +
> +    except = false;
> +    try
> +    {
> +        console.countReset('1');
> +    }
> +    catch(e)
> +    {
> +        except = true;
> +    }
> +    ok(except, "console.countReset: expected exception");
> +    console.dir(document);
> +    console.dir();
> +    console.dirxml(document);
> +    console.group('1');
> +    console.groupCollapsed('1');
> +    console.groupEnd();
> +
> +    except = false;
> +    try
> +    {
> +        console.table(['1', '2']);
> +    }
> +    catch(e)
> +    {
> +        except = true;
> +    }
> +    ok(except, "console.table: expected exception");
> +
> +    console.time('1');
> +    console.timeEnd('1');
> +
> +    except = false;
> +    try
> +    {
> +        console.timeLog('1');
> +    }
> +    catch(e)
> +    {
> +        except = true;
> +    }
> +    ok(except, "console.timeLog: expected exception");
> +});


A test in documentmode.js "window_props" would be nice as well.


Thanks,

Jacek




More information about the wine-devel mailing list