From 99f93da0f3a510df51c5a057e7597c570a636f9d Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 7 Dec 2012 12:08:56 +0000 Subject: correctly handle location --- javascript/jsapi.h | 2 +- javascript/jsapi/htmldocument.bnd | 16 ++++++++++++++++ javascript/jsapi/window.bnd | 33 ++++++++++++++------------------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/javascript/jsapi.h b/javascript/jsapi.h index 04932905e..d757b7fda 100644 --- a/javascript/jsapi.h +++ b/javascript/jsapi.h @@ -79,7 +79,7 @@ jsapi_property_##name##_set(cx, obj, jsval jsapi_id, vp) /* native property return value */ -#define JSAPI_PROP_RVAL(cx, vp) (vp) +#define JSAPI_PROP_RVAL(cx, vp) (*(vp)) /* native property getter return value */ #define JSAPI_PROP_SET_RVAL(cx, vp, v) (*(vp) = (v)) diff --git a/javascript/jsapi/htmldocument.bnd b/javascript/jsapi/htmldocument.bnd index 0ed7ac153..72bc81482 100644 --- a/javascript/jsapi/htmldocument.bnd +++ b/javascript/jsapi/htmldocument.bnd @@ -43,6 +43,9 @@ binding document { */ private "dom_document *" node; private "struct html_content *" htmlc; + + /** location instantiated on first use */ + property unshared location; } api finalise %{ @@ -53,6 +56,19 @@ api finalise %{ } %} +getter location %{ + if (!JSVAL_IS_VOID(JSAPI_PROP_RVAL(cx,vp))) { + /* already created - return it */ + return JS_TRUE; + } + jsret = jsapi_new_Location(cx, + NULL, + NULL, + private->htmlc->bw, + llcache_handle_get_url(private->htmlc->base.llcache)); +%} + + getter cookie %{ char *cookie_str; cookie_str = urldb_get_cookie(llcache_handle_get_url(private->htmlc->base.llcache), false); diff --git a/javascript/jsapi/window.bnd b/javascript/jsapi/window.bnd index d7f47ce44..6153e90aa 100644 --- a/javascript/jsapi/window.bnd +++ b/javascript/jsapi/window.bnd @@ -42,7 +42,6 @@ binding window { internal "JSObject *" document; internal "JSObject *" navigator; internal "JSObject *" console; - internal "JSObject *" location; property unshared type EventHandler; } @@ -58,9 +57,6 @@ api mark %{ if (private->console != NULL) { JSAPI_GCMARK(private->console); } - if (private->location != NULL) { - JSAPI_GCMARK(private->location); - } } %} @@ -180,13 +176,6 @@ api new %{ return NULL; } - private->location = jsapi_new_Location(cx, NULL, newobject, bw, - llcache_handle_get_url(private->htmlc->base.llcache)); - if (private->location == NULL) { - free(private); - return NULL; - } - private->console = jsapi_new_Console(cx, NULL, newobject); if (private->console == NULL) { free(private); @@ -210,14 +199,6 @@ operation prompt %{ warn_user(message, NULL); %} -getter window %{ - jsret = obj; -%} - -getter self %{ - jsret = obj; -%} - /* boolean dispatchEvent(Event event); */ operation dispatchEvent %{ /* this implementation is unique to the window object as it is @@ -254,6 +235,20 @@ operation dispatchEvent %{ } %} +getter location %{ + jsval loc; + JS_GetProperty(cx, private->document, "location", &loc); + jsret = JSVAL_TO_OBJECT(loc); +%} + +getter window %{ + jsret = obj; +%} + +getter self %{ + jsret = obj; +%} + getter EventHandler %{ /* this implementation is unique to the window object as it is * not a dom node. -- cgit v1.2.3