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:
@@ -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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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>");
|
||||
|
||||
Reference in New Issue
Block a user