Pages

Saturday, May 16, 2020

Vivaldi: Possibly the most powerful browser, but some nagging issues

Vivaldi is an interesting browser.  It's probably the most customizable browser on earth, which has allowed me to run it with fewer extensions than any other browser.  Because it's the only Chromium based browser that has proper vertical tabs, it's the only Chromium browser I could seriously consider.  But there are some nagging issues that make it feel not quite as polished as other Chromium browsers (like Chrome, Edge, Opera).  Though it's in a better state than Brave.  Here are some ones I've noticed.
  • (MacOS) Right clicking address bar on a blank tab (no URL in address bar) is missing "paste and go option"
  • When moving tabs from one window to another, occasionally tabs are lost.  Vivaldi couldn't reproduce this.  "Sometimes" type bugs are hard to squash.
  • No native settings UI for autofill options (and other Chrome pages), you have to go to chrome://settings/autofill/. A little embarrassing that this isn't present after all this time, Opera and Edge have it.
  • When editing a chrome:// bookmark, the UI is inconsistent (vivaldi://bookmarks main content area doesn't match toolbar or bookmarks sidebar URL) because Vivaldi converts all chrome:// links to vivaldi:// links, even if it doesn't exist.
  • Vivaldi links (vivaldi://...) can't be accessed on Vivaldi on Android, which is annoying if you're used to going to those bookmarked links.
  • When a save dialog opens, you can click outside the dialog on the web page, which makes the download dialog disappear and no way to get it back.  This is very inconvenient when you're doing bulk downloads (for example on Humble Bundle).
  • Some websites (for example https://answers.yahoo.com/ and https://www.walmart.com/ have a different indentation and are missing favicons in the window side panel compared to other sites, which makes it look weird).  Edit: appears to be fixed now.
  • Opera is working on a feature called "workspaces" which is similar to Firefox's excellent "containers".  I'm not aware of plans for Vivaldi to offer the same, but they're not very great about sharing their plans, which brings me to the next point.
  • Microsoft is more open about their plans for Edge than Vivaldi.  We don't really know what they've prioritized, you can't even see if an issue is a duplicate when you report it, unless someone happens to have made a forum post about it and mentioned the Jira number of the issue they opened.
  • Performance isn't as smooth as Chrome or Edge (can't speak to Opera as much).  I can't quite pin this down.  Resource utilization is higher than Chrome, though not dramatically so, and synthetic benchmarks I've seen give about equal results to Chrome (unsurprising since it's the same engine, Blink), yet it doesn't feel as snappy and responsive.
  • I once had the sqlite database that stores passwords get corrupted so that saved passwords weren't showing up.  Unfortunately, this meant deleting the database to fix (C:\Users\Keegan\AppData\Local\Vivaldi\User Data\Default\Login Data on Windows or /Users/keeganwitt/Library/Application Support/Vivaldi/Default/Login Data on MacOS).  This might be related to another issue I had at one point where when I clicked the button to delete all saved passwords, only passwords saved directly into Vivaldi were deleted, and imported passwords were not.
  • Passwords cannot be edited directly in settings (need to log in with updated password, then click the popup to let it update the saved password).  Shockingly (for people like me that don't use Chrome) Chrome only recently added this (chrome://flags/#edit-passwords-in-settings).
  • Syncing tabs between phone and PC is rather delayed, and by more than several seconds, whereas in Chrome and Firefox it's always appeared instantaneous.
  • This isn't a Vivaldi issue per-se, but the menu for OneTab when you click on the icon in the toolbar doesn't have the menu with usual options of "send only this tab", "send all tabs", etc.  However, this is still accessible if you right click on the page itself.  The icon for OneTab also is invisible when pinned and using dark theme.
  • Several extensions that let you move tabs between windows (e.g. Cluster, Tab Manager Plus, Tabli, Tabs Outliner) don't work right.  For example, when moving tabs out of current window into new window, the tabs still show in current window even though they're moved (it appears the tabs are rendered in both windows, but control the same rendering process -- closing in the original window also closes in new window and the tab in the original window doesn't have anything rendered in it).
  • It sorta redundant with Vivaldi's tab stacks, but Chrome's tab groups don't work in Vivaldi (chrome://flags/#tab-groups and chrome://flags/#tab-groups-collapse).
  • Tabs still shrink instead of scrolling when there's too many to fit.  You can set a minimum width for the active tab (which is better than nothing), and the vertical tabs and tab stacking help mitigate this issue, but after over a decade of using Firefox (I used it back when it was the Mozilla Browser), I just can't seem to not have my eyes scarred by tiny tabs.
  • Once whenever I'd open a link in GMail, the new tab would have an empty address bar when middle clicked (or right click and select "open link in new tab"), but not when using "open link in new background tab".  Interestingly, going to address bar and typing Ctrl + Z (to undo) restores the missing URL.  This stopped happening after a browser restart.
I'm gonna keep my eye on Vivaldi, it looks very promising, but in the end, I keep coming back to Firefox (though their recent addition of ad and tracker blocking eliminates one of my reasons for doing so). I'm also a tabaholic and it's tough to move to anything Webkit based with high tab counts because of higher memory consumption.

Sunday, May 3, 2020

Blogger Syntax Highlighting (Again)

I was working on a blog post with Kotlin and noticed SyntaxHighlighter had no brush for Kotlin, not even V4.  Given that, and the popularity of highlight.js, I've decided to switch to that. You just gotta add something like this in the <header> of your Blogger template.
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/default.min.css' rel='stylesheet'/>-->
<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/androidstudio.min.css' rel='stylesheet'/>
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/atom-one-dark.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/agate.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/darcula.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/rainbow.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/railscast.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/solarized-dark.min.css' rel='stylesheet'/>-->
<!--<link href='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/styles/zenburn.min.css' rel='stylesheet'/>-->
<script src='//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/highlight.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/autohotkey.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/bash.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/c-like.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/c.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/clojure.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/cpp.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/csharp.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/css.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/dockerfile.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/dos.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/fsharp.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/java.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/javascript.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/go.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/groovy.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/markdown.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/nsis.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/pgsql.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/plaintext.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/powershell.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/properties.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/python.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/ruby.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/scala.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/scss.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/sql.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/typescript.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/vbscript.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/xml.min.js'/>
<script charset='UTF-8' src='https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.0.0/languages/yaml.min.js'/>
<scrpt>hljs.initHighlightingOnLoad();</script>

There are many other languages and styles available. And as with SyntaxHighlighter, you need to escape < with &lt; and > with &gt.
Then you put your code inside
<pre><code class="kotlin"></code>

</pre>
or
<pre><code class="lang-kotlin">

</code></pre>
or
<pre><code class="language-kotlin">

</code></pre>