Module: wine Branch: master Commit: 6d4533a8f87cae8b8f0e481ea777a38ab487cdd6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6d4533a8f87cae8b8f0e481ea7...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 30 14:34:47 2009 +0200
jscript: Added ActiveXObject constructor implementation.
---
dlls/jscript/Makefile.in | 2 +- dlls/jscript/activex.c | 124 +++++++++++++++++++++++++++++++++++++++++++- dlls/jscript/error.c | 5 ++ dlls/jscript/jscript.c | 6 ++ dlls/jscript/jscript.h | 4 +- dlls/jscript/jscript_En.rc | 1 + dlls/jscript/resource.h | 1 + 7 files changed, 139 insertions(+), 4 deletions(-)
diff --git a/dlls/jscript/Makefile.in b/dlls/jscript/Makefile.in index d9d490a..6373796 100644 --- a/dlls/jscript/Makefile.in +++ b/dlls/jscript/Makefile.in @@ -3,7 +3,7 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = jscript.dll -IMPORTS = oleaut32 user32 advapi32 kernel32 +IMPORTS = oleaut32 ole32 user32 advapi32 kernel32
RC_SRCS = \ jscript_De.rc \ diff --git a/dlls/jscript/activex.c b/dlls/jscript/activex.c index eada0c2..2029edf 100644 --- a/dlls/jscript/activex.c +++ b/dlls/jscript/activex.c @@ -20,16 +20,136 @@ #include "wine/port.h"
#include "jscript.h" +#include "objsafe.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(jscript);
+/* Defined as extern in urlmon.idl, but not exported by uuid.lib */ +const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY = + {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}}; + +static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx) +{ + IInternetHostSecurityManager *secmgr; + IServiceProvider *sp; + HRESULT hres; + + if(!ctx->site) + return NULL; + + if(ctx->secmgr) + return ctx->secmgr; + + hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp); + if(FAILED(hres)) + return NULL; + + hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager, + (void**)&secmgr); + IServiceProvider_Release(sp); + if(FAILED(hres)) + return NULL; + + return ctx->secmgr = secmgr; +} + +static IUnknown *create_activex_object(script_ctx_t *ctx, const WCHAR *progid) +{ + IInternetHostSecurityManager *secmgr; + struct CONFIRMSAFETY cs; + DWORD policy_size; + BYTE *bpolicy; + IUnknown *obj; + DWORD policy; + GUID guid; + HRESULT hres; + + hres = CLSIDFromProgID(progid, &guid); + if(FAILED(hres)) + return NULL; + + TRACE("GUID %s\n", debugstr_guid(&guid)); + + secmgr = get_sec_mgr(ctx); + if(!secmgr) + return NULL; + + policy = 0; + hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy), + (BYTE*)&guid, sizeof(GUID), 0, 0); + if(FAILED(hres) || policy != URLPOLICY_ALLOW) + return NULL; + + /* FIXME: Use IClassFactoryEx */ + + hres = CoCreateInstance(&guid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IUnknown, (void**)&obj); + if(FAILED(hres)) + return NULL; + + cs.clsid = guid; + cs.pUnk = obj; + cs.dwFlags = 0; + hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY, &bpolicy, &policy_size, + (BYTE*)&cs, sizeof(cs), 0); + if(SUCCEEDED(hres)) { + policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW; + CoTaskMemFree(bpolicy); + } + + if(FAILED(hres) || policy != URLPOLICY_ALLOW) { + IUnknown_Release(obj); + return NULL; + } + + return obj; +} + static HRESULT ActiveXObject_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + IDispatch *disp; + IUnknown *obj; + BSTR progid; + HRESULT hres; + + TRACE("\n"); + + if(flags != DISPATCH_CONSTRUCT) { + FIXME("unsupported flags %x\n", flags); + return E_NOTIMPL; + } + + if(ctx->safeopt != (INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER)) { + FIXME("Unsupported safeopt %x\n", ctx->safeopt); + return E_NOTIMPL; + } + + if(arg_cnt(dp) != 1) { + FIXME("unsuported arg_cnt %d\n", arg_cnt(dp)); + return E_NOTIMPL; + } + + hres = to_string(ctx, get_arg(dp,0), ei, &progid); + if(FAILED(hres)) + return hres; + + obj = create_activex_object(ctx, progid); + SysFreeString(progid); + if(!obj) + return throw_generic_error(ctx, ei, IDS_CREATE_OBJ_ERROR, NULL); + + hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&disp); + IUnknown_Release(obj); + if(FAILED(hres)) { + FIXME("Object does not support IDispatch\n"); + return E_NOTIMPL; + } + + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = disp; + return S_OK; }
HRESULT create_activex_constr(script_ctx_t *ctx, DispatchEx **ret) diff --git a/dlls/jscript/error.c b/dlls/jscript/error.c index 91bc95a..9530a4c 100644 --- a/dlls/jscript/error.c +++ b/dlls/jscript/error.c @@ -429,6 +429,11 @@ HRESULT throw_eval_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR return throw_error(ctx, ei, id, str, ctx->eval_error_constr); }
+HRESULT throw_generic_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) +{ + return throw_error(ctx, ei, id, str, ctx->error_constr); +} + HRESULT throw_range_error(script_ctx_t *ctx, jsexcept_t *ei, UINT id, const WCHAR *str) { return throw_error(ctx, ei, id, str, ctx->range_error_constr); diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index 1efe8e1..90a5b47 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -351,6 +351,11 @@ static HRESULT WINAPI JScript_Close(IActiveScript *iface) This->ctx->named_items = NULL; }
+ if(This->ctx->secmgr) { + IInternetHostSecurityManager_Release(This->ctx->secmgr); + This->ctx->secmgr = NULL; + } + if(This->ctx->site) { IActiveScriptSite_Release(This->ctx->site); This->ctx->site = NULL; @@ -554,6 +559,7 @@ static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
ctx->ref = 1; ctx->state = SCRIPTSTATE_UNINITIALIZED; + ctx->safeopt = This->safeopt; jsheap_init(&ctx->tmp_heap);
ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL); diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 9190110..533be57 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -214,6 +214,7 @@ HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,cons HRESULT Function_value(script_ctx_t*,vdisp_t*,WORD,DISPPARAMS*,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT throw_eval_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); +HRESULT throw_generic_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT throw_range_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT throw_reference_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT throw_regexp_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); @@ -221,7 +222,6 @@ HRESULT throw_syntax_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT throw_type_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*); HRESULT throw_uri_error(script_ctx_t*,jsexcept_t*,UINT,const WCHAR*);
- HRESULT create_object(script_ctx_t*,DispatchEx*,DispatchEx**); HRESULT create_math(script_ctx_t*,DispatchEx**); HRESULT create_array(script_ctx_t*,DWORD,DispatchEx**); @@ -260,6 +260,8 @@ struct _script_ctx_t { exec_ctx_t *exec_ctx; named_item_t *named_items; IActiveScriptSite *site; + IInternetHostSecurityManager *secmgr; + DWORD safeopt; LCID lcid;
jsheap_t tmp_heap; diff --git a/dlls/jscript/jscript_En.rc b/dlls/jscript/jscript_En.rc index 7962ad3..14be9bd 100644 --- a/dlls/jscript/jscript_En.rc +++ b/dlls/jscript/jscript_En.rc @@ -24,6 +24,7 @@ STRINGTABLE DISCARDABLE { IDS_TO_PRIMITIVE "Error converting object to primitive type" IDS_INVALID_CALL_ARG "Invalid procedure call or argument" + IDS_CREATE_OBJ_ERROR "Automation server can't create object" IDS_NO_PROPERTY "Object doesn't support this property or method" IDS_ARG_NOT_OPT "Argument not optional" IDS_SYNTAX_ERROR "Syntax error" diff --git a/dlls/jscript/resource.h b/dlls/jscript/resource.h index fcebcb9..17c0df0 100644 --- a/dlls/jscript/resource.h +++ b/dlls/jscript/resource.h @@ -20,6 +20,7 @@
#define IDS_TO_PRIMITIVE 0x0001 #define IDS_INVALID_CALL_ARG 0x0005 +#define IDS_CREATE_OBJ_ERROR 0x01AD #define IDS_NO_PROPERTY 0x01B6 #define IDS_ARG_NOT_OPT 0x01c1 #define IDS_SYNTAX_ERROR 0x03EA