Touchdown of MARINER_DOM_BRANCH.

git-svn-id: svn://10.0.0.236/trunk@841 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
nisheeth
1998-04-29 10:13:27 +00:00
parent c4bd436721
commit 5db071e76e
24 changed files with 2334 additions and 50 deletions

View File

@@ -19,12 +19,12 @@
DEPTH = ..\..\..
MODULE = xmlglue
CSRCS= xmlglue.c xmlss.c xmldom.c
EXPORTS = xmlglue.h
C_OBJS=.\$(OBJDIR)\xmlglue.obj .\$(OBJDIR)\xmlss.obj .\$(OBJDIR)\xmldom.obj
LINCS=-I$(XPDIST)\public\nspr -I$(XPDIST)\public\expat
LINCS=-I$(XPDIST)\public\nspr -I$(XPDIST)\public\expat -I$(XPDIST)\public\js
include <$(DEPTH)\config\rules.mak>

View File

@@ -130,10 +130,95 @@ void XMLDOM_StartHandler (XMLFile f, const char* elementName, const char** attli
xmle->content = (char*) incl;
f->numOpenStreams++;
readHTML(makeAbsoluteURL(f->address, hrefVal), incl);
if (f->numTransclusions == 0) {
f->transclusions = (XMLElement*)getMem(sizeof(XMLElement*) * 10);
}
f->transclusions[f->numTransclusions++] = xmle;
#ifdef DOM
ET_ReflectObject(f->mwcontext, f->transclusions[f->numTransclusions - 1], NULL, LO_DOCUMENT_LAYER_ID,
f->numTransclusions - 1, LM_TRANSCLUSIONS);
#endif
}
}
}
char**
setAttribute (char** attlist, char* elName, char* elValue)
{
size_t n = 0;
char** nattlist;
if (!attlist) return NULL;
while ((n < 2*MAX_ATTRIBUTES) && (*(attlist + n) != NULL)) {
if (strcmp(*(attlist + n), elName) == 0) {
*(attlist + n + 1) = elValue;
return attlist;
}
n = n + 2;
}
nattlist = getMem(n+2);
memcpy(nattlist, attlist, (n * sizeof(char**)));
*(nattlist + n) = elName;
*(nattlist + n + 1) = elValue;
freeMem(attlist);
return nattlist;
}
void XMLSetTransclusionProperty( XMLFile f, uint index, char* propName, char* propValue ) {
XMLElement el = f->transclusions[index];
if (!el) return;
el->attributes = setAttribute(el->attributes, propName, propValue);
if (stringEquals(propName, "href")) {
XMLHTMLInclusion incl = (XMLHTMLInclusion) el->content;
freeMem(incl->content);
incl->content = (char**)getMem(400);
incl->n = 0;
readHTML (makeAbsoluteURL(f->address, propValue), (XMLHTMLInclusion)el->content);
} else if (stringEquals(propName, "visibility")
||stringEquals(propName, "display")) {
xmlhtml_complete_int(f);
}
}
void XMLDeleteMochaObjectReference(XMLFile f, uint index)
{
XMLElement el = f->transclusions[index];
if (el) el->mocha_object = NULL;
}
int32
XMLTransclusionCount(MWContext *context)
{
if (!context) {
return 0;
} else {
XMLFile f = (XMLFile)context->xmlfile;
if (!f) {
return 0;
} else {
return f->numTransclusions;
}
}
}
JSObject* XML_GetMochaObject (void* el) {
return ((XMLElement)el)->mocha_object;
}
void XML_SetMochaObject (void* el, JSObject* jso) {
((XMLElement)el)->mocha_object = jso;
}
void * /* XMLElement */ XMLGetTransclusionByIndex( MWContext *context, uint index )
{
XMLFile f = context->xmlfile;
if (!f) return 0;
return f->transclusions[index];
}
void XMLDOM_PIHandler (XMLFile f, const char *elementName, const char *data) {
if (startsWith("xml:stylesheet", elementName)) {
char* url ;
@@ -204,3 +289,4 @@ tokenizeXMLElement (char* attr, char** attlist)
inAttrNamep = (inAttrNamep ? 0 : 1);
}
}

