Jacek Caban : scrobj: Parse scripts in DllInstall.
Alexandre Julliard
julliard at winehq.org
Mon Sep 23 15:22:34 CDT 2019
Module: wine
Branch: master
Commit: 55e01ac01267ca90b99d26450938fe7d0985ea06
URL: https://source.winehq.org/git/wine.git/?a=commit;h=55e01ac01267ca90b99d26450938fe7d0985ea06
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Sep 23 17:55:04 2019 +0200
scrobj: Parse scripts in DllInstall.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/scrobj/scrobj.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++
dlls/scrobj/tests/scrobj.c | 2 --
2 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/dlls/scrobj/scrobj.c b/dlls/scrobj/scrobj.c
index 32aedcd8f9..6b3b3ea6e8 100644
--- a/dlls/scrobj/scrobj.c
+++ b/dlls/scrobj/scrobj.c
@@ -117,6 +117,7 @@ struct script_host
IActiveScript *active_script;
IActiveScriptParse *parser;
+ SCRIPTSTATE state;
BOOL cloned;
};
@@ -204,6 +205,16 @@ static WCHAR *heap_strdupW(const WCHAR *str)
return ret;
}
+static HRESULT set_script_state(struct script_host *host, SCRIPTSTATE state)
+{
+ HRESULT hres;
+ if (state == host->state) return S_OK;
+ hres = IActiveScript_SetScriptState(host->active_script, state);
+ if (FAILED(hres)) return hres;
+ host->state = state;
+ return S_OK;
+}
+
static inline struct script_host *impl_from_IActiveScriptSite(IActiveScriptSite *iface)
{
return CONTAINING_RECORD(iface, struct script_host, IActiveScriptSite_iface);
@@ -437,6 +448,46 @@ static struct script_host *find_script_host(struct list *hosts, const WCHAR *lan
return NULL;
}
+static HRESULT parse_scripts(struct scriptlet_factory *factory, struct list *hosts, BOOL start)
+{
+ DWORD parse_flags = SCRIPTTEXT_ISVISIBLE;
+ struct scriptlet_script *script;
+ struct script_host *host;
+ HRESULT hres;
+
+ if (!start) parse_flags |= SCRIPTITEM_ISPERSISTENT;
+
+ LIST_FOR_EACH_ENTRY(script, &factory->scripts, struct scriptlet_script, entry)
+ {
+ host = find_script_host(hosts, script->language);
+
+ if (start && host->state != SCRIPTSTATE_STARTED)
+ {
+ hres = set_script_state(host, SCRIPTSTATE_STARTED);
+ if (FAILED(hres)) return hres;
+ }
+
+ if (host->cloned) continue;
+
+ hres = IActiveScriptParse_ParseScriptText(host->parser, script->body, NULL, NULL, NULL, 0, 0 /* FIXME */,
+ parse_flags, NULL, NULL);
+ if (FAILED(hres))
+ {
+ WARN("ParseScriptText failed: %08x\n", hres);
+ return hres;
+ }
+ }
+ if (!start)
+ {
+ LIST_FOR_EACH_ENTRY(host, hosts, struct script_host, entry)
+ {
+ if (host->state != SCRIPTSTATE_UNINITIALIZED)
+ set_script_state(host, SCRIPTSTATE_UNINITIALIZED);
+ }
+ }
+ return S_OK;
+}
+
static HRESULT init_script_host(struct script_host *host, IActiveScript *clone)
{
HRESULT hres;
@@ -509,6 +560,7 @@ static HRESULT create_script_host(const WCHAR *language, IActiveScript *origin_s
host->IActiveScriptSiteWindow_iface.lpVtbl = &ActiveScriptSiteWindowVtbl;
host->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl;
host->ref = 1;
+ host->state = SCRIPTSTATE_CLOSED;
if (!(host->language = heap_strdupW(language)))
{
@@ -533,6 +585,7 @@ static void detach_script_hosts(struct list *hosts)
while (!list_empty(hosts))
{
struct script_host *host = LIST_ENTRY(list_head(hosts), struct script_host, entry);
+ if (host->state != SCRIPTSTATE_UNINITIALIZED) set_script_state(host, SCRIPTSTATE_UNINITIALIZED);
list_remove(&host->entry);
if (host->parser)
{
@@ -1800,6 +1853,7 @@ HRESULT WINAPI DllInstall(BOOL install, const WCHAR *arg)
{
/* validate scripts */
hres = create_scriptlet_hosts(factory, &factory->hosts);
+ if (SUCCEEDED(hres)) hres = parse_scripts(factory, &factory->hosts, FALSE);
}
else
{
diff --git a/dlls/scrobj/tests/scrobj.c b/dlls/scrobj/tests/scrobj.c
index 9afa11d419..f968fe21ce 100644
--- a/dlls/scrobj/tests/scrobj.c
+++ b/dlls/scrobj/tests/scrobj.c
@@ -720,9 +720,7 @@ static void register_script_object(BOOL do_register, const WCHAR *file_name)
CHECK_CALLED(QI_IActiveScriptParse);
CHECK_CALLED(InitNew);
CHECK_CALLED(SetScriptSite);
- todo_wine
CHECK_CALLED(ParseScriptText);
- todo_wine
CHECK_CALLED(SetScriptState_UNINITIALIZED);
CHECK_CALLED(Close);
ok(hres == S_OK, "DllInstall failed: %08x\n", hres);
More information about the wine-cvs
mailing list