summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/handlers/html/html.c20
-rw-r--r--content/handlers/html/html_internal.h8
-rw-r--r--content/handlers/html/html_script.c7
-rw-r--r--desktop/browser_private.h6
-rw-r--r--desktop/browser_window.c55
5 files changed, 25 insertions, 71 deletions
diff --git a/content/handlers/html/html.c b/content/handlers/html/html.c
index 26be58d73..5b6a15f7d 100644
--- a/content/handlers/html/html.c
+++ b/content/handlers/html/html.c
@@ -1637,12 +1637,6 @@ static void html_stop(struct content *c)
{
html_content *htmlc = (html_content *) c;
- /* invalidate the html content reference to the javascript context
- * as it is about to become invalid and must not be used any
- * more.
- */
- html_script_invalidate_ctx(htmlc);
-
switch (c->status) {
case CONTENT_STATUS_LOADING:
/* Still loading; simply flag that we've been aborted
@@ -1853,6 +1847,14 @@ static void html_destroy(struct content *c)
if (html->base_url)
nsurl_unref(html->base_url);
+ /* At this point we can be moderately confident the JS is offline
+ * so we destroy the JS thread.
+ */
+ if (html->jsthread != NULL) {
+ js_destroythread(html->jsthread);
+ html->jsthread = NULL;
+ }
+
if (html->parser != NULL) {
dom_hubbub_parser_destroy(html->parser);
html->parser = NULL;
@@ -1977,12 +1979,6 @@ static nserror html_close(struct content *c)
/* clear the html content reference to the browser window */
htmlc->bw = NULL;
- /* invalidate the html content reference to the javascript context
- * as it is about to become invalid and must not be used any
- * more.
- */
- html_script_invalidate_ctx(htmlc);
-
/* remove all object references from the html content */
html_object_close_objects(htmlc);
diff --git a/content/handlers/html/html_internal.h b/content/handlers/html/html_internal.h
index a64078143..7340bd25c 100644
--- a/content/handlers/html/html_internal.h
+++ b/content/handlers/html/html_internal.h
@@ -321,14 +321,6 @@ nserror html_script_exec(html_content *htmlc, bool allow_defer);
nserror html_script_free(html_content *htmlc);
/**
- * Ensure the html content javascript context is invalidated.
- *
- * \param htmlc html content.
- * \return NSERROR_OK or error code.
- */
-nserror html_script_invalidate_ctx(html_content *htmlc);
-
-/**
* Check if any of the scripts loaded were insecure
*/
bool html_saw_insecure_scripts(html_content *htmlc);
diff --git a/content/handlers/html/html_script.c b/content/handlers/html/html_script.c
index 301acadd6..81bdccda9 100644
--- a/content/handlers/html/html_script.c
+++ b/content/handlers/html/html_script.c
@@ -664,10 +664,3 @@ nserror html_script_free(html_content *html)
return NSERROR_OK;
}
-
-/* exported internal interface documented in html/html_internal.h */
-nserror html_script_invalidate_ctx(html_content *htmlc)
-{
- htmlc->jsthread = NULL;
- return NSERROR_OK;
-}
diff --git a/desktop/browser_private.h b/desktop/browser_private.h
index 89dc5cca4..ed2d845de 100644
--- a/desktop/browser_private.h
+++ b/desktop/browser_private.h
@@ -265,12 +265,6 @@ struct browser_window {
/** current javascript context */
struct jsheap *jsheap;
- /** The JS thread (if any) for the current content */
- struct jsthread *current_jsthread;
-
- /** The JS thread (if any) for the loading content */
- struct jsthread *loading_jsthread;
-
/** cache of the currently displayed status text. */
struct {
char *text; /**< Current status bar text. */
diff --git a/desktop/browser_window.c b/desktop/browser_window.c
index c98eca832..9151ee1b3 100644
--- a/desktop/browser_window.c
+++ b/desktop/browser_window.c
@@ -701,11 +701,6 @@ browser_window_convert_to_download(struct browser_window *bw,
/* remove content from browser window */
hlcache_handle_release(bw->loading_content);
- bw->loading_content = NULL;
- if (bw->loading_jsthread != NULL) {
- js_destroythread(bw->loading_jsthread);
- bw->loading_jsthread = NULL;
- }
browser_window_stop_throbber(bw);
}
@@ -723,15 +718,10 @@ static nserror browser_window_content_ready(struct browser_window *bw)
if (bw->current_content != NULL) {
content_close(bw->current_content);
hlcache_handle_release(bw->current_content);
- if (bw->current_jsthread != NULL) {
- js_destroythread(bw->current_jsthread);
- }
}
bw->current_content = bw->loading_content;
- bw->current_jsthread = bw->loading_jsthread;
bw->loading_content = NULL;
- bw->loading_jsthread = NULL;
if (!bw->internal_nav) {
/* Transfer the fetch parameters */
@@ -1289,10 +1279,6 @@ browser_window__handle_error(struct browser_window *bw,
if (c == bw->loading_content) {
bw->loading_content = NULL;
- if (bw->loading_jsthread != NULL) {
- js_destroythread(bw->loading_jsthread);
- bw->loading_jsthread = NULL;
- }
} else if (c == bw->current_content) {
bw->current_content = NULL;
browser_window_remove_caret(bw, false);
@@ -1499,16 +1485,23 @@ browser_window_callback(hlcache_handle *c, const hlcache_event *event, void *pw)
break;
case CONTENT_MSG_GETTHREAD:
- /* only the content object created by the browser
- * window requires a new javascript thread object
- */
- assert(bw->loading_content == c);
- assert(bw->loading_jsthread == NULL);
- if (js_newthread(bw->jsheap,
- bw,
- hlcache_handle_get_content(c),
- &bw->loading_jsthread) == NSERROR_OK) {
- *(event->data.jsthread) = bw->loading_jsthread;
+ {
+ /* only the content object created by the browser
+ * window requires a new javascript thread object
+ */
+ jsthread *thread;
+ assert(bw->loading_content == c);
+
+ if (js_newthread(bw->jsheap,
+ bw,
+ hlcache_handle_get_content(c),
+ &thread) == NSERROR_OK) {
+ /* The content which is requesting the thread
+ * is required to keep hold of it and
+ * to destroy it when it is finished with it.
+ */
+ *(event->data.jsthread) = thread;
+ }
}
break;
@@ -1752,22 +1745,12 @@ static void browser_window_destroy_internal(struct browser_window *bw)
bw->loading_content = NULL;
}
- if (bw->loading_jsthread != NULL) {
- js_destroythread(bw->loading_jsthread);
- bw->loading_jsthread = NULL;
- }
-
if (bw->current_content != NULL) {
content_close(bw->current_content);
hlcache_handle_release(bw->current_content);
bw->current_content = NULL;
}
- if (bw->current_jsthread != NULL) {
- js_destroythread(bw->current_jsthread);
- bw->current_jsthread = NULL;
- }
-
if (bw->favicon.loading != NULL) {
hlcache_handle_abort(bw->favicon.loading);
hlcache_handle_release(bw->favicon.loading);
@@ -4091,10 +4074,6 @@ void browser_window_stop(struct browser_window *bw)
hlcache_handle_abort(bw->loading_content);
hlcache_handle_release(bw->loading_content);
bw->loading_content = NULL;
- if (bw->loading_jsthread != NULL) {
- js_destroythread(bw->loading_jsthread);
- bw->loading_jsthread = NULL;
- }
}
if (bw->current_content != NULL &&