summaryrefslogtreecommitdiff
path: root/test/lib/testobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib/testobject.c')
-rw-r--r--test/lib/testobject.c145
1 files changed, 123 insertions, 22 deletions
diff --git a/test/lib/testobject.c b/test/lib/testobject.c
index 5a20770..a0ab835 100644
--- a/test/lib/testobject.c
+++ b/test/lib/testobject.c
@@ -5,11 +5,15 @@
* Copyright 2007 John-Mark Bell <jmb@netsurf-browser.org>
*/
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#include <dom/bootstrap/init_fini.h>
+#include "bindings/hubbub/parser.h"
+
#include "bindings/xml/xmlbinding.h"
#include "bindings/xml/xmlparser.h"
@@ -17,10 +21,14 @@
#include "testobject.h"
#include "utils.h"
-static bool xml_parser_initialised;
+static bool parser_initialised;
struct TestObject {
- dom_xml_parser *parser;
+ enum { OBJECT_XML, OBJECT_HTML } type;
+ union {
+ dom_xml_parser *xml;
+ dom_hubbub_parser *html;
+ } parser;
struct dom_document *doc;
};
@@ -33,6 +41,7 @@ TestObject *test_object_create(int argc, char **argv,
#define CHUNK_SIZE 4096
uint8_t buf[CHUNK_SIZE];
FILE *fp;
+ char *dot;
size_t len;
TestObject *ret;
@@ -43,15 +52,18 @@ TestObject *test_object_create(int argc, char **argv,
exit(EXIT_FAILURE);
}
- if (xml_parser_initialised == false) {
+ if (parser_initialised == false) {
assert(dom_initialise(myrealloc, NULL) == DOM_NO_ERR);
assert(dom_xml_binding_initialise(myrealloc, NULL) ==
DOM_XML_OK);
+// assert(dom_hubbub_binding_initialise(myrealloc, NULL) ==
+// DOM_HUBBUB_OK);
+
atexit(test_object_cleanup);
- xml_parser_initialised = true;
+ parser_initialised = true;
}
snprintf(fnbuf, sizeof fnbuf, "%s/%s", argv[1], uri);
@@ -60,16 +72,67 @@ TestObject *test_object_create(int argc, char **argv,
if (ret == NULL)
return NULL;
- ret->parser = dom_xml_parser_create(NULL, "UTF-8", myrealloc, NULL,
- mymsg, NULL);
- if (ret->parser == NULL) {
- free(ret);
- return NULL;
+ /* Detect the parser type (this is mildly hacky) */
+ dot = strrchr(uri, '.');
+ len = strlen(uri);
+
+ if (dot == NULL) {
+ printf("No file extension, assuming XML\n");
+
+ ret->type = OBJECT_XML;
+ } else if (len - ((dot + 1) - uri) == 3) {
+ if (tolower(dot[1]) == 'x' && tolower(dot[2]) == 'm'
+ && tolower(dot[3]) == 'l') {
+ ret->type = OBJECT_XML;
+ } else if (tolower(dot[1]) == 'h' && tolower(dot[2]) == 't' &&
+ tolower(dot[3]) == 'm') {
+ ret->type = OBJECT_HTML;
+ }
+ } else if (len - ((dot + 1) - uri) == 4) {
+ if (tolower(dot[1]) == 'h' && tolower(dot[2]) == 't' &&
+ tolower(dot[3]) == 'm' &&
+ tolower(dot[4]) == 'l') {
+ ret->type = OBJECT_HTML;
+ }
+ } else {
+ /* Assume XML */
+ ret->type = OBJECT_XML;
+ }
+
+ switch (ret->type) {
+ case OBJECT_XML:
+ ret->parser.xml = dom_xml_parser_create(NULL, "UTF-8",
+ myrealloc, NULL, mymsg, NULL);
+ if (ret->parser.xml == NULL) {
+ free(ret);
+ return NULL;
+ }
+ break;
+ case OBJECT_HTML:
+ {
+ char abuf[1024];
+ snprintf(abuf, sizeof abuf, "%s/Aliases", argv[1]);
+
+ ret->parser.html = dom_hubbub_parser_create(abuf,
+ NULL, "UTF-8", myrealloc, NULL, mymsg, NULL);
+ if (ret->parser.html == NULL) {
+ free(ret);
+ return NULL;
+ }
+ break;
+ }
}
fp = fopen(fnbuf, "r");
if (fp == NULL) {
- dom_xml_parser_destroy(ret->parser);
+ switch (ret->type) {
+ case OBJECT_XML:
+ dom_xml_parser_destroy(ret->parser.xml);
+ break;
+ case OBJECT_HTML:
+ dom_hubbub_parser_destroy(ret->parser.html);
+ break;
+ }
free(ret);
return NULL;
}
@@ -81,8 +144,16 @@ TestObject *test_object_create(int argc, char **argv,
while (len > CHUNK_SIZE) {
fread(buf, 1, CHUNK_SIZE, fp);
- assert(dom_xml_parser_parse_chunk(ret->parser, buf,
- CHUNK_SIZE) == DOM_XML_OK);
+ switch (ret->type) {
+ case OBJECT_XML:
+ assert(dom_xml_parser_parse_chunk(ret->parser.xml,
+ buf, CHUNK_SIZE) == DOM_XML_OK);
+ break;
+ case OBJECT_HTML:
+ assert(dom_hubbub_parser_parse_chunk(ret->parser.html,
+ buf, CHUNK_SIZE) == DOM_HUBBUB_OK);
+ break;
+ }
len -= CHUNK_SIZE;
}
@@ -90,20 +161,51 @@ TestObject *test_object_create(int argc, char **argv,
if (len > 0) {
fread(buf, 1, len, fp);
- assert(dom_xml_parser_parse_chunk(ret->parser, buf,
- len) == DOM_XML_OK);
+ switch (ret->type) {
+ case OBJECT_XML:
+ assert(dom_xml_parser_parse_chunk(ret->parser.xml,
+ buf, len) == DOM_XML_OK);
+ break;
+ case OBJECT_HTML:
+ assert(dom_hubbub_parser_parse_chunk(ret->parser.html,
+ buf, len) == DOM_HUBBUB_OK);
+ break;
+ }
len = 0;
}
- assert(dom_xml_parser_completed(ret->parser) == DOM_XML_OK);
+ switch (ret->type) {
+ case OBJECT_XML:
+ assert(dom_xml_parser_completed(ret->parser.xml) == DOM_XML_OK);
+ break;
+ case OBJECT_HTML:
+ assert(dom_hubbub_parser_completed(ret->parser.html) ==
+ DOM_HUBBUB_OK);
+ break;
+ }
fclose(fp);
- ret->doc = dom_xml_parser_get_document(ret->parser);
+ switch (ret->type) {
+ case OBJECT_XML:
+ ret->doc = dom_xml_parser_get_document(ret->parser.xml);
+ break;
+ case OBJECT_HTML:
+ ret->doc = dom_hubbub_parser_get_document(ret->parser.html);
+ break;
+ }
- dom_xml_parser_destroy(ret->parser);
- ret->parser = NULL;
+ switch (ret->type) {
+ case OBJECT_XML:
+ dom_xml_parser_destroy(ret->parser.xml);
+ ret->parser.xml = NULL;
+ break;
+ case OBJECT_HTML:
+ dom_hubbub_parser_destroy(ret->parser.html);
+ ret->parser.html = NULL;
+ break;
+ }
return ret;
@@ -117,14 +219,13 @@ struct dom_document *test_object_get_doc(TestObject *obj)
const char *test_object_get_mimetype(TestObject *obj)
{
- UNUSED(obj);
-
- return "text/xml";
+ return (obj->type == OBJECT_XML ? "text/xml" : "text/html");
}
void test_object_cleanup(void)
{
- if (xml_parser_initialised) {
+ if (parser_initialised) {
+// dom_hubbub_binding_finalise();
dom_xml_binding_finalise();
dom_finalise();
}