Fossil SCM
Found a Chrome-only workaround to tell Chrome not to paste formatting into the chat editor field.
Commit
607b11ddc6ec2ba838cef29c353ded442df9b276e978b868903cf3d79515c8ff
Parent
87b0b12dc45b9b2…
1 file changed
+10
-3
+10
-3
| --- src/fossil.page.chat.js | ||
| +++ src/fossil.page.chat.js | ||
| @@ -543,10 +543,16 @@ | ||
| 543 | 543 | D.addClassBriefly(e, a, 0, cb); |
| 544 | 544 | } |
| 545 | 545 | return this; |
| 546 | 546 | } |
| 547 | 547 | }; |
| 548 | + if(/chrome/i.test(navigator.userAgent)){ | |
| 549 | + // Only the Chrome family supports | |
| 550 | + // contenteditable=plaintext-only, but Chrome is the only engine | |
| 551 | + // for which we need this flag: | |
| 552 | + D.attr(cs.e.inputField,'contenteditable','plaintext-only'); | |
| 553 | + } | |
| 548 | 554 | cs.animate.$disabled = true; |
| 549 | 555 | F.fetch.beforesend = ()=>cs.ajaxStart(); |
| 550 | 556 | F.fetch.aftersend = ()=>cs.ajaxEnd(); |
| 551 | 557 | cs.pageTitleOrig = cs.e.pageTitle.innerText; |
| 552 | 558 | const qs = (e)=>document.querySelector(e); |
| @@ -1127,22 +1133,23 @@ | ||
| 1127 | 1133 | }, |
| 1128 | 1134 | dragend: function(ev){ |
| 1129 | 1135 | D.removeClass(dropHighlight, 'dragover'); |
| 1130 | 1136 | } |
| 1131 | 1137 | }; |
| 1132 | - const cancelEvent = function(ev){ | |
| 1138 | + const noDragDropEvents = function(ev){ | |
| 1133 | 1139 | /* contenteditable tries to do its own thing with dropped data, |
| 1134 | 1140 | which is not compatible with how we use it, so... */ |
| 1135 | - //if(ev.dataTransfer) ev.dataTransfer.dropEffect = 'none'; | |
| 1141 | + ev.dataTransfer.effectAllowed = 'none'; | |
| 1142 | + ev.dataTransfer.dropEffect = 'none'; | |
| 1136 | 1143 | ev.preventDefault(); |
| 1137 | 1144 | ev.stopPropagation(); |
| 1138 | 1145 | return false; |
| 1139 | 1146 | }; |
| 1140 | 1147 | Object.keys(dropEvents).forEach( |
| 1141 | 1148 | (k)=>{ |
| 1142 | 1149 | Chat.e.inputFile.addEventListener(k, dropEvents[k], true); |
| 1143 | - Chat.inputElement().addEventListener(k, cancelEvent, false); | |
| 1150 | + Chat.inputElement().addEventListener(k, noDragDropEvents, false); | |
| 1144 | 1151 | } |
| 1145 | 1152 | ); |
| 1146 | 1153 | return bxs; |
| 1147 | 1154 | })()/*drag/drop*/; |
| 1148 | 1155 | |
| 1149 | 1156 |
| --- src/fossil.page.chat.js | |
| +++ src/fossil.page.chat.js | |
| @@ -543,10 +543,16 @@ | |
| 543 | D.addClassBriefly(e, a, 0, cb); |
| 544 | } |
| 545 | return this; |
| 546 | } |
| 547 | }; |
| 548 | cs.animate.$disabled = true; |
| 549 | F.fetch.beforesend = ()=>cs.ajaxStart(); |
| 550 | F.fetch.aftersend = ()=>cs.ajaxEnd(); |
| 551 | cs.pageTitleOrig = cs.e.pageTitle.innerText; |
| 552 | const qs = (e)=>document.querySelector(e); |
| @@ -1127,22 +1133,23 @@ | |
| 1127 | }, |
| 1128 | dragend: function(ev){ |
| 1129 | D.removeClass(dropHighlight, 'dragover'); |
| 1130 | } |
| 1131 | }; |
| 1132 | const cancelEvent = function(ev){ |
| 1133 | /* contenteditable tries to do its own thing with dropped data, |
| 1134 | which is not compatible with how we use it, so... */ |
| 1135 | //if(ev.dataTransfer) ev.dataTransfer.dropEffect = 'none'; |
| 1136 | ev.preventDefault(); |
| 1137 | ev.stopPropagation(); |
| 1138 | return false; |
| 1139 | }; |
| 1140 | Object.keys(dropEvents).forEach( |
| 1141 | (k)=>{ |
| 1142 | Chat.e.inputFile.addEventListener(k, dropEvents[k], true); |
| 1143 | Chat.inputElement().addEventListener(k, cancelEvent, false); |
| 1144 | } |
| 1145 | ); |
| 1146 | return bxs; |
| 1147 | })()/*drag/drop*/; |
| 1148 | |
| 1149 |
| --- src/fossil.page.chat.js | |
| +++ src/fossil.page.chat.js | |
| @@ -543,10 +543,16 @@ | |
| 543 | D.addClassBriefly(e, a, 0, cb); |
| 544 | } |
| 545 | return this; |
| 546 | } |
| 547 | }; |
| 548 | if(/chrome/i.test(navigator.userAgent)){ |
| 549 | // Only the Chrome family supports |
| 550 | // contenteditable=plaintext-only, but Chrome is the only engine |
| 551 | // for which we need this flag: |
| 552 | D.attr(cs.e.inputField,'contenteditable','plaintext-only'); |
| 553 | } |
| 554 | cs.animate.$disabled = true; |
| 555 | F.fetch.beforesend = ()=>cs.ajaxStart(); |
| 556 | F.fetch.aftersend = ()=>cs.ajaxEnd(); |
| 557 | cs.pageTitleOrig = cs.e.pageTitle.innerText; |
| 558 | const qs = (e)=>document.querySelector(e); |
| @@ -1127,22 +1133,23 @@ | |
| 1133 | }, |
| 1134 | dragend: function(ev){ |
| 1135 | D.removeClass(dropHighlight, 'dragover'); |
| 1136 | } |
| 1137 | }; |
| 1138 | const noDragDropEvents = function(ev){ |
| 1139 | /* contenteditable tries to do its own thing with dropped data, |
| 1140 | which is not compatible with how we use it, so... */ |
| 1141 | ev.dataTransfer.effectAllowed = 'none'; |
| 1142 | ev.dataTransfer.dropEffect = 'none'; |
| 1143 | ev.preventDefault(); |
| 1144 | ev.stopPropagation(); |
| 1145 | return false; |
| 1146 | }; |
| 1147 | Object.keys(dropEvents).forEach( |
| 1148 | (k)=>{ |
| 1149 | Chat.e.inputFile.addEventListener(k, dropEvents[k], true); |
| 1150 | Chat.inputElement().addEventListener(k, noDragDropEvents, false); |
| 1151 | } |
| 1152 | ); |
| 1153 | return bxs; |
| 1154 | })()/*drag/drop*/; |
| 1155 | |
| 1156 |