AttributeNames.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <andreas@ladybird.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/HTML/AttributeNames.h>
  7. namespace Web::HTML {
  8. namespace AttributeNames {
  9. #define __ENUMERATE_HTML_ATTRIBUTE(name) FlyString name;
  10. ENUMERATE_HTML_ATTRIBUTES
  11. #undef __ENUMERATE_HTML_ATTRIBUTE
  12. void initialize_strings()
  13. {
  14. static bool s_initialized = false;
  15. VERIFY(!s_initialized);
  16. #define __ENUMERATE_HTML_ATTRIBUTE(name) \
  17. name = #name##_fly_string;
  18. ENUMERATE_HTML_ATTRIBUTES
  19. #undef __ENUMERATE_HTML_ATTRIBUTE
  20. // NOTE: Special cases for C++ keywords.
  21. class_ = "class"_fly_string;
  22. for_ = "for"_fly_string;
  23. default_ = "default"_fly_string;
  24. char_ = "char"_fly_string;
  25. switch_ = "switch"_fly_string;
  26. // NOTE: Special cases for attributes with dashes in them.
  27. accept_charset = "accept-charset"_fly_string;
  28. http_equiv = "http-equiv"_fly_string;
  29. s_initialized = true;
  30. }
  31. }
  32. // https://html.spec.whatwg.org/#boolean-attribute
  33. bool is_boolean_attribute(FlyString const& attribute)
  34. {
  35. // NOTE: For web compatibility, this matches the list of attributes which Chromium considers to be booleans,
  36. // excluding attributes that are only used by Chromium itself:
  37. // https://source.chromium.org/chromium/chromium/src/+/460b7c003cf89fc9493e721701906f19e5f6a387:chrome/test/chromedriver/element_commands.cc;l=48-94
  38. return attribute.equals_ignoring_ascii_case(AttributeNames::allowfullscreen)
  39. || attribute.equals_ignoring_ascii_case(AttributeNames::async)
  40. || attribute.equals_ignoring_ascii_case(AttributeNames::autofocus)
  41. || attribute.equals_ignoring_ascii_case(AttributeNames::autoplay)
  42. || attribute.equals_ignoring_ascii_case(AttributeNames::checked)
  43. || attribute.equals_ignoring_ascii_case(AttributeNames::compact)
  44. || attribute.equals_ignoring_ascii_case(AttributeNames::controls)
  45. || attribute.equals_ignoring_ascii_case(AttributeNames::declare)
  46. || attribute.equals_ignoring_ascii_case(AttributeNames::default_)
  47. || attribute.equals_ignoring_ascii_case(AttributeNames::defaultchecked)
  48. || attribute.equals_ignoring_ascii_case(AttributeNames::defaultselected)
  49. || attribute.equals_ignoring_ascii_case(AttributeNames::defer)
  50. || attribute.equals_ignoring_ascii_case(AttributeNames::disabled)
  51. || attribute.equals_ignoring_ascii_case(AttributeNames::ended)
  52. || attribute.equals_ignoring_ascii_case(AttributeNames::formnovalidate)
  53. || attribute.equals_ignoring_ascii_case(AttributeNames::hidden)
  54. || attribute.equals_ignoring_ascii_case(AttributeNames::indeterminate)
  55. || attribute.equals_ignoring_ascii_case(AttributeNames::iscontenteditable)
  56. || attribute.equals_ignoring_ascii_case(AttributeNames::ismap)
  57. || attribute.equals_ignoring_ascii_case(AttributeNames::itemscope)
  58. || attribute.equals_ignoring_ascii_case(AttributeNames::loop)
  59. || attribute.equals_ignoring_ascii_case(AttributeNames::multiple)
  60. || attribute.equals_ignoring_ascii_case(AttributeNames::muted)
  61. || attribute.equals_ignoring_ascii_case(AttributeNames::nohref)
  62. || attribute.equals_ignoring_ascii_case(AttributeNames::nomodule)
  63. || attribute.equals_ignoring_ascii_case(AttributeNames::noresize)
  64. || attribute.equals_ignoring_ascii_case(AttributeNames::noshade)
  65. || attribute.equals_ignoring_ascii_case(AttributeNames::novalidate)
  66. || attribute.equals_ignoring_ascii_case(AttributeNames::nowrap)
  67. || attribute.equals_ignoring_ascii_case(AttributeNames::open)
  68. || attribute.equals_ignoring_ascii_case(AttributeNames::paused)
  69. || attribute.equals_ignoring_ascii_case(AttributeNames::playsinline)
  70. || attribute.equals_ignoring_ascii_case(AttributeNames::readonly)
  71. || attribute.equals_ignoring_ascii_case(AttributeNames::required)
  72. || attribute.equals_ignoring_ascii_case(AttributeNames::reversed)
  73. || attribute.equals_ignoring_ascii_case(AttributeNames::seeking)
  74. || attribute.equals_ignoring_ascii_case(AttributeNames::selected)
  75. || attribute.equals_ignoring_ascii_case(AttributeNames::switch_)
  76. || attribute.equals_ignoring_ascii_case(AttributeNames::truespeed)
  77. || attribute.equals_ignoring_ascii_case(AttributeNames::willvalidate);
  78. }
  79. }