hints: open links in async mode
authorVirgil Dupras <hsoft@hardcoded.net>
Tue, 9 May 2017 00:10:35 +0000 (20:10 -0400)
committerVirgil Dupras <hsoft@hardcoded.net>
Tue, 9 May 2017 00:12:52 +0000 (20:12 -0400)
When firing hints, open them (either by simulating a click or through
`window.open()`) in async mode with `window.setTimeout()`. If we don't
do that, the `EvalJS` dbus call will itself timeout and we'll end up
in an inconsistent state, that is, not back to Normal mode.

ref #349

src/scripts/hints.js

index 1b69c06..d70d3b2 100644 (file)
@@ -384,15 +384,23 @@ var hints = Object.freeze((function(){
 
     /* internal used methods */
     function open(e, newWin) {
+        /* We call open() and click() in async mode to avoid return as fast as possible.
+         * If we don't return immediately, the EvalJS dbus call will probably timeout and cause
+         * errors.
+         */
         if (newWin && e.hasAttribute('href')) {
             /* Since the "noopener" vulnerability thing, it's not possible to set an anchor's
              * target to _blank. Therefore, we can't simulate ctrl-click through _blank like we
              * used to. Therefore, we limit ourselves to "window.open()" in cases we're firing a
              * simple <a> link. In other cases, we fire the even normally.
              */
-             window.open(e.getAttribute('href'), '_blank');
+
+            window.setTimeout(function() {
+                window.open(e.getAttribute('href'), '_blank');
+                }, 0
+            );
         }
-        e.click();
+        window.setTimeout(function() {e.click();}, 0);
     }
 
     /* set focus on hint with given index valid hints array */