diff options
-rw-r--r-- | Cargo.lock | 135 | ||||
-rw-r--r-- | components/dom_struct/lib.rs | 1 | ||||
-rw-r--r-- | components/script/Cargo.toml | 3 | ||||
-rw-r--r-- | components/script/dom/testbindingproxy.rs | 4 | ||||
-rw-r--r-- | components/script/dom/webidls/Window.webidl | 3 | ||||
-rw-r--r-- | components/script/dom/webidls/WindowProxy.webidl | 7 | ||||
-rw-r--r-- | components/script_plugins/Cargo.toml | 4 | ||||
-rw-r--r-- | components/script_plugins/lib.rs | 9 | ||||
-rw-r--r-- | components/script_plugins/webidl_must_inherit.rs | 222 |
9 files changed, 369 insertions, 19 deletions
diff --git a/Cargo.lock b/Cargo.lock index 72d0c9ca162..f400c75e2af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -66,8 +66,11 @@ dependencies = [ [[package]] name = "ansi_term" -version = "0.10.2" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "antidote" @@ -118,6 +121,14 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "ascii-canvas" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "atomic_refcell" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -224,7 +235,7 @@ dependencies = [ "cexpr 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "clang-sys 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.28.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "hashbrown 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -238,6 +249,19 @@ dependencies = [ ] [[package]] +name = "bit-set" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bit-vec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "bitflags" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -464,7 +488,7 @@ name = "cbindgen" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "clap 2.28.0 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", @@ -528,14 +552,14 @@ dependencies = [ [[package]] name = "clap" -version = "2.28.0" +version = "2.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1011,6 +1035,11 @@ dependencies = [ ] [[package]] +name = "diff" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "digest" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1044,6 +1073,18 @@ dependencies = [ ] [[package]] +name = "docopt" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "dom_struct" version = "0.0.1" dependencies = [ @@ -1114,6 +1155,14 @@ dependencies = [ ] [[package]] +name = "ena" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "encoding_rs" version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2191,6 +2240,35 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] +name = "lalrpop" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ena 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lalrpop-util 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)", + "petgraph 0.4.13 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lalrpop-util" +version = "0.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] name = "layout" version = "0.0.1" dependencies = [ @@ -3593,6 +3671,9 @@ dependencies = [ [[package]] name = "script_plugins" version = "0.0.1" +dependencies = [ + "webidl 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "script_plugins_tests" @@ -4232,7 +4313,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "strsim" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -4408,6 +4489,15 @@ dependencies = [ ] [[package]] +name = "term" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "termcolor" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4427,7 +4517,7 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4963,6 +5053,15 @@ dependencies = [ ] [[package]] +name = "webidl" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lalrpop 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)", + "lalrpop-util 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] name = "webrender" version = "0.60.0" source = "git+https://github.com/servo/webrender#e53aae02728e155e555b8baa9d180d90dac3b86f" @@ -5263,7 +5362,7 @@ dependencies = [ "checksum android_injected_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "80b9e34fcbf29c0563547cb2ecce9b49504597cad6166769b1e4efb45c6c2951" "checksum android_log-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e" "checksum android_logger 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf44378e81264148f08e58336674542f82d0021f685d0be0320c82e1653dbe0b" -"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455" +"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" "checksum app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9dadc668390b373e73e4abbfc1f07238b09a25858f2f39c06cebc6d8e141d774" "checksum approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f71f10b5c4946a64aad7b8cf65e3406cd3da22fc448595991d22423cf6db67b4" @@ -5271,6 +5370,7 @@ dependencies = [ "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" "checksum arrayvec 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0ef4a9820019a0c91d918918c93dc71d469f581a49b47ddc1d285d4270bbe2" "checksum ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae7d751998c189c1d4468cf0a39bb2eae052a9c58d50ebb3b9591ee3813ad50" +"checksum ascii-canvas 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b385d69402821a1c254533a011a312531cbcc0e3e24f19bbb4747a5a2daf37e2" "checksum atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb2dcb6e6d35f20276943cc04bb98e538b348d525a04ac79c10021561d202f21" "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum azure 0.35.0 (git+https://github.com/servo/rust-azure)" = "<none>" @@ -5281,6 +5381,8 @@ dependencies = [ "checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff" "checksum bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bda13183df33055cbb84b847becce220d392df502ebe7a4a78d7021771ed94d0" "checksum bindgen 0.49.0 (registry+https://github.com/rust-lang/crates.io-index)" = "33e1b67a27bca31fd12a683b2a3618e275311117f48cfcc892e18403ff889026" +"checksum bit-set 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e84c238982c4b1e1ee668d136c510c67a13465279c0cb367ea6baf6310620a80" +"checksum bit-vec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" "checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" @@ -5310,7 +5412,7 @@ dependencies = [ "checksum cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49" "checksum chrono 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cce36c92cb605414e9b824f866f5babe0a0368e39ea07393b9b63cf3844c0e6" "checksum clang-sys 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4227269cec09f5f83ff160be12a1e9b0262dd1aa305302d5ba296c2ebd291055" -"checksum clap 2.28.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc34bf7d5d66268b466b9852bca925ec1d2650654dab4da081e63fd230145c2e" +"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum clipboard 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "25a904646c0340239dcf7c51677b33928bf24fdf424b79a57909c0109075b2e7" "checksum clipboard-win 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "14cc3e6c075926b96490d5f90d4a5af7be8012a4d8a8698e619655085a7641a3" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" @@ -5344,15 +5446,18 @@ dependencies = [ "checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86" "checksum derive_more 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f57d78cf3bd45270dad4e70c21ec77a960b36c7a841ff9db76aaa775a8fb871" "checksum device 0.0.1 (git+https://github.com/servo/devices)" = "<none>" +"checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a" "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" "checksum digest 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f47366984d3ad862010e22c7ce81a7dbcaebbdfb37241a620f8b6596ee135c" "checksum dirs 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37a76dd8b997af7107d0bb69d43903cf37153a18266f8b3fdb9911f28efb5444" "checksum dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "77e51249a9d823a4cb79e3eca6dcd756153e8ed0157b6c04775d04bf1b13b76a" +"checksum docopt 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db2906c2579b5b7207fc1e328796a9a8835dc44e22dbe8e460b1d636f9a7b225" "checksum downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "18df8ce4470c189d18aa926022da57544f31e154631eb4cfe796aea97051fe6c" "checksum dtoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80c8b71fd71146990a9742fc06dcbbde19161a267e0ad4e572c35162f4578c90" "checksum dtoa-short 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe6f727b406462fd57c95fed84d1b0dbfb5f0136fcac005adba9ea0367c05cc8" "checksum dwrote 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c31c624339dab99c223a4b26c2e803b7c248adaca91549ce654c76f39a03f5c8" "checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a" +"checksum ena 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f56c93cc076508c549d9bb747f79aa9b4eb098be7b8cad8830c3137ef52d1e00" "checksum encoding_rs 0.8.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ca20350a7cb5aab5b9034731123d6d412caf3e92d4985e739e411ba0955fd0eb" "checksum energy-monitor 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fe872d0664f1cc60db36349af245d892ee67d3c8f78055df0ebc43271fd4e05c" "checksum energymon 0.3.0 (git+https://github.com/energymon/energymon-rust.git)" = "<none>" @@ -5450,6 +5555,8 @@ dependencies = [ "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum keyboard-types 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "53b536dc22c0dabb295e85dbd0c062023885b12b8db24e1d86833f4e50ea7959" "checksum khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49" +"checksum lalrpop 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2e80bee40b22bca46665b4ef1f3cd88ed0fb043c971407eac17a0712c02572" +"checksum lalrpop-util 0.16.3 (registry+https://github.com/rust-lang/crates.io-index)" = "33b27d8490dbe1f9704b0088d61e8d46edc10d5673a8829836c6ded26a9912c7" "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" "checksum lazycell 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d33a48d0365c96081958cc663eef834975cb1e8d8bea3378513fc72bdbf11e50" "checksum leak 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" @@ -5594,15 +5701,16 @@ dependencies = [ "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da" "checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" -"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694" +"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum swapper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e454d048db5527d000bfddb77bd072bbf3a1e2ae785f16d9bd116e07c2ab45eb" "checksum syn 0.15.22 (registry+https://github.com/rust-lang/crates.io-index)" = "ae8b29eb5210bc5cf63ed6149cbf9adfc82ac0be023d8735c176ee74a2db4da7" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" "checksum tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b" +"checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" +"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thin-slice 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum thread_profiler 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5920e77802b177479ab5795767fa48e68f61b2f516c2ac0041e2978dd8efe483" @@ -5657,6 +5765,7 @@ dependencies = [ "checksum wayland-scanner 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f1927ee62e4e149c010dc9eca8ca47e238416cd6f45f688eb9f8a8e9c3794c30" "checksum wayland-sys 0.21.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ca41ed78a12256f81df6f53fcbe4503213ba442e02cdad3c9c888a64a668eaf4" "checksum webdriver 0.39.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0533b0b0a05e2e5c081317759a038482806c6085c9605dded03c8bbd2498b042" +"checksum webidl 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f807f7488d680893f7188aa09d7672a3a0a8461975a098a2edf0a52e3fee29" "checksum webrender 0.60.0 (git+https://github.com/servo/webrender)" = "<none>" "checksum webrender_api 0.60.0 (git+https://github.com/servo/webrender)" = "<none>" "checksum webrender_build 0.0.1 (git+https://github.com/servo/webrender)" = "<none>" diff --git a/components/dom_struct/lib.rs b/components/dom_struct/lib.rs index 2fdac787706..59a3cf8072c 100644 --- a/components/dom_struct/lib.rs +++ b/components/dom_struct/lib.rs @@ -19,6 +19,7 @@ pub fn dom_struct(args: TokenStream, input: TokenStream) -> TokenStream { #[derive(DenyPublicFields, DomObject, JSTraceable, MallocSizeOf)] #[must_root] #[repr(C)] + #[webidl] }; // Work around https://github.com/rust-lang/rust/issues/46489 diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index 8076d77b7bb..c6dc04c6004 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -17,7 +17,8 @@ debugmozjs = ['js/debugmozjs'] profilemozjs = ['js/profilemozjs'] unstable = [] unrooted_must_root_lint = ["script_plugins/unrooted_must_root_lint"] -default = ["unrooted_must_root_lint"] +webidl_lint = ["script_plugins/webidl_lint"] +default = ["unrooted_must_root_lint", "webidl_lint"] webgl_backtrace = ["backtrace", "canvas_traits/webgl_backtrace"] js_backtrace = ["backtrace"] diff --git a/components/script/dom/testbindingproxy.rs b/components/script/dom/testbindingproxy.rs index 46134a3393f..3b352acb097 100644 --- a/components/script/dom/testbindingproxy.rs +++ b/components/script/dom/testbindingproxy.rs @@ -5,13 +5,13 @@ // check-tidy: no specs after this line use crate::dom::bindings::codegen::Bindings::TestBindingProxyBinding::TestBindingProxyMethods; -use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::str::DOMString; +use crate::dom::testbinding::TestBinding; use dom_struct::dom_struct; #[dom_struct] pub struct TestBindingProxy { - reflector_: Reflector, + testbinding_: TestBinding, } impl TestBindingProxyMethods for TestBindingProxy { diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 1679fa42887..81ffee9283e 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -72,9 +72,6 @@ Window implements GlobalEventHandlers; Window implements WindowEventHandlers; -[NoInterfaceObject] -interface WindowProxy {}; - // https://html.spec.whatwg.org/multipage/#Window-partial partial interface Window { void captureEvents(); diff --git a/components/script/dom/webidls/WindowProxy.webidl b/components/script/dom/webidls/WindowProxy.webidl new file mode 100644 index 00000000000..897f86c295b --- /dev/null +++ b/components/script/dom/webidls/WindowProxy.webidl @@ -0,0 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +// https://html.spec.whatwg.org/multipage/#the-windowproxy-exotic-object +[NoInterfaceObject] +interface WindowProxy {}; diff --git a/components/script_plugins/Cargo.toml b/components/script_plugins/Cargo.toml index c6bc3eb2250..1999b3e8e82 100644 --- a/components/script_plugins/Cargo.toml +++ b/components/script_plugins/Cargo.toml @@ -11,3 +11,7 @@ plugin = true [features] unrooted_must_root_lint = [] +webidl_lint = [] + +[dependencies] +webidl = "0.8" diff --git a/components/script_plugins/lib.rs b/components/script_plugins/lib.rs index 36c81ce6239..7d0460bf5a1 100644 --- a/components/script_plugins/lib.rs +++ b/components/script_plugins/lib.rs @@ -25,12 +25,17 @@ extern crate rustc; extern crate rustc_plugin; extern crate syntax; +extern crate webidl; + use rustc_plugin::Registry; use syntax::feature_gate::AttributeType::Whitelisted; #[cfg(feature = "unrooted_must_root_lint")] mod unrooted_must_root; +#[cfg(feature = "webidl_lint")] +mod webidl_must_inherit; + /// Utilities for writing plugins #[cfg(feature = "unrooted_must_root_lint")] mod utils; @@ -40,7 +45,11 @@ pub fn plugin_registrar(reg: &mut Registry) { #[cfg(feature = "unrooted_must_root_lint")] reg.register_late_lint_pass(Box::new(unrooted_must_root::UnrootedPass::new())); + #[cfg(feature = "webidl_lint")] + reg.register_late_lint_pass(Box::new(webidl_must_inherit::WebIdlPass::new())); + reg.register_attribute("allow_unrooted_interior".to_string(), Whitelisted); reg.register_attribute("allow_unrooted_in_rc".to_string(), Whitelisted); reg.register_attribute("must_root".to_string(), Whitelisted); + reg.register_attribute("webidl".to_string(), Whitelisted); } diff --git a/components/script_plugins/webidl_must_inherit.rs b/components/script_plugins/webidl_must_inherit.rs new file mode 100644 index 00000000000..89233bb943e --- /dev/null +++ b/components/script_plugins/webidl_must_inherit.rs @@ -0,0 +1,222 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use rustc::hir::{self, HirId}; +use rustc::lint::{LateContext, LateLintPass, LintArray, LintContext, LintPass}; +use rustc::ty; +use std::boxed; +use std::env; +use std::error::Error; +use std::fmt; +use std::fs; +use std::io; +use std::path; +use syntax::ast; +use webidl::ast::*; +use webidl::visitor::*; +use webidl::*; + +declare_lint!( + WEBIDL_INHERIT_CORRECT, + Deny, + "Warn and report usage of incorrect webidl inheritance" +); + +pub struct WebIdlPass; + +#[derive(Clone, Debug)] +pub struct ParentMismatchError { + name: String, + rust_parent: String, + webidl_parent: String, +} + +impl fmt::Display for ParentMismatchError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "webidl-rust inheritance mismatch, rust: {:?}, rust parent: {:?}, webidl parent: {:?}", + self.name, self.rust_parent, self.webidl_parent + ) + } +} + +impl Error for ParentMismatchError { + fn description(&self) -> &str { + "ParentMismatchError" + } + + fn cause(&self) -> Option<&Error> { + None + } +} + +impl WebIdlPass { + pub fn new() -> WebIdlPass { + WebIdlPass + } +} + +fn get_ty_name(ty: &str) -> &str { + if let Some(i) = ty.rfind(':') { + &ty[i + 1..] + } else { + ty + } +} + +fn get_webidl_path(struct_name: &str) -> io::Result<path::PathBuf> { + let mut dir = env::current_dir()?; + dir.push("components/script/dom/webidls/"); + dir.push(format!("{}.webidl", struct_name)); + + Ok(dir) +} + +fn is_webidl_ty(cx: &LateContext, ty: &ty::TyS) -> bool { + let mut ret = false; + ty.maybe_walk(|t| { + match t.sty { + ty::Adt(did, _substs) => { + if cx.tcx.has_attr(did.did, "webidl") { + ret = true; + } + false + }, + ty::Ref(..) => false, // don't recurse down &ptrs + ty::RawPtr(..) => false, // don't recurse down *ptrs + ty::FnDef(..) | ty::FnPtr(_) => false, + _ => true, + } + }); + ret +} + +fn check_inherits(code: &str, name: &str, parent_name: &str) -> Result<(), Box<Error>> { + let idl = parse_string(code)?; + let mut visitor = InterfaceVisitor::new(name.to_string()); + visitor.visit(&idl); + let inherits = visitor.get_inherits(); + + if inherits == parent_name { + return Ok(()); + } + + // If there is no parent, first field must be of type Reflector. + if inherits == "" && parent_name == "Reflector" { + return Ok(()); + } + + if inherits == "" && + name == "PaintRenderingContext2D" && + parent_name == "CanvasRenderingContext2D" + { + // PaintRenderingContext2D embeds a CanvasRenderingContext2D + // instead of a Reflector as an optimization, + // but this is fine since CanvasRenderingContext2D + // also has a reflector + return Ok(()); + } + + Err(boxed::Box::from(ParentMismatchError { + name: name.to_string(), + rust_parent: parent_name.to_string(), + webidl_parent: inherits.to_string(), + })) +} + +fn check_webidl(name: &str, parent_name: &Option<String>) -> Result<(), Box<Error>> { + let path = get_webidl_path(&name)?; + if let Some(parent) = parent_name { + let code = fs::read_to_string(path)?; + return check_inherits(&code, name, &parent); + } + + Ok(()) +} + +impl LintPass for WebIdlPass { + fn name(&self) -> &'static str { + "ServoWebIDLPass" + } + + fn get_lints(&self) -> LintArray { + lint_array!(WEBIDL_INHERIT_CORRECT) + } +} + +impl<'a, 'tcx> LateLintPass<'a, 'tcx> for WebIdlPass { + fn check_struct_def( + &mut self, + cx: &LateContext<'a, 'tcx>, + def: &'tcx hir::VariantData, + n: ast::Name, + _gen: &'tcx hir::Generics, + id: HirId, + ) { + let def_id = cx.tcx.hir().local_def_id_from_hir_id(id); + if !is_webidl_ty(cx, cx.tcx.type_of(def_id)) { + return; + } + + let item = match cx.tcx.hir().get_by_hir_id(id) { + hir::Node::Item(item) => item, + _ => cx + .tcx + .hir() + .expect_item_by_hir_id(cx.tcx.hir().get_parent_item(id)), + }; + + let parent_name = def.fields().iter().next().map(|field| { + let def_id = cx.tcx.hir().local_def_id_from_hir_id(field.hir_id); + let ty = cx.tcx.type_of(def_id).to_string(); + get_ty_name(&ty).to_string() + }); + + let struct_name = n.to_string(); + match check_webidl(&struct_name, &parent_name) { + Ok(()) => {}, + Err(e) => { + let description = format!("{}", e); + cx.span_lint(WEBIDL_INHERIT_CORRECT, item.ident.span, &description) + }, + }; + } +} + +struct InterfaceVisitor { + name: String, + inherits: String, +} + +impl InterfaceVisitor { + pub fn new(name: String) -> Self { + InterfaceVisitor { + name: name, + inherits: String::new(), + } + } + + pub fn get_inherits(&self) -> &String { + &self.inherits + } +} + +impl<'ast> ImmutableVisitor<'ast> for InterfaceVisitor { + fn visit_callback_interface(&mut self, callback_interface: &'ast CallbackInterface) { + if callback_interface.name == self.name { + if let Some(ref inherit) = callback_interface.inherits { + self.inherits = inherit.to_string() + } + } + } + + fn visit_non_partial_interface(&mut self, non_partial_interface: &'ast NonPartialInterface) { + if non_partial_interface.name == self.name { + if let Some(ref inherit) = non_partial_interface.inherits { + self.inherits = inherit.to_string() + } + } + } +} |