View File

@@ -30,6 +30,7 @@
#include "xmlglue.h"
#include "xmlparse.h"
#include "xmlss.h"
#include "layers.h"
@@ -73,7 +74,7 @@ xml_abort(NET_StreamClass *stream, int status)
XML_ParserFree(obj->parser);
}
int
xml_write(NET_StreamClass *stream, char* data, int32 len)
{
@@ -96,7 +97,7 @@ xml_complete (NET_StreamClass *stream)
return;
}
XML_Parse(obj->parser, NULL, 0, 1);
XML_ParserFree(obj->parser);
XML_ParserFree(obj->parser);
obj->numOpenStreams--;
if (obj->numOpenStreams < 1) {
@@ -107,25 +108,52 @@ xml_complete (NET_StreamClass *stream)
newstream = NET_StreamBuilder(1, nurls, (MWContext*)obj->mwcontext);
obj->stream = newstream;
convertToHTML(obj);
outputToStream(obj, NULL);
newstream->complete(newstream);
NET_FreeURLStruct(nurls);
}
}
#define OUTPUT_BUFFER_SIZE (4096*16)
void
outputToStream (XMLFile f, char* s)
{
int ans = 0;
NET_StreamClass *stream = (NET_StreamClass*) f->stream;
char* buff = copyString(s);
#ifdef DEBUG
/* FE_Trace(s); */
#endif
if (buff) (*(stream->put_block))(stream, buff, strlen(s));
freeMem(buff);
if (s == NULL) {
if (f->outputBuffer) {
XP_Rect rect;
CL_OffscreenMode save_offscreen_mode;
CL_Compositor *comp = ((MWContext*)f->mwcontext)->compositor;
rect.left = rect.top = 0;
rect.right = 1600;
rect.bottom = 16000;
/* CL_SetCompositorEnabled(comp, 0); */
CL_SetCompositorOffscreenDrawing(comp, CL_OFFSCREEN_ENABLED);
(*(stream->put_block))(stream, f->outputBuffer, strlen(f->outputBuffer));
/* CL_SetCompositorEnabled(comp, 1);
CL_SetCompositorOffscreenDrawing(comp, CL_OFFSCREEN_ENABLED); */
CL_UpdateDocumentRect(comp,&rect, 0);
freeMem(f->outputBuffer);
f->outputBuffer = NULL;
}
return;
}
if (f->outputBuffer == NULL) f->outputBuffer = getMem(OUTPUT_BUFFER_SIZE+1);
if ((strlen(s) > OUTPUT_BUFFER_SIZE)) {
char* buff = copyString(s);
if (buff) (*(stream->put_block))(stream, buff, strlen(s));
CL_CompositeNow(((MWContext*)f->mwcontext)->compositor);
freeMem(buff);
} else if (strlen(f->outputBuffer) + strlen(s) > OUTPUT_BUFFER_SIZE) {
(*(stream->put_block))(stream, f->outputBuffer, strlen(f->outputBuffer));
CL_CompositeNow(((MWContext*)f->mwcontext)->compositor);
memset(f->outputBuffer, '\0', OUTPUT_BUFFER_SIZE);
sprintf(f->outputBuffer, s);
} else {
strcat(f->outputBuffer, s);
}
}
@@ -152,6 +180,7 @@ XML_XMLConverter(FO_Present_Types format_out, void *data_object, URL_Struct *UR
xmlf->status = 1;
xmlf->address = copyString(URL_s->address);
xmlf->mwcontext = window_id;
window_id->xmlfile = xmlf;
xmlf->numOpenStreams = 1;
/* URL_s->fedata = xmlf; */
stream = NET_NewStream("XML", (MKStreamWriteFunc)xml_write,
@@ -209,6 +238,7 @@ xmlcss_complete (NET_StreamClass *stream)
newstream = NET_StreamBuilder(1, nurls, (MWContext*) xml->mwcontext);
xml->stream = newstream;
convertToHTML(xml);
outputToStream(xml, NULL);
newstream->complete(newstream);
NET_FreeURLStruct(nurls);
}
@@ -290,25 +320,47 @@ xmlhtml_abort(NET_StreamClass *stream, int status)
void
xmlhtml_complete (NET_StreamClass *stream)
{
XMLHTMLInclusion ss =stream->data_object;
XMLFile xml = ss->xml;
void xmlhtml_complete_int (XMLFile xml) {
MWContext *cx = (MWContext *)xml->mwcontext;
int16 save_offscreen_mode;
xml->numOpenStreams--;
if (xml->numOpenStreams == 0) {
if (xml->numOpenStreams < 1) {
/* direct the stream to the html parser */
NET_StreamClass *newstream;
URL_Struct *nurls = NET_CreateURLStruct(copyString(xml->address), NET_DONT_RELOAD);
StrAllocCopy(nurls->content_type, TEXT_HTML);
newstream = NET_StreamBuilder(1, nurls, (MWContext*) xml->mwcontext);
xml->stream = newstream;
if (cx->compositor)
{
/* Temporarily force drawing to use the offscreen buffering area to reduce
flicker when outputing html. (If no offscreen store is allocated, this code will
have no effect, but it will do no harm.) */
save_offscreen_mode = CL_GetCompositorOffscreenDrawing(cx->compositor);
CL_SetCompositorOffscreenDrawing(cx->compositor, CL_OFFSCREEN_ENABLED);
}
convertToHTML(xml);
outputToStream(xml, NULL);
if (cx->compositor)
{
/* CL_CompositeNow(cx->compositor);
CL_SetCompositorOffscreenDrawing(cx->compositor, save_offscreen_mode); */
}
newstream->complete(newstream);
NET_FreeURLStruct(nurls);
}
}
void
xmlhtml_complete (NET_StreamClass *stream)
{
XMLHTMLInclusion ss =stream->data_object;
XMLFile xml = ss->xml;
xmlhtml_complete_int(xml);
}
#ifdef XP_MAC
@@ -335,6 +387,8 @@ xmlhtml_GetUrlExitFunc (URL_Struct *urls, int status, MWContext *cx)
}
void setTransclusionProp (XMLFile f, int32 n, char* prop, char* value) {
}
void
readHTML (char* url, XMLHTMLInclusion ss)

View File

@@ -19,8 +19,18 @@
#ifndef _RDF_XMLGLUE_H_
#define _RDF_XMLGLUE_H_
/* Make sure @#$%^&* LAYERS is defined for the Mac */
#ifndef LAYERS
#define LAYERS
#endif
#include "xmlparse.h"
#include "jscompat.h"
#include "lo_ele.h"
#include "libevent.h"
#include "libmocha.h"
#ifdef XP_UNIX
#include <sys/fcntl.h>
#elif defined(XP_MAC)
@@ -78,9 +88,12 @@ typedef struct _XMLFileStruct {
void* stream;
int8 numOpenStreams;
void* urls;
void* mwcontext;
MWContext* mwcontext;
char* address;
char* outputBuffer;
XML_Parser parser;
int32 numTransclusions;
struct _XMLElementStruct** transclusions;
} XMLFileStruct;
typedef XMLFileStruct* XMLFile;
@@ -102,6 +115,7 @@ typedef struct _StyleElementStruct {
char** tagStack;
char* style;
struct _StyleElementStruct* next;
int id; /* Unique identifier among all style elements in all style sheets */
} StyleElementStruct;
typedef StyleElementStruct* StyleElement;
@@ -111,6 +125,7 @@ typedef struct _XMLElementStruct {
char* tag;
char** attributes;
char* content;
JSObject *mocha_object;
struct _XMLElementStruct* parent;
struct _XMLElementStruct* child;
struct _XMLElementStruct* next;
@@ -168,6 +183,7 @@ int xmlhtml_write(NET_StreamClass *stream, const char *str, int32 len);
unsigned int xmlhtml_write_ready(NET_StreamClass *stream);
void xmlhtml_abort(NET_StreamClass *stream, int status);
void xmlhtml_complete (NET_StreamClass *stream);
void xmlhtml_complete_int (XMLFile xml);
void xmlhtml_GetUrlExitFunc (URL_Struct *urls, int status, MWContext *cx);
void readHTML (char* url, XMLHTMLInclusion ss);

View File

@@ -83,7 +83,7 @@ parseNextXMLCSSBlob (NET_StreamClass *stream, char* blob, int32 size)
return(size);
}
static int32 style_id_counter = 0;
void
parseNextXMLCSSElement (StyleSheet ss, char* ele)
@@ -95,6 +95,7 @@ parseNextXMLCSSElement (StyleSheet ss, char* ele)
} else {
StyleElement se = (StyleElement) getMem(sizeof(StyleElementStruct));
size_t numTags, size, n, count;
se->id = ++style_id_counter;
se->next = ss->el;
ss->el = se;
size = strlen(ele);
@@ -263,7 +264,25 @@ outputAsHTML (XMLFile f, XMLElement el)
}
}
void
outputAllStyles(XMLFile xf)
{
char *ssline;
StyleSheet ss ;
StyleElement se;
outputToStream(xf, "<style>\n");
for (ss = xf->ss; (ss != NULL) ; ss = ss->next) {
for (se = ss->el; (se != NULL) ; se = se->next) {
ssline = PR_smprintf(".xml%d {%s}\n", se->id, se->style);
PR_ASSERT(ssline);
if (!ssline)
return;
outputToStream(xf, ssline);
free(ssline);
}
}
outputToStream(xf, "</style>\n");
}
void
convertToHTML (XMLFile xf) {
@@ -271,36 +290,40 @@ convertToHTML (XMLFile xf) {
xf->numOpenStreams--;
if (xf->numOpenStreams < 1) {
outputToStream(xf, "<html><body>");
outputAllStyles(xf);
outputAsHTML(xf, el);
outputToStream(xf, "</body></html>");
}
}
void
outputStyleSpan (XMLFile f, XMLElement el, PRBool endp)
{
char *ssid;
StyleSheet ss ;
StyleElement se;
for (ss = f->ss; (ss != NULL) ; ss = ss->next) {
for (se = ss->el; (se != NULL) ; se = se->next) {
if (stringEquals((se->tagStack)[0], el->tag)) {
if (se->style && stringEquals((se->tagStack)[0], el->tag)) {
/* check for se->style from Steve Wingard <swingard@spyglass.com> */
PRBool divp = startsWith("Display:Block;", se->style);
PRBool listp = startsWith("Display:List-item;", se->style);
if (!endp) {
if (divp) {
outputToStream(f, "<div style=\"");
outputToStream(f, &(se->style)[14]);
outputToStream(f, "<div ");
} else if (listp) {
outputToStream(f, "<UL><LI><span style=\"");
outputToStream(f, &(se->style)[20]);
outputToStream(f, "<UL><LI><span ");
} else {
outputToStream(f, "<span style=\"");
outputToStream(f, se->style);
outputToStream(f, "<span ");
}
outputToStream(f, "\">\n");
ssid=PR_smprintf("class=xml%d>\n", se->id);
PR_ASSERT(ssid);
if (!ssid)
return;
outputToStream(f, ssid);
free(ssid);
} else {
if (divp) {
outputToStream(f, "</div>");