1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-08-20 20:54:47 -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/Node.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableCellElement.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableRowElement.h"
#include "dom/node.h"
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));
if (node->data.element.html_data) {
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;
unregister_cell(node);
mem_free_if(d->abbr);
mem_free_if(d->align);
mem_free_if(d->axis);

View File

@ -6,9 +6,11 @@
#include "document/dom/ecmascript/spidermonkey.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/HTMLTableRowElement.h"
#include "dom/node.h"
#include "dom/sgml/html/html.h"
static JSBool
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);
break;
case JSP_HTML_TABLE_ROW_ELEMENT_CELLS:
string_to_jsval(ctx, vp, html->cells);
/* Write me! */
if (!html->cells)
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;
case JSP_HTML_TABLE_ROW_ELEMENT_ALIGN:
string_to_jsval(ctx, vp, html->align);
@ -144,6 +161,49 @@ const JSClass HTMLTableRowElement_class = {
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
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;
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->bgcolor);
mem_free_if(d->ch);

View File

@ -10,7 +10,7 @@ extern const JSPropertySpec HTMLTableRowElement_props[];
struct TR_struct {
struct HTMLElement_struct html;
unsigned char *cells; /* FIXME: proper type */
struct dom_node_list *cells;
unsigned char *align;
unsigned char *bgcolor;
unsigned char *ch;
@ -22,4 +22,6 @@ struct TR_struct {
void make_TR_object(JSContext *ctx, 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