( node: Node, rrdom: IRRDocument, domMirror: NodeMirror, parentRRNode?: IRRNode | null, )
| 215 | * @returns the built RRNode |
| 216 | */ |
| 217 | export function buildFromNode( |
| 218 | node: Node, |
| 219 | rrdom: IRRDocument, |
| 220 | domMirror: NodeMirror, |
| 221 | parentRRNode?: IRRNode | null, |
| 222 | ): IRRNode | null { |
| 223 | let rrNode: IRRNode; |
| 224 | |
| 225 | switch (node.nodeType) { |
| 226 | case NodeType.DOCUMENT_NODE: |
| 227 | if (parentRRNode && parentRRNode.nodeName === 'IFRAME') |
| 228 | rrNode = (parentRRNode as RRIFrameElement).contentDocument; |
| 229 | else { |
| 230 | rrNode = rrdom; |
| 231 | (rrNode as IRRDocument).compatMode = (node as Document).compatMode as |
| 232 | | 'BackCompat' |
| 233 | | 'CSS1Compat'; |
| 234 | } |
| 235 | break; |
| 236 | case NodeType.DOCUMENT_TYPE_NODE: { |
| 237 | const documentType = node as DocumentType; |
| 238 | rrNode = rrdom.createDocumentType( |
| 239 | documentType.name, |
| 240 | documentType.publicId, |
| 241 | documentType.systemId, |
| 242 | ); |
| 243 | break; |
| 244 | } |
| 245 | case NodeType.ELEMENT_NODE: { |
| 246 | const elementNode = node as HTMLElement; |
| 247 | const tagName = getValidTagName(elementNode); |
| 248 | rrNode = rrdom.createElement(tagName); |
| 249 | const rrElement = rrNode as IRRElement; |
| 250 | for (const { name, value } of Array.from(elementNode.attributes)) { |
| 251 | rrElement.attributes[name] = value; |
| 252 | } |
| 253 | elementNode.scrollLeft && (rrElement.scrollLeft = elementNode.scrollLeft); |
| 254 | elementNode.scrollTop && (rrElement.scrollTop = elementNode.scrollTop); |
| 255 | /** |
| 256 | * We don't have to record special values of input elements at the beginning. |
| 257 | * Because if these values are changed later, the mutation will be applied through the batched input events on its RRElement after the diff algorithm is executed. |
| 258 | */ |
| 259 | break; |
| 260 | } |
| 261 | case NodeType.TEXT_NODE: |
| 262 | rrNode = rrdom.createTextNode((node as Text).textContent || ''); |
| 263 | break; |
| 264 | case NodeType.CDATA_SECTION_NODE: |
| 265 | rrNode = rrdom.createCDATASection((node as CDATASection).data); |
| 266 | break; |
| 267 | case NodeType.COMMENT_NODE: |
| 268 | rrNode = rrdom.createComment((node as Comment).textContent || ''); |
| 269 | break; |
| 270 | // if node is a shadow root |
| 271 | case NodeType.DOCUMENT_FRAGMENT_NODE: |
| 272 | rrNode = (parentRRNode as IRRElement).attachShadow({ mode: 'open' }); |
| 273 | break; |
| 274 | default: |
no test coverage detected
searching dependent graphs…