mw.Upload: Refactor error handling for the umpteenth time
When I started, I just wanted mw.Upload.BookletLayout to be able to
display more information about errors than just the default message
(like it can do for warnings). And down the rabbit hole I went...
- Simply throw errors when our methods are called with bad parameters, rather than return a rejected promise.
- Always call .notify( 1 ) when upload is complete, regardless of whether it succeeded or failed.
- Reject promises with error code and error details, for consistency with api.js. Previous behavior meant that we did not let callers know the details in some cases. It was also problematic when we passed-through promises rejected in api.js (which had different parameters given).
- Made some effort to return sane codes when something intricate fails in iframe upload, but no guarantee that this works well. The codes are inspired by what api.js returns in similar circumstances.
- When rejecting because of warnings, use the first warning's key as error code.
- Always ignore the warnings when uploading to stash and 'filekey' is present in response, never ignore when uploading directly.
- When the upload succeeds, never check for 'result.upload.error' (which just isn't a thing) nor for 'result.error' (which api.js detects and rejects the promise before we get to it). We only need to check for 'result.upload.warnings'.
- Update for the above changes in mediawiki/api/upload.js.
- More reliably distinguish warnings from errors in all cases, not only when finishing a stash upload.
- Store machine-readable error codes, not mw.Message objects. This lets callers do something sensible when we encounter an unknown error (especially one that has no corresponding message).
- Store full result as state details for warnings, as well as errors.
- Update for the above changes in mediawiki.Upload.js.
- Give errors/warnings generated during upload to stash the same loving treatment as errors/warnings during publishing.
- Extract the code to a new method getErrorMessageForStateDetails().
- Handle 'stashfailed' warning (which is really an error).
- Handle unknown errors, now that mw.Upload lets us do something sensible with them. (See, this is the thing I set out to do.)