1 // Copyright 2016 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "xfa/fde/xml/fde_xml_imp.h" 6 7 #include <memory> 8 9 #include "testing/gtest/include/gtest/gtest.h" 10 #include "xfa/fgas/crt/fgas_stream.h" 11 12 TEST(CFDE_XMLSyntaxParser, CData) { 13 const FX_WCHAR* input = 14 L"<script contentType=\"application/x-javascript\">\n" 15 L" <![CDATA[\n" 16 L" if (a[1] < 3)\n" 17 L" app.alert(\"Tclams\");\n" 18 L" ]]>\n" 19 L"</script>"; 20 21 const FX_WCHAR* cdata = 22 L"\n" 23 L" if (a[1] < 3)\n" 24 L" app.alert(\"Tclams\");\n" 25 L" "; 26 27 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 28 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 29 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 30 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 31 CFDE_XMLSyntaxParser parser; 32 parser.Init(stream, 256); 33 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 34 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 35 36 CFX_WideString data; 37 parser.GetTagName(data); 38 EXPECT_EQ(L"script", data); 39 40 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 41 parser.GetAttributeName(data); 42 EXPECT_EQ(L"contentType", data); 43 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 44 parser.GetAttributeValue(data); 45 EXPECT_EQ(L"application/x-javascript", data); 46 47 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 48 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 49 parser.GetTextData(data); 50 EXPECT_EQ(L"\n ", data); 51 52 EXPECT_EQ(FDE_XmlSyntaxResult::CData, parser.DoSyntaxParse()); 53 parser.GetTextData(data); 54 EXPECT_EQ(cdata, data); 55 56 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 57 parser.GetTextData(data); 58 EXPECT_EQ(L"\n", data); 59 60 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 61 parser.GetTagName(data); 62 EXPECT_EQ(L"script", data); 63 64 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 65 } 66 67 TEST(CFDE_XMLSyntaxParser, CDataWithInnerScript) { 68 const FX_WCHAR* input = 69 L"<script contentType=\"application/x-javascript\">\n" 70 L" <![CDATA[\n" 71 L" if (a[1] < 3)\n" 72 L" app.alert(\"Tclams\");\n" 73 L" </script>\n" 74 L" ]]>\n" 75 L"</script>"; 76 77 const FX_WCHAR* cdata = 78 L"\n" 79 L" if (a[1] < 3)\n" 80 L" app.alert(\"Tclams\");\n" 81 L" </script>\n" 82 L" "; 83 84 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 85 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 86 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 87 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 88 CFDE_XMLSyntaxParser parser; 89 parser.Init(stream, 256); 90 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 91 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 92 93 CFX_WideString data; 94 parser.GetTagName(data); 95 EXPECT_EQ(L"script", data); 96 97 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 98 parser.GetAttributeName(data); 99 EXPECT_EQ(L"contentType", data); 100 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 101 parser.GetAttributeValue(data); 102 EXPECT_EQ(L"application/x-javascript", data); 103 104 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 105 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 106 parser.GetTextData(data); 107 EXPECT_EQ(L"\n ", data); 108 109 EXPECT_EQ(FDE_XmlSyntaxResult::CData, parser.DoSyntaxParse()); 110 parser.GetTextData(data); 111 EXPECT_EQ(cdata, data); 112 113 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 114 parser.GetTextData(data); 115 EXPECT_EQ(L"\n", data); 116 117 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 118 parser.GetTagName(data); 119 EXPECT_EQ(L"script", data); 120 121 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 122 } 123 124 TEST(CFDE_XMLSyntaxParser, ArrowBangArrow) { 125 const FX_WCHAR* input = 126 L"<script contentType=\"application/x-javascript\">\n" 127 L" <!>\n" 128 L"</script>"; 129 130 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 131 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 132 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 133 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 134 CFDE_XMLSyntaxParser parser; 135 parser.Init(stream, 256); 136 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 137 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 138 139 CFX_WideString data; 140 parser.GetTagName(data); 141 EXPECT_EQ(L"script", data); 142 143 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 144 parser.GetAttributeName(data); 145 EXPECT_EQ(L"contentType", data); 146 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 147 parser.GetAttributeValue(data); 148 EXPECT_EQ(L"application/x-javascript", data); 149 150 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 151 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 152 parser.GetTextData(data); 153 EXPECT_EQ(L"\n ", data); 154 155 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 156 parser.GetTextData(data); 157 EXPECT_EQ(L"\n", data); 158 159 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 160 parser.GetTagName(data); 161 EXPECT_EQ(L"script", data); 162 163 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 164 } 165 166 TEST(CFDE_XMLSyntaxParser, ArrowBangBracketArrow) { 167 const FX_WCHAR* input = 168 L"<script contentType=\"application/x-javascript\">\n" 169 L" <![>\n" 170 L"</script>"; 171 172 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 173 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 174 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 175 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 176 CFDE_XMLSyntaxParser parser; 177 parser.Init(stream, 256); 178 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 179 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 180 181 CFX_WideString data; 182 parser.GetTagName(data); 183 EXPECT_EQ(L"script", data); 184 185 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 186 parser.GetAttributeName(data); 187 EXPECT_EQ(L"contentType", data); 188 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 189 parser.GetAttributeValue(data); 190 EXPECT_EQ(L"application/x-javascript", data); 191 192 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 193 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 194 parser.GetTextData(data); 195 EXPECT_EQ(L"\n ", data); 196 197 // Parser walks to end of input. 198 199 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 200 } 201 202 TEST(CFDE_XMLSyntaxParser, IncompleteCData) { 203 const FX_WCHAR* input = 204 L"<script contentType=\"application/x-javascript\">\n" 205 L" <![CDATA>\n" 206 L"</script>"; 207 208 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 209 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 210 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 211 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 212 CFDE_XMLSyntaxParser parser; 213 parser.Init(stream, 256); 214 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 215 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 216 217 CFX_WideString data; 218 parser.GetTagName(data); 219 EXPECT_EQ(L"script", data); 220 221 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 222 parser.GetAttributeName(data); 223 EXPECT_EQ(L"contentType", data); 224 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 225 parser.GetAttributeValue(data); 226 EXPECT_EQ(L"application/x-javascript", data); 227 228 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 229 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 230 parser.GetTextData(data); 231 EXPECT_EQ(L"\n ", data); 232 233 // Parser walks to end of input. 234 235 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 236 } 237 238 TEST(CFDE_XMLSyntaxParser, UnClosedCData) { 239 const FX_WCHAR* input = 240 L"<script contentType=\"application/x-javascript\">\n" 241 L" <![CDATA[\n" 242 L"</script>"; 243 244 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 245 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 246 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 247 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 248 CFDE_XMLSyntaxParser parser; 249 parser.Init(stream, 256); 250 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 251 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 252 253 CFX_WideString data; 254 parser.GetTagName(data); 255 EXPECT_EQ(L"script", data); 256 257 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 258 parser.GetAttributeName(data); 259 EXPECT_EQ(L"contentType", data); 260 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 261 parser.GetAttributeValue(data); 262 EXPECT_EQ(L"application/x-javascript", data); 263 264 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 265 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 266 parser.GetTextData(data); 267 EXPECT_EQ(L"\n ", data); 268 269 // Parser walks to end of input. 270 271 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 272 } 273 274 TEST(CFDE_XMLSyntaxParser, EmptyCData) { 275 const FX_WCHAR* input = 276 L"<script contentType=\"application/x-javascript\">\n" 277 L" <![CDATA[]]>\n" 278 L"</script>"; 279 280 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 281 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 282 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 283 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 284 CFDE_XMLSyntaxParser parser; 285 parser.Init(stream, 256); 286 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 287 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 288 289 CFX_WideString data; 290 parser.GetTagName(data); 291 EXPECT_EQ(L"script", data); 292 293 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 294 parser.GetAttributeName(data); 295 EXPECT_EQ(L"contentType", data); 296 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 297 parser.GetAttributeValue(data); 298 EXPECT_EQ(L"application/x-javascript", data); 299 300 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 301 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 302 parser.GetTextData(data); 303 EXPECT_EQ(L"\n ", data); 304 305 EXPECT_EQ(FDE_XmlSyntaxResult::CData, parser.DoSyntaxParse()); 306 parser.GetTextData(data); 307 EXPECT_EQ(L"", data); 308 309 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 310 parser.GetTextData(data); 311 EXPECT_EQ(L"\n", data); 312 313 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 314 parser.GetTagName(data); 315 EXPECT_EQ(L"script", data); 316 317 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 318 } 319 320 TEST(CFDE_XMLSyntaxParser, Comment) { 321 const FX_WCHAR* input = 322 L"<script contentType=\"application/x-javascript\">\n" 323 L" <!-- A Comment -->\n" 324 L"</script>"; 325 326 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 327 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 328 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 329 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 330 CFDE_XMLSyntaxParser parser; 331 parser.Init(stream, 256); 332 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 333 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 334 335 CFX_WideString data; 336 parser.GetTagName(data); 337 EXPECT_EQ(L"script", data); 338 339 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 340 parser.GetAttributeName(data); 341 EXPECT_EQ(L"contentType", data); 342 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 343 parser.GetAttributeValue(data); 344 EXPECT_EQ(L"application/x-javascript", data); 345 346 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 347 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 348 parser.GetTextData(data); 349 EXPECT_EQ(L"\n ", data); 350 351 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 352 parser.GetTextData(data); 353 EXPECT_EQ(L"\n", data); 354 355 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 356 parser.GetTagName(data); 357 EXPECT_EQ(L"script", data); 358 359 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 360 } 361 362 TEST(CFDE_XMLSyntaxParser, IncorrectCommentStart) { 363 const FX_WCHAR* input = 364 L"<script contentType=\"application/x-javascript\">\n" 365 L" <!- A Comment -->\n" 366 L"</script>"; 367 368 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 369 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 370 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 371 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 372 CFDE_XMLSyntaxParser parser; 373 parser.Init(stream, 256); 374 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 375 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 376 377 CFX_WideString data; 378 parser.GetTagName(data); 379 EXPECT_EQ(L"script", data); 380 381 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 382 parser.GetAttributeName(data); 383 EXPECT_EQ(L"contentType", data); 384 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 385 parser.GetAttributeValue(data); 386 EXPECT_EQ(L"application/x-javascript", data); 387 388 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 389 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 390 parser.GetTextData(data); 391 EXPECT_EQ(L"\n ", data); 392 393 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 394 parser.GetTextData(data); 395 EXPECT_EQ(L"\n", data); 396 397 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 398 parser.GetTagName(data); 399 EXPECT_EQ(L"script", data); 400 401 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 402 } 403 404 TEST(CFDE_XMLSyntaxParser, CommentEmpty) { 405 const FX_WCHAR* input = 406 L"<script contentType=\"application/x-javascript\">\n" 407 L" <!---->\n" 408 L"</script>"; 409 410 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 411 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 412 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 413 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 414 CFDE_XMLSyntaxParser parser; 415 parser.Init(stream, 256); 416 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 417 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 418 419 CFX_WideString data; 420 parser.GetTagName(data); 421 EXPECT_EQ(L"script", data); 422 423 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 424 parser.GetAttributeName(data); 425 EXPECT_EQ(L"contentType", data); 426 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 427 parser.GetAttributeValue(data); 428 EXPECT_EQ(L"application/x-javascript", data); 429 430 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 431 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 432 parser.GetTextData(data); 433 EXPECT_EQ(L"\n ", data); 434 435 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 436 parser.GetTextData(data); 437 EXPECT_EQ(L"\n", data); 438 439 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 440 parser.GetTagName(data); 441 EXPECT_EQ(L"script", data); 442 443 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 444 } 445 446 TEST(CFDE_XMLSyntaxParser, CommentThreeDash) { 447 const FX_WCHAR* input = 448 L"<script contentType=\"application/x-javascript\">\n" 449 L" <!--->\n" 450 L"</script>"; 451 452 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 453 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 454 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 455 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 456 CFDE_XMLSyntaxParser parser; 457 parser.Init(stream, 256); 458 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 459 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 460 461 CFX_WideString data; 462 parser.GetTagName(data); 463 EXPECT_EQ(L"script", data); 464 465 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 466 parser.GetAttributeName(data); 467 EXPECT_EQ(L"contentType", data); 468 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 469 parser.GetAttributeValue(data); 470 EXPECT_EQ(L"application/x-javascript", data); 471 472 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 473 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 474 parser.GetTextData(data); 475 EXPECT_EQ(L"\n ", data); 476 477 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 478 } 479 480 TEST(CFDE_XMLSyntaxParser, CommentTwoDash) { 481 const FX_WCHAR* input = 482 L"<script contentType=\"application/x-javascript\">\n" 483 L" <!-->\n" 484 L"</script>"; 485 486 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 487 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 488 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 489 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 490 CFDE_XMLSyntaxParser parser; 491 parser.Init(stream, 256); 492 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 493 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 494 495 CFX_WideString data; 496 parser.GetTagName(data); 497 EXPECT_EQ(L"script", data); 498 499 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 500 parser.GetAttributeName(data); 501 EXPECT_EQ(L"contentType", data); 502 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 503 parser.GetAttributeValue(data); 504 EXPECT_EQ(L"application/x-javascript", data); 505 506 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 507 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 508 parser.GetTextData(data); 509 EXPECT_EQ(L"\n ", data); 510 511 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 512 } 513 514 TEST(CFDE_XMLSyntaxParser, Entities) { 515 const FX_WCHAR* input = 516 L"<script contentType=\"application/x-javascript\">" 517 L"B" 518 L"T" 519 L"H" 520 L"ꭈ" 521 L"�" 522 L"</script>"; 523 524 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 525 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 526 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 527 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 528 CFDE_XMLSyntaxParser parser; 529 parser.Init(stream, 256); 530 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 531 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 532 533 CFX_WideString data; 534 parser.GetTagName(data); 535 EXPECT_EQ(L"script", data); 536 537 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 538 parser.GetAttributeName(data); 539 EXPECT_EQ(L"contentType", data); 540 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 541 parser.GetAttributeValue(data); 542 EXPECT_EQ(L"application/x-javascript", data); 543 544 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 545 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 546 parser.GetTextData(data); 547 EXPECT_EQ(L"BTH\xab48", data); 548 549 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 550 parser.GetTagName(data); 551 EXPECT_EQ(L"script", data); 552 553 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 554 } 555 556 TEST(CFDE_XMLSyntaxParser, EntityOverflowHex) { 557 const FX_WCHAR* input = 558 L"<script contentType=\"application/x-javascript\">" 559 L"�" 560 L"�" 561 L"</script>"; 562 563 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 564 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 565 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 566 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 567 CFDE_XMLSyntaxParser parser; 568 parser.Init(stream, 256); 569 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 570 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 571 572 CFX_WideString data; 573 parser.GetTagName(data); 574 EXPECT_EQ(L"script", data); 575 576 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 577 parser.GetAttributeName(data); 578 EXPECT_EQ(L"contentType", data); 579 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 580 parser.GetAttributeValue(data); 581 EXPECT_EQ(L"application/x-javascript", data); 582 583 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 584 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 585 parser.GetTextData(data); 586 EXPECT_EQ(L" ", data); 587 588 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 589 parser.GetTagName(data); 590 EXPECT_EQ(L"script", data); 591 592 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 593 } 594 595 TEST(CFDE_XMLSyntaxParser, EntityOverflowDecimal) { 596 const FX_WCHAR* input = 597 L"<script contentType=\"application/x-javascript\">" 598 L"�" 599 L"�" 600 L"</script>"; 601 602 // We * sizeof(FX_WCHAR) because we pass in the uint8_t, not the FX_WCHAR. 603 size_t len = FXSYS_wcslen(input) * sizeof(FX_WCHAR); 604 CFX_RetainPtr<IFGAS_Stream> stream = IFGAS_Stream::CreateStream( 605 reinterpret_cast<uint8_t*>(const_cast<FX_WCHAR*>(input)), len, 0); 606 CFDE_XMLSyntaxParser parser; 607 parser.Init(stream, 256); 608 EXPECT_EQ(FDE_XmlSyntaxResult::ElementOpen, parser.DoSyntaxParse()); 609 EXPECT_EQ(FDE_XmlSyntaxResult::TagName, parser.DoSyntaxParse()); 610 611 CFX_WideString data; 612 parser.GetTagName(data); 613 EXPECT_EQ(L"script", data); 614 615 EXPECT_EQ(FDE_XmlSyntaxResult::AttriName, parser.DoSyntaxParse()); 616 parser.GetAttributeName(data); 617 EXPECT_EQ(L"contentType", data); 618 EXPECT_EQ(FDE_XmlSyntaxResult::AttriValue, parser.DoSyntaxParse()); 619 parser.GetAttributeValue(data); 620 EXPECT_EQ(L"application/x-javascript", data); 621 622 EXPECT_EQ(FDE_XmlSyntaxResult::ElementBreak, parser.DoSyntaxParse()); 623 EXPECT_EQ(FDE_XmlSyntaxResult::Text, parser.DoSyntaxParse()); 624 parser.GetTextData(data); 625 EXPECT_EQ(L" ", data); 626 627 EXPECT_EQ(FDE_XmlSyntaxResult::ElementClose, parser.DoSyntaxParse()); 628 parser.GetTagName(data); 629 EXPECT_EQ(L"script", data); 630 631 EXPECT_EQ(FDE_XmlSyntaxResult::EndOfString, parser.DoSyntaxParse()); 632 } 633