Why do you block only specific bits of `hidden_proc`? Shouldn't we do the same when processing event tasks and timers? What's so special about other functions ran via script runner, shouldn't we do the blocking more generic there by putting it in `nsRunnable_Run`?
FWIW, it's fine to skip some parts and it's fine if not every check has its test, but when you add, I'd like to understand the logic behind it. If the logic is that tasks should not be processed recursively (which seems right to me), then I guess we'd want to refactor `hidden_proc` to always block them. Similarly, if `run_end_load` is somehow special, then why?
Also `SuperNavigate` looks suspicious to me, are you sure it's the right condition?