Переглянути джерело

* TDOMElement.RemoveAttributeNode() was not resetting OwnerElement property of the removed attribute to nil, fixed and added a test case.

git-svn-id: trunk@14351 -
sergei 15 роки тому
батько
коміт
255c14fc4d
2 змінених файлів з 20 додано та 0 видалено
  1. 1 0
      packages/fcl-xml/src/dom.pp
  2. 19 0
      packages/fcl-xml/tests/extras.pp

+ 1 - 0
packages/fcl-xml/src/dom.pp

@@ -2961,6 +2961,7 @@ begin
     Result := OldAttr;
     if Assigned(OldAttr.FNSI.QName) then  // safeguard
       FAttributes.RestoreDefault(OldAttr.FNSI.QName^.Key);
+    Result.FOwnerElement := nil;
   end
   else
     raise EDOMNotFound.Create('Element.RemoveAttributeNode');

+ 19 - 0
packages/fcl-xml/tests/extras.pp

@@ -29,6 +29,7 @@ type
     procedure attr_ownership02;
     procedure attr_ownership03;
     procedure attr_ownership04;
+    procedure attr_ownership05;
     procedure nsFixup1;
     procedure nsFixup2;
     procedure nsFixup3;
@@ -116,6 +117,24 @@ begin
   AssertEquals('ownerElement2', el, attr2.OwnerElement);
 end;
 
+
+// verify that Element.removeAttributeNode() resets ownerElement
+// of the attribute being removed
+procedure TDOMTestExtra.attr_ownership05;
+var
+  doc: TDOMDocument;
+  el: TDOMElement;
+  attr: TDOMAttr;
+begin
+  LoadStringData(doc, '<doc/>');
+  el := doc.CreateElement('element1');
+  attr := doc.CreateAttributeNS('http://www.freepascal.org', 'fpc:newAttr');
+  el.SetAttributeNodeNS(attr);
+  AssertEquals('ownerElement_before', el, attr.OwnerElement);
+  el.RemoveAttributeNode(attr);
+  AssertNull('ownerElement_after', attr.ownerElement);
+end;
+
 const
   nsURI1 = 'http://www.example.com/ns1';
   nsURI2 = 'http://www.example.com/ns2';