📄 dom_smjs.c
字号:
return JS_TRUE; /*"baseURI"*/ case 14: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"textContent"*/ case 15: { char *res = dom_flatten_text(n); *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, res) ); free(res); } return JS_TRUE; } /*not supported*/ return JS_FALSE;}static JSBool dom_node_setProperty(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)) { /*"nodeValue"*/ case 1: /*we only support element and sg in the Node interface, no set*/ return JS_FALSE; /*"prefix"*/ case 12: /*NOT SUPPORTED YET*/ return JS_TRUE; /*"textContent"*/ case 15: if (!JSVAL_IS_STRING(*vp)) return JS_FALSE; /*reset all children*/ gf_node_unregister_children(n, par->children); par->children = NULL; gf_dom_add_text_node(n, strdup( JS_GetStringBytes(JSVAL_TO_STRING(*vp)) ) ); dom_node_changed(n, 1, NULL); return JS_TRUE; } /*not supported*/ return JS_FALSE;}/*dom3 document*//*don't attempt to do anything with the scenegraph, it may be destroyedfortunately a sg cannot be created like that...*/static void dom_document_finalize(JSContext *c, JSObject *obj){ GF_SceneGraph *sg; if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return; sg = (GF_SceneGraph*) JS_GetPrivate(c, obj); /*the JS proto of the svgClass or a destroyed object*/ if (!sg) return; sg->document = NULL; gf_node_unregister(sg->RootNode, NULL); if (sg->reference_count) { sg->reference_count--; if (!sg->reference_count) gf_sg_del(sg); }}static JSBool dom_document_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ Bool is_doc; u32 prop_id; GF_Node *n = dom_get_node(c, obj, &is_doc); if (!n || !is_doc) return JS_FALSE; if (!JSVAL_IS_INT(id)) return JS_TRUE; prop_id = JSVAL_TO_INT(id); if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_getProperty(c, obj, id, vp); switch (prop_id) { /*"doctype"*/ case JS_DOM3_NODE_LAST_PROP+1: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*implementation - FIXME, this is wrong, we should have our own implementation but at the current time we rely on the global object to provide it*/ case JS_DOM3_NODE_LAST_PROP+2: *vp = OBJECT_TO_JSVAL( JS_GetGlobalObject(c) ); return JS_TRUE; /*"documentElement"*/ case JS_DOM3_NODE_LAST_PROP+3: *vp = dom_element_construct(c, n); return JS_TRUE; /*"inputEncoding"*/ case JS_DOM3_NODE_LAST_PROP+4: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"xmlEncoding"*/ case JS_DOM3_NODE_LAST_PROP+5: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"xmlStandalone"*/ case JS_DOM3_NODE_LAST_PROP+6: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"xmlVersion"*/ case JS_DOM3_NODE_LAST_PROP+7: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"strictErrorChecking"*/ case JS_DOM3_NODE_LAST_PROP+8: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"documentURI"*/ case JS_DOM3_NODE_LAST_PROP+9: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*"domConfig"*/ case JS_DOM3_NODE_LAST_PROP+10: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; /*global*/ case JS_DOM3_NODE_LAST_PROP+11: *vp = OBJECT_TO_JSVAL( JS_GetGlobalObject(c) ); return JS_TRUE; } return JS_FALSE;}static JSBool dom_document_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ u32 prop_id; Bool is_doc; GF_Node *n = dom_get_node(c, obj, &is_doc); if (!n || !is_doc) return JS_FALSE; if (!JSVAL_IS_INT(id)) return JS_TRUE; prop_id = JSVAL_TO_INT(id); if (id<=JS_DOM3_NODE_LAST_PROP) return dom_node_setProperty(c, obj, id, vp); switch (prop_id) { /*"xmlStandalone"*/ case JS_DOM3_NODE_LAST_PROP+6: break; /*"xmlVersion"*/ case JS_DOM3_NODE_LAST_PROP+7: break; /*"strictErrorChecking"*/ case JS_DOM3_NODE_LAST_PROP+8: break; /*"documentURI"*/ case JS_DOM3_NODE_LAST_PROP+9: break; /*"domConfig"*/ case JS_DOM3_NODE_LAST_PROP+10: break; /*the rest is read-only*/ } return JS_FALSE;}static JSBool xml_document_create_element(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ u32 tag; GF_Node *n; GF_SceneGraph *sg; char *name; if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) || !argc || !JSVAL_IS_STRING(argv[0]) ) return JS_FALSE; sg = (GF_SceneGraph *) JS_GetPrivate(c, obj); if (!sg) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); if (!name) return JS_FALSE; /*NS version*/ if (argc==2) { if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); } if (!name) return JS_FALSE; /*browse all our supported DOM implementations*/ tag = gf_svg_get_element_tag(name); if (!tag) tag = TAG_DOMFullNode; n = gf_node_new(sg, tag); *rval = dom_element_construct(c, n); return JS_TRUE;}static JSBool xml_document_create_text(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Node *n; GF_SceneGraph *sg; if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE; sg = (GF_SceneGraph *) JS_GetPrivate(c, obj); if (!sg) return JS_FALSE; n = gf_node_new(sg, TAG_DOMText); if (argc) { ((GF_DOMText*)n)->textContent = strdup( JS_GetStringBytes(JS_ValueToString(c, argv[0])) ); } *rval = dom_text_construct(c, n); return JS_TRUE;}static void xml_doc_gather_nodes(GF_ParentNode *node, char *name, DOMNodeList *nl){ Bool bookmark = 1; GF_ChildNodeItem *child; const char *node_name; if (!node) return; if (name) { node_name = gf_node_get_class_name((GF_Node*)node); if (strcmp(node_name, name)) bookmark = 0; } if (bookmark) { gf_node_register((GF_Node*)node, NULL); if (node->sgprivate->scenegraph->reference_count) node->sgprivate->scenegraph->reference_count++; gf_node_list_add_child(&nl->child, (GF_Node*)node); } if (node->sgprivate->tag<GF_NODE_FIRST_PARENT_NODE_TAG) return; child = node->children; while (child) { xml_doc_gather_nodes((GF_ParentNode*)child->node, name, nl); child = child->next; }}static JSBool xml_document_elements_by_tag(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ DOMNodeList *nl; GF_SceneGraph *sg; JSObject *new_obj; char *name; if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE; sg = (GF_SceneGraph *) JS_GetPrivate(c, obj); if (!sg) return JS_FALSE; if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); /*NS version*/ if (argc==2) { if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); } GF_SAFEALLOC(nl, DOMNodeList); if (name && !strcmp(name, "*")) name = NULL; xml_doc_gather_nodes((GF_ParentNode*)sg->RootNode, name, nl); new_obj = JS_NewObject(c, &dom_rt->domNodeListClass, 0, 0); JS_SetPrivate(c, new_obj, nl); *rval = OBJECT_TO_JSVAL(new_obj); return JS_TRUE;}static JSBool xml_document_element_by_id(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Node *n; GF_SceneGraph *sg; char *id; if (!JS_InstanceOf(c, obj, &dom_rt->domDocumentClass, NULL) ) return JS_FALSE; sg = (GF_SceneGraph *) JS_GetPrivate(c, obj); if (!sg) return JS_FALSE; if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE; id = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); n = gf_sg_find_node_by_name(sg, id); *rval = dom_element_construct(c, n); return JS_TRUE;}/*dom3 element*/static JSBool dom_element_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ u32 prop_id; Bool is_doc; GF_Node *n; if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE; if (!JSVAL_IS_INT(id)) return JS_TRUE; prop_id = JSVAL_TO_INT(id); if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_getProperty(c, obj, id, vp); n = dom_get_node(c, obj, &is_doc); switch (prop_id) { /*"tagName"*/ case JS_DOM3_NODE_LAST_PROP+1: *vp = STRING_TO_JSVAL( JS_NewStringCopyZ(c, gf_node_get_class_name(n) ) ); return JS_TRUE; /*"schemaTypeInfo"*/ case JS_DOM3_NODE_LAST_PROP+2: /*NOT SUPPORTED YET*/ *vp = JSVAL_VOID; return JS_TRUE; case JS_DOM3_NODE_LAST_PROP+3: case JS_DOM3_NODE_LAST_PROP+4: case JS_DOM3_NODE_LAST_PROP+5: case JS_DOM3_NODE_LAST_PROP+6: case JS_DOM3_NODE_LAST_PROP+7: case JS_DOM3_NODE_LAST_PROP+8: case JS_DOM3_NODE_LAST_PROP+9: case JS_DOM3_NODE_LAST_PROP+10: return svg_udom_get_property(c, n, prop_id-(JS_DOM3_NODE_LAST_PROP+3), vp); } return JS_FALSE;}static JSBool dom_element_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ u32 prop_id; if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE; if (!JSVAL_IS_INT(id)) return JS_TRUE; prop_id = JSVAL_TO_INT(id); if (prop_id<=JS_DOM3_NODE_LAST_PROP) return dom_node_setProperty(c, obj, id, vp); switch (prop_id) { case JS_DOM3_NODE_LAST_PROP+3: case JS_DOM3_NODE_LAST_PROP+4: case JS_DOM3_NODE_LAST_PROP+5: case JS_DOM3_NODE_LAST_PROP+6: case JS_DOM3_NODE_LAST_PROP+7: case JS_DOM3_NODE_LAST_PROP+8: case JS_DOM3_NODE_LAST_PROP+9: return svg_udom_set_property(c, dom_get_node(c, obj, NULL), prop_id-(JS_DOM3_NODE_LAST_PROP+3), vp); default: /*rest is read only*/ return JS_FALSE; }}static JSBool xml_element_get_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Node *n; char *name; if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE; if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, NULL); name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); /*NS version*/ if (argc==2) { if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); } if (!name) return JS_FALSE; if (n->sgprivate->tag==TAG_DOMFullNode) { GF_DOMFullNode *node = (GF_DOMFullNode*)n; GF_DOMFullAttribute *att = (GF_DOMFullAttribute*)node->attributes; while (att) { if ((att->tag==TAG_DOM_ATTRIBUTE_FULL) && !strcmp(att->name, name)) { *rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, (char*)att->data ) ); return JS_TRUE; } att = (GF_DOMFullAttribute *) att->next; } } else if (n->sgprivate->tag<=GF_NODE_RANGE_LAST_SVG) { GF_FieldInfo info; if (gf_svg_get_attribute_by_name(n, name, 0, 0, &info)==GF_OK) { char szAtt[4096]; gf_svg_dump_attribute(n, &info, szAtt); *rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, szAtt) ); return JS_TRUE; } } *rval = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") ); return JS_TRUE;}static JSBool xml_element_has_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ GF_Node *n; char *name; if (!JS_InstanceOf(c, obj, &dom_rt->domElementClass, NULL) ) return JS_FALSE; if (!argc || !JSVAL_IS_STRING(argv[0])) return JS_FALSE; n = dom_get_node(c, obj, NULL); name = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])); /*NS version*/ if (argc==2) { if (!JSVAL_IS_STRING(argv[1])) return JS_FALSE; name = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])); } if (!name) return JS_FALSE; if (n->sgprivate->tag==TAG_DOMFullNode) { GF_DOMFullNode *node = (GF_DOMFullNode*)n; GF_DOMFullAttribute *att = (GF_DOMFullAttribute*)node->attributes; while (att) { if ((att->tag==TAG_DOM_ATTRIBUTE_FULL) && !strcmp(att->name, name)) { *rval = BOOLEAN_TO_JSVAL(JS_TRUE); return JS_TRUE; } att = (GF_DOMFullAttribute *) att->next; } } else if (n->sgprivate->tag<=GF_NODE_RANGE_LAST_SVG) { GF_FieldInfo info; if (gf_svg_get_attribute_by_name(n, name, 0, 0, &info)==GF_OK) { *rval = BOOLEAN_TO_JSVAL(JS_TRUE); return JS_TRUE; } } *rval = BOOLEAN_TO_JSVAL(JS_FALSE); return JS_TRUE;}static JSBool xml_element_remove_attribute(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ u32 tag; GF_DOMFullNode *node; GF_DOMFullAttribute *prev, *att;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -