Jacek Caban : jscript: Fixed SetScriptSite called before InitNew handling.

Alexandre Julliard julliard at winehq.org
Wed Nov 5 09:37:51 CST 2008


Module: wine
Branch: master
Commit: 89327655807842586589c185664360de221de940
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=89327655807842586589c185664360de221de940

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Nov  5 01:03:03 2008 +0100

jscript: Fixed SetScriptSite called before InitNew handling.

---

 dlls/jscript/jscript.c       |   42 ++++++++++++++++++---------------
 dlls/jscript/tests/jscript.c |   53 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 76 insertions(+), 19 deletions(-)

diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c
index 081f468..938b64e 100644
--- a/dlls/jscript/jscript.c
+++ b/dlls/jscript/jscript.c
@@ -36,6 +36,7 @@ typedef struct {
     DWORD safeopt;
     script_ctx_t *ctx;
     LONG thread_id;
+    LCID lcid;
 
     IActiveScriptSite *site;
 
@@ -127,6 +128,26 @@ static void exec_queued_code(JScript *This)
     clear_script_queue(This);
 }
 
+static HRESULT set_ctx_site(JScript *This)
+{
+    HRESULT hres;
+
+    This->ctx->lcid = This->lcid;
+
+    if(!This->ctx->script_disp) {
+        hres = create_dispex(This->ctx, NULL, NULL, &This->ctx->script_disp);
+        if(FAILED(hres))
+            return hres;
+    }
+
+    hres = init_global(This->ctx);
+    if(FAILED(hres))
+        return hres;
+
+    change_state(This, SCRIPTSTATE_INITIALIZED);
+    return S_OK;
+}
+
 #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface)
 
 static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv)
@@ -211,22 +232,6 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
     if(This->site)
         return E_UNEXPECTED;
 
-    if(!This->ctx) {
-        hres = IActiveScriptParse_InitNew(ASPARSE(This));
-        if(FAILED(hres))
-            return hres;
-    }
-
-    if(!This->ctx->script_disp) {
-        hres = create_dispex(This->ctx, NULL, NULL, &This->ctx->script_disp);
-        if(FAILED(hres))
-            return hres;
-    }
-
-    hres = init_global(This->ctx);
-    if(FAILED(hres))
-        return hres;
-
     if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0))
         return E_UNEXPECTED;
 
@@ -237,8 +242,7 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface,
     if(hres == S_OK)
         This->ctx->lcid = lcid;
 
-    change_state(This, SCRIPTSTATE_INITIALIZED);
-    return S_OK;
+    return This->ctx ? set_ctx_site(This) : S_OK;
 }
 
 static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid,
@@ -517,7 +521,7 @@ static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface)
         return E_UNEXPECTED;
     }
 
-    return S_OK;
+    return This->site ? set_ctx_site(This) : S_OK;
 }
 
 static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface,
diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c
index b0c532f..35818cc 100644
--- a/dlls/jscript/tests/jscript.c
+++ b/dlls/jscript/tests/jscript.c
@@ -339,11 +339,64 @@ static void test_jscript(void)
     ok(!ref, "ref = %d\n", ref);
 }
 
+static void test_jscript2(void)
+{
+    IActiveScriptParse *parse;
+    IActiveScript *script;
+    IUnknown *unk;
+    ULONG ref;
+    HRESULT hres;
+
+    hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
+            &IID_IUnknown, (void**)&unk);
+    ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
+    if(FAILED(hres))
+        return;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script);
+    ok(hres == S_OK, "Could not get IActiveScript: %08x\n", hres);
+
+    hres = IUnknown_QueryInterface(unk, &IID_IActiveScriptParse, (void**)&parse);
+    ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    SET_EXPECT(GetLCID);
+    hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite);
+    ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
+    CHECK_CALLED(GetLCID);
+
+    test_state(script, SCRIPTSTATE_UNINITIALIZED);
+
+    SET_EXPECT(OnStateChange_INITIALIZED);
+    hres = IActiveScriptParse_InitNew(parse);
+    ok(hres == S_OK, "InitNew failed: %08x\n", hres);
+    CHECK_CALLED(OnStateChange_INITIALIZED);
+
+    hres = IActiveScriptParse_InitNew(parse);
+    ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres);
+
+    SET_EXPECT(OnStateChange_CLOSED);
+    hres = IActiveScript_Close(script);
+    ok(hres == S_OK, "Close failed: %08x\n", hres);
+    CHECK_CALLED(OnStateChange_CLOSED);
+
+    test_state(script, SCRIPTSTATE_CLOSED);
+    test_script_dispatch(script, FALSE);
+
+    IActiveScriptParse_Release(parse);
+    IActiveScript_Release(script);
+
+    ref = IUnknown_Release(unk);
+    ok(!ref, "ref = %d\n", ref);
+}
+
 START_TEST(jscript)
 {
     CoInitialize(NULL);
 
     test_jscript();
+    test_jscript2();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list