diff --git a/includes/MinervaHooks.php b/includes/MinervaHooks.php index be18db6..e90f899 100644 --- a/includes/MinervaHooks.php +++ b/includes/MinervaHooks.php @@ -99,12 +99,12 @@ class MinervaHooks { 'tests/qunit/skins.minerva.scripts/stubs.js', 'resources/skins.minerva.scripts/pageIssuesParser.js', - 'resources/skins.minerva.scripts/DownloadIcon.js', + 'resources/skins.minerva.scripts/downloadPageAction.js', 'resources/skins.minerva.scripts/AB.js', 'resources/skins.minerva.scripts/PageIssuesOverlay.js', 'resources/skins.minerva.scripts/pageIssues.js', // test files - 'tests/qunit/skins.minerva.scripts/DownloadIcon.test.js', + 'tests/qunit/skins.minerva.scripts/downloadPageAction.test.js', 'tests/qunit/skins.minerva.scripts/pageIssuesParser.test.js', 'tests/qunit/skins.minerva.scripts/AB.test.js', 'tests/qunit/skins.minerva.scripts/pageIssues.test.js', diff --git a/resources/skins.minerva.scripts/DownloadIcon.js b/resources/skins.minerva.scripts/DownloadIcon.js deleted file mode 100644 index 5ccaabd..0000000 --- a/resources/skins.minerva.scripts/DownloadIcon.js +++ /dev/null @@ -1,151 +0,0 @@ -( function ( M, track ) { - var msg = mw.msg, - MAX_PRINT_TIMEOUT = 3000, - GLYPH = 'download', - Icon = M.require( 'mobile.startup/Icon' ), - browser = M.require( 'mobile.startup/Browser' ).getSingleton(); - - /** - * Helper function to retrieve the Android version - * @ignore - * @param {string} userAgent User Agent - * @return {number|false} An integer. - */ - function getAndroidVersion( userAgent ) { - var match = userAgent.toLowerCase().match( /android\s(\d\.]*)/ ); - return match ? parseInt( match[1] ) : false; - } - - /** - * Helper function to retrieve the Chrome/Chromium version - * @ignore - * @param {string} userAgent User Agent - * @return {number|false} An integer. - */ - function getChromeVersion( userAgent ) { - var match = userAgent.toLowerCase().match( /chrom(e|ium)\/(\d+)\./ ); - return match ? parseInt( match[2] ) : false; - } - - /** - * A download icon for triggering print functionality - * @class DownloadIcon - * @extends Icon - * - * @param {Skin} skin - * @param {number[]} [supportedNamespaces] - * @param {Window} [windowObj] window object - * @constructor - */ - function DownloadIcon( skin, supportedNamespaces, windowObj ) { - var options = {}; - this.skin = skin; - this.window = windowObj || {}; - this.supportedNamespaces = supportedNamespaces || [ 0 ]; - options.tagName = 'li'; - options.glyphPrefix = 'minerva'; - options.title = msg( 'minerva-download' ); - options.name = GLYPH; - Icon.call( this, options ); - } - - OO.mfExtend( DownloadIcon, Icon, { - /** - * Checks whether DownloadIcon is available for given user agent - * - * @memberof DownloadIcon - * @instance - * @param {string} userAgent User agent - * @return {boolean} - */ - isAvailable: function ( userAgent ) { - var androidVersion = getAndroidVersion( userAgent ), - chromeVersion = getChromeVersion( userAgent ), - page = this.skin.page; - - // Download button is restricted to certain namespaces T181152. - // Defaults to 0, in case cached JS has been served. - if ( this.supportedNamespaces.indexOf( page.getNamespaceId() ) === -1 || - page.isMainPage() ) { - // namespace is not supported or it's a main page - return false; - } - - if ( browser.isIos() || chromeVersion === false || - this.window.chrome === undefined - ) { - // we support only chrome/chromium on desktop/android - return false; - } - if ( ( androidVersion && androidVersion < 5 ) || chromeVersion < 41 ) { - return false; - } - return true; - }, - - /** - * Replace download icon with a spinner - * @memberof DownloadIcon - * @instance - */ - showSpinner: function () { - // FIXME: There is no spinner icon in Minerva, only in MobileFrontend - // Hopefully when T177432 is resolved this and corresponding change in hideSpinner - // should be unnecessary. - this.options.glyphPrefix = 'mf'; - this.options.name = 'spinner'; - this.render(); - }, - /** - * Restore download icon from spinner state - * @memberof DownloadIcon - * @instance - */ - hideSpinner: function () { - this.options.glyphPrefix = 'minerva'; - this.options.name = GLYPH; - this.render(); - }, - /** - * onClick handler for button that invokes print function - * @memberof DownloadIcon - * @instance - */ - onClick: function () { - var self = this, - hideSpinner = this.hideSpinner.bind( this ); - - function doPrint() { - self.timeout = clearTimeout( self.timeout ); - track( 'minerva.downloadAsPDF', { - action: 'callPrint' - } ); - window.print(); - hideSpinner(); - } - - function doPrintBeforeTimeout() { - if ( self.timeout ) { - doPrint(); - } - } - // The click handler may be invoked multiple times so if a pending print is occurring - // do nothing. - if ( !this.timeout ) { - track( 'minerva.downloadAsPDF', { - action: 'fetchImages' - } ); - this.showSpinner(); - // If all image downloads are taking longer to load then the MAX_PRINT_TIMEOUT - // abort the spinner and print regardless. - this.timeout = setTimeout( doPrint, MAX_PRINT_TIMEOUT ); - this.skin.loadImagesList().then( doPrintBeforeTimeout, doPrintBeforeTimeout ); - } - }, - events: { - click: 'onClick' - } - } ); - - M.define( 'skins.minerva.scripts/DownloadIcon', DownloadIcon ); -}( mw.mobileFrontend, mw.track ) ); diff --git a/resources/skins.minerva.scripts/downloadPageAction.js b/resources/skins.minerva.scripts/downloadPageAction.js new file mode 100644 index 0000000..920ddd0 --- /dev/null +++ b/resources/skins.minerva.scripts/downloadPageAction.js @@ -0,0 +1,153 @@ +( function ( M, track, msg ) { + var helpers, + MAX_PRINT_TIMEOUT = 3000, + GLYPH = 'download', + icons = M.require( 'mobile.startup/icons' ), + Icon = M.require( 'mobile.startup/Icon' ), + browser = M.require( 'mobile.startup/Browser' ).getSingleton(); + + /** + * Helper function to retrieve the Android version + * @ignore + * @param {string} userAgent User Agent + * @return {number|false} An integer. + */ + function getAndroidVersion( userAgent ) { + var match = userAgent.toLowerCase().match( /android\s(\d\.]*)/ ); + return match ? parseInt( match[1] ) : false; + } + + /** + * Helper function to retrieve the Chrome/Chromium version + * @ignore + * @param {string} userAgent User Agent + * @return {number|false} An integer. + */ + function getChromeVersion( userAgent ) { + var match = userAgent.toLowerCase().match( /chrom(e|ium)\/(\d+)\./ ); + return match ? parseInt( match[2] ) : false; + } + + helpers = { + /** + * Checks whether DownloadIcon is available for given user agent + * + * @memberof DownloadIcon + * @instance + * @param {Window} windowObj + * @param {Page} page to download + * @param {string} userAgent User agent + * @param {number[]} supportedNamespaces where printing is possible + * @return {boolean} + */ + isAvailable: function ( windowObj, page, userAgent, supportedNamespaces ) { + var androidVersion = getAndroidVersion( userAgent ), + chromeVersion = getChromeVersion( userAgent ); + + // Download button is restricted to certain namespaces T181152. + // Defaults to 0, in case cached JS has been served. + if ( supportedNamespaces.indexOf( page.getNamespaceId() ) === -1 || + page.isMainPage() ) { + // namespace is not supported or it's a main page + return false; + } + + if ( browser.isIos() || chromeVersion === false || + windowObj.chrome === undefined + ) { + // we support only chrome/chromium on desktop/android + return false; + } + if ( ( androidVersion && androidVersion < 5 ) || chromeVersion < 41 ) { + return false; + } + return true; + }, + /** + * onClick handler for button that invokes print function + * @param {Skin} skin + * @param {Icon} icon + * @param {Icon} spinner + */ + onClick: function ( skin, icon, spinner ) { + function doPrint() { + icon.timeout = clearTimeout( icon.timeout ); + track( 'minerva.downloadAsPDF', { + action: 'callPrint' + } ); + window.print(); + icon.$el.show(); + spinner.$el.hide(); + } + + function doPrintBeforeTimeout() { + if ( icon.timeout ) { + doPrint(); + } + } + // The click handler may be invoked multiple times so if a pending print is occurring + // do nothing. + if ( !icon.timeout ) { + track( 'minerva.downloadAsPDF', { + action: 'fetchImages' + } ); + icon.$el.hide(); + spinner.$el.show(); + // If all image downloads are taking longer to load then the MAX_PRINT_TIMEOUT + // abort the spinner and print regardless. + icon.timeout = setTimeout( doPrint, MAX_PRINT_TIMEOUT ); + skin.loadImagesList().then( doPrintBeforeTimeout, doPrintBeforeTimeout ); + } + } + }; + + /** + * Gets a click handler for the download icon + * Expects to be run in the context of an icon using `Function.bind` + * + * @param {Skin} skin + * @param {Icon} spinner + * @returns {function} + */ + function getOnClickHandler( skin, spinner ) { + return function () { + helpers.onClick( skin, this, spinner ); + }; + } + + /** + * Generate a download icon for triggering print functionality if + * printing is available + * + * @param {Skin} skin + * @param {number[]} supportedNamespaces + * @param {Window} [windowObj] window object + * @returns {jQuery.Object|null} + */ + function downloadPageAction( skin, supportedNamespaces, windowObj ) { + var icon, spinner = icons.spinner(); + if ( + helpers.isAvailable( + windowObj, skin.page, navigator.userAgent, + supportedNamespaces + ) + ) { + icon = new Icon( { + glyphPrefix: 'minerva', + title: msg( 'minerva-download' ), + name: GLYPH, + events: { + // will be bound to `this` + click: getOnClickHandler( skin, spinner ) + } + } ); + return $( '
  • ' ).append( icon.$el ).append( spinner.$el.hide() ); + } else { + return null; + } + } + + M.define( 'skins.minerva.scripts/test/getOnClickHandler', getOnClickHandler ); + M.define( 'skins.minerva.scripts/test/isAvailable', helpers.isAvailable ); + M.define( 'skins.minerva.scripts/downloadPageAction', downloadPageAction ); +}( mw.mobileFrontend, mw.track, mw.msg ) ); diff --git a/resources/skins.minerva.scripts/init.js b/resources/skins.minerva.scripts/init.js index 1c95d3e..fd91732 100644 --- a/resources/skins.minerva.scripts/init.js +++ b/resources/skins.minerva.scripts/init.js @@ -4,7 +4,7 @@ time = M.require( 'mobile.startup/time' ), skin = M.require( 'mobile.init/skin' ), issues = M.require( 'skins.minerva.scripts/pageIssues' ), - DownloadIcon = M.require( 'skins.minerva.scripts/DownloadIcon' ), + downloadPageAction = M.require( 'skins.minerva.scripts/downloadPageAction' ), browser = M.require( 'mobile.startup/Browser' ).getSingleton(), loader = M.require( 'mobile.startup/rlModuleLoader' ), router = require( 'mediawiki.router' ), @@ -274,14 +274,15 @@ * @ignore */ function appendDownloadButton() { - var downloadIcon = new DownloadIcon( skin, config.get( 'wgMinervaDownloadNamespaces' ), window ); + var $downloadAction = downloadPageAction( skin, + config.get( 'wgMinervaDownloadNamespaces', [] ), window ); - if ( downloadIcon.isAvailable( navigator.userAgent ) ) { + if ( $downloadAction ) { // Because the page actions are floated to the right, their order in the // DOM is reversed in the display. The watchstar is last in the DOM and // left-most in the display. Since we want the download button to be to // the left of the watchstar, we put it after it in the DOM. - downloadIcon.$el.insertAfter( '#ca-watch' ); + $downloadAction.insertAfter( '#ca-watch' ); track( 'minerva.downloadAsPDF', { action: 'buttonVisible' } ); diff --git a/skin.json b/skin.json index d0ab272..cbee1db 100644 --- a/skin.json +++ b/skin.json @@ -427,7 +427,7 @@ "scripts": [ "resources/skins.minerva.scripts/errorLogging.js", "resources/skins.minerva.scripts/preInit.js", - "resources/skins.minerva.scripts/DownloadIcon.js", + "resources/skins.minerva.scripts/downloadPageAction.js", "resources/skins.minerva.scripts/pageIssuesParser.js", "resources/skins.minerva.scripts/AB.js", "resources/skins.minerva.scripts/PageIssuesOverlay.js", diff --git a/tests/qunit/skins.minerva.scripts/DownloadIcon.test.js b/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js similarity index 57% rename from tests/qunit/skins.minerva.scripts/DownloadIcon.test.js rename to tests/qunit/skins.minerva.scripts/downloadPageAction.test.js index 9fcf64f..2a48217 100644 --- a/tests/qunit/skins.minerva.scripts/DownloadIcon.test.js +++ b/tests/qunit/skins.minerva.scripts/downloadPageAction.test.js @@ -2,10 +2,13 @@ var VALID_UA = 'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Mobile Safari/537.36', VALID_SUPPORTED_NAMESPACES = [ 0 ], Skin = M.require( 'mobile.startup/Skin' ), + icons = M.require( 'mobile.startup/icons' ), Deferred = $.Deferred, windowChrome = { chrome: true }, + downloadIcon = icons.spinner(), windowNotChrome = {}, - DownloadIcon = M.require( 'skins.minerva.scripts/DownloadIcon' ), + getOnClickHandler = M.require( 'skins.minerva.scripts/test/getOnClickHandler' ), + isAvailable = M.require( 'skins.minerva.scripts/test/isAvailable' ), browser = M.require( 'mobile.startup/Browser' ).getSingleton(), Page = M.require( 'mobile.startup/Page' ); @@ -17,17 +20,20 @@ off: function () {} } } ); + this.getOnClickHandler = function ( skin ) { + return getOnClickHandler( skin, icons.spinner() ).bind( downloadIcon ); + }; } } ); - QUnit.test( '#DownloadIcon (print after image download)', function ( assert ) { - var icon = new DownloadIcon( this.skin ), + QUnit.test( '#getOnClickHandler (print after image download)', function ( assert ) { + var handler = this.getOnClickHandler( this.skin ), d = Deferred(), spy = this.sandbox.stub( window, 'print' ); this.sandbox.stub( this.skin, 'loadImagesList' ).returns( d.resolve() ); - icon.onClick(); + handler(); d.then( function () { assert.strictEqual( spy.callCount, 1, 'Print occurred.' ); } ); @@ -35,8 +41,8 @@ return d; } ); - QUnit.test( '#DownloadIcon (print via timeout)', function ( assert ) { - var icon = new DownloadIcon( this.skin ), + QUnit.test( '#getOnClickHandler (print via timeout)', function ( assert ) { + var handler = this.getOnClickHandler( this.skin ), d = Deferred(), spy = this.sandbox.stub( window, 'print' ); @@ -46,7 +52,7 @@ d.resolve(); }, 3400 ); - icon.onClick(); + handler(); d.then( function () { assert.strictEqual( spy.callCount, 1, 'Print was called once despite loadImagesList resolving after MAX_PRINT_TIMEOUT' ); @@ -55,8 +61,8 @@ return d; } ); - QUnit.test( '#DownloadIcon (multiple clicks)', function ( assert ) { - var icon = new DownloadIcon( this.skin ), + QUnit.test( '#getOnClickHandler (multiple clicks)', function ( assert ) { + var handler = this.getOnClickHandler( this.skin ), d = Deferred(), spy = this.sandbox.stub( window, 'print' ); @@ -66,8 +72,8 @@ d.resolve(); }, 3400 ); - icon.onClick(); - icon.onClick(); + handler(); + handler(); d.then( function () { assert.strictEqual( spy.callCount, 1, 'Print was called once despite multiple clicks' ); @@ -76,104 +82,103 @@ return d; } ); - QUnit.module( 'Minerva DownloadIcon.isAvailable()', { + QUnit.module( 'isAvailable()', { beforeEach: function () { + var page = new Page( { + id: 0, + title: 'Test', + isMainPage: false + } ); + this.page = page; this.skin = new Skin( { eventBus: { on: function () {}, off: function () {} }, - page: new Page( { - id: 0, - title: 'Test', - isMainPage: false - } ) + page: page } ); + this.isAvailable = function ( ua ) { + return isAvailable( windowChrome, page, ua, + VALID_SUPPORTED_NAMESPACES ); + }; + this.notChromeIsAvailable = function ( ua ) { + return isAvailable( windowNotChrome, page, ua, + VALID_SUPPORTED_NAMESPACES ); + }; } } ); QUnit.test( 'isAvailable() handles properly correct namespace', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowChrome ); - assert.ok( icon.isAvailable( VALID_UA ) ); + assert.ok( this.isAvailable( VALID_UA ) ); } ); QUnit.test( 'isAvailable() handles properly not supported namespace', function ( assert ) { - var icon = new DownloadIcon( this.skin, [ 9999 ], windowChrome ); - assert.notOk( icon.isAvailable( VALID_UA ) ); + assert.notOk( isAvailable( windowChrome, this.page, VALID_UA, [ 9999 ] ) ); } ); QUnit.test( 'isAvailable() handles properly main page', function ( assert ) { - var icon; - this.skin.page = new Page( { + var page = new Page( { id: 0, title: 'Test', isMainPage: true } ); - icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowChrome ); - assert.notOk( icon.isAvailable( VALID_UA ) ); + assert.notOk( isAvailable( windowChrome, page, VALID_UA, VALID_SUPPORTED_NAMESPACES ) ); } ); QUnit.test( 'isAvailable() returns false for iOS', function ( assert ) { - var icon; this.sandbox.stub( browser, 'isIos' ).returns( true ); - icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowChrome ); - assert.notOk( icon.isAvailable( VALID_UA ) ); + assert.notOk( this.isAvailable( VALID_UA ) ); } ); QUnit.test( 'isAvailable() uses window.chrome to filter certain chrome-like browsers', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowNotChrome ); // Dolphin - assert.notOk( icon.isAvailable( ' Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36' ) ); + assert.notOk( this.notChromeIsAvailable( ' Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/61.0.3163.98 Mobile Safari/537.36' ) ); // Opera - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Mobile Safari/537.36 OPR/44.1.2246.123029' ) ); + assert.notOk( this.notChromeIsAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.116 Mobile Safari/537.36 OPR/44.1.2246.123029' ) ); // Maxthon - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 MxBrowser/4.5.10.1300' ) ); + assert.notOk( this.notChromeIsAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SM-G950U1 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36 MxBrowser/4.5.10.1300' ) ); } ); QUnit.test( 'isAvailable() handles properly browsers', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowChrome ); // IPhone 6 Safari - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A405 Safari/601.1' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A405 Safari/601.1' ) ); // Nokia Lumia 930 Windows Phone 8.1 - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' ) ); // Firefox @ Ubuntu - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0' ) ); } ); QUnit.test( 'isAvailable() handles properly non-chrome browsers', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowNotChrome ); // IPhone 6 Safari - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A405 Safari/601.1' ) ); + assert.notOk( this.notChromeIsAvailable( 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A405 Safari/601.1' ) ); // Nokia Lumia 930 Windows Phone 8.1 - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' ) ); + assert.notOk( this.notChromeIsAvailable( 'Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; Microsoft; Virtual) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537' ) ); // Firefox @ Ubuntu - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0' ) ); + assert.notOk( this.notChromeIsAvailable( 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0' ) ); } ); QUnit.test( 'isAvailable() handles properly old devices', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES ); // Samsung Galaxy S5, Android 4.4, Chrome 28 - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.6 Chrome/28.0.1500.94 Mobile Safari/537.36' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-G900F Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.6 Chrome/28.0.1500.94 Mobile Safari/537.36' ) ); // Samsung Galaxyu S1, Android 4.2.2 Cyanogenmod + built in Samsung Browser - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-ca; GT-I9000 Build/JDQ39E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 CyanogenMod/10.1.0/galaxysmtd' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (Linux; U; Android 4.2.2; en-ca; GT-I9000 Build/JDQ39E) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 CyanogenMod/10.1.0/galaxysmtd' ) ); // Samsung Galaxy S3 - assert.notOk( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 4.3; GT-I9300 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36' ) ); + assert.notOk( this.isAvailable( 'Mozilla/5.0 (Linux; Android 4.3; GT-I9300 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36' ) ); } ); QUnit.test( 'isAvailable() handles properly supported browsers', function ( assert ) { - var icon = new DownloadIcon( this.skin, VALID_SUPPORTED_NAMESPACES, windowChrome ); // Samsung Galaxy S7, Android 6, Chrome 44 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (Linux; Android 6.0.1; SAMSUNG SM-G930F Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36' ) ); // Samsung Galaxy A5, Android 7, Samsung Browser 5.2 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-A510F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/5.2 Chrome/51.0.2704.106 Mobile Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-A510F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/5.2 Chrome/51.0.2704.106 Mobile Safari/537.36' ) ); // Galaxy J2, Android 5, Chrome 65 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 5.1.1; SM-J200G Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3320.0 Mobile Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (Linux; Android 5.1.1; SM-J200G Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3320.0 Mobile Safari/537.36' ) ); // Desktop, Chrome 63 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36' ) ); // Desktop, Ubuntu, Chromium 61 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36' ) ); // Galaxy S8, Android 8, Samsung Browser 6.2 - assert.ok( icon.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G950U1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/6.2 Chrome/56.0.2924.87 Mobile Safari/537.36' ) ); + assert.ok( this.isAvailable( 'Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G950U1 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/6.2 Chrome/56.0.2924.87 Mobile Safari/537.36' ) ); } ); }( mw.mobileFrontend ) );