⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form.c

📁 elinks下lynx是最重要的二个文本浏览器, 在linux下非常实用, elinks也是gentoo安装过程中默认使用的浏览器, 这是elinks源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -