summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/content.c21
-rw-r--r--content/content.h11
-rw-r--r--content/content_protected.h1
3 files changed, 33 insertions, 0 deletions
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);