mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 16:18:12 +00:00
LibWeb: Move innerText from DOM::Element to HTML::HTMLElement
This commit is contained in:
parent
bb22b04d44
commit
397049aae8
6 changed files with 40 additions and 38 deletions
|
@ -41,7 +41,6 @@
|
||||||
#include <LibWeb/Layout/LayoutTableCell.h>
|
#include <LibWeb/Layout/LayoutTableCell.h>
|
||||||
#include <LibWeb/Layout/LayoutTableRow.h>
|
#include <LibWeb/Layout/LayoutTableRow.h>
|
||||||
#include <LibWeb/Layout/LayoutTableRowGroup.h>
|
#include <LibWeb/Layout/LayoutTableRowGroup.h>
|
||||||
#include <LibWeb/Layout/LayoutText.h>
|
|
||||||
#include <LibWeb/Layout/LayoutTreeBuilder.h>
|
#include <LibWeb/Layout/LayoutTreeBuilder.h>
|
||||||
|
|
||||||
namespace Web::DOM {
|
namespace Web::DOM {
|
||||||
|
@ -296,39 +295,6 @@ String Element::inner_html() const
|
||||||
return builder.to_string();
|
return builder.to_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Element::set_inner_text(StringView text)
|
|
||||||
{
|
|
||||||
remove_all_children();
|
|
||||||
append_child(document().create_text_node(text));
|
|
||||||
|
|
||||||
set_needs_style_update(true);
|
|
||||||
document().schedule_style_update();
|
|
||||||
document().invalidate_layout();
|
|
||||||
}
|
|
||||||
|
|
||||||
String Element::inner_text()
|
|
||||||
{
|
|
||||||
StringBuilder builder;
|
|
||||||
|
|
||||||
// innerText for element being rendered takes visibility into account, so force a layout and then walk the layout tree.
|
|
||||||
document().layout();
|
|
||||||
if (!layout_node())
|
|
||||||
return text_content();
|
|
||||||
|
|
||||||
Function<void(const LayoutNode&)> recurse = [&](auto& node) {
|
|
||||||
for (auto* child = node.first_child(); child; child = child->next_sibling()) {
|
|
||||||
if (child->is_text())
|
|
||||||
builder.append(downcast<LayoutText>(*child).text_for_rendering());
|
|
||||||
if (child->is_break())
|
|
||||||
builder.append('\n');
|
|
||||||
recurse(*child);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
recurse(*layout_node());
|
|
||||||
|
|
||||||
return builder.to_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Element::is_focused() const
|
bool Element::is_focused() const
|
||||||
{
|
{
|
||||||
return document().focused_element() == this;
|
return document().focused_element() == this;
|
||||||
|
|
|
@ -93,9 +93,6 @@ public:
|
||||||
String inner_html() const;
|
String inner_html() const;
|
||||||
void set_inner_html(StringView);
|
void set_inner_html(StringView);
|
||||||
|
|
||||||
String inner_text();
|
|
||||||
void set_inner_text(StringView);
|
|
||||||
|
|
||||||
bool is_focused() const;
|
bool is_focused() const;
|
||||||
virtual bool is_focusable() const { return false; }
|
virtual bool is_focusable() const { return false; }
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ interface Element : Node {
|
||||||
ArrayFromVector querySelectorAll(DOMString selectors);
|
ArrayFromVector querySelectorAll(DOMString selectors);
|
||||||
|
|
||||||
attribute DOMString innerHTML;
|
attribute DOMString innerHTML;
|
||||||
attribute DOMString innerText;
|
|
||||||
[Reflect] attribute DOMString id;
|
[Reflect] attribute DOMString id;
|
||||||
[Reflect=class] attribute DOMString className;
|
[Reflect=class] attribute DOMString className;
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,10 @@
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <AK/StringBuilder.h>
|
||||||
|
#include <LibWeb/DOM/Document.h>
|
||||||
#include <LibWeb/HTML/HTMLElement.h>
|
#include <LibWeb/HTML/HTMLElement.h>
|
||||||
|
#include <LibWeb/Layout/LayoutText.h>
|
||||||
|
|
||||||
namespace Web::HTML {
|
namespace Web::HTML {
|
||||||
|
|
||||||
|
@ -95,4 +98,37 @@ void HTMLElement::set_content_editable(const String& content_editable)
|
||||||
// FIXME: otherwise the attribute setter must throw a "SyntaxError" DOMException.
|
// FIXME: otherwise the attribute setter must throw a "SyntaxError" DOMException.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HTMLElement::set_inner_text(StringView text)
|
||||||
|
{
|
||||||
|
remove_all_children();
|
||||||
|
append_child(document().create_text_node(text));
|
||||||
|
|
||||||
|
set_needs_style_update(true);
|
||||||
|
document().schedule_style_update();
|
||||||
|
document().invalidate_layout();
|
||||||
|
}
|
||||||
|
|
||||||
|
String HTMLElement::inner_text()
|
||||||
|
{
|
||||||
|
StringBuilder builder;
|
||||||
|
|
||||||
|
// innerText for element being rendered takes visibility into account, so force a layout and then walk the layout tree.
|
||||||
|
document().layout();
|
||||||
|
if (!layout_node())
|
||||||
|
return text_content();
|
||||||
|
|
||||||
|
Function<void(const LayoutNode&)> recurse = [&](auto& node) {
|
||||||
|
for (auto* child = node.first_child(); child; child = child->next_sibling()) {
|
||||||
|
if (child->is_text())
|
||||||
|
builder.append(downcast<LayoutText>(*child).text_for_rendering());
|
||||||
|
if (child->is_break())
|
||||||
|
builder.append('\n');
|
||||||
|
recurse(*child);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
recurse(*layout_node());
|
||||||
|
|
||||||
|
return builder.to_string();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,9 @@ public:
|
||||||
String content_editable() const;
|
String content_editable() const;
|
||||||
void set_content_editable(const String&);
|
void set_content_editable(const String&);
|
||||||
|
|
||||||
|
String inner_text();
|
||||||
|
void set_inner_text(StringView);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual bool is_html_element() const final { return true; }
|
virtual bool is_html_element() const final { return true; }
|
||||||
|
|
||||||
|
|
|
@ -7,4 +7,5 @@ interface HTMLElement : Element {
|
||||||
|
|
||||||
attribute DOMString contentEditable;
|
attribute DOMString contentEditable;
|
||||||
|
|
||||||
|
[LegacyNullToEmptyString] attribute DOMString innerText;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue