Fix link/doc/image/embed choosers crashing Draftail in IE11

pull/4263/merge
Thibaud Colas 2018-02-10 18:00:39 +02:00 zatwierdzone przez Matt Westcott
rodzic 5c2ff7d461
commit 1b9116ed2d
2 zmienionych plików z 17 dodań i 1 usunięć

Wyświetl plik

@ -119,7 +119,7 @@ class ModalWorkflowSource extends Component {
$(document.body).on('hidden.bs.modal', this.onClose); $(document.body).on('hidden.bs.modal', this.onClose);
// eslint-disable-next-line new-cap // eslint-disable-next-line new-cap
global.ModalWorkflow({ this.workflow = global.ModalWorkflow({
url, url,
urlParams, urlParams,
responses: { responses: {
@ -138,6 +138,8 @@ class ModalWorkflowSource extends Component {
} }
componentWillUnmount() { componentWillUnmount() {
this.workflow = null;
$(document.body).off('hidden.bs.modal', this.onClose); $(document.body).off('hidden.bs.modal', this.onClose);
} }
@ -172,6 +174,11 @@ class ModalWorkflowSource extends Component {
} }
} }
// IE11 crashes when rendering the new entity in contenteditable if the modal is still open.
// Other browsers do not mind. This is probably a focus management problem.
// From the user's perspective, this is all happening too fast to notice either way.
this.workflow.close();
onComplete(nextState); onComplete(nextState);
} }

Wyświetl plik

@ -210,6 +210,7 @@ describe('ModalWorkflowSource', () => {
jest.spyOn(RichUtils, 'toggleLink'); jest.spyOn(RichUtils, 'toggleLink');
const onComplete = jest.fn(); const onComplete = jest.fn();
const close = jest.fn();
let editorState = EditorState.createWithContent(convertFromRaw({ let editorState = EditorState.createWithContent(convertFromRaw({
entityMap: {}, entityMap: {},
@ -235,10 +236,12 @@ describe('ModalWorkflowSource', () => {
/> />
)); ));
wrapper.instance().workflow = { close };
wrapper.instance().onChosen({}); wrapper.instance().onChosen({});
expect(onComplete).toHaveBeenCalled(); expect(onComplete).toHaveBeenCalled();
expect(RichUtils.toggleLink).toHaveBeenCalled(); expect(RichUtils.toggleLink).toHaveBeenCalled();
expect(close).toHaveBeenCalled();
RichUtils.toggleLink.mockRestore(); RichUtils.toggleLink.mockRestore();
}); });
@ -247,6 +250,7 @@ describe('ModalWorkflowSource', () => {
jest.spyOn(AtomicBlockUtils, 'insertAtomicBlock'); jest.spyOn(AtomicBlockUtils, 'insertAtomicBlock');
const onComplete = jest.fn(); const onComplete = jest.fn();
const close = jest.fn();
let editorState = EditorState.createWithContent(convertFromRaw({ let editorState = EditorState.createWithContent(convertFromRaw({
entityMap: {}, entityMap: {},
@ -274,10 +278,12 @@ describe('ModalWorkflowSource', () => {
/> />
)); ));
wrapper.instance().workflow = { close };
wrapper.instance().onChosen({}); wrapper.instance().onChosen({});
expect(onComplete).toHaveBeenCalled(); expect(onComplete).toHaveBeenCalled();
expect(AtomicBlockUtils.insertAtomicBlock).toHaveBeenCalled(); expect(AtomicBlockUtils.insertAtomicBlock).toHaveBeenCalled();
expect(close).toHaveBeenCalled();
AtomicBlockUtils.insertAtomicBlock.mockRestore(); AtomicBlockUtils.insertAtomicBlock.mockRestore();
}); });
@ -286,6 +292,7 @@ describe('ModalWorkflowSource', () => {
jest.spyOn(Modifier, 'replaceText'); jest.spyOn(Modifier, 'replaceText');
const onComplete = jest.fn(); const onComplete = jest.fn();
const close = jest.fn();
let editorState = EditorState.createWithContent(convertFromRaw({ let editorState = EditorState.createWithContent(convertFromRaw({
entityMap: {}, entityMap: {},
@ -310,6 +317,7 @@ describe('ModalWorkflowSource', () => {
/> />
)); ));
wrapper.instance().workflow = { close };
wrapper.instance().onChosen({ wrapper.instance().onChosen({
url: 'example.com', url: 'example.com',
prefer_this_title_as_link_text: true, prefer_this_title_as_link_text: true,
@ -317,6 +325,7 @@ describe('ModalWorkflowSource', () => {
expect(onComplete).toHaveBeenCalled(); expect(onComplete).toHaveBeenCalled();
expect(Modifier.replaceText).toHaveBeenCalled(); expect(Modifier.replaceText).toHaveBeenCalled();
expect(close).toHaveBeenCalled();
Modifier.replaceText.mockRestore(); Modifier.replaceText.mockRestore();
}); });