mirror of
https://github.com/codex-team/editor.js
synced 2024-05-20 15:26:48 +02:00
fix(paste): handle pasteConfig with tag names specified in upper case (#2217)
* toLower case added * regression test case added * change log update * version updated * Apply suggestions from code review Co-authored-by: Peter Savchenko <specc.dev@gmail.com> * Update docs/CHANGELOG.md Co-authored-by: Peter Savchenko <specc.dev@gmail.com> Co-authored-by: Peter Savchenko <specc.dev@gmail.com>
This commit is contained in:
parent
b9a0665672
commit
c97f0842f5
|
@ -1,5 +1,8 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
### 2.26.3
|
||||||
|
|
||||||
|
- `Fix` — *Paste Module* — fix for a problem with specifying of `pasteConfig().tags` in upper case [#2208](https://github.com/codex-team/editor.js/issues/2208).
|
||||||
|
|
||||||
### 2.26.2
|
### 2.26.2
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@editorjs/editorjs",
|
"name": "@editorjs/editorjs",
|
||||||
"version": "2.26.2",
|
"version": "2.26.3",
|
||||||
"description": "Editor.js — Native JS, based on API and Open Source",
|
"description": "Editor.js — Native JS, based on API and Open Source",
|
||||||
"main": "dist/editor.js",
|
"main": "dist/editor.js",
|
||||||
"types": "./types/index.d.ts",
|
"types": "./types/index.d.ts",
|
||||||
|
|
|
@ -639,7 +639,7 @@ export default class Paste extends Module {
|
||||||
tags.forEach((tag) => {
|
tags.forEach((tag) => {
|
||||||
const sanitizationConfig = _.isObject(tagOrSanitizeConfig) ? tagOrSanitizeConfig[tag] : null;
|
const sanitizationConfig = _.isObject(tagOrSanitizeConfig) ? tagOrSanitizeConfig[tag] : null;
|
||||||
|
|
||||||
result[tag] = sanitizationConfig || {};
|
result[tag.toLowerCase()] = sanitizationConfig || {};
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -213,12 +213,12 @@ describe('Editor Tools Api', () => {
|
||||||
icon: ICON,
|
icon: ICON,
|
||||||
name: 'testToolTune',
|
name: 'testToolTune',
|
||||||
|
|
||||||
onActivate: (): void => {},
|
onActivate: (): void => { },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Save method stub */
|
/** Save method stub */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** Renders a block */
|
/** Renders a block */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -283,20 +283,20 @@ describe('Editor Tools Api', () => {
|
||||||
icon: ICON,
|
icon: ICON,
|
||||||
name: 'testToolTune1',
|
name: 'testToolTune1',
|
||||||
|
|
||||||
onActivate: (): void => {},
|
onActivate: (): void => { },
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'Test tool tune 2',
|
label: 'Test tool tune 2',
|
||||||
icon: ICON,
|
icon: ICON,
|
||||||
name: 'testToolTune2',
|
name: 'testToolTune2',
|
||||||
|
|
||||||
onActivate: (): void => {},
|
onActivate: (): void => { },
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Save method stub */
|
/** Save method stub */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** Renders a block */
|
/** Renders a block */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -366,7 +366,7 @@ describe('Editor Tools Api', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Save method stub */
|
/** Save method stub */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** Renders a block */
|
/** Renders a block */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -431,15 +431,15 @@ describe('Editor Tools Api', () => {
|
||||||
/** config specified handled tag */
|
/** config specified handled tag */
|
||||||
public static get pasteConfig(): PasteConfig {
|
public static get pasteConfig(): PasteConfig {
|
||||||
return {
|
return {
|
||||||
tags: [ 'img' ], // only tag name specified. Attributes should be sanitized
|
tags: ['img'], // only tag name specified. Attributes should be sanitized
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -483,15 +483,15 @@ describe('Editor Tools Api', () => {
|
||||||
/** config specified handled tag */
|
/** config specified handled tag */
|
||||||
public static get pasteConfig(): PasteConfig {
|
public static get pasteConfig(): PasteConfig {
|
||||||
return {
|
return {
|
||||||
tags: [ 'img' ], // only tag name specified. Attributes should be sanitized
|
tags: ['img'], // only tag name specified. Attributes should be sanitized
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -526,6 +526,79 @@ describe('Editor Tools Api', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* tags: ['OL','LI',]
|
||||||
|
* -><ol>
|
||||||
|
* <li></li>
|
||||||
|
* <li></li>
|
||||||
|
* </ol>
|
||||||
|
*/
|
||||||
|
it('should sanitize all attributes from tags, even if tag names specified in uppercase', () => {
|
||||||
|
/**
|
||||||
|
* Variable used for spying the pasted element we are passing to the Tool
|
||||||
|
*/
|
||||||
|
let pastedElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test tool with pasteConfig.tags specified
|
||||||
|
*/
|
||||||
|
class TestListTool {
|
||||||
|
/** config specified handled tag */
|
||||||
|
public static get pasteConfig(): PasteConfig {
|
||||||
|
return {
|
||||||
|
tags: ['OL', 'LI'], // tag names specified in upper case
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** onPaste callback will be stubbed below */
|
||||||
|
public onPaste(): void { }
|
||||||
|
|
||||||
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
|
public save(): void { }
|
||||||
|
|
||||||
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
|
public render(): HTMLElement {
|
||||||
|
return document.createElement('ol');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stub the onPaste method to access the PasteEvent data for assertion
|
||||||
|
*/
|
||||||
|
cy.stub(TestListTool.prototype, 'onPaste').callsFake((event: HTMLPasteEvent) => {
|
||||||
|
pastedElement = event.detail.data;
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.createEditor({
|
||||||
|
tools: {
|
||||||
|
testListTool: TestListTool,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
cy.get('[data-cy=editorjs]')
|
||||||
|
.get('div.ce-block')
|
||||||
|
.click()
|
||||||
|
.paste({
|
||||||
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
||||||
|
'text/html': '<ol start="50"><li>Orderd List</li><li>Unorderd List</li></ol>', // all attributes should be sanitized, <li> should be preserved
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
expect(pastedElement).not.to.be.undefined;
|
||||||
|
expect(pastedElement.tagName.toLowerCase()).eq('ol');
|
||||||
|
expect(pastedElement.attributes.length).eq(0);
|
||||||
|
// check number of children
|
||||||
|
expect(pastedElement.children.length).eq(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that all children are <li> tags
|
||||||
|
*/
|
||||||
|
pastedElement.childNodes.forEach((child) => {
|
||||||
|
expect(child.tagName.toLowerCase()).eq('li');
|
||||||
|
expect(child.attributes.length).eq(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tags: [{
|
* tags: [{
|
||||||
* img: {
|
* img: {
|
||||||
|
@ -559,10 +632,10 @@ describe('Editor Tools Api', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
@ -637,14 +710,14 @@ describe('Editor Tools Api', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
return document.createElement('tbody');
|
return document.createElement('video');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -721,14 +794,14 @@ describe('Editor Tools Api', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
return document.createElement('tbody');
|
return document.createElement('video');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -797,10 +870,10 @@ describe('Editor Tools Api', () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** onPaste callback will be stubbed below */
|
/** onPaste callback will be stubbed below */
|
||||||
public onPaste(): void {}
|
public onPaste(): void { }
|
||||||
|
|
||||||
/** save is required for correct implementation of the BlockTool class */
|
/** save is required for correct implementation of the BlockTool class */
|
||||||
public save(): void {}
|
public save(): void { }
|
||||||
|
|
||||||
/** render is required for correct implementation of the BlockTool class */
|
/** render is required for correct implementation of the BlockTool class */
|
||||||
public render(): HTMLElement {
|
public render(): HTMLElement {
|
||||||
|
|
Loading…
Reference in a new issue