diff options
| author | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-09-19 16:46:35 +0000 |
|---|---|---|
| committer | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2010-09-19 16:46:35 +0000 |
| commit | 0f940cf53f268d3802c845af2e8c9dc065beb91b (patch) | |
| tree | 0264d9458f517d3abb99d6a9d079d59e1a571106 /packages/fcl-xml | |
| parent | 3017a16afb8f4e492f786d1bade4583f5be138b3 (diff) | |
| download | fpc-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.pp | 50 |
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'); |
