]> git.gir.st - VimFx.git/commit
Improve marker placement and fix related bug
authorSimon Lydell <simon.lydell@gmail.com>
Wed, 10 Sep 2014 19:01:04 +0000 (21:01 +0200)
committerSimon Lydell <simon.lydell@gmail.com>
Wed, 10 Sep 2014 19:01:04 +0000 (21:01 +0200)
commit0e6da9fe7b873f8a3d576cd597498c451de36f62
treed612a1f68ee22a37c49706b4a81d62822b925eba
parentb701a0559ab62a5bafc9f4fe27cab8cda01cefa7
Improve marker placement and fix related bug

Before commit 89e1bc4 we used to recursively search the rect of an
element until it found a non-covered point; after that commit we changed
into only checking 6 simple locations of the element, for performance
reasons. However, this meant two problems:

- It was very confusing when markers ended up to the far right of
  elements. Sometimes it was difficult to understand which element the
  marker actually belonged to. Sometimes a tiny bit of the left side of
  an element was covered (possible by a _transparent_ element!) causing
  the marker to end up on the right instead, seemingly for no reason.
- Some elements are overlapped by one pixel both on the left and right
  side (such as the github pagination links), causing no marker at all
  to appear.

The solution is to use the best of both before the referenced commit and
after it. Now we check 3 (instead of 6) simple places: Only the 3 on the
left side. If the place is covered by another element, we try once to
the right of that element. So in total there may be 6 attempts, just as
before.
Author: Simon Lydell <simon.lydell@gmail.com>
Date:   Sat Aug 2 16:01:36 2014 +0200

    Improve marker generation performance

    `getFirstNonCoveredPoint` used to recursively search the rect of an
    element until it found a non-covered point. This works well most of the
    time, but on some sites (such as prisjakt.se) it took way too much time.

    Moreover, this technique required some CSS to be reset in a few special
    cases, which is very costly performance-wise. It is also brittle and
    makes the code unnecessarily complex.

    Lastly, there was a bug in the algorithm that caused uncaught exceptions
    sometimes (such as on youtube.com).

    Now we use a much simpler approach instead.

    `getFirstNonCoveredPoint` tries 6 different points of the element:

        +-------------------------------+
        |1 left-top          right-top 4|
        |                               |
        |2 left-middle    right-middle 5|
        |                               |
        |3 left-bottom    right-bottom 6|
        +-------------------------------+

    If all of those are covered (or are reported as covered because of one
    of the CSS special cases we used to reset) then the whole element is
    simply considered to be covered. This seems to work really well.

    The above means that the markers can now be placed at any of the points
    in the above figure.

    The result is much faster, simpler and more robust.
extension/packages/mode-hints/hints.coffee
extension/packages/mode-hints/marker.coffee
Imprint / Impressum