HTMLProgressElement.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * Copyright (c) 2020-2022, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/HTML/HTMLProgressElement.h>
  7. #include <LibWeb/Layout/Progress.h>
  8. #include <stdlib.h>
  9. namespace Web::HTML {
  10. HTMLProgressElement::HTMLProgressElement(DOM::Document& document, DOM::QualifiedName qualified_name)
  11. : HTMLElement(document, move(qualified_name))
  12. {
  13. }
  14. HTMLProgressElement::~HTMLProgressElement()
  15. {
  16. }
  17. RefPtr<Layout::Node> HTMLProgressElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
  18. {
  19. return adopt_ref(*new Layout::Progress(document(), *this, move(style)));
  20. }
  21. double HTMLProgressElement::value() const
  22. {
  23. auto value_characters = attribute(HTML::AttributeNames::value).characters();
  24. if (value_characters == nullptr)
  25. return 0;
  26. auto parsed_value = strtod(value_characters, nullptr);
  27. if (!isfinite(parsed_value) || parsed_value < 0)
  28. return 0;
  29. return min(parsed_value, max());
  30. }
  31. void HTMLProgressElement::set_value(double value)
  32. {
  33. if (value < 0)
  34. return;
  35. set_attribute(HTML::AttributeNames::value, String::number(value));
  36. if (layout_node())
  37. layout_node()->set_needs_display();
  38. }
  39. double HTMLProgressElement::max() const
  40. {
  41. auto max_characters = attribute(HTML::AttributeNames::max).characters();
  42. if (max_characters == nullptr)
  43. return 1;
  44. auto parsed_value = strtod(max_characters, nullptr);
  45. if (!isfinite(parsed_value) || parsed_value <= 0)
  46. return 1;
  47. return parsed_value;
  48. }
  49. void HTMLProgressElement::set_max(double value)
  50. {
  51. if (value <= 0)
  52. return;
  53. set_attribute(HTML::AttributeNames::max, String::number(value));
  54. if (layout_node())
  55. layout_node()->set_needs_display();
  56. }
  57. double HTMLProgressElement::position() const
  58. {
  59. if (!is_determinate())
  60. return -1;
  61. return value() / max();
  62. }
  63. }