Jacek Caban : scrobj: Create script hosts for scriptlet instance.

Alexandre Julliard julliard at winehq.org
Mon Sep 23 15:22:34 CDT 2019


Module: wine
Branch: master
Commit: 03f89b60facaa59ad4532b902b304743140c0597
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=03f89b60facaa59ad4532b902b304743140c0597

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 23 17:55:13 2019 +0200

scrobj: Create script hosts for scriptlet instance.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/scrobj/scrobj.c       | 36 ++++++++++++++++++++++++++++++++++--
 dlls/scrobj/tests/scrobj.c | 20 --------------------
 2 files changed, 34 insertions(+), 22 deletions(-)

diff --git a/dlls/scrobj/scrobj.c b/dlls/scrobj/scrobj.c
index 6b3b3ea6e8..251507ecf5 100644
--- a/dlls/scrobj/scrobj.c
+++ b/dlls/scrobj/scrobj.c
@@ -102,6 +102,7 @@ struct scriptlet_instance
 {
     IDispatchEx IDispatchEx_iface;
     LONG ref;
+    struct list hosts;
 };
 
 struct script_host
@@ -674,7 +675,10 @@ static ULONG WINAPI scriptlet_Release(IDispatchEx *iface)
     TRACE("(%p) ref=%d\n", This, ref);
 
     if (!ref)
+    {
+        detach_script_hosts(&This->hosts);
         heap_free(This);
+    }
     return ref;
 }
 
@@ -798,14 +802,29 @@ static IDispatchExVtbl DispatchExVtbl = {
     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;
+    HRESULT hres;
 
     if (!(obj = heap_alloc(sizeof(*obj)))) return E_OUTOFMEMORY;
 
     obj->IDispatchEx_iface.lpVtbl = &DispatchExVtbl;
     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;
     return S_OK;
@@ -1295,7 +1314,20 @@ static HRESULT WINAPI scriptlet_factory_CreateInstance(IClassFactory *iface, IUn
 
     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;
 
     hres = IDispatchEx_QueryInterface(disp, riid, ppv);
diff --git a/dlls/scrobj/tests/scrobj.c b/dlls/scrobj/tests/scrobj.c
index f968fe21ce..ef80dfb7d4 100644
--- a/dlls/scrobj/tests/scrobj.c
+++ b/dlls/scrobj/tests/scrobj.c
@@ -778,15 +778,10 @@ static void test_create_object(void)
     SET_EXPECT(Clone);
     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
     ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
-    todo_wine
     CHECK_CALLED(Clone);
-    todo_wine
     CHECK_CALLED(CreateInstance);
-    todo_wine
     CHECK_CALLED(QI_IActiveScriptParse);
-    todo_wine
     CHECK_CALLED(InitNew);
-    todo_wine
     CHECK_CALLED(SetScriptSite);
     todo_wine
     CHECK_CALLED(AddNamedItem_scriptlet);
@@ -926,9 +921,7 @@ static void test_create_object(void)
     todo_wine
     SET_EXPECT(Close);
     IUnknown_Release(unk);
-    todo_wine
     CHECK_CALLED(SetScriptState_UNINITIALIZED);
-    todo_wine
     CHECK_CALLED(Close);
 
     parse_flags = SCRIPTTEXT_ISVISIBLE;
@@ -947,15 +940,10 @@ static void test_create_object(void)
     SET_EXPECT(ParseScriptText);
     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
     ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
-    todo_wine
     CHECK_CALLED(Clone);
-    todo_wine
     CHECK_CALLED(CreateInstance);
-    todo_wine
     CHECK_CALLED(QI_IActiveScriptParse);
-    todo_wine
     CHECK_CALLED(InitNew);
-    todo_wine
     CHECK_CALLED(SetScriptSite);
     todo_wine
     CHECK_CALLED(AddNamedItem_scriptlet);
@@ -975,9 +963,7 @@ static void test_create_object(void)
     SET_EXPECT(SetScriptState_UNINITIALIZED);
     SET_EXPECT(Close);
     IUnknown_Release(unk);
-    todo_wine
     CHECK_CALLED(SetScriptState_UNINITIALIZED);
-    todo_wine
     CHECK_CALLED(Close);
 
     support_clone = TRUE;
@@ -992,11 +978,8 @@ static void test_create_object(void)
     SET_EXPECT(SetScriptState_STARTED);
     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&unk);
     ok(hres == S_OK, "Could not create scriptlet instance: %08x\n", hres);
-    todo_wine
     CHECK_CALLED(Clone);
-    todo_wine
     CHECK_CALLED(QI_IActiveScriptParse);
-    todo_wine
     CHECK_CALLED(SetScriptSite);
     todo_wine
     CHECK_CALLED(AddNamedItem_scriptlet);
@@ -1014,14 +997,11 @@ static void test_create_object(void)
     SET_EXPECT(SetScriptState_UNINITIALIZED);
     SET_EXPECT(Close);
     IUnknown_Release(unk);
-    todo_wine
     CHECK_CALLED(SetScriptState_UNINITIALIZED);
-    todo_wine
     CHECK_CALLED(Close);
 
     SET_EXPECT(Close);
     IClassFactory_Release(cf);
-    todo_wine
     CHECK_CALLED(Close);
 }
 




More information about the wine-cvs mailing list