📄 jsint.c
字号:
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 + -