add binding for window class

This commit is contained in:
Vincent Sanders 2012-10-29 20:09:29 +00:00
parent b531318905
commit ac286c4a95
3 changed files with 134 additions and 3 deletions

View File

@ -11,6 +11,7 @@
S_JSAPI_BINDING:=
JSAPI_BINDING_htmldocument := javascript/jsapi/bindings/htmldocument.bnd
JSAPI_BINDING_window := javascript/jsapi/bindings/window.bnd
# 1: input file
# 2: output file
@ -27,8 +28,8 @@ endef
# Javascript sources
ifeq ($(NETSURF_USE_JS),YES)
S_JSAPI = window.c navigator.c console.c htmlelement.c
#htmldocument.c
S_JSAPI = navigator.c console.c htmlelement.c
#htmldocument.c window.c
S_JAVASCRIPT += content.c jsapi.c $(addprefix jsapi/,$(S_JSAPI))

View File

@ -1,4 +1,4 @@
/* test binding to generate htmldocument */
/* Binding to generate htmldocument */
#include "dom.bnd"

View File

@ -0,0 +1,130 @@
/* binding to generate window */
#include "dom.bnd"
webidlfile "html.idl";
hdrcomment "Part of NetSurf Project";
preamble %{
#include <dom/dom.h>
#include "utils/config.h"
#include "utils/log.h"
#include "javascript/jsapi.h"
#include "javascript/jsapi/binding.h"
%}
operation confirm %{
warn_user(message, NULL);
%}
operation alert %{
warn_user(message, NULL);
%}
operation prompt %{
warn_user(message, NULL);
%}
api init %{
JSObject *user_proto;
prototype = JS_NewCompartmentAndGlobalObject(cx, &JSClass_Window, NULL);
if (prototype == NULL) {
return NULL;
}
/** @todo reconsider global object handling. future
* editions of spidermonkey appear to be removing the
* idea of a global so we probably need to handle
* global object references internally
*/
/* set the contexts global */
JS_SetGlobalObject(cx, prototype);
/* Populate the global object with the standard globals, like
* Object and Array.
*/
if (!JS_InitStandardClasses(cx, prototype)) {
return NULL;
}
/* add functions to prototype */
if (!JS_DefineFunctions(cx, prototype, jsclass_functions)) {
return NULL;
}
/* add properties to prototype */
if (!JS_DefineProperties(cx, prototype, jsclass_properties))
return NULL;
/* Initialises all the user javascript classes to make their
* prototypes available.
*/
/** @todo should we be managing these prototype objects ourselves */
user_proto = jsapi_InitClass_Document(cx, prototype);
if (user_proto == NULL) {
return NULL;
}
%}
api new %{
/* @todo sort out windows that are not globals */
assert(parent == NULL);
/* the window object is the global so its prototype *is* the instance */
newobject = prototype;
/* instantiate the subclasses off the window global */
private->document = jsapi_new_Document(cx,
NULL,
newobject,
htmlc->document,
htmlc);
if (private->document == NULL) {
free(private);
return NULL;
}
/*
private->navigator_obj = jsapi_new_Navigator(cx, window);
if (private->navigator_obj == NULL) {
free(private);
return NULL;
}
*/
/** @todo forms, history, location */
private->console = jsapi_new_Console(cx, newobject);
if (private->console == NULL) {
free(private);
return NULL;
}
LOG(("Created new window object %p", newobject));
%}
binding window {
type js_libdom; /* the binding type */
interface Window; /* Web IDL interface to generate */
/* private are parameters to constructor stored in private
* context structure.
*
* internal are value stored in private context structure but not
* passed to constructor.
*/
private "struct browser_window *" bw;
private "struct html_content *" htmlc;
internal "JSObject *" document;
internal "JSObject *" navigator;
internal "JSObject *" console;
}