private void InsertElement(RenderBatch batch, ContainerNode parent, int childIndex, ArraySegment <RenderTreeFrame> frames, RenderTreeFrame frame, int frameIndex) { // Note: we don't handle SVG here var newElement = new ElementNode(frame.ElementName); var inserted = false; // Apply attributes for (var i = frameIndex + 1; i < frameIndex + frame.ElementSubtreeLength; i++) { var descendantFrame = batch.ReferenceFrames.Array[i]; if (descendantFrame.FrameType == RenderTreeFrameType.Attribute) { ApplyAttribute(batch, newElement, descendantFrame); } else { parent.InsertLogicalChild(newElement, childIndex); inserted = true; // As soon as we see a non-attribute child, all the subsequent child frames are // not attributes, so bail out and insert the remnants recursively InsertFrameRange(batch, newElement, 0, frames, i, frameIndex + frame.ElementSubtreeLength); break; } } // this element did not have any children, so it's not inserted yet. if (!inserted) { parent.InsertLogicalChild(newElement, childIndex); } }
private void InsertText(ContainerNode parent, int childIndex, RenderTreeFrame frame) { var textContent = frame.TextContent; var newTextNode = new TextNode(textContent); parent.InsertLogicalChild(newTextNode, childIndex); }