Selector: Inline Sizzle into the selector module: 3.x version (#5113)

This commit removes Sizzle from jQuery, inlining its code & removing obsolete
workarounds where applicable.

The Sizzle AUTHORS.txt file has been merged with the jQuery one - people are
sorted by their first contributions to either of the two repositories.

The main `selector` module can be disabled in favor of `selector-native`
via:

    grunt custom:-selector

For backwards compatibility, the legacy `sizzle` alias is also supported (it
will be dropped in jQuery `4.0.0`):

    grunt custom:-selector

Sizzle tests have been ported to jQuery ones. Ones that are not compatible
with the `selector-native` module are disabled if the regular selector module
is excluded.

Backwards compatibility is still kept for all `Sizzle` utils - they continue to be
available under `jQuery.find` - but the primary implementation is now attached
directly to jQuery.

Some selector utils shared by `selector` & `selector-native` have been
extracted & deduplicated. `jQuery.text` and `jQuery.isXMLDoc` have been
moved to the `core` module.

The commit reduces the gzipped jQuery size by 851 bytes compared to the
`3.x-stable` branch.

Closes gh-5113
Ref gh-4395
Ref gh-4406
This commit is contained in:
Michał Gołębiowski-Owczarek 2022-12-14 01:41:31 +01:00 committed by GitHub
parent 96675fa7c8
commit 6306ca4994
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 5058 additions and 3312 deletions

View File

@ -28,9 +28,9 @@ jobs:
NODE_VERSION: "16.x" NODE_VERSION: "16.x"
NPM_SCRIPT: "test:no-deprecated" NPM_SCRIPT: "test:no-deprecated"
BROWSERS: "ChromeHeadless" BROWSERS: "ChromeHeadless"
- NAME: "Browser tests: no-Sizzle build, Chrome stable" - NAME: "Browser tests: selector-native build, Chrome stable"
NODE_VERSION: "16.x" NODE_VERSION: "16.x"
NPM_SCRIPT: "test:no-sizzle" NPM_SCRIPT: "test:selector-native"
BROWSERS: "ChromeHeadless" BROWSERS: "ChromeHeadless"
- NAME: "Browser tests: AMD build, Chrome stable" - NAME: "Browser tests: AMD build, Chrome stable"
NODE_VERSION: "16.x" NODE_VERSION: "16.x"

View File

@ -18,16 +18,24 @@ David Serduke <davidserduke@gmail.com>
Richard D. Worth <rdworth@gmail.com> Richard D. Worth <rdworth@gmail.com>
Scott González <scott.gonzalez@gmail.com> Scott González <scott.gonzalez@gmail.com>
Ariel Flesler <aflesler@gmail.com> Ariel Flesler <aflesler@gmail.com>
Cheah Chu Yeow <chuyeow@gmail.com>
Andrew Chalkley <andrew@chalkley.org>
Fabio Buffoni <fabio.buffoni@bitmaster.it>
Stefan Bauckmeier  <stefan@bauckmeier.de>
Jon Evans <jon@springyweb.com> Jon Evans <jon@springyweb.com>
TJ Holowaychuk <tj@vision-media.ca> TJ Holowaychuk <tj@vision-media.ca>
Riccardo De Agostini <rdeago@gmail.com>
Michael Bensoussan <mickey@seesmic.com> Michael Bensoussan <mickey@seesmic.com>
Robert Katić <robert.katic@gmail.com>
Louis-Rémi Babé <lrbabe@gmail.com> Louis-Rémi Babé <lrbabe@gmail.com>
Earle Castledine <mrspeaker@gmail.com> Robert Katić <robert.katic@gmail.com>
Damian Janowski <damian.janowski@gmail.com> Damian Janowski <damian.janowski@gmail.com>
Anton Kovalyov <anton@kovalyov.net>
Dušan B. Jovanovic <dbjdbj@gmail.com>
Earle Castledine <mrspeaker@gmail.com>
Rich Dougherty <rich@rd.gen.nz> Rich Dougherty <rich@rd.gen.nz>
Kim Dalsgaard <kim@kimdalsgaard.com> Kim Dalsgaard <kim@kimdalsgaard.com>
Andrea Giammarchi <andrea.giammarchi@gmail.com> Andrea Giammarchi <andrea.giammarchi@gmail.com>
Fabian Jakobs <fabian.jakobs@web.de>
Mark Gibson <jollytoad@gmail.com> Mark Gibson <jollytoad@gmail.com>
Karl Swedberg <kswedberg@gmail.com> Karl Swedberg <kswedberg@gmail.com>
Justin Meyer <justinbmeyer@gmail.com> Justin Meyer <justinbmeyer@gmail.com>
@ -35,9 +43,10 @@ Ben Alman <cowboy@rj3.net>
James Padolsey <cla@padolsey.net> James Padolsey <cla@padolsey.net>
David Petersen <public@petersendidit.com> David Petersen <public@petersendidit.com>
Batiste Bieler <batiste.bieler@gmail.com> Batiste Bieler <batiste.bieler@gmail.com>
Jake Archibald <jake.archibald@bbc.co.uk>
Alexander Farkas <info@corrupt-system.de> Alexander Farkas <info@corrupt-system.de>
Rick Waldron <waldron.rick@gmail.com>
Filipe Fortes <filipe@fortes.com> Filipe Fortes <filipe@fortes.com>
Rick Waldron <waldron.rick@gmail.com>
Neeraj Singh <neerajdotname@gmail.com> Neeraj Singh <neerajdotname@gmail.com>
Paul Irish <paul.irish@gmail.com> Paul Irish <paul.irish@gmail.com>
Iraê Carvalho <irae@irae.pro.br> Iraê Carvalho <irae@irae.pro.br>
@ -45,23 +54,24 @@ Matt Curry <matt@pseudocoder.com>
Michael Monteleone <michael@michaelmonteleone.net> Michael Monteleone <michael@michaelmonteleone.net>
Noah Sloan <noah.sloan@gmail.com> Noah Sloan <noah.sloan@gmail.com>
Tom Viner <github@viner.tv> Tom Viner <github@viner.tv>
J. Ryan Stinnett <jryans@gmail.com>
Douglas Neiner <doug@dougneiner.com> Douglas Neiner <doug@dougneiner.com>
Adam J. Sontag <ajpiano@ajpiano.com> Adam J. Sontag <ajpiano@ajpiano.com>
Heungsub Lee <h@subl.ee>
Dave Reed <dareed@microsoft.com> Dave Reed <dareed@microsoft.com>
Ralph Whitbeck <ralph.whitbeck@gmail.com>
Carl Fürstenberg <azatoth@gmail.com> Carl Fürstenberg <azatoth@gmail.com>
Jacob Wright <jacwright@gmail.com> Jacob Wright <jacwright@gmail.com>
J. Ryan Stinnett <jryans@gmail.com> Ralph Whitbeck <ralph.whitbeck@gmail.com>
unknown <Igen005@.upcorp.ad.uprr.com> unknown <Igen005@.upcorp.ad.uprr.com>
temp01 <temp01irc@gmail.com> temp01 <temp01irc@gmail.com>
Heungsub Lee <h@subl.ee>
Colin Snover <github.com@zetafleet.com> Colin Snover <github.com@zetafleet.com>
Jared Grippe <jared@deadlyicon.com>
Ryan W Tenney <ryan@10e.us> Ryan W Tenney <ryan@10e.us>
Alex Sexton <AlexSexton@gmail.com>
Pinhook <contact@pinhooklabs.com> Pinhook <contact@pinhooklabs.com>
Ron Otten <r.j.g.otten@gmail.com> Ron Otten <r.j.g.otten@gmail.com>
Jephte Clain <Jephte.Clain@univ-reunion.fr> Jephte Clain <Jephte.Clain@univ-reunion.fr>
Anton Matzneller <obhvsbypqghgc@gmail.com> Anton Matzneller <obhvsbypqghgc@gmail.com>
Alex Sexton <AlexSexton@gmail.com>
Dan Heberden <danheberden@gmail.com> Dan Heberden <danheberden@gmail.com>
Henri Wiechers <hwiechers@gmail.com> Henri Wiechers <hwiechers@gmail.com>
Russell Holbrook <russell.holbrook@patch.com> Russell Holbrook <russell.holbrook@patch.com>
@ -71,21 +81,19 @@ Scott Jehl <scottjehl@gmail.com>
James Burke <jrburke@gmail.com> James Burke <jrburke@gmail.com>
Jonas Pfenniger <jonas@pfenniger.name> Jonas Pfenniger <jonas@pfenniger.name>
Xavi Ramirez <xavi.rmz@gmail.com> Xavi Ramirez <xavi.rmz@gmail.com>
Jared Grippe <jared@deadlyicon.com>
Sylvester Keil <sylvester@keil.or.at> Sylvester Keil <sylvester@keil.or.at>
Brandon Sterne <bsterne@mozilla.com> Brandon Sterne <bsterne@mozilla.com>
Mathias Bynens <mathias@qiwi.be> Mathias Bynens <mathias@qiwi.be>
Lee Carpenter <elcarpie@gmail.com>
Timmy Willison <4timmywil@gmail.com> Timmy Willison <4timmywil@gmail.com>
Corey Frang <gnarf37@gmail.com> Corey Frang <gnarf37@gmail.com>
Digitalxero <digitalxero> Digitalxero <digitalxero>
Anton Kovalyov <anton@kovalyov.net>
David Murdoch <david@davidmurdoch.com> David Murdoch <david@davidmurdoch.com>
Josh Varner <josh.varner@gmail.com> Josh Varner <josh.varner@gmail.com>
Charles McNulty <cmcnulty@kznf.com> Charles McNulty <cmcnulty@kznf.com>
Jordan Boesch <jboesch26@gmail.com> Jordan Boesch <jboesch26@gmail.com>
Jess Thrysoee <jess@thrysoee.dk> Jess Thrysoee <jess@thrysoee.dk>
Michael Murray <m@murz.net> Michael Murray <m@murz.net>
Lee Carpenter <elcarpie@gmail.com>
Alexis Abril <me@alexisabril.com> Alexis Abril <me@alexisabril.com>
Rob Morgan <robbym@gmail.com> Rob Morgan <robbym@gmail.com>
John Firebaugh <john_firebaugh@bigfix.com> John Firebaugh <john_firebaugh@bigfix.com>
@ -105,12 +113,13 @@ Timo Tijhof <krinklemail@gmail.com>
Steen Nielsen <swinedk@gmail.com> Steen Nielsen <swinedk@gmail.com>
Anton Ryzhov <anton@ryzhov.me> Anton Ryzhov <anton@ryzhov.me>
Shi Chuan <shichuanr@gmail.com> Shi Chuan <shichuanr@gmail.com>
Matt Mueller <mattmuelle@gmail.com>
Berker Peksag <berker.peksag@gmail.com> Berker Peksag <berker.peksag@gmail.com>
Toby Brain <tobyb@freshview.com> Toby Brain <tobyb@freshview.com>
Matt Mueller <mattmuelle@gmail.com>
Justin <drakefjustin@gmail.com> Justin <drakefjustin@gmail.com>
Daniel Herman <daniel.c.herman@gmail.com> Daniel Herman <daniel.c.herman@gmail.com>
Oleg Gaidarenko <markelog@gmail.com> Oleg Gaidarenko <markelog@gmail.com>
Rock Hymas <rock@fogcreek.com>
Richard Gibson <richard.gibson@gmail.com> Richard Gibson <richard.gibson@gmail.com>
Rafaël Blais Masson <rafbmasson@gmail.com> Rafaël Blais Masson <rafbmasson@gmail.com>
cmc3cn <59194618@qq.com> cmc3cn <59194618@qq.com>
@ -122,6 +131,7 @@ Andrew E Monat <amonat@gmail.com>
Oskari <admin@o-programs.com> Oskari <admin@o-programs.com>
Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br> Joao Henrique de Andrade Bruni <joaohbruni@yahoo.com.br>
tsinha <tsinha@Anthonys-MacBook-Pro.local> tsinha <tsinha@Anthonys-MacBook-Pro.local>
Dominik D. Geyer <dominik.geyer@gmail.com>
Matt Farmer <matt@frmr.me> Matt Farmer <matt@frmr.me>
Trey Hunner <treyhunner@gmail.com> Trey Hunner <treyhunner@gmail.com>
Jason Moon <jmoon@socialcast.com> Jason Moon <jmoon@socialcast.com>
@ -130,164 +140,180 @@ Kris Borchers <kris.borchers@gmail.com>
Vladimir Zhuravlev <private.face@gmail.com> Vladimir Zhuravlev <private.face@gmail.com>
Jacob Thornton <jacobthornton@gmail.com> Jacob Thornton <jacobthornton@gmail.com>
Chad Killingsworth <chadkillingsworth@missouristate.edu> Chad Killingsworth <chadkillingsworth@missouristate.edu>
Vitya Muhachev <vic99999@yandex.ru>
Nowres Rafid <nowres.rafed@gmail.com> Nowres Rafid <nowres.rafed@gmail.com>
David Benjamin <davidben@mit.edu> David Benjamin <davidben@mit.edu>
Alan Plum <github@ap.apsq.de>
Uri Gilad <antishok@gmail.com> Uri Gilad <antishok@gmail.com>
Chris Faulkner <thefaulkner@gmail.com> Chris Faulkner <thefaulkner@gmail.com>
Marcel Greter <marcel.greter@ocbnet.ch>
Elijah Manor <elijah.manor@gmail.com> Elijah Manor <elijah.manor@gmail.com>
Daniel Chatfield <chatfielddaniel@gmail.com> Daniel Chatfield <chatfielddaniel@gmail.com>
Daniel Gálvez <dgalvez@editablething.com>
Nikita Govorov <nikita.govorov@gmail.com> Nikita Govorov <nikita.govorov@gmail.com>
Wesley Walser <waw325@gmail.com> Wesley Walser <waw325@gmail.com>
Mike Pennisi <mike@mikepennisi.com> Mike Pennisi <mike@mikepennisi.com>
Matthias Jäggli <matthias.jaeggli@gmail.com>
Devin Cooper <cooper.semantics@gmail.com>
Markus Staab <markus.staab@redaxo.de> Markus Staab <markus.staab@redaxo.de>
Dave Riddle <david@joyvuu.com> Dave Riddle <david@joyvuu.com>
Callum Macrae <callum@lynxphp.com> Callum Macrae <callum@lynxphp.com>
Jonathan Sampson <jjdsampson@gmail.com>
Benjamin Truyman <bentruyman@gmail.com> Benjamin Truyman <bentruyman@gmail.com>
Jay Merrifield <fracmak@gmail.com>
James Huston <james@jameshuston.net> James Huston <james@jameshuston.net>
Sai Lung Wong <sai.wong@huffingtonpost.com>
Erick Ruiz de Chávez <erickrdch@gmail.com> Erick Ruiz de Chávez <erickrdch@gmail.com>
David Bonner <dbonner@cogolabs.com> David Bonner <dbonner@cogolabs.com>
Allen J Schmidt Jr <cobrasoft@gmail.com>
Akintayo Akinwunmi <aakinwunmi@judge.com> Akintayo Akinwunmi <aakinwunmi@judge.com>
MORGAN <morgan@morgangraphics.com> MORGAN <morgan@morgangraphics.com>
Ismail Khair <ismail.khair@gmail.com> Ismail Khair <ismail.khair@gmail.com>
Carl Danley <carldanley@gmail.com> Carl Danley <carldanley@gmail.com>
Mike Petrovich <michael.c.petrovich@gmail.com> Mike Petrovich <michael.c.petrovich@gmail.com>
Greg Lavallee <greglavallee@wapolabs.com> Greg Lavallee <greglavallee@wapolabs.com>
Daniel Gálvez <dgalvez@editablething.com>
Sai Lung Wong <sai.wong@huffingtonpost.com>
Tom H Fuertes <TomFuertes@gmail.com> Tom H Fuertes <TomFuertes@gmail.com>
Roland Eckl <eckl.roland@googlemail.com> Roland Eckl <eckl.roland@googlemail.com>
Jay Merrifield <fracmak@gmail.com>
Allen J Schmidt Jr <cobrasoft@gmail.com>
Jonathan Sampson <jjdsampson@gmail.com>
Marcel Greter <marcel.greter@ocbnet.ch>
Matthias Jäggli <matthias.jaeggli@gmail.com>
David Fox <dfoxinator@gmail.com>
Yiming He <yiminghe@gmail.com> Yiming He <yiminghe@gmail.com>
Devin Cooper <cooper.semantics@gmail.com> David Fox <dfoxinator@gmail.com>
Bennett Sorbo <bsorbo@gmail.com>
Paul Ramos <paul.b.ramos@gmail.com> Paul Ramos <paul.b.ramos@gmail.com>
Rod Vagg <rod@vagg.org> Rod Vagg <rod@vagg.org>
Bennett Sorbo <bsorbo@gmail.com>
Sebastian Burkhard <sebi.burkhard@gmail.com> Sebastian Burkhard <sebi.burkhard@gmail.com>
Zachary Adam Kaplan <razic@viralkitty.com> Zachary Adam Kaplan <razic@viralkitty.com>
Adam Coulombe <me@adam.co>
nanto_vi <nanto@moon.email.ne.jp> nanto_vi <nanto@moon.email.ne.jp>
nanto <nanto@moon.email.ne.jp> nanto <nanto@moon.email.ne.jp>
Danil Somsikov <danilasomsikov@gmail.com> Danil Somsikov <danilasomsikov@gmail.com>
Ryunosuke SATO <tricknotes.rs@gmail.com> Ryunosuke SATO <tricknotes.rs@gmail.com>
Diego Tres <diegotres@gmail.com>
Jean Boussier <jean.boussier@gmail.com> Jean Boussier <jean.boussier@gmail.com>
Adam Coulombe <me@adam.co>
Andrew Plummer <plummer.andrew@gmail.com> Andrew Plummer <plummer.andrew@gmail.com>
Mark Raddatz <mraddatz@gmail.com> Mark Raddatz <mraddatz@gmail.com>
Pascal Borreli <pascal@borreli.com>
Isaac Z. Schlueter <i@izs.me> Isaac Z. Schlueter <i@izs.me>
Karl Sieburg <ksieburg@yahoo.com> Karl Sieburg <ksieburg@yahoo.com>
Pascal Borreli <pascal@borreli.com>
Nguyen Phuc Lam <ruado1987@gmail.com> Nguyen Phuc Lam <ruado1987@gmail.com>
Dmitry Gusev <dmitry.gusev@gmail.com> Dmitry Gusev <dmitry.gusev@gmail.com>
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
Li Xudong <istonelee@gmail.com>
Steven Benner <admin@stevenbenner.com> Steven Benner <admin@stevenbenner.com>
Tom H Fuertes <tomfuertes@gmail.com> Li Xudong <istonelee@gmail.com>
Michał Gołębiowski-Owczarek <m.goleb@gmail.com>
Renato Oliveira dos Santos <ros3@cin.ufpe.br> Renato Oliveira dos Santos <ros3@cin.ufpe.br>
Frederic Junod <frederic.junod@camptocamp.com>
Tom H Fuertes <tomfuertes@gmail.com>
Mitch Foley <mitch@thefoley.net>
ros3cin <ros3@cin.ufpe.br> ros3cin <ros3@cin.ufpe.br>
Jason Bedard <jason+jquery@jbedard.ca>
Kyle Robinson Young <kyle@dontkry.com> Kyle Robinson Young <kyle@dontkry.com>
John Paul <john@johnkpaul.com>
Jason Bedard <jason+jquery@jbedard.ca>
Chris Talkington <chris@talkingtontech.com> Chris Talkington <chris@talkingtontech.com>
Eddie Monge <eddie@eddiemonge.com> Eddie Monge <eddie@eddiemonge.com>
Terry Jones <terry@jon.es> Terry Jones <terry@jon.es>
Jason Merino <jasonmerino@gmail.com> Jason Merino <jasonmerino@gmail.com>
Dan Burzo <danburzo@gmail.com>
Jeremy Dunck <jdunck@gmail.com> Jeremy Dunck <jdunck@gmail.com>
Chris Price <price.c@gmail.com> Chris Price <price.c@gmail.com>
Guy Bedford <guybedford@gmail.com> Guy Bedford <guybedford@gmail.com>
njhamann <njhamann@gmail.com>
Goare Mao <mygoare@gmail.com>
Amey Sakhadeo <me@ameyms.com> Amey Sakhadeo <me@ameyms.com>
Mike Sidorov <mikes.ekb@gmail.com> Mike Sidorov <mikes.ekb@gmail.com>
Anthony Ryan <anthonyryan1@gmail.com> Anthony Ryan <anthonyryan1@gmail.com>
Dominik D. Geyer <dominik.geyer@gmail.com>
George Kats <katsgeorgeek@gmail.com>
Lihan Li <frankieteardrop@gmail.com> Lihan Li <frankieteardrop@gmail.com>
George Kats <katsgeorgeek@gmail.com>
Dongseok Paeng <dongseok83.paeng@lge.com>
Ronny Springer <springer.ronny@gmail.com> Ronny Springer <springer.ronny@gmail.com>
Chris Antaki <ChrisAntaki@gmail.com>
Marian Sollmann <marian.sollmann@cargomedia.ch>
njhamann <njhamann@gmail.com>
Ilya Kantor <iliakan@gmail.com> Ilya Kantor <iliakan@gmail.com>
Marian Sollmann <marian.sollmann@cargomedia.ch>
Chris Antaki <ChrisAntaki@gmail.com>
David Hong <d.hong@me.com> David Hong <d.hong@me.com>
John Paul <john@johnkpaul.com>
Jakob Stoeck <jakob@pokermania.de> Jakob Stoeck <jakob@pokermania.de>
Christopher Jones <chris@cjqed.com> Christopher Jones <chris@cjqed.com>
Forbes Lindesay <forbes@lindesay.co.uk> Forbes Lindesay <forbes@lindesay.co.uk>
S. Andrew Sheppard <andrew@wq.io> S. Andrew Sheppard <andrew@wq.io>
Leonardo Balter <leonardo.balter@gmail.com> Leonardo Balter <leonardo.balter@gmail.com>
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
Daniel Husar <dano.husar@gmail.com>
Philip Jägenstedt <philip@foolip.org>
John Hoven <hovenj@gmail.com>
Roman Reiß <me@silverwind.io> Roman Reiß <me@silverwind.io>
Benjy Cui <benjytrys@gmail.com> Benjy Cui <benjytrys@gmail.com>
Rodrigo Rosenfeld Rosas <rr.rosas@gmail.com>
John Hoven <hovenj@gmail.com>
Philip Jägenstedt <philip@foolip.org>
Christian Kosmowski <ksmwsk@gmail.com> Christian Kosmowski <ksmwsk@gmail.com>
David Corbacho <davidcorbacho@gmail.com>
Liang Peng <poppinlp@gmail.com> Liang Peng <poppinlp@gmail.com>
TJ VanToll <tj.vantoll@gmail.com> TJ VanToll <tj.vantoll@gmail.com>
Senya Pugach <upisfree@outlook.com>
Aurelio De Rosa <aurelioderosa@gmail.com> Aurelio De Rosa <aurelioderosa@gmail.com>
Senya Pugach <upisfree@outlook.com>
Dan Hart <danhart@notonthehighstreet.com>
Nazar Mokrynskyi <nazar@mokrynskyi.com> Nazar Mokrynskyi <nazar@mokrynskyi.com>
Benjamin Tan <demoneaux@gmail.com>
Amit Merchant <bullredeyes@gmail.com> Amit Merchant <bullredeyes@gmail.com>
Jason Bedard <jason+github@jbedard.ca> Jason Bedard <jason+github@jbedard.ca>
Arthur Verschaeve <contact@arthurverschaeve.be>
Dan Hart <danhart@notonthehighstreet.com>
Bin Xin <rhyzix@gmail.com>
David Corbacho <davidcorbacho@gmail.com>
Veaceslav Grimalschi <grimalschi@yandex.ru> Veaceslav Grimalschi <grimalschi@yandex.ru>
Daniel Husar <dano.husar@gmail.com> Richard McDaniel <rm0026@uah.edu>
Frederic Hemberger <mail@frederic-hemberger.de> Arthur Verschaeve <contact@arthurverschaeve.be>
Ben Toews <mastahyeti@gmail.com>
Aditya Raghavan <araghavan3@gmail.com>
Victor Homyakov <vkhomyackov@gmail.com>
Shivaji Varma <contact@shivajivarma.com> Shivaji Varma <contact@shivajivarma.com>
Ben Toews <mastahyeti@gmail.com>
Bin Xin <rhyzix@gmail.com>
Neftaly Hernandez <neftaly.hernandez@gmail.com>
T.J. Crowder <tj.crowder@farsightsoftware.com>
Nicolas HENRY <icewil@gmail.com> Nicolas HENRY <icewil@gmail.com>
Frederic Hemberger <mail@frederic-hemberger.de>
Victor Homyakov <vkhomyackov@gmail.com>
Aditya Raghavan <araghavan3@gmail.com>
Anne-Gaelle Colom <coloma@westminster.ac.uk> Anne-Gaelle Colom <coloma@westminster.ac.uk>
George Mauer <gmauer@gmail.com>
Leonardo Braga <leonardo.braga@gmail.com> Leonardo Braga <leonardo.braga@gmail.com>
George Mauer <gmauer@gmail.com>
Stephen Edgar <stephen@netweb.com.au> Stephen Edgar <stephen@netweb.com.au>
Thomas Tortorini <thomastortorini@gmail.com> Thomas Tortorini <thomastortorini@gmail.com>
Winston Howes <winstonhowes@gmail.com> Jörn Wagner <joern.wagner@explicatis.com>
Jon Hester <jon.d.hester@gmail.com> Jon Hester <jon.d.hester@gmail.com>
Colin Frick <colin@bash.li>
Winston Howes <winstonhowes@gmail.com>
Alexander O'Mara <me@alexomara.com> Alexander O'Mara <me@alexomara.com>
Bastian Buchholz <buchholz.bastian@googlemail.com>
Arthur Stolyar <nekr.fabula@gmail.com>
Calvin Metcalf <calvin.metcalf@gmail.com>
Mu Haibao <mhbseal@163.com>
Richard McDaniel <rm0026@uah.edu>
Chris Rebert <github@rebertia.com> Chris Rebert <github@rebertia.com>
Bastian Buchholz <buchholz.bastian@googlemail.com>
Mu Haibao <mhbseal@163.com>
Calvin Metcalf <calvin.metcalf@gmail.com>
Arthur Stolyar <nekr.fabula@gmail.com>
Gabriel Schulhof <gabriel.schulhof@intel.com> Gabriel Schulhof <gabriel.schulhof@intel.com>
Gilad Peleg <giladp007@gmail.com> Gilad Peleg <giladp007@gmail.com>
Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
Kevin Kirsche <Kev.Kirsche+GitHub@gmail.com>
Martin Naumann <martin@geekonaut.de> Martin Naumann <martin@geekonaut.de>
Yongwoo Jeon <yongwoo.jeon@navercorp.com>
John-David Dalton <john.david.dalton@gmail.com>
Marek Lewandowski <m.lewandowski@cksource.com> Marek Lewandowski <m.lewandowski@cksource.com>
Bruno Pérel <brunoperel@gmail.com> Bruno Pérel <brunoperel@gmail.com>
Reed Loden <reed@reedloden.com>
Daniel Nill <daniellnill@gmail.com> Daniel Nill <daniellnill@gmail.com>
Yongwoo Jeon <yongwoo.jeon@navercorp.com> Reed Loden <reed@reedloden.com>
Sean Henderson <seanh.za@gmail.com> Sean Henderson <seanh.za@gmail.com>
Gary Ye <garysye@gmail.com>
Richard Kraaijenhagen <stdin+git@riichard.com> Richard Kraaijenhagen <stdin+git@riichard.com>
Connor Atherton <c.liam.atherton@gmail.com> Connor Atherton <c.liam.atherton@gmail.com>
Gary Ye <garysye@gmail.com>
Christian Grete <webmaster@christiangrete.com> Christian Grete <webmaster@christiangrete.com>
Tom von Clef <thomas.vonclef@gmail.com>
Liza Ramo <liza.h.ramo@gmail.com> Liza Ramo <liza.h.ramo@gmail.com>
Julian Alexander Murillo <julian.alexander.murillo@gmail.com>
Joelle Fleurantin <joasqueeniebee@gmail.com> Joelle Fleurantin <joasqueeniebee@gmail.com>
Jae Sung Park <alberto.park@gmail.com> Steve Mao <maochenyan@gmail.com>
Jun Sun <klsforever@gmail.com>
Josh Soref <apache@soref.com>
Henry Wong <henryw4k@gmail.com>
Jon Dufresne <jon.dufresne@gmail.com> Jon Dufresne <jon.dufresne@gmail.com>
Jae Sung Park <alberto.park@gmail.com>
Josh Soref <apache@soref.com>
Saptak Sengupta <saptak013@gmail.com>
Henry Wong <henryw4k@gmail.com>
Jun Sun <klsforever@gmail.com>
Martijn W. van der Lee <martijn@vanderlee.com> Martijn W. van der Lee <martijn@vanderlee.com>
Devin Wilson <dwilson6.github@gmail.com> Devin Wilson <dwilson6.github@gmail.com>
Steve Mao <maochenyan@gmail.com> Damian Senn <jquery@topaxi.codes>
Zack Hall <zackhall@outlook.com> Zack Hall <zackhall@outlook.com>
Bernhard M. Wiedemann <jquerybmw@lsmod.de>
Todor Prikumov <tono_pr@abv.bg>
Jha Naman <createnaman@gmail.com>
William Robinet <william.robinet@conostix.com>
Alexander Lisianoi <all3fox@gmail.com>
Vitaliy Terziev <vitaliyterziev@gmail.com> Vitaliy Terziev <vitaliyterziev@gmail.com>
Todor Prikumov <tono_pr@abv.bg>
Bernhard M. Wiedemann <jquerybmw@lsmod.de>
Jha Naman <createnaman@gmail.com>
Alexander Lisianoi <all3fox@gmail.com>
William Robinet <william.robinet@conostix.com>
Joe Trumbull <trumbull.j@gmail.com> Joe Trumbull <trumbull.j@gmail.com>
Alexander K <xpyro@ya.ru> Alexander K <xpyro@ya.ru>
Damian Senn <jquery@topaxi.codes>
Ralin Chimev <ralin.chimev@gmail.com> Ralin Chimev <ralin.chimev@gmail.com>
Felipe Sateler <fsateler@gmail.com> Felipe Sateler <fsateler@gmail.com>
Christophe Tafani-Dereeper <christophetd@hotmail.fr> Christophe Tafani-Dereeper <christophetd@hotmail.fr>
@ -295,31 +321,36 @@ Manoj Kumar <nithmanoj@gmail.com>
David Broder-Rodgers <broder93@gmail.com> David Broder-Rodgers <broder93@gmail.com>
Alex Louden <alex@louden.com> Alex Louden <alex@louden.com>
Alex Padilla <alexonezero@outlook.com> Alex Padilla <alexonezero@outlook.com>
南漂一卒 <shiy007@qq.com>
karan-96 <karanbatra96@gmail.com> karan-96 <karanbatra96@gmail.com>
南漂一卒 <shiy007@qq.com>
Erik Lax <erik@datahack.se>
Boom Lee <teabyii@gmail.com> Boom Lee <teabyii@gmail.com>
Andreas Solleder <asol@num42.de> Andreas Solleder <asol@num42.de>
CDAGaming <cstack2011@yahoo.com>
Pierre Spring <pierre@nelm.io> Pierre Spring <pierre@nelm.io>
Shashanka Nataraj <shashankan.10@gmail.com> Shashanka Nataraj <shashankan.10@gmail.com>
Erik Lax <erik@datahack.se> CDAGaming <cstack2011@yahoo.com>
Matan Kotler-Berkowitz <205matan@gmail.com> Matan Kotler-Berkowitz <205matan@gmail.com>
Jordan Beland <jordan.beland@gmail.com> Jordan Beland <jordan.beland@gmail.com>
Henry Zhu <hi@henryzoo.com> Henry Zhu <hi@henryzoo.com>
Saptak Sengupta <saptak013@gmail.com>
Nilton Cesar <niltoncms@gmail.com> Nilton Cesar <niltoncms@gmail.com>
basil.belokon <basil.belokon@gmail.com> basil.belokon <basil.belokon@gmail.com>
Andrey Meshkov <ay.meshkov@gmail.com>
tmybr11 <tomas.perone@gmail.com> tmybr11 <tomas.perone@gmail.com>
Luis Emilio Velasco Sanchez <emibloque@gmail.com> Luis Emilio Velasco Sanchez <emibloque@gmail.com>
Ed S <ejsanders@gmail.com> Ed S <ejsanders@gmail.com>
Bert Zhang <enbo@users.noreply.github.com> Bert Zhang <enbo@users.noreply.github.com>
Sébastien Règne <regseb@users.noreply.github.com>
wartmanm <3869625+wartmanm@users.noreply.github.com>
Siddharth Dungarwal <sd5869@gmail.com>
abnud1 <ahmad13932013@hotmail.com>
Andrei Fangli <andrei_fangli@outlook.com> Andrei Fangli <andrei_fangli@outlook.com>
Marja Hölttä <marja.holtta@gmail.com> Marja Hölttä <marja.holtta@gmail.com>
abnud1 <ahmad13932013@hotmail.com>
buddh4 <mail@jharrer.de> buddh4 <mail@jharrer.de>
Pat O'Callaghan <patocallaghan@gmail.com> Hoang <dangkyokhoang@gmail.com>
Ahmed.S.ElAfifi <ahmed.s.elafifi@gmail.com>
Wonseop Kim <wonseop.kim@samsung.com> Wonseop Kim <wonseop.kim@samsung.com>
Pat O'Callaghan <patocallaghan@gmail.com>
JuanMa Ruiz <ruizjuanma@gmail.com>
Ahmed.S.ElAfifi <ahmed.s.elafifi@gmail.com>
Christian Oliff <christianoliff@pm.me> Christian Oliff <christianoliff@pm.me>
Christian Wenz <christian@wenz.org> Christian Wenz <christian@wenz.org>
Sean Robinson <sean.robinson@scottsdalecc.edu> Sean Robinson <sean.robinson@scottsdalecc.edu>

View File

@ -61,8 +61,7 @@ module.exports = function( grunt ) {
all: { all: {
dest: "dist/jquery.js", dest: "dist/jquery.js",
minimum: [ minimum: [
"core", "core"
"selector"
], ],
// Exclude specified modules if the module matching the key is removed // Exclude specified modules if the module matching the key is removed
@ -76,7 +75,7 @@ module.exports = function( grunt ) {
include: [ "core/ready-no-deferred" ] include: [ "core/ready-no-deferred" ]
}, },
event: [ "deprecated/ajax-event-alias", "deprecated/event" ], event: [ "deprecated/ajax-event-alias", "deprecated/event" ],
sizzle: [ "css/hiddenVisibleSelectors", "effects/animatedSelector" ] selector: [ "css/hiddenVisibleSelectors", "effects/animatedSelector" ]
} }
} }
}, },
@ -86,9 +85,6 @@ module.exports = function( grunt ) {
destPrefix: "external" destPrefix: "external"
}, },
files: { files: {
"sizzle/dist": "sizzle/dist",
"sizzle/LICENSE.txt": "sizzle/LICENSE.txt",
"core-js/core-js.js": "core-js/client/core.min.js", "core-js/core-js.js": "core-js/client/core.min.js",
"core-js/LICENSE.txt": "core-js/LICENSE", "core-js/LICENSE.txt": "core-js/LICENSE",

View File

@ -106,11 +106,13 @@ Some example modules that can be excluded are:
- **exports/global**: Exclude the attachment of global jQuery variables ($ and jQuery) to the window. - **exports/global**: Exclude the attachment of global jQuery variables ($ and jQuery) to the window.
- **exports/amd**: Exclude the AMD definition. - **exports/amd**: Exclude the AMD definition.
As a special case, you may also replace Sizzle by using a special flag `grunt custom:-sizzle`. As a special case, you may also replace the full jQuery `selector` module by using a special flag `grunt custom:-selector`.
- **sizzle**: The Sizzle selector engine. When this module is excluded, it is replaced by a rudimentary selector engine based on the browser's `querySelectorAll` method that does not support jQuery selector extensions or enhanced semantics. See the [selector-native.js](https://github.com/jquery/jquery/blob/main/src/selector-native.js) file for details. - **selector**: The full jQuery selector engine. When this module is excluded, it is replaced by a rudimentary selector engine based on the browser's `querySelectorAll` method that does not support jQuery selector extensions or enhanced semantics. See the [selector-native.js](https://github.com/jquery/jquery/blob/main/src/selector-native.js) file for details.
*Note*: Excluding Sizzle will also exclude all jQuery selector extensions (such as `effects/animatedSelector` and `css/hiddenVisibleSelectors`). For backwards compatibility purposes, the name `sizzle` is recognized as the alias for `selector`.
*Note*: Excluding the full `selector` module will also exclude all jQuery selector extensions (such as `effects/animatedSelector` and `css/hiddenVisibleSelectors`).
The build process shows a message for each dependent module it excludes or includes. The build process shows a message for each dependent module it excludes or includes.
@ -167,7 +169,7 @@ There is also a special alias to generate a build with the same configuration as
grunt custom:slim grunt custom:slim
``` ```
For questions or requests regarding custom builds, please start a thread on the [Developing jQuery Core](https://forum.jquery.com/developing-jquery-core) section of the forum. Due to the combinatorics and custom nature of these builds, they are not regularly tested in jQuery's unit test process. The non-Sizzle selector engine currently does not pass unit tests because it is missing too much essential functionality. For questions or requests regarding custom builds, please start a thread on the [Developing jQuery Core](https://forum.jquery.com/developing-jquery-core) section of the forum. Due to the combinatorics and custom nature of these builds, they are not regularly tested in jQuery's unit test process.
Running the Unit Tests Running the Unit Tests
-------------------------------------- --------------------------------------

View File

@ -18,7 +18,6 @@ module.exports = function( Release ) {
]; ];
const cdn = require( "./release/cdn" ); const cdn = require( "./release/cdn" );
const dist = require( "./release/dist" ); const dist = require( "./release/dist" );
const ensureSizzle = require( "./release/ensure-sizzle" );
const npmTags = Release.npmTags; const npmTags = Release.npmTags;
@ -26,14 +25,6 @@ module.exports = function( Release ) {
npmPublish: true, npmPublish: true,
issueTracker: "github", issueTracker: "github",
/**
* Ensure the repo is in a proper state before release
* @param {Function} callback
*/
checkRepoState: function( callback ) {
ensureSizzle( Release, callback );
},
/** /**
* Set the version in the src folder for distributing AMD * Set the version in the src folder for distributing AMD
*/ */

View File

@ -69,7 +69,6 @@ module.exports = function( Release, files, complete ) {
// Copy dist files // Copy dist files
const distFolder = `${ Release.dir.dist }/dist`; const distFolder = `${ Release.dir.dist }/dist`;
const externalFolder = `${ Release.dir.dist }/external`;
const readme = await fs.readFile( const readme = await fs.readFile(
`${ Release.dir.repo }/build/fixtures/README.md`, "utf8" ); `${ Release.dir.repo }/build/fixtures/README.md`, "utf8" );
const rmIgnore = [ ...files, "node_modules" ] const rmIgnore = [ ...files, "node_modules" ]
@ -93,10 +92,6 @@ module.exports = function( Release, files, complete ) {
shell.cp( "-f", `${ Release.dir.repo }/${ file }`, distFolder ); shell.cp( "-f", `${ Release.dir.repo }/${ file }`, distFolder );
} ); } );
// Copy Sizzle
shell.mkdir( "-p", externalFolder );
shell.cp( "-rf", `${ Release.dir.repo }/external/sizzle`, externalFolder );
// Copy other files // Copy other files
extras.forEach( function( file ) { extras.forEach( function( file ) {
shell.cp( "-rf", `${ Release.dir.repo }/${ file }`, Release.dir.dist ); shell.cp( "-rf", `${ Release.dir.repo }/${ file }`, Release.dir.dist );

View File

@ -1,35 +0,0 @@
"use strict";
var fs = require( "fs" ),
chalk = require( "chalk" ),
sizzleLoc = __dirname + "/../../external/sizzle/dist/sizzle.js",
rversion = /Engine v(\d+\.\d+\.\d+(?:-[-\.\d\w]+)?)/;
/**
* Ensure the /src folder has the latest tag of Sizzle
* @param {Object} Release
* @param {Function} callback
*/
function ensureSizzle( Release, callback ) {
console.log();
console.log( "Checking Sizzle version..." );
var match = rversion.exec( fs.readFileSync( sizzleLoc, "utf8" ) ),
version = match ? match[ 1 ] : "Not Found",
latest = Release.exec( {
command: "npm info sizzle version",
silent: true
} );
if ( version !== latest ) {
console.log(
"The Sizzle version in the src folder (" + chalk.red( version ) +
") is not the latest tag (" + chalk.green( latest ) + ")."
);
Release.confirm( callback );
} else {
console.log( "Sizzle is latest (" + chalk.green( latest ) + ")" );
callback();
}
}
module.exports = ensureSizzle;

View File

@ -72,13 +72,6 @@ module.exports = function( grunt ) {
) )
.replace( rdefineEnd, "" ); .replace( rdefineEnd, "" );
// Sizzle treatment
} else if ( /\/sizzle$/.test( name ) ) {
contents = "var Sizzle =\n" + contents
// Remove EXPOSE lines from Sizzle
.replace( /\/\/\s*EXPOSE[\w\W]*\/\/\s*EXPOSE/, "return Sizzle;" );
} else { } else {
contents = contents contents = contents
@ -101,7 +94,7 @@ module.exports = function( grunt ) {
// Remove empty definitions // Remove empty definitions
contents = contents contents = contents
.replace( /define\(\[[^\]]*\]\)[\W\n]+$/, "" ); .replace( /define\(\s*\[[^\]]*\]\s*\)[\W\n]+$/, "" );
} }
// AMD Name // AMD Name
@ -178,14 +171,19 @@ module.exports = function( grunt ) {
* Adds the specified module to the excluded or included list, depending on the flag * Adds the specified module to the excluded or included list, depending on the flag
* @param {String} flag A module path relative to * @param {String} flag A module path relative to
* the src directory starting with + or - to indicate * the src directory starting with + or - to indicate
* whether it should included or excluded * whether it should be included or excluded
*/ */
excluder = function( flag ) { excluder = function( flag ) {
var additional, var additional,
m = /^(\+|\-|)([\w\/-]+)$/.exec( flag ), m = /^(\+|-|)([\w\/-]+)$/.exec( flag ),
exclude = m[ 1 ] === "-", exclude = m[ 1 ] === "-",
module = m[ 2 ]; module = m[ 2 ];
// Recognize the legacy `sizzle` alias
if ( module === "sizzle" ) {
module = "selector";
}
if ( exclude ) { if ( exclude ) {
// Can't exclude certain modules // Can't exclude certain modules
@ -200,7 +198,16 @@ module.exports = function( grunt ) {
// These are the removable dependencies // These are the removable dependencies
// It's fine if the directory is not there // It's fine if the directory is not there
try { try {
excludeList( fs.readdirSync( srcFolder + module ), module );
// `selector` is a special case as we don't just remove
// the module, but we replace it with `selector-native`
// which re-uses parts of the `src/selector` folder.
if ( module !== "selector" ) {
excludeList(
fs.readdirSync( `${ srcFolder }/${ module }` ),
module
);
}
} catch ( e ) { } catch ( e ) {
grunt.verbose.writeln( e ); grunt.verbose.writeln( e );
} }
@ -218,11 +225,6 @@ module.exports = function( grunt ) {
} }
} else { } else {
grunt.log.error( "Module \"" + module + "\" is a minimum requirement." ); grunt.log.error( "Module \"" + module + "\" is a minimum requirement." );
if ( module === "selector" ) {
grunt.log.error(
"If you meant to replace Sizzle, use -sizzle instead."
);
}
} }
} else { } else {
grunt.log.writeln( flag ); grunt.log.writeln( flag );
@ -259,17 +261,16 @@ module.exports = function( grunt ) {
excluder( flag ); excluder( flag );
} }
// Handle Sizzle exclusion // Handle full selector module exclusion.
// Replace with selector-native // Replace with selector-native.
if ( ( index = excluded.indexOf( "sizzle" ) ) > -1 ) { if ( excluded.indexOf( "selector" ) > -1 ) {
config.rawText.selector = "define(['./selector-native']);"; config.rawText.selector = "define([ \"./selector-native\" ]);";
excluded.splice( index, 1 );
} }
// Replace exports/global with a noop noConflict // Replace exports/global with a noop noConflict
if ( ( index = excluded.indexOf( "exports/global" ) ) > -1 ) { if ( ( index = excluded.indexOf( "exports/global" ) ) > -1 ) {
config.rawText[ "exports/global" ] = "define(['../core']," + config.rawText[ "exports/global" ] = "define( [\n\t\"../core\"\n], " +
"function( jQuery ) {\njQuery.noConflict = function() {};\n});"; "function( jQuery ) {\n\tjQuery.noConflict = function() {};\n} );";
excluded.splice( index, 1 ); excluded.splice( index, 1 );
} }
@ -311,9 +312,11 @@ module.exports = function( grunt ) {
if ( !optIn ) { if ( !optIn ) {
// Overwrite the default inclusions with the explicit ones provided // Overwrite the default inclusions with the explicit ones provided
config.rawText.jquery = "define([" + config.rawText.jquery = "define( [\n" +
( included.length ? included.join( "," ) : "" ) + ( included.length ?
"]);"; included.map( module => "\t\"./" + module + "\"" ).join( ",\n" ) :
"" ) +
"\n] );";
} }
// Trace dependencies and concatenate files // Trace dependencies and concatenate files

15
dist/.eslintrc.json vendored
View File

@ -14,20 +14,7 @@
"rules": { "rules": {
// That is okay for the built version // That is okay for the built version
"no-multiple-empty-lines": "off", "no-multiple-empty-lines": "off",
"one-var": "off", "one-var": "off"
// Sizzle is not compatible with jQuery code style
"no-nested-ternary": "off",
"no-unused-expressions": "off",
"no-unused-vars": "off",
"lines-around-comment": "off",
"space-in-parens": "off",
"camelcase": "off",
"computed-property-spacing": "off",
"max-len": "off",
"dot-notation": "off",
"semi-spacing": "off",
"brace-style": "off"
} }
} }
] ]

View File

@ -1,36 +0,0 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/sizzle
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -61,7 +61,6 @@
"raw-body": "2.3.3", "raw-body": "2.3.3",
"requirejs": "2.3.6", "requirejs": "2.3.6",
"sinon": "2.3.7", "sinon": "2.3.7",
"sizzle": "2.3.8",
"strip-json-comments": "2.0.1", "strip-json-comments": "2.0.1",
"testswarm": "1.1.2", "testswarm": "1.1.2",
"uglify-js": "3.4.7" "uglify-js": "3.4.7"
@ -73,9 +72,9 @@
"test:browser": "grunt && grunt karma:main", "test:browser": "grunt && grunt karma:main",
"test:amd": "grunt && grunt karma:amd", "test:amd": "grunt && grunt karma:amd",
"test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main", "test:no-deprecated": "grunt test:prepare && grunt custom:-deprecated && grunt karma:main",
"test:no-sizzle": "grunt test:prepare && grunt custom:-sizzle && grunt karma:main", "test:selector-native": "grunt test:prepare && grunt custom:-selector && grunt karma:main",
"test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main", "test:slim": "grunt test:prepare && grunt custom:slim && grunt karma:main",
"test": "npm run test:slim && npm run test:no-deprecated && npm run test:no-sizzle && grunt && grunt test:slow && grunt karma:main && grunt karma:amd", "test": "npm run test:slim && npm run test:no-deprecated && npm run test:selector-native && grunt && grunt test:slow && grunt karma:main && grunt karma:amd",
"jenkins": "npm run test:browserless" "jenkins": "npm run test:browserless"
}, },
"commitplease": { "commitplease": {

View File

@ -33,6 +33,13 @@
"globals": { "globals": {
"jQuery": false "jQuery": false
} }
},
{
"files": "selector.js",
"rules": {
"indent": "off"
}
} }
] ]
} }

