summaryrefslogtreecommitdiff
path: root/packages/fcl-xml
diff options
context:
space:
mode:
authorsergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-09-19 16:46:35 +0000
committersergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2010-09-19 16:46:35 +0000
commit0f940cf53f268d3802c845af2e8c9dc065beb91b (patch)
tree0264d9458f517d3abb99d6a9d079d59e1a571106 /packages/fcl-xml
parent3017a16afb8f4e492f786d1bade4583f5be138b3 (diff)
downloadfpc-0f940cf53f268d3802c845af2e8c9dc065beb91b.tar.gz
* dom.pp, removed TDOMAttr.FOwnerElement field, storing owner element in FParentNode. This reduces memory requirements.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@16014 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-xml')
-rw-r--r--packages/fcl-xml/src/dom.pp50
1 files changed, 34 insertions, 16 deletions
diff --git a/packages/fcl-xml/src/dom.pp b/packages/fcl-xml/src/dom.pp
index 25e8b0dbf2..b9b42b6d63 100644
--- a/packages/fcl-xml/src/dom.pp
+++ b/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');