The bookmarks HTML format doesn’t include an option to store a folder icon (folder icons aren’t supported in any other browser that I am aware of anyway) so the default folder icon is always used on import. In my testing, Firefox doesn’t always export favorite icons for all the bookmarks that have them. I am uncertain why that is, but anyone who feels strongly about it can submit a bug report to Mozilla. Chrome and Chromium based browsers only export low resolution favorite icons.
New tabs now open adjacent to the currently active tab, which leads to a more intuitive workflow when using multiple tabs.
When creating Domain Settings from the options menu with the Add Domain Settings entry, the newly created Domain Setting now defaults to whatever on-the-fly settings are currently active. Previously, newly created domains would always use the system defaults. This change allows users to browse to a new website, modify the on-the-fly settings to get it to work, and then create the Domain Settings without having to recreate their on-the-fly changes.
There is a new entry in the navigation menu to scroll to the bottom/top of the page. When the page is at the very top this will scroll to the bottom. Otherwise it will scroll to the top.
When the app bar is at the bottom of the screen, the navigation drawer now opens scrolled to the bottom by default, so that Clear and Exit is easily accessible.
View Headers now displays information about the SSL connection.
The information in View Headers can now be copied, shared, and saved.
Several little bugs were fixed. Sometimes the wrong page was displayed when the app restarted. Sometimes an unencrypted website dialog would popup on restart. And sometimes the app would crash on restart. All of these were unintended consequences of switching from ViewPager to ViewPager2 with the final migration to Kotlin in the 3.14 release.
The URL syntax highlighting now deemphasizes the
The tab text now no longer remains “Loading…” after downloading a file that comes from a different domain. The drawers are now closed when opening a new intent, even if the app is restarted during the process. The full WebView version is displayed again in About > Version (Google has decided that only the major version should be displayed in the User Agent, like 18.104.22.168).
This release bumps the target API to 34 (Android 14). As part of Android 14, Google has focused on increasing battery life, including by limiting app performance. Privacy Browser has to load the filter lists every time it starts, which requires a large amount of CPU processing. Previously, on a Pixel 5 it would take about half a second to parse the lists, but with the switch to target API 34 it takes about 3 seconds (six times longer). The parsing of the filter lists is handled by a Kotlin coroutine. Because the Kotlin coroutine library ships inside the Privacy Browser APK, this nerfing of performance with the current version of the library applies to all versions of Android it is installed on. In an attempt to work around this limitation, I am going to investigate switching the filter list parsing code from Kotlin to C++, which should have overall performance improvements even when Android limits CPU usage.
Android 14 also appears to have introduced a bug that sometimes causes WebView to crash on restart. Likely this bug will be fixed by an update either to Android or WebView, but there probably isn’t anything I can do about it myself.