tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

nsElementTable.cpp (6496B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
      2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
      3 /* This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #include "nsElementTable.h"
      8 
      9 struct HTMLElement {
     10 #ifdef DEBUG
     11  nsHTMLTag mTagID;
     12 #endif
     13  bool mIsBlock;
     14  bool mIsContainer;
     15 };
     16 
     17 #ifdef DEBUG
     18 #  define ELEM(tag, block, container) {eHTMLTag_##tag, block, container},
     19 #else
     20 #  define ELEM(tag, block, container) {block, container},
     21 #endif
     22 
     23 #define ____ false  // This makes the table easier to read.
     24 
     25 // Note that the mIsBlock field disagrees with
     26 // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements for
     27 // the following elements: center, details, dialog, dir, dt, figcaption,
     28 // listing, menu, multicol, noscript, output, summary, tfoot, video.
     29 //
     30 // mrbkap thinks that the field values were pulled from the old HTML4 DTD and
     31 // then got modified in mostly random ways to make the old parser's behavior
     32 // compatible with the web. So it might make sense to change the mIsBlock
     33 // values for the abovementioned tags at some point.
     34 //
     35 static const HTMLElement gHTMLElements[] = {
     36    // clang-format off
     37  ELEM(unknown,     ____, ____)
     38  ELEM(a,           ____, true)
     39  ELEM(abbr,        ____, true)
     40  ELEM(acronym,     ____, true)
     41  ELEM(address,     true, true)
     42  ELEM(applet,      ____, true)
     43  ELEM(area,        ____, ____)
     44  ELEM(article,     true, true)
     45  ELEM(aside,       true, true)
     46  ELEM(audio,       ____, true)
     47  ELEM(b,           ____, true)
     48  ELEM(base,        ____, ____)
     49  ELEM(basefont,    ____, ____)
     50  ELEM(bdi,         ____, true)
     51  ELEM(bdo,         ____, true)
     52  ELEM(bgsound,     ____, ____)
     53  ELEM(big,         ____, true)
     54  ELEM(blockquote,  true, true)
     55  ELEM(body,        ____, true)
     56  ELEM(br,          ____, ____)
     57  ELEM(button,      ____, true)
     58  ELEM(canvas,      ____, true)
     59  ELEM(caption,     ____, true)
     60  ELEM(center,      true, true)
     61  ELEM(cite,        ____, true)
     62  ELEM(code,        ____, true)
     63  ELEM(col,         ____, ____)
     64  ELEM(colgroup,    ____, true)
     65  ELEM(data,        ____, true)
     66  ELEM(datalist,    ____, true)
     67  ELEM(dd,          ____, true)
     68  ELEM(del,         ____, true)
     69  ELEM(details,     true, true)
     70  ELEM(dfn,         ____, true)
     71  ELEM(dialog,      true, true)
     72  ELEM(dir,         true, true)
     73  ELEM(div,         true, true)
     74  ELEM(dl,          true, true)
     75  ELEM(dt,          ____, true)
     76  ELEM(em,          ____, true)
     77  ELEM(embed,       ____, ____)
     78  ELEM(fieldset,    true, true)
     79  ELEM(figcaption,  ____, true)
     80  ELEM(figure,      true, true)
     81  ELEM(font,        ____, true)
     82  ELEM(footer,      true, true)
     83  ELEM(form,        true, true)
     84  ELEM(frame,       ____, ____)
     85  ELEM(frameset,    ____, true)
     86  ELEM(h1,          true, true)
     87  ELEM(h2,          true, true)
     88  ELEM(h3,          true, true)
     89  ELEM(h4,          true, true)
     90  ELEM(h5,          true, true)
     91  ELEM(h6,          true, true)
     92  ELEM(head,        ____, true)
     93  ELEM(header,      true, true)
     94  ELEM(hgroup,      true, true)
     95  ELEM(hr,          true, ____)
     96  ELEM(html,        ____, true)
     97  ELEM(i,           ____, true)
     98  ELEM(iframe,      ____, true)
     99  ELEM(image,       ____, ____)
    100  ELEM(img,         ____, ____)
    101  ELEM(input,       ____, ____)
    102  ELEM(ins,         ____, true)
    103  ELEM(kbd,         ____, true)
    104  ELEM(keygen,      ____, ____)
    105  ELEM(label,       ____, true)
    106  ELEM(legend,      ____, true)
    107  ELEM(li,          true, true)
    108  ELEM(link,        ____, ____)
    109  ELEM(listing,     true, true)
    110  ELEM(main,        true, true)
    111  ELEM(map,         ____, true)
    112  ELEM(mark,        ____, true)
    113  ELEM(marquee,     ____, true)
    114  ELEM(menu,        true, true)
    115  ELEM(meta,        ____, ____)
    116  ELEM(meter,       ____, true)
    117  ELEM(multicol,    true, true)
    118  ELEM(nav,         true, true)
    119  ELEM(nobr,        ____, true)
    120  ELEM(noembed,     ____, true)
    121  ELEM(noframes,    ____, true)
    122  ELEM(noscript,    ____, true)
    123  ELEM(object,      ____, true)
    124  ELEM(ol,          true, true)
    125  ELEM(optgroup,    ____, true)
    126  ELEM(option,      ____, true)
    127  ELEM(output,      ____, true)
    128  ELEM(p,           true, true)
    129  ELEM(param,       ____, ____)
    130  ELEM(picture,     ____, true)
    131  ELEM(plaintext,   ____, true)
    132  ELEM(pre,         true, true)
    133  ELEM(progress,    ____, true)
    134  ELEM(q,           ____, true)
    135  ELEM(rb,          ____, true)
    136  ELEM(rp,          ____, true)
    137  ELEM(rt,          ____, true)
    138  ELEM(rtc,         ____, true)
    139  ELEM(ruby,        ____, true)
    140  ELEM(s,           ____, true)
    141  ELEM(samp,        ____, true)
    142  ELEM(script,      ____, true)
    143  ELEM(search,      true, true)
    144  ELEM(section,     true, true)
    145  ELEM(select,      ____, true)
    146  ELEM(small,       ____, true)
    147  ELEM(slot,        ____, true)
    148  ELEM(source,      ____, ____)
    149  ELEM(span,        ____, true)
    150  ELEM(strike,      ____, true)
    151  ELEM(strong,      ____, true)
    152  ELEM(style,       ____, true)
    153  ELEM(sub,         ____, true)
    154  ELEM(summary,     true, true)
    155  ELEM(sup,         ____, true)
    156  ELEM(table,       true, true)
    157  ELEM(tbody,       ____, true)
    158  ELEM(td,          ____, true)
    159  ELEM(textarea,    ____, true)
    160  ELEM(tfoot,       ____, true)
    161  ELEM(th,          ____, true)
    162  ELEM(thead,       ____, true)
    163  ELEM(template,    ____, true)
    164  ELEM(time,        ____, true)
    165  ELEM(title,       ____, true)
    166  ELEM(tr,          ____, true)
    167  ELEM(track,       ____, ____)
    168  ELEM(tt,          ____, true)
    169  ELEM(u,           ____, true)
    170  ELEM(ul,          true, true)
    171  ELEM(var,         ____, true)
    172  ELEM(video,       ____, true)
    173  ELEM(wbr,         ____, ____)
    174  ELEM(xmp,         ____, true)
    175  ELEM(text,        ____, ____)
    176  ELEM(whitespace,  ____, ____)
    177  ELEM(newline,     ____, ____)
    178  ELEM(comment,     ____, true)
    179  ELEM(entity,      ____, true)
    180  ELEM(doctypeDecl, ____, true)
    181  ELEM(markupDecl,  ____, true)
    182  ELEM(instruction, ____, true)
    183  ELEM(userdefined, ____, true)
    184    // clang-format on
    185 };
    186 
    187 #undef ELEM
    188 #undef ____
    189 
    190 bool nsHTMLElement::IsContainer(nsHTMLTag aId) {
    191  return gHTMLElements[aId].mIsContainer;
    192 }
    193 
    194 bool nsHTMLElement::IsBlock(nsHTMLTag aId) {
    195  return gHTMLElements[aId].mIsBlock;
    196 }
    197 
    198 #ifdef DEBUG
    199 void CheckElementTable() {
    200  for (nsHTMLTag t = eHTMLTag_unknown; t <= eHTMLTag_userdefined;
    201       t = nsHTMLTag(t + 1)) {
    202    MOZ_ASSERT(gHTMLElements[t].mTagID == t,
    203               "gHTMLElements entries does match tag list.");
    204  }
    205 }
    206 #endif