DOM: move POP_LAYER handling into back end and start element->node wiring

This commit is contained in:
shaver%netscape.com 1998-10-02 20:20:31 +00:00
Родитель 95383219c1
Коммит 53fe498010
5 изменённых файлов: 154 добавлений и 127 удалений

Просмотреть файл

@ -4074,74 +4074,6 @@ static void *hooked_data_object = NULL;
static intn hooked_status = 0;
static PA_Tag *hooked_tag = NULL;
#ifdef DOM
char *element_names[] = {
"NONE",
"TEXT",
"LINEFEED",
"HRULE",
"IMAGE",
"BULLET",
"FORM_ELE",
"SUBDOC",
"TABLE",
"CELL",
"EMBED",
"EDGE",
"JAVA",
"SCRIPT",
"OBJECT",
"PARAGRAPH",
"CENTER",
"MULTICOL",
"FLOAT",
"TEXTBLOCK",
"LIST",
"DESCTITLE",
"DESCTEXT",
"BLOCKQUOTE",
"LAYER",
"HEADING",
"SPAN",
"BUILTIN",
"SPACER",
"SUPER",
"SUB"
};
#ifdef DEBUG_shaver_verbose
static void
DumpNodeElements(DOM_Node *node)
{
#ifdef DEBUG_shaver
LO_Element *eptr;
if (node->type != NODE_TYPE_ELEMENT &&
node->type != NODE_TYPE_TEXT)
return;
fprintf(stderr, "%s %s elements:",
PA_TagString(ELEMENT_PRIV(node)->tagtype),
node->name ? node->name : "");
if (ELEMENT_PRIV(node)->tagtype == P_TABLE_ROW ||
ELEMENT_PRIV(node)->tagtype == P_TABLE_DATA) {
fprintf(stderr, " <NOT REALLY AN ELEMENT>\n");
return;
}
eptr = ELEMENT_PRIV(node)->ele_start;
if (!eptr) {
fprintf(stderr, " <none> (SHOULD REMOVE FROM TREE!)\n");
return;
}
while (eptr && eptr != ELEMENT_PRIV(node)->ele_end) {
fprintf(stderr, " %s", element_names[eptr->type]);
eptr = eptr->lo_any.next;
}
if (eptr)
fprintf(stderr, " %s", element_names[eptr->type]);
fprintf(stderr, "\n");
#endif
}
#endif
#endif
/*************************************
* Function: LO_ProcessTag
@ -4902,43 +4834,6 @@ XP_TRACE(("Initializing new doc %d\n", doc_id));
lo_LayoutTag(context, state, tag);
#ifdef DOM
/*
* If we're ending a tag, then we're also ending a node.
* In this case, LM_RefectTagNode will have returned the closing
* node, so we can fill it in.
* Otherwise, if it's a text tag, LM_ReflectTagNode will
* return the Text block and we want to mark it as done. (Text nodes
* will probably only ever have one LO_Element, but why take
* chances?)
*/
if (last_node &&
((tag->is_end && last_node->type == NODE_TYPE_ELEMENT) ||
last_node->type == NODE_TYPE_TEXT)) {
/* mark the end LO_Element for the _last_ node */
LO_Element *eptr;
if (ELEMENT_PRIV(last_node)->flags & STYLE_NODE_NEED_TO_POP_LAYER)
lo_EndLayer(context, state, PR_TRUE);
eptr = state->line_list;
if (eptr) {
while (eptr->lo_any.next != NULL) {
eptr = eptr->lo_any.next;
}
} else {
eptr = state->end_last_line;
}
#if 0
/* there are Nodes (TITLE,HEAD) that don't generate LO_Elements */
XP_ASSERT(eptr);
XP_ASSERT(ELEMENT_PRIV(last_node)->ele_start);
#endif
ELEMENT_PRIV(last_node)->ele_end = eptr;
#ifdef DEBUG_shaver_old
DumpNodeElements(last_node);
#endif
}
#endif
if (top_state->wedged_on_mocha) {
top_state->wedged_on_mocha = FALSE;
return(1);

Просмотреть файл

@ -34,6 +34,9 @@
#include "stystack.h"
#include "libmocha.h"
#ifdef DOM
struct DOM_Node;
#endif
#define MEMORY_ARENAS 1
@ -272,6 +275,10 @@ typedef struct lo_TableCell_struct {
typedef struct lo_TableRow_struct {
int16 type; /* to match lo_Any */
#ifdef DOM
struct DOM_Node *node; /* to match lo_Any */
#endif
Bool row_done;
Bool has_percent_width_cells;
lo_Backdrop backdrop; /* default for cells to inherit */

Просмотреть файл

@ -3697,14 +3697,6 @@ lo_BeginTableCellAttributes(MWContext *context,
return;
}
#if DOM
/*
* Unsafe cast, but code that operates on the Nodes will
* know that <TD> elements need special care.
*/
lo_SetNodeElement(state, (LO_Element *)table_cell);
#endif
if (state->is_a_subdoc != SUBDOC_NOT)
{
table_cell->in_nested_table = TRUE;
@ -4409,7 +4401,7 @@ lo_BeginTableRowAttributes(MWContext *context,
lo_table_span *span_rec;
char *bgcolor_from_style=NULL;
#ifdef LOCAL_DEBUG
fprintf(stderr, "lo_BeginTableRow called\n");
fprintf(stderr, "lo_BeginTableRow called\n");
#endif /* LOCAL_DEBUG */
table_row = XP_NEW(lo_TableRow);
@ -4417,12 +4409,11 @@ lo_BeginTableRowAttributes(MWContext *context,
{
return;
}
#if DOM
/*
* So this is a little unsafe, on the surface.
* The code that does the reordering of LO_Elements will have to
* think important, special-case thoughts about <TR> nodes,
* but that's OK.
/*
* need to make lo_TableRow have a DOM_Node at the same place as all
* the LO_Elements.
*/
lo_SetNodeElement(state, (LO_Element *)table_row);
#endif

Просмотреть файл

@ -38,6 +38,7 @@
#include "stystruc.h"
#ifdef DOM
#include "domstyle.h"
#include "lm_dom.h"
#endif
#include "pics.h"
@ -629,11 +630,11 @@ lo_ProcessHeader(MWContext *context, lo_DocState *state,
{
if (header->is_end)
{
Bool aligned_header;
Bool aligned_header = FALSE;
if (state->align_stack
&& state->align_stack->type == P_HEADER_1)
aligned_header = TRUE;
aligned_header = TRUE;
if (aligned_header != FALSE)
{
@ -4324,6 +4325,75 @@ static void lo_ProcessFontTag( lo_DocState *state, MWContext *context, PA_Tag *t
}
}
#ifdef DOM
char *element_names[] = {
"NONE",
"TEXT",
"LINEFEED",
"HRULE",
"IMAGE",
"BULLET",
"FORM_ELE",
"SUBDOC",
"TABLE",
"CELL",
"EMBED",
"EDGE",
"JAVA",
"SCRIPT",
"OBJECT",
"PARAGRAPH",
"CENTER",
"MULTICOL",
"FLOAT",
"TEXTBLOCK",
"LIST",
"DESCTITLE",
"DESCTEXT",
"BLOCKQUOTE",
"LAYER",
"HEADING",
"SPAN",
"BUILTIN",
"SPACER",
"SUPER",
"SUB"
};
#ifdef DEBUG_shaver_verbose
static void
DumpNodeElements(DOM_Node *node)
{
#ifdef DEBUG_shaver
LO_Element *eptr;
if (node->type != NODE_TYPE_ELEMENT &&
node->type != NODE_TYPE_TEXT)
return;
fprintf(stderr, "%s %s elements:",
PA_TagString(ELEMENT_PRIV(node)->tagtype),
node->name ? node->name : "");
if (ELEMENT_PRIV(node)->tagtype == P_TABLE_ROW ||
ELEMENT_PRIV(node)->tagtype == P_TABLE_DATA) {
fprintf(stderr, " <NOT REALLY AN ELEMENT>\n");
return;
}
eptr = ELEMENT_PRIV(node)->ele_start;
if (!eptr) {
fprintf(stderr, " <none> (SHOULD REMOVE FROM TREE!)\n");
return;
}
while (eptr && eptr != ELEMENT_PRIV(node)->ele_end) {
fprintf(stderr, " %s", element_names[eptr->type]);
eptr = eptr->lo_any.next;
}
if (eptr)
fprintf(stderr, " %s", element_names[eptr->type]);
fprintf(stderr, "\n");
#endif
}
#endif
#endif
/*************************************
* Function: lo_LayoutTag
*
@ -6537,8 +6607,8 @@ XP_TRACE(("lo_LayoutTag(%d)\n", tag->type));
*/
case P_FORM:
#if defined(SingleSignon)
/* Notify the signon module of the new form */
SI_StartOfForm();
/* Notify the signon module of the new form */
SI_StartOfForm();
#endif
/*
* No forms in the scrolling document
@ -6903,7 +6973,7 @@ XP_TRACE(("lo_LayoutTag(%d)\n", tag->type));
lo_ProcessScriptTag(context, state, tag, NULL);
break;
case P_STYLE:
case P_STYLE:
if(!state->hide_content)
lo_ProcessStyleTag(context, state, tag);
break;
@ -7561,6 +7631,65 @@ XP_TRACE(("lo_LayoutTag(%d)\n", tag->type));
*/
lo_PostLayoutTag( context, state, tag, started_in_head);
#ifdef DOM
/*
* Ending the processing of a tag.
* Here we pop all the style state we need to, and wire up the
* Node->LO_Element end-element links.
*/
if (tag->is_end) {
LO_Element *eptr;
DOM_Node *node;
/* find the last element on the line list and its node */
#define FIND_LAST_ELEMENT(eptr) \
eptr = state->line_list; \
if (eptr) { \
while (eptr->lo_any.next != NULL) { \
eptr = eptr->lo_any.next; \
} \
} else { \
eptr = state->end_last_line; \
}
FIND_LAST_ELEMENT(eptr);
if (!eptr)
return;
node = eptr->lo_any.node;
if (!node)
return;
if (node->type == NODE_TYPE_ELEMENT ||
node->type == NODE_TYPE_TEXT) {
PRBool resyncElements = PR_FALSE;
DOM_HTMLElementPrivate *priv = ELEMENT_PRIV(node);
XP_ASSERT(priv);
if (priv->flags & STYLE_NODE_NEED_TO_POP_LAYER) {
resyncElements = PR_TRUE;
lo_EndLayer(context, state, PR_TRUE);
LM_ClearNodeFlags(node, STYLE_NODE_NEED_TO_POP_LAYER);
}
/* if we popped stuff, resync the end pointer */
if (resyncElements) {
FIND_LAST_ELEMENT(eptr);
XP_ASSERT(eptr->lo_any.node == node);
}
priv->ele_end = eptr;
} else {
#ifdef DEBUG_shaver
fprintf(stderr, "node on LO_Element %d is type %d\n",
eptr->lo_any.type, node->type);
#endif
}
#ifdef DEBUG_shaver_old
DumpNodeElements(last_node);
#endif
}
#endif /* DOM */
LO_UnlockLayout();
}

Просмотреть файл

@ -2125,6 +2125,9 @@ lo_NewElement(MWContext *context, lo_DocState *state, intn type,
}
else
{
#ifdef DOM
eptr->lo_any.node = NULL;
#endif
eptr->lo_any.width = 0;
eptr->lo_any.height = 0;
eptr->lo_any.x_offset = 0;
@ -2605,10 +2608,12 @@ lo_SetNodeElement(lo_DocState *state, LO_Element *element)
/* this the first element for this node, so mark it */
ELEMENT_PRIV(node)->ele_start = element;
}
#if 0 /* XXX waiting on proper LO_Elements for tables and cells and stuff */
if (!element->lo_any.node)
element->lo_any.node = node;
#ifdef DEBUG_shaver
if (element->lo_any.node)
fprintf(stderr, "element %p (type %d) already has node %x\n",
element, element->lo_any.type, element->lo_any.node);
#endif
element->lo_any.node = node;
}
#endif