Browse Source

* dom.pp, removed TDOMAttr.FOwnerElement field, storing owner element in FParentNode. This reduces memory requirements.

git-svn-id: trunk@16014 -
sergei 15 years ago
parent
commit
1d3a1e6691
1 changed files with 34 additions and 16 deletions
  1. 34 16
      packages/fcl-xml/src/dom.pp

+ 34 - 16
packages/fcl-xml/src/dom.pp

@@ -203,6 +203,7 @@ type
 
     function  GetNodeName: DOMString; virtual; abstract;
     function  GetNodeValue: DOMString; virtual;
+    function  GetParentNode: TDOMNode; virtual;
     procedure SetNodeValue(const AValue: DOMString); virtual;
     function  GetFirstChild: TDOMNode; virtual;
     function  GetLastChild: TDOMNode; virtual;
@@ -229,7 +230,7 @@ type
     property NodeName: DOMString read GetNodeName;
     property NodeValue: DOMString read GetNodeValue write SetNodeValue;
     property NodeType: Integer read GetNodeType;
-    property ParentNode: TDOMNode read FParentNode;
+    property ParentNode: TDOMNode read GetParentNode;
     property FirstChild: TDOMNode read GetFirstChild;
     property LastChild: TDOMNode read GetLastChild;
     property ChildNodes: TDOMNodeList read GetChildNodes;
@@ -563,12 +564,13 @@ type
 
   TDOMAttr = class(TDOMNode_NS)
   protected
-    FOwnerElement: TDOMElement;
     FDataType: TAttrDataType;
     function  GetNodeValue: DOMString; override;
     function GetNodeType: Integer; override;
+    function GetParentNode: TDOMNode; override;
     function GetSpecified: Boolean;
     function GetIsID: Boolean;
+    function GetOwnerElement: TDOMElement;
     procedure SetNodeValue(const AValue: DOMString); override;
   public
     destructor Destroy; override;
@@ -576,7 +578,7 @@ type
     property Name: DOMString read GetNodeName;
     property Specified: Boolean read GetSpecified;
     property Value: DOMString read GetNodeValue write SetNodeValue;
-    property OwnerElement: TDOMElement read FOwnerElement;
+    property OwnerElement: TDOMElement read GetOwnerElement;
     property IsID: Boolean read GetIsID;
     // extensions
     // TODO: this is to be replaced with DOM 3 TypeInfo
@@ -937,6 +939,11 @@ begin
   Result := '';
 end;
 
+function TDOMNode.GetParentNode: TDOMNode;
+begin
+  Result := FParentNode;
+end;
+
 procedure TDOMNode.SetNodeValue(const AValue: DOMString);
 begin
   // do nothing
@@ -1737,7 +1744,7 @@ begin
     Result := HIERARCHY_REQUEST_ERR
   else if (FNodeType = ATTRIBUTE_NODE) then
   begin
-    AttrOwner := TDOMAttr(arg).ownerElement;
+    AttrOwner := arg.FParentNode;
     if Assigned(AttrOwner) and (AttrOwner <> FOwner) then
       Result := INUSE_ATTRIBUTE_ERR;
   end;
@@ -1755,7 +1762,7 @@ begin
 
   if FNodeType = ATTRIBUTE_NODE then
   begin
-    TDOMAttr(arg).FOwnerElement := TDOMElement(FOwner);
+    arg.FParentNode := FOwner;
     Exists := Find(TDOMAttr(arg).Name, i); // optimization
   end
   else
@@ -1765,7 +1772,7 @@ begin
   begin
     Result := TDOMNode(FList.List^[i]);
     if (Result <> arg) and (FNodeType = ATTRIBUTE_NODE) then
-      TDOMAttr(Result).FOwnerElement := nil;
+      Result.FParentNode := nil;
     FList.List^[i] := arg;
     exit;
   end;
@@ -1788,7 +1795,7 @@ begin
   Result := TDOMNode(FList.List^[index]);
   FList.Delete(index);
   if FNodeType = ATTRIBUTE_NODE then
-    TDOMAttr(Result).FOwnerElement := nil;
+    TDOMAttr(Result).FParentNode := nil;
 end;
 
 procedure TDOMNamedNodeMap.RestoreDefault(const name: DOMString);
@@ -1927,8 +1934,8 @@ begin
       FList.Insert(i, arg);
   end;
   if Assigned(Result) then
-    TDOMAttr(Result).FOwnerElement := nil;
-  TDOMAttr(arg).FOwnerElement := TDOMElement(FOwner);
+    Result.FParentNode := nil;
+  arg.FParentNode := FOwner;
 end;
 
 function TAttributeMap.removeNamedItemNS(const namespaceURI,
@@ -2192,9 +2199,9 @@ begin
 
   ID := Attr.Value;
   p := FIDList.FindOrAdd(DOMPChar(ID), Length(ID), Exists);
+  if not Exists then
+    p^.Data := Attr.FParentNode;
   Result := not Exists;
-  if Result then
-    p^.Data := Attr.OwnerElement;
 end;
 
 // This shouldn't be called if document has no IDs,
@@ -2657,11 +2664,17 @@ begin
   Result := ATTRIBUTE_NODE;
 end;
 
+function TDOMAttr.GetParentNode: TDOMNode;
+begin
+  Result := nil;
+end;
+
 destructor TDOMAttr.Destroy;
 begin
-  if Assigned(FOwnerElement) and not (nfDestroying in FOwnerElement.FFlags) then
+  if Assigned(FParentNode) and not (nfDestroying in FParentNode.FFlags) then
   // TODO: This may raise NOT_FOUND_ERR in case something's really wrong
-    FOwnerElement.RemoveAttributeNode(Self);
+    TDOMElement(FParentNode).RemoveAttributeNode(Self);
+  FParentNode := nil;
   inherited Destroy;
 end;
 
@@ -2699,6 +2712,11 @@ begin
   Result := FDataType = dtID;
 end;
 
+function TDOMAttr.GetOwnerElement: TDOMElement;
+begin
+  Result := TDOMElement(FParentNode);
+end;
+
 // -------------------------------------------------------
 //   Element
 // -------------------------------------------------------
@@ -2904,7 +2922,7 @@ begin
   else
   begin
     Attr := FOwnerDocument.CreateAttribute(name);
-    Attr.FOwnerElement := Self;
+    Attr.FParentNode := Self;
     FAttributes.FList.Insert(I, Attr);
   end;
   attr.NodeValue := value;
@@ -2949,7 +2967,7 @@ begin
   begin
     TDOMNode(Attr) := FOwnerDocument.Alloc(TDOMAttr);
     Attr.Create(FOwnerDocument);
-    Attr.FOwnerElement := Self;
+    Attr.FParentNode := Self;
     Attr.FNSI.NSIndex := Word(idx);
     Include(Attr.FFlags, nfLevel2);
   end;
@@ -2997,7 +3015,7 @@ begin
   begin
     if Assigned(OldAttr.FNSI.QName) then  // safeguard
       FAttributes.RestoreDefault(OldAttr.FNSI.QName^.Key);
-    Result.FOwnerElement := nil;
+    Result.FParentNode := nil;
   end
   else
     raise EDOMNotFound.Create('Element.RemoveAttributeNode');