nokogiri 1.8.5 → 1.13.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (356) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -21
  3. data/LICENSE-DEPENDENCIES.md +1159 -868
  4. data/LICENSE.md +5 -28
  5. data/README.md +196 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -59
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +750 -420
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +119 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +228 -91
  18. data/ext/nokogiri/nokogiri.h +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +41 -36
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -216
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +61 -52
  33. data/ext/nokogiri/xml_node.c +1044 -616
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  41. data/ext/nokogiri/xml_schema.c +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +68 -0
  88. data/gumbo-parser/src/util.h +30 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +218 -91
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/{html → html4}/document.rb +103 -105
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +222 -0
  123. data/lib/nokogiri/version.rb +3 -108
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +97 -53
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +224 -86
  130. data/lib/nokogiri/xml/document_fragment.rb +57 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +895 -377
  139. data/lib/nokogiri/xml/node_set.rb +92 -65
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +23 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +38 -34
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +220 -266
  177. data/.autotest +0 -22
  178. data/.cross_rubies +0 -8
  179. data/.editorconfig +0 -17
  180. data/.gemtest +0 -0
  181. data/.travis.yml +0 -63
  182. data/CHANGELOG.md +0 -1368
  183. data/CONTRIBUTING.md +0 -42
  184. data/C_CODING_STYLE.rdoc +0 -33
  185. data/Gemfile-libxml-ruby +0 -3
  186. data/Manifest.txt +0 -370
  187. data/ROADMAP.md +0 -111
  188. data/Rakefile +0 -348
  189. data/SECURITY.md +0 -19
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -29
  193. data/build_all +0 -44
  194. data/ext/nokogiri/html_document.c +0 -170
  195. data/ext/nokogiri/html_document.h +0 -10
  196. data/ext/nokogiri/html_element_description.c +0 -279
  197. data/ext/nokogiri/html_element_description.h +0 -10
  198. data/ext/nokogiri/html_entity_lookup.c +0 -32
  199. data/ext/nokogiri/html_entity_lookup.h +0 -8
  200. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  201. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  202. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  203. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  204. data/ext/nokogiri/xml_attr.h +0 -9
  205. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  206. data/ext/nokogiri/xml_cdata.h +0 -9
  207. data/ext/nokogiri/xml_comment.h +0 -9
  208. data/ext/nokogiri/xml_document.h +0 -23
  209. data/ext/nokogiri/xml_document_fragment.h +0 -10
  210. data/ext/nokogiri/xml_dtd.h +0 -10
  211. data/ext/nokogiri/xml_element_content.h +0 -10
  212. data/ext/nokogiri/xml_element_decl.h +0 -9
  213. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  214. data/ext/nokogiri/xml_entity_decl.h +0 -10
  215. data/ext/nokogiri/xml_entity_reference.h +0 -9
  216. data/ext/nokogiri/xml_io.c +0 -61
  217. data/ext/nokogiri/xml_io.h +0 -11
  218. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  219. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  220. data/ext/nokogiri/xml_namespace.h +0 -15
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -12
  223. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  224. data/ext/nokogiri/xml_reader.h +0 -10
  225. data/ext/nokogiri/xml_relax_ng.h +0 -9
  226. data/ext/nokogiri/xml_sax_parser.h +0 -39
  227. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  228. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  229. data/ext/nokogiri/xml_schema.h +0 -9
  230. data/ext/nokogiri/xml_syntax_error.h +0 -13
  231. data/ext/nokogiri/xml_text.h +0 -9
  232. data/ext/nokogiri/xml_xpath_context.h +0 -10
  233. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  234. data/lib/nokogiri/html/document_fragment.rb +0 -49
  235. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  236. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  237. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  238. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  239. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  240. data/patches/sort-patches-by-date +0 -25
  241. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  242. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  243. data/suppressions/README.txt +0 -1
  244. data/suppressions/nokogiri_ruby-2.supp +0 -10
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -386
  248. data/test/css/test_tokenizer.rb +0 -215
  249. data/test/css/test_xpath_visitor.rb +0 -96
  250. data/test/decorators/test_slop.rb +0 -23
  251. data/test/files/2ch.html +0 -108
  252. data/test/files/GH_1042.html +0 -18
  253. data/test/files/address_book.rlx +0 -12
  254. data/test/files/address_book.xml +0 -10
  255. data/test/files/atom.xml +0 -344
  256. data/test/files/bar/bar.xsd +0 -4
  257. data/test/files/bogus.xml +0 -0
  258. data/test/files/dont_hurt_em_why.xml +0 -422
  259. data/test/files/encoding.html +0 -82
  260. data/test/files/encoding.xhtml +0 -84
  261. data/test/files/exslt.xml +0 -8
  262. data/test/files/exslt.xslt +0 -35
  263. data/test/files/foo/foo.xsd +0 -4
  264. data/test/files/metacharset.html +0 -10
  265. data/test/files/namespace_pressure_test.xml +0 -1684
  266. data/test/files/noencoding.html +0 -47
  267. data/test/files/po.xml +0 -32
  268. data/test/files/po.xsd +0 -66
  269. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  270. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  271. data/test/files/saml/xenc_schema.xsd +0 -146
  272. data/test/files/saml/xmldsig_schema.xsd +0 -318
  273. data/test/files/shift_jis.html +0 -10
  274. data/test/files/shift_jis.xml +0 -5
  275. data/test/files/shift_jis_no_charset.html +0 -9
  276. data/test/files/slow-xpath.xml +0 -25509
  277. data/test/files/snuggles.xml +0 -3
  278. data/test/files/staff.dtd +0 -10
  279. data/test/files/staff.xml +0 -59
  280. data/test/files/staff.xslt +0 -32
  281. data/test/files/test_document_url/bar.xml +0 -2
  282. data/test/files/test_document_url/document.dtd +0 -4
  283. data/test/files/test_document_url/document.xml +0 -6
  284. data/test/files/tlm.html +0 -851
  285. data/test/files/to_be_xincluded.xml +0 -2
  286. data/test/files/valid_bar.xml +0 -2
  287. data/test/files/xinclude.xml +0 -4
  288. data/test/helper.rb +0 -271
  289. data/test/html/sax/test_parser.rb +0 -168
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_parser_text.rb +0 -163
  292. data/test/html/sax/test_push_parser.rb +0 -87
  293. data/test/html/test_attributes.rb +0 -85
  294. data/test/html/test_builder.rb +0 -164
  295. data/test/html/test_document.rb +0 -712
  296. data/test/html/test_document_encoding.rb +0 -143
  297. data/test/html/test_document_fragment.rb +0 -310
  298. data/test/html/test_element_description.rb +0 -105
  299. data/test/html/test_named_characters.rb +0 -14
  300. data/test/html/test_node.rb +0 -212
  301. data/test/html/test_node_encoding.rb +0 -91
  302. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  303. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  304. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  306. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  308. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  309. data/test/test_convert_xpath.rb +0 -135
  310. data/test/test_css_cache.rb +0 -47
  311. data/test/test_encoding_handler.rb +0 -48
  312. data/test/test_memory_leak.rb +0 -156
  313. data/test/test_nokogiri.rb +0 -138
  314. data/test/test_soap4r_sax.rb +0 -52
  315. data/test/test_xslt_transforms.rb +0 -314
  316. data/test/xml/node/test_save_options.rb +0 -28
  317. data/test/xml/node/test_subclass.rb +0 -44
  318. data/test/xml/sax/test_parser.rb +0 -402
  319. data/test/xml/sax/test_parser_context.rb +0 -115
  320. data/test/xml/sax/test_parser_text.rb +0 -202
  321. data/test/xml/sax/test_push_parser.rb +0 -265
  322. data/test/xml/test_attr.rb +0 -74
  323. data/test/xml/test_attribute_decl.rb +0 -86
  324. data/test/xml/test_builder.rb +0 -341
  325. data/test/xml/test_c14n.rb +0 -180
  326. data/test/xml/test_cdata.rb +0 -54
  327. data/test/xml/test_comment.rb +0 -40
  328. data/test/xml/test_document.rb +0 -982
  329. data/test/xml/test_document_encoding.rb +0 -31
  330. data/test/xml/test_document_fragment.rb +0 -298
  331. data/test/xml/test_dtd.rb +0 -187
  332. data/test/xml/test_dtd_encoding.rb +0 -31
  333. data/test/xml/test_element_content.rb +0 -56
  334. data/test/xml/test_element_decl.rb +0 -73
  335. data/test/xml/test_entity_decl.rb +0 -122
  336. data/test/xml/test_entity_reference.rb +0 -262
  337. data/test/xml/test_namespace.rb +0 -96
  338. data/test/xml/test_node.rb +0 -1325
  339. data/test/xml/test_node_attributes.rb +0 -115
  340. data/test/xml/test_node_encoding.rb +0 -75
  341. data/test/xml/test_node_inheritance.rb +0 -32
  342. data/test/xml/test_node_reparenting.rb +0 -592
  343. data/test/xml/test_node_set.rb +0 -809
  344. data/test/xml/test_parse_options.rb +0 -64
  345. data/test/xml/test_processing_instruction.rb +0 -30
  346. data/test/xml/test_reader.rb +0 -620
  347. data/test/xml/test_reader_encoding.rb +0 -134
  348. data/test/xml/test_relax_ng.rb +0 -60
  349. data/test/xml/test_schema.rb +0 -142
  350. data/test/xml/test_syntax_error.rb +0 -36
  351. data/test/xml/test_text.rb +0 -60
  352. data/test/xml/test_unparented_node.rb +0 -483
  353. data/test/xml/test_xinclude.rb +0 -83
  354. data/test/xml/test_xpath.rb +0 -470
  355. data/test/xslt/test_custom_functions.rb +0 -133
  356. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,212 +0,0 @@
