瀏覽代碼

- THTMLToDOMConverter.FElementStack is created and destroyed, but unused otherwise. Removed.
* THTMLToDOMConverter.ReaderEndElement: Since each item in FNodeBuffer is removed only when processing EndElement event for its *parent* element (not the element it corresponds to, if any), it must be flagged for ignore once its own EndElement is handled. Otherwise, several same-named elements nested within each other were ending up in a wrong DOM tree. This bug was reported in Russian forum.

git-svn-id: trunk@31773 -

sergei 10 年之前
父節點
當前提交
fe59bb9ec5
共有 1 個文件被更改,包括 3 次插入4 次删除
  1. 3 4
      packages/fcl-xml/src/sax_html.pp

+ 3 - 4
packages/fcl-xml/src/sax_html.pp

@@ -78,6 +78,7 @@ type
 
   THTMLNodeInfo = class
     NodeType: THTMLNodeType;
+    Closed: Boolean;
     DOMNode: TDOMNode;
   end;
 
@@ -85,7 +86,6 @@ type
   private
     FReader: THTMLReader;
     FDocument: TDOMDocument;
-    FElementStack: TList;
     FNodeBuffer: TList;
     IsFragmentMode, FragmentRootSet: Boolean;
     FragmentRoot: TDOMNode;
@@ -545,7 +545,6 @@ begin
   FReader.OnStartElement := @ReaderStartElement;
   FReader.OnEndElement := @ReaderEndElement;
   FDocument := ADocument;
-  FElementStack := TList.Create;
   FNodeBuffer := TList.Create;
 end;
 
@@ -566,7 +565,6 @@ begin
     THTMLNodeInfo(FNodeBuffer[i]).Free;
   FNodeBuffer.Free;
 
-  FElementStack.Free;
   inherited Destroy;
 end;
 
@@ -653,7 +651,7 @@ begin
   while i >= 0 do
   begin
     NodeInfo := THTMLNodeInfo(FNodeBuffer.Items[i]);
-    if (NodeInfo.NodeType = ntTag) and
+    if (NodeInfo.NodeType = ntTag) and (not NodeInfo.Closed) and
       (CompareText(NodeInfo.DOMNode.NodeName, LocalName) = 0) then
     begin
       // We found the matching start tag
@@ -689,6 +687,7 @@ begin
         NodeInfo2.Free;
         FNodeBuffer.Delete(i);
       end;
+      NodeInfo.Closed := True;
       break;
     end;
     Dec(i);