1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-10-27 08:00:32 -04:00

DOM TR,TD: register/unregister cell.

This commit is contained in:
Witold Filipczyk 2007-06-13 11:57:29 +02:00 committed by Witold Filipczyk
parent f00433f233
commit fd1dcfd781
3 changed files with 72 additions and 4 deletions

View File

@ -7,6 +7,7 @@
#include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey.h"
#include "document/dom/ecmascript/spidermonkey/Node.h" #include "document/dom/ecmascript/spidermonkey/Node.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableCellElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLTableCellElement.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableRowElement.h"
#include "dom/node.h" #include "dom/node.h"
static JSBool static JSBool
@ -185,6 +186,7 @@ make_TD_object(JSContext *ctx, struct dom_node *node)
node->data.element.html_data = mem_calloc(1, sizeof(struct TD_struct)); node->data.element.html_data = mem_calloc(1, sizeof(struct TD_struct));
if (node->data.element.html_data) { if (node->data.element.html_data) {
node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLTableCellElement_class, o->HTMLElement_object, NULL); node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLTableCellElement_class, o->HTMLElement_object, NULL);
register_cell(node);
} }
} }
@ -193,6 +195,7 @@ done_TD_object(struct dom_node *node)
{ {
struct TD_struct *d = node->data.element.html_data; struct TD_struct *d = node->data.element.html_data;
unregister_cell(node);
mem_free_if(d->abbr); mem_free_if(d->abbr);
mem_free_if(d->align); mem_free_if(d->align);
mem_free_if(d->axis); mem_free_if(d->axis);

View File

@ -6,9 +6,11 @@
#include "document/dom/ecmascript/spidermonkey.h" #include "document/dom/ecmascript/spidermonkey.h"
#include "document/dom/ecmascript/spidermonkey/Node.h" #include "document/dom/ecmascript/spidermonkey/Node.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLCollection.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLTableElement.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableRowElement.h" #include "document/dom/ecmascript/spidermonkey/html/HTMLTableRowElement.h"
#include "dom/node.h" #include "dom/node.h"
#include "dom/sgml/html/html.h"
static JSBool static JSBool
HTMLTableRowElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp) HTMLTableRowElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
@ -37,8 +39,23 @@ HTMLTableRowElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *
int_to_jsval(ctx, vp, html->section_row_index); int_to_jsval(ctx, vp, html->section_row_index);
break; break;
case JSP_HTML_TABLE_ROW_ELEMENT_CELLS: case JSP_HTML_TABLE_ROW_ELEMENT_CELLS:
string_to_jsval(ctx, vp, html->cells); if (!html->cells)
/* Write me! */ undef_to_jsval(ctx, vp);
else {
if (html->cells->ctx == ctx)
object_to_jsval(ctx, vp, html->cells->ecmascript_obj);
else {
JSObject *new_obj;
html->cells->ctx = ctx;
new_obj = JS_NewObject(ctx,
(JSClass *)&HTMLCollection_class, NULL, NULL);
if (new_obj)
JS_SetPrivate(ctx, new_obj, html->cells);
html->cells->ecmascript_obj = new_obj;
object_to_jsval(ctx, vp, new_obj);
}
}
break; break;
case JSP_HTML_TABLE_ROW_ELEMENT_ALIGN: case JSP_HTML_TABLE_ROW_ELEMENT_ALIGN:
string_to_jsval(ctx, vp, html->align); string_to_jsval(ctx, vp, html->align);
@ -144,6 +161,49 @@ const JSClass HTMLTableRowElement_class = {
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, Node_finalize JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, Node_finalize
}; };
static struct dom_node *
find_parent_row(struct dom_node *node)
{
struct dom_node *row = node;
while (1) {
row = row->parent;
if (!row)
break;
if (row->type == DOM_NODE_ELEMENT && row->data.element.type == HTML_ELEMENT_TR)
break;
}
return row;
}
void
register_cell(struct dom_node *node)
{
struct dom_node *row = find_parent_row(node);
if (row) {
struct TR_struct *html = row->data.element.html_data;
if (html) {
html->cells = add_to_dom_node_list(&html->cells, node, -1);
}
}
}
void
unregister_cell(struct dom_node *node)
{
struct dom_node *row = find_parent_row(node);
if (row) {
struct TR_struct *html = row->data.element.html_data;
if (html) {
del_from_dom_node_list(html->cells, node);
}
}
}
void void
make_TR_object(JSContext *ctx, struct dom_node *node) make_TR_object(JSContext *ctx, struct dom_node *node)
{ {
@ -162,7 +222,10 @@ done_TR_object(struct dom_node *node)
struct TR_struct *d = node->data.element.html_data; struct TR_struct *d = node->data.element.html_data;
unregister_row(node); unregister_row(node);
/* d->cells ? */ if (d->cells) {
JS_SetPrivate(d->cells->ctx, d->cells->ecmascript_obj, NULL);
mem_free(d->cells);
}
mem_free_if(d->align); mem_free_if(d->align);
mem_free_if(d->bgcolor); mem_free_if(d->bgcolor);
mem_free_if(d->ch); mem_free_if(d->ch);

View File

@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLTableRowElement_props[];
struct TR_struct { struct TR_struct {
struct HTMLElement_struct html; struct HTMLElement_struct html;
unsigned char *cells; /* FIXME: proper type */ struct dom_node_list *cells;
unsigned char *align; unsigned char *align;
unsigned char *bgcolor; unsigned char *bgcolor;
unsigned char *ch; unsigned char *ch;
@ -22,4 +22,6 @@ struct TR_struct {
void make_TR_object(JSContext *ctx, struct dom_node *node); void make_TR_object(JSContext *ctx, struct dom_node *node);
void done_TR_object(struct dom_node *node); void done_TR_object(struct dom_node *node);
void register_cell(struct dom_node *node);
void unregister_cell(struct dom_node *node);
#endif #endif