AttributeNames.cpp 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. // NOTE: Special cases for attributes with dashes in them.
  26. accept_charset = "accept-charset"_fly_string;
  27. http_equiv = "http-equiv"_fly_string;
  28. s_initialized = true;
  29. }
  30. }
  31. // https://html.spec.whatwg.org/#boolean-attribute
  32. bool is_boolean_attribute(FlyString const& attribute)
  33. {
  34. // NOTE: For web compatibility, this matches the list of attributes which Chromium considers to be booleans,
  35. // excluding attributes that are only used by Chromium itself:
  36. // https://source.chromium.org/chromium/chromium/src/+/460b7c003cf89fc9493e721701906f19e5f6a387:chrome/test/chromedriver/element_commands.cc;l=48-94
  37. return attribute.equals_ignoring_ascii_case(AttributeNames::allowfullscreen)
  38. || attribute.equals_ignoring_ascii_case(AttributeNames::async)
  39. || attribute.equals_ignoring_ascii_case(AttributeNames::autofocus)
  40. || attribute.equals_ignoring_ascii_case(AttributeNames::autoplay)
  41. || attribute.equals_ignoring_ascii_case(AttributeNames::checked)
  42. || attribute.equals_ignoring_ascii_case(AttributeNames::compact)
  43. || attribute.equals_ignoring_ascii_case(AttributeNames::controls)
  44. || attribute.equals_ignoring_ascii_case(AttributeNames::declare)
  45. || attribute.equals_ignoring_ascii_case(AttributeNames::default_)
  46. || attribute.equals_ignoring_ascii_case(AttributeNames::defaultchecked)
  47. || attribute.equals_ignoring_ascii_case(AttributeNames::defaultselected)
  48. || attribute.equals_ignoring_ascii_case(AttributeNames::defer)
  49. || attribute.equals_ignoring_ascii_case(AttributeNames::disabled)
  50. || attribute.equals_ignoring_ascii_case(AttributeNames::ended)
  51. || attribute.equals_ignoring_ascii_case(AttributeNames::formnovalidate)
  52. || attribute.equals_ignoring_ascii_case(AttributeNames::hidden)
  53. || attribute.equals_ignoring_ascii_case(AttributeNames::indeterminate)
  54. || attribute.equals_ignoring_ascii_case(AttributeNames::iscontenteditable)
  55. || attribute.equals_ignoring_ascii_case(AttributeNames::ismap)
  56. || attribute.equals_ignoring_ascii_case(AttributeNames::itemscope)
  57. || attribute.equals_ignoring_ascii_case(AttributeNames::loop)
  58. || attribute.equals_ignoring_ascii_case(AttributeNames::multiple)
  59. || attribute.equals_ignoring_ascii_case(AttributeNames::muted)
  60. || attribute.equals_ignoring_ascii_case(AttributeNames::nohref)
  61. || attribute.equals_ignoring_ascii_case(AttributeNames::nomodule)
  62. || attribute.equals_ignoring_ascii_case(AttributeNames::noresize)
  63. || attribute.equals_ignoring_ascii_case(AttributeNames::noshade)
  64. || attribute.equals_ignoring_ascii_case(AttributeNames::novalidate)
  65. || attribute.equals_ignoring_ascii_case(AttributeNames::nowrap)
  66. || attribute.equals_ignoring_ascii_case(AttributeNames::open)
  67. || attribute.equals_ignoring_ascii_case(AttributeNames::paused)
  68. || attribute.equals_ignoring_ascii_case(AttributeNames::playsinline)
  69. || attribute.equals_ignoring_ascii_case(AttributeNames::readonly)
  70. || attribute.equals_ignoring_ascii_case(AttributeNames::required)
  71. || attribute.equals_ignoring_ascii_case(AttributeNames::reversed)
  72. || attribute.equals_ignoring_ascii_case(AttributeNames::seeking)
  73. || attribute.equals_ignoring_ascii_case(AttributeNames::selected)
  74. || attribute.equals_ignoring_ascii_case(AttributeNames::truespeed)
  75. || attribute.equals_ignoring_ascii_case(AttributeNames::willvalidate);
  76. }
  77. }