Gabriel Ivăncescu : vbscript: Implement the SCRIPTITEM_CODEONLY flag.

Alexandre Julliard julliard at winehq.org
Thu Feb 13 15:36:32 CST 2020


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

Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date:   Thu Feb 13 19:50:03 2020 +0100

vbscript: Implement the SCRIPTITEM_CODEONLY flag.

Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/vbscript/tests/vbscript.c | 83 +++++++++++++++++++++++++++++++++++++++---
 dlls/vbscript/vbscript.c       |  2 +-
 2 files changed, 79 insertions(+), 6 deletions(-)

diff --git a/dlls/vbscript/tests/vbscript.c b/dlls/vbscript/tests/vbscript.c
index 10af993ba5..04c9170504 100644
--- a/dlls/vbscript/tests/vbscript.c
+++ b/dlls/vbscript/tests/vbscript.c
@@ -95,8 +95,11 @@ DEFINE_EXPECT(OnStateChange_CLOSED);
 DEFINE_EXPECT(OnStateChange_INITIALIZED);
 DEFINE_EXPECT(OnEnterScript);
 DEFINE_EXPECT(OnLeaveScript);
+DEFINE_EXPECT(OnScriptError);
+DEFINE_EXPECT(GetIDsOfNames);
 DEFINE_EXPECT(GetItemInfo_global);
 DEFINE_EXPECT(GetItemInfo_visible);
+DEFINE_EXPECT(GetItemInfo_visible_code);
 DEFINE_EXPECT(testCall);
 
 DEFINE_GUID(CLSID_VBScript, 0xb54f3741, 0x5b07, 0x11cf, 0xa4,0xb0, 0x00,0xaa,0x00,0x4a,0x55,0xe8);
@@ -137,7 +140,7 @@ static HRESULT WINAPI Dispatch_QueryInterface(IDispatch *iface, REFIID riid, voi
     return E_NOINTERFACE;
 }
 
-static ULONG global_named_item_ref, visible_named_item_ref;
+static ULONG global_named_item_ref, visible_named_item_ref, visible_code_named_item_ref;
 
 static ULONG WINAPI global_AddRef(IDispatch *iface)
 {
@@ -159,6 +162,16 @@ static ULONG WINAPI visible_Release(IDispatch *iface)
     return --visible_named_item_ref;
 }
 
