1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/***************************************************************
SVGC ECMASCRIPT FILE TEST
Exercise sheet-local scripts and CSS, raw text preservation,
CDATA splitting, invalid input, and copied source ownership.
***************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <svgc.h>
static int
write_file( const char *path, const void *data, size_t length )
{
FILE *fp;
int status;
fp = fopen( path, "wb" );
if( !fp ) return( 0 );
status = (fwrite( data, 1, length, fp ) == length);
if( fclose( fp ) != 0 ) status = 0;
return( status );
}
static char *
read_file( const char *path )
{
FILE *fp;
char *data;
long length;
fp = fopen( path, "rb" );
if( !fp ) return( NULL );
if( fseek( fp, 0L, SEEK_END ) != 0 ) goto failed;
length = ftell( fp );
if( length < 0 ) goto failed;
if( fseek( fp, 0L, SEEK_SET ) != 0 ) goto failed;
if( (unsigned long)length >= (size_t)-1 ) goto failed;
data = (char *)malloc( (size_t)length + 1 );
if( !data ) goto failed;
if( fread( data, 1, (size_t)length, fp ) != (size_t)length )
{
free( data );
goto failed;
}
data[length] = '\0';
fclose( fp );
return( data );
failed:
fclose( fp );
return( NULL );
}
int
main( void )
{
static const char script_text[] =
"function changeColor(event) {\n"
" if (2 < 3 && event.target) {\n"
" event.target.style.fill = 'blue';\n"
" }\n"
"}\n"
"// CDATA test: ]]> must be preserved.\n"
"// UTF-8 text: \xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82\n";
static const char css_text[] = "rect { stroke: black; }\n";
static const char bad_utf8[] = { (char)0xC0, (char)0x80 };
static const char bad_xml[] = { '/', '/', (char)0x01, '\n' };
char big_script[9500];
char script_path[] = "svgc-script-test-XXXXXX";
char svg_path[] = "svgc-script-svg-XXXXXX";
char css_path[] = "svgc-script-css-XXXXXX";
struct __svg_sheet *sheet = NULL;
struct __svg_scene *scene = NULL;
struct __svg_node *rectangle = NULL;
char *svg = NULL;
char *script, *css, *defs_end;
int fd;
int status = 1;
fd = mkstemp( script_path );
if( fd < 0 ) return( 1 );
close( fd );
fd = mkstemp( svg_path );
if( fd < 0 ) goto done;
close( fd );
fd = mkstemp( css_path );
if( fd < 0 ) goto done;
close( fd );
sheet = (struct __svg_sheet *)__svg_new_sheet( 400, 200, 8, 8, 8, 8 );
if( !sheet ) goto done;
scene = __svg_new_scene( sheet );
if( !scene ) goto done;
if( __svg_sheet_add_script_file( NULL, script_path ) != -1 ) goto done;
if( __svg_sheet_add_script_file( sheet, NULL ) != -1 ) goto done;
if( __svg_sheet_add_script_file( sheet, "" ) != -1 ) goto done;
if( __svg_sheet_add_script_file( sheet, "file-which-does-not-exist.js" ) != 0 ) goto done;
rectangle = __svg_new_rect( 10, 20, 200, 100, 0, 0 );
if( !rectangle ) goto done;
if( __svg_sheet_add_script_file( (struct __svg_sheet *)rectangle, script_path ) != -1 ) goto done;
__svg_free_node( rectangle );
rectangle = NULL;
if( !write_file( script_path, bad_utf8, sizeof( bad_utf8 ) ) ) goto done;
if( __svg_sheet_add_script_file( sheet, script_path ) != 0 ) goto done;
if( !write_file( script_path, bad_xml, sizeof( bad_xml ) ) ) goto done;
if( __svg_sheet_add_script_file( sheet, script_path ) != 0 ) goto done;
if( !write_file( css_path, css_text, sizeof( css_text ) - 1 ) ) goto done;
if( __svg_sheet_add_css_file( sheet, css_path ) != 1 ) goto done;
if( !write_file( script_path, script_text, sizeof( script_text ) - 1 ) ) goto done;
if( __svg_sheet_add_script_file( sheet, script_path ) != 1 ) goto done;
memset( big_script, 'a', sizeof( big_script ) );
memcpy( big_script, "/*", 2 );
memcpy( big_script + sizeof( big_script ) - 2, "*/", 2 );
if( !write_file( script_path, big_script, sizeof( big_script ) ) ) goto done;
if( __svg_sheet_add_script_file( sheet, script_path ) != 1 ) goto done;
if( !write_file( script_path, "changed", 7 ) ) goto done;
__svg_paint_scene( scene, 0, svg_path );
svg = read_file( svg_path );
if( !svg ) goto done;
css = strstr( svg, "<style type=\"text/css\">\n <![CDATA[\n" );
script = strstr( svg, "<script type=\"text/javascript\">\n <![CDATA[\n" );
defs_end = strstr( svg, "</defs>" );
if( !css || !script || !defs_end || !(css < script && script < defs_end) ) goto done;
if( !strstr( svg, "rect { stroke: black; }" ) ) goto done;
if( !strstr( svg, "if (2 < 3 && event.target)" ) ) goto done;
if( !strstr( svg, "CDATA test: ]]]]><![CDATA[> must be preserved" ) ) goto done;
if( !strstr( svg, "// UTF-8 text: \xD0\x9F\xD1\x80\xD0\xB8\xD0\xB2\xD0\xB5\xD1\x82" ) ) goto done;
if( !strstr( svg, "/*aaaaaaaa" ) ) goto done;
if( strstr( svg, "changed" ) ) goto done;
if( !strstr( svg, " ]]>\n </script>\n" ) ) goto done;
if( !strstr( svg, "*/\n ]]>\n </script>" ) ) goto done;
if( strstr( svg, "<script type=\"text/javascript\"><![CDATA[<script" ) ) goto done;
status = 0;
done:
if( status ) fprintf( stderr, "SVGC ECMAScript regression failed\n" );
if( rectangle ) __svg_free_node( rectangle );
if( scene ) __svg_free_scene( scene );
else if( sheet ) __svg_free_node( sheet );
free( svg );
unlink( script_path );
unlink( svg_path );
unlink( css_path );
return( status );
}
|