summaryrefslogtreecommitdiff
path: root/docs/mainpage.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/mainpage.md')
-rw-r--r--docs/mainpage.md409
1 files changed, 409 insertions, 0 deletions
diff --git a/docs/mainpage.md b/docs/mainpage.md
new file mode 100644
index 0000000..4d08ff2
--- /dev/null
+++ b/docs/mainpage.md
@@ -0,0 +1,409 @@
+nsgenbind
+=========
+
+This is a tool to generate JavaScript to DOM bindings from w3c webidl
+files and a binding configuration file.
+
+Building
+--------
+
+The tool requires bison and flex as pre-requisites
+
+Commandline
+-----------
+
+nsgenbind [-v] [-n] [-g] [-D] [-W] [-I idlpath] inputfile outputdir
+
+-v
+ The verbose switch makes the tool verbose about what operations it
+ is performing instead of the default of only reporting errors.
+
+-n
+ The tool will not generate any output but will perform all other
+ operations as if it was. Useful for debugging bindings
+
+-g
+ The generated code will be augmented with runtime debug logging so
+ it can be traced
+
+-D
+ The tool will generate output to allow debugging of output
+ conversion. This includes dumps of the binding and IDL files AST
+
+-W
+ This switch will make the tool generate warnings about various
+ issues with the binding or IDL files being processed.
+
+-I
+ An additional search path may be given so idl files can be located.
+
+The tool requires a binding file as input and an output directory in
+ which to place its output.
+
+
+Debug output
+------------
+
+In addition to the generated source the tool will output several
+ debugging files with the -D switch in use.
+
+interface.dot
+
+ The interfaces IDL dot file contains all the interfaces and their
+ relationship. graphviz can be used to convert this into a visual
+ representation which is sometimes useful to help in debugging
+ missing or incorrect interface inheritance.
+
+ Processing the dot file with graphviz can produce very large files
+ so care must be taken with options. Some examples that produce
+ adequate output:
+
+ # classical tree
+ dot -O -Tsvg interface.dot
+
+ # radial output
+ twopi -Granksep=10.0 -Gnodesep=1.0 -Groot=0009 -O -Tsvg interface.dot
+
+
+Web IDL
+-------
+
+The IDL is specified in a w3c document[1] but the second edition is in
+ draft[2] and covers many of the features actually used in the whatwg
+ dom and HTML spec.
+
+The principal usage of the IDL is to define the interface between
+ scripts and a browsers internal state. For example the DOM[3] and
+ HTML[4] specs contain all the IDL for accessing the DOM and interacting
+ with a web browser (this not strictly true as there are several
+ interfaces simply not in the standards such as console).
+
+The IDL uses some slightly strange names than other object orientated
+ systems.
+
+ IDL | JS | OOP | Notes
+-----------+------------------+----------------+----------------------------
+ interface | prototype | class | The data definition of
+ | | | the object
+ constants | read-only value | class variable | Belong to class, one copy
+ | property on the | |
+ | prototype | |
+ operation | method | method | functions that can be called
+ attribute | property | property | Variables set per instance
+-----------+------------------+----------------+----------------------------
+
+
+Binding file
+------------
+
+The binding file controls how the code generator constructs its
+output. It is deliberately similar to c++ in syntax and uses OOP
+nomenclature to describe the annotations (class, method, etc. instead
+of interface, operation, etc.)
+
+The binding file consists of three types of element:
+
+ binding
+
+ The binding element has an identifier controlling which type of
+ output is produced (currently duk_libdom and jsapi_libdom).
+
+ The binding block may contain one or more directives which
+ control overall generation behaviour:
+
+ webidl
+
+ This takes a quoted string which identifies a WebIDL file to
+ process. There may be many of these directives as required
+ but without at least one the binding is not very useful as
+ it will generate no output.
+
+ preface
+
+ This takes a cdata block. There may only be one of these per
+ binding, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file before
+ any other output and generally is used for copyright
+ comments and similar. It is immediately followed by the
+ binding tools preamble comments.
+
+ prologue
+
+ This takes a cdata block. There may only be one of these per
+ binding, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the class preface has been generated. It is often used for
+ include directives required across all modules.
+
+ epilogue
+
+ This takes a cdata block. There may only be one of these per
+ binding, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and the
+ class epilogue
+
+ postface
+
+ This takes a cdata block. There may only be one of these per
+ binding, subsequent directives will be ignored.
+
+ The postface is emitted as the very last element of the
+ generated source files.
+
+
+ class
+
+ The class controls the generation of source for an IDL interface
+ private member variables are declared here and header and
+ footer elements specific to this class.
+
+ Although not generally useful, because methods that reference a
+ class cause it to be implicitly created, empty definitions are
+ permitted.
+
+ private
+
+ variables added to the private structure for the class.
+
+ preface
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+ prologue
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+ epilogue
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+ postface
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
+ methods
+
+ The methods allow a binding to provide code to be inserted in
+ the output and to control the class initializer and finalizer
+ (note not the constructor/destructor)
+
+ All these are in the syntax of:
+
+ methodtype declarator ( parameters )
+
+ They may optionally be followed by a cdata block which will be
+ added to the appropriate method in the output. A semicolon may
+ be used instead of the cdata block but this is not obviously
+ useful except in the case of the init type.
+
+ methods and getters/setters for properties must specify both
+ class and name using the c++ style double colon separated
+ identifiers i.e. class::identifier
+
+ Note: the class names must match the IDL interface names in the
+ binding but they will almost certainly have to be translated
+ into more suitable class names for generated output.
+
+
+ preface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+
+ prologue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+
+ epilogue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+
+ postface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
+ init
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ TODO: should it become necessary to defeat the automated
+ generation of an initializer altogether the identifier can
+ be checked and if set to the class name (like a
+ constructor) output body simply becomes a verbatim copy of
+ the cdata block.
+
+ The parameter list may be empty or contain type/identifier
+ tuples. If there is a parent interface it will be called
+ with the parameters necessary for its initializer, hence the
+ entire ancestry will be initialised.
+
+ The parameters passed to the parent are identified by
+ matching the identifier with the parents initializer
+ parameter identifier, if the type does not match a type
+ cast is inserted.
+
+ It is sometimes desirable for the parent initializer
+ identifier to be different from the childs identifier. In
+ this case the identifier may have an alias added by having
+ a double colon followed by a second identifier.
+
+ For example consider the case below where HTMLElement
+ inherits from Element which inherits from Node.
+
+ init Node("struct dom_node *" node);
+ init Element("struct dom_element *" element::node);
+ init HTMLElement("struct dom_html_element *" html_element::element);
+
+ The three initializers have parameters with different
+ identifiers but specify the identifier as it appears in
+ their parents parameter list. This allows for differing
+ parameter ordering and identifier naming while allowing the
+ automated enforcement of correct initializer calling
+ chains.
+
+
+ fini
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ The cdata block is output.
+
+ The parent finalizer is called (finalizers have no parameters
+ so do not need the complexity of initializers.
+
+ method
+
+ The declarator for this method type must contain both the
+ class and the identifier.
+
+ The cdata block is output.
+
+ getter
+
+ The declarator for this method type must contain both the
+ class and the identifier.
+
+ The cdata block is output.
+
+ setter
+
+ The declarator for this method type must contain both the
+ class and the identifier.
+
+ The cdata block is output.
+
+
+Generated source
+----------------
+
+duk_libdom
+
+ This binding type generates several files as output:
+ - binding.c
+ support function source
+
+ - binding.h
+ header to declare the support functions and magic constant
+
+ - prototype.h
+ header which declares all the prototype builder, initialiser
+ and finalizer functions.
+
+ - private.h
+ Which defines all the private structures for all classes
+
+ - C source file per class
+ These are the main output of the tool and are structured to
+ give the binding author control of the output while
+ automatically generating as much code as possible.
+
+ The files are generated in sections:
+ tool preface
+ binding preface
+ class preface
+ tool prologue
+ binding prologue
+ class prologue
+ initialiser
+ finalizer
+ constructor
+ destructor
+ methods
+ getters and setters
+ prototype
+ class epilogue
+ binding epilogue
+ tool epilogue
+ class postface
+ binding postface
+ tool postface
+
+ The preface, prologue, epilogue and postface are all
+ verbaitum output from the binding and class elements in the
+ binding. All the other sections are generated code augmented
+ and controlled by the binding.
+
+ Method generation produces a method with appropriate
+ signature added to the prototype. Any verbatum cdata from
+ the binding is added after the code that automatically
+ populates a private pointer of the appropriate type
+ (named priv).
+
+References
+----------
+
+[1] http://www.w3.org/TR/WebIDL/
+[2] https://heycam.github.io/webidl/
+[3] https://dom.spec.whatwg.org/
+[4] https://html.spec.whatwg.org/