diff --git a/Libraries/LibWeb/DOM/Document.h b/Libraries/LibWeb/DOM/Document.h index 5c8095c95cc..dbf0c4246b0 100644 --- a/Libraries/LibWeb/DOM/Document.h +++ b/Libraries/LibWeb/DOM/Document.h @@ -749,6 +749,10 @@ public: GC::Ref editing_host_manager() const { return *m_editing_host_manager; } + // // https://w3c.github.io/editing/docs/execCommand/#default-single-line-container-name + FlyString const& default_single_line_container_name() const { return m_default_single_line_container_name; } + void set_default_single_line_container_name(FlyString const& name) { m_default_single_line_container_name = name; } + protected: virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; @@ -1039,6 +1043,9 @@ private: mutable OwnPtr m_word_segmenter; GC::Ref m_editing_host_manager; + + // https://w3c.github.io/editing/docs/execCommand/#default-single-line-container-name + FlyString m_default_single_line_container_name { HTML::TagNames::div }; }; template<> diff --git a/Libraries/LibWeb/Editing/Commands.cpp b/Libraries/LibWeb/Editing/Commands.cpp index f1a711d5afb..2b5346252e9 100644 --- a/Libraries/LibWeb/Editing/Commands.cpp +++ b/Libraries/LibWeb/Editing/Commands.cpp @@ -19,6 +19,34 @@ namespace Web::Editing { +// https://w3c.github.io/editing/docs/execCommand/#the-defaultparagraphseparator-command +bool command_default_paragraph_separator_action(DOM::Document& document, String const& input_value) +{ + // Let value be converted to ASCII lowercase. + auto value = input_value.to_ascii_lowercase(); + + // If value is then equal to "p" or "div", set the context object's default single-line + // container name to value, then return true. + if (value == HTML::TagNames::p) { + document.set_default_single_line_container_name(HTML::TagNames::p); + return true; + } + if (value == HTML::TagNames::div) { + document.set_default_single_line_container_name(HTML::TagNames::div); + return true; + } + + // Otherwise, return false. + return false; +} + +// https://w3c.github.io/editing/docs/execCommand/#the-defaultparagraphseparator-command +String command_default_paragraph_separator_value(DOM::Document const& document) +{ + // Return the context object's default single-line container name. + return document.default_single_line_container_name().to_string(); +} + // https://w3c.github.io/editing/docs/execCommand/#the-delete-command bool command_delete_action(DOM::Document& document, String const&) { @@ -326,6 +354,7 @@ bool command_delete_action(DOM::Document& document, String const&) static Array const commands { CommandDefinition { CommandNames::delete_, command_delete_action, {}, {}, {} }, + CommandDefinition { CommandNames::defaultParagraphSeparator, command_default_paragraph_separator_action, {}, {}, command_default_paragraph_separator_value }, }; Optional find_command_definition(FlyString const& command) diff --git a/Libraries/LibWeb/Editing/Commands.h b/Libraries/LibWeb/Editing/Commands.h index a8b3fe8ccd8..bb45b9f878a 100644 --- a/Libraries/LibWeb/Editing/Commands.h +++ b/Libraries/LibWeb/Editing/Commands.h @@ -21,6 +21,8 @@ struct CommandDefinition { Optional find_command_definition(FlyString const&); // Command implementations +bool command_default_paragraph_separator_action(DOM::Document&, String const&); +String command_default_paragraph_separator_value(DOM::Document const&); bool command_delete_action(DOM::Document&, String const&); }