1
0
mirror of https://github.com/ianstormtaylor/slate.git synced 2025-08-16 12:14:14 +02:00

Second attempt at Debug Mutations (#2823)

* Add debug-mutations

* Fix linting

* Add debug-mutations to o core plugins

* Fix debug output

* Add comment about debug statement

* Add comment explaining the building of debug output object
This commit is contained in:
Sunny Hirai
2019-05-22 18:21:20 -07:00
committed by GitHub
parent 8311767108
commit 96cb419ccb
2 changed files with 82 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
import Debug from 'debug'
/**
* Debug mutations function.
*
* @type {Function}
*/
const debug = Debug('slate:mutations')
/**
* Properties on a MutationRecord
*
* @type {Object}
*/
const MUTATION_PROPERTIES = [
'type',
'oldValue',
'target',
'addedNodes',
'removedNodes',
'attributeName',
'attributeNamespace',
'nextSibling',
'previousSibling',
]
/**
* A plugin that sends short easy to digest debug info about each dom mutation
* to browser.
*
* More information about mutations here:
*
* <https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver>
* <https://developer.mozilla.org/en-US/docs/Web/API/MutationRecord>
*
* @param {Object} options
*/
function DebugMutationsPlugin({ editor }) {
const observer = new window.MutationObserver(mutations => {
const array = Array.from(mutations).map(mutationRecord => {
const object = {}
// Only add properties that provide meaningful values to the object
// to make the debug info easier to read
MUTATION_PROPERTIES.forEach(key => {
const value = mutationRecord[key]
if (value == null) return
if (value instanceof window.NodeList && value.length === 0) return
object[key] = value
})
return object
})
// The first argument must not be the array as `debug` renders the first
// argument in a different way than the rest
debug(`${array.length} Mutations`, ...array)
})
// `findDOMNode` does not exist until later so we use `setTimeout`
setTimeout(() => {
const rootEl = editor.findDOMNode([])
observer.observe(rootEl, {
childList: true,
characterData: true,
attributes: true,
subtree: true,
characterDataOldValue: true,
})
})
}
export default DebugMutationsPlugin

View File

@@ -9,6 +9,7 @@ import DOMPlugin from '../dom'
import RestoreDOMPlugin from './restore-dom'
import DebugEventsPlugin from '../debug/debug-events'
import DebugBatchEventsPlugin from '../debug/debug-batch-events'
import DebugMutationsPlugin from '../debug/debug-mutations'
/**
* A plugin that adds the React-specific rendering logic to the editor.
@@ -25,6 +26,9 @@ function ReactPlugin(options = {}) {
const debugBatchEventsPlugin = Debug.enabled('slate:batch-events')
? DebugBatchEventsPlugin(options)
: null
const debugMutationsPlugin = Debug.enabled('slate:mutations')
? DebugMutationsPlugin(options)
: null
const renderingPlugin = RenderingPlugin(options)
const commandsPlugin = CommandsPlugin(options)
const queriesPlugin = QueriesPlugin(options)
@@ -45,6 +49,7 @@ function ReactPlugin(options = {}) {
return [
debugEventsPlugin,
debugBatchEventsPlugin,
debugMutationsPlugin,
domPlugin,
restoreDomPlugin,
placeholderPlugin,