From 51a2ccb4c475295741c03efe98b8a46bb82c509b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 5 Sep 2008 02:38:17 +0200 Subject: [PATCH] jscript: Added SCRIPTSTATE_STARTED implementation. --- dlls/jscript/jscript.c | 32 ++++++++++++++++++++++++++++++-- dlls/jscript/tests/jscript.c | 7 +++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index adfd73cb733..2bd9f12f40a 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -116,6 +116,16 @@ static void clear_script_queue(JScript *This) This->queue_head = This->queue_tail = NULL; } +static void exec_queued_code(JScript *This) +{ + parser_ctx_t *iter; + + for(iter = This->queue_head; iter; iter = iter->next) + exec_global_code(This, iter); + + clear_script_queue(This); +} + #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface) static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) @@ -235,8 +245,26 @@ static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid, static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->(%d)\n", This, ss); - return E_NOTIMPL; + + TRACE("(%p)->(%d)\n", This, ss); + + if(!This->ctx || GetCurrentThreadId() != This->thread_id) + return E_UNEXPECTED; + + switch(ss) { + case SCRIPTSTATE_STARTED: + if(This->ctx->state == SCRIPTSTATE_CLOSED) + return E_UNEXPECTED; + + exec_queued_code(This); + break; + default: + FIXME("unimplemented state %d\n", ss); + return E_NOTIMPL; + } + + change_state(This, ss); + return S_OK; } static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState) diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c index d923f33f125..b0c532f1a8c 100644 --- a/dlls/jscript/tests/jscript.c +++ b/dlls/jscript/tests/jscript.c @@ -317,6 +317,13 @@ static void test_jscript(void) test_script_dispatch(script, TRUE); + SET_EXPECT(OnStateChange_STARTED); + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); + CHECK_CALLED(OnStateChange_STARTED); + + test_state(script, SCRIPTSTATE_STARTED); + SET_EXPECT(OnStateChange_CLOSED); hres = IActiveScript_Close(script); ok(hres == S_OK, "Close failed: %08x\n", hres);