From ecc03ad608cea63b89877935529b2881336852cd Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Tue, 22 May 2007 16:07:06 +0200 Subject: [PATCH] bug 755: Fixed. Remember the index of struct form_state in vs->form_info instead of the pointer to it. The pointer may change, the index is persistent. The field ecmascript_obj of the struct form_state is unused. --- src/ecmascript/see/form.c | 52 +++++++++++++++++++--------------- src/ecmascript/spidermonkey/form.c | 58 ++++++++++++++++++++++++-------------- 2 files changed, 66 insertions(+), 44 deletions(-) diff --git a/src/ecmascript/see/form.c b/src/ecmascript/see/form.c index 14ec42ab..c1332ccf 100644 --- a/src/ecmascript/see/form.c +++ b/src/ecmascript/see/form.c @@ -56,8 +56,8 @@ static void js_input_focus(struct SEE_interpreter *, struct SEE_object *, struct static void js_input_select(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static int input_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); static int input_hasproperty(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); -static struct js_input *js_get_input_object(struct SEE_interpreter *, struct js_form *, struct form_state *); -static struct js_input *js_get_form_control_object(struct SEE_interpreter *, struct js_form *, enum form_type, struct form_state *); +static struct js_input *js_get_input_object(struct SEE_interpreter *, struct js_form *, int); +static struct js_input *js_get_form_control_object(struct SEE_interpreter *, struct js_form *, enum form_type, int); static void js_form_elems_item(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); static void js_form_elems_namedItem(struct SEE_interpreter *, struct SEE_object *, struct SEE_object *, int, struct SEE_value **, struct SEE_value *); @@ -136,11 +136,11 @@ struct SEE_objectclass js_form_class = { struct js_input { struct SEE_object object; struct js_form *parent; - struct form_state *fs; struct SEE_object *blur; struct SEE_object *click; struct SEE_object *focus; struct SEE_object *select; + int form_number; }; struct js_forms_object { @@ -168,7 +168,7 @@ input_get(struct SEE_interpreter *interp, struct SEE_object *o, struct document *document = doc_view->document; struct js_input *input = (struct js_input *)o; struct js_form *parent = input->parent; - struct form_state *fs = input->fs; + struct form_state *fs = &vs->form_info[input->form_number]; struct form_control *fc = find_form_control(document, fs); int linknum; struct link *link = NULL; @@ -271,7 +271,7 @@ input_put(struct SEE_interpreter *interp, struct SEE_object *o, struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct js_input *input = (struct js_input *)o; - struct form_state *fs = input->fs; + struct form_state *fs = &vs->form_info[input->form_number]; struct form_control *fc = find_form_control(document, fs); int linknum; struct link *link = NULL; @@ -371,7 +371,7 @@ js_input_click(struct SEE_interpreter *interp, struct SEE_object *self, struct js_input *input = ( see_check_class(interp, thisobj, &js_input_object_class), (struct js_input *)thisobj); - struct form_state *fs = input->fs; + struct form_state *fs = &vs->form_info[input->form_number]; struct form_control *fc; int linknum; @@ -406,7 +406,7 @@ js_input_focus(struct SEE_interpreter *interp, struct SEE_object *self, struct js_input *input = ( see_check_class(interp, thisobj, &js_input_object_class), (struct js_input *)thisobj); - struct form_state *fs = input->fs; + struct form_state *fs = &vs->form_info[input->form_number]; struct form_control *fc; int linknum; @@ -451,8 +451,7 @@ input_hasproperty(struct SEE_interpreter *interp, struct SEE_object *o, } static struct js_input * -js_get_input_object(struct SEE_interpreter *interp, struct js_form *jsform, - struct form_state *fs) +js_get_input_object(struct SEE_interpreter *interp, struct js_form *jsform, int num) { struct js_input *jsinput; @@ -474,16 +473,14 @@ js_get_input_object(struct SEE_interpreter *interp, struct js_form *jsform, jsinput->focus = SEE_cfunction_make(interp, js_input_focus, s_focus, 0); jsinput->select = SEE_cfunction_make(interp, js_input_select, s_select, 0); - jsinput->fs = fs; + jsinput->form_number = num; jsinput->parent = jsform; - - fs->ecmascript_obj = jsinput; return jsinput; } static struct js_input * js_get_form_control_object(struct SEE_interpreter *interp, struct js_form *jsform, - enum form_type type, struct form_state *fs) + enum form_type type, int num) { switch (type) { case FC_TEXT: @@ -497,7 +494,7 @@ js_get_form_control_object(struct SEE_interpreter *interp, struct js_form *jsfor case FC_BUTTON: case FC_HIDDEN: case FC_SELECT: - return js_get_input_object(interp, jsform, fs); + return js_get_input_object(interp, jsform, num); case FC_TEXTAREA: /* TODO */ @@ -544,10 +541,13 @@ js_form_elems_item(struct SEE_interpreter *interp, struct SEE_object *self, foreach (fc, form->items) { counter++; if (counter == index) { - struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, find_form_state(doc_view, fc)); + struct form_state *fs = find_form_state(doc_view, fc); + + if (fs) { + struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, fc->g_ctrl_num); - if (fcobj) { - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); + if (fcobj) + SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); } break; } @@ -582,10 +582,13 @@ js_form_elems_namedItem(struct SEE_interpreter *interp, struct SEE_object *self, foreach (fc, form->items) { if ((fc->id && !strcasecmp(string, fc->id)) || (fc->name && !strcasecmp(string, fc->name))) { - struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, find_form_state(doc_view, fc)); + struct form_state *fs = find_form_state(doc_view, fc); + + if (fs) { + struct js_input *fcobj = js_get_form_control_object(interp, parent_form, fc->type, fc->g_ctrl_num); - if (fcobj) { - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); + if (fcobj) + SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); } break; } @@ -839,13 +842,16 @@ form_get(struct SEE_interpreter *interp, struct SEE_object *o, foreach(fc, form->items) { struct js_input *fcobj = NULL; + struct form_state *fs; if ((!fc->id || strcasecmp(string, fc->id)) && (!fc->name || strcasecmp(string, fc->name))) continue; - fcobj = js_get_form_control_object(interp, js_form, fc->type, find_form_state(doc_view, fc)); + fs = find_form_state(doc_view, fc); + if (fs) { + fcobj = js_get_form_control_object(interp, js_form, fc->type, fc->g_ctrl_num); - if (fcobj) { - SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); + if (fcobj) + SEE_SET_OBJECT(res, (struct SEE_object *)fcobj); } break; } diff --git a/src/ecmascript/spidermonkey/form.c b/src/ecmascript/spidermonkey/form.c index fa4e4ebf..9236aa2c 100644 --- a/src/ecmascript/spidermonkey/form.c +++ b/src/ecmascript/spidermonkey/form.c @@ -130,6 +130,15 @@ static const JSFunctionSpec input_funcs[] = { static JSString *unicode_to_jsstring(JSContext *ctx, unicode_val_T u); static unicode_val_T jsval_to_accesskey(JSContext *ctx, jsval *vp); + +static struct form_state * +input_get_form_state(JSContext *ctx, JSObject *obj, struct view_state *vs) +{ + int n = (int)(long)JS_GetPrivate(ctx, obj); + + return &vs->form_info[n]; +} + /* @input_class.getProperty */ static JSBool input_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) @@ -163,7 +172,7 @@ input_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) vs = JS_GetPrivate(ctx, parent_win); /* from @window_class */ doc_view = vs->doc_view; document = doc_view->document; - fs = JS_GetPrivate(ctx, obj); /* from @input_class */ + fs = input_get_form_state(ctx, obj, vs); fc = find_form_control(document, fs); assert(fc); @@ -313,7 +322,7 @@ input_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) vs = JS_GetPrivate(ctx, parent_win); /* from @window_class */ doc_view = vs->doc_view; document = doc_view->document; - fs = JS_GetPrivate(ctx, obj); /* from @input_class */ + fs = input_get_form_state(ctx, obj, vs); fc = find_form_control(document, fs); assert(fc); @@ -435,7 +444,7 @@ input_click(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) doc_view = vs->doc_view; document = doc_view->document; ses = doc_view->session; - fs = JS_GetPrivate(ctx, obj); /* from @input_class */ + fs = input_get_form_state(ctx, obj, vs); assert(fs); fc = find_form_control(document, fs); @@ -487,7 +496,7 @@ input_focus(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) doc_view = vs->doc_view; document = doc_view->document; ses = doc_view->session; - fs = JS_GetPrivate(ctx, obj); /* from @input_class */ + fs = input_get_form_state(ctx, obj, vs); assert(fs); fc = find_form_control(document, fs); @@ -514,7 +523,7 @@ input_select(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval } static JSObject * -get_input_object(JSContext *ctx, JSObject *jsform, struct form_state *fs) +get_input_object(JSContext *ctx, JSObject *jsform, long number) { #if 0 if (fs->ecmascript_obj) @@ -527,14 +536,13 @@ get_input_object(JSContext *ctx, JSObject *jsform, struct form_state *fs) JS_DefineProperties(ctx, jsinput, (JSPropertySpec *) input_props); JS_DefineFunctions(ctx, jsinput, (JSFunctionSpec *) input_funcs); - JS_SetPrivate(ctx, jsinput, fs); /* to @input_class */ - fs->ecmascript_obj = jsinput; - return fs->ecmascript_obj; + JS_SetPrivate(ctx, jsinput, (void *)number); /* to @input_class */ + return jsinput;; } static JSObject * -get_form_control_object(JSContext *ctx, JSObject *jsform, enum form_type type, struct form_state *fs) +get_form_control_object(JSContext *ctx, JSObject *jsform, enum form_type type, int number) { switch (type) { case FC_TEXT: @@ -548,7 +556,7 @@ get_form_control_object(JSContext *ctx, JSObject *jsform, enum form_type type, s case FC_BUTTON: case FC_HIDDEN: case FC_SELECT: - return get_input_object(ctx, jsform, fs); + return get_input_object(ctx, jsform, (long)number); case FC_TEXTAREA: /* TODO */ @@ -693,10 +701,13 @@ form_elements_item(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval foreach (fc, form->items) { counter++; if (counter == index) { - JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, find_form_state(doc_view, fc)); + struct form_state *fs = find_form_state(doc_view, fc); + + if (fs) { + JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, fc->g_ctrl_num); - if (fcobj) { - object_to_jsval(ctx, rval, fcobj); + if (fcobj) + object_to_jsval(ctx, rval, fcobj); } break; } @@ -748,10 +759,13 @@ form_elements_namedItem(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, foreach (fc, form->items) { if ((fc->id && !strcasecmp(string, fc->id)) || (fc->name && !strcasecmp(string, fc->name))) { - JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, find_form_state(doc_view, fc)); + struct form_state *fs = find_form_state(doc_view, fc); + + if (fs) { + JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, fc->g_ctrl_num); - if (fcobj) { - object_to_jsval(ctx, rval, fcobj); + if (fcobj) + object_to_jsval(ctx, rval, fcobj); } break; } @@ -846,15 +860,17 @@ form_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) string = jsval_to_string(ctx, &id); foreach (fc, form->items) { JSObject *fcobj = NULL; + struct form_state *fs; if ((!fc->id || strcasecmp(string, fc->id)) && (!fc->name || strcasecmp(string, fc->name))) continue; - fcobj = get_form_control_object(ctx, obj, fc->type, find_form_state(doc_view, fc)); - if (fcobj) { - object_to_jsval(ctx, vp, fcobj); - } else { - undef_to_jsval(ctx, vp); + undef_to_jsval(ctx, vp); + fs = find_form_state(doc_view, fc); + if (fs) { + fcobj = get_form_control_object(ctx, obj, fc->type, fc->g_ctrl_num); + if (fcobj) + object_to_jsval(ctx, vp, fcobj); } break; } -- 2.11.4.GIT