1
- require "helper"
2
-
3
- require 'nkf'
4
-
5
- module Nokogiri
6
- module HTML
7
- class TestNode < Nokogiri::TestCase
8
- def setup
9
- super
10
- @html = Nokogiri::HTML(<<-eohtml)
11
- <html>
12
- <head></head>
13
- <body>
14
- <div class='baz'><a href="foo" class="bar">first</a></div>
15
- </body>
16
- </html>
17
- eohtml
18
- end
19
-
20
- def test_to_a
21
- assert_equal [['class', 'bar'], ['href', 'foo']],@html.at('a').to_a.sort
22
- end
23
-
24
- def test_attr
25
- node = @html.at('div.baz')
26
- assert_equal node['class'], node.attr('class')
27
- end
28
-
29
- def test_get_attribute
30
- element = @html.at('div')
31
- assert_equal 'baz', element.get_attribute('class')
32
- assert_equal 'baz', element['class']
33
- element['href'] = "javascript:alert(\"AGGA-KA-BOO!\")"
34
- assert_match(/%22AGGA-KA-BOO!%22/, element.to_html)
35
- end
36
-
37
- # The HTML parser ignores namespaces, so even properly declared namespaces
38
- # are treated as as undeclared and have to be accessed via prefix:tagname
39
- def test_ns_attribute
40
- html = '<i foo:bar="baz"></i>'
41
- doc = Nokogiri::HTML(html)
42
- assert_equal 'baz', (doc%'i')['foo:bar']
43
- end
44
-
45
- def test_css_path_round_trip
46
- doc = Nokogiri::HTML(File.read(HTML_FILE))
47
- %w{ #header small div[2] div.post body }.each do |css_sel|
48
- ele = doc.at css_sel
49
- assert_equal ele, doc.at(ele.css_path), ele.css_path
50
- end
51
- end
52
-
53
- def test_path_round_trip
54
- doc = Nokogiri::HTML(File.read(HTML_FILE))
55
- %w{ #header small div[2] div.post body }.each do |css_sel|
56
- ele = doc.at css_sel
57
- assert_equal ele, doc.at(ele.path), ele.path
58
- end
59
- end
60
-
61
- def test_append_with_document
62
- assert_raises(ArgumentError) do
63
- @html.root << Nokogiri::HTML::Document.new
64
- end
65
- end
66
-
67
- ###
68
- # Make sure a document that doesn't declare a meta encoding returns
69
- # nil.
70
- def test_meta_encoding
71
- assert_nil @html.meta_encoding
72
- end
73
-
74
- def test_description
75
- assert desc = @html.at('a.bar').description
76
- assert_equal 'a', desc.name
77
- end
78
-
79
- def test_ancestors_with_selector
80
- assert node = @html.at('a.bar').child
81
- assert list = node.ancestors('.baz')
82
- assert_equal 1, list.length
83
- assert_equal 'div', list.first.name
84
- end
85
-
86
- def test_matches_inside_fragment
87
- fragment = DocumentFragment.new @html
88
- fragment << XML::Node.new('a', @html)
89
-
90
- a = fragment.children.last
91
- assert a.matches?('a'), 'a should match'
92
- end
93
-
94
- def test_css_matches?
95
- assert node = @html.at('a.bar')
96
- assert node.matches?('a.bar')
97
- end
98
-
99
- def test_xpath_matches?
100
- assert node = @html.at('//a')
101
- assert node.matches?('//a')
102
- end
103
-
104
- def test_unlink_then_swap
105
- node = @html.at('a')
106
- node.unlink
107
-
108
- another_node = @html.at('div')
109
- assert another_node, 'should have a node'
110
-
111
- # This used to segv
112
- assert node.add_previous_sibling another_node
113
- end
114
-
115
- def test_swap
116
- @html.at('div').swap('<a href="foo">bar</a>')
117
- a_tag = @html.css('a').first
118
- assert_equal 'body', a_tag.parent.name
119
- assert_equal 0, @html.css('div').length
120
- end
121
-
122
- def test_swap_with_regex_characters
123
- @html.at('div').swap('<a href="foo">ba)r</a>')
124
- a_tag = @html.css('a').first
125
- assert_equal 'ba)r', a_tag.text
126
- end
127
-
128
- def test_attribute_decodes_entities
129
- node = @html.at('div')
130
- node['href'] = 'foo&bar'
131
- assert_equal 'foo&bar', node['href']
132
- node['href'] += '&baz'
133
- assert_equal 'foo&bar&baz', node['href']
134
- end
135
-
136
- def test_parse_config_option
137
- node = @html.at('div')
138
- options = nil
139
- node.parse("<div></div>") do |config|
140
- options = config
141
- end
142
- assert_equal Nokogiri::XML::ParseOptions::DEFAULT_HTML, options.to_i
143
- end
144
-
145
- def test_fragment_handler_does_not_regurge_on_invalid_attributes
146
- iframe = %Q{<iframe style="width: 0%; height: 0px" src="http://someurl" allowtransparency></iframe>}
147
- assert @html.at('div').fragment(iframe)
148
- end
149
-
150
- def test_fragment
151
- fragment = @html.fragment(<<-eohtml)
152
- hello
153
- <div class="foo">
154
- <p>bar</p>
155
- </div>
156
- world
157
- eohtml
158
- assert_match(/^hello/, fragment.inner_html.strip)
159
- assert_equal 3, fragment.children.length
160
- assert p_tag = fragment.css('p').first
161
- assert_equal 'div', p_tag.parent.name
162
- assert_equal 'foo', p_tag.parent['class']
163
- end
164
-
165
- def test_fragment_serialization
166
- fragment = Nokogiri::HTML.fragment("<div>foo</div>")
167
- assert_equal "<div>foo</div>", fragment.serialize.chomp
168
- assert_equal "<div>foo</div>", fragment.to_xml.chomp
169
- assert_equal "<div>foo</div>", fragment.inner_html
170
- assert_equal "<div>foo</div>", fragment.to_html
171
- assert_equal "<div>foo</div>", fragment.to_s
172
- end
173
-
174
- def test_to_html_does_not_contain_entities
175
- return unless defined?(NKF) # NKF is not implemented on Rubinius as of 2009-11-23
176
- html = NKF.nkf("-e --msdos", <<-EOH)
177
- <html><body>
178
- <p> test paragraph
179
- foo bar </p>
180
- </body></html>
181
- EOH
182
- nokogiri = Nokogiri::HTML.parse(html)
183
-
184
- if RUBY_PLATFORM =~ /java/
185
- # NKF linebreak modes are not supported as of jruby 1.2
186
- # see http://jira.codehaus.org/browse/JRUBY-3602 for status
187
- assert_equal "<p>testparagraph\nfoobar</p>",
188
- nokogiri.at("p").to_html.gsub(/ /, '')
189
- else
190
- assert_equal "<p>testparagraph\r\nfoobar</p>",
191
- nokogiri.at("p").to_html.gsub(/ /, '')
192
- end
193
- end
194
- end
195
-
196
- def test_GH_1042
197
- file = File.join(ASSETS_DIR, 'GH_1042.html');
198
- html = Nokogiri::HTML(File.read(file))
199
- table = html.xpath("//table")[1]
200
- trs = table.xpath("tr").drop(1)
201
-
202
- # the jruby inplementation of drop uses dup() on the IRubyObject (which
203
- # is NOT the same dup() method on the ruby Object) which produces a
204
- # shallow clone. a shallow of valid XMLNode triggers several
205
- # NullPointerException on inspect() since loads of invariants
206
- # are not set. the fix for GH1042 ensures a proper working clone.
207
- assert_nothing_raised do
208
- trs.inspect
209
- end
210
- end
211
- end
212
- end
@@ -1,91 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module HTML
6
- class TestNodeEncoding < Nokogiri::TestCase
7
- def setup
8
- super
9
- @html = Nokogiri::HTML(File.open(NICH_FILE, "rb"))
10
- end
11
-
12
- def test_get_attribute
13
- node = @html.css('a').first
14
- assert_equal 'UTF-8', node['href'].encoding.name
15
- end
16
-
17
- def test_text_encoding_is_utf_8
18
- assert_equal 'UTF-8', @html.text.encoding.name
19
- end
20
-
21
- def test_serialize_encoding_html
22
- assert_equal @html.encoding.downcase,
23
- @html.serialize.encoding.name.downcase
24
-
25
- @doc = Nokogiri::HTML(@html.serialize)
26
- assert_equal @html.serialize, @doc.serialize
27
- end
28
-
29
- def test_default_encoding
30
- doc = Nokogiri::HTML(nil)
31
- assert_nil doc.encoding
32
- assert_equal 'UTF-8', doc.serialize.encoding.name
33
- end
34
-
35
- def test_encode_special_chars
36
- foo = @html.css('a').first.encode_special_chars('foo')
37
- assert_equal 'UTF-8', foo.encoding.name
38
- end
39
-
40
- def test_content
41
- node = @html.css('a').first
42
- assert_equal 'UTF-8', node.content.encoding.name
43
- end
44
-
45
- def test_name
46
- node = @html.css('a').first
47
- assert_equal 'UTF-8', node.name.encoding.name
48
- end
49
-
50
- def test_path
51
- node = @html.css('a').first
52
- assert_equal 'UTF-8', node.path.encoding.name
53
- end
54
-
55
- def test_inner_html
56
- doc = Nokogiri::HTML File.open(SHIFT_JIS_HTML, 'rb')
57
-
58
- hello = "こんにちは"
59
-
60
- contents = doc.at('h2').inner_html
61
- assert_equal doc.encoding, contents.encoding.name
62
- assert_match hello.encode('Shift_JIS'), contents
63
-
64
- contents = doc.at('h2').inner_html(:encoding => 'UTF-8')
65
- assert_match hello, contents
66
-
67
- doc.encoding = 'UTF-8'
68
- contents = doc.at('h2').inner_html
69
- assert_match hello, contents
70
- end
71
-
72
- def test_encoding_GH_1113
73
- doc = Nokogiri::HTML::Document.new
74
- hex = '<p>&#x1f340;</p>'
75
- decimal = '<p>&#127808;</p>'
76
- encoded = '<p>🍀</p>'
77
-
78
- doc.encoding = 'UTF-8'
79
- [hex, decimal, encoded].each do |document|
80
- assert_equal encoded, doc.fragment(document).to_s
81
- end
82
-
83
- doc.encoding = 'US-ASCII'
84
- expected = Nokogiri.jruby? ? hex : decimal
85
- [hex, decimal].each do |document|
86
- assert_equal expected, doc.fragment(document).to_s
87
- end
88
- end
89
- end
90
- end
91
- end
@@ -1,14 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestAdditionalNamespacesInBuilderDoc < Nokogiri::TestCase
6
- def test_builder_namespaced_root_node_ns
7
- b = Nokogiri::XML::Builder.new do |x|
8
- x[:foo].RDF(:'xmlns:foo' => 'http://foo.io')
9
- end
10
- assert_equal 'http://foo.io', b.doc.root.namespace.href
11
- end
12
- end
13
- end
14
- end
@@ -1,24 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestAliasedDefaultNamespaces < Nokogiri::TestCase
6
- def setup
7
- super
8
- end
9
-
10
- def test_alised_default_namespace_on_parse
11
- doc = Nokogiri::XML('<apple xmlns="ns:fruit" xmlns:fruit="ns:fruit" />')
12
- ns = doc.root.namespaces
13
- assert_equal "ns:fruit", ns["xmlns:fruit"], "Should have parsed aliased default namespace"
14
- end
15
-
16
- def test_add_aliased_default_namespace
17
- doc = Nokogiri::XML('<apple xmlns="ns:fruit" />')
18
- doc.root.add_namespace_definition("fruit", "ns:fruit")
19
- ns = doc.root.namespaces
20
- assert_equal "ns:fruit", ns["xmlns:fruit"],"Should have added aliased default namespace"
21
- end
22
- end
23
- end
24
- end
@@ -1,75 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNamespacesInBuilderDoc < Nokogiri::TestCase
6
- def setup
7
- super
8
- b = Nokogiri::XML::Builder.new do |x|
9
- x.fruit(:xmlns => 'ns:fruit', :'xmlns:veg' => 'ns:veg', :'xmlns:xlink' => 'http://www.w3.org/1999/xlink') do
10
- x.pear { x.bosc }
11
- x.orange
12
- x[:veg].carrot do
13
- x.cheese(:xmlns => 'ns:dairy', :'xlink:href' => 'http://example.com/cheese/')
14
- end
15
- x[:meat].bacon(:'xmlns:meat' => 'ns:meat') do
16
- x.apple :count => 2
17
- x[:veg].tomato
18
- end
19
- end
20
- end
21
-
22
- @doc = b.doc
23
- end
24
-
25
- def check_namespace e
26
- e.namespace.nil? ? nil : e.namespace.href
27
- end
28
-
29
- def test_builder_default_ns
30
- assert_equal 'ns:fruit', check_namespace(@doc.root)
31
- end
32
- def test_builder_parent_default_ns
33
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0])
34
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[1])
35
- end
36
- def test_builder_grandparent_default_ns
37
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0].elements[0])
38
- end
39
- def test_builder_parent_nondefault_ns
40
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[2])
41
- end
42
- def test_builder_single_decl_ns_1
43
- assert_equal 'ns:dairy', check_namespace(@doc.root.elements[2].elements[0])
44
- end
45
- def test_builder_nondefault_attr_ns
46
- assert_equal 'http://www.w3.org/1999/xlink',
47
- check_namespace(@doc.root.elements[2].elements[0].attribute_nodes.find { |a| a.name =~ /href/ })
48
- end
49
- def test_builder_single_decl_ns_2
50
- assert_equal 'ns:meat', check_namespace(@doc.root.elements[3])
51
- end
52
- def test_builder_buried_default_ns
53
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[3].elements[0])
54
- end
55
- def test_builder_buried_decl_ns
56
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[3].elements[1])
57
- end
58
- def test_builder_namespace_count
59
- n = @doc.root.clone
60
- n.children.each(&:remove)
61
- ns_attrs = n.to_xml.scan(/\bxmlns(?::.+?)?=/)
62
- assert_equal 3, ns_attrs.length
63
- end
64
-
65
- def test_builder_namespaced_attribute_on_unparented_node
66
- doc = Nokogiri::XML::Builder.new do |x|
67
- x.root('xmlns:foo' => 'http://foo.io') {
68
- x.obj('foo:attr' => 'baz')
69
- }
70
- end.doc
71
- assert_equal 'http://foo.io', doc.root.children.first.attribute_nodes.first.namespace.href
72
- end
73
- end
74
- end
75
- end
@@ -1,31 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNamespacesInClonedDoc < Nokogiri::TestCase
6
- def setup
7
- super
8
- b = Nokogiri::XML::Builder.new do |xml|
9
- xml.mods("xmlns"=>"http://www.loc.gov/mods/v3") {
10
- xml.name(:type=>"personal") {
11
- xml.namePart()
12
- }
13
- }
14
- end
15
-
16
- @doc = b.doc
17
- @clone = Nokogiri::XML(@doc.to_s)
18
- end
19
-
20
- def check_namespace e
21
- e.namespace.nil? ? nil : e.namespace.href
22
- end
23
-
24
- def test_namespace_ns
25
- xpath = '//oxns:name[@type="personal"]'
26
- namespaces = {'oxns' => "http://www.loc.gov/mods/v3"}
27
- assert_equal @doc.xpath(xpath, namespaces).length, @clone.xpath(xpath, namespaces).length
28
- end
29
- end
30
- end
31
- end
@@ -1,75 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNamespacesInCreatedDoc < Nokogiri::TestCase
6
- def setup
7
- super
8
- @doc = Nokogiri::XML('<fruit xmlns="ns:fruit" xmlns:veg="ns:veg" xmlns:xlink="http://www.w3.org/1999/xlink"/>')
9
- pear = @doc.create_element('pear')
10
- bosc = @doc.create_element('bosc')
11
- pear.add_child(bosc)
12
- @doc.root << pear
13
- @doc.root.add_child('<orange/>')
14
- carrot = @doc.create_element('veg:carrot')
15
- @doc.root << carrot
16
- cheese = @doc.create_element('cheese', :xmlns => 'ns:dairy', :'xlink:href' => 'http://example.com/cheese/')
17
- carrot << cheese
18
- bacon = @doc.create_element('meat:bacon', :'xmlns:meat' => 'ns:meat')
19
- apple = @doc.create_element('apple')
20
- apple['count'] = 2
21
- bacon << apple
22
- tomato = @doc.create_element('veg:tomato')
23
- bacon << tomato
24
- @doc.root << bacon
25
- end
26
-
27
- def check_namespace e
28
- e.namespace.nil? ? nil : e.namespace.href
29
- end
30
-
31
- def test_created_default_ns
32
- assert_equal 'ns:fruit', check_namespace(@doc.root)
33
- end
34
- def test_created_parent_default_ns
35
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0])
36
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[1])
37
- end
38
- def test_created_grandparent_default_ns
39
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0].elements[0])
40
- end
41
- def test_created_parent_nondefault_ns
42
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[2])
43
- end
44
- def test_created_single_decl_ns_1
45
- assert_equal 'ns:dairy', check_namespace(@doc.root.elements[2].elements[0])
46
- end
47
- def test_created_nondefault_attr_ns
48
- assert_equal 'http://www.w3.org/1999/xlink',
49
- check_namespace(@doc.root.elements[2].elements[0].attribute_nodes.find { |a| a.name =~ /href/ })
50
- end
51
- def test_created_single_decl_ns_2
52
- assert_equal 'ns:meat', check_namespace(@doc.root.elements[3])
53
- end
54
- def test_created_buried_default_ns
55
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[3].elements[0])
56
- end
57
- def test_created_buried_decl_ns
58
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[3].elements[1])
59
- end
60
- def test_created_namespace_count
61
- n = @doc.root.clone
62
- n.children.each(&:remove)
63
- ns_attrs = n.to_xml.scan(/\bxmlns(?::.+?)?=/)
64
- assert_equal 3, ns_attrs.length
65
- end
66
-
67
- def test_created_namespaced_attribute_on_unparented_node
68
- doc = Nokogiri::XML('<root xmlns:foo="http://foo.io"/>')
69
- node = @doc.create_element('obj', 'foo:attr' => 'baz')
70
- doc.root.add_child(node)
71
- assert_equal 'http://foo.io', doc.root.children.first.attribute_nodes.first.namespace.href
72
- end
73
- end
74
- end
75
- end
@@ -1,80 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNamespacesInParsedDoc < Nokogiri::TestCase
6
- def setup
7
- super
8
- @doc = Nokogiri::XML <<-eoxml
9
- <fruit xmlns="ns:fruit" xmlns:veg="ns:veg" xmlns:xlink="http://www.w3.org/1999/xlink">
10
- <pear>
11
- <bosc/>
12
- </pear>
13
- <orange/>
14
- <veg:carrot>
15
- <cheese xmlns="ns:dairy" xlink:href="http://example.com/cheese/"/>
16
- </veg:carrot>
17
- <meat:bacon xmlns:meat="ns:meat">
18
- <apple count="2"/>
19
- <veg:tomato/>
20
- </meat:bacon>
21
- </fruit>
22
- eoxml
23
- end
24
-
25
- def check_namespace e
26
- e.namespace.nil? ? nil : e.namespace.href
27
- end
28
-
29
- def test_parsed_default_ns
30
- assert_equal 'ns:fruit', check_namespace(@doc.root)
31
- end
32
- def test_parsed_parent_default_ns
33
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0])
34
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[1])
35
- end
36
- def test_parsed_grandparent_default_ns
37
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[0].elements[0])
38
- end
39
- def test_parsed_parent_nondefault_ns
40
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[2])
41
- end
42
- def test_parsed_single_decl_ns_1
43
- assert_equal 'ns:dairy', check_namespace(@doc.root.elements[2].elements[0])
44
- end
45
- def test_parsed_nondefault_attr_ns
46
- assert_equal 'http://www.w3.org/1999/xlink',
47
- check_namespace(@doc.root.elements[2].elements[0].attribute_nodes.find { |a| a.name =~ /href/ })
48
- end
49
- def test_parsed_single_decl_ns_2
50
- assert_equal 'ns:meat', check_namespace(@doc.root.elements[3])
51
- end
52
- def test_parsed_buried_default_ns
53
- assert_equal 'ns:fruit', check_namespace(@doc.root.elements[3].elements[0])
54
- end
55
- def test_parsed_buried_decl_ns
56
- assert_equal 'ns:veg', check_namespace(@doc.root.elements[3].elements[1])
57
- end
58
- def test_parsed_namespace_count
59
- n = @doc.root.clone
60
- n.children.each(&:remove)
61
- ns_attrs = n.to_xml.scan(/\bxmlns(?::.+?)?=/)
62
- assert_equal 3, ns_attrs.length
63
- end
64
-
65
- def test_namespaces_under_memory_pressure_issue1155
66
- skip("JRuby doesn't do GC.") if Nokogiri.jruby?
67
-
68
- # this test is here to emit warnings when run under valgrind
69
- # see https://github.com/sparklemotion/nokogiri/issues/1155 for background
70
- filename = File.join ASSETS_DIR, 'namespace_pressure_test.xml'
71
- doc = Nokogiri::XML File.open(filename)
72
-
73
- # bizarrely, can't repro without the call to #to_a
74
- doc.xpath('//namespace::*').to_a.each do |ns|
75
- ns.inspect
76
- end
77
- end
78
- end
79
- end
80
- end
@@ -1,31 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestNamespacePreservation < Nokogiri::TestCase
6
-
7
- def setup
8
- @xml = Nokogiri.XML <<-eoxml
9
- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
10
- <xs:element xmlns:quer="http://api.geotrust.com/webtrust/query"/>
11
- <xs:element xmlns:quer="http://api.geotrust.com/webtrust/query"/>
12
- </xs:schema>
13
- eoxml
14
- end
15
-
16
- def test_xpath
17
- first = @xml.at_xpath('//xs:element', 'xs' => 'http://www.w3.org/2001/XMLSchema')
18
- last = @xml.at_xpath('//xs:element[last()]', 'xs' => 'http://www.w3.org/2001/XMLSchema')
19
- assert_equal 'http://api.geotrust.com/webtrust/query' , first.namespaces['xmlns:quer'], "Should contain quer namespace"
20
- assert_equal 'http://api.geotrust.com/webtrust/query' , last.namespaces['xmlns:quer'], "Should contain quer namespace"
21
- end
22
-
23
- def test_traversing
24
- first = @xml.root.element_children.first
25
- last = @xml.root.element_children.last
26
- assert_equal 'http://api.geotrust.com/webtrust/query' , first.namespaces['xmlns:quer'], "Should contain quer namespace"
27
- assert_equal 'http://api.geotrust.com/webtrust/query' , last.namespaces['xmlns:quer'], "Should contain quer namespace"
28
- end
29
- end
30
- end
31
- end