Browse Source

* Patch from Martok to let CreateElement create correct class (bug ID 32322)

git-svn-id: trunk@37048 -
michael 8 years ago
parent
commit
0117568c25
1 changed files with 80 additions and 6 deletions
  1. 80 6
      packages/fcl-xml/src/dom_html.pp

+ 80 - 6
packages/fcl-xml/src/dom_html.pp

@@ -665,7 +665,7 @@ type
     function HashForName(const aName: DOMString): PHashItem;
     function HashForName(const aName: DOMString): PHashItem;
 
 
     // Helper functions (not in DOM standard):
     // Helper functions (not in DOM standard):
-    function CreateElement(const tagName: DOMString): THTMLElement;
+    function CreateElement(const tagName: DOMString; UseSpecificClass : Boolean = True): THTMLElement;
     function CreateSubElement: THTMLElement;
     function CreateSubElement: THTMLElement;
     function CreateSupElement: THTMLElement;
     function CreateSupElement: THTMLElement;
     function CreateSpanElement: THTMLElement;
     function CreateSpanElement: THTMLElement;
@@ -697,8 +697,9 @@ type
     function CreateHtmlElement: THTMLHtmlElement;
     function CreateHtmlElement: THTMLHtmlElement;
     function CreateHeadElement: THTMLHeadElement;
     function CreateHeadElement: THTMLHeadElement;
     function CreateLinkElement: THTMLLinkElement;
     function CreateLinkElement: THTMLLinkElement;
-{    function CreateTitleElement: THTMLTitleElement;
+    function CreateTitleElement: THTMLTitleElement;
     function CreateMetaElement: THTMLMetaElement;
     function CreateMetaElement: THTMLMetaElement;
+{
     function CreateBaseElement: THTMLBaseElement;
     function CreateBaseElement: THTMLBaseElement;
     function CreateIsIndexElement: THTMLIsIndexElement;
     function CreateIsIndexElement: THTMLIsIndexElement;
     function CreateStyleElement: THTMLStyleElement;}
     function CreateStyleElement: THTMLStyleElement;}
@@ -1248,10 +1249,71 @@ begin
   Result := TByNameNodeList.Create(Self, ElementName);
   Result := TByNameNodeList.Create(Self, ElementName);
 end;
 end;
 
 
-function THTMLDocument.CreateElement(const tagName: DOMString): THTMLElement;
-begin
-  Result := THTMLElement.Create(Self);
-  Result.FNSI.QName := FNames.FindOrAdd(DOMPChar(tagName), Length(tagName));
+function THTMLDocument.CreateElement(const tagName: DOMString; UseSpecificClass : Boolean = True): THTMLElement;
+
+var
+  elClass: TDOMElementClass;
+begin
+  elClass:=THTMLElement;
+  if UseSpecificClass then
+    case UpperCase(tagName) of
+    'HTML'               : elClass:= THTMLHtmlElement;
+    'HEAD'               : elClass:= THTMLHeadElement;
+    'BODY'               : elClass:= THTMLBodyElement;
+    'P'                  : elClass:= THTMLParagraphElement;
+    'LINK'               : elClass:= THTMLLinkElement;
+    'TITLE'              : elClass:= THTMLTitleElement;
+    'META'               : elClass:= THTMLMetaElement;
+    'BASE'               : elClass:= THTMLBaseElement;
+    'ISINDEX'            : elClass:= THTMLIsIndexElement;
+    'STYLE'              : elClass:= THTMLStyleElement;
+    'FORM'               : elClass:= THTMLFormElement;
+    'SELECT'             : elClass:= THTMLSelectElement;
+    'OPTGROUP'           : elClass:= THTMLOptGroupElement;
+    'OPTION'             : elClass:= THTMLOptionElement;
+    'INPUT'              : elClass:= THTMLInputElement;
+    'TEXTAREA'           : elClass:= THTMLTextAreaElement;
+    'BUTTON'             : elClass:= THTMLButtonElement;
+    'LABEL'              : elClass:= THTMLLabelElement;
+    'FIELDSET'           : elClass:= THTMLFieldSetElement;
+    'LEGEND'             : elClass:= THTMLLegendElement;
+    'UL'                 : elClass:= THTMLUListElement;
+    'OL'                 : elClass:= THTMLOListElement;
+    'DL'                 : elClass:= THTMLDListElement;
+    'DIRECTORY'          : elClass:= THTMLDirectoryElement;
+    'MENU'               : elClass:= THTMLMenuElement;
+    'LI'                 : elClass:= THTMLLIElement;
+    'DIV'                : elClass:= THTMLDivElement;
+    'H1','H2','H3','H4','H5',
+    'H6','H7','H8','H9'  : elClass:= THTMLHeadingElement;
+    'QUOTE'              : elClass:= THTMLQuoteElement;
+    'PRE'                : elClass:= THTMLPreElement;
+    'BR'                 : elClass:= THTMLBRElement;
+    'BASEFONT'           : elClass:= THTMLBaseFontElement;
+    'FONT'               : elClass:= THTMLFontElement;
+    'HR'                 : elClass:= THTMLHRElement;
+    'MOD'                : elClass:= THTMLModElement;
+    'A'                  : elClass:= THTMLAnchorElement;
+    'IMG'                : elClass:= THTMLImageElement;
+    'OBJECT'             : elClass:= THTMLObjectElement;
+    'PARAM'              : elClass:= THTMLParamElement;
+    'APPLET'             : elClass:= THTMLAppletElement;
+    'MAP'                : elClass:= THTMLMapElement;
+    'AREA'               : elClass:= THTMLAreaElement;
+    'SCRIPT'             : elClass:= THTMLScriptElement;
+    'TABLE'              : elClass:= THTMLTableElement;
+    'CAPTION'            : elClass:= THTMLTableCaptionElement;
+    //'TABLECOL'           : elClass:= THTMLTableColElement;
+    'THEAD','TBODY',
+    'TFOOT'              : elClass:= THTMLTableSectionElement;
+    'TR'                 : elClass:= THTMLTableRowElement;
+    'TD','TH'            : elClass:= THTMLTableCellElement;
+    'FRAMESET'           : elClass:= THTMLFrameSetElement;
+    'FRAME'              : elClass:= THTMLFrameElement;
+    'IFRAME'             : elClass:= THTMLIFrameElement;
+    end;
+  Result := THTMLElement(elClass.Create(Self));
+  Result.FNSI.QName:=HashForName(tagName);
 end;
 end;
 
 
 function THTMLDocument.HashForName(const aName: DOMString): PHashItem;
 function THTMLDocument.HashForName(const aName: DOMString): PHashItem;
@@ -1306,6 +1368,18 @@ begin
   Result.FNSI.QName := HashForName('a');
   Result.FNSI.QName := HashForName('a');
 end;
 end;
 
 
+function THTMLDocument.CreateTitleElement: THTMLTitleElement;
+begin
+  Result := THTMLTitleElement.Create(Self);
+  Result.FNSI.QName := HashForName('title');
+end;
+
+function THTMLDocument.CreateMetaElement: THTMLMetaElement;
+begin
+  Result := THTMLMetaElement.Create(Self);
+  Result.FNSI.QName := HashForName('meta');
+end;
+
 function THTMLDocument.CreateBodyElement: THTMLBodyElement;
 function THTMLDocument.CreateBodyElement: THTMLBodyElement;
 begin
 begin
   Result := THTMLBodyElement.Create(Self);
   Result := THTMLBodyElement.Create(Self);