mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-20 18:09:27 +02:00
* dom.pp, moved default attribute handling code from TDOMNamedNodeMap to TAttributeMap.
git-svn-id: trunk@16060 -
This commit is contained in:
parent
6863b0ab46
commit
03b06dc7a1
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user