[FIX] web_editor: do not remove default styles
Previously, when copy-pasting HTML with styles on styleable tags, those styles could still be removed by the editor if they had a default value. This was supposed to be a way to keep the DOM clean and lighter. However, styles with default values still serve a purpose when overriding non-default values inherited by their parents. Therefore, removing them was a conceptual mistake. One example in the editor where this purpose can be served is in tables where spans can override the style of the cell or parent span. This commit ensures we no longer remove style attributes because of their default value. Task-3332955 X-original-commit: 39acbc23929f6004e6cb5fe1059ccabf87799e8c Part-of: odoo/odoo#126248
This commit is contained in:
@@ -174,15 +174,7 @@ export const CLIPBOARD_WHITELISTS = {
|
||||
],
|
||||
attributes: ['class', 'href', 'src', 'target'],
|
||||
styledTags: ['SPAN', 'B', 'STRONG', 'I', 'S', 'U', 'FONT'],
|
||||
styles: {
|
||||
'text-decoration': { defaultValues: ['', 'none'] },
|
||||
'font-weight': { defaultValues: ['', '400'] },
|
||||
'background-color': { defaultValues: ['', '#fff', '#ffffff', 'rgb(255, 255, 255)', 'rgba(255, 255, 255, 1)'] },
|
||||
'color': { defaultValues: ['', '#000', '#000000', 'rgb(0, 0, 0)', 'rgba(0, 0, 0, 1)'] },
|
||||
'font-style': { defaultValues: ['', 'none', 'normal'] },
|
||||
'text-decoration-line': { defaultValues: ['', 'none'] },
|
||||
'font-size': { defaultValues: ['', '16px'] },
|
||||
}
|
||||
styles: ['text-decoration', 'font-weight', 'background-color', 'color', 'font-style', 'text-decoration-line', 'font-size']
|
||||
};
|
||||
|
||||
// Commands that don't require a DOM selection but take an argument instead.
|
||||
@@ -3191,9 +3183,7 @@ export class OdooEditor extends EventTarget {
|
||||
if (CLIPBOARD_WHITELISTS.styledTags.includes(node.nodeName) && attribute.name === 'style') {
|
||||
const spanInlineStyles = attribute.value.split(';').map(x => x.trim());
|
||||
const allowedSpanInlineStyles = spanInlineStyles.filter(rawStyle => {
|
||||
const [styleName, styleValue] = rawStyle.split(':');
|
||||
const style = CLIPBOARD_WHITELISTS.styles[styleName.trim()];
|
||||
return style && !style.defaultValues.includes(styleValue.trim());
|
||||
return CLIPBOARD_WHITELISTS.styles.includes(rawStyle.split(':')[0].trim());
|
||||
});
|
||||
node.removeAttribute(attribute.name);
|
||||
if (allowedSpanInlineStyles.length > 0) {
|
||||
@@ -3234,7 +3224,7 @@ export class OdooEditor extends EventTarget {
|
||||
okClass instanceof RegExp ? okClass.test(item) : okClass === item,
|
||||
);
|
||||
} else {
|
||||
const allowedSpanStyles = Object.keys(CLIPBOARD_WHITELISTS.styles).map(s => `span[style*="${s}"]`);
|
||||
const allowedSpanStyles = CLIPBOARD_WHITELISTS.styles.map(s => `span[style*="${s}"]`);
|
||||
return (
|
||||
item.nodeType === Node.TEXT_NODE ||
|
||||
(
|
||||
|
||||
@@ -414,7 +414,7 @@ describe('Paste', () => {
|
||||
});
|
||||
});
|
||||
describe('Simple html span', () => {
|
||||
const simpleHtmlCharX = '<span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">x</span>';
|
||||
const simpleHtmlCharX = '<span style="font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">x</span>';
|
||||
describe('range collapsed', async () => {
|
||||
it('should paste a text at the beginning of a p', async () => {
|
||||
await testEditor(BasicEditor, {
|
||||
@@ -660,7 +660,7 @@ describe('Paste', () => {
|
||||
});
|
||||
});
|
||||
describe('Complex html span', () => {
|
||||
const complexHtmlData = '<span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">1</span><b style="box-sizing: border-box; font-weight: bolder; color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">23</b><span style="color: rgb(0, 0, 0); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><span> </span>4</span>';
|
||||
const complexHtmlData = '<span style="font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;">1</span><b style="box-sizing: border-box; font-weight: bolder; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">23</b><span style="font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; display: inline !important; float: none;"><span> </span>4</span>';
|
||||
describe('range collapsed', async () => {
|
||||
it('should paste a text at the beginning of a p', async () => {
|
||||
await testEditor(BasicEditor, {
|
||||
|
||||
Reference in New Issue
Block a user