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

📄 dom_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -