소스 검색

--- Merging r31773 into '.':
U packages/fcl-xml/src/sax_html.pp
--- Recording mergeinfo for merge of r31773 into '.':
U .
--- Merging r33040 into '.':
U packages/fcl-xml/src/xmltextreader.pp
--- Recording mergeinfo for merge of r33040 into '.':
G .
--- Merging r33042 into '.':
U packages/fcl-xml/src/dtdmodel.pp
--- Recording mergeinfo for merge of r33042 into '.':
G .

# revisions: 31773,33040,33042
------------------------------------------------------------------------
r31773 | sergei | 2015-09-22 07:37:39 +0200 (di, 22 sep 2015) | 3 lines
Changed paths:
M /trunk/packages/fcl-xml/src/sax_html.pp

- 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.

------------------------------------------------------------------------
------------------------------------------------------------------------
r33040 | sergei | 2016-02-02 03:27:28 +0100 (di, 02 feb 2016) | 2 lines
Changed paths:
M /trunk/packages/fcl-xml/src/xmltextreader.pp

* fcl-xml: Fixed parsing DTD, whitespace after name is mandatory only if followed by ExternalID. Mantis #29569.

------------------------------------------------------------------------
------------------------------------------------------------------------
r33042 | sergei | 2016-02-02 18:17:08 +0100 (di, 02 feb 2016) | 1 line
Changed paths:
M /trunk/packages/fcl-xml/src/dtdmodel.pp

* fcl-xml: fixed off-by-one error, preventing 'xmlns:foo' in DTD ATTLIST from being recognized as namespace declaration.
------------------------------------------------------------------------

git-svn-id: branches/fixes_3_0@33409 -

marco 9 년 전
부모
커밋
8cc21d5591
3개의 변경된 파일14개의 추가작업 그리고 11개의 파일을 삭제
  1. 2 1
      packages/fcl-xml/src/dtdmodel.pp
  2. 3 4
      packages/fcl-xml/src/sax_html.pp
  3. 9 6
      packages/fcl-xml/src/xmltextreader.pp

+ 2 - 1
packages/fcl-xml/src/dtdmodel.pp

@@ -396,7 +396,8 @@ begin
   FData^.FQName := aName;
   FData^.FColonPos := aColonPos;
   FData^.FTypeInfo := Self;
-  FIsNamespaceDecl := ((Length(aName^.Key) = 5) or (aColonPos = 6)) and
+  { aColonPos is zero-based }
+  FIsNamespaceDecl := ((Length(aName^.Key) = 5) or (aColonPos = 5)) and
     (Pos(XMLString('xmlns'), aName^.Key) = 1);
 end;
 

+ 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);

+ 9 - 6
packages/fcl-xml/src/xmltextreader.pp

@@ -1911,12 +1911,15 @@ begin
   CheckName;
   SetString(FDocType.FName, FName.Buffer, FName.Length);
   DTDName := FNameTable.FindOrAdd(FName.Buffer, FName.Length);
-  SkipS(True);
-  StoreLocation(Locs[0]);
-  HasAtts := ParseExternalID(FDocType.FSystemID, FDocType.FPublicID, Locs[1], False);
-  if HasAtts then
-    Locs[2] := FTokenStart;
-  SkipS;
+
+  if SkipS then
+  begin
+    StoreLocation(Locs[0]);
+    HasAtts := ParseExternalID(FDocType.FSystemID, FDocType.FPublicID, Locs[1], False);
+    if HasAtts then
+      Locs[2] := FTokenStart;
+    SkipS;
+  end;
 
   if CheckForChar('[') then
   begin