diff --git a/content/content.c b/content/content.c index 869750100..bb5c47b33 100644 --- a/content/content.c +++ b/content/content.c @@ -545,6 +545,27 @@ void content__request_redraw(struct content *c, content_broadcast(c, CONTENT_MSG_REDRAW, &data); } +/* exported interface, documented in content/content.h */ +bool content_exec(struct hlcache_handle *h, const char *src, size_t srclen) +{ + struct content *c = hlcache_handle_get_content(h); + + assert(c != NULL); + + if (c->locked) { + /* Not safe to do stuff */ + NSLOG(netsurf, DEEPDEBUG, "Unable to exec, content locked"); + return false; + } + + if (c->handler->exec == NULL) { + /* Can't exec something on this content */ + NSLOG(netsurf, DEEPDEBUG, "Unable to exec, no exec function"); + return false; + } + + return c->handler->exec(c, src, srclen); +} /* exported interface, documented in content/content.h */ bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, diff --git a/content/content.h b/content/content.h index e555df269..77cc60574 100644 --- a/content/content.h +++ b/content/content.h @@ -387,6 +387,17 @@ bool content_get_quirks(struct hlcache_handle *h); bool content_is_locked(struct hlcache_handle *h); +/** + * Execute some JavaScript code inside a content object. + * + * Runs the passed in JavaScript code in the content object's context. + * + * \param h The handle to the content + * \param src The JavaScript source code + * \param srclen The length of the source code + * \return Whether the JS function was successfully injected into the content + */ +bool content_exec(struct hlcache_handle *h, const char *src, size_t srclen); #endif diff --git a/content/content_protected.h b/content/content_protected.h index be277a042..99a05cf49 100644 --- a/content/content_protected.h +++ b/content/content_protected.h @@ -81,6 +81,7 @@ struct content_handler { content_type (*type)(void); void (*add_user)(struct content *c); void (*remove_user)(struct content *c); + bool (*exec)(struct content *c, const char *src, size_t srclen); /** handler dependant content sensitive internal data interface. */ void * (*get_internal)(const struct content *c, void *context);