Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit f1ba6ae

Browse files
authored
Merge pull request #278 from ckeditor/t/ckeditor5/1463
Feature: Added `isSafari` property and `isSafari()` helper to the `env` module. See: ckeditor/ckeditor5#1463.
2 parents 1968d0c + 4c961b8 commit f1ba6ae

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

src/env.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,15 @@ const env = {
3939
* @static
4040
* @member {Boolean} module:utils/env~env#isEdge
4141
*/
42-
isGecko: isGecko( userAgent )
42+
isGecko: isGecko( userAgent ),
43+
44+
/**
45+
* Indicates that the application is running in Safari.
46+
*
47+
* @static
48+
* @member {Boolean} module:utils/env~env#isSafari
49+
*/
50+
isSafari: isSafari( userAgent )
4351
};
4452

4553
export default env;
@@ -73,3 +81,13 @@ export function isEdge( userAgent ) {
7381
export function isGecko( userAgent ) {
7482
return !!userAgent.match( /gecko\/\d+/ );
7583
}
84+
85+
/**
86+
* Checks if User Agent represented by the string is Safari.
87+
*
88+
* @param {String} userAgent **Lowercase** `navigator.userAgent` string.
89+
* @returns {Boolean} Whether User Agent is Safari or not.
90+
*/
91+
export function isSafari( userAgent ) {
92+
return userAgent.indexOf( ' applewebkit/' ) > -1 && userAgent.indexOf( 'chrome' ) === -1;
93+
}

tests/env.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,13 @@
33
* For licensing, see LICENSE.md.
44
*/
55

6-
import env, { isEdge, isMac, isGecko } from '../src/env';
6+
import env, { isEdge, isMac, isGecko, isSafari } from '../src/env';
77

88
function toLowerCase( str ) {
99
return str.toLowerCase();
1010
}
1111

1212
describe( 'Env', () => {
13-
beforeEach( () => {
14-
} );
15-
1613
it( 'is an object', () => {
1714
expect( env ).to.be.an( 'object' );
1815
} );
@@ -35,6 +32,12 @@ describe( 'Env', () => {
3532
} );
3633
} );
3734

35+
describe( 'isSafari', () => {
36+
it( 'is a boolean', () => {
37+
expect( env.isSafari ).to.be.a( 'boolean' );
38+
} );
39+
} );
40+
3841
describe( 'isMac()', () => {
3942
it( 'returns true for macintosh UA strings', () => {
4043
expect( isMac( 'macintosh' ) ).to.be.true;
@@ -103,4 +106,32 @@ describe( 'Env', () => {
103106
) ) ).to.be.false;
104107
} );
105108
} );
109+
110+
describe( 'isSafari()', () => {
111+
/* eslint-disable max-len */
112+
it( 'returns true for Safari UA strings', () => {
113+
expect( isSafari( toLowerCase(
114+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15'
115+
) ) ).to.be.true;
116+
117+
expect( isSafari( toLowerCase(
118+
'Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1'
119+
) ) ).to.be.true;
120+
} );
121+
122+
it( 'returns false for non-Safari UA strings', () => {
123+
expect( isSafari( toLowerCase(
124+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
125+
) ) ).to.be.false;
126+
127+
expect( isSafari( toLowerCase(
128+
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0'
129+
) ) ).to.be.false;
130+
131+
expect( isSafari( toLowerCase(
132+
'Mozilla/5.0 (Linux; Android 7.1; Mi A1 Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36'
133+
) ) ).to.be.false;
134+
} );
135+
/* eslint-enable max-len */
136+
} );
106137
} );

0 commit comments

Comments
 (0)