module.exports = function NativeUrlServiceFactory($window, $timeout) { var service = {} // Ways of opening native URLs: // - window.open // - window.location.href // Ways of detecting failure: // - new window timeout // - window onblur timeout // - javascript single thread time elapsed // Browser Behaviours: // - Chrome Mac: 25ms timeout OK // - Firefox Mac: 250ms timeout OK, 1000ms timeout better // - Safari Mac: no working fallback, may need 2 html pages // navigator.userAgent.match() // TODO: Find which method works well in every browser var fallbackMethod = 'USE_ON_BLUR' var wasBlured = false var windowOpened // TODO: use a central on-blur event var cachedWindowOnBlur = $window.onblur service.open = function (options) { switch (fallbackMethod) { case 'USE_NEW_WINDOW': // Doesn't work well on Chrome windowOpened = $window.open(options.nativeUrl) $timeout(function () { if (windowOpened) { windowOpened.close() } }, 500) $window.location.href = options.webUrl break; case 'USE_ON_BLUR': // Doesn't work on Safari $window.onblur = function () { wasBlured = true } $window.location.href = options.nativeUrl $timeout(function () { if (wasBlured) { wasBlured = false } else { $window.open(options.webUrl, '_blank') } $window.onblur = cachedWindowOnBlur }, 250) break; case 'USE_TIME_ELAPSED': // Doesn't work on Chrome var start, end, elapsed start = new Date().getTime() console.log(' window.performance.webkitNow()', window.performance.now()) // This depends on the fact that JS is single-thread document.location = options.nativeUrl end = new Date().getTime() elapsed = (end - start) if (elapsed < 1) { document.location = options.webUrl } break; default: } } return service }