diff options
| author | Stephen Blott | 2016-04-28 13:51:44 +0100 | 
|---|---|---|
| committer | Stephen Blott | 2016-04-28 13:55:08 +0100 | 
| commit | f83e99fd42a4cf412c79fb15c58f59c105c25723 (patch) | |
| tree | 673e75c9d372fd70ae0742a05c76c581f0faff32 /lib | |
| parent | ac340e2346247b5cd1878e1a814d4c151df3e892 (diff) | |
| download | vimium-f83e99fd42a4cf412c79fb15c58f59c105c25723.tar.bz2 | |
Fix UI-component initialization issues.
This fixes some UI component initialization issues.  It's a long
story...
The problem.
- Go to this page: http://www.thejournal.ie/seanad-election-results-2016-2737768-Apr2016/
- Click one of the links from the "Most Popular" box on the right.
- Navigate back (`H`) and, as the original page is loading, activate the Vomnibar.
In 1.54 this renders Vimium unusable.  In `master` this renders the
Vomnibar unsable, but the rest of Vimium usable.
It seems the source of the issue is that we're initializing UI
components too soon.  We need to wait until the `readyState` is
"complete".
With this PR:
- The Vomnibar is initialised when the `readyState` is "complete" (in
  the top frame only, and only if Vimium is enabled).  Requests arriving
  prior to then are silently discarded.
- The HUD is also initialized only when the `readyState` is "complete";
  however, requests arriving before then are queued.  So, if the user
  immediately enters insert mode, then the "Insert mode" indicator will
  eventually be displayed.
- The help dialog silently discards requests until the `readyState` is
  "complete.
I'm posting this as a PR because:
1. It needs some visibility.
2. With this, if the `readyState` *never* reaches "complete", then the
   Vomnibar would be unusable.  And that's pretty serious.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dom_utils.coffee | 11 | 
1 files changed, 11 insertions, 0 deletions
| diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index 3d719337..07598a85 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -13,6 +13,17 @@ DomUtils =      (callback) -> if isReady then callback() else callbacks.push callback +  documentComplete: do -> +    [isComplete, callbacks] = [document.readyState == "complete", []] +    unless isComplete +      window.addEventListener "load", onLoad = -> +        window.removeEventListener "load", onLoad +        isComplete = true +        callback() for callback in callbacks +        callbacks = null + +    (callback) -> if isComplete then callback() else callbacks.push callback +    createElement: (tagName) ->      element = document.createElement tagName      if element instanceof HTMLElement | 
