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

📄 jsint.c

📁 ELinks is an advanced and well-established feature-rich text mode web (HTTP/FTP/..) browser. ELinks
💻 C
📖 第 1 页 / 共 5 页
字号:
	int namelen;	unsigned char *val, *e, *ee;	unsigned char *s, *ss, *eof;	unsigned char *start, *end;	unsigned char *onload_code=NULL;	int uv;	int bs;	if (!js_enable)return;	if (!fd->rq || !fd->rq->ce || !fd->f_data) return;	if (!jsint_get_source(fd, &ss, &eof)) {		if (get_file(fd->rq, &ss, &eof)) return;	}	d_opt = &fd->f_data->opt;	s = ss;	se:	while (s < eof && *s != '<') sp:s++;	if (s >= eof || fd->script_t < 0)	{		if (onload_code && fd->script_t != -1)		{			jsint_execute_code(fd,onload_code,strlen(onload_code),-1,-1,-1, NULL);		}		fd->script_t = -1;		goto ret;	}	if (s + 2 <= eof && (s[1] == '!' || s[1] == '?')) {		s = skip_comment(s, eof);		goto se;	}	if (parse_element(s, eof, &name, &namelen, &attr, &s)) goto sp;	if (!onload_code&&namelen==4&&!casecmp(name,"BODY",4))	{		onload_code=get_attr_val(attr,"onload");	/* if the element doesn't have onload attribute get_attr_val returns NULL */		goto se;	}			if (!onload_code&&namelen==3&&!casecmp(name,"IMG",3))	{		onload_code=get_attr_val(attr,"onload");	/* if the element doesn't have onload attribute get_attr_val returns NULL */		goto se;	}			if (namelen != 6 || casecmp(name, "SCRIPT", 6) || s - ss < fd->script_t) goto se;	start = end = NULL;	if ((val = get_attr_val(attr, "src"))) {		unsigned char *url;		if (fd->f_data->script_href_base && ((url = join_urls(fd->f_data->script_href_base, val)))) {			int code, version;			struct additional_file *af = request_additional_file(fd->f_data, url);			mem_free(url);			mem_free(val);			if (!af || !af->rq) goto se;			if (af->rq->state >= 0) goto ret;			if (!af->rq->ce) goto se;			if (!get_http_code(af->rq->ce->head, &code, &version)) {				if (code < 200 || code >= 300) goto se;			}			if (get_file(af->rq, &start, &end)) goto se;			if (start == end) goto se;		} else {			mem_free(val);			goto se;		}	}	e = s;	uv = 0;	bs = 0;	while (e < eof && *e != '<') {		es:		if (!uv && (*e == '"' || *e == '\'')) uv = *e, bs = 0;		else if (*e == '\\' && uv) bs = 1;		else if (*e == uv && !bs) uv = 0;		else bs = 0;		e++;	}	if (e + 8 <= eof) {		if (/*uv ||*/ casecmp(e, "</SCRIPT", 8)) goto es;	} else e = eof;	ee = e;	while (ee < eof && *ee != '>') ee++;	if (ee < eof) ee++;	fd->script_t = ee - ss;	if (!start || !end) jsint_execute_code(fd, s, e - s, eof - ee,-1,-1, NULL);	else jsint_execute_code(fd, start, end - start, eof - ee,-1,-1, NULL);	ret:	if (onload_code)mem_free(onload_code);	d_opt = &dd_opt;}struct hopla_mladej{	struct form_control *fc;	struct form_state *fs;};/* Returns pointer to the object with given ID in the document, or NULL when * there's no such object. Document must be a valid pointer. * * Pointer type depends on type of object, caller must know the type and * interpret the pointer in the right way. */void *jsint_find_object(struct f_data_c *document, long obj_id){	int type=obj_id&JS_OBJ_MASK;	int orig_obj_id=obj_id;	obj_id>>=JS_OBJ_MASK_SIZE;	switch (type)	{ 		/* form element		 * obj_id can be from 0 up to number of form fields		 * (document->vs->form_info_len may be actually lower if the fields were never		 * touched)		 * returns allocated struct hopla_mladej, you must free it after use		 */		case JS_OBJ_T_TEXT:		case JS_OBJ_T_PASSWORD:		case JS_OBJ_T_TEXTAREA:		case JS_OBJ_T_CHECKBOX:		case JS_OBJ_T_RADIO:		case JS_OBJ_T_SELECT:		case JS_OBJ_T_SUBMIT:		case JS_OBJ_T_RESET:		case JS_OBJ_T_HIDDEN:		case JS_OBJ_T_BUTTON:		{			struct hopla_mladej *hopla;			struct form_control *fc;			/*int n=document->vs->form_info_len;*/			int a=0;				if (obj_id<0/*||obj_id>=n*/)return NULL;			hopla=mem_alloc(sizeof(struct hopla_mladej));			if (!(document->f_data)){mem_free(hopla);return NULL;};			foreachback(fc,document->f_data->forms)				if (fc->g_ctrl_num==obj_id){a=1;break;}			if (!a){mem_free(hopla);return NULL;}			if (!(hopla->fs=find_form_state(document, fc))){mem_free(hopla);return NULL;}			hopla->fc=fc;			return hopla;		}				/* link 		 * obj_id can be from 0 to (nlinks-1)		 */		case JS_OBJ_T_LINK:		{			struct link*l;			int n;			if (!(document->f_data))return NULL;			l=document->f_data->links;			n=document->f_data->nlinks;				if (obj_id<0||obj_id>=n)return NULL;			return l+obj_id;		}				/* form		 * obj_id is form_num in struct form_control (f_data->forms)		 */		case JS_OBJ_T_FORM:		{			struct form_control *f;			if (!(document->f_data))return NULL;			foreachback(f, document->f_data->forms) if ((f->form_num)==obj_id)return f;			return NULL;		}				/* anchors		 * obj_id is position in list of all tags		 */		case JS_OBJ_T_ANCHOR:		{			struct tag *t;			int a=0;			if (!(document->f_data))return NULL;			foreach(t,document->f_data->tags)			{				if (obj_id==a)return t;				a++;			}			return NULL;		}		break;		/* this is document		 * call jsint_find_document		 * returned value is struct f_data_c		 */		case JS_OBJ_T_FRAME:		case JS_OBJ_T_DOCUMENT:		return jsint_find_document(orig_obj_id);		/* image		 * returned value is struct g_object_image *		 */		case JS_OBJ_T_IMAGE:#ifdef G		if (F)		{			struct xlist_head *fi;			if (!document->f_data)return NULL;			foreach(fi,document->f_data->images)			{				struct g_object_image *gi;				struct g_object_image goi;				gi = (struct g_object_image *)((char *)fi + ((char *)&goi - (char *)&(goi.image_list)));				if (gi->id==obj_id)return gi;			}			return NULL;		}else #endif		return NULL;		default:		internal("jsint_find_object: unknown type %d.",type);		return NULL;  /* never called, but GCC likes it ;-) */	}}long *add_id(long *field,int *len,long id){	long *p;	int a;	for (a=0;a<(*len);a++)	/* this object is already on the list */		if (field[a]==id)return field;		(*len)++;	if ((unsigned)*len > MAXINT / sizeof(long)) overalloc();	p=mem_realloc(field,(*len)*sizeof(long));	p[(*len)-1]=id;	return p;}long *add_fd_id(long *field,int *len,long fd,long id, unsigned char *name){	long *p;	int a;	for (a=0;a<(*len);a+=3)	/* this object is already on the list */		if (field[a]==fd&&field[a+1]==id)return field;			(*len)+=3;	if ((unsigned)*len > MAXINT / sizeof(long)) overalloc();	p=mem_realloc(field,(*len)*sizeof(long));	p[(*len)-3]=fd;	p[(*len)-2]=id;	p[(*len)-1]=(name&&(*name))?(long)stracpy(name):(long)NULL;	return p;}static long js_upcall_get_frame_id(void *data);/* finds all objects with name takhle_tomu_u_nas_nadavame * in fd and all it's subframes with rq==NULL * js_ctx is f_data_c of the accessing script */static long *find_in_subframes(struct f_data_c *js_ctx, struct f_data_c *fd, long *pole_vole, int *n_items, unsigned char *takhle_tomu_u_nas_nadavame){	struct f_data_c *ff;	struct form_control *f;#ifdef G	struct xlist_head *fi;#endif	/* search frame */	foreach(ff,fd->subframes)		if (ff->loc&&ff->loc->name&&!strcmp(ff->loc->name,takhle_tomu_u_nas_nadavame)&&jsint_can_access(js_ctx,ff))	/* to je on! */			if (!(pole_vole=add_id(pole_vole,n_items,js_upcall_get_frame_id(ff))))return NULL;	if (!(fd->f_data))goto a_je_po_ptakach;#ifdef G	if (F)	/* search images */	foreach(fi,fd->f_data->images)	{		struct g_object_image *gi;		struct g_object_image goi;		gi = (struct g_object_image *)((char *)fi + ((char *)(&goi) - (char *)(&(goi.image_list))));		if (gi->name&&!strcmp(gi->name, takhle_tomu_u_nas_nadavame))			if (!(pole_vole=add_id(pole_vole,n_items,JS_OBJ_T_IMAGE+((gi->id)<<JS_OBJ_MASK_SIZE))))return NULL;	}#endif	/* search forms */	foreachback(f,fd->f_data->forms)		if (f->form_name&&!strcmp(f->form_name,takhle_tomu_u_nas_nadavame))   /* tak tohle JE Jim Beam */			if (!(pole_vole=add_id(pole_vole,n_items,((f->form_num)<<JS_OBJ_MASK_SIZE)+JS_OBJ_T_FORM)))return NULL;	/* search form elements */	foreachback(f,fd->f_data->forms)		if (f->name&&!strcmp(f->name,takhle_tomu_u_nas_nadavame))   /* tak tohle JE Jim Beam */		{			long tak_mu_to_ukaz=0;			tak_mu_to_ukaz=(f->g_ctrl_num)<<JS_OBJ_MASK_SIZE;			switch (f->type)			{				case FC_TEXT:		tak_mu_to_ukaz|=JS_OBJ_T_TEXT; break;				case FC_PASSWORD:	tak_mu_to_ukaz|=JS_OBJ_T_PASSWORD; break;				case FC_TEXTAREA:	tak_mu_to_ukaz|=JS_OBJ_T_TEXTAREA; break;				case FC_CHECKBOX:	tak_mu_to_ukaz|=JS_OBJ_T_CHECKBOX; break;				case FC_RADIO:		tak_mu_to_ukaz|=JS_OBJ_T_RADIO; break;				case FC_IMAGE:				case FC_SELECT:		tak_mu_to_ukaz|=JS_OBJ_T_SELECT; break;				case FC_SUBMIT:		tak_mu_to_ukaz|=JS_OBJ_T_SUBMIT ; break;				case FC_RESET:		tak_mu_to_ukaz|=JS_OBJ_T_RESET ; break;				case FC_HIDDEN:		tak_mu_to_ukaz|=JS_OBJ_T_HIDDEN ; break;				case FC_BUTTON:		tak_mu_to_ukaz|=JS_OBJ_T_BUTTON ; break;				default: /* internal("Invalid form element type.\n"); */				tak_mu_to_ukaz=0;break;			}			if (tak_mu_to_ukaz&&!(pole_vole=add_id(pole_vole,n_items,tak_mu_to_ukaz)))return NULL;		}		a_je_po_ptakach:	/* find in all rq==NULL */	foreach(ff,fd->subframes)		if (!(ff->rq)) pole_vole=find_in_subframes(js_ctx,ff,pole_vole,n_items,takhle_tomu_u_nas_nadavame);		return pole_vole;}/* resolves name of an object, returns field of all ID's with the name * obj_id is object in which we're searching * takhle_tomu_u_nas_nadavame is the searched name * context is identifier of the javascript context * n_items is number of returned items * * on error returns NULL */long *jsint_resolve(void *context, long obj_id, char *takhle_tomu_u_nas_nadavame,int *n_items){	struct f_data_c *fd;	struct f_data_c *js_ctx=(struct f_data_c*)context;	long *pole_vole;	*n_items=0;	if (!takhle_tomu_u_nas_nadavame||!(*takhle_tomu_u_nas_nadavame))return NULL;	pole_vole=mem_alloc(sizeof(long));	switch(jsint_object_type(obj_id))	{		/* searched object can be a frame, image, form or a form element */		case JS_OBJ_T_DOCUMENT:		case JS_OBJ_T_FRAME:		fd=jsint_find_document(obj_id);		if (!fd||!(jsint_can_access(js_ctx,fd)))break;				pole_vole=find_in_subframes(js_ctx, fd, pole_vole, n_items, takhle_tomu_u_nas_nadavame);		break;			/* searched name can be a form element */		case JS_OBJ_T_FORM:			{			struct form_control *fc=jsint_find_object(js_ctx,obj_id);			struct form_control *f;			if (!fc){mem_free(pole_vole);return NULL;}			if (!(js_ctx->f_data)){mem_free(pole_vole);return NULL;}			foreachback(f,js_ctx->f_data->forms)			{				if (f->form_num==fc->form_num)	/* this form */					if (f->name&&!strcmp(f->name,takhle_tomu_u_nas_nadavame))   /* this IS Jim Beam */					{						long tak_mu_to_ukaz=0;						tak_mu_to_ukaz=(f->g_ctrl_num)<<JS_OBJ_MASK_SIZE;						switch (f->type)						{							case FC_TEXT:		tak_mu_to_ukaz|=JS_OBJ_T_TEXT; break;							case FC_PASSWORD:	tak_mu_to_ukaz|=JS_OBJ_T_PASSWORD; break;							case FC_TEXTAREA:	tak_mu_to_ukaz|=JS_OBJ_T_TEXTAREA; break;							case FC_CHECKBOX:	tak_mu_to_ukaz|=JS_OBJ_T_CHECKBOX; break;							case FC_RADIO:		tak_mu_to_ukaz|=JS_OBJ_T_RADIO; break;							case FC_IMAGE:							case FC_SELECT:		tak_mu_to_ukaz|=JS_OBJ_T_SELECT; break;							case FC_SUBMIT:		tak_mu_to_ukaz|=JS_OBJ_T_SUBMIT ; break;							case FC_RESET:		tak_mu_to_ukaz|=JS_OBJ_T_RESET ; break;							case FC_HIDDEN:		tak_mu_to_ukaz|=JS_OBJ_T_HIDDEN ; break;							case FC_BUTTON:		tak_mu_to_ukaz|=JS_OBJ_T_BUTTON ; break;							default: tak_mu_to_ukaz=0;break;							/* internal("Invalid form element type.\n"); */						}						if ((tak_mu_to_ukaz&JS_OBJ_MASK)&&!(pole_vole=add_id(pole_vole,n_items,tak_mu_to_ukaz)))return NULL;					}			}		}		break;	}	if (!pole_vole)return NULL;	if (!(*n_items)){mem_free(pole_vole);pole_vole=NULL;}	return pole_vole;}/*------------------------>>>>>>>> UPCALLS <<<<<<<<-------------------------*//* tyhle upcally se volaji ze select smycky:	void js_upcall_confirm(void *data)	void js_upcall_alert(void * data)	void js_upcall_close_window(void *data)	void js_upcall_get_string(void *data)	void js_upcall_goto_url(void * data)	void js_upcall_goto_history(void * data)	void js_upcall_set_image_src(void* data)V nich se musi volat js_spec_vykill_timer, aby se znicil timer, ktery upcallzavolal.Tyto upcally MUZOU dostavat f_data_c pointer primo, protoze kdyz ten f_data_cumre a s nim i ten JS, tak se timery znicej --- tudiz se nic nestane.*/static void redraw_document(struct f_data_c *f){	/*	if (F) {		f->xl = -1;		f->yl = -1;		draw_to_window(f->ses->win, (void (*)(struct terminal *, void *))draw_doc, f);	}	*/	draw_fd(f);}struct js_document_description *js_upcall_get_document_description(void *p, long doc_id){	struct js_document_description *js_doc;	struct f_data *f;	struct f_data_c *pfd = p;	struct f_data_c *fd;	fd = jsint_find_document(doc_id);	if (!fd || !fd->f_data || !jsint_can_access(pfd, fd)) return NULL;	f = fd->f_data;	if (f->js_doc) return f->js_doc;	js_doc = mem_calloc(sizeof(struct js_document_description));	/* Pro Martina: pridat sem prohlizeni f_data a vytvoreni struktury */	/* -------------- */	return f->js_doc = js_doc;}/* returns ID of a document with the javascript */long js_upcall_get_document_id(void *data){	struct f_data_c *fd;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -