mirror of
https://github.com/RGBCube/serenity
synced 2025-05-19 00:35:06 +00:00
LibWeb: Implement the <summary> element
This commit is contained in:
parent
870bcd56df
commit
8773122f6b
5 changed files with 104 additions and 1 deletions
67
Userland/Libraries/LibWeb/HTML/HTMLSummaryElement.cpp
Normal file
67
Userland/Libraries/LibWeb/HTML/HTMLSummaryElement.cpp
Normal file
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* Copyright (c) 2023, the SerenityOS developers.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/Bindings/Intrinsics.h>
|
||||
#include <LibWeb/HTML/HTMLDetailsElement.h>
|
||||
#include <LibWeb/HTML/HTMLSummaryElement.h>
|
||||
|
||||
namespace Web::HTML {
|
||||
|
||||
HTMLSummaryElement::HTMLSummaryElement(DOM::Document& document, DOM::QualifiedName qualified_name)
|
||||
: HTMLElement(document, move(qualified_name))
|
||||
{
|
||||
activation_behavior = [this](auto&) {
|
||||
// The activation behavior of summary elements is to run the following steps:
|
||||
|
||||
// 1. If this summary element is not the summary for its parent details, then return.
|
||||
if (!is_summary_for_its_parent_details())
|
||||
return;
|
||||
|
||||
// 2. Let parent be this summary element's parent.
|
||||
auto* parent = this->parent_element();
|
||||
|
||||
// 3. If the open attribute is present on parent, then remove it. Otherwise, set parent's open attribute to the empty string.
|
||||
if (parent->has_attribute(HTML::AttributeNames::open))
|
||||
parent->remove_attribute(HTML::AttributeNames::open);
|
||||
else
|
||||
parent->set_attribute(HTML::AttributeNames::open, "").release_value_but_fixme_should_propagate_errors();
|
||||
};
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/interactive-elements.html#summary-for-its-parent-details
|
||||
bool HTMLSummaryElement::is_summary_for_its_parent_details()
|
||||
{
|
||||
// A summary element is a summary for its parent details if the following algorithm returns true:
|
||||
|
||||
// 1. If this summary element has no parent, then return false.
|
||||
if (!parent_element())
|
||||
return false;
|
||||
|
||||
// 2. Let parent be this summary element's parent.
|
||||
auto* parent = this->parent_element();
|
||||
|
||||
// 3. If parent is not a details element, then return false.
|
||||
if (!is<HTMLDetailsElement>(*parent))
|
||||
return false;
|
||||
|
||||
// 4. If parent's first summary element child is not this summary element, then return false.
|
||||
if (parent->first_child_of_type<HTMLSummaryElement>() != this)
|
||||
return false;
|
||||
|
||||
// 5. Return true.
|
||||
return true;
|
||||
}
|
||||
|
||||
HTMLSummaryElement::~HTMLSummaryElement() = default;
|
||||
|
||||
JS::ThrowCompletionOr<void> HTMLSummaryElement::initialize(JS::Realm& realm)
|
||||
{
|
||||
MUST_OR_THROW_OOM(Base::initialize(realm));
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue