JS: Add concept of js_closethread

In order to better model content close vs destroy, add the concept
of closing a thread to the JS interface.

Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
Daniel Silverstone 2020-03-22 10:14:00 +00:00
parent efbfaa0cb1
commit d1e2eef18b
No known key found for this signature in database
GPG Key ID: C30DF439F2987D74
3 changed files with 42 additions and 4 deletions

View File

@ -754,6 +754,26 @@ nserror js_newthread(jsheap *heap, void *win_priv, void *doc_priv, jsthread **th
#undef CTX
#define CTX (thread->ctx)
/* exported interface documented in js.h */
nserror js_closethread(jsthread *thread)
{
/* We can always close down a thread, it might just confuse
* the code running, though we don't mind since we're in the
* process of destruction at this point
*/
duk_int_t top = duk_get_top(CTX);
/* Closing down the extant thread */
NSLOG(dukky, DEBUG, "Closing down extant thread %p in heap %p", thread, thread->heap);
duk_get_global_string(CTX, MAGIC(closedownThread));
dukky_pcall(CTX, 0, true);
/* Restore whatever stack we had */
duk_set_top(CTX, top);
return NSERROR_OK;
}
/**
* Destroy a Duktape thread
*/

View File

@ -96,15 +96,28 @@ void js_destroyheap(jsheap *heap);
*/
nserror js_newthread(jsheap *heap, void *win_priv, void *doc_priv, jsthread **thread);
/**
* Close a javascript thread
*
* This should be called when the HTML content which owns the thread is
* being closed. This is a separate process from destroying the thread
* and merely disconnects any callbacks and thus hopefully stops
* additional JS things from triggering. If any code runs and attempts to
* register callbacks after closedown, they will fail.
*
* \param thread The thread to close down
* \return NSERROR_OK on success, appropriate error otherwise
*/
nserror js_closethread(jsthread *thread);
/**
* Destroy a javascript thread
*
* This should be called when the browsing context is done with the thread.
*
* Essentially it should be called when the content is about to be destroyed
* but in reality it can be called when the browser window relinquishes its
* handle on the content since nominally the browser window itself owns
* the thread.
* This will be called when the HTML content associated with the browsing
* context is being destroyed. The thread should have already been closed
* down during the HTML content close.
*
* \param thread The thread to be destroyed
*/

View File

@ -51,6 +51,11 @@ nserror js_newthread(jsheap *heap, void *win_priv, void *doc_priv, jsthread **th
return NSERROR_NOT_IMPLEMENTED;
}
nserror js_closethread(jsthread *thread)
{
return NSERROR_OK;
}
void js_destroythread(jsthread *thread)
{
}