mirror of
https://github.com/rkd77/elinks.git
synced 2024-12-04 14:46:47 -05:00
[quickjs] document.getElementsByClassName
Need to free strings.
This commit is contained in:
parent
851c9c6f61
commit
3daca597b5
@ -728,9 +728,9 @@ el_dom_html_collection_create(dom_html_document *doc,
|
|||||||
dom_node *root,
|
dom_node *root,
|
||||||
dom_callback_is_in_collection ic,
|
dom_callback_is_in_collection ic,
|
||||||
void *ctx,
|
void *ctx,
|
||||||
el_dom_html_collection **col)
|
struct el_dom_html_collection **col)
|
||||||
{
|
{
|
||||||
*col = (el_dom_html_collection *)malloc(sizeof(struct el_dom_html_collection));
|
*col = (struct el_dom_html_collection *)malloc(sizeof(struct el_dom_html_collection));
|
||||||
|
|
||||||
if (*col == NULL) {
|
if (*col == NULL) {
|
||||||
return DOM_NO_MEM_ERR;
|
return DOM_NO_MEM_ERR;
|
||||||
@ -750,7 +750,7 @@ get_elements_by_class_name(dom_html_document *doc, dom_node *node, char *classes
|
|||||||
if (!list) {
|
if (!list) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
el_dom_html_collection *col = NULL;
|
struct el_dom_html_collection *col = NULL;
|
||||||
dom_exception exc = el_dom_html_collection_create(doc, node, node_has_classes, list, &col);
|
dom_exception exc = el_dom_html_collection_create(doc, node, node_has_classes, list, &col);
|
||||||
|
|
||||||
if (exc != DOM_NO_ERR || !col) {
|
if (exc != DOM_NO_ERR || !col) {
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
void *map_collections;
|
void *map_collections;
|
||||||
void *map_rev_collections;
|
void *map_rev_collections;
|
||||||
|
|
||||||
|
JSClassID js_htmlCollection_class_id;
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
js_htmlCollection_GetOpaque(JSValueConst this_val)
|
js_htmlCollection_GetOpaque(JSValueConst this_val)
|
||||||
{
|
{
|
||||||
@ -47,6 +49,20 @@ js_htmlCollection_SetOpaque(JSValueConst this_val, void *node)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void js_htmlColection_finalizer(JSRuntime *rt, JSValue val)
|
||||||
|
{
|
||||||
|
#ifdef ECMASCRIPT_DEBUG
|
||||||
|
fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__);
|
||||||
|
#endif
|
||||||
|
REF_JS(val);
|
||||||
|
dom_html_collection *ns = (dom_html_collection *)(js_htmlCollection_GetOpaque(val));
|
||||||
|
|
||||||
|
if (ns) {
|
||||||
|
dom_html_collection_unref(ns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static JSValue
|
static JSValue
|
||||||
js_htmlCollection_get_property_length(JSContext *ctx, JSValueConst this_val)
|
js_htmlCollection_get_property_length(JSContext *ctx, JSValueConst this_val)
|
||||||
{
|
{
|
||||||
@ -292,6 +308,11 @@ static const JSCFunctionListEntry js_htmlCollection_proto_funcs[] = {
|
|||||||
JS_CFUNC_DEF("toString", 0, js_htmlCollection_toString)
|
JS_CFUNC_DEF("toString", 0, js_htmlCollection_toString)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static JSClassDef js_htmlCollection_class = {
|
||||||
|
"htmlCollection",
|
||||||
|
.finalizer = js_htmlColection_finalizer
|
||||||
|
};
|
||||||
|
|
||||||
JSValue
|
JSValue
|
||||||
getCollection(JSContext *ctx, void *node)
|
getCollection(JSContext *ctx, void *node)
|
||||||
{
|
{
|
||||||
@ -311,12 +332,19 @@ getCollection(JSContext *ctx, void *node)
|
|||||||
|
|
||||||
RETURN_JS(r);
|
RETURN_JS(r);
|
||||||
}
|
}
|
||||||
JSValue htmlCollection_obj = JS_NewArray(ctx);
|
/* nodelist class */
|
||||||
JS_SetPropertyFunctionList(ctx, htmlCollection_obj, js_htmlCollection_proto_funcs, countof(js_htmlCollection_proto_funcs));
|
JS_NewClassID(&js_htmlCollection_class_id);
|
||||||
js_htmlCollection_SetOpaque(htmlCollection_obj, node);
|
JS_NewClass(JS_GetRuntime(ctx), js_htmlCollection_class_id, &js_htmlCollection_class);
|
||||||
js_htmlCollection_set_items(ctx, htmlCollection_obj, node);
|
JSValue proto = JS_NewArray(ctx);
|
||||||
attr_save_in_map(map_collections, node, htmlCollection_obj);
|
REF_JS(proto);
|
||||||
JSValue rr = JS_DupValue(ctx, htmlCollection_obj);
|
|
||||||
|
JS_SetPropertyFunctionList(ctx, proto, js_htmlCollection_proto_funcs, countof(js_htmlCollection_proto_funcs));
|
||||||
|
JS_SetClassProto(ctx, js_htmlCollection_class_id, proto);
|
||||||
|
|
||||||
|
js_htmlCollection_SetOpaque(proto, node);
|
||||||
|
js_htmlCollection_set_items(ctx, proto, node);
|
||||||
|
attr_save_in_map(map_collections, node, proto);
|
||||||
|
JSValue rr = JS_DupValue(ctx, proto);
|
||||||
|
|
||||||
RETURN_JS(rr);
|
RETURN_JS(rr);
|
||||||
}
|
}
|
||||||
|
@ -105,7 +105,6 @@ js_document_get_property_anchors(JSContext *ctx, JSValueConst this_val)
|
|||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
JSValue rr = getCollection(ctx, anchors);
|
JSValue rr = getCollection(ctx, anchors);
|
||||||
JS_FreeValue(ctx, rr);
|
|
||||||
dom_node_unref(doc);
|
dom_node_unref(doc);
|
||||||
|
|
||||||
RETURN_JS(rr);
|
RETURN_JS(rr);
|
||||||
@ -509,7 +508,6 @@ js_document_get_property_images(JSContext *ctx, JSValueConst this_val)
|
|||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
JSValue rr = getCollection(ctx, images);
|
JSValue rr = getCollection(ctx, images);
|
||||||
JS_FreeValue(ctx, rr);
|
|
||||||
dom_node_unref(doc);
|
dom_node_unref(doc);
|
||||||
|
|
||||||
RETURN_JS(rr);
|
RETURN_JS(rr);
|
||||||
@ -549,7 +547,6 @@ js_document_get_property_links(JSContext *ctx, JSValueConst this_val)
|
|||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
JSValue rr = getCollection(ctx, links);
|
JSValue rr = getCollection(ctx, links);
|
||||||
JS_FreeValue(ctx, rr);
|
|
||||||
dom_node_unref(doc);
|
dom_node_unref(doc);
|
||||||
|
|
||||||
RETURN_JS(rr);
|
RETURN_JS(rr);
|
||||||
@ -1461,44 +1458,27 @@ js_document_getElementsByClassName(JSContext *ctx, JSValueConst this_val, int ar
|
|||||||
fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__);
|
fprintf(stderr, "%s:%s\n", __FILE__, __FUNCTION__);
|
||||||
#endif
|
#endif
|
||||||
REF_JS(this_val);
|
REF_JS(this_val);
|
||||||
|
dom_html_document *doc = (struct dom_html_document *)js_doc_getopaque(this_val, js_document_class_id);
|
||||||
|
|
||||||
if (argc != 1) {
|
if (!doc) {
|
||||||
return JS_FALSE;
|
|
||||||
}
|
|
||||||
struct ecmascript_interpreter *interpreter = (struct ecmascript_interpreter *)JS_GetContextOpaque(ctx);
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
return JS_NULL;
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
xmlpp::Document *docu = (xmlpp::Document *)document->dom;
|
|
||||||
xmlpp::Element* root = (xmlpp::Element *)docu->get_root_node();
|
|
||||||
|
|
||||||
const char *str;
|
|
||||||
size_t len;
|
|
||||||
|
|
||||||
str = JS_ToCStringLen(ctx, &len, argv[0]);
|
|
||||||
|
|
||||||
if (!str) {
|
|
||||||
return JS_EXCEPTION;
|
|
||||||
}
|
|
||||||
xmlpp::ustring id = str;
|
|
||||||
JS_FreeCString(ctx, str);
|
|
||||||
|
|
||||||
xmlpp::ustring xpath = "//*[@class=\"";
|
|
||||||
xpath += id;
|
|
||||||
xpath += "\"]";
|
|
||||||
xmlpp::Node::NodeSet *elements = new(std::nothrow) xmlpp::Node::NodeSet;
|
|
||||||
|
|
||||||
if (!elements) {
|
|
||||||
return JS_NULL;
|
return JS_NULL;
|
||||||
}
|
}
|
||||||
*elements = root->find(xpath);
|
|
||||||
JSValue rr = getCollection(ctx, elements);
|
|
||||||
JS_FreeValue(ctx, rr);
|
|
||||||
|
|
||||||
RETURN_JS(rr);
|
if (argc != 1) {
|
||||||
#endif
|
return JS_NULL;
|
||||||
|
}
|
||||||
|
const char *classes = JS_ToCString(ctx, argv[0]);
|
||||||
|
dom_html_collection *col = get_elements_by_class_name(doc, (dom_node *)doc, classes);
|
||||||
|
|
||||||
|
if (classes) {
|
||||||
|
JS_FreeCString(ctx, classes);
|
||||||
|
}
|
||||||
|
if (!col) {
|
||||||
|
return JS_NULL;
|
||||||
|
}
|
||||||
|
JSValue ret = getCollection(ctx, col);
|
||||||
|
|
||||||
|
RETURN_JS(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static JSValue
|
static JSValue
|
||||||
@ -1853,7 +1833,7 @@ static const JSCFunctionListEntry js_document_proto_funcs[] = {
|
|||||||
JS_CFUNC_DEF("removeEventListener", 3, js_document_removeEventListener),
|
JS_CFUNC_DEF("removeEventListener", 3, js_document_removeEventListener),
|
||||||
JS_CFUNC_DEF("replace", 2, js_document_replace),
|
JS_CFUNC_DEF("replace", 2, js_document_replace),
|
||||||
JS_CFUNC_DEF("getElementById", 1, js_document_getElementById),
|
JS_CFUNC_DEF("getElementById", 1, js_document_getElementById),
|
||||||
// JS_CFUNC_DEF("getElementsByClassName", 1, js_document_getElementsByClassName),
|
JS_CFUNC_DEF("getElementsByClassName", 1, js_document_getElementsByClassName),
|
||||||
// JS_CFUNC_DEF("getElementsByName", 1, js_document_getElementsByName),
|
// JS_CFUNC_DEF("getElementsByName", 1, js_document_getElementsByName),
|
||||||
JS_CFUNC_DEF("getElementsByTagName", 1, js_document_getElementsByTagName),
|
JS_CFUNC_DEF("getElementsByTagName", 1, js_document_getElementsByTagName),
|
||||||
JS_CFUNC_DEF("querySelector", 1, js_document_querySelector),
|
JS_CFUNC_DEF("querySelector", 1, js_document_querySelector),
|
||||||
|
Loading…
Reference in New Issue
Block a user