1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 09:58:11 +00:00

LibWeb: Make WrapperGenerator generate nullable wrapper types

Previously it was not doing so, and some code relied on this not being
the case.

In particular, set_caption, set_t_head and set_t_foot in
HTMLTableElement relied on this. This commit is not here to fix this,
so I added an assertion to make it equivalent to a reference for now.
This commit is contained in:
Luke 2021-07-05 05:45:20 +01:00 committed by Andreas Kling
parent 62c015dc96
commit a826df773e
5 changed files with 43 additions and 16 deletions

View file

@ -573,7 +573,8 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
)~~~"); )~~~");
} }
} else if (is_wrappable_type(parameter.type)) { } else if (is_wrappable_type(parameter.type)) {
scoped_generator.append(R"~~~( if (!parameter.type.nullable) {
scoped_generator.append(R"~~~(
auto @cpp_name@_object = @js_name@@js_suffix@.to_object(global_object); auto @cpp_name@_object = @js_name@@js_suffix@.to_object(global_object);
if (vm.exception()) if (vm.exception())
@return_statement@ @return_statement@
@ -585,6 +586,23 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter
auto& @cpp_name@ = static_cast<@parameter.type.name@Wrapper*>(@cpp_name@_object)->impl(); auto& @cpp_name@ = static_cast<@parameter.type.name@Wrapper*>(@cpp_name@_object)->impl();
)~~~"); )~~~");
} else {
scoped_generator.append(R"~~~(
@parameter.type.name@* @cpp_name@ = nullptr;
if (!@js_name@@js_suffix@.is_null()) {
auto @cpp_name@_object = @js_name@@js_suffix@.to_object(global_object);
if (vm.exception())
@return_statement@
if (!is<@parameter.type.name@Wrapper>(@cpp_name@_object)) {
vm.throw_exception<JS::TypeError>(global_object, JS::ErrorType::NotA, "@parameter.type.name@");
@return_statement@
}
@cpp_name@ = &static_cast<@parameter.type.name@Wrapper*>(@cpp_name@_object)->impl();
}
)~~~");
}
} else if (parameter.type.name == "double") { } else if (parameter.type.name == "double") {
if (!optional) { if (!optional) {
scoped_generator.append(R"~~~( scoped_generator.append(R"~~~(

View file

@ -215,14 +215,14 @@ HTML::HTMLElement* Document::body()
} }
// https://html.spec.whatwg.org/multipage/dom.html#dom-document-body // https://html.spec.whatwg.org/multipage/dom.html#dom-document-body
ExceptionOr<void> Document::set_body(HTML::HTMLElement& new_body) ExceptionOr<void> Document::set_body(HTML::HTMLElement* new_body)
{ {
if (!is<HTML::HTMLBodyElement>(new_body) && !is<HTML::HTMLFrameSetElement>(new_body)) if (!is<HTML::HTMLBodyElement>(new_body) && !is<HTML::HTMLFrameSetElement>(new_body))
return DOM::HierarchyRequestError::create("Invalid document body element, must be 'body' or 'frameset'"); return DOM::HierarchyRequestError::create("Invalid document body element, must be 'body' or 'frameset'");
auto* existing_body = body(); auto* existing_body = body();
if (existing_body) { if (existing_body) {
auto replace_result = existing_body->parent()->replace_child(new_body, *existing_body); auto replace_result = existing_body->parent()->replace_child(*new_body, *existing_body);
if (replace_result.is_exception()) if (replace_result.is_exception())
return replace_result.exception(); return replace_result.exception();
return {}; return {};
@ -232,7 +232,7 @@ ExceptionOr<void> Document::set_body(HTML::HTMLElement& new_body)
if (!document_element) if (!document_element)
return DOM::HierarchyRequestError::create("Missing document element"); return DOM::HierarchyRequestError::create("Missing document element");
auto append_result = document_element->append_child(new_body); auto append_result = document_element->append_child(*new_body);
if (append_result.is_exception()) if (append_result.is_exception())
return append_result.exception(); return append_result.exception();
return {}; return {};

View file

@ -110,7 +110,7 @@ public:
return const_cast<Document*>(this)->body(); return const_cast<Document*>(this)->body();
} }
ExceptionOr<void> set_body(HTML::HTMLElement& new_body); ExceptionOr<void> set_body(HTML::HTMLElement* new_body);
String title() const; String title() const;
void set_title(const String&); void set_title(const String&);

View file

@ -51,13 +51,16 @@ RefPtr<HTMLTableCaptionElement> HTMLTableElement::caption()
return first_child_of_type<HTMLTableCaptionElement>(); return first_child_of_type<HTMLTableCaptionElement>();
} }
void HTMLTableElement::set_caption(HTMLTableCaptionElement& caption) void HTMLTableElement::set_caption(HTMLTableCaptionElement* caption)
{ {
// FIXME: This is not always the case, but this function is currently written in a way that assumes non-null.
VERIFY(caption);
// FIXME: The spec requires deleting the current caption if caption is null // FIXME: The spec requires deleting the current caption if caption is null
// Currently the wrapper generator doesn't send us a nullable value // Currently the wrapper generator doesn't send us a nullable value
delete_caption(); delete_caption();
pre_insert(caption, first_child()); pre_insert(*caption, first_child());
} }
NonnullRefPtr<HTMLTableCaptionElement> HTMLTableElement::create_caption() NonnullRefPtr<HTMLTableCaptionElement> HTMLTableElement::create_caption()
@ -93,9 +96,12 @@ RefPtr<HTMLTableSectionElement> HTMLTableElement::t_head()
return nullptr; return nullptr;
} }
DOM::ExceptionOr<void> HTMLTableElement::set_t_head(HTMLTableSectionElement& thead) DOM::ExceptionOr<void> HTMLTableElement::set_t_head(HTMLTableSectionElement* thead)
{ {
if (thead.tag_name() != TagNames::thead) // FIXME: This is not always the case, but this function is currently written in a way that assumes non-null.
VERIFY(thead);
if (thead->tag_name() != TagNames::thead)
return DOM::HierarchyRequestError::create("Element is not thead"); return DOM::HierarchyRequestError::create("Element is not thead");
// FIXME: The spec requires deleting the current thead if thead is null // FIXME: The spec requires deleting the current thead if thead is null
@ -120,7 +126,7 @@ DOM::ExceptionOr<void> HTMLTableElement::set_t_head(HTMLTableSectionElement& the
break; break;
} }
pre_insert(thead, child_to_append_after); pre_insert(*thead, child_to_append_after);
return {}; return {};
} }
@ -177,9 +183,12 @@ RefPtr<HTMLTableSectionElement> HTMLTableElement::t_foot()
return nullptr; return nullptr;
} }
DOM::ExceptionOr<void> HTMLTableElement::set_t_foot(HTMLTableSectionElement& tfoot) DOM::ExceptionOr<void> HTMLTableElement::set_t_foot(HTMLTableSectionElement* tfoot)
{ {
if (tfoot.tag_name() != TagNames::tfoot) // FIXME: This is not always the case, but this function is currently written in a way that assumes non-null.
VERIFY(tfoot);
if (tfoot->tag_name() != TagNames::tfoot)
return DOM::HierarchyRequestError::create("Element is not tfoot"); return DOM::HierarchyRequestError::create("Element is not tfoot");
// FIXME: The spec requires deleting the current tfoot if tfoot is null // FIXME: The spec requires deleting the current tfoot if tfoot is null
@ -187,7 +196,7 @@ DOM::ExceptionOr<void> HTMLTableElement::set_t_foot(HTMLTableSectionElement& tfo
delete_t_foot(); delete_t_foot();
// We insert the new tfoot at the end of the table // We insert the new tfoot at the end of the table
append_child(tfoot); append_child(*tfoot);
return {}; return {};
} }

View file

@ -22,17 +22,17 @@ public:
virtual ~HTMLTableElement() override; virtual ~HTMLTableElement() override;
RefPtr<HTMLTableCaptionElement> caption(); RefPtr<HTMLTableCaptionElement> caption();
void set_caption(HTMLTableCaptionElement&); void set_caption(HTMLTableCaptionElement*);
NonnullRefPtr<HTMLTableCaptionElement> create_caption(); NonnullRefPtr<HTMLTableCaptionElement> create_caption();
void delete_caption(); void delete_caption();
RefPtr<HTMLTableSectionElement> t_head(); RefPtr<HTMLTableSectionElement> t_head();
DOM::ExceptionOr<void> set_t_head(HTMLTableSectionElement& thead); DOM::ExceptionOr<void> set_t_head(HTMLTableSectionElement* thead);
NonnullRefPtr<HTMLTableSectionElement> create_t_head(); NonnullRefPtr<HTMLTableSectionElement> create_t_head();
void delete_t_head(); void delete_t_head();
RefPtr<HTMLTableSectionElement> t_foot(); RefPtr<HTMLTableSectionElement> t_foot();
DOM::ExceptionOr<void> set_t_foot(HTMLTableSectionElement& thead); DOM::ExceptionOr<void> set_t_foot(HTMLTableSectionElement* tfoot);
NonnullRefPtr<HTMLTableSectionElement> create_t_foot(); NonnullRefPtr<HTMLTableSectionElement> create_t_foot();
void delete_t_foot(); void delete_t_foot();