Simon Lydell [Wed, 14 Sep 2016 16:12:36 +0000 (18:12 +0200)]
Fix a case of being unable to filter hints by text
1. Disable the `hints.auto_activate` option.
2. Press `f`.
3. Filter hint markers by element text until only one link matches.
4. Press `<backspace>`.
5. Try to filter by element text again.
Result: Nothing happens. Previously, we got stuck in the `isMatched`
mode after deleting a typed char.
Simon Lydell [Wed, 14 Sep 2016 06:12:56 +0000 (08:12 +0200)]
Improve hint marker styling
- Increase contrast between the hint chars and the background color by
changing the text color to fully black.
- Make the styling for hint markers for scrollable elements scale with
the font size.
- Make highlighted hint markers more prominent. The changes in commit 4bb0b56c made the difference _too_ subtle. While it looked pretty good
on the computer I developed it on, the highlighting was almost
invisible on a different screen. The new styling relies not solely on
color, but also on border-radius, to increase the visual difference.
Simon Lydell [Tue, 13 Sep 2016 16:29:09 +0000 (18:29 +0200)]
Improve Hints mode in various ways
- After having filtered hint markers by at least one character, select
the entire text for the highlighted markers' elements. This makes it
way easier to notice that you can stop typing and press `<enter>`
instead to activate your desired hint marker.
- Because of the above point, it is now less important to make the
highlighted hint markers stand out very much compared to other
markers. So the styling has been changed to a more modest
highlighting.
- Fixed: Links with the same href weren't getting the same hint after
filtering hint markers by element text.
- Improved: After having filtered hint markers by element text, sort the
markers by element text length, rather than element area. A large
element might have less text than a smaller element.
- Improved: Don't allow typing more non-hint chars when all remaining
markers have the same hint. This means less backspacing for the user
in case of typos.
- Fixed: After having filtered hint markers by element text until all
remaining markers have the same hint, _any_ hint char would activate
the hint markers, even if that one didn't match the hint.
Simon Lydell [Tue, 13 Sep 2016 06:47:46 +0000 (08:47 +0200)]
Improve hints after filtering by one element text char
1. Go to Reddit or Hackernews.
2. Press `f`.
3. Filter by one common element text character, such as "e".
Previously, that resulted in really terrible hints for most (of the
larger) elements. Basically, the difference in weight used for the
elements was so large, that all hint chars except the last were used as
single-char hints for the highest-weight elements. The same thing
happened for the hints starting with the last hint char; all hint chars
except the last were used for two-char hints. This resulted in some
really terrible hints like "VVVS". This looked very broken.
With this commit, the smallest elements still get the best hints after
filtering by element text, but the difference in the hints is not that
large.
Simon Lydell [Mon, 12 Sep 2016 06:52:59 +0000 (08:52 +0200)]
Improve `gB` UX
If the page is _not_ blacklisted, everything stays the same.
If the page _is_ blacklisted, all matching blacklist patterns are moved
first and are delimited from all other patterns with several spaces.
There is also a new message for this case.
Simon Lydell [Sun, 11 Sep 2016 13:58:03 +0000 (15:58 +0200)]
Properly hide notifications
In order to show the characters you have typed so far when filtering
hint markers by element text, commit ae106db9 changed the logic for when
notifications are hidden due to key presses.
Previously, notifications were hidden unconditionally when the pressed
key is not part of any shortcut, or caused a command to be run. Now, it
is up to every mode to deal with those cases. So that logic has
essentially been moved into Normal mode, and partly into Marks mode and
Caret mode as well.
The `<escape>` command now also explicitly hides notifications.
Simon Lydell [Sat, 10 Sep 2016 02:47:46 +0000 (04:47 +0200)]
Don't hide changed notification when exiting Hints mode
For example, if the `f` command is used to click the "Export all" button
in VimFx's settings page in the Add-ons Manager, the export notification
was only visible until `hints.matched_timeout` had passed.
Simon Lydell [Sat, 27 Aug 2016 15:58:44 +0000 (17:58 +0200)]
Implement filtering hints by text and related changes
This brings several more or less breaking changes:
- Non-hint chars now filter hint markers by the text of their elements,
using an algorithm similar to the location bar (split the search term
on whitespace; all the items must occur in the search text, case
insensitively, and may overlap). The matched text is highlighted on
screen. If all remaining hints are the same, they are automatically
activated. All of this can be turned off via prefs, though.
- Since space is used to filter hint markers by element text, the
already existing `<space>` shortcut for rotating hint markers had to
be changed. It is now `<c-space>`. (`<s-space>` remains unchanged.)
- Uppercase hint chars are now allowed. This is so that people who
prefer filtering by text in the first hand can use uppercase hint
chars. If mixed case is used, `text-transform: uppercase;` is not
applied, to avoid confusion.
- Since using uppercase characters for filtering hint markers by element
text and lowercase characters for hint chars (or vice versa) is now a
thing, holding shift no longer lets you peek through the hint markers,
because that felt like the markers blinking all the time. Instead, you
now have to hold shift+control to peek through.
- Hint markers are now placed immediately to left of its element's text
if it would cover the text otherwise. This is because when filtering
hints by text, it can be quite difficult to see what to type
otherwise. This also turned out to be helpful even when only using the
hints (like before). It’s nice being able to see all the link text in
many cases.
- Hint markers now get their `z-index` assigned based on their element's
area, not their weight. It's confusing when a smaller element's hint
cover the hint of a larger element. This could be the case where there
are lots of small profile image links all with the same `href`.
Previously, all those links got `z-index` based on their combined
area. Now, their individual areas are used instead. This problem
became apparent because of the above bullet point.
- The hint marker(s) with the best hint are now highlighted in blue.
- `<enter>` now activates the highlighted marker(s). `<c-enter>` and
`<a-enter>` can be used to toggle where links open, just as when
using those modifiers with the last hint char. However, these
shortcuts were already taken, so the old ones had to be given new
shortcuts:
- "Increase count" now uses `<up>` (instead of `<enter>`).
- "Toggle complementary" now uses `<c-backspace>` (instead of
`<c-enter>`).
- All existing hints prefs were renamed from starting with `hint_` or
`hints_` to starting with `hints.`, for consistency and organization.
A few new prefs starting with `hints.` were added as well. Migrations
are written for this.
This also unveiled a problem. If a config file tries to set an old
pref and VimFx is upgraded, the config file will throw errors. This is
bad user experience, so a system for allowing old names was added.
However, that might mean that users never notice that they use an
outdated name and never update their config files. Therefore, old
names are only allowed when the config file is loaded automatically
(on startup), but _not_ when it is reloaded using `gC`. The idea is
that people use `gC` while working on their config file, which usually
involves fixing errors. Then they could just as well fix the old pref
names as well.
- The options in VimFx's settings page in the Add-ons Manager have been
slightly re-ordered to play better with the new options added, and to
promote some very important prefs to the top.
All of the above required some significant refactoring of Hints mode,
that should make it more robust.
Fixes #340. A big thanks to @doy who got this all started with #789.
Simon Lydell [Mon, 29 Aug 2016 14:46:17 +0000 (16:46 +0200)]
Make hint markers smaller
The hint markers are styled with `font: menu;` to get as close to the
user's system and preferences as possible. However, that turns out to be
slighly too big on all systems I've seen.
This commit still uses `font: menu;`, but then reduces the font size of
that to 80%, by using a clever CSS trick: `font: menu;` was moved to the
hints container, and the markers themselves use `font-size: 0.8em;`.
Simon Lydell [Fri, 9 Sep 2016 18:46:28 +0000 (20:46 +0200)]
Add `gB` for quickly editing the blacklist
This also improves the description of the blacklist option, mentioning
that the patterns must match the _entire_ URL, since many people seem to
overlook this fact.
Simon Lydell [Mon, 29 Aug 2016 20:11:41 +0000 (22:11 +0200)]
Fix missing hint markers when re-entering Hints mode quickly
1. Enter Hints mode.
2. Press `<escape>` to exit it.
3. Press `f` to re-enter Hints mode within `hints_timeout` milliseconds.
This used to result in re-entering Hints mode as expected, but with no
hint markers on screen because of a timeout from the last Hints mode
session that removed the hints container. Removing the hints container
is done by ID for robustness, so it doesn't help that the hints
container actually is a new DOM element at that time.
This commit fixes the above problem, and makes the logic more robust.
In `onLeave` for Hints mode, it makes sense to always try to remove the
Hints container, so that it may not be accidentally be left on screen.
However, it does not make sense to do so after a timeout, which was
previously the case. Now, it is done _immediately_ instead.
The only case where he timeout is wanted, is when a hint marker just has
been matched. This commit also adds a check in that timeout callback that
Hints mode hasn't been re-entered before removing the hints container.
Simon Lydell [Sat, 27 Aug 2016 21:26:06 +0000 (23:26 +0200)]
Fix initial visibility of second-pass hint markers
1. Go to a site where there is a noticeable delay between the two passes
for the `f` command, such as on reddit.com.
2. Press a prefix hint char there before the second pass has completed.
When the second pass completes, the hint markers for that pass will be
shown, even though they cannot start with the prefix hint char you
pressed. This commit makes sure that the hint markers for the second
pass start out hidden if needed.
That commit switched to using `prefs.get` directly in
events-frame.coffee instead of using `messageManager.get`. That avoids
synchronous messages, which is a good thing.
However, I forgot that when doing so, `vimfx.addOptionOverrides` won't
take effect.
This commit partly reverts to getting options via synchronous messages
again. In the very frequent 'keydown' event direct `prefs.get` is still
used for the unlikely-to-be-overridden `focus_previous_key` and
`focus_next_key` prefs, while synchronous messaging is used in the less
frequent 'focus' event, which enables the use case of overriding
`prevent_autofocus` on select pages.
Simon Lydell [Sat, 20 Aug 2016 08:40:48 +0000 (10:40 +0200)]
Change `` ` `` into `'`
This is both for the `` ` `` shortcut (go to mark) and the `` ` `` mark
(last position). Both `` ` `` and `'` are used in Vim. `'` is a better
default, because it is easier to type -- both on an en-US QWERTY
keyboard and, more importantly, on some international layouts, such as
the sv-SE layout.
Simon Lydell [Wed, 10 Aug 2016 10:08:32 +0000 (12:08 +0200)]
Make it possible to create custom hint commands
My first idea was to use `vim.enterMode('hints', ...)`. However, that's
too complicated to be useful for any user.
Actually, I found that `vim.enterMode(...)` is too complicated for most
(all?) modes, so I decided to make it private (removing it from the
public API) while at it. (I also made the arguments of
`vim.enterMode`/`mode.onEnter` more consistent with each other.)
I also considered exposing the entire "API" that the `f` commands use
internally. However, that's more complicated than the average user
needs, and would increase the API surface _a lot._
Instead, the `f` commands now take a `callbackOverride` argument. This
lets you choose the `f` command that matches the elements you're looking
for and the override what happens when a hint marker is matched.
Simon Lydell [Sat, 6 Aug 2016 14:26:57 +0000 (16:26 +0200)]
Fix unmousable bottom-right corner of the page scrollbars
VimFx's statuspanel (for notifications) had `pointer-events: auto;`
instead of `pointer-events: none;`, which statuspanels have by default.
The reason was to allow clicking the statuspanel to hide it.
This made it impossible to interact with the bottom-right corner of the
page scrollbars. The invisible statuspanel captured any clicks there.
This commit hides notifications when clicking _anything_ instead, and
removes `pointer-events: auto;`.
The convention on most modern sites seem to be to make a trailing slash
optional. But especially on older servers, no trailing slash means "view
file", while a trailing slash means "view directory". Removing the
trailing slash in such cases most likely results in a 404, while
preserving it gives a useful result.
Simon Lydell [Fri, 8 Jul 2016 06:00:18 +0000 (08:00 +0200)]
Make it possible to escape from stuck "auto insert mode"
With this commit, `<escape>` resets `vim.focusType` to 'none', in case
we somehow have gotten stuck with 'editable'.
The button now also runs the `esc` command, making it a true escape
hatch: Clicking it not only lets you escape from other modes back to
Normal mode, but also blurs stuff and makes sure that `vim.focusType` is
'none'.
Simon Lydell [Thu, 30 Jun 2016 05:56:12 +0000 (07:56 +0200)]
Simplify detection of markable `<label>`s
Apparently, such elements have a `.control` property that returns their
associated form control. No need to manually look for the 'for'
attribute or nested form control elements.
Simon Lydell [Wed, 22 Jun 2016 06:02:36 +0000 (08:02 +0200)]
Teach the `zF` command to find and activate dropmarkers
For example, the bookmarks button has a "star" button on the left, which
acts like a normal button, and another button on the right, which
actually is a `<dropmarker>` and opens a `<menupopup>`. Previously,
VimFx didn't find the `<dropmarker>` (because it hasn't got
`.tabIndex > `-1). Now it does. Note that simulating a click on a
`<dropmarker>` triggers its parent button's action. Instead, the
`<menupopup>` must be found and triggered manually.
Another example of such a button is Greasemonkey’s button. Actually,
this "button with dropmarker" concept seems pretty common among add-ons.
This commit also removes the unnecessary double hint for the bookmarks
button, but filtering out `<toolbarbutton>`s which are direct children
of another `<toolbarbutton>`.
Simon Lydell [Sat, 18 Jun 2016 10:59:01 +0000 (12:59 +0200)]
Only rotate _visible_ hint markers
Previously, if you pressed `<space>` in Hints mode to rotate overlapping
markers, after already having entered a few hint chars, it would
sometimes look as if nothing happens. This was because _all_ markers
where being rotated, even hidden ones. This commit only rotates _visible_
markers.
Alan Wu [Sun, 12 Jun 2016 08:27:17 +0000 (04:27 -0400)]
Fix `zF` double clicking on browser elements (#757)
`nsIDOMWindowUtils.dispatchDOMEventViaPresShell()` dispatches
a 'command' event automatically after a 'click' event on XUL pages.
This was causing `zF` to effectively double click on browser elements,
since VimFx also simulates a 'command' event.
Elements which suffers from this double click include but are not
limited to, the new tab button, question mark circles in the preferences
page and buttons created by the add-on sdk.
Alan Wu [Mon, 6 Jun 2016 10:23:05 +0000 (06:23 -0400)]
Dispatch trusted mouse events to content page (#751)
Some DOM APIs need to be called from the handler of a trusted event to
work. `requestFullscreen()` and `document.execCommand('copy')` are
examples of such API.
Before this patch, VimFx dispatched mouse events using
`element.dispatchEvent()` which had the event handlers for the events
running in untrusted context. This behavior prevented hint mode from
full-screening on Youtube and copying clone addresses on Github.
This patch uses XPCOM to dispatch mouse events as trusted events to the
content page.
See also:
https://www.w3.org/TR/uievents/#trusted-events - info from the spec
https://clipboardjs.com/ - before this patch, copying doesn't work
Simon Lydell [Sun, 5 Jun 2016 17:25:50 +0000 (19:25 +0200)]
Improve Marks mode UX
- Return to Normal mode if a mark key hasn't been pressed within
`options.timeout` milliseconds.
- Let `<escape>` return to Normal mode instead of creating or going to a
mark named `<escape>`. Previously, if the user pressed `<escape>` as
an attempt to exit Marks mode after accidentally pressing `m`, that
would indeed exit Marks mode, but it would also set the `<escape>`
mark. That meant that after that point, the user couldn't exit Marks
mode using `<escape>` after having pressed `` ` `` without the side
effect of scrolling to the `<escape>` mark.
- Marks mode has been hidden from the help dialog, in order not to
clutter it with unnecessary information. While at it, Find mode was
removed from the help dialog as well, for the same reason. Both modes
are still available in VimFx's settings page in the Add-ons Manager,
though.
Simon Lydell [Sun, 5 Jun 2016 17:01:02 +0000 (19:01 +0200)]
Make the `?` command and the button _toggle_ help
I've noticed people (including myself, sometimes) unconsciously
expecting both the `?` command and the button to _close_ the Keyboard
Shortcuts dialog if it is already open.
I don't think there's any need complicating the description of the `?`
command and the tooltip of the button to reflect this.