ladybird/Libraries/LibWeb/DOM/EditingHostManager.h
Jelle Raaijmakers 60a501d824 LibWeb: Do not update selection on uneditable contents without Shift key
If selection navigation happens through an editing host, we should
enforce that for collapsed navigations (i.e. moving the caret) it can
only happen if the focus node of the selection is editable.
2025-08-26 10:25:59 +02:00

59 lines
2.1 KiB
C++

/*
* Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGC/CellAllocator.h>
#include <LibJS/Heap/Cell.h>
#include <LibJS/Runtime/Realm.h>
#include <LibWeb/DOM/InputEventsTarget.h>
#include <LibWeb/Forward.h>
namespace Web::DOM {
class EditingHostManager
: public JS::Cell
, public InputEventsTarget {
GC_CELL(EditingHostManager, JS::Cell);
GC_DECLARE_ALLOCATOR(EditingHostManager);
public:
[[nodiscard]] static GC::Ref<EditingHostManager> create(JS::Realm&, GC::Ref<Document>);
virtual void handle_insert(Utf16String const&) override;
virtual void handle_delete(DeleteDirection) override;
virtual EventResult handle_return_key(FlyString const& ui_input_type) override;
virtual void select_all() override;
virtual void set_selection_anchor(GC::Ref<DOM::Node>, size_t offset) override;
virtual void set_selection_focus(GC::Ref<DOM::Node>, size_t offset) override;
virtual void move_cursor_to_start(CollapseSelection) override;
virtual void move_cursor_to_end(CollapseSelection) override;
virtual void increment_cursor_position_offset(CollapseSelection) override;
virtual void decrement_cursor_position_offset(CollapseSelection) override;
virtual void increment_cursor_position_to_next_word(CollapseSelection) override;
virtual void decrement_cursor_position_to_previous_word(CollapseSelection) override;
virtual void increment_cursor_position_to_next_line(CollapseSelection) override;
virtual void decrement_cursor_position_to_previous_line(CollapseSelection) override;
virtual void visit_edges(Cell::Visitor& visitor) override;
void set_active_contenteditable_element(GC::Ptr<DOM::Node> element)
{
m_active_contenteditable_element = element;
}
private:
EditingHostManager(GC::Ref<Document>);
virtual GC::Ref<JS::Cell> as_cell() override { return *this; }
GC::Ptr<Selection::Selection> get_selection_for_navigation(CollapseSelection) const;
GC::Ref<Document> m_document;
GC::Ptr<DOM::Node> m_active_contenteditable_element;
};
}