diff --git a/Userland/Applications/Help/ManualModel.cpp b/Userland/Applications/Help/ManualModel.cpp index 14df270453..7809a0dd12 100644 --- a/Userland/Applications/Help/ManualModel.cpp +++ b/Userland/Applications/Help/ManualModel.cpp @@ -109,8 +109,11 @@ GUI::ModelIndex ManualModel::index(int row, int column, const GUI::ModelIndex& p if (!parent_index.is_valid()) return create_index(row, column, Manual::sections[row].ptr()); auto* parent = static_cast(parent_index.internal_data()); - auto* child = &parent->children()[row]; - return create_index(row, column, child); + auto const children = parent->children(); + if (children.is_error()) + return {}; + auto child = children.value()[row]; + return create_index(row, column, child.ptr()); } GUI::ModelIndex ManualModel::parent_index(const GUI::ModelIndex& index) const @@ -128,8 +131,12 @@ GUI::ModelIndex ManualModel::parent_index(const GUI::ModelIndex& index) const return create_index(row, 0, parent); VERIFY_NOT_REACHED(); } - for (size_t row = 0; row < parent->parent()->children().size(); row++) { - Manual::Node* child_at_row = &parent->parent()->children()[row]; + auto maybe_children = parent->parent()->children(); + if (maybe_children.is_error()) + return {}; + auto children = maybe_children.release_value(); + for (size_t row = 0; row < children.size(); row++) { + Manual::Node* child_at_row = children[row]; if (child_at_row == parent) return create_index(row, 0, parent); } @@ -141,7 +148,10 @@ int ManualModel::row_count(const GUI::ModelIndex& index) const if (!index.is_valid()) return static_cast(Manual::sections.size()); auto* node = static_cast(index.internal_data()); - return node->children().size(); + auto maybe_children = node->children(); + if (maybe_children.is_error()) + return 0; + return static_cast(maybe_children.value().size()); } int ManualModel::column_count(const GUI::ModelIndex&) const diff --git a/Userland/Libraries/LibManual/Node.h b/Userland/Libraries/LibManual/Node.h index 46347bd8e4..cf72a984a2 100644 --- a/Userland/Libraries/LibManual/Node.h +++ b/Userland/Libraries/LibManual/Node.h @@ -20,7 +20,7 @@ class Node : public RefCounted { public: virtual ~Node() = default; - virtual NonnullRefPtrVector& children() const = 0; + virtual ErrorOr>> children() const = 0; virtual Node const* parent() const = 0; virtual ErrorOr name() const = 0; virtual bool is_page() const { return false; } diff --git a/Userland/Libraries/LibManual/PageNode.cpp b/Userland/Libraries/LibManual/PageNode.cpp index 800598e69d..398eedb53c 100644 --- a/Userland/Libraries/LibManual/PageNode.cpp +++ b/Userland/Libraries/LibManual/PageNode.cpp @@ -16,10 +16,10 @@ Node const* PageNode::parent() const return m_section.ptr(); } -NonnullRefPtrVector& PageNode::children() const +ErrorOr>> PageNode::children() const { static NonnullRefPtrVector empty_vector; - return empty_vector; + return empty_vector.span(); } ErrorOr PageNode::path() const diff --git a/Userland/Libraries/LibManual/PageNode.h b/Userland/Libraries/LibManual/PageNode.h index 66976a593f..e505e228a0 100644 --- a/Userland/Libraries/LibManual/PageNode.h +++ b/Userland/Libraries/LibManual/PageNode.h @@ -23,7 +23,7 @@ public: { } - virtual NonnullRefPtrVector& children() const override; + virtual ErrorOr>> children() const override; virtual Node const* parent() const override; virtual ErrorOr name() const override { return m_page; }; virtual bool is_page() const override { return true; } diff --git a/Userland/Libraries/LibManual/SectionNode.h b/Userland/Libraries/LibManual/SectionNode.h index 414e03b17c..14ddd5bbda 100644 --- a/Userland/Libraries/LibManual/SectionNode.h +++ b/Userland/Libraries/LibManual/SectionNode.h @@ -23,10 +23,10 @@ public: { } - virtual NonnullRefPtrVector& children() const override + virtual ErrorOr>> children() const override { - MUST(reify_if_needed()); - return m_children; + TRY(reify_if_needed()); + return m_children.span(); } virtual Node const* parent() const override { return nullptr; }