jscript: Added ActiveXObject constructor implementation.
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)