🐛 Fixed editor crashing with unknown cards in mobiledoc (#16430)

refs TryGhost/Team#2702

- adds a default handler for unknown cards: 
- logs a warning message to the console 
- removes the card from the mobiledoc
This commit is contained in:
Chris Raible 2023-03-16 16:06:56 -07:00 committed by GitHub
parent 74a1ab4525
commit 8d4028bbb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 2 deletions

View File

@ -189,7 +189,12 @@ export default class KoenigEditor extends Component {
spellcheck: this.spellcheck,
autofocus: this.autofocus,
atoms,
cards
cards,
unknownCardHandler: ({env}) => {
console.warn(`Unknown card encountered: ${env.name}`); //eslint-disable-line
env.remove();
}
}, options);
}
@ -807,7 +812,7 @@ export default class KoenigEditor extends Component {
// refresh drag/drop
// TODO: can be made more performant by only refreshing when droppable
// order changes or when sections are added/removed
this._cardDragDropContainer.refresh();
this._cardDragDropContainer?.refresh();
}
cursorDidChange(editor) {

View File

@ -632,5 +632,75 @@ describe('Acceptance: Editor', function () {
// no expects, will throw with an error and fail when it hits the bug
});
// https://github.com/TryGhost/Team/issues/2702
it('removes unknown cards instead of crashing', async function () {
let post = this.server.create('post', {authors: [author], status: 'published', title: 'Title', mobiledoc: JSON.stringify({
version: '0.3.1',
atoms: [],
cards: [
[
'asdfadsfasdfasdfadsf',
{
cardWidth: 'wide',
startingPosition: 50,
caption: 'Salmon On The Grill: BEFORE / AFTER'
}
]
],
markups: [],
sections: [
[
1,
'p',
[
[
0,
[],
0,
'Paragraph 1'
]
]
],
[
10,
0
]
],
ghostVersion: '4.0'
})});
await visit(`/editor/post/${post.id}`);
expect(currentURL(), 'currentURL').to.equal(`/editor/post/${post.id}`);
// Make an edit and save
await fillIn('[data-test-editor-title-input]', 'Title 2');
await click('[data-test-button="publish-save"]');
// Check that the unknown card has been removed
expect(
this.server.db.posts.find(post.id).mobiledoc,
'removed unknown card from mobiledoc'
).to.deep.equal(JSON.stringify({version: '0.3.1',
atoms: [],
cards: [],
markups: [],
sections: [
[
1,
'p',
[
[
0,
[],
0,
'Paragraph 1'
]
]
]
],
ghostVersion: '4.0'}));
});
});
});