Fixes#7829.
The online update check could crash on shutdown because the thread
destructor would run from the wrong thread. This caused the main form
destruction, which happens if the user chooses to install the update,
to be triggered from the worker thread, leading to much pain.
Fixes#7808.
If a project is moved, then the MRU, which has absolute path names, will
probably have references to files that don't exist. Rather than leave
these in the list, to be opened and potentially recreated in the wrong
place, we should just remove them entirely.
Fixes#7810.
This addresses a regression introduced in #7631, where URL parameters
with spaces would be encoded into `+` instead of `%20`. Looking a bit
deeper at the Delphi `TNetEncoding.URL.Encode` function I realised that
it was entirely inadequate. Some guy named Marc Durdin wrote a blog a
good few years ago about the problem, and that's what I ended up using.
This encoding issue caused filenames with spaces (by default, project
paths in Developer have spaces) to give a 404 when editing a touch
layout, which meant that the touch keyboards could not be saved.
Also fixes KEYMAN-DEVELOPER-74, where the + encoding caused multiple
entries to appear in the filename cache.
Amusing to Google this problem, find solid answer on SO, which pointed
to my very own blog. Embarrassing that my own code didn't already
include my own fix.
A secondary issue is also fixed here, where request parameters were
double-decoded for formencoded POST requests. The fix for broken URL
encodings was only required for GET requests.
This also showed up in KEYMAN-DEVELOPER-74, with double-encoded paths
being registered as source files.
- list is probably in good shape for the builder (not yet the writer).
Other stuff TBD.
For feat(developer): ldml: include all LDML data in kmx+ 🙀#7532
- update kmx-plus.ts for key2 and list sections
- add tests for key2
- TODO: binary write, basic fixture, layr
For feat(developer): ldml: include all LDML data in kmx+ 🙀#7532
Fixes#7658.
When manipulating text that contains an unpaired surrogate, the text
editor could throw an exception trying to encode the text to send
through to the token command. This simply masks that error.
Fixes#4757.
Fixes#6928.
Three separate ways shutdown is more robust:
1. Destroy main form before web server -- this ensures that all main
form routines have deregistered app sources from web server.
2. In some situations, `FormClose` can be skipped by shutdown routines,
for example, if you call `Application.Terminate`. This change ensures
that we get a second chance to cleanup in the form destructor with
`DoCloseCleanup`.
3. In the Online Update Check, instead of `Application.Terminate`, we
now use `Application.MainForm.Close`, which is much more polite, as
it ensures that changed files are saved, etc, and does proper
cleanup. This particular change may make the other two somewhat
irrelevant but they are still sensible as they will cover us for
other potential form destruction sequences.