1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-10-11 05:29:28 -04:00

DOM, TableSection: Defined some properties.

This commit is contained in:
Witold Filipczyk 2007-06-12 22:34:51 +02:00 committed by Witold Filipczyk
parent 3545c7225f
commit c44db5b943
6 changed files with 278 additions and 43 deletions

View File

@ -56,10 +56,7 @@ void done_HTMLElement(struct dom_node *node);
#define make_STRONG_object make_HTMLElement
#define make_SUB_object make_HTMLElement
#define make_SUP_object make_HTMLElement
#define make_TBODY_object make_HTMLElement
#define make_TFOOT_object make_HTMLElement
#define make_TH_object make_HTMLElement
#define make_THEAD_object make_HTMLElement
#define make_TT_object make_HTMLElement
#define make_U_object make_HTMLElement
#define make_VAR_object make_HTMLElement
@ -95,10 +92,7 @@ void done_HTMLElement(struct dom_node *node);
#define done_STRONG_object NULL
#define done_SUB_object NULL
#define done_SUP_object NULL
#define done_TBODY_object NULL
#define done_TFOOT_object NULL
#define done_TH_object NULL
#define done_THEAD_object NULL
#define done_TT_object NULL
#define done_U_object NULL
#define done_VAR_object NULL

View File

@ -46,9 +46,8 @@ HTMLFormElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
html->elements->ctx = ctx;
new_obj = JS_NewObject(ctx,
(JSClass *)&HTMLCollection_class, NULL, NULL);
if (new_obj) {
if (new_obj)
JS_SetPrivate(ctx, new_obj, html->elements);
}
html->elements->ecmascript_obj = new_obj;
object_to_jsval(ctx, vp, new_obj);
}

View File

