summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/javascript.rst2
-rw-r--r--player/javascript/defaults.js11
2 files changed, 10 insertions, 3 deletions
diff --git a/DOCS/man/javascript.rst b/DOCS/man/javascript.rst
index 53e5771b54..1e5ce99cdc 100644
--- a/DOCS/man/javascript.rst
+++ b/DOCS/man/javascript.rst
@@ -193,7 +193,7 @@ success, ``fn`` is called always a-sync, ``error`` is empty string on success.
``mp.utils.getpid()`` (LE)
-``mp.add_hook(type, priority, fn)``
+``mp.add_hook(type, priority, fn(hook))``
``mp.options.read_options(obj [, identifier [, on_update]])`` (types:
string/boolean/number)
diff --git a/player/javascript/defaults.js b/player/javascript/defaults.js
index 9d53f2d7a3..2435390b87 100644
--- a/player/javascript/defaults.js
+++ b/player/javascript/defaults.js
@@ -126,10 +126,17 @@ function dispatch_message(ev) {
var hooks = []; // array of callbacks, id is index+1
function run_hook(ev) {
+ var state = 0; // 0:initial, 1:deferred, 2:continued
+ function do_cont() { return state = 2, mp._hook_continue(ev.hook_id) }
+
+ function err() { return mp.msg.error("hook already continued"), undefined }
+ function usr_defer() { return state == 2 ? err() : (state = 1, true) }
+ function usr_cont() { return state == 2 ? err() : do_cont() }
+
var cb = ev.id > 0 && hooks[ev.id - 1];
if (cb)
- cb();
- mp._hook_continue(ev.hook_id);
+ cb({ defer: usr_defer, cont: usr_cont });
+ return state == 0 ? do_cont() : true;
}
mp.add_hook = function add_hook(name, pri, fn) {