Add content_exec and associated vtable entry

Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
Daniel Silverstone 2019-05-05 15:37:56 +01:00
parent ec0028bdb9
commit f3892c98fd
3 changed files with 33 additions and 0 deletions

View File

@ -545,6 +545,27 @@ void content__request_redraw(struct content *c,
content_broadcast(c, CONTENT_MSG_REDRAW, &data); 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 */ /* exported interface, documented in content/content.h */
bool content_redraw(hlcache_handle *h, struct content_redraw_data *data, bool content_redraw(hlcache_handle *h, struct content_redraw_data *data,

View File

@ -387,6 +387,17 @@ bool content_get_quirks(struct hlcache_handle *h);
bool content_is_locked(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 #endif

View File

@ -81,6 +81,7 @@ struct content_handler {
content_type (*type)(void); content_type (*type)(void);
void (*add_user)(struct content *c); void (*add_user)(struct content *c);
void (*remove_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. */ /** handler dependant content sensitive internal data interface. */
void * (*get_internal)(const struct content *c, void *context); void * (*get_internal)(const struct content *c, void *context);