From 244a6951acebbc2080a0f45e615b35e7044d8a76 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 21 Feb 2011 17:49:15 +0100 Subject: [PATCH] jscript: Added SetScriptState(SCRIPTSTATE_UNINITIALIZED) implementation. --- dlls/jscript/jscript.c | 163 +++++++++++++++++++++++++---------------- 1 file changed, 99 insertions(+), 64 deletions(-) diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index e5123b40a0d..a69b2930ecb 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include + #include "jscript.h" #include "engine.h" #include "objsafe.h" @@ -77,7 +79,8 @@ static void change_state(JScript *This, SCRIPTSTATE state) return; This->ctx->state = state; - IActiveScriptSite_OnStateChange(This->site, state); + if(This->site) + IActiveScriptSite_OnStateChange(This->site, state); } static inline BOOL is_started(script_ctx_t *ctx) @@ -153,6 +156,86 @@ static HRESULT set_ctx_site(JScript *This) return S_OK; } +static void decrease_state(JScript *This, SCRIPTSTATE state) +{ + if(This->ctx) { + switch(This->ctx->state) { + case SCRIPTSTATE_CONNECTED: + change_state(This, SCRIPTSTATE_DISCONNECTED); + if(state == SCRIPTSTATE_DISCONNECTED) + return; + + case SCRIPTSTATE_STARTED: + case SCRIPTSTATE_DISCONNECTED: + clear_script_queue(This); + + if(This->ctx->state == SCRIPTSTATE_DISCONNECTED) + change_state(This, SCRIPTSTATE_INITIALIZED); + if(state == SCRIPTSTATE_INITIALIZED) + return; + + case SCRIPTSTATE_INITIALIZED: + if(This->ctx->host_global) { + IDispatch_Release(This->ctx->host_global); + This->ctx->host_global = NULL; + } + + if(This->ctx->named_items) { + named_item_t *iter, *iter2; + + iter = This->ctx->named_items; + while(iter) { + iter2 = iter->next; + + if(iter->disp) + IDispatch_Release(iter->disp); + heap_free(iter->name); + heap_free(iter); + iter = iter2; + } + + This->ctx->named_items = NULL; + } + + if(This->ctx->secmgr) { + IInternetHostSecurityManager_Release(This->ctx->secmgr); + This->ctx->secmgr = NULL; + } + + if(This->ctx->site) { + IActiveScriptSite_Release(This->ctx->site); + This->ctx->site = NULL; + } + + if(This->ctx->global) { + jsdisp_release(This->ctx->global); + This->ctx->global = NULL; + } + + case SCRIPTSTATE_UNINITIALIZED: + change_state(This, state); + break; + default: + assert(0); + } + + change_state(This, state); + }else if(state == SCRIPTSTATE_UNINITIALIZED) { + if(This->site) + IActiveScriptSite_OnStateChange(This->site, state); + }else { + FIXME("NULL ctx\n"); + } + + if(state == SCRIPTSTATE_UNINITIALIZED) + This->thread_id = 0; + + if(This->site) { + IActiveScriptSite_Release(This->site); + This->site = NULL; + } +} + typedef struct { IServiceProvider IServiceProvider_iface; @@ -365,7 +448,18 @@ static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE s TRACE("(%p)->(%d)\n", This, ss); - if(!This->ctx || GetCurrentThreadId() != This->thread_id) + if(This->thread_id && GetCurrentThreadId() != This->thread_id) + return E_UNEXPECTED; + + if(ss == SCRIPTSTATE_UNINITIALIZED) { + if(This->ctx && This->ctx->state == SCRIPTSTATE_CLOSED) + return E_UNEXPECTED; + + decrease_state(This, SCRIPTSTATE_UNINITIALIZED); + return S_OK; + } + + if(!This->ctx) return E_UNEXPECTED; switch(ss) { @@ -397,12 +491,7 @@ static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE * if(!pssState) return E_POINTER; - if(!This->thread_id) { - *pssState = SCRIPTSTATE_UNINITIALIZED; - return S_OK; - } - - if(This->thread_id != GetCurrentThreadId()) + if(This->thread_id && This->thread_id != GetCurrentThreadId()) return E_UNEXPECTED; *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED; @@ -415,64 +504,10 @@ static HRESULT WINAPI JScript_Close(IActiveScript *iface) TRACE("(%p)->()\n", This); - if(This->thread_id != GetCurrentThreadId()) + if(This->thread_id && This->thread_id != GetCurrentThreadId()) return E_UNEXPECTED; - if(This->ctx) { - if(This->ctx->state == SCRIPTSTATE_CONNECTED) - change_state(This, SCRIPTSTATE_DISCONNECTED); - - clear_script_queue(This); - - if(This->ctx->state == SCRIPTSTATE_DISCONNECTED) - change_state(This, SCRIPTSTATE_INITIALIZED); - - if(This->ctx->host_global) { - IDispatch_Release(This->ctx->host_global); - This->ctx->host_global = NULL; - } - - if(This->ctx->named_items) { - named_item_t *iter, *iter2; - - iter = This->ctx->named_items; - while(iter) { - iter2 = iter->next; - - if(iter->disp) - IDispatch_Release(iter->disp); - heap_free(iter->name); - heap_free(iter); - iter = iter2; - } - - This->ctx->named_items = NULL; - } - - if(This->ctx->secmgr) { - IInternetHostSecurityManager_Release(This->ctx->secmgr); - This->ctx->secmgr = NULL; - } - - if(This->ctx->site) { - IActiveScriptSite_Release(This->ctx->site); - This->ctx->site = NULL; - } - - if (This->site) - change_state(This, SCRIPTSTATE_CLOSED); - - if(This->ctx->global) { - jsdisp_release(This->ctx->global); - This->ctx->global = NULL; - } - } - - if(This->site) { - IActiveScriptSite_Release(This->site); - This->site = NULL; - } - + decrease_state(This, SCRIPTSTATE_CLOSED); return S_OK; }