@ -8,6 +8,7 @@
#include "document/dom/ecmascript/spidermonkey/Node.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableElement.h"
#include "dom/node.h"
#include "dom/sgml/html/html.h"
static JSBool
HTMLTableElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
@ -30,24 +31,54 @@ HTMLTableElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
switch (JSVAL_TO_INT(id)) {
case JSP_HTML_TABLE_ELEMENT_CAPTION:
string_to_jsval(ctx, vp, html->caption);
/* Write me! */
if (html->caption)
object_to_jsval(ctx, vp, html->caption->ecmascript_obj);
else
undef_to_jsval(ctx, vp);
break;
case JSP_HTML_TABLE_ELEMENT_THEAD:
string_to_jsval(ctx, vp, html->thead);
/* Write me! */
if (html->thead)
object_to_jsval(ctx, vp, html->thead->ecmascript_obj);
else
undef_to_jsval(ctx, vp);
break;
case JSP_HTML_TABLE_ELEMENT_TFOOT:
string_to_jsval(ctx, vp, html->tfoot);
/* Write me! */
if (html->tfoot)
object_to_jsval(ctx, vp, html->tfoot->ecmascript_obj);
else
undef_to_jsval(ctx, vp);
break;
case JSP_HTML_TABLE_ELEMENT_ROWS:
string_to_jsval(ctx, vp, html->rows);
/* Write me! */
if (!html->rows)
undef_to_jsval(ctx, vp);
else {
if (html->rows->ctx == ctx)
object_to_jsval(ctx, vp, html->rows->ecmascript_obj);
else {
JSObject *new_obj;
if (new_obj)
JS_SetPrivate(ctx, new_obj, html->rows);
html->rows->ecmascript_obj = new_obj;
object_to_jsval(ctx, vp, new_obj);
}
}
break;
case JSP_HTML_TABLE_ELEMENT_TBODIES:
string_to_jsval(ctx, vp, html->tbodies);
/* Write me! */
if (!html->tbodies)
undef_to_jsval(ctx, vp);
else {
if (html->tbodies->ctx == ctx)
object_to_jsval(ctx, vp, html->tbodies->ecmascript_obj);
else {
JSObject *new_obj;
if (new_obj)
JS_SetPrivate(ctx, new_obj, html->tbodies);
html->tbodies->ecmascript_obj = new_obj;
object_to_jsval(ctx, vp, new_obj);
}
}
break;
case JSP_HTML_TABLE_ELEMENT_ALIGN:
string_to_jsval(ctx, vp, html->align);
@ -87,6 +118,7 @@ HTMLTableElement_setProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
{
struct dom_node *node;
struct TABLE_struct *html;
JSObject *value;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
@ -103,16 +135,28 @@ HTMLTableElement_setProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
switch (JSVAL_TO_INT(id)) {
case JSP_HTML_TABLE_ELEMENT_CAPTION:
mem_free_set(&html->caption, stracpy(jsval_to_string(ctx, vp)));
/* Write me! */
value = JSVAL_TO_OBJECT(*vp);
if (value) {
struct dom_node *caption = JS_GetPrivate(ctx, value);
html->caption = caption;
}
break;
case JSP_HTML_TABLE_ELEMENT_THEAD:
mem_free_set(&html->thead, stracpy(jsval_to_string(ctx, vp)));
/* Write me! */
value = JSVAL_TO_OBJECT(*vp);
if (value) {
struct dom_node *thead = JS_GetPrivate(ctx, value);
html->thead = thead;
}
break;
case JSP_HTML_TABLE_ELEMENT_TFOOT:
mem_free_set(&html->tfoot, stracpy(jsval_to_string(ctx, vp)));
/* Write me! */
value = JSVAL_TO_OBJECT(*vp);
if (value) {
struct dom_node *tfoot = JS_GetPrivate(ctx, value);
html->tfoot = tfoot;
}
break;
case JSP_HTML_TABLE_ELEMENT_ALIGN:
mem_free_set(&html->align, stracpy(jsval_to_string(ctx, vp)));
@ -265,11 +309,16 @@ done_TABLE_object(struct dom_node *node)
{
struct TABLE_struct *d = node->data.element.html_data;
/* caption ?
* thead ?
* tfoot ?
* rows ?
* tbodies ? */
if (d->rows) {
if (d->rows->ecmascript_obj)
JS_SetPrivate(d->rows->ctx, d->rows->ecmascript_obj, NULL);
mem_free(d->rows);
}
if (d->tbodies) {
if (d->tbodies->ecmascript_obj)
JS_SetPrivate(d->tbodies->ctx, d->tbodies->ecmascript_obj, NULL);
mem_free(d->tbodies);
}
mem_free_if(d->align);
mem_free_if(d->bgcolor);
mem_free_if(d->border);
@ -280,3 +329,60 @@ done_TABLE_object(struct dom_node *node)
mem_free_if(d->summary);
mem_free_if(d->width);
}
struct dom_node *
find_parent_table(struct dom_node *node)
{
while (1) {
node = node->parent;
if (!node)
break;
if (node->type == DOM_NODE_ELEMENT && node->data.element.type == HTML_ELEMENT_TABLE)
break;
}
return node;
}
void
register_row(struct dom_node *node)
{
struct dom_node *table = find_parent_table(node);
if (table) {
struct TABLE_struct *d = table->data.element.html_data;
d->rows = add_to_dom_node_list(&d->rows, node, -1);
}
}
void
unregister_row(struct dom_node *node)
{
struct dom_node *table = find_parent_table(node);
if (table) {
struct TABLE_struct *d = table->data.element.html_data;
del_from_dom_node_list(d->rows, node);
}
}
void
register_tbody(struct dom_node *table, struct dom_node *node)
{
struct TABLE_struct *d = table->data.element.html_data;
d->rows = add_to_dom_node_list(&d->rows, node, -1);
}
void
unregister_tbody(struct dom_node *node)
{
struct dom_node *table = find_parent_table(node);
if (table) {
struct TABLE_struct *d = table->data.element.html_data;
del_from_dom_node_list(d->tbodies, node);
}
}

View File

@ -10,11 +10,11 @@ extern const JSPropertySpec HTMLTableElement_props[];
struct TABLE_struct {
struct HTMLElement_struct html;
unsigned char *caption; /* FIXME: proper type */
unsigned char *thead; /* FIXME: proper type */
unsigned char *tfoot; /* FIXME: proper type */
unsigned char *rows; /* FIXME: proper type */
unsigned char *tbodies; /* FIXME: proper type */
struct dom_node *caption;
struct dom_node *thead;
struct dom_node *tfoot;
struct dom_node_list *rows;
struct dom_node_list *tbodies;
unsigned char *align;
unsigned char *bgcolor;
unsigned char *border;
@ -28,4 +28,10 @@ struct TABLE_struct {
void make_TABLE_object(JSContext *ctx, struct dom_node *node);
void done_TABLE_object(struct dom_node *node);
struct dom_node *find_parent_table(struct dom_node *node);
void register_row(struct dom_node *node);
void unregister_row(struct dom_node *node);
void register_tbody(struct dom_node *table, struct dom_node *node);
void unregister_tbody(struct dom_node *node);
#endif

View File

@ -6,30 +6,64 @@
#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/HTMLElement.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableElement.h"
#include "document/dom/ecmascript/spidermonkey/html/HTMLTableSectionElement.h"
#include "dom/node.h"
#include "dom/sgml/html/html.h"
static JSBool
HTMLTableSectionElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
{
struct dom_node *node;
struct THEAD_struct *html;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
if (!obj || (!JS_InstanceOf(ctx, obj, (JSClass *)&HTMLTableSectionElement_class, NULL)))
return JS_FALSE;
node = JS_GetPrivate(ctx, obj);
if (!node)
return JS_FALSE;
html = node->data.element.html_data;
if (!html)
return JS_FALSE;
switch (JSVAL_TO_INT(id)) {
case JSP_HTML_TABLE_SECTION_ELEMENT_ALIGN:
/* Write me! */
string_to_jsval(ctx, vp, html->align);
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_CH:
/* Write me! */
string_to_jsval(ctx, vp, html->ch);
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_CH_OFF:
/* Write me! */
string_to_jsval(ctx, vp, html->chOff);
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_VALIGN:
/* Write me! */
string_to_jsval(ctx, vp, html->vAlign);
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_ROWS:
/* Write me! */
if (!html->rows)
undef_to_jsval(ctx, vp);
else {
if (html->rows->ctx == ctx)
object_to_jsval(ctx, vp, html->rows->ecmascript_obj);
else {
JSObject *new_obj;
html->rows->ctx = ctx;
new_obj = JS_NewObject(ctx,
(JSClass *)&HTMLCollection_class, NULL, NULL);
if (new_obj) {
JS_SetPrivate(ctx, new_obj, html->rows);
}
html->rows->ecmascript_obj = new_obj;
object_to_jsval(ctx, vp, new_obj);
}
}
break;
default:
return HTMLElement_getProperty(ctx, obj, id, vp);
@ -40,21 +74,34 @@ HTMLTableSectionElement_getProperty(JSContext *ctx, JSObject *obj, jsval id, jsv
static JSBool
HTMLTableSectionElement_setProperty(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
{
struct dom_node *node;
struct THEAD_struct *html;
if (!JSVAL_IS_INT(id))
return JS_TRUE;
if (!obj || (!JS_InstanceOf(ctx, obj, (JSClass *)&HTMLTableSectionElement_class, NULL)))
return JS_FALSE;
node = JS_GetPrivate(ctx, obj);
if (!node)
return JS_FALSE;
html = node->data.element.html_data;
if (!html)
return JS_FALSE;
switch (JSVAL_TO_INT(id)) {
case JSP_HTML_TABLE_SECTION_ELEMENT_ALIGN:
/* Write me! */
mem_free_set(&html->align, stracpy(jsval_to_string(ctx, vp)));
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_CH:
/* Write me! */
mem_free_set(&html->ch, stracpy(jsval_to_string(ctx, vp)));
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_CH_OFF:
/* Write me! */
mem_free_set(&html->chOff, stracpy(jsval_to_string(ctx, vp)));
break;
case JSP_HTML_TABLE_SECTION_ELEMENT_VALIGN:
/* Write me! */
mem_free_set(&html->vAlign, stracpy(jsval_to_string(ctx, vp)));
break;
default:
return HTMLElement_setProperty(ctx, obj, id, vp);
@ -100,3 +147,66 @@ const JSClass HTMLTableSectionElement_class = {
HTMLTableSectionElement_getProperty, HTMLTableSectionElement_setProperty,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, Node_finalize
};
void
make_THEAD_object(JSContext *ctx, struct dom_node *node)
{
struct html_objects *o = JS_GetContextPrivate(ctx);
node->data.element.html_data = mem_calloc(1, sizeof(struct THEAD_struct));
if (node->data.element.html_data) {
struct dom_node *table;
node->ecmascript_obj = JS_NewObject(ctx, (JSClass *)&HTMLTableSectionElement_class, o->HTMLElement_object, NULL);
table = find_parent_table(node);
if (table) {
struct TABLE_struct *html = table->data.element.html_data;
if (!html)
return;
switch (node->data.element.type) {
case HTML_ELEMENT_THEAD:
html->thead = node;
break;
case HTML_ELEMENT_TFOOT:
html->tfoot = node;
break;
case HTML_ELEMENT_TBODY:
register_tbody(table, node);
break;
default:
break;
}
}
}
}
void
done_THEAD_object(struct dom_node *node)
{
struct THEAD_struct *d = node->data.element.html_data;
if (d->rows) {
if (d->rows->ecmascript_obj)
JS_SetPrivate(d->rows->ctx, d->rows->ecmascript_obj, NULL);
mem_free(d->rows);
}
if (node->data.element.type == HTML_ELEMENT_TBODY)
unregister_tbody(node);
mem_free_if(d->align);
mem_free_if(d->ch);
mem_free_if(d->chOff);
mem_free_if(d->vAlign);
}
void
register_section_row(struct dom_node *node)
{
/* Write me! */
}
void
unregister_section_row(struct dom_node *node)
{
/* Write me! */
}

View File

@ -1,10 +1,30 @@
#ifndef EL__DOCUMENT_DOM_ECMASCRIPT_SPIDERMONKEY_HTML_HTMLTABLESECTIONELEMENT_H
#define EL__DOCUMENT_DOM_ECMASCRIPT_SPIDERMONKEY_HTML_HTMLTABLESECTIONELEMENT_H
#include "document/dom/ecmascript/spidermonkey/html/HTMLElement.h"
#include "ecmascript/spidermonkey/util.h"
extern const JSClass HTMLTableSectionElement_class;
extern const JSFunctionSpec HTMLTableSectionElement_funcs[];
extern const JSPropertySpec HTMLTableSectionElement_props[];
struct THEAD_struct {
struct HTMLElement_struct html;
struct dom_node_list *rows;
unsigned char *align;
unsigned char *ch;
unsigned char *chOff;
unsigned char *vAlign;
};
void make_THEAD_object(JSContext *ctx, struct dom_node *node);
void done_THEAD_object(struct dom_node *node);
void register_section_row(struct dom_node *node);
void unregister_section_row(struct dom_node *node);
#define make_TBODY_object make_THEAD_object
#define make_TFOOT_object make_THEAD_object
#define done_TBODY_object done_THEAD_object
#define done_TFOOT_object done_THEAD_object
#endif