📄 dom_smjs.c
字号:
GF_SceneGraph *sg = JS_GetPrivate(c, obj); node = sg->RootNode; } else if (JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) { node = JS_GetPrivate(c, obj); } /*FIXME - SVG uDOM conection not supported yet*/ else { } if (!node) return JS_FALSE; if (argc==4) { if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; inNS = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); of = 1; } if (!JSVAL_IS_STRING(argv[of])) return JS_FALSE; type = JS_GetStringBytes(JSVAL_TO_STRING(argv[of])); callback = NULL; if (JSVAL_IS_STRING(argv[of+1])) { callback = JS_GetStringBytes(JSVAL_TO_STRING(argv[of+1])); } else if (JSVAL_IS_OBJECT(argv[of+1])) { JSFunction *fun = JS_ValueToFunction(c, argv[of+1]); if (!fun) return JS_FALSE; callback = (char *) JS_GetFunctionName(fun); } if(!callback) return JS_FALSE; evtType = gf_dom_event_type_by_name(type); if (evtType==GF_EVENT_UNKNOWN) return JS_FALSE; listener = gf_node_new(node->sgprivate->scenegraph, TAG_SVG_listener); handler = (SVG_handlerElement *) gf_node_new(node->sgprivate->scenegraph, TAG_SVG_handler); gf_node_register(listener, node); gf_node_list_add_child(& ((GF_ParentNode *)node)->children, listener); gf_node_register((GF_Node *)handler, node); gf_node_list_add_child(& ((GF_ParentNode *)node)->children, (GF_Node*)handler); /*create attributes if needed*/ gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_event, 1, 0, &info); ((XMLEV_Event*)info.far_ptr)->type = evtType; gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_handler, 1, 0, &info); ((XMLRI*)info.far_ptr)->target = (GF_Node*)handler; gf_svg_get_attribute_by_tag(listener, TAG_SVG_ATT_listener_target, 1, 0, &info); ((XMLRI*)info.far_ptr)->target = node; gf_svg_get_attribute_by_tag((GF_Node*)handler, TAG_SVG_ATT_ev_event, 1, 0, &info); ((XMLEV_Event*)info.far_ptr)->type = evtType; gf_dom_add_text_node((GF_Node *)handler, strdup(callback)); handler->handle_event = gf_sg_handle_dom_event; /*don't add listener directly, post it and wait for event processing*/ gf_dom_listener_post_add((GF_Node *) node, listener); return JS_TRUE;}JSBool dom_event_remove_listener(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ char *type, *callback; u32 of = 0; u32 evtType, i, count; char *inNS = NULL; GF_Node *node = NULL; if (JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) { GF_SceneGraph *sg = JS_GetPrivate(c, obj); node = sg->RootNode; } else if (JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) { node = JS_GetPrivate(c, obj); } /*FIXME - SVG uDOM conection not supported yet*/ else { } if (!node || !node->sgprivate->interact || !node->sgprivate->interact->events) return JS_FALSE; if (argc==4) { if (!JSVAL_IS_STRING(argv[0])) return JS_FALSE; inNS = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); of = 1; } if (!JSVAL_IS_STRING(argv[of])) return JS_FALSE; type = JS_GetStringBytes(JSVAL_TO_STRING(argv[of])); callback = NULL; if (JSVAL_IS_STRING(argv[of+1])) { callback = JS_GetStringBytes(JSVAL_TO_STRING(argv[of+1])); } else if (JSVAL_IS_OBJECT(argv[of+1])) { JSFunction *fun = JS_ValueToFunction(c, argv[of+1]); if (!fun) return JS_FALSE; callback = (char *) JS_GetFunctionName(fun); } if(!callback) return JS_FALSE; evtType = gf_dom_event_type_by_name(type); if (evtType==GF_EVENT_UNKNOWN) return JS_FALSE; count = gf_list_count(node->sgprivate->interact->events); for (i=0; i<count; i++) { GF_FieldInfo info; GF_DOMText *txt; SVG_handlerElement *hdl; GF_Node *el = gf_dom_listener_get(node, i); gf_svg_get_attribute_by_tag(el, TAG_SVG_ATT_event, 0, 0, &info); if (!info.far_ptr) continue; if (((XMLEV_Event*)info.far_ptr)->type != evtType) continue; gf_svg_get_attribute_by_tag(el, TAG_SVG_ATT_handler, 0, 0, &info); if (!info.far_ptr) continue; hdl = (SVG_handlerElement *) ((XMLRI*)info.far_ptr)->target; if (!hdl) continue; txt = (GF_DOMText *) hdl->children->node; if (txt->sgprivate->tag != TAG_DOMText) continue; if (!txt->textContent || strcmp(txt->textContent, callback)) continue; gf_dom_listener_del(node, el); gf_node_list_del_child( & ((GF_ParentNode *)node)->children, (GF_Node *) hdl); gf_node_unregister((GF_Node *) hdl, node); gf_node_list_del_child( & ((GF_ParentNode *)node)->children, el); gf_node_unregister(el, node); return JS_TRUE; } return JS_FALSE;}/*dom3 node*/static void dom_node_finalize(JSContext *c, JSObject *obj){ if (JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) || JS_InstanceOf(c, obj, &dom_rt->domTextClass, NULL) || JS_InstanceOf(c, obj, &dom_rt->domNodeClass, NULL) ) { GF_Node *n = (GF_Node *) JS_GetPrivate(c, obj); /*the JS proto of the svgClass or a destroyed object*/ if (!n) return; gf_list_del_item(n->sgprivate->scenegraph->objects, obj); dom_unregister_node(n); }}static void dom_node_inserted(GF_Node *par, GF_Node *n, s32 pos){ GF_ParentNode *old_par; Bool do_init = 0; /*if node is already in graph, remove it from its parent*/ old_par = (GF_ParentNode*)gf_node_get_parent(n, 0); if (old_par) { /*prevent destruction when removing node*/ n->sgprivate->num_instances++; gf_node_list_del_child(&old_par->children, n); gf_node_unregister(n, (GF_Node*)old_par); n->sgprivate->num_instances--; } else { do_init = n->sgprivate->UserCallback ? 0 : 1; } if (pos<0) gf_node_list_add_child( & ((GF_ParentNode *)par)->children, n); else gf_node_list_insert_child( & ((GF_ParentNode *)par)->children, n, (u32) pos); gf_node_register(n, par); if (do_init) { gf_node_init(n); if (n->sgprivate->interact && n->sgprivate->interact->events) { GF_DOM_Event evt; memset(&evt, 0, sizeof(GF_DOM_Event)); evt.type = GF_EVENT_LOAD; gf_dom_event_fire(n, NULL, &evt); } } /*node is being re-inserted, activate it in case*/ if (!old_par) gf_node_activate(n); dom_node_changed(par, 1, NULL);}static JSBool xml_node_insert_before(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; s32 idx; u32 tag; GF_Node *n, *target, *new_node; GF_ParentNode *par; if (!argc || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; new_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), &is_doc); if (!new_node || is_doc) return JS_FALSE; target = NULL; if ((argc==2) && JSVAL_IS_OBJECT(argv[1])) { target = dom_get_node(c, JSVAL_TO_OBJECT(argv[1]), &is_doc); if (!target || is_doc) return JS_FALSE; } tag = gf_node_get_tag(n); if (tag==TAG_DOMText) return JS_FALSE; par = (GF_ParentNode*)n; idx = -1; if (target) idx = gf_node_list_find_child(par->children, target); dom_node_inserted(n, new_node, idx); *rval = argv[0]; return JS_TRUE;}static JSBool xml_node_append_child(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; u32 tag; GF_Node *n, *new_node; if (!argc || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; new_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), &is_doc); if (!new_node || is_doc) return JS_FALSE; tag = gf_node_get_tag(n); if (tag==TAG_DOMText) return JS_FALSE; dom_node_inserted(n, new_node, -1); *rval = argv[0]; return JS_TRUE;}static JSBool xml_node_replace_child(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; s32 idx; u32 tag; GF_Node *n, *new_node, *old_node; GF_ParentNode *par; if ((argc!=2) || !JSVAL_IS_OBJECT(argv[0]) || !JSVAL_IS_OBJECT(argv[1])) return JS_FALSE; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; new_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), &is_doc); if (!new_node || is_doc) return JS_FALSE; old_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[1]), &is_doc); if (!old_node || is_doc) return JS_FALSE; tag = gf_node_get_tag(n); if (tag==TAG_DOMText) return JS_FALSE; par = (GF_ParentNode*)n; idx = gf_node_list_find_child(par->children, old_node); if (idx<0) return JS_FALSE; gf_node_list_del_child(&par->children, old_node); gf_node_unregister(old_node, n); dom_node_inserted(n, new_node, -1); *rval = argv[0]; return JS_TRUE;}static JSBool xml_node_remove_child(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; u32 tag; GF_Node *n, *old_node; GF_ParentNode *par; if (!argc || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; old_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), &is_doc); if (!old_node || is_doc) return JS_FALSE; tag = gf_node_get_tag(n); if (tag==TAG_DOMText) return JS_FALSE; par = (GF_ParentNode*)n; /*if node is present in parent, unregister*/ if (gf_node_list_del_child(&par->children, old_node)) { gf_node_unregister(old_node, n); } /*deactivate node sub-tree*/ gf_node_deactivate(old_node); *rval = argv[0]; dom_node_changed(n, 1, NULL); return JS_TRUE;}static JSBool xml_node_has_children(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; GF_Node *n; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; *rval = BOOLEAN_TO_JSVAL( ((GF_ParentNode*)n)->children ? JS_TRUE : JS_FALSE ); return JS_TRUE;}static JSBool xml_node_has_attributes(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; u32 tag; GF_Node *n; n = dom_get_node(c, obj, &is_doc); if (!n || is_doc) return JS_FALSE; tag = gf_node_get_tag(n); if (tag>=GF_NODE_FIRST_DOM_NODE_TAG) { *rval = BOOLEAN_TO_JSVAL( ((GF_DOMNode*)n)->attributes ? JS_TRUE : JS_FALSE ); } else { /*not supported for other node types*/ *rval = BOOLEAN_TO_JSVAL( JS_FALSE ); } return JS_TRUE;}static JSBool xml_node_is_same_node(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ Bool is_doc; GF_Node *n, *a_node; if (!argc || !JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, &is_doc); if (!n) return JS_FALSE; a_node = dom_get_node(c, JSVAL_TO_OBJECT(argv[0]), &is_doc); if (!a_node) return JS_FALSE; *rval = BOOLEAN_TO_JSVAL( (a_node==n) ? JS_TRUE : JS_FALSE); return JS_TRUE;}static JSBool dom_node_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ u32 tag; Bool is_doc; GF_Node *n; GF_ParentNode *par; n = dom_get_node(c, obj, &is_doc); if (!n) return JS_FALSE; if (!JSVAL_IS_INT(id)) return JS_TRUE; tag = gf_node_get_tag(n); par = (GF_ParentNode*)n; switch (JSVAL_TO_INT(id)) { /*"nodeName"*/ case 0: if (tag==TAG_DOMText) { GF_DOMText *txt = (GF_DOMText *)n; if (txt->is_cdata) *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "#cdata-section") ); else *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "#text") ); } else if (is_doc) { *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "#document") ); } else { *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, gf_node_get_class_name(n) ) ); } return JS_TRUE; /*"nodeValue"*/ case 1: *vp = JSVAL_VOID; return JS_TRUE; /*"nodeType"*/ case 2: if (tag==TAG_DOMText) { GF_DOMText *txt = (GF_DOMText *)n; if (txt->is_cdata) *vp = INT_TO_JSVAL(4); else *vp = INT_TO_JSVAL(3); } else if (is_doc) *vp = INT_TO_JSVAL(9); else *vp = INT_TO_JSVAL(1); return JS_TRUE; /*"parentNode"*/ case 3: if (is_doc) { *vp = JSVAL_VOID; } else { *vp = dom_node_construct(c, gf_node_get_parent(n, 0) ); } return JS_TRUE; /*"childNodes"*/ case 4: if (tag==TAG_DOMText) *vp = JSVAL_VOID; else *vp = dom_nodelist_construct(c, par); return JS_TRUE; /*"firstChild"*/ case 5: if (tag==TAG_DOMText) *vp = JSVAL_VOID; else if (!par->children) { /*our imp always remove empty text node, create one*/ /* GF_DOMText *txt = gf_dom_add_text_node(n, NULL); *vp = dom_node_construct(c, (GF_Node*)txt); */ /*svg uDOM*/ *vp = JSVAL_VOID; } else *vp = dom_node_construct(c, par->children->node); return JS_TRUE; /*"lastChild"*/ case 6: if ((tag==TAG_DOMText) || !par->children) *vp = JSVAL_VOID; else *vp = dom_node_construct(c, gf_node_list_get_child(par->children, -1) ); return JS_TRUE; /*"previousSibling"*/ case 7: *vp = dom_node_get_sibling(c, n, 1); return JS_TRUE; /*"nextSibling"*/ case 8: *vp = dom_node_get_sibling(c, n, 0); return JS_TRUE; /*"attributes"*/ case 9: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"ownerDocument"*/ case 10: *vp = dom_document_construct(c, n->sgprivate->scenegraph); return JS_TRUE; /*"namespaceURI"*/ case 11: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"prefix"*/ case 12: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"localName"*/ case 13: if (tag!=TAG_DOMText) { *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, gf_node_get_class_name(n) ) ); } else { *vp = JSVAL_VOID; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -