scrobj: Create script hosts for scriptlet instance.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
55e01ac012
commit
03f89b60fa
|
@ -102,6 +102,7 @@ struct scriptlet_instance
|
||||||
{
|
{
|
||||||
IDispatchEx IDispatchEx_iface;
|
IDispatchEx IDispatchEx_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
struct list hosts;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct script_host
|
struct script_host
|
||||||
|
@ -674,7 +675,10 @@ static ULONG WINAPI scriptlet_Release(IDispatchEx *iface)
|
||||||
TRACE("(%p) ref=%d\n", This, ref);
|
TRACE("(%p) ref=%d\n", This, ref);
|
||||||
|
|
||||||
if (!ref)
|
if (!ref)
|
||||||
|
{
|
||||||
|
detach_script_hosts(&This->hosts);
|
||||||
heap_free(This);
|
heap_free(This);
|
||||||
|
}
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -798,14 +802,29 @@ static IDispatchExVtbl DispatchExVtbl = {
|
||||||
scriptlet_GetNameSpaceParent
|
scriptlet_GetNameSpaceParent
|
||||||
};
|
};
|
||||||
|
|
||||||
static HRESULT create_scriptlet_instance(IDispatchEx **disp)
|
static HRESULT create_scriptlet_instance(struct scriptlet_factory *factory, IDispatchEx **disp)
|
||||||
{
|
{
|
||||||
|
struct script_host *factory_host;
|
||||||
struct scriptlet_instance *obj;
|
struct scriptlet_instance *obj;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
if (!(obj = heap_alloc(sizeof(*obj)))) return E_OUTOFMEMORY;
|
if (!(obj = heap_alloc(sizeof(*obj)))) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
obj->IDispatchEx_iface.lpVtbl = &DispatchExVtbl;
|
obj->IDispatchEx_iface.lpVtbl = &DispatchExVtbl;
|
||||||
obj->ref = 1;
|
obj->ref = 1;
|
||||||
|
list_init(&obj->hosts);
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY(factory_host, &factory->hosts, struct script_host, entry)
|
||||||
|
{
|
||||||
|
hres = create_script_host(factory_host->language, factory_host->active_script, &obj->hosts);
|
||||||
|
if (FAILED(hres)) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(hres))
|
||||||
|
{
|
||||||
|
IDispatchEx_Release(&obj->IDispatchEx_iface);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
*disp = &obj->IDispatchEx_iface;
|
*disp = &obj->IDispatchEx_iface;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -1295,7 +1314,20 @@ static HRESULT WINAPI scriptlet_factory_CreateInstance(IClassFactory *iface, IUn
|
||||||
|
|
||||||
if (outer) FIXME("outer not supported\n");
|
if (outer) FIXME("outer not supported\n");
|
||||||
|
|
||||||
hres = create_scriptlet_instance(&disp);
|
if (list_empty(&This->hosts))
|
||||||
|
{
|
||||||
|
hres = create_scriptlet_hosts(This, &This->hosts);
|
||||||
|
if (FAILED(hres)) return hres;
|
||||||
|
|
||||||
|
hres = parse_scripts(This, &This->hosts, FALSE);
|
||||||
|
if (FAILED(hres))
|
||||||
|
{
|
||||||
|
detach_script_hosts(&This->hosts);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = create_scriptlet_instance(This, &disp);
|
||||||
if (FAILED(hres)) return hres;
|
if (FAILED(hres)) return hres;
|
||||||
|
|
||||||
hres = IDispatchEx_QueryInterface(disp, riid, ppv);
|
hres = IDispatchEx_QueryInterface(disp, riid, ppv);
|
||||||
|
|
|
@ -778,15 +778,10 @@ static void test_create_object(void)
|
||||||
SET_EXPECT(Clone);
|
SET_EXPECT(Clone);
|
||||||
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
||||||
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Clone);
|
CHECK_CALLED(Clone);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(CreateInstance);
|
CHECK_CALLED(CreateInstance);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(QI_IActiveScriptParse);
|
CHECK_CALLED(QI_IActiveScriptParse);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(InitNew);
|
CHECK_CALLED(InitNew);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptSite);
|
CHECK_CALLED(SetScriptSite);
|
||||||
todo_wine
|
todo_wine
|
||||||
CHECK_CALLED(AddNamedItem_scriptlet);
|
CHECK_CALLED(AddNamedItem_scriptlet);
|
||||||
|
@ -926,9 +921,7 @@ static void test_create_object(void)
|
||||||
todo_wine
|
todo_wine
|
||||||
SET_EXPECT(Close);
|
SET_EXPECT(Close);
|
||||||
IUnknown_Release(unk);
|
IUnknown_Release(unk);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Close);
|
CHECK_CALLED(Close);
|
||||||
|
|
||||||
parse_flags = SCRIPTTEXT_ISVISIBLE;
|
parse_flags = SCRIPTTEXT_ISVISIBLE;
|
||||||
|
@ -947,15 +940,10 @@ static void test_create_object(void)
|
||||||
SET_EXPECT(ParseScriptText);
|
SET_EXPECT(ParseScriptText);
|
||||||
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
||||||
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Clone);
|
CHECK_CALLED(Clone);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(CreateInstance);
|
CHECK_CALLED(CreateInstance);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(QI_IActiveScriptParse);
|
CHECK_CALLED(QI_IActiveScriptParse);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(InitNew);
|
CHECK_CALLED(InitNew);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptSite);
|
CHECK_CALLED(SetScriptSite);
|
||||||
todo_wine
|
todo_wine
|
||||||
CHECK_CALLED(AddNamedItem_scriptlet);
|
CHECK_CALLED(AddNamedItem_scriptlet);
|
||||||
|
@ -975,9 +963,7 @@ static void test_create_object(void)
|
||||||
SET_EXPECT(SetScriptState_UNINITIALIZED);
|
SET_EXPECT(SetScriptState_UNINITIALIZED);
|
||||||
SET_EXPECT(Close);
|
SET_EXPECT(Close);
|
||||||
IUnknown_Release(unk);
|
IUnknown_Release(unk);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Close);
|
CHECK_CALLED(Close);
|
||||||
|
|
||||||
support_clone = TRUE;
|
support_clone = TRUE;
|
||||||
|
@ -992,11 +978,8 @@ static void test_create_object(void)
|
||||||
SET_EXPECT(SetScriptState_STARTED);
|
SET_EXPECT(SetScriptState_STARTED);
|
||||||
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
|
||||||
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Clone);
|
CHECK_CALLED(Clone);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(QI_IActiveScriptParse);
|
CHECK_CALLED(QI_IActiveScriptParse);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptSite);
|
CHECK_CALLED(SetScriptSite);
|
||||||
todo_wine
|
todo_wine
|
||||||
CHECK_CALLED(AddNamedItem_scriptlet);
|
CHECK_CALLED(AddNamedItem_scriptlet);
|
||||||
|
@ -1014,14 +997,11 @@ static void test_create_object(void)
|
||||||
SET_EXPECT(SetScriptState_UNINITIALIZED);
|
SET_EXPECT(SetScriptState_UNINITIALIZED);
|
||||||
SET_EXPECT(Close);
|
SET_EXPECT(Close);
|
||||||
IUnknown_Release(unk);
|
IUnknown_Release(unk);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
CHECK_CALLED(SetScriptState_UNINITIALIZED);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Close);
|
CHECK_CALLED(Close);
|
||||||
|
|
||||||
SET_EXPECT(Close);
|
SET_EXPECT(Close);
|
||||||
IClassFactory_Release(cf);
|
IClassFactory_Release(cf);
|
||||||
todo_wine
|
|
||||||
CHECK_CALLED(Close);
|
CHECK_CALLED(Close);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue