diff options
author | Patrick J Volkerding <volkerdi@slackware.com> | 2020-05-03 06:47:41 +0000 |
---|---|---|
committer | Eric Hameleers <alien@slackware.com> | 2020-05-03 17:59:53 +0200 |
commit | df4c9b091989c5fbea58f5b42abbb5e6c545a931 (patch) | |
tree | 59337ea7d5df4f2ede731af6f97d535b699ca1a3 /source/xap | |
parent | 5d2f3453069f478671957b6476e301229df533fa (diff) | |
download | current-df4c9b091989c5fbea58f5b42abbb5e6c545a931.tar.gz |
Sun May 3 06:47:41 UTC 202020200503064741
a/kernel-generic-5.4.38-x86_64-1.txz: Upgraded.
a/kernel-huge-5.4.38-x86_64-1.txz: Upgraded.
a/kernel-modules-5.4.38-x86_64-1.txz: Upgraded.
d/kernel-headers-5.4.38-x86-1.txz: Upgraded.
d/mercurial-5.4-x86_64-1.txz: Upgraded.
k/kernel-source-5.4.38-noarch-1.txz: Upgraded.
l/mozilla-nss-3.52-x86_64-1.txz: Upgraded.
l/python-distro-1.5.0-x86_64-1.txz: Upgraded.
l/python-pillow-7.1.2-x86_64-1.txz: Upgraded.
l/v4l-utils-1.18.1-x86_64-1.txz: Upgraded.
xap/seamonkey-2.53.2-x86_64-1.txz: Upgraded.
This update contains security fixes and improvements.
For more information, see:
https://www.seamonkey-project.org/releases/seamonkey2.53.2
(* Security fix *)
isolinux/initrd.img: Rebuilt.
kernels/*: Upgraded.
usb-and-pxe-installers/usbboot.img: Rebuilt.
Diffstat (limited to 'source/xap')
-rwxr-xr-x | source/xap/seamonkey/seamonkey.SlackBuild | 12 | ||||
-rw-r--r-- | source/xap/seamonkey/seamonkey.gettid.patch | 35 | ||||
-rw-r--r-- | source/xap/seamonkey/seamonkey.nsstring.patch | 24 | ||||
-rw-r--r-- | source/xap/seamonkey/seamonkey.rust.encoding_rs.diff | 17 | ||||
-rw-r--r-- | source/xap/seamonkey/seamonkey.rust14x.diff | 4279 |
5 files changed, 1 insertions, 4366 deletions
diff --git a/source/xap/seamonkey/seamonkey.SlackBuild b/source/xap/seamonkey/seamonkey.SlackBuild index 817221bf..feacb5c1 100755 --- a/source/xap/seamonkey/seamonkey.SlackBuild +++ b/source/xap/seamonkey/seamonkey.SlackBuild @@ -26,7 +26,7 @@ PKGNAM=seamonkey TARBALLVER=${VERSION:-$(basename $(ls seamonkey-*.tar.* | cut -d - -f 2 | rev | cut -f 3- -d . | rev) .source)} # Strip the end from beta versions: VERSION=$(echo $TARBALLVER | cut -f 1 -d b) -BUILD=${BUILD:-2} +BUILD=${BUILD:-1} # Automatically determine the architecture we're building on: if [ -z "$ARCH" ]; then @@ -122,16 +122,6 @@ cd seamonkey-${TARBALLVER} || exit 1 # Retain GTK+ v2 scrolling behavior: zcat $CWD/sm.ui.scrollToClick.diff.gz | patch -p1 --verbose || exit 1 -# Fix for glibc-2.30's included gettid(): -zcat $CWD/seamonkey.gettid.patch.gz | patch -p1 --verbose || exit 1 - -# Don't fail on a Rust warning due to deprecated syntax: -zcat $CWD/seamonkey.nsstring.patch.gz | patch -p0 --verbose || exit 1 - -# More Rust syntax changes: -zcat $CWD/seamonkey.rust14x.diff.gz | patch -p1 --verbose || exit 1 -zcat $CWD/seamonkey.rust.encoding_rs.diff.gz | patch -p1 --verbose || exit 1 - # Make sure the perms/ownerships are sane: chown -R root:root . find . \ diff --git a/source/xap/seamonkey/seamonkey.gettid.patch b/source/xap/seamonkey/seamonkey.gettid.patch deleted file mode 100644 index 42a39247..00000000 --- a/source/xap/seamonkey/seamonkey.gettid.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- ./mozilla/tools/profiler/core/platform.h.orig 2020-02-17 17:39:44.000000000 -0600 -+++ ./mozilla/tools/profiler/core/platform.h 2020-02-29 22:43:51.381996340 -0600 -@@ -43,32 +43,6 @@ - #include <vector> - #include "StackTop.h" - --// We need a definition of gettid(), but glibc doesn't provide a --// wrapper for it. --#if defined(__GLIBC__) --#include <unistd.h> --#include <sys/syscall.h> --static inline pid_t gettid() --{ -- return (pid_t) syscall(SYS_gettid); --} --#elif defined(GP_OS_darwin) --#include <unistd.h> --#include <sys/syscall.h> --static inline pid_t gettid() --{ -- return (pid_t) syscall(SYS_thread_selfid); --} --#elif defined(GP_OS_android) --#include <unistd.h> --#elif defined(GP_OS_windows) --#include <windows.h> --#include <process.h> --#ifndef getpid --#define getpid _getpid --#endif --#endif -- - extern mozilla::LazyLogModule gProfilerLog; - - // These are for MOZ_LOG="prof:3" or higher. It's the default logging level for diff --git a/source/xap/seamonkey/seamonkey.nsstring.patch b/source/xap/seamonkey/seamonkey.nsstring.patch deleted file mode 100644 index 83f5dd87..00000000 --- a/source/xap/seamonkey/seamonkey.nsstring.patch +++ /dev/null @@ -1,24 +0,0 @@ -# rust-1.39 deprecated the "try!" call in favor of "?" which then breaks -# nsstring because it treats warnings as errors. - -diff -Nrup -U 8 mozilla/xpcom/rust/nsstring/src/lib.rs mozilla-OK/xpcom/rust/nsstring/src/lib.rs ---- mozilla/xpcom/rust/nsstring/src/lib.rs 2020-02-25 03:10:53.802918476 +0300 -+++ mozilla-OK/xpcom/rust/nsstring/src/lib.rs 2020-02-25 00:30:21.593463335 +0300 -@@ -108,17 +108,16 @@ - //! similar to an `ns[C]String<'static>`, however, it does not have a `Drop` - //! implementation. - //! - //! If this type is dropped in rust, it will not free its backing storage. This - //! can be useful when implementing FFI types which contain `ns[C]String` members - //! which invoke their member's destructors through C++ code. - - #![allow(non_camel_case_types)] --#![deny(warnings)] - - #[macro_use] - extern crate bitflags; - - use std::ops::{Deref, DerefMut}; - use std::marker::PhantomData; - use std::borrow; - use std::slice; diff --git a/source/xap/seamonkey/seamonkey.rust.encoding_rs.diff b/source/xap/seamonkey/seamonkey.rust.encoding_rs.diff deleted file mode 100644 index cf96490d..00000000 --- a/source/xap/seamonkey/seamonkey.rust.encoding_rs.diff +++ /dev/null @@ -1,17 +0,0 @@ ---- ./mozilla/third_party/rust/encoding_rs/src/utf_16.rs.orig 2020-02-17 17:39:16.000000000 -0600 -+++ ./mozilla/third_party/rust/encoding_rs/src/utf_16.rs 2020-02-29 18:36:54.760363683 -0600 -@@ -30,7 +30,7 @@ - ) - } - -- pub fn additional_from_state(&self) -> usize() { -+ pub fn additional_from_state(&self) -> usize { - 1 + if self.lead_byte.is_some() { 1 } else { 0 } + - if self.lead_surrogate == 0 { 0 } else { 2 } - } ---- ./mozilla/third_party/rust/encoding_rs/.cargo-checksum.json.orig 2020-02-17 17:39:16.000000000 -0600 -+++ ./mozilla/third_party/rust/encoding_rs/.cargo-checksum.json 2020-02-29 20:36:51.768670989 -0600 -@@ -1 +1 @@ --{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"4d1af7257c9619f7ae66fc271ba2c1be5f063640ae8ceaa235c8c8aaf32f44ea","CONTRIBUTING.md":"e4ffa92c979c7e6ca7b676842a708ea05b84181327fcde43dfcd8038b678a057","COPYRIGHT":"20d4fff11cca11529df3f02096fbe8ffe350219cdb07cdedea34e6a762866da5","Cargo.toml":"b74676e1affb0a2b528507be488bd9588db646b3b05807dada63cbe7b0747fc6","Ideas.md":"c1be4cc91621f52f38ea7febda7a4bb68086189cacc834c7edac4ba1a9da02fe","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"74aa8b6d04c36bb640ee81187a3f24a2fa94e36d4c1d4f2ca164c3784ae87a83","README.md":"276d801faf4d6347c3ea32ae252cab95df653c846beaac535c5d70cf32094f5e","generate-encoding-data.py":"0b62de6d3b6368166b78a9259f06dc8d0f558504a0ed866dbe75dc2efb4bf464","rustfmt.toml":"c01c06dfbdfcf30730535aab911d69068febb921e2faef9571ceeb6a5c2a3eab","src/ascii.rs":"240c607d3bad850c57d1e96871d5c0371278ed3923c38354bbb4c8a876c9a515","src/big5.rs":"614d479aabc63007f778d1f776a37b885e13d20b7c6c7a2818a729bde342f8a6","src/data.rs":"412c842c698c3ce1cec4a27ab19ca275372ac28940ac49cdf3e0dad71a2c2812","src/euc_jp.rs":"feda0ade5e1c3e4abd7637c59373b977662007990fd164ea7db1acc502ba3534","src/euc_kr.rs":"23e08359ccbe7602f3a90fce78dc76fd4065c236820ac0d11c9d9325045da0e6","src/gb18030.rs":"aa9de27a41715dfb02a3b9161d86e3775f635f625f70d3abaadcd583ee7022c0","src/handles.rs":"8b0691ab21d638bd20078e33247f13afbc8012ff4b843a2fd03e3314353e8520","src/iso_2022_jp.rs":"285e7cea6df41d182a345a0f394a2348b1c313f0d55ed48c349824f2a6aff526","src/lib.rs":"dad6465f541ccdb171312879999d842dcbf11bc09119d81963df3a20f7d4e474","src/macros.rs":"9ab30e7194f61f268cd7d899cabb06ff9ca7717663926fd583b20334f49ac8d3","src/replacement.rs":"782f03f04d110e9a0656262bf4296aa0ab8199e196cb63239c30d9649996caa4","src/shift_jis.rs":"84df4ff58b60e0827d6c0c7049f2cf19033f2b9e25a9186bcfb0bbb05e87b380","src/simd_funcs.rs":"ff30e10bfb58fb8f56f0cc0b4dbcc4af6b343487562ee279ace8b31afd7bcccc","src/single_byte.rs":"0342a921427ed160f5cbe4532490aff5db00886a36b70273f54d8f6a9dcf6974","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"0bcf7eeb8bb33cbc88bd3bd8462437501a43055db02c40a12a15fae8e68dd1cb","src/testing.rs":"60f85c6fb63fd4ab62e90dfa005920e79e0e1885795dc13a7a3c1980507925b1","src/utf_16.rs":"8155c1c0acaab2826ee9f99ba911fbd3125707d797327e630977bc2f3f9b1064","src/utf_8.rs":"14cd64de87d8fc5f814f52f76390bda0b4c705da98e73e376fb424ca02119ba5","src/utf_8_core.rs":"0229de223eef17ad16751a646bcd3839c24f24069d660a4dc61b8a5fad19d16f","src/variant.rs":"93dfec2dcfc9fd9711bb55d48177f4a0e9479c7fbd055f08db3853338569da83","src/x_user_defined.rs":"420fae797ea94e7a51eb005b97621ab32d68a8532c565afc60ecce6bdd84b6bd"},"package":"e00a1b1e95eb46988805ceee6f34cd95c46a6753e290cb3ff0486931989d4a4c"} -\ No newline at end of file -+{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"4d1af7257c9619f7ae66fc271ba2c1be5f063640ae8ceaa235c8c8aaf32f44ea","CONTRIBUTING.md":"e4ffa92c979c7e6ca7b676842a708ea05b84181327fcde43dfcd8038b678a057","COPYRIGHT":"20d4fff11cca11529df3f02096fbe8ffe350219cdb07cdedea34e6a762866da5","Cargo.toml":"b74676e1affb0a2b528507be488bd9588db646b3b05807dada63cbe7b0747fc6","Ideas.md":"c1be4cc91621f52f38ea7febda7a4bb68086189cacc834c7edac4ba1a9da02fe","LICENSE-APACHE":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","LICENSE-MIT":"74aa8b6d04c36bb640ee81187a3f24a2fa94e36d4c1d4f2ca164c3784ae87a83","README.md":"276d801faf4d6347c3ea32ae252cab95df653c846beaac535c5d70cf32094f5e","generate-encoding-data.py":"0b62de6d3b6368166b78a9259f06dc8d0f558504a0ed866dbe75dc2efb4bf464","rustfmt.toml":"c01c06dfbdfcf30730535aab911d69068febb921e2faef9571ceeb6a5c2a3eab","src/ascii.rs":"240c607d3bad850c57d1e96871d5c0371278ed3923c38354bbb4c8a876c9a515","src/big5.rs":"614d479aabc63007f778d1f776a37b885e13d20b7c6c7a2818a729bde342f8a6","src/data.rs":"412c842c698c3ce1cec4a27ab19ca275372ac28940ac49cdf3e0dad71a2c2812","src/euc_jp.rs":"feda0ade5e1c3e4abd7637c59373b977662007990fd164ea7db1acc502ba3534","src/euc_kr.rs":"23e08359ccbe7602f3a90fce78dc76fd4065c236820ac0d11c9d9325045da0e6","src/gb18030.rs":"aa9de27a41715dfb02a3b9161d86e3775f635f625f70d3abaadcd583ee7022c0","src/handles.rs":"8b0691ab21d638bd20078e33247f13afbc8012ff4b843a2fd03e3314353e8520","src/iso_2022_jp.rs":"285e7cea6df41d182a345a0f394a2348b1c313f0d55ed48c349824f2a6aff526","src/lib.rs":"dad6465f541ccdb171312879999d842dcbf11bc09119d81963df3a20f7d4e474","src/macros.rs":"9ab30e7194f61f268cd7d899cabb06ff9ca7717663926fd583b20334f49ac8d3","src/replacement.rs":"782f03f04d110e9a0656262bf4296aa0ab8199e196cb63239c30d9649996caa4","src/shift_jis.rs":"84df4ff58b60e0827d6c0c7049f2cf19033f2b9e25a9186bcfb0bbb05e87b380","src/simd_funcs.rs":"ff30e10bfb58fb8f56f0cc0b4dbcc4af6b343487562ee279ace8b31afd7bcccc","src/single_byte.rs":"0342a921427ed160f5cbe4532490aff5db00886a36b70273f54d8f6a9dcf6974","src/test_data/big5_in.txt":"4c5a8691f8dc717311889c63894026d2fb62725a86c4208ca274a9cc8d42a503","src/test_data/big5_in_ref.txt":"99d399e17750cf9c7cf30bb253dbfe35b81c4fcbdead93cfa48b1429213473c7","src/test_data/big5_out.txt":"6193ca97c297aa20e09396038d18e938bb7ea331c26f0f2454097296723a0b13","src/test_data/big5_out_ref.txt":"36567691f557df144f6cc520015a87038dfa156f296fcf103b56ae9a718be1fc","src/test_data/euc_kr_in.txt":"c86a7224f3215fa0d04e685622a752fdc72763e8ae076230c7fd62de57ec4074","src/test_data/euc_kr_in_ref.txt":"1f419f4ca47d708b54c73c461545a022ae2e20498fdbf8005a483d752a204883","src/test_data/euc_kr_out.txt":"e7f32e026f70be1e1b58e0047baf7d3d2c520269c4f9b9992e158b4decb0a1a3","src/test_data/euc_kr_out_ref.txt":"c9907857980b20b8e9e3b584482ed6567a2be6185d72237b6322f0404944924e","src/test_data/gb18030_in.txt":"ab7231b2d3e9afacdbd7d7f3b9e5361a7ff9f7e1cfdb4f3bd905b9362b309e53","src/test_data/gb18030_in_ref.txt":"dc5069421adca2043c55f5012b55a76fdff651d22e6e699fd0978f8d5706815c","src/test_data/gb18030_out.txt":"f0208d527f5ca63de7d9a0323be8d5cf12d8a104b2943d92c2701f0c3364dac1","src/test_data/gb18030_out_ref.txt":"6819fe47627e4ea01027003fc514b9f21a1322e732d7f1fb92cc6c5455bc6c07","src/test_data/iso_2022_jp_in.txt":"cd24bbdcb1834e25db54646fbf4c41560a13dc7540f6be3dba4f5d97d44513af","src/test_data/iso_2022_jp_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/iso_2022_jp_out.txt":"9b6f015329dda6c3f9ee5ce6dbd6fa9c89acc21283e886836c78b8d833480c21","src/test_data/iso_2022_jp_out_ref.txt":"78cb260093a20116ad9a42f43b05d1848c5ab100b6b9a850749809e943884b35","src/test_data/jis0208_in.txt":"6df3030553ffb0a6615bb33dc8ea9dca6d9623a9028e2ffec754ce3c3da824cc","src/test_data/jis0208_in_ref.txt":"3dc4e6a5e06471942d086b16c9440945e78415f6f3f47e43717e4bc2eac2cdf5","src/test_data/jis0208_out.txt":"4ec24477e1675ce750733bdc3c5add1cd27b6bd4ce1f09289564646e9654e857","src/test_data/jis0208_out_ref.txt":"c3e1cef5032b2b1d93a406f31ff940c4e2dfe8859b8b17ca2761fee7a75a0e48","src/test_data/jis0212_in.txt":"c011f0dd72bd7c8cd922df9374ef8d2769a77190514c77f6c62b415852eeb9fe","src/test_data/jis0212_in_ref.txt":"7d9458b3d2f73e7092a7f505c08ce1d233dde18aa679fbcf9889256239cc9e06","src/test_data/shift_jis_in.txt":"02e389ccef0dd2122e63f503899402cb7f797912c2444cc80ab93131116c5524","src/test_data/shift_jis_in_ref.txt":"512f985950ca902e643c88682dba9708b7c38d3c5ec2925168ab00ac94ab19f9","src/test_data/shift_jis_out.txt":"5fbc44da7bf639bf6cfe0fa1fd3eba7102b88f81919c9ea991302712f69426fb","src/test_data/shift_jis_out_ref.txt":"466322c6fed8286c64582731755290c2296508efdd258826e6279686649b481f","src/test_labels_names.rs":"0bcf7eeb8bb33cbc88bd3bd8462437501a43055db02c40a12a15fae8e68dd1cb","src/testing.rs":"60f85c6fb63fd4ab62e90dfa005920e79e0e1885795dc13a7a3c1980507925b1","src/utf_16.rs":"1d2c40857c946f6eecf724efc60a196865b4d84a59b08b42fbe4576fa8308fd0","src/utf_8.rs":"14cd64de87d8fc5f814f52f76390bda0b4c705da98e73e376fb424ca02119ba5","src/utf_8_core.rs":"0229de223eef17ad16751a646bcd3839c24f24069d660a4dc61b8a5fad19d16f","src/variant.rs":"93dfec2dcfc9fd9711bb55d48177f4a0e9479c7fbd055f08db3853338569da83","src/x_user_defined.rs":"420fae797ea94e7a51eb005b97621ab32d68a8532c565afc60ecce6bdd84b6bd"},"package":"e00a1b1e95eb46988805ceee6f34cd95c46a6753e290cb3ff0486931989d4a4c"} diff --git a/source/xap/seamonkey/seamonkey.rust14x.diff b/source/xap/seamonkey/seamonkey.rust14x.diff deleted file mode 100644 index 3287eed0..00000000 --- a/source/xap/seamonkey/seamonkey.rust14x.diff +++ /dev/null @@ -1,4279 +0,0 @@ -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/netwerk/base/rust-url-capi/Cargo.toml seamonkey-2.53.1/mozilla/netwerk/base/rust-url-capi/Cargo.toml ---- seamonkey-2.53.1.orig/mozilla/netwerk/base/rust-url-capi/Cargo.toml 2020-02-17 17:37:59.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/netwerk/base/rust-url-capi/Cargo.toml 2020-02-29 21:16:23.109772243 -0600 -@@ -8,6 +8,6 @@ - - [dependencies] - libc = "0.2.0" --url = "1.5.1" -+url = "1.7.2" - nsstring = { path = "../../../xpcom/rust/nsstring" } - nserror = { path = "../../../xpcom/rust/nserror" } -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/.cargo-checksum.json seamonkey-2.53.1/mozilla/third_party/rust/url/.cargo-checksum.json ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/.cargo-checksum.json 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/.cargo-checksum.json 2020-02-29 21:15:43.797770564 -0600 -@@ -1 +1 @@ --{"files":{".cargo-ok":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",".travis.yml":"890af214187ffcba4732acb2d1af30d7adb9aade0679e9fdb06baae363240b8e","Cargo.toml":"ec586106c4d0625919a3591fe3ae915043e82c8bfdd1c9e747171ba5e21047e1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","Makefile":"bffd75d34654b2955d4f005f1a5e85c821c90becf1a8a52cbe10121972f43148","README.md":"eb3f4694003f408cbe3c7f3e9fbbc71241defb940cc55a816981f0f0f144c8eb","UPGRADING.md":"fbcc2d39bdf17db0745793db6626fcd5c909dddd4ce13b27566cfabece22c368","appveyor.yml":"c78486dbfbe6ebbf3d808afb9a19f7ec18c4704ce451c6305f0716999b70a1a6","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","docs/index.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","github.png":"b432fd855efe7c430fe6a57ccf83935c1996f03a7cdc8d6e1b34154b8c43f6ec","rust-url-todo":"1192cee7b6cedf2133d97dc6074b593a1d19b0ee13fff6f28d6329855044e575","src/encoding.rs":"f3e109ca8ec5a9130da50cdfb3003530aedb6dd5a440f0790d76b71f6981119c","src/form_urlencoded.rs":"7ccaef7148e4bc2577154c50f8705db3a055b641269e24c22770f06222321e1e","src/host.rs":"281165d732ea87b6f01a98f7c68ffcb284c41f84b3ab6ed674fb8e57022d1019","src/lib.rs":"bd156e8bcfbd44f0cd52c8b394e03ec63fea012c0bf5ca554521352714838605","src/origin.rs":"7071dcc1070ccfae84cdcd43586b84a9706e35a9a099ff4dde128da0909bd0bc","src/parser.rs":"9d30868f0900586fec6f122a0322598a08116ab0b4c4d8caf5c35a720381a73a","src/path_segments.rs":"7bd3142eaa568863ef44e2255c181239141f9eeee337f889b9ffaaeab4ca669d","src/quirks.rs":"1231f965e22bb3632c22993e2a8d4c7470bcb4a8de25d049f31784303f0def03","src/slicing.rs":"4e539886b23945a92094625f3e531a4bff40daa44240b5d19ee8577478c4f7fe","tests/data.rs":"c333766897f6492fb6583ab5c8a511973b7a55f58ca550799432343da64d5ca7","tests/setters_tests.json":"ebcbdb52e9a4b5a565f8806d52ebc610d46a34df883e10b0be080d026468ff73","tests/unit.rs":"c2f206f433be619414d761d358a2a4a5a46cfe8a4fea5339adec5e9937d78de2","tests/urltestdata.json":"430c74aa3a31afaa57a92805544e00825f4dffe2def98c1e3c212c3db80268af"},"package":"eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27"} -\ No newline at end of file -+{"files":{"Cargo.toml":"80d575ae6adad93cb0910b385b871e2d92d558078f58a3c8eafe95940d459f6b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","README.md":"eb3f4694003f408cbe3c7f3e9fbbc71241defb940cc55a816981f0f0f144c8eb","UPGRADING.md":"fbcc2d39bdf17db0745793db6626fcd5c909dddd4ce13b27566cfabece22c368","appveyor.yml":"c78486dbfbe6ebbf3d808afb9a19f7ec18c4704ce451c6305f0716999b70a1a6","benches/parse_url.rs":"821ecb051c3c6c40eb3b268ba7337b2988333627d0af0c8e1afc84734ffbbf2b","docs/404.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","docs/index.html":"f61e6271c1ea1aa113b64b356e994595fa548f0433f89948d747503ad22195cd","src/encoding.rs":"f3e109ca8ec5a9130da50cdfb3003530aedb6dd5a440f0790d76b71f6981119c","src/form_urlencoded.rs":"d8c35e92375cafcd7e12c4f0d5374bab62aa1f333629d55b007a9c3d5c3cb615","src/host.rs":"66a2c0c77a8add2da16bc690fbc82b130cf1367ac655fc36990a214e193a4d6c","src/lib.rs":"e09dcba401018169ee26764e1c2bccf0855a5d935707c2100fd8d8e77a1bbc91","src/origin.rs":"6e4821eb9600a32ef54d05c8e1a7937f6d9b4dd1e3bda7f36c7988f6a2bef78b","src/parser.rs":"76368cbe93308123c014a3502024cf97d97ca61dcfc7b6ecd710073867d6deca","src/path_segments.rs":"7bd3142eaa568863ef44e2255c181239141f9eeee337f889b9ffaaeab4ca669d","src/quirks.rs":"6cf1697bad363532cbcc60917a9b126560ac3ab3e1a77da0abcf4f2a40c8233a","src/slicing.rs":"4e539886b23945a92094625f3e531a4bff40daa44240b5d19ee8577478c4f7fe","tests/data.rs":"f2c1c6d1823e8d21aeeae31c786d7f4ef0d97352a896f8c5aeb03a41fedb9a48","tests/setters_tests.json":"08ddaa632ad19c81e83b904bfaa94bc971f26e2bdfcef27d2f93fd033ad57340","tests/unit.rs":"ead7185710ce06c8d68ea18700618477867ee355656eabcad26cfcfaaad361a0","tests/urltestdata.json":"1b0c7c727d8d7e79dfb0d0aa347ff05675ddb68bc4ead38f83fd8e89bc59cc32"},"package":"dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a"} -\ No newline at end of file -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/.travis.yml seamonkey-2.53.1/mozilla/third_party/rust/url/.travis.yml ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/.travis.yml 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/.travis.yml 1969-12-31 18:00:00.000000000 -0600 -@@ -1,9 +0,0 @@ --language: rust --rust: -- - nightly -- - beta -- - stable -- - 1.17.0 --script: make test --notifications: -- webhooks: http://build.servo.org:54856/travis -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/Cargo.toml seamonkey-2.53.1/mozilla/third_party/rust/url/Cargo.toml ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/Cargo.toml 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/Cargo.toml 2020-02-29 21:15:43.799770565 -0600 -@@ -1,24 +1,31 @@ --[package] -+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO -+# -+# When uploading crates to the registry Cargo will automatically -+# "normalize" Cargo.toml files for maximal compatibility -+# with all versions of Cargo and also rewrite `path` dependencies -+# to registry (e.g. crates.io) dependencies -+# -+# If you believe there's an error in this file please file an -+# issue against the rust-lang/cargo repository. If you're -+# editing this file be aware that the upstream Cargo.toml -+# will likely look very different (and much more reasonable) - -+[package] - name = "url" --# When updating version, also modify html_root_url in the lib.rs --version = "1.5.1" -+version = "1.7.2" - authors = ["The rust-url developers"] -- - description = "URL library for Rust, based on the WHATWG URL Standard" - documentation = "https://docs.rs/url" --repository = "https://github.com/servo/rust-url" - readme = "README.md" - keywords = ["url", "parser"] - categories = ["parser-implementations", "web-programming", "encoding"] - license = "MIT/Apache-2.0" -+repository = "https://github.com/servo/rust-url" -+[package.metadata.docs.rs] -+features = ["query_encoding"] - --[badges] --travis-ci = { repository = "servo/rust-url" } --appveyor = { repository = "servo/rust-url" } -- --[workspace] --members = [".", "idna", "percent_encoding", "url_serde"] -+[lib] -+test = false - - [[test]] - name = "unit" -@@ -27,23 +34,50 @@ - name = "data" - harness = false - --[lib] --test = false -+[[bench]] -+name = "parse_url" -+harness = false -+[dependencies.encoding] -+version = "0.2" -+optional = true - --[dev-dependencies] --rustc-test = "0.1" --rustc-serialize = "0.3" --serde_json = ">=0.6.1, <0.9" -+[dependencies.heapsize] -+version = ">=0.4.1, <0.5" -+optional = true -+ -+[dependencies.idna] -+version = "0.1.0" -+ -+[dependencies.matches] -+version = "0.1" -+ -+[dependencies.percent-encoding] -+version = "1.0.0" -+ -+[dependencies.rustc-serialize] -+version = "0.3" -+optional = true -+ -+[dependencies.serde] -+version = ">=0.6.1, <0.9" -+optional = true -+[dev-dependencies.bencher] -+version = "0.1" -+ -+[dev-dependencies.rustc-serialize] -+version = "0.3" -+ -+[dev-dependencies.rustc-test] -+version = "0.3" -+ -+[dev-dependencies.serde_json] -+version = ">=0.6.1, <0.9" - - [features] --query_encoding = ["encoding"] - heap_size = ["heapsize"] -+query_encoding = ["encoding"] -+[badges.appveyor] -+repository = "Manishearth/rust-url" - --[dependencies] --encoding = {version = "0.2", optional = true} --heapsize = {version = ">=0.1.1, <0.5", optional = true} --idna = { version = "0.1.0", path = "./idna" } --matches = "0.1" --percent-encoding = { version = "1.0.0", path = "./percent_encoding" } --rustc-serialize = {version = "0.3", optional = true} --serde = {version = ">=0.6.1, <0.9", optional = true} -+[badges.travis-ci] -+repository = "servo/rust-url" -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/Makefile seamonkey-2.53.1/mozilla/third_party/rust/url/Makefile ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/Makefile 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/Makefile 1969-12-31 18:00:00.000000000 -0600 -@@ -1,6 +0,0 @@ --test: -- cargo test --features "query_encoding serde rustc-serialize heapsize" -- (cd idna && cargo test) -- (cd url_serde && cargo test) -- --.PHONY: test -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/benches/parse_url.rs seamonkey-2.53.1/mozilla/third_party/rust/url/benches/parse_url.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/benches/parse_url.rs 1969-12-31 18:00:00.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/benches/parse_url.rs 2020-02-29 21:15:43.801770565 -0600 -@@ -0,0 +1,18 @@ -+#[macro_use] -+extern crate bencher; -+ -+extern crate url; -+ -+use bencher::{black_box, Bencher}; -+ -+use url::Url; -+ -+fn short(bench: &mut Bencher) { -+ let url = "https://example.com/bench"; -+ -+ bench.bytes = url.len() as u64; -+ bench.iter(|| black_box(url).parse::<Url>().unwrap()); -+} -+ -+benchmark_group!(benches, short); -+benchmark_main!(benches); -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/rust-url-todo seamonkey-2.53.1/mozilla/third_party/rust/url/rust-url-todo ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/rust-url-todo 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/rust-url-todo 1969-12-31 18:00:00.000000000 -0600 -@@ -1,14 +0,0 @@ --* standalone path parsing? --* Test setters -- * Test trim C0/space -- * Test remove tab & newline -- -- -- --#[test] --fn test_path_segments() { -- let mut url = Url::parse("http://example.net").unwrap(); -- url.push_path_segment("foo").unwrap(); -- url.extend_path_segments(&["bar", "b/az"]).unwrap(); -- assert_eq!(url.as_str(), "http://example.net/foo"); --} -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/form_urlencoded.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/form_urlencoded.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/form_urlencoded.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/form_urlencoded.rs 2020-02-29 21:15:43.802770565 -0600 -@@ -16,6 +16,7 @@ - use encoding::EncodingOverride; - use percent_encoding::{percent_encode_byte, percent_decode}; - use std::borrow::{Borrow, Cow}; -+use std::fmt; - use std::str; - - -@@ -216,6 +217,15 @@ - target: Option<T>, - start_position: usize, - encoding: EncodingOverride, -+ custom_encoding: Option<SilentDebug<Box<FnMut(&str) -> Cow<[u8]>>>>, -+} -+ -+struct SilentDebug<T>(T); -+ -+impl<T> fmt::Debug for SilentDebug<T> { -+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -+ f.write_str("…") -+ } - } - - pub trait Target { -@@ -247,8 +257,16 @@ - // * `Serializer` keeps its target in a private field - // * Unlike in other `Target` impls, `UrlQuery::finished` does not return `Self`. - impl<'a> Target for ::UrlQuery<'a> { -- fn as_mut_string(&mut self) -> &mut String { &mut self.url.serialization } -- fn finish(self) -> &'a mut ::Url { self.url } -+ fn as_mut_string(&mut self) -> &mut String { -+ &mut self.url.as_mut().unwrap().serialization -+ } -+ -+ fn finish(mut self) -> &'a mut ::Url { -+ let url = self.url.take().unwrap(); -+ url.restore_already_parsed_fragment(self.fragment.take()); -+ url -+ } -+ - type Finished = &'a mut ::Url; - } - -@@ -272,6 +290,7 @@ - target: Some(target), - start_position: start_position, - encoding: EncodingOverride::utf8(), -+ custom_encoding: None, - } - } - -@@ -290,11 +309,20 @@ - self - } - -+ /// Set the character encoding to be used for names and values before percent-encoding. -+ pub fn custom_encoding_override<F>(&mut self, encode: F) -> &mut Self -+ where F: FnMut(&str) -> Cow<[u8]> + 'static -+ { -+ self.custom_encoding = Some(SilentDebug(Box::new(encode))); -+ self -+ } -+ - /// Serialize and append a name/value pair. - /// - /// Panics if called after `.finish()`. - pub fn append_pair(&mut self, name: &str, value: &str) -> &mut Self { -- append_pair(string(&mut self.target), self.start_position, self.encoding, name, value); -+ append_pair(string(&mut self.target), self.start_position, self.encoding, -+ &mut self.custom_encoding, name, value); - self - } - -@@ -311,7 +339,8 @@ - let string = string(&mut self.target); - for pair in iter { - let &(ref k, ref v) = pair.borrow(); -- append_pair(string, self.start_position, self.encoding, k.as_ref(), v.as_ref()); -+ append_pair(string, self.start_position, self.encoding, -+ &mut self.custom_encoding, k.as_ref(), v.as_ref()); - } - } - self -@@ -324,6 +353,8 @@ - /// Panics if called after `.finish()`. - #[cfg(feature = "query_encoding")] - pub fn append_charset(&mut self) -> &mut Self { -+ assert!(self.custom_encoding.is_none(), -+ "Cannot use both custom_encoding_override() and append_charset()"); - { - let string = string(&mut self.target); - append_separator_if_needed(string, self.start_position); -@@ -361,9 +392,20 @@ - } - - fn append_pair(string: &mut String, start_position: usize, encoding: EncodingOverride, -+ custom_encoding: &mut Option<SilentDebug<Box<FnMut(&str) -> Cow<[u8]>>>>, - name: &str, value: &str) { - append_separator_if_needed(string, start_position); -- string.extend(byte_serialize(&encoding.encode(name.into()))); -+ append_encoded(name, string, encoding, custom_encoding); - string.push('='); -- string.extend(byte_serialize(&encoding.encode(value.into()))); -+ append_encoded(value, string, encoding, custom_encoding); -+} -+ -+fn append_encoded(s: &str, string: &mut String, encoding: EncodingOverride, -+ custom_encoding: &mut Option<SilentDebug<Box<FnMut(&str) -> Cow<[u8]>>>>) { -+ let bytes = if let Some(SilentDebug(ref mut custom)) = *custom_encoding { -+ custom(s) -+ } else { -+ encoding.encode(s.into()) -+ }; -+ string.extend(byte_serialize(&bytes)); - } -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/host.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/host.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/host.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/host.rs 2020-02-29 21:15:07.663769022 -0600 -@@ -13,7 +13,7 @@ - use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6, ToSocketAddrs}; - use std::vec; - use parser::{ParseResult, ParseError}; --use percent_encoding::percent_decode; -+use percent_encoding::{percent_decode, utf8_percent_encode, SIMPLE_ENCODE_SET}; - use idna; - - #[derive(Copy, Clone, Debug, Eq, PartialEq)] -@@ -73,7 +73,9 @@ - #[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] - pub enum Host<S=String> { - /// A DNS domain name, as '.' dot-separated labels. -- /// Non-ASCII labels are encoded in punycode per IDNA. -+ /// Non-ASCII labels are encoded in punycode per IDNA if this is the host of -+ /// a special URL, or percent encoded for non-special URLs. Hosts for -+ /// non-special URLs are also called opaque hosts. - Domain(S), - - /// An IPv4 address. -@@ -137,7 +139,7 @@ - impl Host<String> { - /// Parse a host: either an IPv6 address in [] square brackets, or a domain. - /// -- /// https://url.spec.whatwg.org/#host-parsing -+ /// <https://url.spec.whatwg.org/#host-parsing> - pub fn parse(input: &str) -> Result<Self, ParseError> { - if input.starts_with('[') { - if !input.ends_with(']') { -@@ -158,6 +160,23 @@ - Ok(Host::Domain(domain.into())) - } - } -+ -+ // <https://url.spec.whatwg.org/#concept-opaque-host-parser> -+ pub fn parse_opaque(input: &str) -> Result<Self, ParseError> { -+ if input.starts_with('[') { -+ if !input.ends_with(']') { -+ return Err(ParseError::InvalidIpv6Address) -+ } -+ return parse_ipv6addr(&input[1..input.len() - 1]).map(Host::Ipv6) -+ } -+ if input.find(|c| matches!(c, -+ '\0' | '\t' | '\n' | '\r' | ' ' | '#' | '/' | ':' | '?' | '@' | '[' | '\\' | ']' -+ )).is_some() { -+ return Err(ParseError::InvalidDomainCharacter) -+ } -+ let s = utf8_percent_encode(input, SIMPLE_ENCODE_SET).to_string(); -+ Ok(Host::Domain(s)) -+ } - } - - impl<S: AsRef<str>> fmt::Display for Host<S> { -@@ -309,8 +328,8 @@ - } - } - --/// https://url.spec.whatwg.org/#ipv4-number-parser --fn parse_ipv4number(mut input: &str) -> Result<u32, ()> { -+/// <https://url.spec.whatwg.org/#ipv4-number-parser> -+fn parse_ipv4number(mut input: &str) -> Result<Option<u32>, ()> { - let mut r = 10; - if input.starts_with("0x") || input.starts_with("0X") { - input = &input[2..]; -@@ -319,19 +338,35 @@ - input = &input[1..]; - r = 8; - } -+ -+ // At the moment we can't know the reason why from_str_radix fails -+ // https://github.com/rust-lang/rust/issues/22639 -+ // So instead we check if the input looks like a real number and only return -+ // an error when it's an overflow. -+ let valid_number = match r { -+ 8 => input.chars().all(|c| c >= '0' && c <='7'), -+ 10 => input.chars().all(|c| c >= '0' && c <='9'), -+ 16 => input.chars().all(|c| (c >= '0' && c <='9') || (c >='a' && c <= 'f') || (c >= 'A' && c <= 'F')), -+ _ => false -+ }; -+ -+ if !valid_number { -+ return Ok(None); -+ } -+ - if input.is_empty() { -- return Ok(0); -+ return Ok(Some(0)); - } - if input.starts_with('+') { -- return Err(()) -+ return Ok(None); - } - match u32::from_str_radix(input, r) { -- Ok(number) => Ok(number), -+ Ok(number) => Ok(Some(number)), - Err(_) => Err(()), - } - } - --/// https://url.spec.whatwg.org/#concept-ipv4-parser -+/// <https://url.spec.whatwg.org/#concept-ipv4-parser> - fn parse_ipv4addr(input: &str) -> ParseResult<Option<Ipv4Addr>> { - if input.is_empty() { - return Ok(None) -@@ -344,15 +379,19 @@ - return Ok(None); - } - let mut numbers: Vec<u32> = Vec::new(); -+ let mut overflow = false; - for part in parts { - if part == "" { - return Ok(None); - } -- if let Ok(n) = parse_ipv4number(part) { -- numbers.push(n); -- } else { -- return Ok(None); -- } -+ match parse_ipv4number(part) { -+ Ok(Some(n)) => numbers.push(n), -+ Ok(None) => return Ok(None), -+ Err(()) => overflow = true -+ }; -+ } -+ if overflow { -+ return Err(ParseError::InvalidIpv4Address); - } - let mut ipv4 = numbers.pop().expect("a non-empty list of numbers"); - // Equivalent to: ipv4 >= 256 ** (4 − numbers.len()) -@@ -368,7 +407,7 @@ - Ok(Some(Ipv4Addr::from(ipv4))) - } - --/// https://url.spec.whatwg.org/#concept-ipv6-parser -+/// <https://url.spec.whatwg.org/#concept-ipv6-parser> - fn parse_ipv6addr(input: &str) -> ParseResult<Ipv6Addr> { - let input = input.as_bytes(); - let len = input.len(); -@@ -423,6 +462,9 @@ - return Err(ParseError::InvalidIpv6Address) - } - i = start; -+ if piece_pointer > 6 { -+ return Err(ParseError::InvalidIpv6Address) -+ } - is_ip_v4 = true; - }, - b':' => { -@@ -445,16 +487,24 @@ - if piece_pointer > 6 { - return Err(ParseError::InvalidIpv6Address) - } -- let mut dots_seen = 0; -+ let mut numbers_seen = 0; - while i < len { -- let mut value = None; -+ if numbers_seen > 0 { -+ if numbers_seen < 4 && (i < len && input[i] == b'.') { -+ i += 1 -+ } else { -+ return Err(ParseError::InvalidIpv6Address) -+ } -+ } -+ -+ let mut ipv4_piece = None; - while i < len { - let digit = match input[i] { - c @ b'0' ... b'9' => c - b'0', - _ => break - }; -- match value { -- None => value = Some(digit as u16), -+ match ipv4_piece { -+ None => ipv4_piece = Some(digit as u16), - Some(0) => return Err(ParseError::InvalidIpv6Address), // No leading zero - Some(ref mut v) => { - *v = *v * 10 + digit as u16; -@@ -465,24 +515,28 @@ - } - i += 1; - } -- if dots_seen < 3 && !(i < len && input[i] == b'.') { -- return Err(ParseError::InvalidIpv6Address) -- } -- pieces[piece_pointer] = if let Some(v) = value { -+ -+ pieces[piece_pointer] = if let Some(v) = ipv4_piece { - pieces[piece_pointer] * 0x100 + v - } else { - return Err(ParseError::InvalidIpv6Address) - }; -- if dots_seen == 1 || dots_seen == 3 { -+ numbers_seen += 1; -+ -+ if numbers_seen == 2 || numbers_seen == 4 { - piece_pointer += 1; - } -- i += 1; -- if dots_seen == 3 && i < len { -- return Err(ParseError::InvalidIpv6Address) -- } -- dots_seen += 1; -+ } -+ -+ if numbers_seen != 4 { -+ return Err(ParseError::InvalidIpv6Address) - } - } -+ -+ if i < len { -+ return Err(ParseError::InvalidIpv6Address) -+ } -+ - match compress_pointer { - Some(compress_pointer) => { - let mut swaps = piece_pointer - compress_pointer; -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/lib.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/lib.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/lib.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/lib.rs 2020-02-29 21:15:43.804770565 -0600 -@@ -104,7 +104,7 @@ - # run().unwrap(); - */ - --#![doc(html_root_url = "https://docs.rs/url/1.5.1")] -+#![doc(html_root_url = "https://docs.rs/url/1.7.0")] - - #[cfg(feature="rustc-serialize")] extern crate rustc_serialize; - #[macro_use] extern crate matches; -@@ -112,12 +112,13 @@ - #[cfg(feature="heapsize")] #[macro_use] extern crate heapsize; - - pub extern crate idna; -+#[macro_use] - pub extern crate percent_encoding; - - use encoding::EncodingOverride; - #[cfg(feature = "heapsize")] use heapsize::HeapSizeOf; - use host::HostInternal; --use parser::{Parser, Context, SchemeType, to_u32}; -+use parser::{Parser, Context, SchemeType, to_u32, ViolationFn}; - use percent_encoding::{PATH_SEGMENT_ENCODE_SET, USERINFO_ENCODE_SET, - percent_encode, percent_decode, utf8_percent_encode}; - use std::borrow::Borrow; -@@ -135,7 +136,7 @@ - pub use origin::{Origin, OpaqueOrigin}; - pub use host::{Host, HostAndPort, SocketAddrs}; - pub use path_segments::PathSegmentsMut; --pub use parser::ParseError; -+pub use parser::{ParseError, SyntaxViolation}; - pub use slicing::Position; - - mod encoding; -@@ -186,7 +187,7 @@ - pub struct ParseOptions<'a> { - base_url: Option<&'a Url>, - encoding_override: encoding::EncodingOverride, -- log_syntax_violation: Option<&'a Fn(&'static str)>, -+ violation_fn: ViolationFn<'a>, - } - - impl<'a> ParseOptions<'a> { -@@ -209,9 +210,47 @@ - self - } - -- /// Call the provided function or closure on non-fatal parse errors. -+ /// Call the provided function or closure on non-fatal parse errors, passing -+ /// a static string description. This method is deprecated in favor of -+ /// `syntax_violation_callback` and is implemented as an adaptor for the -+ /// latter, passing the `SyntaxViolation` description. Only the last value -+ /// passed to either method will be used by a parser. -+ #[deprecated] - pub fn log_syntax_violation(mut self, new: Option<&'a Fn(&'static str)>) -> Self { -- self.log_syntax_violation = new; -+ self.violation_fn = match new { -+ Some(f) => ViolationFn::OldFn(f), -+ None => ViolationFn::NoOp -+ }; -+ self -+ } -+ -+ /// Call the provided function or closure for a non-fatal `SyntaxViolation` -+ /// when it occurs during parsing. Note that since the provided function is -+ /// `Fn`, the caller might need to utilize _interior mutability_, such as with -+ /// a `RefCell`, to collect the violations. -+ /// -+ /// ## Example -+ /// ``` -+ /// use std::cell::RefCell; -+ /// use url::{Url, SyntaxViolation}; -+ /// # use url::ParseError; -+ /// # fn run() -> Result<(), url::ParseError> { -+ /// let violations = RefCell::new(Vec::new()); -+ /// let url = Url::options() -+ /// .syntax_violation_callback(Some(&|v| violations.borrow_mut().push(v))) -+ /// .parse("https:////example.com")?; -+ /// assert_eq!(url.as_str(), "https://example.com/"); -+ /// assert_eq!(violations.into_inner(), -+ /// vec!(SyntaxViolation::ExpectedDoubleSlash)); -+ /// # Ok(()) -+ /// # } -+ /// # run().unwrap(); -+ /// ``` -+ pub fn syntax_violation_callback(mut self, new: Option<&'a Fn(SyntaxViolation)>) -> Self { -+ self.violation_fn = match new { -+ Some(f) => ViolationFn::NewFn(f), -+ None => ViolationFn::NoOp -+ }; - self - } - -@@ -221,7 +260,7 @@ - serialization: String::with_capacity(input.len()), - base_url: self.base_url, - query_encoding_override: self.encoding_override, -- log_syntax_violation: self.log_syntax_violation, -+ violation_fn: self.violation_fn, - context: Context::UrlParser, - }.parse_url(input) - } -@@ -229,11 +268,12 @@ - - impl<'a> Debug for ParseOptions<'a> { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { -- write!(f, "ParseOptions {{ base_url: {:?}, encoding_override: {:?}, log_syntax_violation: ", self.base_url, self.encoding_override)?; -- match self.log_syntax_violation { -- Some(_) => write!(f, "Some(Fn(&'static str)) }}"), -- None => write!(f, "None }}") -- } -+ write!(f, -+ "ParseOptions {{ base_url: {:?}, encoding_override: {:?}, \ -+ violation_fn: {:?} }}", -+ self.base_url, -+ self.encoding_override, -+ self.violation_fn) - } - } - -@@ -252,6 +292,13 @@ - /// # } - /// # run().unwrap(); - /// ``` -+ /// -+ /// # Errors -+ /// -+ /// If the function can not parse an absolute URL from the given string, -+ /// a [`ParseError`] variant will be returned. -+ /// -+ /// [`ParseError`]: enum.ParseError.html - #[inline] - pub fn parse(input: &str) -> Result<Url, ::ParseError> { - Url::options().parse(input) -@@ -274,6 +321,13 @@ - /// # } - /// # run().unwrap(); - /// ``` -+ /// -+ /// # Errors -+ /// -+ /// If the function can not parse an absolute URL from the given string, -+ /// a [`ParseError`] variant will be returned. -+ /// -+ /// [`ParseError`]: enum.ParseError.html - #[inline] - pub fn parse_with_params<I, K, V>(input: &str, iter: I) -> Result<Url, ::ParseError> - where I: IntoIterator, -@@ -301,7 +355,7 @@ - /// ```rust - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let base = Url::parse("https://example.net/a/b.html")?; - /// let url = base.join("c.png")?; -@@ -314,6 +368,13 @@ - /// # } - /// # run().unwrap(); - /// ``` -+ /// -+ /// # Errors -+ /// -+ /// If the function can not parse an URL from the given string -+ /// with this URL as the base URL, a [`ParseError`] variant will be returned. -+ /// -+ /// [`ParseError`]: enum.ParseError.html - #[inline] - pub fn join(&self, input: &str) -> Result<Url, ::ParseError> { - Url::options().base_url(Some(self)).parse(input) -@@ -342,7 +403,7 @@ - ParseOptions { - base_url: None, - encoding_override: EncodingOverride::utf8(), -- log_syntax_violation: None, -+ violation_fn: ViolationFn::NoOp, - } - } - -@@ -500,7 +561,7 @@ - Ok(()) - } - -- /// Return the origin of this URL (https://url.spec.whatwg.org/#origin) -+ /// Return the origin of this URL (<https://url.spec.whatwg.org/#origin>) - /// - /// Note: this returns an opaque origin for `file:` URLs, which causes - /// `url.origin() != url.origin()`. -@@ -1156,11 +1217,11 @@ - /// assert_eq!(url.as_str(), "https://example.com/data.csv"); - - /// url.set_fragment(Some("cell=4,1-6,2")); -- /// assert_eq!(url.as_str(), "https://example.com/data.csv#cell=4,1-6,2"); -+ /// assert_eq!(url.as_str(), "https://example.com/data.csv#cell=4,1-6,2"); - /// assert_eq!(url.fragment(), Some("cell=4,1-6,2")); - /// - /// url.set_fragment(None); -- /// assert_eq!(url.as_str(), "https://example.com/data.csv"); -+ /// assert_eq!(url.as_str(), "https://example.com/data.csv"); - /// assert!(url.fragment().is_none()); - /// # Ok(()) - /// # } -@@ -1213,7 +1274,7 @@ - /// assert_eq!(url.as_str(), "https://example.com/products"); - /// - /// url.set_query(Some("page=2")); -- /// assert_eq!(url.as_str(), "https://example.com/products?page=2"); -+ /// assert_eq!(url.as_str(), "https://example.com/products?page=2"); - /// assert_eq!(url.query(), Some("page=2")); - /// # Ok(()) - /// # } -@@ -1283,7 +1344,7 @@ - self.serialization.push('?'); - } - -- let query = UrlQuery { url: self, fragment: fragment }; -+ let query = UrlQuery { url: Some(self), fragment: fragment }; - form_urlencoded::Serializer::for_suffix(query, query_start + "?".len()) - } - -@@ -1309,12 +1370,12 @@ - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("https://example.com")?; - /// url.set_path("api/comments"); -- /// assert_eq!(url.as_str(), "https://example.com/api/comments"); -+ /// assert_eq!(url.as_str(), "https://example.com/api/comments"); - /// assert_eq!(url.path(), "/api/comments"); - /// - /// let mut url = Url::parse("https://example.com/api")?; - /// url.set_path("data/report.csv"); -- /// assert_eq!(url.as_str(), "https://example.com/data/report.csv"); -+ /// assert_eq!(url.as_str(), "https://example.com/data/report.csv"); - /// assert_eq!(url.path(), "/data/report.csv"); - /// # Ok(()) - /// # } -@@ -1406,7 +1467,8 @@ - /// # run().unwrap(); - /// ``` - pub fn set_port(&mut self, mut port: Option<u16>) -> Result<(), ()> { -- if !self.has_host() || self.scheme() == "file" { -+ // has_host implies !cannot_be_a_base -+ if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { - return Err(()) - } - if port.is_some() && port == parser::default_port(self.scheme()) { -@@ -1448,9 +1510,6 @@ - - /// Change this URL’s host. - /// -- /// If this URL is cannot-be-a-base or there is an error parsing the given `host`, -- /// do nothing and return `Err`. -- /// - /// Removing the host (calling this with `None`) - /// will also remove any username, password, and port number. - /// -@@ -1477,7 +1536,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("foo://example.net")?; - /// let result = url.set_host(None); -@@ -1493,7 +1552,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("https://example.net")?; - /// let result = url.set_host(None); -@@ -1509,7 +1568,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("mailto:rms@example.net")?; - /// -@@ -1524,6 +1583,13 @@ - /// # } - /// # run().unwrap(); - /// ``` -+ /// -+ /// # Errors -+ /// -+ /// If this URL is cannot-be-a-base or there is an error parsing the given `host`, -+ /// a [`ParseError`] variant will be returned. -+ /// -+ /// [`ParseError`]: enum.ParseError.html - pub fn set_host(&mut self, host: Option<&str>) -> Result<(), ParseError> { - if self.cannot_be_a_base() { - return Err(ParseError::SetHostOnCannotBeABaseUrl) -@@ -1533,7 +1599,11 @@ - if host == "" && SchemeType::from(self.scheme()).is_special() { - return Err(ParseError::EmptyHost); - } -- self.set_host_internal(Host::parse(host)?, None) -+ if SchemeType::from(self.scheme()).is_special() { -+ self.set_host_internal(Host::parse(host)?, None) -+ } else { -+ self.set_host_internal(Host::parse_opaque(host)?, None) -+ } - } else if self.has_host() { - if SchemeType::from(self.scheme()).is_special() { - return Err(ParseError::EmptyHost) -@@ -1666,7 +1736,8 @@ - /// # run().unwrap(); - /// ``` - pub fn set_password(&mut self, password: Option<&str>) -> Result<(), ()> { -- if !self.has_host() { -+ // has_host implies !cannot_be_a_base -+ if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { - return Err(()) - } - if let Some(password) = password { -@@ -1732,21 +1803,23 @@ - /// ``` - /// - /// Setup username to user1 -+ /// - /// ```rust - /// use url::{Url, ParseError}; - /// - /// # fn run() -> Result<(), ParseError> { -- /// let mut url = Url::parse("ftp://:secre1@example.com")?; -+ /// let mut url = Url::parse("ftp://:secre1@example.com/")?; - /// let result = url.set_username("user1"); - /// assert!(result.is_ok()); - /// assert_eq!(url.username(), "user1"); -- /// assert_eq!(url.as_str(), "ftp://user1:secre1@example.com"); -+ /// assert_eq!(url.as_str(), "ftp://user1:secre1@example.com/"); - /// # Ok(()) - /// # } - /// # run().unwrap(); - /// ``` - pub fn set_username(&mut self, username: &str) -> Result<(), ()> { -- if !self.has_host() { -+ // has_host implies !cannot_be_a_base -+ if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { - return Err(()) - } - let username_start = self.scheme_end + 3; -@@ -1805,7 +1878,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("https://example.net")?; - /// let result = url.set_scheme("foo"); -@@ -1822,7 +1895,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("https://example.net")?; - /// let result = url.set_scheme("foõ"); -@@ -1838,7 +1911,7 @@ - /// ``` - /// use url::Url; - /// # use url::ParseError; -- /// -+ /// - /// # fn run() -> Result<(), ParseError> { - /// let mut url = Url::parse("mailto:rms@example.net")?; - /// let result = url.set_scheme("https"); -@@ -1887,7 +1960,7 @@ - /// ``` - /// # if cfg!(unix) { - /// use url::Url; -- /// -+ /// - /// # fn run() -> Result<(), ()> { - /// let url = Url::from_file_path("/tmp/foo.txt")?; - /// assert_eq!(url.as_str(), "file:///tmp/foo.txt"); -@@ -1902,6 +1975,7 @@ - /// # run().unwrap(); - /// # } - /// ``` -+ #[cfg(any(unix, windows, target_os="redox"))] - pub fn from_file_path<P: AsRef<Path>>(path: P) -> Result<Url, ()> { - let mut serialization = "file://".to_owned(); - let host_start = serialization.len() as u32; -@@ -1937,6 +2011,7 @@ - /// - /// Note that `std::path` does not consider trailing slashes significant - /// and usually does not include them (e.g. in `Path::parent()`). -+ #[cfg(any(unix, windows, target_os="redox"))] - pub fn from_directory_path<P: AsRef<Path>>(path: P) -> Result<Url, ()> { - let mut url = Url::from_file_path(path)?; - if !url.serialization.ends_with('/') { -@@ -2018,6 +2093,7 @@ - /// (That is, if the percent-decoded path contains a NUL byte or, - /// for a Windows path, is not UTF-8.) - #[inline] -+ #[cfg(any(unix, windows, target_os="redox"))] - pub fn to_file_path(&self) -> Result<PathBuf, ()> { - if let Some(segments) = self.path_segments() { - let host = match self.host() { -@@ -2264,6 +2340,7 @@ - Ok((host_end, host_internal)) - } - -+ - #[cfg(any(unix, target_os = "redox"))] - fn file_url_segments_to_pathbuf(host: Option<&str>, segments: str::Split<char>) -> Result<PathBuf, ()> { - use std::ffi::OsStr; -@@ -2347,13 +2424,15 @@ - /// Implementation detail of `Url::query_pairs_mut`. Typically not used directly. - #[derive(Debug)] - pub struct UrlQuery<'a> { -- url: &'a mut Url, -+ url: Option<&'a mut Url>, - fragment: Option<String>, - } - - impl<'a> Drop for UrlQuery<'a> { - fn drop(&mut self) { -- self.url.restore_already_parsed_fragment(self.fragment.take()) -+ if let Some(url) = self.url.take() { -+ url.restore_already_parsed_fragment(self.fragment.take()) -+ } - } - } - -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/origin.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/origin.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/origin.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/origin.rs 2020-02-29 21:14:51.284768322 -0600 -@@ -49,7 +49,7 @@ - /// - If the scheme is anything else, the origin is opaque, meaning - /// the URL does not have the same origin as any other URL. - /// --/// For more information see https://url.spec.whatwg.org/#origin -+/// For more information see <https://url.spec.whatwg.org/#origin> - #[derive(PartialEq, Eq, Hash, Clone, Debug)] - pub enum Origin { - /// A globally unique identifier -@@ -86,7 +86,7 @@ - matches!(*self, Origin::Tuple(..)) - } - -- /// https://html.spec.whatwg.org/multipage/#ascii-serialisation-of-an-origin -+ /// <https://html.spec.whatwg.org/multipage/#ascii-serialisation-of-an-origin> - pub fn ascii_serialization(&self) -> String { - match *self { - Origin::Opaque(_) => "null".to_owned(), -@@ -100,7 +100,7 @@ - } - } - -- /// https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin -+ /// <https://html.spec.whatwg.org/multipage/#unicode-serialisation-of-an-origin> - pub fn unicode_serialization(&self) -> String { - match *self { - Origin::Opaque(_) => "null".to_owned(), -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/parser.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/parser.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/parser.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/parser.rs 2020-02-29 21:15:43.806770565 -0600 -@@ -6,7 +6,9 @@ - // option. This file may not be copied, modified, or distributed - // except according to those terms. - -+#[allow(unused_imports, deprecated)] - use std::ascii::AsciiExt; -+ - use std::error::Error; - use std::fmt::{self, Formatter, Write}; - use std::str; -@@ -20,6 +22,12 @@ - PATH_SEGMENT_ENCODE_SET - }; - -+define_encode_set! { -+ // The backslash (\) character is treated as a path separator in special URLs -+ // so it needs to be additionally escaped in that case. -+ pub SPECIAL_PATH_SEGMENT_ENCODE_SET = [PATH_SEGMENT_ENCODE_SET] | {'\\'} -+} -+ - pub type ParseResult<T> = Result<T, ParseError>; - - macro_rules! simple_enum_error { -@@ -70,6 +78,54 @@ - fn from(_: ::idna::uts46::Errors) -> ParseError { ParseError::IdnaError } - } - -+macro_rules! syntax_violation_enum { -+ ($($name: ident => $description: expr,)+) => { -+ /// Non-fatal syntax violations that can occur during parsing. -+ #[derive(PartialEq, Eq, Clone, Copy, Debug)] -+ pub enum SyntaxViolation { -+ $( -+ $name, -+ )+ -+ } -+ -+ impl SyntaxViolation { -+ pub fn description(&self) -> &'static str { -+ match *self { -+ $( -+ SyntaxViolation::$name => $description, -+ )+ -+ } -+ } -+ } -+ } -+} -+ -+syntax_violation_enum! { -+ Backslash => "backslash", -+ C0SpaceIgnored => -+ "leading or trailing control or space character are ignored in URLs", -+ EmbeddedCredentials => -+ "embedding authentication information (username or password) \ -+ in an URL is not recommended", -+ ExpectedDoubleSlash => "expected //", -+ ExpectedFileDoubleSlash => "expected // after file:", -+ FileWithHostAndWindowsDrive => "file: with host and Windows drive letter", -+ NonUrlCodePoint => "non-URL code point", -+ NullInFragment => "NULL characters are ignored in URL fragment identifiers", -+ PercentDecode => "expected 2 hex digits after %", -+ TabOrNewlineIgnored => "tabs or newlines are ignored in URLs", -+ UnencodedAtSign => "unencoded @ sign in username or password", -+} -+ -+#[cfg(feature = "heapsize")] -+known_heap_size!(0, SyntaxViolation); -+ -+impl fmt::Display for SyntaxViolation { -+ fn fmt(&self, fmt: &mut Formatter) -> fmt::Result { -+ self.description().fmt(fmt) -+ } -+} -+ - #[derive(Copy, Clone)] - pub enum SchemeType { - File, -@@ -112,18 +168,17 @@ - - impl<'i> Input<'i> { - pub fn new(input: &'i str) -> Self { -- Input::with_log(input, None) -+ Input::with_log(input, ViolationFn::NoOp) - } - -- pub fn with_log(original_input: &'i str, log_syntax_violation: Option<&Fn(&'static str)>) -- -> Self { -+ pub fn with_log(original_input: &'i str, vfn: ViolationFn) -> Self { - let input = original_input.trim_matches(c0_control_or_space); -- if let Some(log) = log_syntax_violation { -+ if vfn.is_set() { - if input.len() < original_input.len() { -- log("leading or trailing control or space character are ignored in URLs") -+ vfn.call(SyntaxViolation::C0SpaceIgnored) - } - if input.chars().any(|c| matches!(c, '\t' | '\n' | '\r')) { -- log("tabs or newlines are ignored in URLs") -+ vfn.call(SyntaxViolation::TabOrNewlineIgnored) - } - } - Input { chars: input.chars() } -@@ -216,11 +271,60 @@ - } - } - -+/// Wrapper for syntax violation callback functions. -+#[derive(Copy, Clone)] -+pub enum ViolationFn<'a> { -+ NewFn(&'a (Fn(SyntaxViolation) + 'a)), -+ OldFn(&'a (Fn(&'static str) + 'a)), -+ NoOp -+} -+ -+impl<'a> ViolationFn<'a> { -+ /// Call with a violation. -+ pub fn call(self, v: SyntaxViolation) { -+ match self { -+ ViolationFn::NewFn(f) => f(v), -+ ViolationFn::OldFn(f) => f(v.description()), -+ ViolationFn::NoOp => {} -+ } -+ } -+ -+ /// Call with a violation, if provided test returns true. Avoids -+ /// the test entirely if `NoOp`. -+ pub fn call_if<F>(self, v: SyntaxViolation, test: F) -+ where F: Fn() -> bool -+ { -+ match self { -+ ViolationFn::NewFn(f) => if test() { f(v) }, -+ ViolationFn::OldFn(f) => if test() { f(v.description()) }, -+ ViolationFn::NoOp => {} // avoid test -+ } -+ } -+ -+ /// True if not `NoOp` -+ pub fn is_set(self) -> bool { -+ match self { -+ ViolationFn::NoOp => false, -+ _ => true -+ } -+ } -+} -+ -+impl<'a> fmt::Debug for ViolationFn<'a> { -+ fn fmt(&self, f: &mut Formatter) -> fmt::Result { -+ match *self { -+ ViolationFn::NewFn(_) => write!(f, "NewFn(Fn(SyntaxViolation))"), -+ ViolationFn::OldFn(_) => write!(f, "OldFn(Fn(&'static str))"), -+ ViolationFn::NoOp => write!(f, "NoOp") -+ } -+ } -+} -+ - pub struct Parser<'a> { - pub serialization: String, - pub base_url: Option<&'a Url>, - pub query_encoding_override: EncodingOverride, -- pub log_syntax_violation: Option<&'a Fn(&'static str)>, -+ pub violation_fn: ViolationFn<'a>, - pub context: Context, - } - -@@ -237,29 +341,14 @@ - serialization: serialization, - base_url: None, - query_encoding_override: EncodingOverride::utf8(), -- log_syntax_violation: None, -+ violation_fn: ViolationFn::NoOp, - context: Context::Setter, - } - } - -- fn syntax_violation(&self, reason: &'static str) { -- if let Some(log) = self.log_syntax_violation { -- log(reason) -- } -- } -- -- fn syntax_violation_if<F: Fn() -> bool>(&self, reason: &'static str, test: F) { -- // Skip test if not logging. -- if let Some(log) = self.log_syntax_violation { -- if test() { -- log(reason) -- } -- } -- } -- - /// https://url.spec.whatwg.org/#concept-basic-url-parser - pub fn parse_url(mut self, input: &str) -> ParseResult<Url> { -- let input = Input::with_log(input, self.log_syntax_violation); -+ let input = Input::with_log(input, self.violation_fn); - if let Ok(remaining) = self.parse_scheme(input.clone()) { - return self.parse_with_scheme(remaining) - } -@@ -310,12 +399,13 @@ - } - - fn parse_with_scheme(mut self, input: Input) -> ParseResult<Url> { -+ use SyntaxViolation::{ExpectedFileDoubleSlash, ExpectedDoubleSlash}; - let scheme_end = to_u32(self.serialization.len())?; - let scheme_type = SchemeType::from(&self.serialization); - self.serialization.push(':'); - match scheme_type { - SchemeType::File => { -- self.syntax_violation_if("expected // after file:", || !input.starts_with("//")); -+ self.violation_fn.call_if(ExpectedFileDoubleSlash, || !input.starts_with("//")); - let base_file_url = self.base_url.and_then(|base| { - if base.scheme() == "file" { Some(base) } else { None } - }); -@@ -335,7 +425,7 @@ - } - } - // special authority slashes state -- self.syntax_violation_if("expected //", || { -+ self.violation_fn.call_if(ExpectedDoubleSlash, || { - input.clone().take_while(|&c| matches!(c, '/' | '\\')) - .collect::<String>() != "//" - }); -@@ -371,6 +461,7 @@ - } - - fn parse_file(mut self, input: Input, mut base_file_url: Option<&Url>) -> ParseResult<Url> { -+ use SyntaxViolation::Backslash; - // file state - debug_assert!(self.serialization.is_empty()); - let (first_char, input_after_first_char) = input.split_first(); -@@ -451,6 +542,7 @@ - let scheme_end = "file".len() as u32; - let path_start = "file://".len() as u32; - let fragment_start = "file:///".len() as u32; -+ self.serialization.push('#'); - self.parse_fragment(input_after_first_char); - Ok(Url { - serialization: self.serialization, -@@ -467,18 +559,18 @@ - } - } - Some('/') | Some('\\') => { -- self.syntax_violation_if("backslash", || first_char == Some('\\')); -+ self.violation_fn.call_if(Backslash, || first_char == Some('\\')); - // file slash state - let (next_char, input_after_next_char) = input_after_first_char.split_first(); -- self.syntax_violation_if("backslash", || next_char == Some('\\')); -+ self.violation_fn.call_if(Backslash, || next_char == Some('\\')); - if matches!(next_char, Some('/') | Some('\\')) { - // file host state - self.serialization.push_str("file://"); - let scheme_end = "file".len() as u32; - let host_start = "file://".len() as u32; -- let (path_start, host, remaining) = -+ let (path_start, mut host, remaining) = - self.parse_file_host(input_after_next_char)?; -- let host_end = to_u32(self.serialization.len())?; -+ let mut host_end = to_u32(self.serialization.len())?; - let mut has_host = !matches!(host, HostInternal::None); - let remaining = if path_start { - self.parse_path_start(SchemeType::File, &mut has_host, remaining) -@@ -487,7 +579,13 @@ - self.serialization.push('/'); - self.parse_path(SchemeType::File, &mut has_host, path_start, remaining) - }; -- // FIXME: deal with has_host -+ // For file URLs that have a host and whose path starts -+ // with the windows drive letter we just remove the host. -+ if !has_host { -+ self.serialization.drain(host_start as usize..host_end as usize); -+ host_end = host_start; -+ host = HostInternal::None; -+ } - let (query_start, fragment_start) = - self.parse_query_and_fragment(scheme_end, remaining)?; - Ok(Url { -@@ -616,7 +714,7 @@ - Some('/') | Some('\\') => { - let (slashes_count, remaining) = input.count_matching(|c| matches!(c, '/' | '\\')); - if slashes_count >= 2 { -- self.syntax_violation_if("expected //", || { -+ self.violation_fn.call_if(SyntaxViolation::ExpectedDoubleSlash, || { - input.clone().take_while(|&c| matches!(c, '/' | '\\')) - .collect::<String>() != "//" - }); -@@ -680,11 +778,9 @@ - match c { - '@' => { - if last_at.is_some() { -- self.syntax_violation("unencoded @ sign in username or password") -+ self.violation_fn.call(SyntaxViolation::UnencodedAtSign) - } else { -- self.syntax_violation( -- "embedding authentification information (username or password) \ -- in an URL is not recommended") -+ self.violation_fn.call(SyntaxViolation::EmbeddedCredentials) - } - last_at = Some((char_count, remaining.clone())) - }, -@@ -701,14 +797,23 @@ - }; - - let mut username_end = None; -+ let mut has_password = false; -+ let mut has_username = false; - while userinfo_char_count > 0 { - let (c, utf8_c) = input.next_utf8().unwrap(); - userinfo_char_count -= 1; - if c == ':' && username_end.is_none() { - // Start parsing password - username_end = Some(to_u32(self.serialization.len())?); -- self.serialization.push(':'); -+ // We don't add a colon if the password is empty -+ if userinfo_char_count > 0 { -+ self.serialization.push(':'); -+ has_password = true; -+ } - } else { -+ if !has_password { -+ has_username = true; -+ } - self.check_url_code_point(c, &input); - self.serialization.extend(utf8_percent_encode(utf8_c, USERINFO_ENCODE_SET)); - } -@@ -717,7 +822,9 @@ - Some(i) => i, - None => to_u32(self.serialization.len())?, - }; -- self.serialization.push('@'); -+ if has_username || has_password { -+ self.serialization.push('@'); -+ } - Ok((username_end, remaining)) - } - -@@ -783,6 +890,10 @@ - if scheme_type.is_special() && host_str.is_empty() { - return Err(ParseError::EmptyHost) - } -+ if !scheme_type.is_special() { -+ let host = Host::parse_opaque(host_str)?; -+ return Ok((host, input)); -+ } - let host = Host::parse(host_str)?; - Ok((host, input)) - } -@@ -867,7 +978,7 @@ - match input.split_first() { - (Some('/'), remaining) => input = remaining, - (Some('\\'), remaining) => if scheme_type.is_special() { -- self.syntax_violation("backslash"); -+ self.violation_fn.call(SyntaxViolation::Backslash); - input = remaining - }, - _ => {} -@@ -895,7 +1006,7 @@ - }, - '\\' if self.context != Context::PathSegmentSetter && - scheme_type.is_special() => { -- self.syntax_violation("backslash"); -+ self.violation_fn.call(SyntaxViolation::Backslash); - ends_with_slash = true; - break - }, -@@ -905,18 +1016,14 @@ - }, - _ => { - self.check_url_code_point(c, &input); -- if c == '%' { -- let after_percent_sign = input.clone(); -- if matches!(input.next(), Some('2')) && -- matches!(input.next(), Some('E') | Some('e')) { -- self.serialization.push('.'); -- continue -- } -- input = after_percent_sign -- } - if self.context == Context::PathSegmentSetter { -- self.serialization.extend(utf8_percent_encode( -- utf8_c, PATH_SEGMENT_ENCODE_SET)); -+ if scheme_type.is_special() { -+ self.serialization.extend(utf8_percent_encode( -+ utf8_c, SPECIAL_PATH_SEGMENT_ENCODE_SET)); -+ } else { -+ self.serialization.extend(utf8_percent_encode( -+ utf8_c, PATH_SEGMENT_ENCODE_SET)); -+ } - } else { - self.serialization.extend(utf8_percent_encode( - utf8_c, DEFAULT_ENCODE_SET)); -@@ -925,7 +1032,7 @@ - } - } - match &self.serialization[segment_start..] { -- ".." => { -+ ".." | "%2e%2e" | "%2e%2E" | "%2E%2e" | "%2E%2E" | "%2e." | "%2E." | ".%2e" | ".%2E" => { - debug_assert!(self.serialization.as_bytes()[segment_start - 1] == b'/'); - self.serialization.truncate(segment_start - 1); // Truncate "/.." - self.pop_path(scheme_type, path_start); -@@ -933,7 +1040,7 @@ - self.serialization.push('/') - } - }, -- "." => { -+ "." | "%2e" | "%2E" => { - self.serialization.truncate(segment_start); - }, - _ => { -@@ -945,7 +1052,7 @@ - self.serialization.push(':'); - } - if *has_host { -- self.syntax_violation("file: with host and Windows drive letter"); -+ self.violation_fn.call(SyntaxViolation::FileWithHostAndWindowsDrive); - *has_host = false; // FIXME account for this in callers - } - } -@@ -1087,7 +1194,7 @@ - pub fn parse_fragment(&mut self, mut input: Input) { - while let Some((c, utf8_c)) = input.next_utf8() { - if c == '\0' { -- self.syntax_violation("NULL characters are ignored in URL fragment identifiers") -+ self.violation_fn.call(SyntaxViolation::NullInFragment) - } else { - self.check_url_code_point(c, &input); - self.serialization.extend(utf8_percent_encode(utf8_c, -@@ -1097,15 +1204,16 @@ - } - - fn check_url_code_point(&self, c: char, input: &Input) { -- if let Some(log) = self.log_syntax_violation { -+ let vfn = self.violation_fn; -+ if vfn.is_set() { - if c == '%' { - let mut input = input.clone(); - if !matches!((input.next(), input.next()), (Some(a), Some(b)) - if is_ascii_hex_digit(a) && is_ascii_hex_digit(b)) { -- log("expected 2 hex digits after %") -+ vfn.call(SyntaxViolation::PercentDecode) - } - } else if !is_url_code_point(c) { -- log("non-URL code point") -+ vfn.call(SyntaxViolation::NonUrlCodePoint) - } - } - } -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/quirks.rs seamonkey-2.53.1/mozilla/third_party/rust/url/src/quirks.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/src/quirks.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/src/quirks.rs 2020-02-29 21:15:07.670769022 -0600 -@@ -46,7 +46,7 @@ - - /// Getter for https://url.spec.whatwg.org/#dom-url-origin - pub fn origin(url: &Url) -> String { -- url.origin().unicode_serialization() -+ url.origin().ascii_serialization() - } - - /// Getter for https://url.spec.whatwg.org/#dom-url-protocol -@@ -152,7 +152,7 @@ - { - // has_host implies !cannot_be_a_base - let scheme = url.scheme(); -- if !url.has_host() || scheme == "file" { -+ if !url.has_host() || url.host() == Some(Host::Domain("")) || scheme == "file" { - return Err(()) - } - result = Parser::parse_port(Input::new(new_port), || default_port(scheme), Context::Setter) -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/data.rs seamonkey-2.53.1/mozilla/third_party/rust/url/tests/data.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/data.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/tests/data.rs 2020-02-29 21:15:43.807770565 -0600 -@@ -9,7 +9,7 @@ - //! Data-driven tests - - extern crate rustc_serialize; --extern crate test; -+extern crate rustc_test as test; - extern crate url; - - use rustc_serialize::json::{self, Json}; -@@ -29,6 +29,7 @@ - fn run_parsing(input: &str, base: &str, expected: Result<ExpectedAttributes, ()>) { - let base = match Url::parse(&base) { - Ok(base) => base, -+ Err(_) if expected.is_err() => return, - Err(message) => panic!("Error parsing base {:?}: {}", base, message) - }; - let (url, expected) = match (base.join(&input), expected) { -@@ -188,11 +189,7 @@ - { - let mut add_one = |name: String, run: test::TestFn| { - tests.push(test::TestDescAndFn { -- desc: test::TestDesc { -- name: test::DynTestName(name), -- ignore: false, -- should_panic: test::ShouldPanic::No, -- }, -+ desc: test::TestDesc::new(test::DynTestName(name)), - testfn: run, - }) - }; -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/setters_tests.json seamonkey-2.53.1/mozilla/third_party/rust/url/tests/setters_tests.json ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/setters_tests.json 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/tests/setters_tests.json 2020-02-29 21:15:07.674769022 -0600 -@@ -102,6 +102,31 @@ - } - }, - { -+ "comment": "Can’t switch from file URL with no host", -+ "href": "file://localhost/", -+ "new_value": "http", -+ "expected": { -+ "href": "file:///", -+ "protocol": "file:" -+ } -+ }, -+ { -+ "href": "file:///test", -+ "new_value": "gopher", -+ "expected": { -+ "href": "file:///test", -+ "protocol": "file:" -+ } -+ }, -+ { -+ "href": "file:", -+ "new_value": "wss", -+ "expected": { -+ "href": "file:///", -+ "protocol": "file:" -+ } -+ }, -+ { - "comment": "Spec deviation: from special scheme to not is not problematic. https://github.com/whatwg/url/issues/104", - "href": "http://example.net", - "new_value": "b", -@@ -176,6 +201,14 @@ - } - }, - { -+ "href": "javascript:alert(1)", -+ "new_value": "wario", -+ "expected": { -+ "href": "javascript:alert(1)", -+ "username": "" -+ } -+ }, -+ { - "href": "http://example.net", - "new_value": "me", - "expected": { -@@ -224,6 +257,30 @@ - "href": "http://%c3%89t%C3%A9@example.net/", - "username": "%c3%89t%C3%A9" - } -+ }, -+ { -+ "href": "sc:///", -+ "new_value": "x", -+ "expected": { -+ "href": "sc:///", -+ "username": "" -+ } -+ }, -+ { -+ "href": "file://test/", -+ "new_value": "test", -+ "expected": { -+ "href": "file://test/", -+ "username": "" -+ } -+ }, -+ { -+ "href": "javascript://x/", -+ "new_value": "wario", -+ "expected": { -+ "href": "javascript://wario@x/", -+ "username": "wario" -+ } - } - ], - "password": [ -@@ -303,10 +360,106 @@ - "href": "http://:%c3%89t%C3%A9@example.net/", - "password": "%c3%89t%C3%A9" - } -+ }, -+ { -+ "href": "sc:///", -+ "new_value": "x", -+ "expected": { -+ "href": "sc:///", -+ "password": "" -+ } -+ }, -+ { -+ "href": "file://test/", -+ "new_value": "test", -+ "expected": { -+ "href": "file://test/", -+ "password": "" -+ } -+ }, -+ { -+ "href": "javascript://x/", -+ "new_value": "bowser", -+ "expected": { -+ "href": "javascript://:bowser@x/", -+ "password": "bowser" -+ } - } - ], - "host": [ - { -+ "href": "sc://x/", -+ "new_value": "\u0009", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "\u000A", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "\u000D", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "#", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "/", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "?", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "@", -+ "expected": { -+ "href": "sc://x/", -+ "host": "x", -+ "hostname": "x" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "ß", -+ "expected": { -+ "href": "sc://%C3%9F/", -+ "host": "%C3%9F", -+ "hostname": "%C3%9F" -+ } -+ }, -+ { - "comment": "Cannot-be-a-base means no host", - "href": "mailto:me@example.net", - "new_value": "example.com", -@@ -384,15 +537,6 @@ - } - }, - { -- "comment": "Path-only URLs can gain a host", -- "href": "a:/foo", -- "new_value": "example.net", -- "expected": { -- "href": "a://example.net/foo", -- "host": "example.net" -- } -- }, -- { - "comment": "IPv4 address syntax is normalized", - "href": "http://example.net", - "new_value": "0x7F000001:8080", -@@ -536,7 +680,7 @@ - } - }, - { -- "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain", -+ "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", - "href": "view-source+http://example.net/path", - "new_value": "example.com\\stuff", - "expected": { -@@ -600,10 +744,119 @@ - "hostname": "example.com", - "port": "" - } -+ }, -+ { -+ "comment": "Broken IPv6", -+ "href": "http://example.net/", -+ "new_value": "[google.com]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.3.4x]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.3.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } - } - ], - "hostname": [ - { -+ "href": "sc://x/", -+ "new_value": "\u0009", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "\u000A", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "\u000D", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "#", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "/", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "?", -+ "expected": { -+ "href": "sc:///", -+ "host": "", -+ "hostname": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "@", -+ "expected": { -+ "href": "sc://x/", -+ "host": "x", -+ "hostname": "x" -+ } -+ }, -+ { - "comment": "Cannot-be-a-base means no host", - "href": "mailto:me@example.net", - "new_value": "example.com", -@@ -659,15 +912,6 @@ - } - }, - { -- "comment": "Path-only URLs can gain a host", -- "href": "a:/foo", -- "new_value": "example.net", -- "expected": { -- "href": "a://example.net/foo", -- "host": "example.net" -- } -- }, -- { - "comment": "IPv4 address syntax is normalized", - "href": "http://example.net:8080", - "new_value": "0x7F000001", -@@ -756,7 +1000,7 @@ - } - }, - { -- "comment": "\\ is not a delimiter for non-special schemes, and it’s invalid in a domain", -+ "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", - "href": "view-source+http://example.net/path", - "new_value": "example.com\\stuff", - "expected": { -@@ -765,6 +1009,52 @@ - "hostname": "example.net", - "port": "" - } -+ }, -+ { -+ "comment": "Broken IPv6", -+ "href": "http://example.net/", -+ "new_value": "[google.com]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.3.4x]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.3.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.2.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } -+ }, -+ { -+ "href": "http://example.net/", -+ "new_value": "[::1.]", -+ "expected": { -+ "href": "http://example.net/", -+ "host": "example.net", -+ "hostname": "example.net" -+ } - } - ], - "port": [ -@@ -779,7 +1069,7 @@ - } - }, - { -- "comment": "Port number is removed if empty in the new value: https://github.com/whatwg/url/pull/113", -+ "comment": "Port number is removed if empty is the new value", - "href": "http://example.net:8080", - "new_value": "", - "expected": { -@@ -920,6 +1210,65 @@ - "hostname": "example.net", - "port": "8080" - } -+ }, -+ { -+ "comment": "Port numbers are 16 bit integers, overflowing is an error", -+ "href": "non-special://example.net:8080/path", -+ "new_value": "65536", -+ "expected": { -+ "href": "non-special://example.net:8080/path", -+ "host": "example.net:8080", -+ "hostname": "example.net", -+ "port": "8080" -+ } -+ }, -+ { -+ "href": "file://test/", -+ "new_value": "12", -+ "expected": { -+ "href": "file://test/", -+ "port": "" -+ } -+ }, -+ { -+ "href": "file://localhost/", -+ "new_value": "12", -+ "expected": { -+ "href": "file:///", -+ "port": "" -+ } -+ }, -+ { -+ "href": "non-base:value", -+ "new_value": "12", -+ "expected": { -+ "href": "non-base:value", -+ "port": "" -+ } -+ }, -+ { -+ "href": "sc:///", -+ "new_value": "12", -+ "expected": { -+ "href": "sc:///", -+ "port": "" -+ } -+ }, -+ { -+ "href": "sc://x/", -+ "new_value": "12", -+ "expected": { -+ "href": "sc://x:12/", -+ "port": "12" -+ } -+ }, -+ { -+ "href": "javascript://x/", -+ "new_value": "12", -+ "expected": { -+ "href": "javascript://x:12/", -+ "port": "12" -+ } - } - ], - "pathname": [ -@@ -970,8 +1319,8 @@ - "href": "view-source+http://example.net/home?lang=fr#nav", - "new_value": "\\a\\%2E\\b\\%2e.\\c", - "expected": { -- "href": "view-source+http://example.net/\\a\\.\\b\\..\\c?lang=fr#nav", -- "pathname": "/\\a\\.\\b\\..\\c" -+ "href": "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav", -+ "pathname": "/\\a\\%2E\\b\\%2e.\\c" - } - }, - { -@@ -984,12 +1333,48 @@ - } - }, - { -- "comment": "Bytes already percent-encoded are left as-is, except %2E.", -+ "comment": "Bytes already percent-encoded are left as-is, including %2E outside dotted segments.", - "href": "http://example.net", - "new_value": "%2e%2E%c3%89té", - "expected": { -- "href": "http://example.net/..%c3%89t%C3%A9", -- "pathname": "/..%c3%89t%C3%A9" -+ "href": "http://example.net/%2e%2E%c3%89t%C3%A9", -+ "pathname": "/%2e%2E%c3%89t%C3%A9" -+ } -+ }, -+ { -+ "comment": "? needs to be encoded", -+ "href": "http://example.net", -+ "new_value": "?", -+ "expected": { -+ "href": "http://example.net/%3F", -+ "pathname": "/%3F" -+ } -+ }, -+ { -+ "comment": "# needs to be encoded", -+ "href": "http://example.net", -+ "new_value": "#", -+ "expected": { -+ "href": "http://example.net/%23", -+ "pathname": "/%23" -+ } -+ }, -+ { -+ "comment": "? needs to be encoded, non-special scheme", -+ "href": "sc://example.net", -+ "new_value": "?", -+ "expected": { -+ "href": "sc://example.net/%3F", -+ "pathname": "/%3F" -+ } -+ }, -+ { -+ "comment": "# needs to be encoded, non-special scheme", -+ "href": "sc://example.net", -+ "new_value": "#", -+ "expected": { -+ "href": "sc://example.net/%23", -+ "pathname": "/%23" - } - } - ], -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/unit.rs seamonkey-2.53.1/mozilla/third_party/rust/url/tests/unit.rs ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/unit.rs 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/tests/unit.rs 2020-02-29 21:15:43.808770565 -0600 -@@ -11,7 +11,9 @@ - #[macro_use] - extern crate url; - -+use std::ascii::AsciiExt; - use std::borrow::Cow; -+use std::cell::{Cell, RefCell}; - use std::net::{Ipv4Addr, Ipv6Addr}; - use std::path::{Path, PathBuf}; - use url::{Host, HostAndPort, Url, form_urlencoded}; -@@ -108,6 +110,17 @@ - } - - #[test] -+fn path_backslash_fun() { -+ let mut special_url = "http://foobar.com".parse::<Url>().unwrap(); -+ special_url.path_segments_mut().unwrap().push("foo\\bar"); -+ assert_eq!(special_url.as_str(), "http://foobar.com/foo%5Cbar"); -+ -+ let mut nonspecial_url = "thing://foobar.com".parse::<Url>().unwrap(); -+ nonspecial_url.path_segments_mut().unwrap().push("foo\\bar"); -+ assert_eq!(nonspecial_url.as_str(), "thing://foobar.com/foo\\bar"); -+} -+ -+#[test] - fn from_str() { - assert!("http://testing.com/this".parse::<Url>().is_ok()); - } -@@ -221,7 +234,7 @@ - ("http://example.com/", "http://example.com/"), - ("http://addslash.com", "http://addslash.com/"), - ("http://@emptyuser.com/", "http://emptyuser.com/"), -- ("http://:@emptypass.com/", "http://:@emptypass.com/"), -+ ("http://:@emptypass.com/", "http://emptypass.com/"), - ("http://user@user.com/", "http://user@user.com/"), - ("http://user:pass@userpass.com/", "http://user:pass@userpass.com/"), - ("http://slashquery.com/path/?q=something", "http://slashquery.com/path/?q=something"), -@@ -256,6 +269,15 @@ - } - - #[test] -+fn form_urlencoded_custom_encoding_override() { -+ let encoded = form_urlencoded::Serializer::new(String::new()) -+ .custom_encoding_override(|s| s.as_bytes().to_ascii_uppercase().into()) -+ .append_pair("foo", "bar") -+ .finish(); -+ assert_eq!(encoded, "FOO=BAR"); -+} -+ -+#[test] - fn host_and_port_display() { - assert_eq!( - format!( -@@ -286,22 +308,6 @@ - } - - #[test] --/// https://github.com/servo/rust-url/issues/25 --fn issue_25() { -- let filename = if cfg!(windows) { r"C:\run\pg.sock" } else { "/run/pg.sock" }; -- let mut url = Url::from_file_path(filename).unwrap(); -- url.check_invariants().unwrap(); -- url.set_scheme("postgres").unwrap(); -- url.check_invariants().unwrap(); -- url.set_host(Some("")).unwrap(); -- url.check_invariants().unwrap(); -- url.set_username("me").unwrap(); -- url.check_invariants().unwrap(); -- let expected = format!("postgres://me@/{}run/pg.sock", if cfg!(windows) { "C:/" } else { "" }); -- assert_eq!(url.as_str(), expected); --} -- --#[test] - /// https://github.com/servo/rust-url/issues/61 - fn issue_61() { - let mut url = Url::parse("http://mozilla.org").unwrap(); -@@ -372,6 +378,11 @@ - let mut url = Url::parse("foobar://example.net/hello").unwrap(); - url.set_host(None).unwrap(); - assert_eq!(url.as_str(), "foobar:/hello"); -+ -+ let mut url = Url::parse("foo://ș").unwrap(); -+ assert_eq!(url.as_str(), "foo://%C8%99/"); -+ url.set_host(Some("goșu.ro")).unwrap(); -+ assert_eq!(url.as_str(), "foo://go%C8%99u.ro/"); - } - - #[test] -@@ -478,3 +489,68 @@ - let url = Url::from_file_path(Path::new(r"\\.\some\path\file.txt")); - assert!(url.is_err()); - } -+ -+// Test the now deprecated log_syntax_violation method for backward -+// compatibility -+#[test] -+#[allow(deprecated)] -+fn test_old_log_violation_option() { -+ let violation = Cell::new(None); -+ let url = Url::options() -+ .log_syntax_violation(Some(&|s| violation.set(Some(s.to_owned())))) -+ .parse("http:////mozilla.org:42").unwrap(); -+ assert_eq!(url.port(), Some(42)); -+ -+ let violation = violation.take(); -+ assert_eq!(violation, Some("expected //".to_string())); -+} -+ -+#[test] -+fn test_syntax_violation_callback() { -+ use url::SyntaxViolation::*; -+ let violation = Cell::new(None); -+ let url = Url::options() -+ .syntax_violation_callback(Some(&|v| violation.set(Some(v)))) -+ .parse("http:////mozilla.org:42").unwrap(); -+ assert_eq!(url.port(), Some(42)); -+ -+ let v = violation.take().unwrap(); -+ assert_eq!(v, ExpectedDoubleSlash); -+ assert_eq!(v.description(), "expected //"); -+} -+ -+#[test] -+fn test_syntax_violation_callback_lifetimes() { -+ use url::SyntaxViolation::*; -+ let violation = Cell::new(None); -+ let vfn = |s| violation.set(Some(s)); -+ -+ let url = Url::options() -+ .syntax_violation_callback(Some(&vfn)) -+ .parse("http:////mozilla.org:42").unwrap(); -+ assert_eq!(url.port(), Some(42)); -+ assert_eq!(violation.take(), Some(ExpectedDoubleSlash)); -+ -+ let url = Url::options() -+ .syntax_violation_callback(Some(&vfn)) -+ .parse("http://mozilla.org\\path").unwrap(); -+ assert_eq!(url.path(), "/path"); -+ assert_eq!(violation.take(), Some(Backslash)); -+} -+ -+#[test] -+fn test_options_reuse() { -+ use url::SyntaxViolation::*; -+ let violations = RefCell::new(Vec::new()); -+ let vfn = |v| violations.borrow_mut().push(v); -+ -+ let options = Url::options() -+ .syntax_violation_callback(Some(&vfn)); -+ let url = options.parse("http:////mozilla.org").unwrap(); -+ -+ let options = options.base_url(Some(&url)); -+ let url = options.parse("/sub\\path").unwrap(); -+ assert_eq!(url.as_str(), "http://mozilla.org/sub/path"); -+ assert_eq!(*violations.borrow(), -+ vec!(ExpectedDoubleSlash, Backslash)); -+} -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/urltestdata.json seamonkey-2.53.1/mozilla/third_party/rust/url/tests/urltestdata.json ---- seamonkey-2.53.1.orig/mozilla/third_party/rust/url/tests/urltestdata.json 2020-02-17 17:39:21.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/third_party/rust/url/tests/urltestdata.json 2020-02-29 21:15:07.679769022 -0600 -@@ -31,6 +31,66 @@ - "hash": "#c" - }, - { -+ "input": "https://test:@test", -+ "base": "about:blank", -+ "href": "https://test@test/", -+ "origin": "https://test", -+ "protocol": "https:", -+ "username": "test", -+ "password": "", -+ "host": "test", -+ "hostname": "test", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "https://:@test", -+ "base": "about:blank", -+ "href": "https://test/", -+ "origin": "https://test", -+ "protocol": "https:", -+ "username": "", -+ "password": "", -+ "host": "test", -+ "hostname": "test", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://test:@test/x", -+ "base": "about:blank", -+ "href": "non-special://test@test/x", -+ "origin": "null", -+ "protocol": "non-special:", -+ "username": "test", -+ "password": "", -+ "host": "test", -+ "hostname": "test", -+ "port": "", -+ "pathname": "/x", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://:@test/x", -+ "base": "about:blank", -+ "href": "non-special://test/x", -+ "origin": "null", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "test", -+ "hostname": "test", -+ "port": "", -+ "pathname": "/x", -+ "search": "", -+ "hash": "" -+ }, -+ { - "input": "http:foo.com", - "base": "http://example.org/foo/bar", - "href": "http://example.org/foo/foo.com", -@@ -106,6 +166,20 @@ - "hash": "# e" - }, - { -+ "input": "lolscheme:x x#x x", -+ "base": "about:blank", -+ "href": "lolscheme:x x#x x", -+ "protocol": "lolscheme:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "x x", -+ "search": "", -+ "hash": "#x x" -+ }, -+ { - "input": "http://f:/c", - "base": "http://example.org/foo/bar", - "href": "http://f/c", -@@ -201,6 +275,11 @@ - "failure": true - }, - { -+ "input": "non-special://f:999999/c", -+ "base": "http://example.org/foo/bar", -+ "failure": true -+ }, -+ { - "input": "http://f: 21 / b ? d # e ", - "base": "http://example.org/foo/bar", - "failure": true -@@ -960,6 +1039,26 @@ - "hash": "" - }, - { -+ "input": "file://example:1/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "file://example:test/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "file://example%/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "file://[example]/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { - "input": "ftps:/example.com/", - "base": "http://example.org/foo/bar", - "href": "ftps:/example.com/", -@@ -1785,7 +1884,7 @@ - { - "input": "http://example.com/foo/%2e%2", - "base": "about:blank", -- "href": "http://example.com/foo/.%2", -+ "href": "http://example.com/foo/%2e%2", - "origin": "http://example.com", - "protocol": "http:", - "username": "", -@@ -1793,14 +1892,14 @@ - "host": "example.com", - "hostname": "example.com", - "port": "", -- "pathname": "/foo/.%2", -+ "pathname": "/foo/%2e%2", - "search": "", - "hash": "" - }, - { - "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar", - "base": "about:blank", -- "href": "http://example.com/..bar", -+ "href": "http://example.com/%2e.bar", - "origin": "http://example.com", - "protocol": "http:", - "username": "", -@@ -1808,7 +1907,7 @@ - "host": "example.com", - "hostname": "example.com", - "port": "", -- "pathname": "/..bar", -+ "pathname": "/%2e.bar", - "search": "", - "hash": "" - }, -@@ -2189,11 +2288,6 @@ - "hash": "# %C2%BB" - }, - { -- "input": "http://[www.google.com]/", -- "base": "about:blank", -- "failure": true -- }, -- { - "input": "http://www.google.com", - "base": "about:blank", - "href": "http://www.google.com/", -@@ -2226,7 +2320,7 @@ - { - "input": "http://www/foo%2Ehtml", - "base": "about:blank", -- "href": "http://www/foo.html", -+ "href": "http://www/foo%2Ehtml", - "origin": "http://www", - "protocol": "http:", - "username": "", -@@ -2234,7 +2328,7 @@ - "host": "www", - "hostname": "www", - "port": "", -- "pathname": "/foo.html", -+ "pathname": "/foo%2Ehtml", - "search": "", - "hash": "" - }, -@@ -3096,7 +3190,7 @@ - { - "input": "http:a:@www.example.com", - "base": "about:blank", -- "href": "http://a:@www.example.com/", -+ "href": "http://a@www.example.com/", - "origin": "http://www.example.com", - "protocol": "http:", - "username": "a", -@@ -3111,7 +3205,7 @@ - { - "input": "http:/a:@www.example.com", - "base": "about:blank", -- "href": "http://a:@www.example.com/", -+ "href": "http://a@www.example.com/", - "origin": "http://www.example.com", - "protocol": "http:", - "username": "a", -@@ -3126,7 +3220,7 @@ - { - "input": "http://a:@www.example.com", - "base": "about:blank", -- "href": "http://a:@www.example.com/", -+ "href": "http://a@www.example.com/", - "origin": "http://www.example.com", - "protocol": "http:", - "username": "a", -@@ -3171,7 +3265,7 @@ - { - "input": "http://:@www.example.com", - "base": "about:blank", -- "href": "http://:@www.example.com/", -+ "href": "http://www.example.com/", - "origin": "http://www.example.com", - "protocol": "http:", - "username": "", -@@ -3465,6 +3559,22 @@ - "search": "", - "hash": "" - }, -+ "Leading and trailing C0 control or space", -+ { -+ "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ", -+ "base": "about:blank", -+ "href": "http://example.com/", -+ "origin": "http://example.com", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.com", -+ "hostname": "example.com", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, - "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)", - { - "input": "http://www.foo。bar.com", -@@ -3493,6 +3603,32 @@ - "base": "http://other.com/", - "failure": true - }, -+ "U+FFFD", -+ { -+ "input": "https://\ufffd", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://%EF%BF%BD", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://x/\ufffd?\ufffd#\ufffd", -+ "base": "about:blank", -+ "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD", -+ "origin": "https://x", -+ "protocol": "https:", -+ "username": "", -+ "password": "", -+ "host": "x", -+ "hostname": "x", -+ "port": "", -+ "pathname": "/%EF%BF%BD", -+ "search": "?%EF%BF%BD", -+ "hash": "#%EF%BF%BD" -+ }, - "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", - { - "input": "http://Go.com", -@@ -3536,7 +3672,7 @@ - "input": "http://你好你好", - "base": "http://other.com/", - "href": "http://xn--6qqa088eba/", -- "origin": "http://你好你好", -+ "origin": "http://xn--6qqa088eba", - "protocol": "http:", - "username": "", - "password": "", -@@ -3547,6 +3683,36 @@ - "search": "", - "hash": "" - }, -+ { -+ "input": "https://faß.ExAmPlE/", -+ "base": "about:blank", -+ "href": "https://xn--fa-hia.example/", -+ "origin": "https://xn--fa-hia.example", -+ "protocol": "https:", -+ "username": "", -+ "password": "", -+ "host": "xn--fa-hia.example", -+ "hostname": "xn--fa-hia.example", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "sc://faß.ExAmPlE/", -+ "base": "about:blank", -+ "href": "sc://fa%C3%9F.ExAmPlE/", -+ "origin": "null", -+ "protocol": "sc:", -+ "username": "", -+ "password": "", -+ "host": "fa%C3%9F.ExAmPlE", -+ "hostname": "fa%C3%9F.ExAmPlE", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, - "Invalid escaped characters should fail and the percents should be escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191", - { - "input": "http://%zz%66%a.com", -@@ -3600,18 +3766,23 @@ - "base": "http://other.com/", - "failure": true - }, -- "Invalid escaping should trigger the regular host error handling", -+ "Invalid escaping in hosts causes failure", - { - "input": "http://%3g%78%63%30%2e%30%32%35%30%2E.01", - "base": "http://other.com/", - "failure": true - }, -- "Something that isn't exactly an IP should get treated as a host and spaces escaped", -+ "A space in a host causes failure", - { - "input": "http://192.168.0.1 hello", - "base": "http://other.com/", - "failure": true - }, -+ { -+ "input": "https://x x:12", -+ "base": "about:blank", -+ "failure": true -+ }, - "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP", - { - "input": "http://0Xc0.0250.01", -@@ -3628,12 +3799,83 @@ - "search": "", - "hash": "" - }, -+ "Domains with empty labels", -+ { -+ "input": "http://./", -+ "base": "about:blank", -+ "href": "http://./", -+ "origin": "http://.", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": ".", -+ "hostname": ".", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://../", -+ "base": "about:blank", -+ "href": "http://../", -+ "origin": "http://..", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "..", -+ "hostname": "..", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://0..0x300/", -+ "base": "about:blank", -+ "href": "http://0..0x300/", -+ "origin": "http://0..0x300", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "0..0x300", -+ "hostname": "0..0x300", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, - "Broken IPv6", - { -+ "input": "http://[www.google.com]/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { - "input": "http://[google.com]", - "base": "http://other.com/", - "failure": true - }, -+ { -+ "input": "http://[::1.2.3.4x]", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://[::1.2.3.]", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://[::1.2.]", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://[::1.]", -+ "base": "http://other.com/", -+ "failure": true -+ }, - "Misc Unicode", - { - "input": "http://foo:💩@example.com/bar", -@@ -4176,22 +4418,91 @@ - "search": "", - "hash": "" - }, -- "# unknown schemes and non-ASCII domains", -+ "# unknown schemes and their hosts", - { - "input": "sc://ñ.test/", - "base": "about:blank", -- "href": "sc://xn--ida.test/", -+ "href": "sc://%C3%B1.test/", - "origin": "null", - "protocol": "sc:", - "username": "", - "password": "", -- "host": "xn--ida.test", -- "hostname": "xn--ida.test", -+ "host": "%C3%B1.test", -+ "hostname": "%C3%B1.test", - "port": "", - "pathname": "/", - "search": "", - "hash": "" - }, -+ { -+ "input": "sc://\u001F!\"$&'()*+,-.;<=>^_`{|}~/", -+ "base": "about:blank", -+ "href": "sc://%1F!\"$&'()*+,-.;<=>^_`{|}~/", -+ "origin": "null", -+ "protocol": "sc:", -+ "username": "", -+ "password": "", -+ "host": "%1F!\"$&'()*+,-.;<=>^_`{|}~", -+ "hostname": "%1F!\"$&'()*+,-.;<=>^_`{|}~", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "sc://\u0000/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "sc:// /", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "sc://%/", -+ "base": "about:blank", -+ "href": "sc://%/", -+ "protocol": "sc:", -+ "username": "", -+ "password": "", -+ "host": "%", -+ "hostname": "%", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "sc://[/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "sc://\\/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "sc://]/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "x", -+ "base": "sc://ñ", -+ "href": "sc://%C3%B1/x", -+ "origin": "null", -+ "protocol": "sc:", -+ "username": "", -+ "password": "", -+ "host": "%C3%B1", -+ "hostname": "%C3%B1", -+ "port": "", -+ "pathname": "/x", -+ "search": "", -+ "hash": "" -+ }, - "# unknown schemes and backslashes", - { - "input": "sc:\\../", -@@ -4224,6 +4535,88 @@ - "search": "", - "hash": "" - }, -+ "# unknown scheme with bogus percent-encoding", -+ { -+ "input": "wow:%NBD", -+ "base": "about:blank", -+ "href": "wow:%NBD", -+ "origin": "null", -+ "protocol": "wow:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "%NBD", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "wow:%1G", -+ "base": "about:blank", -+ "href": "wow:%1G", -+ "origin": "null", -+ "protocol": "wow:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "%1G", -+ "search": "", -+ "hash": "" -+ }, -+ "# Hosts and percent-encoding", -+ { -+ "input": "ftp://example.com%80/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "ftp://example.com%A0/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://example.com%80/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://example.com%A0/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "ftp://%e2%98%83", -+ "base": "about:blank", -+ "href": "ftp://xn--n3h/", -+ "origin": "ftp://xn--n3h", -+ "protocol": "ftp:", -+ "username": "", -+ "password": "", -+ "host": "xn--n3h", -+ "hostname": "xn--n3h", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "https://%e2%98%83", -+ "base": "about:blank", -+ "href": "https://xn--n3h/", -+ "origin": "https://xn--n3h", -+ "protocol": "https:", -+ "username": "", -+ "password": "", -+ "host": "xn--n3h", -+ "hostname": "xn--n3h", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, - "# tests from jsdom/whatwg-url designed for code coverage", - { - "input": "http://127.0.0.1:10100/relative_import.html", -@@ -4371,75 +4764,1385 @@ - "port": "", - "pathname": "/baz", - "search": "?qux", -- "searchParams": "", -+ "searchParams": "qux=", - "hash": "#foo%08bar" - }, -- "# IPv6 compression and serialization", -+ "# IPv4 parsing (via https://github.com/nodejs/node/pull/10317)", -+ { -+ "input": "http://192.168.257", -+ "base": "http://other.com/", -+ "href": "http://192.168.1.1/", -+ "origin": "http://192.168.1.1", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "192.168.1.1", -+ "hostname": "192.168.1.1", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://192.168.257.com", -+ "base": "http://other.com/", -+ "href": "http://192.168.257.com/", -+ "origin": "http://192.168.257.com", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "192.168.257.com", -+ "hostname": "192.168.257.com", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://256", -+ "base": "http://other.com/", -+ "href": "http://0.0.1.0/", -+ "origin": "http://0.0.1.0", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "0.0.1.0", -+ "hostname": "0.0.1.0", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://256.com", -+ "base": "http://other.com/", -+ "href": "http://256.com/", -+ "origin": "http://256.com", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "256.com", -+ "hostname": "256.com", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://999999999", -+ "base": "http://other.com/", -+ "href": "http://59.154.201.255/", -+ "origin": "http://59.154.201.255", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "59.154.201.255", -+ "hostname": "59.154.201.255", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://999999999.com", -+ "base": "http://other.com/", -+ "href": "http://999999999.com/", -+ "origin": "http://999999999.com", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "999999999.com", -+ "hostname": "999999999.com", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://10000000000", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://10000000000.com", -+ "base": "http://other.com/", -+ "href": "http://10000000000.com/", -+ "origin": "http://10000000000.com", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "10000000000.com", -+ "hostname": "10000000000.com", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://4294967295", -+ "base": "http://other.com/", -+ "href": "http://255.255.255.255/", -+ "origin": "http://255.255.255.255", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "255.255.255.255", -+ "hostname": "255.255.255.255", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://4294967296", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://0xffffffff", -+ "base": "http://other.com/", -+ "href": "http://255.255.255.255/", -+ "origin": "http://255.255.255.255", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "255.255.255.255", -+ "hostname": "255.255.255.255", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://0xffffffff1", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://256.256.256.256", -+ "base": "http://other.com/", -+ "failure": true -+ }, -+ { -+ "input": "http://256.256.256.256.256", -+ "base": "http://other.com/", -+ "href": "http://256.256.256.256.256/", -+ "origin": "http://256.256.256.256.256", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "256.256.256.256.256", -+ "hostname": "256.256.256.256.256", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "https://0x.0x.0", -+ "base": "about:blank", -+ "href": "https://0.0.0.0/", -+ "origin": "https://0.0.0.0", -+ "protocol": "https:", -+ "username": "", -+ "password": "", -+ "host": "0.0.0.0", -+ "hostname": "0.0.0.0", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", -+ { -+ "input": "https://256.0.0.1/test", -+ "base": "about:blank", -+ "failure": true -+ }, -+ "# file URLs containing percent-encoded Windows drive letters (shouldn't work)", -+ { -+ "input": "file:///C%3A/", -+ "base": "about:blank", -+ "href": "file:///C%3A/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C%3A/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file:///C%7C/", -+ "base": "about:blank", -+ "href": "file:///C%7C/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C%7C/", -+ "search": "", -+ "hash": "" -+ }, -+ "# file URLs relative to other file URLs (via https://github.com/jsdom/whatwg-url/pull/60)", -+ { -+ "input": "pix/submit.gif", -+ "base": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html", -+ "href": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "..", -+ "base": "file:///C:/", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "..", -+ "base": "file:///", -+ "href": "file:///", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ "# More file URL tests by zcorpan and annevk", -+ { -+ "input": "/", -+ "base": "file:///C:/a/b", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "//d:", -+ "base": "file:///C:/a/b", -+ "href": "file:///d:", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/d:", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "//d:/..", -+ "base": "file:///C:/a/b", -+ "href": "file:///d:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/d:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "..", -+ "base": "file:///ab:/", -+ "href": "file:///", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "..", -+ "base": "file:///1:/", -+ "href": "file:///", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "", -+ "base": "file:///test?test#test", -+ "href": "file:///test?test", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?test", -+ "hash": "" -+ }, -+ { -+ "input": "file:", -+ "base": "file:///test?test#test", -+ "href": "file:///test?test", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?test", -+ "hash": "" -+ }, -+ { -+ "input": "?x", -+ "base": "file:///test?test#test", -+ "href": "file:///test?x", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?x", -+ "hash": "" -+ }, -+ { -+ "input": "file:?x", -+ "base": "file:///test?test#test", -+ "href": "file:///test?x", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?x", -+ "hash": "" -+ }, -+ { -+ "input": "#x", -+ "base": "file:///test?test#test", -+ "href": "file:///test?test#x", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?test", -+ "hash": "#x" -+ }, -+ { -+ "input": "file:#x", -+ "base": "file:///test?test#test", -+ "href": "file:///test?test#x", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test", -+ "search": "?test", -+ "hash": "#x" -+ }, -+ "# File URLs and many (back)slashes", -+ { -+ "input": "file:///localhost//cat", -+ "base": "about:blank", -+ "href": "file:///localhost//cat", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/localhost//cat", -+ "search": "", -+ "hash": "" -+ }, - { -- "input": "http://[fe80:cd00::1257:0:211e:729c]/", -+ "input": "\\//pig", -+ "base": "file://lion/", -+ "href": "file:///pig", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/pig", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file://", -+ "base": "file://ape/", -+ "href": "file:///", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ "# Windows drive letter handling with the 'file:' base URL", -+ { -+ "input": "C|#", -+ "base": "file://host/dir/file", -+ "href": "file:///C:#", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C|?", -+ "base": "file://host/dir/file", -+ "href": "file:///C:?", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C|/", -+ "base": "file://host/dir/file", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C|\n/", -+ "base": "file://host/dir/file", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C|\\", -+ "base": "file://host/dir/file", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C", -+ "base": "file://host/dir/file", -+ "href": "file://host/dir/C", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "host", -+ "hostname": "host", -+ "port": "", -+ "pathname": "/dir/C", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "C|a", -+ "base": "file://host/dir/file", -+ "href": "file://host/dir/C|a", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "host", -+ "hostname": "host", -+ "port": "", -+ "pathname": "/dir/C|a", -+ "search": "", -+ "hash": "" -+ }, -+ "# Windows drive letter quirk in the file slash state", -+ { -+ "input": "/c:/foo/bar", -+ "base": "file://host/path", -+ "href": "file:///c:/foo/bar", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/c:/foo/bar", -+ "search": "", -+ "hash": "" -+ }, -+ "# Windows drive letter quirk (no host)", -+ { -+ "input": "file:/C|/", - "base": "about:blank", -- "href": "http://[fe80:cd00::1257:0:211e:729c]/", -- "origin": "http://[fe80:cd00::1257:0:211e:729c]", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file://C|/", -+ "base": "about:blank", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ "# Windows drive letter quirk with not empty host", -+ { -+ "input": "file://example.net/C:/", -+ "base": "about:blank", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file://1.2.3.4/C:/", -+ "base": "about:blank", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file://[1::8]/C:/", -+ "base": "about:blank", -+ "href": "file:///C:/", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/C:/", -+ "search": "", -+ "hash": "" -+ }, -+ "# file URLs without base URL by Rimas Misevičius", -+ { -+ "input": "file:", -+ "base": "about:blank", -+ "href": "file:///", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "file:?q=v", -+ "base": "about:blank", -+ "href": "file:///?q=v", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "?q=v", -+ "hash": "" -+ }, -+ { -+ "input": "file:#frag", -+ "base": "about:blank", -+ "href": "file:///#frag", -+ "protocol": "file:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "#frag" -+ }, -+ "# IPv6 tests", -+ { -+ "input": "http://[1:0::]", -+ "base": "http://example.net/", -+ "href": "http://[1::]/", -+ "origin": "http://[1::]", - "protocol": "http:", - "username": "", - "password": "", -- "host": "[fe80:cd00::1257:0:211e:729c]", -- "hostname": "[fe80:cd00::1257:0:211e:729c]", -+ "host": "[1::]", -+ "hostname": "[1::]", - "port": "", - "pathname": "/", - "search": "", -- "searchParams": "", - "hash": "" - }, -- "# IPv6 compression and serialization: Compress sequences of two or more zeroes", - { -- "input": "http://[fe80:cd00:0:0:1257:0:211e:729c]/", -+ "input": "http://[0:1:2:3:4:5:6:7:8]", -+ "base": "http://example.net/", -+ "failure": true -+ }, -+ { -+ "input": "https://[0::0::0]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:.0]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:0:]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:1.00.0.0.0]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:1.290.0.0.0]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "https://[0:1.23.23]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ "# Empty host", -+ { -+ "input": "http://?", - "base": "about:blank", -- "href": "http://[fe80:cd00::1257:0:211e:729c]/", -- "origin": "http://[fe80:cd00::1257:0:211e:729c]", -+ "failure": true -+ }, -+ { -+ "input": "http://#", -+ "base": "about:blank", -+ "failure": true -+ }, -+ "Port overflow (2^32 + 81)", -+ { -+ "input": "http://f:4294967377/c", -+ "base": "http://example.org/", -+ "failure": true -+ }, -+ "Port overflow (2^64 + 81)", -+ { -+ "input": "http://f:18446744073709551697/c", -+ "base": "http://example.org/", -+ "failure": true -+ }, -+ "Port overflow (2^128 + 81)", -+ { -+ "input": "http://f:340282366920938463463374607431768211537/c", -+ "base": "http://example.org/", -+ "failure": true -+ }, -+ "# Non-special-URL path tests", -+ { -+ "input": "///", -+ "base": "sc://x/", -+ "href": "sc:///", -+ "protocol": "sc:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "tftp://foobar.com/someconfig;mode=netascii", -+ "base": "about:blank", -+ "href": "tftp://foobar.com/someconfig;mode=netascii", -+ "origin": "null", -+ "protocol": "tftp:", -+ "username": "", -+ "password": "", -+ "host": "foobar.com", -+ "hostname": "foobar.com", -+ "port": "", -+ "pathname": "/someconfig;mode=netascii", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "telnet://user:pass@foobar.com:23/", -+ "base": "about:blank", -+ "href": "telnet://user:pass@foobar.com:23/", -+ "origin": "null", -+ "protocol": "telnet:", -+ "username": "user", -+ "password": "pass", -+ "host": "foobar.com:23", -+ "hostname": "foobar.com", -+ "port": "23", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "ut2004://10.10.10.10:7777/Index.ut2", -+ "base": "about:blank", -+ "href": "ut2004://10.10.10.10:7777/Index.ut2", -+ "origin": "null", -+ "protocol": "ut2004:", -+ "username": "", -+ "password": "", -+ "host": "10.10.10.10:7777", -+ "hostname": "10.10.10.10", -+ "port": "7777", -+ "pathname": "/Index.ut2", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", -+ "base": "about:blank", -+ "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", -+ "origin": "null", -+ "protocol": "redis:", -+ "username": "foo", -+ "password": "bar", -+ "host": "somehost:6379", -+ "hostname": "somehost", -+ "port": "6379", -+ "pathname": "/0", -+ "search": "?baz=bam&qux=baz", -+ "hash": "" -+ }, -+ { -+ "input": "rsync://foo@host:911/sup", -+ "base": "about:blank", -+ "href": "rsync://foo@host:911/sup", -+ "origin": "null", -+ "protocol": "rsync:", -+ "username": "foo", -+ "password": "", -+ "host": "host:911", -+ "hostname": "host", -+ "port": "911", -+ "pathname": "/sup", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "git://github.com/foo/bar.git", -+ "base": "about:blank", -+ "href": "git://github.com/foo/bar.git", -+ "origin": "null", -+ "protocol": "git:", -+ "username": "", -+ "password": "", -+ "host": "github.com", -+ "hostname": "github.com", -+ "port": "", -+ "pathname": "/foo/bar.git", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "irc://myserver.com:6999/channel?passwd", -+ "base": "about:blank", -+ "href": "irc://myserver.com:6999/channel?passwd", -+ "origin": "null", -+ "protocol": "irc:", -+ "username": "", -+ "password": "", -+ "host": "myserver.com:6999", -+ "hostname": "myserver.com", -+ "port": "6999", -+ "pathname": "/channel", -+ "search": "?passwd", -+ "hash": "" -+ }, -+ { -+ "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT", -+ "base": "about:blank", -+ "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT", -+ "origin": "null", -+ "protocol": "dns:", -+ "username": "", -+ "password": "", -+ "host": "fw.example.org:9999", -+ "hostname": "fw.example.org", -+ "port": "9999", -+ "pathname": "/foo.bar.org", -+ "search": "?type=TXT", -+ "hash": "" -+ }, -+ { -+ "input": "ldap://localhost:389/ou=People,o=JNDITutorial", -+ "base": "about:blank", -+ "href": "ldap://localhost:389/ou=People,o=JNDITutorial", -+ "origin": "null", -+ "protocol": "ldap:", -+ "username": "", -+ "password": "", -+ "host": "localhost:389", -+ "hostname": "localhost", -+ "port": "389", -+ "pathname": "/ou=People,o=JNDITutorial", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "git+https://github.com/foo/bar", -+ "base": "about:blank", -+ "href": "git+https://github.com/foo/bar", -+ "origin": "null", -+ "protocol": "git+https:", -+ "username": "", -+ "password": "", -+ "host": "github.com", -+ "hostname": "github.com", -+ "port": "", -+ "pathname": "/foo/bar", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "urn:ietf:rfc:2648", -+ "base": "about:blank", -+ "href": "urn:ietf:rfc:2648", -+ "origin": "null", -+ "protocol": "urn:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "ietf:rfc:2648", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "tag:joe@example.org,2001:foo/bar", -+ "base": "about:blank", -+ "href": "tag:joe@example.org,2001:foo/bar", -+ "origin": "null", -+ "protocol": "tag:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "joe@example.org,2001:foo/bar", -+ "search": "", -+ "hash": "" -+ }, -+ "# percent encoded hosts in non-special-URLs", -+ { -+ "input": "non-special://%E2%80%A0/", -+ "base": "about:blank", -+ "href": "non-special://%E2%80%A0/", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "%E2%80%A0", -+ "hostname": "%E2%80%A0", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://H%4fSt/path", -+ "base": "about:blank", -+ "href": "non-special://H%4fSt/path", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "H%4fSt", -+ "hostname": "H%4fSt", -+ "port": "", -+ "pathname": "/path", -+ "search": "", -+ "hash": "" -+ }, -+ "# IPv6 in non-special-URLs", -+ { -+ "input": "non-special://[1:2:0:0:5:0:0:0]/", -+ "base": "about:blank", -+ "href": "non-special://[1:2:0:0:5::]/", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "[1:2:0:0:5::]", -+ "hostname": "[1:2:0:0:5::]", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://[1:2:0:0:0:0:0:3]/", -+ "base": "about:blank", -+ "href": "non-special://[1:2::3]/", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "[1:2::3]", -+ "hostname": "[1:2::3]", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://[1:2::3]:80/", -+ "base": "about:blank", -+ "href": "non-special://[1:2::3]:80/", -+ "protocol": "non-special:", -+ "username": "", -+ "password": "", -+ "host": "[1:2::3]:80", -+ "hostname": "[1:2::3]", -+ "port": "80", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "non-special://[:80/", -+ "base": "about:blank", -+ "failure": true -+ }, -+ { -+ "input": "blob:https://example.com:443/", -+ "base": "about:blank", -+ "href": "blob:https://example.com:443/", -+ "protocol": "blob:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "https://example.com:443/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", -+ "base": "about:blank", -+ "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", -+ "protocol": "blob:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "d3958f5c-0777-0845-9dcf-2cb28783acaf", -+ "search": "", -+ "hash": "" -+ }, -+ "Invalid IPv4 radix digits", -+ { -+ "input": "http://0177.0.0.0189", -+ "base": "about:blank", -+ "href": "http://0177.0.0.0189/", - "protocol": "http:", - "username": "", - "password": "", -- "host": "[fe80:cd00::1257:0:211e:729c]", -- "hostname": "[fe80:cd00::1257:0:211e:729c]", -+ "host": "0177.0.0.0189", -+ "hostname": "0177.0.0.0189", - "port": "", - "pathname": "/", - "search": "", -- "searchParams": "", - "hash": "" - }, -- "# IPv6 compression and serialization: Compress longest sequence of zeroes", - { -- "input": "http://[fe80:0:0:1257:0:0:0:cd00]/", -+ "input": "http://0x7f.0.0.0x7g", - "base": "about:blank", -- "href": "http://[fe80:0:0:1257::cd00]/", -- "origin": "http://[fe80:0:0:1257::cd00]", -+ "href": "http://0x7f.0.0.0x7g/", - "protocol": "http:", - "username": "", - "password": "", -- "host": "[fe80:0:0:1257::cd00]", -- "hostname": "[fe80:0:0:1257::cd00]", -+ "host": "0x7f.0.0.0x7g", -+ "hostname": "0x7f.0.0.0x7g", - "port": "", - "pathname": "/", - "search": "", -- "searchParams": "", - "hash": "" - }, -- "# IPv6 compression and serialization: Do not compress lone zeroes", - { -- "input": "http://[fe80:cd00:0:cde:1257:0:211e:729c]/", -+ "input": "http://0X7F.0.0.0X7G", - "base": "about:blank", -- "href": "http://[fe80:cd00:0:cde:1257:0:211e:729c]/", -- "origin": "http://[fe80:cd00:0:cde:1257:0:211e:729c]", -+ "href": "http://0x7f.0.0.0x7g/", - "protocol": "http:", - "username": "", - "password": "", -- "host": "[fe80:cd00:0:cde:1257:0:211e:729c]", -- "hostname": "[fe80:cd00:0:cde:1257:0:211e:729c]", -+ "host": "0x7f.0.0.0x7g", -+ "hostname": "0x7f.0.0.0x7g", - "port": "", - "pathname": "/", - "search": "", -- "searchParams": "", - "hash": "" -+ }, -+ "Invalid IPv4 portion of IPv6 address", -+ { -+ "input": "http://[::127.0.0.0.1]", -+ "base": "about:blank", -+ "failure": true -+ }, -+ "Uncompressed IPv6 addresses with 0", -+ { -+ "input": "http://[0:1:0:1:0:1:0:1]", -+ "base": "about:blank", -+ "href": "http://[0:1:0:1:0:1:0:1]/", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "[0:1:0:1:0:1:0:1]", -+ "hostname": "[0:1:0:1:0:1:0:1]", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://[1:0:1:0:1:0:1:0]", -+ "base": "about:blank", -+ "href": "http://[1:0:1:0:1:0:1:0]/", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "[1:0:1:0:1:0:1:0]", -+ "hostname": "[1:0:1:0:1:0:1:0]", -+ "port": "", -+ "pathname": "/", -+ "search": "", -+ "hash": "" -+ }, -+ "Percent-encoded query and fragment", -+ { -+ "input": "http://example.org/test?\u0022", -+ "base": "about:blank", -+ "href": "http://example.org/test?%22", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%22", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?\u0023", -+ "base": "about:blank", -+ "href": "http://example.org/test?#", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?\u003C", -+ "base": "about:blank", -+ "href": "http://example.org/test?%3C", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%3C", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?\u003E", -+ "base": "about:blank", -+ "href": "http://example.org/test?%3E", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%3E", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?\u2323", -+ "base": "about:blank", -+ "href": "http://example.org/test?%E2%8C%A3", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%E2%8C%A3", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?%23%23", -+ "base": "about:blank", -+ "href": "http://example.org/test?%23%23", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%23%23", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?%GH", -+ "base": "about:blank", -+ "href": "http://example.org/test?%GH", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?%GH", -+ "hash": "" -+ }, -+ { -+ "input": "http://example.org/test?a#%EF", -+ "base": "about:blank", -+ "href": "http://example.org/test?a#%EF", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?a", -+ "hash": "#%EF" -+ }, -+ { -+ "input": "http://example.org/test?a#%GH", -+ "base": "about:blank", -+ "href": "http://example.org/test?a#%GH", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?a", -+ "hash": "#%GH" -+ }, -+ "Bad bases", -+ { -+ "input": "test-a.html", -+ "base": "a", -+ "failure": true -+ }, -+ { -+ "input": "test-a-slash.html", -+ "base": "a/", -+ "failure": true -+ }, -+ { -+ "input": "test-a-slash-slash.html", -+ "base": "a//", -+ "failure": true -+ }, -+ { -+ "input": "test-a-colon.html", -+ "base": "a:", -+ "failure": true -+ }, -+ { -+ "input": "test-a-colon-slash.html", -+ "base": "a:/", -+ "href": "a:/test-a-colon-slash.html", -+ "protocol": "a:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test-a-colon-slash.html", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "test-a-colon-slash-slash.html", -+ "base": "a://", -+ "href": "a:///test-a-colon-slash-slash.html", -+ "protocol": "a:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test-a-colon-slash-slash.html", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "test-a-colon-b.html", -+ "base": "a:b", -+ "failure": true -+ }, -+ { -+ "input": "test-a-colon-slash-b.html", -+ "base": "a:/b", -+ "href": "a:/test-a-colon-slash-b.html", -+ "protocol": "a:", -+ "username": "", -+ "password": "", -+ "host": "", -+ "hostname": "", -+ "port": "", -+ "pathname": "/test-a-colon-slash-b.html", -+ "search": "", -+ "hash": "" -+ }, -+ { -+ "input": "test-a-colon-slash-slash-b.html", -+ "base": "a://b", -+ "href": "a://b/test-a-colon-slash-slash-b.html", -+ "protocol": "a:", -+ "username": "", -+ "password": "", -+ "host": "b", -+ "hostname": "b", -+ "port": "", -+ "pathname": "/test-a-colon-slash-slash-b.html", -+ "search": "", -+ "hash": "" -+ }, -+ "Null code point in fragment", -+ { -+ "input": "http://example.org/test?a#b\u0000c", -+ "base": "about:blank", -+ "href": "http://example.org/test?a#bc", -+ "protocol": "http:", -+ "username": "", -+ "password": "", -+ "host": "example.org", -+ "hostname": "example.org", -+ "port": "", -+ "pathname": "/test", -+ "search": "?a", -+ "hash": "#bc" - } - ] -diff -u -r --new-file seamonkey-2.53.1.orig/mozilla/toolkit/library/rust/Cargo.lock seamonkey-2.53.1/mozilla/toolkit/library/rust/Cargo.lock ---- seamonkey-2.53.1.orig/mozilla/toolkit/library/rust/Cargo.lock 2020-02-17 17:39:43.000000000 -0600 -+++ seamonkey-2.53.1/mozilla/toolkit/library/rust/Cargo.lock 2020-02-29 21:16:23.120772244 -0600 -@@ -808,7 +808,7 @@ - "libc 0.2.24 (registry+https://github.com/rust-lang/crates.io-index)", - "nserror 0.1.0", - "nsstring 0.1.0", -- "url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -+ "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - ] - - [[package]] -@@ -1154,7 +1154,7 @@ - - [[package]] - name = "url" --version = "1.5.1" -+version = "1.7.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - dependencies = [ - "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -@@ -1383,7 +1383,7 @@ - "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f" - "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" - "checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" --"checksum url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eeb819346883532a271eb626deb43c4a1bb4c4dd47c519bd78137c3e72a4fe27" -+"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" - "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" - "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c" - "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" |