* dom.pp, moved default attribute handling code from TDOMNamedNodeMap to TAttributeMap.

git-svn-id: trunk@16060 -
This commit is contained in:
sergei 2010-09-28 22:46:05 +00:00
parent 6863b0ab46
commit 03b06dc7a1

View File

@ -361,8 +361,7 @@ type
function GetItem(index: LongWord): TDOMNode; function GetItem(index: LongWord): TDOMNode;
function GetLength: LongWord; function GetLength: LongWord;
function Find(const name: DOMString; out Index: LongWord): Boolean; function Find(const name: DOMString; out Index: LongWord): Boolean;
function Delete(index: LongWord): TDOMNode; function Delete(index: LongWord): TDOMNode; virtual;
procedure RestoreDefault(const name: DOMString);
function InternalRemove(const name: DOMString): TDOMNode; function InternalRemove(const name: DOMString): TDOMNode;
function ValidateInsert(arg: TDOMNode): Integer; function ValidateInsert(arg: TDOMNode): Integer;
public public
@ -834,6 +833,9 @@ type
function FindNS(nsIndex: Integer; const aLocalName: DOMString; function FindNS(nsIndex: Integer; const aLocalName: DOMString;
out Index: LongWord): Boolean; out Index: LongWord): Boolean;
function InternalRemoveNS(const nsURI, aLocalName: DOMString): TDOMNode; function InternalRemoveNS(const nsURI, aLocalName: DOMString): TDOMNode;
procedure RestoreDefault(const name: DOMString);
protected
function Delete(index: LongWord): TDOMNode; override;
public public
function getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode; override; function getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode; override;
function setNamedItemNS(arg: TDOMNode): TDOMNode; override; function setNamedItemNS(arg: TDOMNode): TDOMNode; override;
@ -1794,40 +1796,16 @@ function TDOMNamedNodeMap.Delete(index: LongWord): TDOMNode;
begin begin
Result := TDOMNode(FList.List^[index]); Result := TDOMNode(FList.List^[index]);
FList.Delete(index); FList.Delete(index);
if FNodeType = ATTRIBUTE_NODE then
TDOMAttr(Result).FParentNode := nil;
end;
procedure TDOMNamedNodeMap.RestoreDefault(const name: DOMString);
var
eldef: TDOMElement;
attrdef: TDOMAttr;
begin
if FNodeType = ATTRIBUTE_NODE then
begin
if not Assigned(TDOMElement(FOwner).FNSI.QName) then // safeguard
Exit;
eldef := TDOMElement(TDOMElement(FOwner).FNSI.QName^.Data);
if Assigned(eldef) then
begin
// TODO: can be avoided by linking attributes directly to their defs
attrdef := eldef.GetAttributeNode(name);
if Assigned(attrdef) and (TDOMAttrDef(attrdef).FDefault in [adDefault, adFixed]) then
TDOMElement(FOwner).RestoreDefaultAttr(attrdef);
end;
end;
end; end;
function TDOMNamedNodeMap.InternalRemove(const name: DOMString): TDOMNode; function TDOMNamedNodeMap.InternalRemove(const name: DOMString): TDOMNode;
var var
i: Cardinal; i: Cardinal;
begin begin
Result := nil;
if Find(name, i) then if Find(name, i) then
begin Result := Delete(I)
Result := Delete(I); else
RestoreDefault(name); Result := nil;
end;
end; end;
function TDOMNamedNodeMap.RemoveNamedItem(const name: DOMString): TDOMNode; function TDOMNamedNodeMap.RemoveNamedItem(const name: DOMString): TDOMNode;
@ -1849,6 +1827,34 @@ end;
{ TAttributeMap } { TAttributeMap }
function TAttributeMap.Delete(index: LongWord): TDOMNode;
begin
Result := inherited Delete(index);
if Assigned(Result) then
begin
Result.FParentNode := nil;
if Assigned(TDOMAttr(Result).FNSI.QName) then
RestoreDefault(TDOMAttr(Result).FNSI.QName^.Key);
end;
end;
procedure TAttributeMap.RestoreDefault(const name: DOMString);
var
eldef: TDOMElement;
attrdef: TDOMAttr;
begin
if not Assigned(TDOMElement(FOwner).FNSI.QName) then // safeguard
Exit;
eldef := TDOMElement(TDOMElement(FOwner).FNSI.QName^.Data);
if Assigned(eldef) then
begin
// TODO: can be avoided by linking attributes directly to their defs
attrdef := eldef.GetAttributeNode(name);
if Assigned(attrdef) and (TDOMAttrDef(attrdef).FDefault in [adDefault, adFixed]) then
TDOMElement(FOwner).RestoreDefaultAttr(attrdef);
end;
end;
// Since list is kept sorted by nodeName, we must use linear search here. // Since list is kept sorted by nodeName, we must use linear search here.
// This routine is not called while parsing, so parsing speed is not lowered. // This routine is not called while parsing, so parsing speed is not lowered.
function TAttributeMap.FindNS(nsIndex: Integer; const aLocalName: DOMString; function TAttributeMap.FindNS(nsIndex: Integer; const aLocalName: DOMString;
@ -1886,10 +1892,7 @@ begin
Result := nil; Result := nil;
nsIndex := FOwner.FOwnerDocument.IndexOfNS(nsURI); nsIndex := FOwner.FOwnerDocument.IndexOfNS(nsURI);
if (nsIndex >= 0) and FindNS(nsIndex, aLocalName, i) then if (nsIndex >= 0) and FindNS(nsIndex, aLocalName, i) then
begin
Result := Delete(I); Result := Delete(I);
RestoreDefault(TDOMAttr(Result).FNSI.QName^.Key);
end;
end; end;
function TAttributeMap.getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode; function TAttributeMap.getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode;
@ -3008,17 +3011,21 @@ end;
function TDOMElement.RemoveAttributeNode(OldAttr: TDOMAttr): TDOMAttr; function TDOMElement.RemoveAttributeNode(OldAttr: TDOMAttr): TDOMAttr;
var
Index: Integer;
begin begin
Changing; Changing;
Result:=OldAttr; Result := OldAttr;
if Assigned(FAttributes) and (FAttributes.FList.Remove(OldAttr) > -1) then if Assigned(FAttributes) then
begin begin
if Assigned(OldAttr.FNSI.QName) then // safeguard Index := FAttributes.FList.IndexOf(OldAttr);
FAttributes.RestoreDefault(OldAttr.FNSI.QName^.Key); if Index > -1 then
Result.FParentNode := nil; begin
end FAttributes.Delete(Index);
else Exit;
raise EDOMNotFound.Create('Element.RemoveAttributeNode'); end;
end;
raise EDOMNotFound.Create('Element.RemoveAttributeNode');
end; end;
function TDOMElement.GetElementsByTagName(const name: DOMString): TDOMNodeList; function TDOMElement.GetElementsByTagName(const name: DOMString): TDOMNodeList;