Skip to content

Commit e9b07eb

Browse files
committed
Build: Run GitHub Action browser tests on Puppeteer WebKit
So far, we've been running browser tests on GitHub Actions in Chrome and Firefox. Regular Safari is not available in GitHub Actions but Puppeteer WebKit comes close to a dev version of Safari. With this change, our GitHub CI will invoke tests on all actively developed browser engines on all PRs.
1 parent c66d470 commit e9b07eb

File tree

7 files changed

+34
-16
lines changed

7 files changed

+34
-16
lines changed

.github/workflows/node.js.yml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,27 @@ jobs:
1616
NODE_VERSION: [10.x, 14.x, 16.x, 18.x, 19.x]
1717
NPM_SCRIPT: ["test:browserless"]
1818
include:
19-
- NAME: "Browser tests: full build, Chrome & Firefox stable"
19+
- NAME: "Browser tests: full build, Chrome, Firefox & WebKit"
2020
NODE_VERSION: "16.x"
2121
NPM_SCRIPT: "test:browser"
22-
BROWSERS: "ChromeHeadless,FirefoxHeadless"
23-
- NAME: "Browser tests: slim build, Chrome stable"
22+
BROWSERS: "ChromeHeadless,FirefoxHeadless,WebkitHeadless"
23+
- NAME: "Browser tests: slim build, Chrome"
2424
NODE_VERSION: "16.x"
2525
NPM_SCRIPT: "test:slim"
2626
BROWSERS: "ChromeHeadless"
27-
- NAME: "Browser tests: no-deprecated build, Chrome stable"
27+
- NAME: "Browser tests: no-deprecated build, Chrome"
2828
NODE_VERSION: "16.x"
2929
NPM_SCRIPT: "test:no-deprecated"
3030
BROWSERS: "ChromeHeadless"
31-
- NAME: "Browser tests: selector-native build, Chrome stable"
31+
- NAME: "Browser tests: selector-native build, Chrome"
3232
NODE_VERSION: "16.x"
3333
NPM_SCRIPT: "test:selector-native"
3434
BROWSERS: "ChromeHeadless"
35-
- NAME: "Browser tests: ES modules build, Chrome stable"
35+
- NAME: "Browser tests: ES modules build, Chrome"
3636
NODE_VERSION: "16.x"
3737
NPM_SCRIPT: "test:esmodules"
3838
BROWSERS: "ChromeHeadless"
39-
- NAME: "Browser tests: AMD build, Chrome stable"
39+
- NAME: "Browser tests: AMD build, Chrome"
4040
NODE_VERSION: "16.x"
4141
NPM_SCRIPT: "test:amd"
4242
BROWSERS: "ChromeHeadless"

