* 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 GetLength: LongWord;
function Find(const name: DOMString; out Index: LongWord): Boolean;
function Delete(index: LongWord): TDOMNode;
procedure RestoreDefault(const name: DOMString);
function Delete(index: LongWord): TDOMNode; virtual;
function InternalRemove(const name: DOMString): TDOMNode;
function ValidateInsert(arg: TDOMNode): Integer;
public
@ -834,6 +833,9 @@ type
function FindNS(nsIndex: Integer; const aLocalName: DOMString;
out Index: LongWord): Boolean;
function InternalRemoveNS(const nsURI, aLocalName: DOMString): TDOMNode;
procedure RestoreDefault(const name: DOMString);
protected
function Delete(index: LongWord): TDOMNode; override;
public
function getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode; override;
function setNamedItemNS(arg: TDOMNode): TDOMNode; override;
@ -1794,40 +1796,16 @@ function TDOMNamedNodeMap.Delete(index: LongWord): TDOMNode;
begin
Result := TDOMNode(FList.List^[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;
function TDOMNamedNodeMap.InternalRemove(const name: DOMString): TDOMNode;
var
i: Cardinal;
begin
Result := nil;
if Find(name, i) then
begin
Result := Delete(I);
RestoreDefault(name);
end;
Result := Delete(I)
else
Result := nil;
end;
function TDOMNamedNodeMap.RemoveNamedItem(const name: DOMString): TDOMNode;
@ -1849,6 +1827,34 @@ end;
{ 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.
// This routine is not called while parsing, so parsing speed is not lowered.
function TAttributeMap.FindNS(nsIndex: Integer; const aLocalName: DOMString;
@ -1886,10 +1892,7 @@ begin
Result := nil;
nsIndex := FOwner.FOwnerDocument.IndexOfNS(nsURI);
if (nsIndex >= 0) and FindNS(nsIndex, aLocalName, i) then
begin
Result := Delete(I);
RestoreDefault(TDOMAttr(Result).FNSI.QName^.Key);
end;
end;
function TAttributeMap.getNamedItemNS(const namespaceURI, localName: DOMString): TDOMNode;
@ -3008,17 +3011,21 @@ end;
function TDOMElement.RemoveAttributeNode(OldAttr: TDOMAttr): TDOMAttr;
var
Index: Integer;
begin
Changing;
Result:=OldAttr;
if Assigned(FAttributes) and (FAttributes.FList.Remove(OldAttr) > -1) then
Result := OldAttr;
if Assigned(FAttributes) then
begin
if Assigned(OldAttr.FNSI.QName) then // safeguard
FAttributes.RestoreDefault(OldAttr.FNSI.QName^.Key);
Result.FParentNode := nil;
end
else
raise EDOMNotFound.Create('Element.RemoveAttributeNode');
Index := FAttributes.FList.IndexOf(OldAttr);
if Index > -1 then
begin
FAttributes.Delete(Index);
Exit;
end;
end;
raise EDOMNotFound.Create('Element.RemoveAttributeNode');
end;
function TDOMElement.GetElementsByTagName(const name: DOMString): TDOMNodeList;