js: load preferences from HTML elements

It will be useful on KaiOS to be able to specify default user
preferences that aren't the standard ones, in the same way that we
specify some environment variables.  As with environment variables, we
can now do this be embedding a <script> element in the HTML like this:

<script class="preferences" type="text/plain">
show-labels=true
</script>

These are loaded before the preferences from localStorage, so they just
set defaults and can be overridden by the user (but not on KaiOS yet,
because we still don't have dialogue boxes there).
This commit is contained in:
Ben Harris
2023-08-21 22:45:48 +01:00
parent 85b00e56a0
commit b5367ed18a

View File

@ -821,9 +821,7 @@ mergeInto(LibraryManager.library, {
* pass it back in as a string, via prefs_load_callback.
*/
js_load_prefs: function(me) {
try {
var prefsdata =
localStorage.getItem(location.pathname + " preferences");
function load_prefs_from_string(prefsdata) {
if (prefsdata !== undefined && prefsdata !== null) {
var lenbytes = lengthBytesUTF8(prefsdata) + 1;
var dest = _malloc(lenbytes);
@ -833,6 +831,15 @@ mergeInto(LibraryManager.library, {
_free(dest);
}
}
}
// Load any default preferences embedded in HTML.
for (var prefsscript of
document.querySelectorAll("script.preferences"))
load_prefs_from_string(prefsscript.textContent);
// Load saved preferences if they exist.
try {
load_prefs_from_string(
localStorage.getItem(location.pathname + " preferences"));
} catch (error) {
// Log the error but otherwise pretend the settings were
// absent.