Gruntfile.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ module.exports = function( grunt ) {
2121

2222
var fs = require( "fs" ),
2323
gzip = require( "gzip-js" ),
24+
playwright = require( "playwright" ),
2425
oldNode = /^v10\./.test( process.version ),
2526
nodeV17OrNewer = !/^v1[0246]\./.test( process.version ),
2627
isCi = process.env.GITHUB_ACTION,
2728
ciBrowsers = process.env.BROWSERS && process.env.BROWSERS.split( "," );
2829

30+
process.env.WEBKIT_HEADLESS_BIN = playwright.webkit.executablePath();
31+
2932
if ( !grunt.option( "filename" ) ) {
3033
grunt.option( "filename", "jquery.js" );
3134
}
@@ -242,7 +245,8 @@ module.exports = function( grunt ) {
242245
singleRun: true
243246
},
244247
main: {
245-
browsers: isCi && ciBrowsers || [ "ChromeHeadless", "FirefoxHeadless" ]
248+
browsers: isCi && ciBrowsers ||
249+
[ "ChromeHeadless", "FirefoxHeadless", "WebkitHeadless" ]
246250
},
247251
esmodules: {
248252
browsers: isCi && ciBrowsers || [ "ChromeHeadless" ],

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
"url": "https://github.com/jquery/jquery/issues"
2424
},
2525
"license": "MIT",
26-
"dependencies": {},
2726
"devDependencies": {
2827
"@babel/core": "7.10.5",
2928
"@babel/plugin-transform-for-of": "7.10.4",
@@ -47,15 +46,17 @@
4746
"gzip-js": "0.3.2",
4847
"husky": "4.2.5",
4948
"jsdom": "19.0.0",
50-
"karma": "^6.3.17",
49+
"karma": "6.4.1",
5150
"karma-browserstack-launcher": "1.6.0",
5251
"karma-chrome-launcher": "3.1.1",
5352
"karma-firefox-launcher": "2.1.2",
5453
"karma-ie-launcher": "1.0.0",
5554
"karma-jsdom-launcher": "12.0.0",
5655
"karma-qunit": "4.1.2",
56+
"karma-webkit-launcher": "1.1.0",
5757
"load-grunt-tasks": "5.1.0",
5858
"native-promise-only": "0.8.1",
59+
"playwright": "1.29.1",
5960
"promises-aplus-tests": "2.1.2",
6061
"q": "1.5.1",
6162
"qunit": "2.10.1",

test/unit/ajax.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2270,7 +2270,7 @@ if ( typeof window.ArrayBuffer === "undefined" || typeof new XMLHttpRequest().re
22702270
// beforeunload, unload, pagehide, and visibilitychange event handlers.
22712271
// See https://bugs.chromium.org/p/chromium/issues/detail?id=952452
22722272
// Safari 13 did similar changes. The below check will catch them both.
2273-
if ( !/safari/i.test( navigator.userAgent ) ) {
2273+
if ( !/webkit/i.test( navigator.userAgent ) ) {
22742274
testIframe(
22752275
"trac-14379 - jQuery.ajax() on unload",
22762276
"ajax/onunload.html",

test/unit/css.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1757,7 +1757,7 @@ QUnit.testUnlessIE( "css(--customProperty)", function( assert ) {
17571757
var div = jQuery( "<div>" ).appendTo( "#qunit-fixture" ),
17581758
$elem = jQuery( "<div>" ).addClass( "test__customProperties" )
17591759
.appendTo( "#qunit-fixture" ),
1760-
webkitOrBlink = /\bsafari\b/i.test( navigator.userAgent ),
1760+
webkitOrBlink = /\webkit\b/i.test( navigator.userAgent ),
17611761
expected = 20;
17621762

17631763
if ( webkitOrBlink ) {

test/unit/selector.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
QUnit.module( "selector", {
22
beforeEach: function() {
3-
this.safari = /\bsafari\b/i.test( navigator.userAgent ) &&
4-
!/\b(?:headless)?chrome\b/i.test( navigator.userAgent );
3+
4+
// Puppeteer WebKit doesn't expose `Safari` in its user agent string.
5+
// However, this particular version of WebKit is only present in modern
6+
// WebKit UAs (Safari 13+) as Chromium is locked to an older version.
7+
this.safari = /\bapplewebkit\/605\.1\.15\b/i.test( navigator.userAgent );
58
},
69
afterEach: moduleTeardown
710
} );

test/unit/support.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ testIframe(
7070
cssSupportsSelector: false,
7171
reliableTrDimensions: true
7272
},
73+
webkit: {
74+
cssSupportsSelector: true,
75+
reliableTrDimensions: true
76+
},
7377
firefox_102: {
7478
cssSupportsSelector: false,
7579
reliableTrDimensions: false
@@ -97,14 +101,20 @@ testIframe(
97101

98102
// Catches Edge, Chrome on Android & Opera as well.
99103
expected = expectedMap.chrome;
100-
} else if ( /\b\d+(\.\d+)+ safari/i.test( userAgent ) ) {
101-
expected = expectedMap.safari;
102104
} else if ( /firefox\/102\./i.test( userAgent ) ) {
103105
expected = expectedMap.firefox_102;
104106
} else if ( /firefox/i.test( userAgent ) ) {
105107
expected = expectedMap.firefox;
106108
} else if ( /(?:iphone|ipad);.*(?:iphone)? os \d+_/i.test( userAgent ) ) {
107109
expected = expectedMap.ios;
110+
} else if ( /\b\d+(\.\d+)+ safari/i.test( userAgent ) ) {
111+
expected = expectedMap.safari;
112+
113+
// Puppeteer WebKit doesn't expose `Safari` in its user agent string.
114+
// However, this particular version of WebKit is only present in modern
115+
// WebKit UAs (Safari 13+) as Chromium is locked to an older version.
116+
} else if ( /\bapplewebkit\/605\.1\.15\b/i.test( userAgent ) ) {
117+
expected = expectedMap.webkit;
108118
}
109119

110120
QUnit.test( "Verify that support tests resolve as expected per browser", function( assert ) {

0 commit comments

Comments
 (0)