If you use your new IDL class as a type in an IDL file without doing this, you'll get confusing error messages.
2.7 KiB
Adding a new IDL file
Serenity's build system does a lot of work of turning the IDL from a Web spec into code, but there are a few things you'll need to do yourself.
For the sake of example, let's say you're wanting to add the HTMLDetailsElement
.
- Create
LibWeb/HTML/HTMLDetailsElement.idl
with the contents of the IDL section of the spec. In this case, that would be:
[Exposed=Window]
interface HTMLDetailsElement : HTMLElement {
[HTMLConstructor] constructor();
[CEReactions] attribute boolean open;
};
- If the IDL refers to other IDL types, you need to import those. For example,
CSSRule
has an attribute that returns aCSSStyleSheet
, so that needs to be imported:
#import <CSS/CSSStyleSheet.idl>
interface CSSRule {
readonly attribute CSSStyleSheet? parentStyleSheet;
};
-
If the IDL starts with
[Exposed=Window]
, add the following toLibWeb/Bindings/WindowObjectHelper.h
:#include <LibWeb/Bindings/HTMLDetailsElementConstructor.h>
and#include <LibWeb/Bindings/HTMLDetailsElementPrototype.h>
to the includes list.ADD_WINDOW_OBJECT_INTERFACE(HTMLDetailsElement) \
to the macro at the bottom.
-
Add a
libweb_js_wrapper(HTML/HTMLDetailsElement)
call toLibWeb/idl_files.cmake
-
Forward declare the generated classes in
LibWeb/Forward.h
:HTMLDetailsElement
in its namespace.HTMLDetailsElementWrapper
in theWeb::Bindings
namespace.
-
The C++ class equivalent of the IDL interface has a few requirements:
- It must inherit from
public RefCounted<HTMLDetailsElement>
andpublic Bindings::Wrappable
- It must have a public
using WrapperType = Bindings::HTMLDetailsElementWrapper;
- It must inherit from
-
Depending on what kind of thing your interface is, you may need to add it to the
WrapperFactory
of that kind:- CSSRules:
LibWeb/Bindings/CSSRuleWrapperFactory.cpp
- Events:
LibWeb/Bindings/EventWrapperFactory.cpp
- Elements:
LibWeb/Bindings/NodeWrapperFactory.cpp
Open the relevant wrapper factory file, and add
#include
directives and anif
statement for your new type. - CSSRules:
-
If your type isn't an Event or Element, you will need to add it to
is_wrappable_type()
so that it can be accepted as an IDL parameter, attribute or return type.