1 /*
2  * Copyright (c) 2008-2017 Mozilla Foundation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
23 /*
24  * THIS IS A GENERATED FILE. PLEASE DO NOT EDIT.
25  * Please edit ElementName.java instead and regenerate.
26  */
27 
28 #ifndef nsHtml5ElementName_h
29 #define nsHtml5ElementName_h
30 
31 #include "nsAtom.h"
32 #include "nsHtml5AtomTable.h"
33 #include "nsHtml5String.h"
34 #include "nsNameSpaceManager.h"
35 #include "nsIContent.h"
36 #include "nsTraceRefcnt.h"
37 #include "jArray.h"
38 #include "nsHtml5ArrayCopy.h"
39 #include "nsAHtml5TreeBuilderState.h"
40 #include "nsGkAtoms.h"
41 #include "nsHtml5ByteReadable.h"
42 #include "nsHtml5Macros.h"
43 #include "nsIContentHandle.h"
44 #include "nsHtml5Portability.h"
45 #include "nsHtml5ContentCreatorFunction.h"
46 
47 class nsHtml5StreamParser;
48 
49 class nsHtml5AttributeName;
50 class nsHtml5Tokenizer;
51 class nsHtml5TreeBuilder;
52 class nsHtml5MetaScanner;
53 class nsHtml5UTF16Buffer;
54 class nsHtml5StateSnapshot;
55 class nsHtml5Portability;
56 
57 class nsHtml5ElementName {
58  public:
59   static const int32_t GROUP_MASK = 127;
60 
61   static const int32_t NOT_INTERNED = (1 << 30);
62 
63   static const int32_t SPECIAL = (1 << 29);
64 
65   static const int32_t FOSTER_PARENTING = (1 << 28);
66 
67   static const int32_t SCOPING = (1 << 27);
68 
69   static const int32_t SCOPING_AS_SVG = (1 << 26);
70 
71   static const int32_t SCOPING_AS_MATHML = (1 << 25);
72 
73   static const int32_t HTML_INTEGRATION_POINT = (1 << 24);
74 
75   static const int32_t OPTIONAL_END_TAG = (1 << 23);
76 
77  private:
78   RefPtr<nsAtom> name;
79   RefPtr<nsAtom> camelCaseName;
80   mozilla::dom::HTMLContentCreatorFunction htmlCreator;
81   mozilla::dom::SVGContentCreatorFunction svgCreator;
82 
83  public:
84   int32_t flags;
getName()85   inline nsAtom* getName() { return name; }
86 
getCamelCaseName()87   inline nsAtom* getCamelCaseName() { return camelCaseName; }
88 
getHtmlCreator()89   inline mozilla::dom::HTMLContentCreatorFunction getHtmlCreator() {
90     return htmlCreator;
91   }
92 
getSvgCreator()93   inline mozilla::dom::SVGContentCreatorFunction getSvgCreator() {
94     return svgCreator;
95   }
96 
getFlags()97   inline int32_t getFlags() { return flags; }
98 
getGroup()99   inline int32_t getGroup() { return flags & nsHtml5ElementName::GROUP_MASK; }
100 
isInterned()101   inline bool isInterned() {
102     return !(flags & nsHtml5ElementName::NOT_INTERNED);
103   }
104 
levelOrderBinarySearch(jArray<int32_t,int32_t> data,int32_t key)105   inline static int32_t levelOrderBinarySearch(jArray<int32_t, int32_t> data,
106                                                int32_t key) {
107     int32_t n = data.length;
108     int32_t i = 0;
109     while (i < n) {
110       int32_t val = data[i];
111       if (val < key) {
112         i = 2 * i + 2;
113       } else if (val > key) {
114         i = 2 * i + 1;
115       } else {
116         return i;
117       }
118     }
119     return -1;
120   }
121 
elementNameByBuffer(char16_t * buf,int32_t length,nsHtml5AtomTable * interner)122   inline static nsHtml5ElementName* elementNameByBuffer(
123       char16_t* buf, int32_t length, nsHtml5AtomTable* interner) {
124     uint32_t hash = nsHtml5ElementName::bufToHash(buf, length);
125     jArray<int32_t, int32_t> hashes;
126     hashes = nsHtml5ElementName::ELEMENT_HASHES;
127     int32_t index = levelOrderBinarySearch(hashes, hash);
128     if (index < 0) {
129       return nullptr;
130     } else {
131       nsHtml5ElementName* elementName =
132           nsHtml5ElementName::ELEMENT_NAMES[index];
133       nsAtom* name = elementName->name;
134       if (!nsHtml5Portability::localEqualsBuffer(name, buf, length)) {
135         return nullptr;
136       }
137       return elementName;
138     }
139   }
140 
141  private:
bufToHash(char16_t * buf,int32_t length)142   inline static uint32_t bufToHash(char16_t* buf, int32_t length) {
143     uint32_t len = length;
144     uint32_t first = buf[0];
145     first <<= 19;
146     uint32_t second = 1 << 23;
147     uint32_t third = 0;
148     uint32_t fourth = 0;
149     uint32_t fifth = 0;
150     if (length >= 4) {
151       second = buf[length - 4];
152       second <<= 4;
153       third = buf[length - 3];
154       third <<= 9;
155       fourth = buf[length - 2];
156       fourth <<= 14;
157       fifth = buf[length - 1];
158       fifth <<= 24;
159     } else if (length == 3) {
160       second = buf[1];
161       second <<= 4;
162       third = buf[2];
163       third <<= 9;
164     } else if (length == 2) {
165       second = buf[1];
166       second <<= 24;
167     }
168     return len + first + second + third + fourth + fifth;
169   }
170 
171   nsHtml5ElementName(nsAtom* name, nsAtom* camelCaseName,
172                      mozilla::dom::HTMLContentCreatorFunction htmlCreator,
173                      mozilla::dom::SVGContentCreatorFunction svgCreator,
174                      int32_t flags);
175 
176  public:
177   nsHtml5ElementName();
178   ~nsHtml5ElementName();
setNameForNonInterned(nsAtom * name,bool custom)179   inline void setNameForNonInterned(nsAtom* name, bool custom) {
180     this->name = name;
181     this->camelCaseName = name;
182     if (custom) {
183       this->htmlCreator = NS_NewCustomElement;
184     } else {
185       this->htmlCreator = NS_NewHTMLUnknownElement;
186     }
187     MOZ_ASSERT(this->flags == nsHtml5ElementName::NOT_INTERNED);
188   }
189 
isCustom()190   inline bool isCustom() { return this->htmlCreator == NS_NewCustomElement; }
191 
192   static nsHtml5ElementName* ELT_ANNOTATION_XML;
193   static nsHtml5ElementName* ELT_BIG;
194   static nsHtml5ElementName* ELT_BDI;
195   static nsHtml5ElementName* ELT_BDO;
196   static nsHtml5ElementName* ELT_COL;
197   static nsHtml5ElementName* ELT_DEL;
198   static nsHtml5ElementName* ELT_DFN;
199   static nsHtml5ElementName* ELT_DIR;
200   static nsHtml5ElementName* ELT_DIV;
201   static nsHtml5ElementName* ELT_IMG;
202   static nsHtml5ElementName* ELT_INS;
203   static nsHtml5ElementName* ELT_KBD;
204   static nsHtml5ElementName* ELT_MAP;
205   static nsHtml5ElementName* ELT_NAV;
206   static nsHtml5ElementName* ELT_PRE;
207   static nsHtml5ElementName* ELT_A;
208   static nsHtml5ElementName* ELT_B;
209   static nsHtml5ElementName* ELT_RTC;
210   static nsHtml5ElementName* ELT_SUB;
211   static nsHtml5ElementName* ELT_SVG;
212   static nsHtml5ElementName* ELT_SUP;
213   static nsHtml5ElementName* ELT_SET;
214   static nsHtml5ElementName* ELT_USE;
215   static nsHtml5ElementName* ELT_VAR;
216   static nsHtml5ElementName* ELT_G;
217   static nsHtml5ElementName* ELT_WBR;
218   static nsHtml5ElementName* ELT_XMP;
219   static nsHtml5ElementName* ELT_I;
220   static nsHtml5ElementName* ELT_P;
221   static nsHtml5ElementName* ELT_Q;
222   static nsHtml5ElementName* ELT_S;
223   static nsHtml5ElementName* ELT_U;
224   static nsHtml5ElementName* ELT_H1;
225   static nsHtml5ElementName* ELT_H2;
226   static nsHtml5ElementName* ELT_H3;
227   static nsHtml5ElementName* ELT_H4;
228   static nsHtml5ElementName* ELT_H5;
229   static nsHtml5ElementName* ELT_H6;
230   static nsHtml5ElementName* ELT_AREA;
231   static nsHtml5ElementName* ELT_DATA;
232   static nsHtml5ElementName* ELT_FEFUNCA;
233   static nsHtml5ElementName* ELT_METADATA;
234   static nsHtml5ElementName* ELT_META;
235   static nsHtml5ElementName* ELT_TEXTAREA;
236   static nsHtml5ElementName* ELT_FEFUNCB;
237   static nsHtml5ElementName* ELT_RB;
238   static nsHtml5ElementName* ELT_DESC;
239   static nsHtml5ElementName* ELT_DD;
240   static nsHtml5ElementName* ELT_BGSOUND;
241   static nsHtml5ElementName* ELT_EMBED;
242   static nsHtml5ElementName* ELT_FEBLEND;
243   static nsHtml5ElementName* ELT_FEFLOOD;
244   static nsHtml5ElementName* ELT_HEAD;
245   static nsHtml5ElementName* ELT_LEGEND;
246   static nsHtml5ElementName* ELT_NOEMBED;
247   static nsHtml5ElementName* ELT_TD;
248   static nsHtml5ElementName* ELT_THEAD;
249   static nsHtml5ElementName* ELT_ASIDE;
250   static nsHtml5ElementName* ELT_ARTICLE;
251   static nsHtml5ElementName* ELT_ANIMATE;
252   static nsHtml5ElementName* ELT_BASE;
253   static nsHtml5ElementName* ELT_BLOCKQUOTE;
254   static nsHtml5ElementName* ELT_CODE;
255   static nsHtml5ElementName* ELT_CIRCLE;
256   static nsHtml5ElementName* ELT_CITE;
257   static nsHtml5ElementName* ELT_ELLIPSE;
258   static nsHtml5ElementName* ELT_FETURBULENCE;
259   static nsHtml5ElementName* ELT_FEMERGENODE;
260   static nsHtml5ElementName* ELT_FEIMAGE;
261   static nsHtml5ElementName* ELT_FEMERGE;
262   static nsHtml5ElementName* ELT_FETILE;
263   static nsHtml5ElementName* ELT_FRAME;
264   static nsHtml5ElementName* ELT_FIGURE;
265   static nsHtml5ElementName* ELT_FECOMPOSITE;
266   static nsHtml5ElementName* ELT_IMAGE;
267   static nsHtml5ElementName* ELT_IFRAME;
268   static nsHtml5ElementName* ELT_LINE;
269   static nsHtml5ElementName* ELT_MARQUEE;
270   static nsHtml5ElementName* ELT_POLYLINE;
271   static nsHtml5ElementName* ELT_PICTURE;
272   static nsHtml5ElementName* ELT_SOURCE;
273   static nsHtml5ElementName* ELT_STRIKE;
274   static nsHtml5ElementName* ELT_STYLE;
275   static nsHtml5ElementName* ELT_TABLE;
276   static nsHtml5ElementName* ELT_TITLE;
277   static nsHtml5ElementName* ELT_TIME;
278   static nsHtml5ElementName* ELT_TEMPLATE;
279   static nsHtml5ElementName* ELT_ALTGLYPHDEF;
280   static nsHtml5ElementName* ELT_GLYPHREF;
281   static nsHtml5ElementName* ELT_DIALOG;
282   static nsHtml5ElementName* ELT_FEFUNCG;
283   static nsHtml5ElementName* ELT_FEDIFFUSELIGHTING;
284   static nsHtml5ElementName* ELT_FESPECULARLIGHTING;
285   static nsHtml5ElementName* ELT_LISTING;
286   static nsHtml5ElementName* ELT_STRONG;
287   static nsHtml5ElementName* ELT_ALTGLYPH;
288   static nsHtml5ElementName* ELT_CLIPPATH;
289   static nsHtml5ElementName* ELT_MGLYPH;
290   static nsHtml5ElementName* ELT_MATH;
291   static nsHtml5ElementName* ELT_MPATH;
292   static nsHtml5ElementName* ELT_PATH;
293   static nsHtml5ElementName* ELT_TH;
294   static nsHtml5ElementName* ELT_SWITCH;
295   static nsHtml5ElementName* ELT_TEXTPATH;
296   static nsHtml5ElementName* ELT_LI;
297   static nsHtml5ElementName* ELT_MI;
298   static nsHtml5ElementName* ELT_LINK;
299   static nsHtml5ElementName* ELT_MARK;
300   static nsHtml5ElementName* ELT_MALIGNMARK;
301   static nsHtml5ElementName* ELT_MASK;
302   static nsHtml5ElementName* ELT_TRACK;
303   static nsHtml5ElementName* ELT_DL;
304   static nsHtml5ElementName* ELT_HTML;
305   static nsHtml5ElementName* ELT_OL;
306   static nsHtml5ElementName* ELT_LABEL;
307   static nsHtml5ElementName* ELT_UL;
308   static nsHtml5ElementName* ELT_SMALL;
309   static nsHtml5ElementName* ELT_SYMBOL;
310   static nsHtml5ElementName* ELT_ALTGLYPHITEM;
311   static nsHtml5ElementName* ELT_ANIMATETRANSFORM;
312   static nsHtml5ElementName* ELT_ACRONYM;
313   static nsHtml5ElementName* ELT_EM;
314   static nsHtml5ElementName* ELT_FORM;
315   static nsHtml5ElementName* ELT_MENUITEM;
316   static nsHtml5ElementName* ELT_PARAM;
317   static nsHtml5ElementName* ELT_ANIMATEMOTION;
318   static nsHtml5ElementName* ELT_BUTTON;
319   static nsHtml5ElementName* ELT_CAPTION;
320   static nsHtml5ElementName* ELT_FIGCAPTION;
321   static nsHtml5ElementName* ELT_MN;
322   static nsHtml5ElementName* ELT_KEYGEN;
323   static nsHtml5ElementName* ELT_MAIN;
324   static nsHtml5ElementName* ELT_OPTION;
325   static nsHtml5ElementName* ELT_POLYGON;
326   static nsHtml5ElementName* ELT_PATTERN;
327   static nsHtml5ElementName* ELT_SPAN;
328   static nsHtml5ElementName* ELT_SECTION;
329   static nsHtml5ElementName* ELT_TSPAN;
330   static nsHtml5ElementName* ELT_AUDIO;
331   static nsHtml5ElementName* ELT_MO;
332   static nsHtml5ElementName* ELT_VIDEO;
333   static nsHtml5ElementName* ELT_COLGROUP;
334   static nsHtml5ElementName* ELT_FEDISPLACEMENTMAP;
335   static nsHtml5ElementName* ELT_HGROUP;
336   static nsHtml5ElementName* ELT_RP;
337   static nsHtml5ElementName* ELT_OPTGROUP;
338   static nsHtml5ElementName* ELT_SAMP;
339   static nsHtml5ElementName* ELT_STOP;
340   static nsHtml5ElementName* ELT_BR;
341   static nsHtml5ElementName* ELT_ABBR;
342   static nsHtml5ElementName* ELT_ANIMATECOLOR;
343   static nsHtml5ElementName* ELT_CENTER;
344   static nsHtml5ElementName* ELT_HR;
345   static nsHtml5ElementName* ELT_FEFUNCR;
346   static nsHtml5ElementName* ELT_FECOMPONENTTRANSFER;
347   static nsHtml5ElementName* ELT_FILTER;
348   static nsHtml5ElementName* ELT_FOOTER;
349   static nsHtml5ElementName* ELT_FEGAUSSIANBLUR;
350   static nsHtml5ElementName* ELT_HEADER;
351   static nsHtml5ElementName* ELT_MARKER;
352   static nsHtml5ElementName* ELT_METER;
353   static nsHtml5ElementName* ELT_NOBR;
354   static nsHtml5ElementName* ELT_TR;
355   static nsHtml5ElementName* ELT_ADDRESS;
356   static nsHtml5ElementName* ELT_CANVAS;
357   static nsHtml5ElementName* ELT_DEFS;
358   static nsHtml5ElementName* ELT_DETAILS;
359   static nsHtml5ElementName* ELT_MS;
360   static nsHtml5ElementName* ELT_NOFRAMES;
361   static nsHtml5ElementName* ELT_PROGRESS;
362   static nsHtml5ElementName* ELT_DT;
363   static nsHtml5ElementName* ELT_APPLET;
364   static nsHtml5ElementName* ELT_BASEFONT;
365   static nsHtml5ElementName* ELT_DATALIST;
366   static nsHtml5ElementName* ELT_FOREIGNOBJECT;
367   static nsHtml5ElementName* ELT_FIELDSET;
368   static nsHtml5ElementName* ELT_FRAMESET;
369   static nsHtml5ElementName* ELT_FEOFFSET;
370   static nsHtml5ElementName* ELT_FESPOTLIGHT;
371   static nsHtml5ElementName* ELT_FEPOINTLIGHT;
372   static nsHtml5ElementName* ELT_FEDISTANTLIGHT;
373   static nsHtml5ElementName* ELT_FONT;
374   static nsHtml5ElementName* ELT_INPUT;
375   static nsHtml5ElementName* ELT_LINEARGRADIENT;
376   static nsHtml5ElementName* ELT_MTEXT;
377   static nsHtml5ElementName* ELT_NOSCRIPT;
378   static nsHtml5ElementName* ELT_RT;
379   static nsHtml5ElementName* ELT_OBJECT;
380   static nsHtml5ElementName* ELT_OUTPUT;
381   static nsHtml5ElementName* ELT_PLAINTEXT;
382   static nsHtml5ElementName* ELT_TT;
383   static nsHtml5ElementName* ELT_RECT;
384   static nsHtml5ElementName* ELT_RADIALGRADIENT;
385   static nsHtml5ElementName* ELT_SELECT;
386   static nsHtml5ElementName* ELT_SLOT;
387   static nsHtml5ElementName* ELT_SCRIPT;
388   static nsHtml5ElementName* ELT_TFOOT;
389   static nsHtml5ElementName* ELT_TEXT;
390   static nsHtml5ElementName* ELT_MENU;
391   static nsHtml5ElementName* ELT_FEDROPSHADOW;
392   static nsHtml5ElementName* ELT_VIEW;
393   static nsHtml5ElementName* ELT_FECOLORMATRIX;
394   static nsHtml5ElementName* ELT_FECONVOLVEMATRIX;
395   static nsHtml5ElementName* ELT_BODY;
396   static nsHtml5ElementName* ELT_FEMORPHOLOGY;
397   static nsHtml5ElementName* ELT_RUBY;
398   static nsHtml5ElementName* ELT_SUMMARY;
399   static nsHtml5ElementName* ELT_TBODY;
400 
401  private:
402   static nsHtml5ElementName** ELEMENT_NAMES;
403   static staticJArray<int32_t, int32_t> ELEMENT_HASHES;
404 
405  public:
406   static void initializeStatics();
407   static void releaseStatics();
408 };
409 
410 #endif
411