IdentifierStyleValue.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  4. * Copyright (c) 2021-2023, Sam Atkins <atkinssj@serenityos.org>
  5. * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause
  8. */
  9. #include "IdentifierStyleValue.h"
  10. #include <LibGfx/Palette.h>
  11. #include <LibWeb/CSS/SystemColor.h>
  12. #include <LibWeb/DOM/Document.h>
  13. #include <LibWeb/Layout/Node.h>
  14. namespace Web::CSS {
  15. String IdentifierStyleValue::to_string() const
  16. {
  17. return MUST(String::from_utf8(CSS::string_from_value_id(m_id)));
  18. }
  19. bool IdentifierStyleValue::is_color(ValueID value_id)
  20. {
  21. switch (value_id) {
  22. case ValueID::Accentcolor:
  23. case ValueID::Accentcolortext:
  24. case ValueID::Activeborder:
  25. case ValueID::Activecaption:
  26. case ValueID::Activetext:
  27. case ValueID::Appworkspace:
  28. case ValueID::Background:
  29. case ValueID::Buttonborder:
  30. case ValueID::Buttonface:
  31. case ValueID::Buttonhighlight:
  32. case ValueID::Buttonshadow:
  33. case ValueID::Buttontext:
  34. case ValueID::Canvas:
  35. case ValueID::Canvastext:
  36. case ValueID::Captiontext:
  37. case ValueID::Currentcolor:
  38. case ValueID::Field:
  39. case ValueID::Fieldtext:
  40. case ValueID::Graytext:
  41. case ValueID::Highlight:
  42. case ValueID::Highlighttext:
  43. case ValueID::Inactiveborder:
  44. case ValueID::Inactivecaption:
  45. case ValueID::Inactivecaptiontext:
  46. case ValueID::Infobackground:
  47. case ValueID::Infotext:
  48. case ValueID::LibwebLink:
  49. case ValueID::LibwebPaletteActiveLink:
  50. case ValueID::LibwebPaletteActiveWindowBorder1:
  51. case ValueID::LibwebPaletteActiveWindowBorder2:
  52. case ValueID::LibwebPaletteActiveWindowTitle:
  53. case ValueID::LibwebPaletteBase:
  54. case ValueID::LibwebPaletteBaseText:
  55. case ValueID::LibwebPaletteButton:
  56. case ValueID::LibwebPaletteButtonText:
  57. case ValueID::LibwebPaletteDesktopBackground:
  58. case ValueID::LibwebPaletteFocusOutline:
  59. case ValueID::LibwebPaletteHighlightWindowBorder1:
  60. case ValueID::LibwebPaletteHighlightWindowBorder2:
  61. case ValueID::LibwebPaletteHighlightWindowTitle:
  62. case ValueID::LibwebPaletteHoverHighlight:
  63. case ValueID::LibwebPaletteInactiveSelection:
  64. case ValueID::LibwebPaletteInactiveSelectionText:
  65. case ValueID::LibwebPaletteInactiveWindowBorder1:
  66. case ValueID::LibwebPaletteInactiveWindowBorder2:
  67. case ValueID::LibwebPaletteInactiveWindowTitle:
  68. case ValueID::LibwebPaletteLink:
  69. case ValueID::LibwebPaletteMenuBase:
  70. case ValueID::LibwebPaletteMenuBaseText:
  71. case ValueID::LibwebPaletteMenuSelection:
  72. case ValueID::LibwebPaletteMenuSelectionText:
  73. case ValueID::LibwebPaletteMenuStripe:
  74. case ValueID::LibwebPaletteMovingWindowBorder1:
  75. case ValueID::LibwebPaletteMovingWindowBorder2:
  76. case ValueID::LibwebPaletteMovingWindowTitle:
  77. case ValueID::LibwebPaletteRubberBandBorder:
  78. case ValueID::LibwebPaletteRubberBandFill:
  79. case ValueID::LibwebPaletteRuler:
  80. case ValueID::LibwebPaletteRulerActiveText:
  81. case ValueID::LibwebPaletteRulerBorder:
  82. case ValueID::LibwebPaletteRulerInactiveText:
  83. case ValueID::LibwebPaletteSelection:
  84. case ValueID::LibwebPaletteSelectionText:
  85. case ValueID::LibwebPaletteSyntaxComment:
  86. case ValueID::LibwebPaletteSyntaxControlKeyword:
  87. case ValueID::LibwebPaletteSyntaxIdentifier:
  88. case ValueID::LibwebPaletteSyntaxKeyword:
  89. case ValueID::LibwebPaletteSyntaxNumber:
  90. case ValueID::LibwebPaletteSyntaxOperator:
  91. case ValueID::LibwebPaletteSyntaxPreprocessorStatement:
  92. case ValueID::LibwebPaletteSyntaxPreprocessorValue:
  93. case ValueID::LibwebPaletteSyntaxPunctuation:
  94. case ValueID::LibwebPaletteSyntaxString:
  95. case ValueID::LibwebPaletteSyntaxType:
  96. case ValueID::LibwebPaletteTextCursor:
  97. case ValueID::LibwebPaletteThreedHighlight:
  98. case ValueID::LibwebPaletteThreedShadow1:
  99. case ValueID::LibwebPaletteThreedShadow2:
  100. case ValueID::LibwebPaletteVisitedLink:
  101. case ValueID::LibwebPaletteWindow:
  102. case ValueID::LibwebPaletteWindowText:
  103. case ValueID::Linktext:
  104. case ValueID::Mark:
  105. case ValueID::Marktext:
  106. case ValueID::Menu:
  107. case ValueID::Menutext:
  108. case ValueID::Scrollbar:
  109. case ValueID::Selecteditem:
  110. case ValueID::Selecteditemtext:
  111. case ValueID::Threeddarkshadow:
  112. case ValueID::Threedface:
  113. case ValueID::Threedhighlight:
  114. case ValueID::Threedlightshadow:
  115. case ValueID::Threedshadow:
  116. case ValueID::Visitedtext:
  117. case ValueID::Window:
  118. case ValueID::Windowframe:
  119. case ValueID::Windowtext:
  120. return true;
  121. default:
  122. return false;
  123. }
  124. }
  125. bool IdentifierStyleValue::has_color() const
  126. {
  127. return is_color(m_id);
  128. }
  129. Color IdentifierStyleValue::to_color(Optional<Layout::NodeWithStyle const&> node) const
  130. {
  131. if (id() == CSS::ValueID::Currentcolor) {
  132. if (!node.has_value() || !node->has_style())
  133. return Color::Black;
  134. return node->computed_values().color();
  135. }
  136. // First, handle <system-color>s, since they don't require a node.
  137. // https://www.w3.org/TR/css-color-4/#css-system-colors
  138. // https://www.w3.org/TR/css-color-4/#deprecated-system-colors
  139. switch (id()) {
  140. case ValueID::Accentcolor:
  141. return SystemColor::accent_color();
  142. case ValueID::Accentcolortext:
  143. return SystemColor::accent_color_text();
  144. case ValueID::Activetext:
  145. return SystemColor::active_text();
  146. case ValueID::Buttonborder:
  147. case ValueID::Activeborder:
  148. case ValueID::Inactiveborder:
  149. case ValueID::Threeddarkshadow:
  150. case ValueID::Threedhighlight:
  151. case ValueID::Threedlightshadow:
  152. case ValueID::Threedshadow:
  153. case ValueID::Windowframe:
  154. return SystemColor::button_border();
  155. case ValueID::Buttonface:
  156. case ValueID::Buttonhighlight:
  157. case ValueID::Buttonshadow:
  158. case ValueID::Threedface:
  159. return SystemColor::button_face();
  160. case ValueID::Buttontext:
  161. return SystemColor::button_text();
  162. case ValueID::Canvas:
  163. case ValueID::Appworkspace:
  164. case ValueID::Background:
  165. case ValueID::Inactivecaption:
  166. case ValueID::Infobackground:
  167. case ValueID::Menu:
  168. case ValueID::Scrollbar:
  169. case ValueID::Window:
  170. return SystemColor::canvas();
  171. case ValueID::Canvastext:
  172. case ValueID::Activecaption:
  173. case ValueID::Captiontext:
  174. case ValueID::Infotext:
  175. case ValueID::Menutext:
  176. case ValueID::Windowtext:
  177. return SystemColor::canvas_text();
  178. case ValueID::Field:
  179. return SystemColor::field();
  180. case ValueID::Fieldtext:
  181. return SystemColor::field_text();
  182. case ValueID::Graytext:
  183. case ValueID::Inactivecaptiontext:
  184. return SystemColor::gray_text();
  185. case ValueID::Highlight:
  186. return SystemColor::highlight();
  187. case ValueID::Highlighttext:
  188. return SystemColor::highlight_text();
  189. case ValueID::Linktext:
  190. return SystemColor::link_text();
  191. case ValueID::Mark:
  192. return SystemColor::mark();
  193. case ValueID::Marktext:
  194. return SystemColor::mark_text();
  195. case ValueID::Selecteditem:
  196. return SystemColor::selected_item();
  197. case ValueID::Selecteditemtext:
  198. return SystemColor::selected_item_text();
  199. case ValueID::Visitedtext:
  200. return SystemColor::visited_text();
  201. default:
  202. break;
  203. }
  204. if (!node.has_value()) {
  205. // FIXME: Can't resolve palette colors without layout node.
  206. return Color::Black;
  207. }
  208. auto& document = node->document();
  209. if (id() == CSS::ValueID::LibwebLink)
  210. return document.link_color();
  211. if (!document.page())
  212. return {};
  213. auto palette = document.page()->palette();
  214. switch (id()) {
  215. case CSS::ValueID::LibwebPaletteDesktopBackground:
  216. return palette.color(ColorRole::DesktopBackground);
  217. case CSS::ValueID::LibwebPaletteActiveWindowBorder1:
  218. return palette.color(ColorRole::ActiveWindowBorder1);
  219. case CSS::ValueID::LibwebPaletteActiveWindowBorder2:
  220. return palette.color(ColorRole::ActiveWindowBorder2);
  221. case CSS::ValueID::LibwebPaletteActiveWindowTitle:
  222. return palette.color(ColorRole::ActiveWindowTitle);
  223. case CSS::ValueID::LibwebPaletteInactiveWindowBorder1:
  224. return palette.color(ColorRole::InactiveWindowBorder1);
  225. case CSS::ValueID::LibwebPaletteInactiveWindowBorder2:
  226. return palette.color(ColorRole::InactiveWindowBorder2);
  227. case CSS::ValueID::LibwebPaletteInactiveWindowTitle:
  228. return palette.color(ColorRole::InactiveWindowTitle);
  229. case CSS::ValueID::LibwebPaletteMovingWindowBorder1:
  230. return palette.color(ColorRole::MovingWindowBorder1);
  231. case CSS::ValueID::LibwebPaletteMovingWindowBorder2:
  232. return palette.color(ColorRole::MovingWindowBorder2);
  233. case CSS::ValueID::LibwebPaletteMovingWindowTitle:
  234. return palette.color(ColorRole::MovingWindowTitle);
  235. case CSS::ValueID::LibwebPaletteHighlightWindowBorder1:
  236. return palette.color(ColorRole::HighlightWindowBorder1);
  237. case CSS::ValueID::LibwebPaletteHighlightWindowBorder2:
  238. return palette.color(ColorRole::HighlightWindowBorder2);
  239. case CSS::ValueID::LibwebPaletteHighlightWindowTitle:
  240. return palette.color(ColorRole::HighlightWindowTitle);
  241. case CSS::ValueID::LibwebPaletteMenuStripe:
  242. return palette.color(ColorRole::MenuStripe);
  243. case CSS::ValueID::LibwebPaletteMenuBase:
  244. return palette.color(ColorRole::MenuBase);
  245. case CSS::ValueID::LibwebPaletteMenuBaseText:
  246. return palette.color(ColorRole::MenuBaseText);
  247. case CSS::ValueID::LibwebPaletteMenuSelection:
  248. return palette.color(ColorRole::MenuSelection);
  249. case CSS::ValueID::LibwebPaletteMenuSelectionText:
  250. return palette.color(ColorRole::MenuSelectionText);
  251. case CSS::ValueID::LibwebPaletteWindow:
  252. return palette.color(ColorRole::Window);
  253. case CSS::ValueID::LibwebPaletteWindowText:
  254. return palette.color(ColorRole::WindowText);
  255. case CSS::ValueID::LibwebPaletteButton:
  256. return palette.color(ColorRole::Button);
  257. case CSS::ValueID::LibwebPaletteButtonText:
  258. return palette.color(ColorRole::ButtonText);
  259. case CSS::ValueID::LibwebPaletteBase:
  260. return palette.color(ColorRole::Base);
  261. case CSS::ValueID::LibwebPaletteBaseText:
  262. return palette.color(ColorRole::BaseText);
  263. case CSS::ValueID::LibwebPaletteThreedHighlight:
  264. return palette.color(ColorRole::ThreedHighlight);
  265. case CSS::ValueID::LibwebPaletteThreedShadow1:
  266. return palette.color(ColorRole::ThreedShadow1);
  267. case CSS::ValueID::LibwebPaletteThreedShadow2:
  268. return palette.color(ColorRole::ThreedShadow2);
  269. case CSS::ValueID::LibwebPaletteHoverHighlight:
  270. return palette.color(ColorRole::HoverHighlight);
  271. case CSS::ValueID::LibwebPaletteSelection:
  272. return palette.color(ColorRole::Selection);
  273. case CSS::ValueID::LibwebPaletteSelectionText:
  274. return palette.color(ColorRole::SelectionText);
  275. case CSS::ValueID::LibwebPaletteInactiveSelection:
  276. return palette.color(ColorRole::InactiveSelection);
  277. case CSS::ValueID::LibwebPaletteInactiveSelectionText:
  278. return palette.color(ColorRole::InactiveSelectionText);
  279. case CSS::ValueID::LibwebPaletteRubberBandFill:
  280. return palette.color(ColorRole::RubberBandFill);
  281. case CSS::ValueID::LibwebPaletteRubberBandBorder:
  282. return palette.color(ColorRole::RubberBandBorder);
  283. case CSS::ValueID::LibwebPaletteLink:
  284. return palette.color(ColorRole::Link);
  285. case CSS::ValueID::LibwebPaletteActiveLink:
  286. return palette.color(ColorRole::ActiveLink);
  287. case CSS::ValueID::LibwebPaletteVisitedLink:
  288. return palette.color(ColorRole::VisitedLink);
  289. case CSS::ValueID::LibwebPaletteRuler:
  290. return palette.color(ColorRole::Ruler);
  291. case CSS::ValueID::LibwebPaletteRulerBorder:
  292. return palette.color(ColorRole::RulerBorder);
  293. case CSS::ValueID::LibwebPaletteRulerActiveText:
  294. return palette.color(ColorRole::RulerActiveText);
  295. case CSS::ValueID::LibwebPaletteRulerInactiveText:
  296. return palette.color(ColorRole::RulerInactiveText);
  297. case CSS::ValueID::LibwebPaletteTextCursor:
  298. return palette.color(ColorRole::TextCursor);
  299. case CSS::ValueID::LibwebPaletteFocusOutline:
  300. return palette.color(ColorRole::FocusOutline);
  301. case CSS::ValueID::LibwebPaletteSyntaxComment:
  302. return palette.color(ColorRole::SyntaxComment);
  303. case CSS::ValueID::LibwebPaletteSyntaxNumber:
  304. return palette.color(ColorRole::SyntaxNumber);
  305. case CSS::ValueID::LibwebPaletteSyntaxString:
  306. return palette.color(ColorRole::SyntaxString);
  307. case CSS::ValueID::LibwebPaletteSyntaxType:
  308. return palette.color(ColorRole::SyntaxType);
  309. case CSS::ValueID::LibwebPaletteSyntaxPunctuation:
  310. return palette.color(ColorRole::SyntaxPunctuation);
  311. case CSS::ValueID::LibwebPaletteSyntaxOperator:
  312. return palette.color(ColorRole::SyntaxOperator);
  313. case CSS::ValueID::LibwebPaletteSyntaxKeyword:
  314. return palette.color(ColorRole::SyntaxKeyword);
  315. case CSS::ValueID::LibwebPaletteSyntaxControlKeyword:
  316. return palette.color(ColorRole::SyntaxControlKeyword);
  317. case CSS::ValueID::LibwebPaletteSyntaxIdentifier:
  318. return palette.color(ColorRole::SyntaxIdentifier);
  319. case CSS::ValueID::LibwebPaletteSyntaxPreprocessorStatement:
  320. return palette.color(ColorRole::SyntaxPreprocessorStatement);
  321. case CSS::ValueID::LibwebPaletteSyntaxPreprocessorValue:
  322. return palette.color(ColorRole::SyntaxPreprocessorValue);
  323. default:
  324. return {};
  325. }
  326. }
  327. }