Spec has:
Let transaction be the upgrade transaction associated with database. If one does not exist or it is finished, throw an "InvalidStateError" DOMException.
But in this case, a TransactionInactiveError is thrown instead in Chrome/Firefox and asserted as such in tests:
tx.abort();
db.createObjectStore('s'); // throws TransactionInactiveError
Noted by the ever vigilant @brettz9 over in web-platform-tests/wpt#5612 but it's the spec that's wrong here since impls/tests match.
Unfortunately, the "finished" notion for transactions is a bit squishy. Spec-wise we may be able to just drop the "or it is finished" bit from these methods and then tidy up the transaction lifecycle at some point in the future.