HTMLProgressElement.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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() = default;
  15. RefPtr<Layout::Node> HTMLProgressElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
  16. {
  17. return adopt_ref(*new Layout::Progress(document(), *this, move(style)));
  18. }
  19. double HTMLProgressElement::value() const
  20. {
  21. auto value_characters = attribute(HTML::AttributeNames::value).characters();
  22. if (value_characters == nullptr)
  23. return 0;
  24. auto parsed_value = strtod(value_characters, nullptr);
  25. if (!isfinite(parsed_value) || parsed_value < 0)
  26. return 0;
  27. return min(parsed_value, max());
  28. }
  29. void HTMLProgressElement::set_value(double value)
  30. {
  31. if (value < 0)
  32. return;
  33. set_attribute(HTML::AttributeNames::value, String::number(value));
  34. if (layout_node())
  35. layout_node()->set_needs_display();
  36. }
  37. double HTMLProgressElement::max() const
  38. {
  39. auto max_characters = attribute(HTML::AttributeNames::max).characters();
  40. if (max_characters == nullptr)
  41. return 1;
  42. auto parsed_value = strtod(max_characters, nullptr);
  43. if (!isfinite(parsed_value) || parsed_value <= 0)
  44. return 1;
  45. return parsed_value;
  46. }
  47. void HTMLProgressElement::set_max(double value)
  48. {
  49. if (value <= 0)
  50. return;
  51. set_attribute(HTML::AttributeNames::max, String::number(value));
  52. if (layout_node())
  53. layout_node()->set_needs_display();
  54. }
  55. double HTMLProgressElement::position() const
  56. {
  57. if (!is_determinate())
  58. return -1;
  59. return value() / max();
  60. }
  61. }