+static ULONG WINAPI visible_code_AddRef(IDispatch *iface)
+{
+    return ++visible_code_named_item_ref;
+}
+
+static ULONG WINAPI visible_code_Release(IDispatch *iface)
+{
+    return --visible_code_named_item_ref;
+}
+
 static HRESULT WINAPI Dispatch_GetTypeInfoCount(IDispatch *iface, UINT *pctinfo)
 {
     ok(0, "unexpected call\n");
@@ -174,9 +187,13 @@ static HRESULT WINAPI Dispatch_GetIDsOfNames(IDispatch *iface, REFIID riid, LPOL
                                             LCID lcid, DISPID *ids)
 {
     ok(name_cnt == 1, "name_cnt = %u\n", name_cnt);
-    ok(!wcscmp(names[0], L"testCall"), "names[0] = %s\n", wine_dbgstr_w(names[0]));
-    *ids = 1;
-    return S_OK;
+    if(!wcscmp(names[0], L"testCall")) {
+        *ids = 1;
+        return S_OK;
+    }
+
+    CHECK_EXPECT2(GetIDsOfNames);
+    return DISP_E_UNKNOWNNAME;
 }
 
 static HRESULT WINAPI Dispatch_Invoke(IDispatch *iface, DISPID id, REFIID riid, LCID lcid, WORD flags,
@@ -214,6 +231,18 @@ static const IDispatchVtbl visible_named_item_vtbl = {
 
 static IDispatch visible_named_item = { &visible_named_item_vtbl };
 
+static const IDispatchVtbl visible_code_named_item_vtbl = {
+    Dispatch_QueryInterface,
+    visible_code_AddRef,
+    visible_code_Release,
+    Dispatch_GetTypeInfoCount,
+    Dispatch_GetTypeInfo,
+    Dispatch_GetIDsOfNames,
+    Dispatch_Invoke
+};
+
+static IDispatch visible_code_named_item = { &visible_code_named_item_vtbl };
+
 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
 {
     *ppv = NULL;
@@ -261,6 +290,12 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC
         *item_unk = (IUnknown*)&visible_named_item;
         return S_OK;
     }
+    if(!wcscmp(name, L"visibleCodeItem")) {
+        CHECK_EXPECT(GetItemInfo_visible_code);
+        IDispatch_AddRef(&visible_code_named_item);
+        *item_unk = (IUnknown*)&visible_code_named_item;
+        return S_OK;
+    }
     ok(0, "unexpected call %s\n", wine_dbgstr_w(name));
     return E_NOTIMPL;
 }
@@ -308,7 +343,7 @@ static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, S
 
 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
 {
-    ok(0, "unexpected call\n");
+    CHECK_EXPECT(OnScriptError);
     return E_NOTIMPL;
 }
 
@@ -1704,6 +1739,7 @@ static void test_named_items(void)
 {
     IActiveScriptParse *parse;
     IActiveScript *script;
+    IDispatch *disp;
     ULONG ref;
     HRESULT hres;
 
@@ -1731,9 +1767,14 @@ static void test_named_items(void)
 
     hres = IActiveScript_AddNamedItem(script, L"visibleItem", SCRIPTITEM_ISVISIBLE);
     ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+    hres = IActiveScript_AddNamedItem(script, L"visibleCodeItem", SCRIPTITEM_ISVISIBLE | SCRIPTITEM_CODEONLY);
+    ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
+    hres = IActiveScript_AddNamedItem(script, L"codeOnlyItem", SCRIPTITEM_CODEONLY);
+    ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
 
     ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     SET_EXPECT(OnStateChange_INITIALIZED);
     hres = IActiveScriptParse_InitNew(parse);
@@ -1755,8 +1796,39 @@ static void test_named_items(void)
     CHECK_CALLED(GetItemInfo_visible);
     CHECK_CALLED(testCall);
 
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(OnLeaveScript);
+    SET_EXPECT(testCall);
+    hres = IActiveScriptParse_ParseScriptText(parse, L"testCall\n", L"visibleCodeItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(OnLeaveScript);
+    CHECK_CALLED(testCall);
+
+    SET_EXPECT(OnEnterScript);
+    SET_EXPECT(GetIDsOfNames);
+    SET_EXPECT(OnScriptError);
+    SET_EXPECT(OnLeaveScript);
+    hres = IActiveScriptParse_ParseScriptText(parse, L"codeOnlyItem\n", L"codeOnlyItem", NULL, NULL, 0, 0, 0, NULL, NULL);
+    ok(FAILED(hres), "ParseScriptText returned: %08x\n", hres);
+    CHECK_CALLED(OnEnterScript);
+    CHECK_CALLED(GetIDsOfNames);
+    CHECK_CALLED(OnScriptError);
+    CHECK_CALLED(OnLeaveScript);
+
+    hres = IActiveScript_GetScriptDispatch(script, L"visibleCodeItem", &disp);
+    ok(hres == S_OK, "GetScriptDispatch returned: %08x\n", hres);
+    IDispatch_Release(disp);
+
+    SET_EXPECT(GetItemInfo_visible_code);
+    SET_EXPECT(testCall);
+    parse_script(parse, "visibleCodeItem.testCall\n");
+    CHECK_CALLED(GetItemInfo_visible_code);
+    CHECK_CALLED(testCall);
+
     ok(global_named_item_ref > 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 1, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 1, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     SET_EXPECT(testCall);
     parse_script(parse, "visibleItem.testCall\n");
@@ -1773,6 +1845,7 @@ static void test_named_items(void)
 
     ok(global_named_item_ref == 0, "global_named_item_ref = %u\n", global_named_item_ref);
     ok(visible_named_item_ref == 0, "visible_named_item_ref = %u\n", visible_named_item_ref);
+    ok(visible_code_named_item_ref == 0, "visible_code_named_item_ref = %u\n", visible_code_named_item_ref);
 
     test_state(script, SCRIPTSTATE_CLOSED);
 
diff --git a/dlls/vbscript/vbscript.c b/dlls/vbscript/vbscript.c
index 88574fe5c5..6b1a47e288 100644
--- a/dlls/vbscript/vbscript.c
+++ b/dlls/vbscript/vbscript.c
@@ -196,7 +196,7 @@ named_item_t *lookup_named_item(script_ctx_t *ctx, const WCHAR *name, unsigned f
 
     LIST_FOR_EACH_ENTRY(item, &ctx->named_items, named_item_t, entry) {
         if((item->flags & flags) == flags && !wcsicmp(item->name, name)) {
-            if(!item->disp) {
+            if(!item->disp && (flags || !(item->flags & SCRIPTITEM_CODEONLY))) {
                 IUnknown *unk;
 
                 hres = IActiveScriptSite_GetItemInfo(ctx->site, item->name,




More information about the wine-cvs mailing list