I kept the first patch (`Remember if timer was blocked.`) to avoid SetTimer on timers that weren't killed, mostly because it would apply on every task (which is likely to execute way faster than the ms granularity), not sure if it would skew the timer in such case.
The other patches are split, with tests now showing why they're needed. Some places where wine-gecko callbacks into us and in which we call into external code need to be treated the same as a recursive task since it can end up in a message loop.
I haven't supplied all of them from the previous MR, mostly because I didn't find a way to test those (e.g. show context menu, and the gecko async navigation).
-- v2: mshtml: Don't send the notification from SuperNavigate if we're in nested mshtml: Don't process tasks recursively from handle_load. mshtml: Don't process tasks recursively from run_end_load. mshtml: Don't process tasks recursively. mshtml: Remember if timer was blocked.