mirror of
https://github.com/atom/atom.git
synced 2026-04-06 03:02:13 -04:00
Convert DOMElementPool and specs to JS
This commit is contained in:
committed by
Antonio Scandurra
parent
f7ca70419c
commit
bb9d1f49c0
@@ -1,55 +0,0 @@
|
||||
module.exports =
|
||||
class DOMElementPool
|
||||
constructor: ->
|
||||
@freeElementsByTagName = {}
|
||||
@freedElements = new Set
|
||||
|
||||
clear: ->
|
||||
@freedElements.clear()
|
||||
for tagName, freeElements of @freeElementsByTagName
|
||||
freeElements.length = 0
|
||||
return
|
||||
|
||||
build: (tagName, factory, reset) ->
|
||||
element = @freeElementsByTagName[tagName]?.pop()
|
||||
element ?= factory()
|
||||
reset(element)
|
||||
@freedElements.delete(element)
|
||||
element
|
||||
|
||||
buildElement: (tagName, className) ->
|
||||
factory = -> document.createElement(tagName)
|
||||
reset = (element) ->
|
||||
delete element.dataset[dataId] for dataId of element.dataset
|
||||
element.removeAttribute("style")
|
||||
if className?
|
||||
element.className = className
|
||||
else
|
||||
element.removeAttribute("class")
|
||||
@build(tagName, factory, reset)
|
||||
|
||||
buildText: (textContent) ->
|
||||
factory = -> document.createTextNode(textContent)
|
||||
reset = (element) -> element.textContent = textContent
|
||||
@build("#text", factory, reset)
|
||||
|
||||
freeElementAndDescendants: (element) ->
|
||||
@free(element)
|
||||
@freeDescendants(element)
|
||||
|
||||
freeDescendants: (element) ->
|
||||
for descendant in element.childNodes by -1
|
||||
@free(descendant)
|
||||
@freeDescendants(descendant)
|
||||
return
|
||||
|
||||
free: (element) ->
|
||||
throw new Error("The element cannot be null or undefined.") unless element?
|
||||
throw new Error("The element has already been freed!") if @freedElements.has(element)
|
||||
|
||||
tagName = element.nodeName.toLowerCase()
|
||||
@freeElementsByTagName[tagName] ?= []
|
||||
@freeElementsByTagName[tagName].push(element)
|
||||
@freedElements.add(element)
|
||||
|
||||
element.remove()
|
||||
68
src/dom-element-pool.js
Normal file
68
src/dom-element-pool.js
Normal file
@@ -0,0 +1,68 @@
|
||||
module.exports =
|
||||
class DOMElementPool {
|
||||
constructor () {
|
||||
this.freeElementsByTagName = {}
|
||||
this.freedElements = new Set()
|
||||
}
|
||||
|
||||
clear () {
|
||||
this.freedElements.clear()
|
||||
for (let tagName in this.freeElementsByTagName) {
|
||||
const freeElements = this.freeElementsByTagName[tagName]
|
||||
freeElements.length = 0
|
||||
}
|
||||
}
|
||||
|
||||
build (tagName, factory, reset) {
|
||||
let element = this.freeElementsByTagName[tagName] ? this.freeElementsByTagName[tagName].pop() : null
|
||||
if (!element) { element = factory() }
|
||||
reset(element)
|
||||
this.freedElements.delete(element)
|
||||
return element
|
||||
}
|
||||
|
||||
buildElement (tagName, className) {
|
||||
const factory = () => document.createElement(tagName)
|
||||
const reset = function (element) {
|
||||
for (let dataId in element.dataset) { delete element.dataset[dataId] }
|
||||
element.removeAttribute('style')
|
||||
if (className != null) {
|
||||
element.className = className
|
||||
} else {
|
||||
element.removeAttribute('class')
|
||||
}
|
||||
}
|
||||
return this.build(tagName, factory, reset)
|
||||
}
|
||||
|
||||
buildText (textContent) {
|
||||
const factory = () => document.createTextNode(textContent)
|
||||
const reset = element => { element.textContent = textContent }
|
||||
return this.build('#text', factory, reset)
|
||||
}
|
||||
|
||||
freeElementAndDescendants (element) {
|
||||
this.free(element)
|
||||
return this.freeDescendants(element)
|
||||
}
|
||||
|
||||
freeDescendants (element) {
|
||||
for (let i = element.childNodes.length - 1; i >= 0; i--) {
|
||||
const descendant = element.childNodes[i]
|
||||
this.free(descendant)
|
||||
this.freeDescendants(descendant)
|
||||
}
|
||||
}
|
||||
|
||||
free (element) {
|
||||
if (element == null) { throw new Error('The element cannot be null or undefined.') }
|
||||
if (this.freedElements.has(element)) { throw new Error('The element has already been freed!') }
|
||||
|
||||
const tagName = element.nodeName.toLowerCase()
|
||||
if (this.freeElementsByTagName[tagName] == null) { this.freeElementsByTagName[tagName] = [] }
|
||||
this.freeElementsByTagName[tagName].push(element)
|
||||
this.freedElements.add(element)
|
||||
|
||||
return element.remove()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user