View File

@ -25,8 +25,9 @@ define( [
"use strict"; "use strict";
var var version = "@VERSION",
version = "@VERSION",
rhtmlSuffix = /HTML$/i,
// Define a local copy of jQuery // Define a local copy of jQuery
jQuery = function( selector, context ) { jQuery = function( selector, context ) {
@ -272,6 +273,33 @@ jQuery.extend( {
return obj; return obj;
}, },
// Retrieve the text value of an array of DOM nodes
text: function( elem ) {
var node,
ret = "",
i = 0,
nodeType = elem.nodeType;
if ( !nodeType ) {
// If no nodeType, this is expected to be an array
while ( ( node = elem[ i++ ] ) ) {
// Do not traverse comment nodes
ret += jQuery.text( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
return elem.textContent;
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
// Do not include comment or processing instruction nodes
return ret;
},
// results is for internal usage only // results is for internal usage only
makeArray: function( arr, results ) { makeArray: function( arr, results ) {
var ret = results || []; var ret = results || [];
@ -294,6 +322,15 @@ jQuery.extend( {
return arr == null ? -1 : indexOf.call( arr, elem, i ); return arr == null ? -1 : indexOf.call( arr, elem, i );
}, },
isXMLDoc: function( elem ) {
var namespace = elem && elem.namespaceURI,
docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Assume HTML when documentElement doesn't yet exist, such as inside
// document fragments.
return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
},
// Support: Android <=4.0 only, PhantomJS 1 only // Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit // push.apply(_, arraylike) throws on ancient WebKit
merge: function( first, second ) { merge: function( first, second ) {

View File

@ -1,7 +1,7 @@
define( [ define( [
"../core", "../core",
"../var/documentElement", "../var/documentElement",
"../selector" // jQuery.contains "../selector/contains" // jQuery.contains
], function( jQuery, documentElement ) { ], function( jQuery, documentElement ) {
"use strict"; "use strict";

7
src/core/var/rhtml.js Normal file
View File

@ -0,0 +1,7 @@
define( function() {
"use strict";
return ( /HTML$/i );
} );

View File

@ -248,7 +248,8 @@ jQuery.extend( {
if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
!jQuery.isXMLDoc( elem ) ) { !jQuery.isXMLDoc( elem ) ) {
// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 // We eschew jQuery#find here for performance reasons:
// https://jsperf.com/getall-vs-sizzle/2
destElements = getAll( clone ); destElements = getAll( clone );
srcElements = getAll( elem ); srcElements = getAll( elem );

View File

@ -3,63 +3,46 @@ define( [
"./var/document", "./var/document",
"./var/documentElement", "./var/documentElement",
"./var/hasOwn", "./var/hasOwn",
"./var/indexOf" "./var/indexOf",
// The following utils are attached directly to the jQuery object.
"./selector/contains",
"./selector/escapeSelector"
], function( jQuery, document, documentElement, hasOwn, indexOf ) { ], function( jQuery, document, documentElement, hasOwn, indexOf ) {
"use strict"; "use strict";
/* /*
* Optional (non-Sizzle) selector module for custom builds. * Optional limited selector module for custom builds.
* *
* Note that this DOES NOT SUPPORT many documented jQuery * Note that this DOES NOT SUPPORT many documented jQuery
* features in exchange for its smaller size: * features in exchange for its smaller size:
* *
* Attribute not equal selector * * Attribute not equal selector (!=)
* Positional selectors (:first; :eq(n); :odd; etc.) * * Positional selectors (:first; :eq(n); :odd; etc.)
* Type selectors (:input; :checkbox; :button; etc.) * * Type selectors (:input; :checkbox; :button; etc.)
* State-based selectors (:animated; :visible; :hidden; etc.) * * State-based selectors (:animated; :visible; :hidden; etc.)
* :has(selector) * * :has(selector)
* :not(complex selector) * * :not(complex selector)
* custom selectors via Sizzle extensions * * custom selectors via jQuery extensions
* Leading combinators (e.g., $collection.find("> *")) * * Leading combinators (e.g., $collection.find("> *"))
* Reliable functionality on XML fragments * * Reliable functionality on XML fragments
* Requiring all parts of a selector to match elements under context * * Requiring all parts of a selector to match elements under context
* (e.g., $div.find("div > *") now matches children of $div) * (e.g., $div.find("div > *") now matches children of $div)
* Matching against non-elements * * Matching against non-elements
* Reliable sorting of disconnected nodes * * Reliable sorting of disconnected nodes
* querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) * * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit)
* *
* If any of these are unacceptable tradeoffs, either use Sizzle or * If any of these are unacceptable tradeoffs, either use the full
* customize this stub for the project's specific needs. * selector engine or customize this stub for the project's specific
* needs.
*/ */
var hasDuplicate, sortInput, var hasDuplicate, sortInput,
rhtmlSuffix = /HTML$/i,
sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando, sortStable = jQuery.expando.split( "" ).sort( sortOrder ).join( "" ) === jQuery.expando,
matches = documentElement.matches || matches = documentElement.matches ||
documentElement.webkitMatchesSelector || documentElement.webkitMatchesSelector ||
documentElement.mozMatchesSelector || documentElement.msMatchesSelector;
documentElement.oMatchesSelector ||
documentElement.msMatchesSelector,
// CSS string/identifier serialization
// https://drafts.csswg.org/cssom/#common-serializing-idioms
rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
fcssescape = function( ch, asCodePoint ) {
if ( asCodePoint ) {
// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
if ( ch === "\0" ) {
return "\uFFFD";
}
// Control characters and (dependent upon position) numbers get escaped as code points
return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
}
// Other potentially-special ASCII characters get backslash-escaped
return "\\" + ch;
};
function sortOrder( a, b ) { function sortOrder( a, b ) {
@ -132,14 +115,16 @@ function uniqueSort( results ) {
return results; return results;
} }
function escape( sel ) {
return ( sel + "" ).replace( rcssescape, fcssescape );
}
jQuery.extend( { jQuery.extend( {
// This method cannot be shared with the main selector module
// as it does in 4.x because of an edge case quirk of putting
// disconnected elements in the preferred document before other
// elements in the full selector module. This will be a minor
// breaking change in 4.0.0.
uniqueSort: uniqueSort, uniqueSort: uniqueSort,
unique: uniqueSort, unique: uniqueSort,
escapeSelector: escape,
find: function( selector, context, results, seed ) { find: function( selector, context, results, seed ) {
var elem, nodeType, var elem, nodeType,
i = 0; i = 0;
@ -147,13 +132,13 @@ jQuery.extend( {
results = results || []; results = results || [];
context = context || document; context = context || document;
// Same basic safeguard as Sizzle // Same basic safeguard as in the full selector module
if ( !selector || typeof selector !== "string" ) { if ( !selector || typeof selector !== "string" ) {
return results; return results;
} }
// Early return if context is not an element or document // Early return if context is not an element, document or document fragment
if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 ) { if ( ( nodeType = context.nodeType ) !== 1 && nodeType !== 9 && nodeType !== 11 ) {
return []; return [];
} }
@ -169,46 +154,6 @@ jQuery.extend( {
return results; return results;
}, },
text: function( elem ) {
var node,
ret = "",
i = 0,
nodeType = elem.nodeType;
if ( !nodeType ) {
// If no nodeType, this is expected to be an array
while ( ( node = elem[ i++ ] ) ) {
// Do not traverse comment nodes
ret += jQuery.text( node );
}
} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
// Use textContent for elements
return elem.textContent;
} else if ( nodeType === 3 || nodeType === 4 ) {
return elem.nodeValue;
}
// Do not include comment or processing instruction nodes
return ret;
},
contains: function( a, b ) {
var bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && a.contains( bup ) );
},
isXMLDoc: function( elem ) {
var namespace = elem.namespaceURI,
documentElement = ( elem.ownerDocument || elem ).documentElement;
// Assume HTML when documentElement doesn't yet exist, such as inside
// document fragments.
return !rhtmlSuffix.test( namespace ||
documentElement && documentElement.nodeName ||
"HTML" );
},
expr: { expr: {
attrHandle: {}, attrHandle: {},
match: { match: {

View File

@ -1,19 +0,0 @@
define( [
"./core",
"../external/sizzle/dist/sizzle"
], function( jQuery, Sizzle ) {
"use strict";
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
// Deprecated
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;
} );

File diff suppressed because it is too large Load Diff

21
src/selector/contains.js Normal file
View File

@ -0,0 +1,21 @@
define( [
"../core"
], function( jQuery ) {
"use strict";
// Note: an element does not contain itself
jQuery.contains = function( a, b ) {
var bup = b && b.parentNode;
return a === bup || !!( bup && bup.nodeType === 1 && (
// Support: IE 9 - 11+
// IE doesn't have `contains` on SVG.
a.contains ?
a.contains( bup ) :
a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
) );
};
} );

View File

@ -0,0 +1,31 @@
define( [
"../core"
], function( jQuery ) {
"use strict";
// CSS string/identifier serialization
// https://drafts.csswg.org/cssom/#common-serializing-idioms
var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
function fcssescape( ch, asCodePoint ) {
if ( asCodePoint ) {
// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
if ( ch === "\0" ) {
return "\uFFFD";
}
// Control characters and (dependent upon position) numbers get escaped as code points
return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
}
// Other potentially-special ASCII characters get backslash-escaped
return "\\" + ch;
}
jQuery.escapeSelector = function( sel ) {
return ( sel + "" ).replace( rcssescape, fcssescape );
};
} );

View File

@ -55,7 +55,7 @@ jQuery.fn.extend( {
if ( cur.nodeType < 11 && ( targets ? if ( cur.nodeType < 11 && ( targets ?
targets.index( cur ) > -1 : targets.index( cur ) > -1 :
// Don't pass non-elements to Sizzle // Don't pass non-elements to jQuery#find
cur.nodeType === 1 && cur.nodeType === 1 &&
jQuery.find.matchesSelector( cur, selectors ) ) ) { jQuery.find.matchesSelector( cur, selectors ) ) ) {

9
src/var/pop.js Normal file
View File

@ -0,0 +1,9 @@
define( [
"./arr"
], function( arr ) {
"use strict";
return arr.pop;
} );

9
src/var/sort.js Normal file
View File

@ -0,0 +1,9 @@
define( [
"./arr"
], function( arr ) {
"use strict";
return arr.sort;
} );

9
src/var/splice.js Normal file
View File

@ -0,0 +1,9 @@
define( [
"./arr"
], function( arr ) {
"use strict";
return arr.splice;
} );

View File

@ -2,9 +2,6 @@
* jQuery JavaScript Library v@VERSION * jQuery JavaScript Library v@VERSION
* https://jquery.com/ * https://jquery.com/
* *
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors * Copyright OpenJS Foundation and other contributors
* Released under the MIT license * Released under the MIT license
* https://jquery.org/license * https://jquery.org/license

View File

@ -18,6 +18,7 @@
"ajaxTest": false, "ajaxTest": false,
"testIframe": false, "testIframe": false,
"createDashboardXML": false, "createDashboardXML": false,
"createWithFriesXML": false,
"createXMLFragment": false, "createXMLFragment": false,
"includesModule": false, "includesModule": false,
"moduleTeardown": false, "moduleTeardown": false,

View File

@ -1,8 +1,8 @@
<p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p> <p id="firstp">See <a id="simon1" href="http://simon.incutio.com/archive/2003/03/25/#getElementsBySelector" rel="bookmark">this blog entry</a> for more information.</p>
<p id="ap"> <p id="ap">
Here are some links in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>, Here are some [links] in a normal paragraph: <a id="google" href="http://www.google.com/" title="Google!">Google</a>,
<a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>. <a id="groups" href="http://groups.google.com/" class="GROUPS">Google Groups (Link)</a>.
This link has <code><a href="http://smin" id="anchor1">class="blog"</a></code>: This link has <code id="code1"><a href="http://smin" id="anchor1">class="blog"</a></code>:
<a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a> <a href="http://diveintomark.org/" class="blog" hreflang="en" id="mark">diveintomark</a>
</p> </p>
@ -78,11 +78,11 @@
<param name="p2" value="x2" /> <param name="p2" value="x2" />
</object> </object>
<span id="台北Táiběi"></span> <span id="台北Táiběi"><span id="台北Táiběi-child"></span></span>
<span id="台北" lang="中文"></span> <span id="台北" lang="中文"></span>
<span id="utf8class1" class="台北Táiběi 台北"></span> <span id="utf8class1" class="台北Táiběi 台北">"'台北Táiběi"'</span>
<span id="utf8class2" class="台北"></span> <span id="utf8class2" class="台北"></span>
<span id="foo:bar" class="foo:bar"></span> <span id="foo:bar" class="foo:bar"><span id="foo_descendant"></span></span>
<span id="test.foo[5]bar" class="test.foo[5]bar"></span> <span id="test.foo[5]bar" class="test.foo[5]bar"></span>
<foo_bar id="foobar">test element</foo_bar> <foo_bar id="foobar">test element</foo_bar>
@ -116,6 +116,11 @@ Z</textarea>
<input type="radio" name="R1" value="2" /> <input type="radio" name="R1" value="2" />
<input type="text" name="My Name" value="me" /> <input type="text" name="My Name" value="me" />
<input type="reset" name="reset" value="NO" /> <input type="reset" name="reset" value="NO" />
<div class="empty-name-container">
<div id="empty-name-parent">
<input type="text" id="name-empty" name="" value="" />
</div>
</div>
<select name="S1"> <select name="S1">
<option value="abc">ABC</option> <option value="abc">ABC</option>
<option value="abc">ABC</option> <option value="abc">ABC</option>
@ -163,7 +168,26 @@ Z</textarea>
<div id="t6652"> <div id="t6652">
<div></div> <div></div>
</div> </div>
<div id="t12087">
<input type="hidden" id="el12087" data-comma="0,1"/>
</div>
<div id="no-clone-exception"><object><embed></embed></object></div> <div id="no-clone-exception"><object><embed></embed></object></div>
<div id="names-group">
<span id="name-is-example" name="example"></span>
<span id="name-is-div" name="div"></span>
</div>
<div id="id-name-tests">
<a id="tName1ID" name="tName1"><span></span></a>
<a id="tName2ID" name="tName2"><span></span></a>
<div id="tName1"><span id="tName1-span">C</span></div>
</div>
<div id="whitespace-lists">
<input id="t15233-single" data-15233="foo"/>
<input id="t15233-double" data-15233="foo bar"/>
<input id="t15233-double-tab" data-15233="foo bar"/>
<input id="t15233-double-nl" data-15233="foo&#xA;bar"/>
<input id="t15233-triple" data-15233="foo bar baz"/>
</div>
</div> </div>
<div id="tabindex-tests"> <div id="tabindex-tests">
@ -194,6 +218,53 @@ Z</textarea>
<span id="liveSpan2"><a href="#" id="liveLink2"></a></span> <span id="liveSpan2"><a href="#" id="liveLink2"></a></span>
</div> </div>
<form id="disabled-tests">
<fieldset id="disabled-fieldset" disabled="disabled">
<a id="disabled-fieldset-a" href="#"></a>
<input id="disabled-fieldset-input" name="disabled-fieldset-input" type="text" />
<textarea id="disabled-fieldset-textarea" name="disabled-fieldset-textarea" ></textarea>
<button id="disabled-fieldset-button" name="disabled-fieldset-button">Go</button>
<!-- exclude <select> because IE6 is bugged and fails
<select id="disabled-fieldset-select" name="disabled-fieldset-select"></select>
-->
<span id="disabled-fieldset-span">Neither enabled nor disabled</span>
</fieldset>
<fieldset id="enabled-fieldset">
<a id="disabled-a" href="#" disabled="disabled"></a>
<input id="disabled-input" name="disabled-input" type="text" disabled="disabled"/>
<textarea id="disabled-textarea" name="disabled-textarea" disabled="disabled"></textarea>
<button id="disabled-button" name="disabled-button" disabled="disabled">Go</button>
<select id="disabled-select" name="disabled-select" disabled="disabled">
<optgroup id="disabled-optgroup" label="and" disabled="disabled">
<option id="disabled-option" disabled="disabled">Black</option>
</optgroup>
</select>
<input id="enabled-input" name="enabled-input" type="text"/>
<textarea id="enabled-textarea" name="enabled-textarea"></textarea>
<button id="enabled-button" name="enabled-button">Go</button>
<select id="enabled-select" name="enabled-select">
<optgroup id="enabled-optgroup" label="and">
<option id="enabled-option">Gold</option>
</optgroup>
</select>
<span id="enabled-fieldset-span">Neither enabled nor disabled</span>
</fieldset>
<select id="disabled-select-inherit" name="disabled-select-inherit" disabled="disabled">
<optgroup id="disabled-optgroup-inherit" label="and" disabled="disabled">
<option id="disabled-optgroup-option">Black</option>
</optgroup>
<optgroup id="enabled-optgroup-inherit" label="and">
<option id="enabled-optgroup-option">Gold</option>
</optgroup>
</select>
<select id="enabled-select-inherit" name="enabled-select-inherit">
<optgroup id="en_disabled-optgroup-inherit" label="and" disabled="disabled">
<option id="en_disabled-optgroup-option">Black</option>
</optgroup>
<option id="enabled-select-option">Black</option>
</select>
</form>
<div id="siblingTest"> <div id="siblingTest">
<em id="siblingfirst">1</em> <em id="siblingfirst">1</em>
<em id="siblingnext">2</em> <em id="siblingnext">2</em>
@ -208,7 +279,7 @@ Z</textarea>
</div> </div>
<div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;"> <div id="fx-test-group" style="position: absolute; width: 1px; height: 1px; overflow: hidden;">
<div id="fx-queue" name="test"> <div id="fx-queue" name="test">
<div id="fadein" class='chain-test' name='div'>fadeIn<div>fadeIn</div></div> <div id="fadein" class='chain-test'>fadeIn<div>fadeIn</div></div>
<div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div> <div id="fadeout" class='chain-test chain-test-out'>fadeOut<div>fadeOut</div></div>
<div id="show" class='chain-test'>show<div>show</div></div> <div id="show" class='chain-test'>show<div>show</div></div>
@ -235,3 +306,4 @@ Z</textarea>
<div id="fx-tests"></div> <div id="fx-tests"></div>
<span id="display"></span> <span id="display"></span>
</div> </div>
<br id="last"/>

View File

@ -2,7 +2,7 @@
<html> <html>
<head> <head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8"> <meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>jQuery selector - sizzle cache</title> <title>jQuery selector - cache</title>
<script src="../../jquery.js"></script> <script src="../../jquery.js"></script>
<script src="../iframeTest.js"></script> <script src="../iframeTest.js"></script>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jQuery selector - cross-window uniqueSort</title>
<script src="../../jquery.js"></script>
<script src="../iframeTest.js"></script>
</head>
<body>
<script>
var doc = parent.document,
unframed = [ doc.getElementById( "qunit-fixture" ), doc.body, doc.documentElement ],
framed = jQuery.find( "*" );
startIframeTest(
jQuery.uniqueSort( unframed.concat( framed ) ),
framed.concat( unframed.slice(0).reverse() )
);
</script>
</body>
</html>

View File

@ -1,5 +1,7 @@
/* eslint no-multi-str: "off" */ /* eslint no-multi-str: "off" */
"use strict";
var FILEPATH = "/test/data/testinit.js", var FILEPATH = "/test/data/testinit.js",
activeScript = [].slice.call( document.getElementsByTagName( "script" ), -1 )[ 0 ], activeScript = [].slice.call( document.getElementsByTagName( "script" ), -1 )[ 0 ],
parentUrl = activeScript && activeScript.src ? parentUrl = activeScript && activeScript.src ?
@ -49,28 +51,22 @@ this.q = function() {
/** /**
* Asserts that a select matches the given IDs * Asserts that a select matches the given IDs
* @param {String} message - Assertion name * @param {String} message - Assertion name
* @param {String} selector - Sizzle selector * @param {String} selector - jQuery selector
* @param {String} expectedIds - Array of ids to construct what is expected * @param {String} expectedIds - Array of ids to construct what is expected
* @param {(String|Node)=document} context - Selector context * @param {(String|Node)=document} context - Selector context
* @example match("Check for something", "p", ["foo", "bar"]); * @example match("Check for something", "p", ["foo", "bar"]);
*/ */
function match( message, selector, expectedIds, context, assert ) { function match( message, selector, expectedIds, context, assert ) {
var f = jQuery( selector, context ).get(), var elems = jQuery( selector, context ).get();
s = "",
i = 0;
for ( ; i < f.length; i++ ) { assert.deepEqual( elems, q.apply( q, expectedIds ), message + " (" + selector + ")" );
s += ( s && "," ) + "\"" + f[ i ].id + "\"";
}
assert.deepEqual( f, q.apply( q, expectedIds ), message + " (" + selector + ")" );
} }
/** /**
* Asserts that a select matches the given IDs. * Asserts that a select matches the given IDs.
* The select is not bound by a context. * The select is not bound by a context.
* @param {String} message - Assertion name * @param {String} message - Assertion name
* @param {String} selector - Sizzle selector * @param {String} selector - jQuery selector
* @param {String} expectedIds - Array of ids to construct what is expected * @param {String} expectedIds - Array of ids to construct what is expected
* @example t("Check for something", "p", ["foo", "bar"]); * @example t("Check for something", "p", ["foo", "bar"]);
*/ */
@ -82,7 +78,7 @@ QUnit.assert.t = function( message, selector, expectedIds ) {
* Asserts that a select matches the given IDs. * Asserts that a select matches the given IDs.
* The select is performed within the `#qunit-fixture` context. * The select is performed within the `#qunit-fixture` context.
* @param {String} message - Assertion name * @param {String} message - Assertion name
* @param {String} selector - Sizzle selector * @param {String} selector - jQuery selector
* @param {String} expectedIds - Array of ids to construct what is expected * @param {String} expectedIds - Array of ids to construct what is expected
* @example selectInFixture("Check for something", "p", ["foo", "bar"]); * @example selectInFixture("Check for something", "p", ["foo", "bar"]);
*/ */
@ -106,6 +102,36 @@ this.createDashboardXML = function() {
return jQuery.parseXML( string ); return jQuery.parseXML( string );
}; };
this.createWithFriesXML = function() {
var string = "<?xml version='1.0' encoding='UTF-8'?> \
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' \
xmlns:xsd='http://www.w3.org/2001/XMLSchema' \
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> \
<soap:Body> \
<jsconf xmlns='http://www.example.com/ns1'> \
<response xmlns:ab='http://www.example.com/ns2'> \
<meta> \
<component id='seite1' class='component'> \
<properties xmlns:cd='http://www.example.com/ns3'> \
<property name='prop1'> \
<thing /> \
<value>1</value> \
</property> \
<property name='prop2'> \
<thing att='something' /> \
</property> \
<foo_bar>foo</foo_bar> \
</properties> \
</component> \
</meta> \
</response> \
</jsconf> \
</soap:Body> \
</soap:Envelope>";
return jQuery.parseXML( string );
};
this.createWithFriesXML = function() { this.createWithFriesXML = function() {
var string = "<?xml version='1.0' encoding='UTF-8'?> \ var string = "<?xml version='1.0' encoding='UTF-8'?> \
<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' \ <soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' \
@ -384,6 +410,18 @@ this.loadTests = function() {
// Get testSubproject from testrunner first // Get testSubproject from testrunner first
require( [ parentUrl + "test/data/testrunner.js" ], function() { require( [ parentUrl + "test/data/testrunner.js" ], function() {
// Says whether jQuery positional selector extensions are supported.
// A full selector engine is required to support them as they need to
// be evaluated left-to-right. Remove that property when support for
// positional selectors is dropped.
QUnit.jQuerySelectorsPos = includesModule( "selector" );
// Says whether jQuery selector extensions are supported. Change that
// to `false` if your custom jQuery versions relies more on native qSA.
// This doesn't include support for positional selectors (see above).
QUnit.jQuerySelectors = includesModule( "selector" );
var i = 0, var i = 0,
tests = [ tests = [
// A special module with basic tests, meant for // A special module with basic tests, meant for

View File

@ -1270,7 +1270,7 @@ QUnit.test( "addClass(Array)", function( assert ) {
} ); } );
QUnit.test( "addClass(Function) with incoming value", function( assert ) { QUnit.test( "addClass(Function) with incoming value", function( assert ) {
assert.expect( 52 ); assert.expect( 59 );
var pass, i, var pass, i,
div = jQuery( "#qunit-fixture div" ), div = jQuery( "#qunit-fixture div" ),
old = div.map( function() { old = div.map( function() {
@ -1278,10 +1278,8 @@ QUnit.test( "addClass(Function) with incoming value", function( assert ) {
} ); } );
div.addClass( function( i, val ) { div.addClass( function( i, val ) {
if ( this.id !== "_firebugConsole" ) { assert.equal( val, old[ i ], "Make sure the incoming value is correct." );
assert.equal( val, old[ i ], "Make sure the incoming value is correct." ); return "test";
return "test";
}
} ); } );
pass = true; pass = true;
@ -1347,17 +1345,15 @@ QUnit.test( "removeClass(Array) - simple", function( assert ) {
} ); } );
QUnit.test( "removeClass(Function) with incoming value", function( assert ) { QUnit.test( "removeClass(Function) with incoming value", function( assert ) {
assert.expect( 52 ); assert.expect( 59 );
var $divs = jQuery( "#qunit-fixture div" ).addClass( "test" ), old = $divs.map( function() { var $divs = jQuery( "#qunit-fixture div" ).addClass( "test" ), old = $divs.map( function() {
return jQuery( this ).attr( "class" ); return jQuery( this ).attr( "class" );
} ); } );
$divs.removeClass( function( i, val ) { $divs.removeClass( function( i, val ) {
if ( this.id !== "_firebugConsole" ) { assert.equal( val, old[ i ], "Make sure the incoming value is correct." );
assert.equal( val, old[ i ], "Make sure the incoming value is correct." ); return "test";
return "test";
}
} ); } );
assert.ok( !$divs.is( ".test" ), "Remove Class" ); assert.ok( !$divs.is( ".test" ), "Remove Class" );

View File

@ -66,7 +66,7 @@ QUnit.test( "jQuery()", function( assert ) {
assert.equal( jQuery( "" ).length, 0, "jQuery('') === jQuery([])" ); assert.equal( jQuery( "" ).length, 0, "jQuery('') === jQuery([])" );
assert.deepEqual( jQuery( obj ).get(), obj.get(), "jQuery(jQueryObj) == jQueryObj" ); assert.deepEqual( jQuery( obj ).get(), obj.get(), "jQuery(jQueryObj) == jQueryObj" );
// Invalid #id goes to Sizzle which will throw an error (gh-1682) // Invalid #id will throw an error (gh-1682)
try { try {
jQuery( "#" ); jQuery( "#" );
} catch ( e ) { } catch ( e ) {
@ -153,7 +153,7 @@ QUnit.test( "jQuery()", function( assert ) {
"Empty attributes object is not interpreted as a document (trac-8950)" ); "Empty attributes object is not interpreted as a document (trac-8950)" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "jQuery(selector, context)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "jQuery(selector, context)", function( assert ) {
assert.expect( 3 ); assert.expect( 3 );
assert.deepEqual( jQuery( "div p", "#qunit-fixture" ).get(), q( "sndp", "en", "sap" ), "Basic selector with string as context" ); assert.deepEqual( jQuery( "div p", "#qunit-fixture" ).get(), q( "sndp", "en", "sap" ), "Basic selector with string as context" );
assert.deepEqual( jQuery( "div p", q( "qunit-fixture" )[ 0 ] ).get(), q( "sndp", "en", "sap" ), "Basic selector with element as context" ); assert.deepEqual( jQuery( "div p", q( "qunit-fixture" )[ 0 ] ).get(), q( "sndp", "en", "sap" ), "Basic selector with element as context" );
@ -417,6 +417,16 @@ QUnit.test( "isXMLDoc - XML", function( assert ) {
assert.ok( jQuery.isXMLDoc( jQuery( "desc", svg )[ 0 ] ), "XML desc Element" ); assert.ok( jQuery.isXMLDoc( jQuery( "desc", svg )[ 0 ] ), "XML desc Element" );
} ); } );
QUnit.test( "isXMLDoc - falsy", function( assert ) {
assert.expect( 5 );
assert.strictEqual( jQuery.isXMLDoc( undefined ), false, "undefined" );
assert.strictEqual( jQuery.isXMLDoc( null ), false, "null" );
assert.strictEqual( jQuery.isXMLDoc( false ), false, "false" );
assert.strictEqual( jQuery.isXMLDoc( 0 ), false, "0" );
assert.strictEqual( jQuery.isXMLDoc( "" ), false, "\"\"" );
} );
QUnit.test( "XSS via location.hash", function( assert ) { QUnit.test( "XSS via location.hash", function( assert ) {
var done = assert.async(); var done = assert.async();
assert.expect( 1 ); assert.expect( 1 );
@ -475,7 +485,7 @@ QUnit.test( "jQuery('html')", function( assert ) {
//equal( jQuery( "element[attribute=<div></div>]" ).length, 0, //equal( jQuery( "element[attribute=<div></div>]" ).length, 0,
// "When html is within brackets, do not recognize as html." ); // "When html is within brackets, do not recognize as html." );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectors ) {
assert.equal( jQuery( "element:not(<div></div>)" ).length, 0, assert.equal( jQuery( "element:not(<div></div>)" ).length, 0,
"When html is within parens, do not recognize as html." ); "When html is within parens, do not recognize as html." );
} else { } else {

View File

@ -965,7 +965,7 @@ QUnit.test( "show/hide 3.0, inline hidden", function( assert ) {
} ); } );
} ); } );
QUnit[ jQuery.find.compile && jQuery.fn.toggle ? "test" : "skip" ]( "toggle()", function( assert ) { QUnit[ QUnit.jQuerySelectors && jQuery.fn.toggle ? "test" : "skip" ]( "toggle()", function( assert ) {
assert.expect( 9 ); assert.expect( 9 );
var div, oldHide, var div, oldHide,
x = jQuery( "#foo" ); x = jQuery( "#foo" );
@ -998,7 +998,7 @@ QUnit[ jQuery.find.compile && jQuery.fn.toggle ? "test" : "skip" ]( "toggle()",
jQuery.fn.hide = oldHide; jQuery.fn.hide = oldHide;
} ); } );
QUnit[ jQuery.find.compile && jQuery.fn.toggle ? "test" : "skip" ]( "detached toggle()", function( assert ) { QUnit[ QUnit.jQuerySelectors && jQuery.fn.toggle ? "test" : "skip" ]( "detached toggle()", function( assert ) {
assert.expect( 6 ); assert.expect( 6 );
var detached = jQuery( "<p><a></a><p>" ).find( "*" ).addBack(), var detached = jQuery( "<p><a></a><p>" ).find( "*" ).addBack(),
hiddenDetached = jQuery( "<p><a></a></p>" ).find( "*" ).addBack().css( "display", "none" ), hiddenDetached = jQuery( "<p><a></a></p>" ).find( "*" ).addBack().css( "display", "none" ),
@ -1022,12 +1022,14 @@ QUnit[ jQuery.find.compile && jQuery.fn.toggle ? "test" : "skip" ]( "detached to
"cascade-hidden element in detached tree" ); "cascade-hidden element in detached tree" );
} ); } );
QUnit[ jQuery.find.compile && jQuery.fn.toggle && QUnit[ QUnit.jQuerySelectors && jQuery.fn.toggle &&
document.body.attachShadow && document.body.getRootNode ? document.body.attachShadow && document.body.getRootNode ?
"test" : "test" :
"skip" "skip"
]( "shadow toggle()", function( assert ) { ]( "shadow toggle()", function( assert ) {
assert.expect( 4 ); assert.expect( 4 );
jQuery( "<div id='shadowHost'></div>" ).appendTo( "#qunit-fixture" ); jQuery( "<div id='shadowHost'></div>" ).appendTo( "#qunit-fixture" );
var shadowHost = document.querySelector( "#shadowHost" ); var shadowHost = document.querySelector( "#shadowHost" );
var shadowRoot = shadowHost.attachShadow( { mode: "open" } ); var shadowRoot = shadowHost.attachShadow( { mode: "open" } );
@ -1450,7 +1452,7 @@ QUnit.test( "css opacity consistency across browsers (trac-12685)", function( as
assert.equal( Math.round( el.css( "opacity" ) * 100 ), 10, "remove opacity override" ); assert.equal( Math.round( el.css( "opacity" ) * 100 ), 10, "remove opacity override" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( ":visible/:hidden selectors", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( ":visible/:hidden selectors", function( assert ) {
assert.expect( 17 ); assert.expect( 17 );
var $div, $table, $a; var $div, $table, $a;
@ -1486,7 +1488,12 @@ QUnit[ jQuery.find.compile ? "test" : "skip" ]( ":visible/:hidden selectors", fu
$table.css( "display", "none" ).html( "<tr><td>cell</td><td>cell</td></tr>" ); $table.css( "display", "none" ).html( "<tr><td>cell</td><td>cell</td></tr>" );
assert.equal( jQuery( "#table td:visible" ).length, 0, "hidden cell children not perceived as visible (trac-4512)" ); assert.equal( jQuery( "#table td:visible" ).length, 0, "hidden cell children not perceived as visible (trac-4512)" );
assert.t( "Is Visible", "#qunit-fixture div:visible:lt(2)", [ "foo", "nothiddendiv" ] ); if ( QUnit.jQuerySelectorsPos ) {
assert.t( "Is Visible", "#qunit-fixture div:visible:lt(2)", [ "foo", "nothiddendiv" ] );
} else {
assert.ok( "skip", "Positional selectors are not supported" );
}
assert.t( "Is Not Hidden", "#qunit-fixture:hidden", [] ); assert.t( "Is Not Hidden", "#qunit-fixture:hidden", [] );
assert.t( "Is Hidden", "#form input:hidden", [ "hidden1", "hidden2" ] ); assert.t( "Is Hidden", "#form input:hidden", [ "hidden1", "hidden2" ] );

16
test/unit/effects.js vendored
View File

@ -29,7 +29,7 @@ QUnit.module( "effects", {
} }
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "sanity check", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "sanity check", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
assert.equal( jQuery( "#qunit-fixture:visible, #foo:visible" ).length, 2, "QUnit state is correct for testing effects" ); assert.equal( jQuery( "#qunit-fixture:visible, #foo:visible" ).length, 2, "QUnit state is correct for testing effects" );
} ); } );
@ -812,7 +812,7 @@ QUnit.test( "stop( queue, ..., ... ) - Stop single queues", function( assert ) {
this.clock.tick( 500 ); this.clock.tick( 500 );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "toggle()", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "toggle()", function( assert ) {
assert.expect( 6 ); assert.expect( 6 );
var x = jQuery( "#foo" ); var x = jQuery( "#foo" );
assert.ok( x.is( ":visible" ), "is visible" ); assert.ok( x.is( ":visible" ), "is visible" );
@ -1638,7 +1638,7 @@ QUnit.test( "animate should set display for disconnected nodes", function( asser
clock.tick( 400 ); clock.tick( 400 );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "Animation callback should not show animated element as :animated (trac-7157)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "Animation callback should not show animated element as :animated (trac-7157)", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
var foo = jQuery( "#foo" ); var foo = jQuery( "#foo" );
@ -1651,7 +1651,7 @@ QUnit[ jQuery.find.compile ? "test" : "skip" ]( "Animation callback should not s
this.clock.tick( 100 ); this.clock.tick( 100 );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "Initial step callback should show element as :animated (trac-14623)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "Initial step callback should show element as :animated (trac-14623)", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
var foo = jQuery( "#foo" ); var foo = jQuery( "#foo" );
@ -2167,7 +2167,7 @@ QUnit.test( ".finish() completes all queued animations", function( assert ) {
} ); } );
assert.equal( div.queue().length, 0, "empty queue when done" ); assert.equal( div.queue().length, 0, "empty queue when done" );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectors ) {
assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); assert.equal( div.is( ":animated" ), false, ":animated doesn't match" );
} else { } else {
assert.ok( "skip", ":animated selector not supported with selector-native" ); assert.ok( "skip", ":animated selector not supported with selector-native" );
@ -2207,7 +2207,7 @@ QUnit.test( ".finish( false ) - unqueued animations", function( assert ) {
assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" ); assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" );
} ); } );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectors ) {
assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); assert.equal( div.is( ":animated" ), false, ":animated doesn't match" );
} else { } else {
assert.ok( "skip", ":animated selector not supported with selector-native" ); assert.ok( "skip", ":animated selector not supported with selector-native" );
@ -2246,7 +2246,7 @@ QUnit.test( ".finish( \"custom\" ) - custom queue animations", function( assert
// start the first animation // start the first animation
div.dequeue( "custom" ); div.dequeue( "custom" );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectors ) {
assert.equal( div.is( ":animated" ), true, ":animated matches" ); assert.equal( div.is( ":animated" ), true, ":animated matches" );
} else { } else {
assert.ok( "skip", ":animated selector not supported with selector-native" ); assert.ok( "skip", ":animated selector not supported with selector-native" );
@ -2257,7 +2257,7 @@ QUnit.test( ".finish( \"custom\" ) - custom queue animations", function( assert
assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" ); assert.equal( parseFloat( div.css( prop ) ), value, prop + " finished at correct value" );
} ); } );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectors ) {
assert.equal( div.is( ":animated" ), false, ":animated doesn't match" ); assert.equal( div.is( ":animated" ), false, ":animated doesn't match" );
} else { } else {
assert.ok( "skip", ":animated selector not supported with selector-native" ); assert.ok( "skip", ":animated selector not supported with selector-native" );

View File

@ -1840,7 +1840,7 @@ QUnit.test( "events with type matching an Object.prototype property, cloned elem
} ); } );
// selector-native does not support scope-fixing in delegation // selector-native does not support scope-fixing in delegation
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "delegated event with delegateTarget-relative selector", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "delegated event with delegateTarget-relative selector", function( assert ) {
assert.expect( 3 ); assert.expect( 3 );
var markup = jQuery( "<div><ul><li><a id=\"a0\"></a><ul id=\"ul0\"><li class=test><a id=\"a0_0\"></a></li><li><a id=\"a0_1\"></a></li></ul></li></ul></div>" ).appendTo( "#qunit-fixture" ); var markup = jQuery( "<div><ul><li><a id=\"a0\"></a><ul id=\"ul0\"><li class=test><a id=\"a0_0\"></a></li><li><a id=\"a0_1\"></a></li></ul></li></ul></div>" ).appendTo( "#qunit-fixture" );
@ -1858,18 +1858,23 @@ QUnit[ jQuery.find.compile ? "test" : "skip" ]( "delegated event with delegateTa
.find( "#a0_0" ).trigger( "click" ).end() .find( "#a0_0" ).trigger( "click" ).end()
.off( "click" ); .off( "click" );
// Positional selector (trac-11315) if ( QUnit.jQuerySelectorsPos ) {
markup.find( "ul" ).eq( 0 ) // Positional selector (trac-11315)
.on( "click", ">li>a", function() { markup.find( "ul" ).eq( 0 )
assert.ok( this.id === "a0", "child li was clicked" ); .on( "click", ">li>a", function() {
} ) assert.ok( this.id === "a0", "child li was clicked" );
.find( "#ul0" )
.on( "click", "li:first>a", function() {
assert.ok( this.id === "a0_0", "first li under #u10 was clicked" );
} ) } )
.end() .find( "#ul0" )
.find( "a" ).trigger( "click" ).end() .on( "click", "li:first>a", function() {
.find( "#ul0" ).off(); assert.ok( this.id === "a0_0", "first li under #u10 was clicked" );
} )
.end()
.find( "a" ).trigger( "click" ).end()
.find( "#ul0" ).off();
} else {
assert.ok( "skip", "Positional selectors are not supported" );
assert.ok( "skip", "Positional selectors are not supported" );
}
markup.remove(); markup.remove();
} ); } );

View File

@ -193,7 +193,7 @@ function testAppendForObject( valueObj, isFragment, assert ) {
function testAppend( valueObj, assert ) { function testAppend( valueObj, assert ) {
assert.expect( 78 ); assert.expect( 82 );
testAppendForObject( valueObj, false, assert ); testAppendForObject( valueObj, false, assert );
testAppendForObject( valueObj, true, assert ); testAppendForObject( valueObj, true, assert );
@ -1984,7 +1984,7 @@ QUnit.test( "remove() with filters", function( assert ) {
div.children().remove( "span:nth-child(2n)" ); div.children().remove( "span:nth-child(2n)" );
assert.equal( div.text(), "13", "relative selector in remove" ); assert.equal( div.text(), "13", "relative selector in remove" );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectorsPos ) {
div = jQuery( markup ); div = jQuery( markup );
div.children().remove( "span:first" ); div.children().remove( "span:first" );
assert.equal( div.text(), "234", "positional selector in remove" ); assert.equal( div.text(), "234", "positional selector in remove" );
@ -1992,8 +1992,8 @@ QUnit.test( "remove() with filters", function( assert ) {
div.children().remove( "span:last" ); div.children().remove( "span:last" );
assert.equal( div.text(), "123", "positional selector in remove" ); assert.equal( div.text(), "123", "positional selector in remove" );
} else { } else {
assert.ok( "skip", "Positional selectors not supported in selector-native" ); assert.ok( "skip", "Positional selectors are not supported" );
assert.ok( "skip", "Positional selectors not supported in selector-native" ); assert.ok( "skip", "Positional selectors are not supported" );
} }
// using contents will get comments regular, text, and comment nodes // using contents will get comments regular, text, and comment nodes
@ -2081,7 +2081,7 @@ QUnit.test( "detach() with filters", function( assert ) {
div.children().detach( "span:nth-child(2n)" ); div.children().detach( "span:nth-child(2n)" );
assert.equal( div.text(), "13", "relative selector in detach" ); assert.equal( div.text(), "13", "relative selector in detach" );
if ( jQuery.find.compile ) { if ( QUnit.jQuerySelectorsPos ) {
div = jQuery( markup ); div = jQuery( markup );
div.children().detach( "span:first" ); div.children().detach( "span:first" );
assert.equal( div.text(), "234", "positional selector in detach" ); assert.equal( div.text(), "234", "positional selector in detach" );
@ -2089,8 +2089,8 @@ QUnit.test( "detach() with filters", function( assert ) {
div.children().detach( "span:last" ); div.children().detach( "span:last" );
assert.equal( div.text(), "123", "positional selector in detach" ); assert.equal( div.text(), "123", "positional selector in detach" );
} else { } else {
assert.ok( "skip", "positional selectors not supported in selector-native" ); assert.ok( "skip", "Positional selectors are not supported" );
assert.ok( "skip", "positional selectors not supported in selector-native" ); assert.ok( "skip", "Positional selectors are not supported" );
} }
// using contents will get comments regular, text, and comment nodes // using contents will get comments regular, text, and comment nodes

File diff suppressed because it is too large Load Diff

View File

@ -59,262 +59,377 @@ testIframe(
userAgent = window.navigator.userAgent, userAgent = window.navigator.userAgent,
expectedMap = { expectedMap = {
edge: { edge: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": false, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: false,
scope: false,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ie_10_11: { ie_10_11: {
"ajax": true, ajax: true,
"boxSizingReliable": false, boxSizingReliable: false,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": false, clearCloneStyle: false,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": true, createHTMLDocument: true,
"noCloneChecked": false, disconnectedMatch: true,
"option": true, focusin: true,
"optSelected": false, getById: true,
"pixelBoxStyles": true, noCloneChecked: false,
"pixelPosition": true, option: true,
"radioValue": false, optSelected: false,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": false, pixelPosition: true,
"scrollboxSize": true radioValue: false,
reliableMarginLeft: true,
reliableTrDimensions: false,
scope: false,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ie_9: { ie_9: {
"ajax": true, ajax: true,
"boxSizingReliable": false, boxSizingReliable: false,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": false, clearCloneStyle: false,
"cors": false, cssSupportsSelector: false,
"createHTMLDocument": true, cors: false,
"focusin": true, createHTMLDocument: true,
"noCloneChecked": false, disconnectedMatch: false,
"option": false, focusin: true,
"optSelected": false, getById: false,
"pixelBoxStyles": true, noCloneChecked: false,
"pixelPosition": true, option: false,
"radioValue": false, optSelected: false,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": false, pixelPosition: true,
"scrollboxSize": false radioValue: false,
reliableMarginLeft: true,
reliableTrDimensions: false,
scope: false,
scrollboxSize: false,
sortDetached: true,
sortStable: true
}, },
chrome: { chrome: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": true, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
safari: { safari: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": true, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
safari_9_10: { safari_9_10: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": false, noCloneChecked: true,
"pixelPosition": false, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: false,
"reliableTrDimensions": true, pixelPosition: false,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
firefox: { firefox: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: true,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": false, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: false,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
},
firefox_102: {
ajax: true,
boxSizingReliable: true,
checkClone: true,
checkOn: true,
clearCloneStyle: true,
cssSupportsSelector: false,
cors: true,
createHTMLDocument: true,
disconnectedMatch: true,
focusin: false,
getById: true,
noCloneChecked: true,
option: true,
optSelected: true,
pixelBoxStyles: true,
pixelPosition: true,
radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: false,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
firefox_60: { firefox_60: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": false, pixelBoxStyles: true,
"reliableTrDimensions": true, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: false,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ios: { ios: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": true, noCloneChecked: true,
"pixelPosition": true, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: true,
"reliableTrDimensions": true, pixelPosition: true,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ios_9_10: { ios_9_10: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": false, noCloneChecked: true,
"pixelPosition": false, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: false,
"reliableTrDimensions": true, pixelPosition: false,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ios_8: { ios_8: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": false, cors: true,
"focusin": false, createHTMLDocument: false,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": false, noCloneChecked: true,
"pixelPosition": false, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: false,
"reliableTrDimensions": true, pixelPosition: false,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
ios_7: { ios_7: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": true, checkClone: true,
"checkOn": true, checkOn: true,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": false, noCloneChecked: true,
"pixelPosition": false, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": true, pixelBoxStyles: false,
"reliableTrDimensions": true, pixelPosition: false,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: true,
reliableTrDimensions: true,
scope: true,
scrollboxSize: true,
sortDetached: true,
sortStable: true
}, },
android: { android: {
"ajax": true, ajax: true,
"boxSizingReliable": true, boxSizingReliable: true,
"checkClone": false, checkClone: false,
"checkOn": false, checkOn: false,
"clearCloneStyle": true, clearCloneStyle: true,
"cors": true, cssSupportsSelector: false,
"createHTMLDocument": true, cors: true,
"focusin": false, createHTMLDocument: true,
"noCloneChecked": true, disconnectedMatch: true,
"option": true, focusin: false,
"optSelected": true, getById: true,
"pixelBoxStyles": false, noCloneChecked: true,
"pixelPosition": false, option: true,
"radioValue": true, optSelected: true,
"reliableMarginLeft": false, pixelBoxStyles: false,
"reliableTrDimensions": true, pixelPosition: false,
"scrollboxSize": true radioValue: true,
reliableMarginLeft: false,
reliableTrDimensions: true,
scope: false,
scrollboxSize: true,
sortDetached: false,
sortStable: false
} }
}; };
// Make the slim build pass tests. // Make the slim build pass tests.
for ( browserKey in expectedMap ) { for ( browserKey in expectedMap ) {
if ( !jQuery.ajax ) { if ( !includesModule( "ajax" ) ) {
delete expectedMap[ browserKey ].ajax; delete expectedMap[ browserKey ].ajax;
delete expectedMap[ browserKey ].cors; delete expectedMap[ browserKey ].cors;
} }
} }
// Make the selector-native build pass tests.
for ( browserKey in expectedMap ) {
if ( !includesModule( "selector" ) ) {
delete expectedMap[ browserKey ].cssSupportsSelector;
delete expectedMap[ browserKey ].disconnectedMatch;
delete expectedMap[ browserKey ].getById;
delete expectedMap[ browserKey ].scope;
delete expectedMap[ browserKey ].sortDetached;
delete expectedMap[ browserKey ].sortStable;
}
}
if ( /edge\//i.test( userAgent ) ) { if ( /edge\//i.test( userAgent ) ) {
expected = expectedMap.edge; expected = expectedMap.edge;
} else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) { } else if ( /(msie 10\.0|trident\/7\.0)/i.test( userAgent ) ) {
@ -328,8 +443,10 @@ testIframe(
expected = expectedMap.chrome; expected = expectedMap.chrome;
} else if ( /\b(?:9|10)\.\d+(\.\d+)* safari/i.test( userAgent ) ) { } else if ( /\b(?:9|10)\.\d+(\.\d+)* safari/i.test( userAgent ) ) {
expected = expectedMap.safari_9_10; expected = expectedMap.safari_9_10;
} else if ( /firefox\/(?:4\d|5\d|60)/i.test( userAgent ) ) { } else if ( /firefox\/[456]\d\b/i.test( userAgent ) ) {
expected = expectedMap.firefox_60; expected = expectedMap.firefox_60;
} else if ( /firefox\/(?:[789]\d|102)\b/i.test( userAgent ) ) {
expected = expectedMap.firefox_102;
} else if ( /firefox/i.test( userAgent ) ) { } else if ( /firefox/i.test( userAgent ) ) {
expected = expectedMap.firefox; expected = expectedMap.firefox;
} else if ( /android 4\.[0-3]/i.test( userAgent ) ) { } else if ( /android 4\.[0-3]/i.test( userAgent ) ) {
@ -359,6 +476,15 @@ testIframe(
j++; j++;
} }
// Add an assertion per undefined support prop as it may
// not even exist on computedSupport but we still want to run
// the check.
for ( prop in expected ) {
if ( expected[ prop ] === undefined ) {
j++;
}
}
assert.expect( j ); assert.expect( j );
for ( i in expected ) { for ( i in expected ) {
@ -387,6 +513,15 @@ testIframe(
i++; i++;
} }
// Add an assertion per undefined support prop as it may
// not even exist on computedSupport but we still want to run
// the check.
for ( prop in expected ) {
if ( expected[ prop ] === undefined ) {
i++;
}
}
assert.expect( i ); assert.expect( i );
// Record all support props and the failing ones and ensure everyone // Record all support props and the failing ones and ensure everyone
@ -394,7 +529,7 @@ testIframe(
for ( browserKey in expectedMap ) { for ( browserKey in expectedMap ) {
for ( supportTestName in expectedMap[ browserKey ] ) { for ( supportTestName in expectedMap[ browserKey ] ) {
supportProps[ supportTestName ] = true; supportProps[ supportTestName ] = true;
if ( expectedMap[ browserKey ][ supportTestName ] !== true ) { if ( !expectedMap[ browserKey ][ supportTestName ] ) {
failingSupportProps[ supportTestName ] = true; failingSupportProps[ supportTestName ] = true;
} }
} }

View File

@ -13,7 +13,7 @@ QUnit.test( "find(String) under non-elements", function( assert ) {
assert.equal( j.find( "div" ).addBack().length, 3, "Check node,textnode,comment to find zero divs, but preserves pushStack" ); assert.equal( j.find( "div" ).addBack().length, 3, "Check node,textnode,comment to find zero divs, but preserves pushStack" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "find(leading combinator)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "find(leading combinator)", function( assert ) {
assert.expect( 4 ); assert.expect( 4 );
assert.deepEqual( jQuery( "#qunit-fixture" ).find( "> div" ).get(), q( "foo", "nothiddendiv", "moretests", "tabindex-tests", "liveHandlerOrder", "siblingTest", "fx-test-group" ), "find child elements" ); assert.deepEqual( jQuery( "#qunit-fixture" ).find( "> div" ).get(), q( "foo", "nothiddendiv", "moretests", "tabindex-tests", "liveHandlerOrder", "siblingTest", "fx-test-group" ), "find child elements" );
@ -50,8 +50,24 @@ QUnit.test( "find(node|jQuery object)", function( assert ) {
assert.equal( $two.find( $foo[ 0 ] ).addBack().length, 2, "find preserves the pushStack, see trac-12009" ); assert.equal( $two.find( $foo[ 0 ] ).addBack().length, 2, "find preserves the pushStack, see trac-12009" );
} ); } );
QUnit.test( "is(String|undefined)", function( assert ) { QUnit.test( "is(falsy|invalid)", function( assert ) {
assert.expect( 23 ); assert.expect( 5 );
assert.ok( !jQuery( "#foo" ).is( 0 ), "Expected false for an invalid expression - 0" );
assert.ok( !jQuery( "#foo" ).is( null ), "Expected false for an invalid expression - null" );
assert.ok( !jQuery( "#foo" ).is( "" ), "Expected false for an invalid expression - \"\"" );
assert.ok( !jQuery( "#foo" ).is( undefined ), "Expected false for an invalid expression - undefined" );
assert.ok( !jQuery( "#foo" ).is( { plain: "object" } ), "Check passing invalid object" );
} );
QUnit.test( "is(String)", function( assert ) {
assert.expect( 33 );
var link = document.getElementById( "simon1" ),
input = document.getElementById( "text1" ),
option = document.getElementById( "option1a" ),
disconnected = document.createElement( "div" );
assert.ok( jQuery( "#form" ).is( "form" ), "Check for element: A form must be a form" ); assert.ok( jQuery( "#form" ).is( "form" ), "Check for element: A form must be a form" );
assert.ok( !jQuery( "#form" ).is( "div" ), "Check for element: A form is not a div" ); assert.ok( !jQuery( "#form" ).is( "div" ), "Check for element: A form is not a div" );
assert.ok( jQuery( "#mark" ).is( ".blog" ), "Check for class: Expected class 'blog'" ); assert.ok( jQuery( "#mark" ).is( ".blog" ), "Check for class: Expected class 'blog'" );
@ -67,17 +83,56 @@ QUnit.test( "is(String|undefined)", function( assert ) {
assert.ok( jQuery( "#radio2" ).is( ":checked" ), "Check for pseudoclass: Expected to be checked" ); assert.ok( jQuery( "#radio2" ).is( ":checked" ), "Check for pseudoclass: Expected to be checked" );
assert.ok( !jQuery( "#radio1" ).is( ":checked" ), "Check for pseudoclass: Expected not checked" ); assert.ok( !jQuery( "#radio1" ).is( ":checked" ), "Check for pseudoclass: Expected not checked" );
assert.ok( !jQuery( "#foo" ).is( 0 ), "Expected false for an invalid expression - 0" );
assert.ok( !jQuery( "#foo" ).is( null ), "Expected false for an invalid expression - null" );
assert.ok( !jQuery( "#foo" ).is( "" ), "Expected false for an invalid expression - \"\"" );
assert.ok( !jQuery( "#foo" ).is( undefined ), "Expected false for an invalid expression - undefined" );
assert.ok( !jQuery( "#foo" ).is( { plain: "object" } ), "Check passing invalid object" );
// test is() with comma-separated expressions // test is() with comma-separated expressions
assert.ok( jQuery( "#en" ).is( "[lang=\"en\"],[lang=\"de\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" ); assert.ok( jQuery( "#en" ).is( "[lang=\"en\"],[lang=\"de\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" );
assert.ok( jQuery( "#en" ).is( "[lang=\"de\"],[lang=\"en\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" ); assert.ok( jQuery( "#en" ).is( "[lang=\"de\"],[lang=\"en\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" );
assert.ok( jQuery( "#en" ).is( "[lang=\"en\"] , [lang=\"de\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" ); assert.ok( jQuery( "#en" ).is( "[lang=\"en\"] , [lang=\"de\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" );
assert.ok( jQuery( "#en" ).is( "[lang=\"de\"] , [lang=\"en\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" ); assert.ok( jQuery( "#en" ).is( "[lang=\"de\"] , [lang=\"en\"]" ), "Comma-separated; Check for lang attribute: Expect en or de" );
link.title = "Don't click me";
assert.ok( jQuery( link ).is( "[rel='bookmark']" ), "attribute-equals string (delimited via apostrophes)" );
assert.ok( jQuery( link ).is( "[rel=bookmark]" ), "attribute-equals identifier" );
assert.ok( jQuery( link ).is( "[\nrel = bookmark\t]" ),
"attribute-equals identifier (whitespace ignored)" );
assert.ok( jQuery( link ).is( "a[title=\"Don't click me\"]" ),
"attribute-equals string containing single quote" );
// jQuery trac-12303
input.setAttribute( "data-pos", ":first" );
assert.ok( jQuery( input ).is( "input[data-pos=\\:first]" ),
"attribute-equals POS in identifier" );
assert.ok( jQuery( input ).is( "input[data-pos=':first']" ),
"attribute-equals POS in string" );
if ( QUnit.jQuerySelectors ) {
assert.ok( jQuery( input ).is( ":input[data-pos=':first']" ),
"attribute-equals POS in string after pseudo" );
} else {
assert.ok( "skip", ":input not supported in selector-native" );
}
option.setAttribute( "test", "" );
assert.ok( jQuery( option ).is( "[id=option1a]" ),
"id attribute-equals identifier" );
if ( QUnit.jQuerySelectors ) {
assert.ok( jQuery( option ).is( "[id*=option1][type!=checkbox]" ),
"attribute-not-equals identifier" );
} else {
assert.ok( "skip", "attribute-not-equals not supported in selector-native" );
}
assert.ok( jQuery( option ).is( "[id*=option1]" ), "attribute-contains identifier" );
assert.ok( !jQuery( option ).is( "[test^='']" ),
"attribute-starts-with empty string (negative)" );
option.className = "=]";
assert.ok( jQuery( option ).is( ".\\=\\]" ),
"class selector with attribute-equals confusable" );
assert.ok( jQuery( disconnected ).is( "div" ), "disconnected element" );
assert.ok( jQuery( link ).is( "* > *" ), "child combinator matches in document" );
assert.ok( !jQuery( disconnected ).is( "* > *" ), "child combinator fails in fragment" );
} ); } );
QUnit.test( "is() against non-elements (trac-10178)", function( assert ) { QUnit.test( "is() against non-elements (trac-10178)", function( assert ) {
@ -130,7 +185,7 @@ QUnit.test( "is(jQuery)", function( assert ) {
assert.ok( !jQuery( "#simon" ).is( jQuery( ".blogTest" )[ 0 ] ), "Check for multiple classes: Expected classes 'blog' and 'link', but not 'blogTest'" ); assert.ok( !jQuery( "#simon" ).is( jQuery( ".blogTest" )[ 0 ] ), "Check for multiple classes: Expected classes 'blog' and 'link', but not 'blogTest'" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "is() with :has() selectors", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "is() with :has() selectors", function( assert ) {
assert.expect( 6 ); assert.expect( 6 );
assert.ok( jQuery( "#foo" ).is( ":has(p)" ), "Check for child: Expected a child 'p' element" ); assert.ok( jQuery( "#foo" ).is( ":has(p)" ), "Check for child: Expected a child 'p' element" );
@ -142,7 +197,7 @@ QUnit[ jQuery.find.compile ? "test" : "skip" ]( "is() with :has() selectors", fu
assert.ok( !jQuery( "#foo" ).is( jQuery( "div:has(ul)" ) ), "Check for child: Did not expect 'ul' element" ); assert.ok( !jQuery( "#foo" ).is( jQuery( "div:has(ul)" ) ), "Check for child: Did not expect 'ul' element" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "is() with positional selectors", function( assert ) { QUnit[ QUnit.jQuerySelectorsPos ? "test" : "skip" ]( "is() with positional selectors", function( assert ) {
assert.expect( 27 ); assert.expect( 27 );
var var
@ -279,7 +334,7 @@ QUnit.test( "filter(jQuery)", function( assert ) {
assert.deepEqual( jQuery( "#form input" ).filter( elements ).get(), q( "text1" ), "filter(Element)" ); assert.deepEqual( jQuery( "#form input" ).filter( elements ).get(), q( "text1" ), "filter(Element)" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "filter() with positional selectors", function( assert ) { QUnit[ QUnit.jQuerySelectorsPos ? "test" : "skip" ]( "filter() with positional selectors", function( assert ) {
assert.expect( 19 ); assert.expect( 19 );
var filterit = function( sel, filter, length ) { var filterit = function( sel, filter, length ) {
@ -360,7 +415,7 @@ QUnit.test( "closest()", function( assert ) {
assert.deepEqual( jq.contents().closest( "*" ).get(), jq.get(), "Text node input (trac-13332)" ); assert.deepEqual( jq.contents().closest( "*" ).get(), jq.get(), "Text node input (trac-13332)" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "closest() with positional selectors", function( assert ) { QUnit[ QUnit.jQuerySelectorsPos ? "test" : "skip" ]( "closest() with positional selectors", function( assert ) {
assert.expect( 3 ); assert.expect( 3 );
assert.deepEqual( jQuery( "#qunit-fixture" ).closest( "div:first" ).get(), [], assert.deepEqual( jQuery( "#qunit-fixture" ).closest( "div:first" ).get(), [],
@ -390,7 +445,7 @@ QUnit.test( "closest(jQuery)", function( assert ) {
assert.ok( $child.closest( $body.add( $parent ) ).is( "#nothiddendiv" ), "Closest ancestor retrieved." ); assert.ok( $child.closest( $body.add( $parent ) ).is( "#nothiddendiv" ), "Closest ancestor retrieved." );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "not(Selector)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "not(Selector)", function( assert ) {
assert.expect( 7 ); assert.expect( 7 );
assert.equal( jQuery( "#qunit-fixture > p#ap > a" ).not( "#google" ).length, 2, "not('selector')" ); assert.equal( jQuery( "#qunit-fixture > p#ap > a" ).not( "#google" ).length, 2, "not('selector')" );
@ -470,7 +525,7 @@ QUnit.test( "not(jQuery)", function( assert ) {
); );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "not(Selector) excludes non-element nodes (gh-2808)", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "not(Selector) excludes non-element nodes (gh-2808)", function( assert ) {
assert.expect( 3 ); assert.expect( 3 );
var mixedContents = jQuery( "#nonnodes" ).contents(), var mixedContents = jQuery( "#nonnodes" ).contents(),
@ -561,7 +616,11 @@ QUnit.test( "siblings([String])", function( assert ) {
assert.expect( 6 ); assert.expect( 6 );
assert.deepEqual( jQuery( "#en" ).siblings().get(), q( "sndp", "sap" ), "Check for siblings" ); assert.deepEqual( jQuery( "#en" ).siblings().get(), q( "sndp", "sap" ), "Check for siblings" );
assert.deepEqual( jQuery( "#nonnodes" ).contents().eq( 1 ).siblings().get(), q( "nonnodesElement" ), "Check for text node siblings" ); assert.deepEqual( jQuery( "#nonnodes" ).contents().eq( 1 ).siblings().get(), q( "nonnodesElement" ), "Check for text node siblings" );
assert.deepEqual( jQuery( "#foo" ).siblings( "form, b" ).get(), q( "form", "floatTest", "lengthtest", "name-tests", "testForm" ), "Check for multiple filters" ); assert.deepEqual(
jQuery( "#foo" ).siblings( "form, b" ).get(),
q( "form", "floatTest", "lengthtest", "name-tests", "testForm", "disabled-tests" ),
"Check for multiple filters"
);
var set = q( "sndp", "en", "sap" ); var set = q( "sndp", "en", "sap" );
assert.deepEqual( jQuery( "#en, #sndp" ).siblings().get(), set, "Check for unique results from siblings" ); assert.deepEqual( jQuery( "#en, #sndp" ).siblings().get(), set, "Check for unique results from siblings" );
@ -569,7 +628,7 @@ QUnit.test( "siblings([String])", function( assert ) {
assert.equal( jQuery( "<a></a>" ).siblings().length, 0, "Detached elements have no siblings (trac-11370)" ); assert.equal( jQuery( "<a></a>" ).siblings().length, 0, "Detached elements have no siblings (trac-11370)" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "siblings([String])", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "siblings([String])", function( assert ) {
assert.expect( 2 ); assert.expect( 2 );
assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(code)" ).get(), q( "sap" ), "Check for filtered siblings (has code child element)" ); assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(code)" ).get(), q( "sap" ), "Check for filtered siblings (has code child element)" );
assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(a)" ).get(), q( "en", "sap" ), "Check for filtered siblings (has anchor child element)" ); assert.deepEqual( jQuery( "#sndp" ).siblings( ":has(a)" ).get(), q( "en", "sap" ), "Check for filtered siblings (has anchor child element)" );
@ -581,7 +640,7 @@ QUnit.test( "children([String])", function( assert ) {
assert.deepEqual( jQuery( "#foo" ).children( "#en, #sap" ).get(), q( "en", "sap" ), "Check for multiple filters" ); assert.deepEqual( jQuery( "#foo" ).children( "#en, #sap" ).get(), q( "en", "sap" ), "Check for multiple filters" );
} ); } );
QUnit[ jQuery.find.compile ? "test" : "skip" ]( "children([String])", function( assert ) { QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "children([String])", function( assert ) {
assert.expect( 1 ); assert.expect( 1 );
assert.deepEqual( jQuery( "#foo" ).children( ":has(code)" ).get(), q( "sndp", "sap" ), "Check for filtered children" ); assert.deepEqual( jQuery( "#foo" ).children( ":has(code)" ).get(), q( "sndp", "sap" ), "Check for filtered children" );
} ); } );