📄 form.c
字号:
if (!JSVAL_IS_INT(id)) return JS_TRUE; undef_to_jsval(ctx, vp); switch (JSVAL_TO_INT(id)) { case JSP_FORM_ELEMENTS_LENGTH: int_to_jsval(ctx, vp, list_size(&form->items)); break; default: /* Array index. */ form_elements_item(ctx, obj, 1, &id, vp); break; } return JS_TRUE;}static JSBoolform_elements_item(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_form = JS_GetParent(ctx, obj); JSObject *parent_doc = JS_GetParent(ctx, parent_form); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct form_view *form_view = JS_GetPrivate(ctx, parent_form); struct form *form = find_form_by_form_view(document, form_view); struct form_control *fc; int counter = -1; int index; if (argc != 1) return JS_TRUE; index = atol(jsval_to_string(ctx, &argv[0])); undef_to_jsval(ctx, rval); 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)); if (fcobj) { object_to_jsval(ctx, rval, fcobj); } break; } } return JS_TRUE;}static JSBoolform_elements_namedItem(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_form = JS_GetParent(ctx, obj); JSObject *parent_doc = JS_GetParent(ctx, parent_form); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct form_view *form_view = JS_GetPrivate(ctx, parent_form); struct form *form = find_form_by_form_view(document, form_view); struct form_control *fc; unsigned char *string; if (argc != 1) return JS_TRUE; string = jsval_to_string(ctx, &argv[0]); if (!*string) return JS_TRUE; undef_to_jsval(ctx, rval); foreach (fc, form->items) { if (fc->name && !strcasecmp(string, fc->name)) { JSObject *fcobj = get_form_control_object(ctx, parent_form, fc->type, find_form_state(doc_view, fc)); if (fcobj) { object_to_jsval(ctx, rval, fcobj); } break; } } return JS_TRUE;}static JSBool form_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp);static JSBool form_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp);static const JSClass form_class = { "form", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, form_get_property, form_set_property, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};enum form_prop { JSP_FORM_ACTION, JSP_FORM_ELEMENTS, JSP_FORM_ENCODING, JSP_FORM_LENGTH, JSP_FORM_METHOD, JSP_FORM_NAME, JSP_FORM_TARGET};static const JSPropertySpec form_props[] = { { "action", JSP_FORM_ACTION, JSPROP_ENUMERATE }, { "elements", JSP_FORM_ELEMENTS, JSPROP_ENUMERATE }, { "encoding", JSP_FORM_ENCODING, JSPROP_ENUMERATE }, { "length", JSP_FORM_LENGTH, JSPROP_ENUMERATE | JSPROP_READONLY }, { "method", JSP_FORM_METHOD, JSPROP_ENUMERATE }, { "name", JSP_FORM_NAME, JSPROP_ENUMERATE }, { "target", JSP_FORM_TARGET, JSPROP_ENUMERATE }, { NULL }};static JSBool form_reset(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool form_submit(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static const JSFunctionSpec form_funcs[] = { { "reset", form_reset, 0 }, { "submit", form_submit, 0 }, { NULL }};static JSBoolform_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){ /* DBG("doc %p %s\n", parent_doc, JS_GetStringBytes(JS_ValueToString(ctx, OBJECT_TO_JSVAL(parent_doc)))); */ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct form_view *fv = JS_GetPrivate(ctx, obj); struct form *form = find_form_by_form_view(doc_view->document, fv); assert(form); if (JSVAL_IS_STRING(id)) { struct form_control *fc; unsigned char *string; string = jsval_to_string(ctx, &id); foreach (fc, form->items) { JSObject *fcobj = NULL; if (!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); } break; } return JS_TRUE; } if (!JSVAL_IS_INT(id)) return JS_TRUE; undef_to_jsval(ctx, vp); switch (JSVAL_TO_INT(id)) { case JSP_FORM_ACTION: string_to_jsval(ctx, vp, form->action); break; case JSP_FORM_ELEMENTS: { /* jsform ('form') is form_elements' parent; who knows is that's correct */ JSObject *jsform_elems = JS_NewObject(ctx, (JSClass *) &form_elements_class, NULL, obj); JS_DefineProperties(ctx, jsform_elems, (JSPropertySpec *) form_elements_props); JS_DefineFunctions(ctx, jsform_elems, (JSFunctionSpec *) form_elements_funcs); object_to_jsval(ctx, vp, jsform_elems); /* SM will cache this property value for us so we create this * just once per form. */ } break; case JSP_FORM_ENCODING: switch (form->method) { case FORM_METHOD_GET: case FORM_METHOD_POST: string_to_jsval(ctx, vp, "application/x-www-form-urlencoded"); break; case FORM_METHOD_POST_MP: string_to_jsval(ctx, vp, "multipart/form-data"); break; case FORM_METHOD_POST_TEXT_PLAIN: string_to_jsval(ctx, vp, "text/plain"); break; } break; case JSP_FORM_LENGTH: int_to_jsval(ctx, vp, list_size(&form->items)); break; case JSP_FORM_METHOD: switch (form->method) { case FORM_METHOD_GET: string_to_jsval(ctx, vp, "GET"); break; case FORM_METHOD_POST: case FORM_METHOD_POST_MP: case FORM_METHOD_POST_TEXT_PLAIN: string_to_jsval(ctx, vp, "POST"); break; } break; case JSP_FORM_NAME: string_to_jsval(ctx, vp, form->name); break; case JSP_FORM_TARGET: string_to_jsval(ctx, vp, form->target); break; default: INTERNAL("Invalid ID %d in form_get_property().", JSVAL_TO_INT(id)); break; } return JS_TRUE;}static JSBoolform_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct form_view *fv = JS_GetPrivate(ctx, obj); struct form *form = find_form_by_form_view(doc_view->document, fv); unsigned char *string; assert(form); if (!JSVAL_IS_INT(id)) return JS_TRUE; switch (JSVAL_TO_INT(id)) { case JSP_FORM_ACTION: mem_free_set(&form->action, stracpy(jsval_to_string(ctx, vp))); break; case JSP_FORM_ENCODING: string = jsval_to_string(ctx, vp); if (!strcasecmp(string, "application/x-www-form-urlencoded")) { form->method = form->method == FORM_METHOD_GET ? FORM_METHOD_GET : FORM_METHOD_POST; } else if (!strcasecmp(string, "multipart/form-data")) { form->method = FORM_METHOD_POST_MP; } else if (!strcasecmp(string, "text/plain")) { form->method = FORM_METHOD_POST_TEXT_PLAIN; } break; case JSP_FORM_METHOD: string = jsval_to_string(ctx, vp); if (!strcasecmp(string, "GET")) { form->method = FORM_METHOD_GET; } else if (!strcasecmp(string, "POST")) { form->method = FORM_METHOD_POST; } break; case JSP_FORM_NAME: mem_free_set(&form->name, stracpy(jsval_to_string(ctx, vp))); break; case JSP_FORM_TARGET: mem_free_set(&form->target, stracpy(jsval_to_string(ctx, vp))); break; default: INTERNAL("Invalid ID %d in form_set_property().", JSVAL_TO_INT(id)); break; } return JS_TRUE;}static JSBoolform_reset(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct form_view *fv = JS_GetPrivate(ctx, obj); struct form *form = find_form_by_form_view(doc_view->document, fv); assert(form); do_reset_form(doc_view, form); draw_forms(doc_view->session->tab->term, doc_view); boolean_to_jsval(ctx, rval, 0); return JS_TRUE;}static JSBoolform_submit(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct session *ses = doc_view->session; struct form_view *fv = JS_GetPrivate(ctx, obj); struct form *form = find_form_by_form_view(doc_view->document, fv); assert(form); submit_given_form(ses, doc_view, form); boolean_to_jsval(ctx, rval, 0); return JS_TRUE;}JSObject *get_form_object(JSContext *ctx, JSObject *jsdoc, struct form_view *fv){ if (!fv->ecmascript_obj) { /* jsdoc ('document') is fv's parent */ /* FIXME: That is NOT correct since the real containing element * should be its parent, but gimme DOM first. --pasky */ JSObject *jsform = JS_NewObject(ctx, (JSClass *) &form_class, NULL, jsdoc); JS_DefineProperties(ctx, jsform, (JSPropertySpec *) form_props); JS_DefineFunctions(ctx, jsform, (JSFunctionSpec *) form_funcs); JS_SetPrivate(ctx, jsform, fv); fv->ecmascript_obj = jsform; } return fv->ecmascript_obj;}static JSBool forms_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp);const JSClass forms_class = { "forms", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, forms_get_property, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub};static JSBool forms_item(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);static JSBool forms_namedItem(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval);const JSFunctionSpec forms_funcs[] = { { "item", forms_item, 1 }, { "namedItem", forms_namedItem, 1 }, { NULL }};/* INTs from 0 up are equivalent to item(INT), so we have to stuff length out * of the way. */enum forms_prop { JSP_FORMS_LENGTH = -1 };const JSPropertySpec forms_props[] = { { "length", JSP_FORMS_LENGTH, JSPROP_ENUMERATE | JSPROP_READONLY}, { NULL }};static JSBoolforms_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; if (JSVAL_IS_STRING(id)) { forms_namedItem(ctx, obj, 1, &id, vp); return JS_TRUE; } if (!JSVAL_IS_INT(id)) return JS_TRUE; switch (JSVAL_TO_INT(id)) { case JSP_FORMS_LENGTH: int_to_jsval(ctx, vp, list_size(&document->forms)); break; default: /* Array index. */ forms_item(ctx, obj, 1, &id, vp); break; } return JS_TRUE;}static JSBoolforms_item(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct form_view *fv; int counter = -1; int index; if (argc != 1) return JS_TRUE; index = atol(jsval_to_string(ctx, &argv[0])); undef_to_jsval(ctx, rval); foreach (fv, vs->forms) { counter++; if (counter == index) { object_to_jsval(ctx, rval, get_form_object(ctx, parent_doc, fv)); break; } } return JS_TRUE;}static JSBoolforms_namedItem(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ JSObject *parent_doc = JS_GetParent(ctx, obj); JSObject *parent_win = JS_GetParent(ctx, parent_doc); struct view_state *vs = JS_GetPrivate(ctx, parent_win); struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct form *form; unsigned char *string; if (argc != 1) return JS_TRUE; undef_to_jsval(ctx, rval); string = jsval_to_string(ctx, &argv[0]); if (!*string) return JS_TRUE; foreach (form, document->forms) { if (form->name && !strcasecmp(string, form->name)) { object_to_jsval(ctx, rval, get_form_object(ctx, parent_doc, find_form_view(doc_view, form))); break; } } return JS_TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -