From 201c531902a3fe18d512a47941f3fbb40471c947 Mon Sep 17 00:00:00 2001 From: jordangarcia Date: Fri, 14 Jun 2019 16:44:08 -0700 Subject: [PATCH 1/5] Add onpagehide event automatically in browser --- packages/optimizely-sdk/lib/index.browser.js | 38 ++++++++++++++----- .../lib/index.browser.umdtests.js | 18 +++++++++ .../optimizely-sdk/lib/utils/enums/index.js | 1 + 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 458ef532b..c989a2123 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -28,6 +28,7 @@ var logger = logging.getLogger(); logging.setLogHandler(loggerPlugin.createLogger()); logging.setLogLevel(logging.LogLevel.INFO); +var MODULE_NAME = 'INDEX_BROWSER'; var hasRetriedEvents = false; /** * Entry point into the Optimizely Browser SDK @@ -101,16 +102,35 @@ module.exports = { eventDispatcher = config.eventDispatcher; } - config = fns.assignIn({ - clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE, - }, config, { - eventDispatcher: eventDispatcher, - // always get the OptimizelyLogger facade from logging - logger: logger, - errorHandler: logging.getErrorHandler(), - }); + config = fns.assignIn( + { + clientEngine: enums.JAVASCRIPT_CLIENT_ENGINE, + }, + config, + { + eventDispatcher: eventDispatcher, + // always get the OptimizelyLogger facade from logging + logger: logger, + errorHandler: logging.getErrorHandler(), + } + ); + + var optimizely = new Optimizely(config); + + try { + var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; + window.addEventListener( + unloadEvent, + function() { + optimizely.close(); + }, + false + ); + } catch (e) { + logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); + } - return new Optimizely(config); + return optimizely; } catch (e) { logger.error(e); return null; diff --git a/packages/optimizely-sdk/lib/index.browser.umdtests.js b/packages/optimizely-sdk/lib/index.browser.umdtests.js index 88ef1f394..fac40bfd3 100644 --- a/packages/optimizely-sdk/lib/index.browser.umdtests.js +++ b/packages/optimizely-sdk/lib/index.browser.umdtests.js @@ -16,6 +16,7 @@ var configValidator = require('./utils/config_validator'); var enums = require('./utils/enums'); var logger = require('./plugins/logger'); +var Optimizely = require('./optimizely'); var packageJSON = require('../package.json'); var eventDispatcher = require('./plugins/event_dispatcher/index.browser'); @@ -40,6 +41,7 @@ describe('javascript-sdk', function() { logToConsole: false, }); sinon.stub(configValidator, 'validate'); + sinon.stub(Optimizely.prototype, 'close'); xhr = sinon.useFakeXMLHttpRequest(); global.XMLHttpRequest = xhr; @@ -52,6 +54,8 @@ describe('javascript-sdk', function() { sinon.spy(console, 'info'); sinon.spy(console, 'warn'); sinon.spy(console, 'error'); + + sinon.spy(window, 'addEventListener'); }); afterEach(function() { @@ -59,7 +63,9 @@ describe('javascript-sdk', function() { console.info.restore(); console.warn.restore(); console.error.restore(); + window.addEventListener.restore(); configValidator.validate.restore(); + Optimizely.prototype.close.restore(); xhr.restore(); }); @@ -292,6 +298,18 @@ describe('javascript-sdk', function() { var variation = optlyInstance.getVariation('testExperimentNotRunning', 'testUser'); assert.strictEqual(variation, null); }); + + it('should hook into window `pagehide` event', function() { + var optlyInstance = window.optimizelySdk.createInstance({ + datafile: testData.getTestProjectConfig(), + errorHandler: fakeErrorHandler, + eventDispatcher: eventDispatcher, + logger: silentLogger, + }); + + sinon.assert.calledOnce(window.addEventListener); + sinon.assert.calledWith(window.addEventListener, sinon.match('pagehide').or(sinon.match('unload'))); + }); }); }); }); diff --git a/packages/optimizely-sdk/lib/utils/enums/index.js b/packages/optimizely-sdk/lib/utils/enums/index.js index 07874507a..ec70cbcdb 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.js +++ b/packages/optimizely-sdk/lib/utils/enums/index.js @@ -138,6 +138,7 @@ exports.LOG_MESSAGES = { UNKNOWN_MATCH_TYPE: '%s: Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.', UPDATED_OPTIMIZELY_CONFIG: '%s: Updated Optimizely config to revision %s (project id %s)', OUT_OF_BOUNDS: '%s: Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].', + UNABLE_TO_ATTACH_UNLOAD: '%s: unable to bind optimizely.close() to page unload event: "%s"', }; exports.RESERVED_EVENT_KEYWORDS = { From 71f0dfc6ee7f31e5e39d00fc4492a23fed27cdfa Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 16 Aug 2019 09:25:27 -0700 Subject: [PATCH 2/5] Only call addEventListener when it exists --- packages/optimizely-sdk/lib/index.browser.js | 24 +++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index c989a2123..971f6a867 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -117,17 +117,19 @@ module.exports = { var optimizely = new Optimizely(config); - try { - var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; - window.addEventListener( - unloadEvent, - function() { - optimizely.close(); - }, - false - ); - } catch (e) { - logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); + if (typeof window.addEventListener === 'function') { + try { + var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; + window.addEventListener( + unloadEvent, + function() { + optimizely.close(); + }, + false + ); + } catch (e) { + logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); + } } return optimizely; From 0f341e508eb77d0b959906bf077e7325c1795d90 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 16 Aug 2019 09:27:43 -0700 Subject: [PATCH 3/5] Put typeof test inside try/catch --- packages/optimizely-sdk/lib/index.browser.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 971f6a867..5764c00a9 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -117,20 +117,20 @@ module.exports = { var optimizely = new Optimizely(config); - if (typeof window.addEventListener === 'function') { try { - var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; - window.addEventListener( - unloadEvent, - function() { - optimizely.close(); - }, - false - ); + if (typeof window.addEventListener === 'function') { + var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; + window.addEventListener( + unloadEvent, + function() { + optimizely.close(); + }, + false + ); + } } catch (e) { logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); } - } return optimizely; } catch (e) { From 1cdfbe5c4fc44771c8b361116755adc73721a84e Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 16 Aug 2019 09:41:18 -0700 Subject: [PATCH 4/5] Fix indentation --- packages/optimizely-sdk/lib/index.browser.js | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index 5764c00a9..61faec844 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -117,20 +117,20 @@ module.exports = { var optimizely = new Optimizely(config); - try { - if (typeof window.addEventListener === 'function') { - var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; - window.addEventListener( - unloadEvent, - function() { - optimizely.close(); - }, - false - ); - } - } catch (e) { - logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); + try { + if (typeof window.addEventListener === 'function') { + var unloadEvent = 'onpagehide' in window ? 'pagehide' : 'unload'; + window.addEventListener( + unloadEvent, + function() { + optimizely.close(); + }, + false + ); } + } catch (e) { + logger.error(enums.LOG_MESSAGES.UNABLE_TO_ATTACH_UNLOAD, MODULE_NAME, e.message); + } return optimizely; } catch (e) { From 7bb511a32aed3ede3169cbd9795fe9295a862746 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 16 Aug 2019 12:35:54 -0700 Subject: [PATCH 5/5] Formatting --- packages/optimizely-sdk/lib/index.browser.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/index.browser.js b/packages/optimizely-sdk/lib/index.browser.js index e229d3fb0..c796ca61d 100644 --- a/packages/optimizely-sdk/lib/index.browser.js +++ b/packages/optimizely-sdk/lib/index.browser.js @@ -29,7 +29,6 @@ var logger = logging.getLogger(); logging.setLogHandler(loggerPlugin.createLogger()); logging.setLogLevel(logging.LogLevel.INFO); - var MODULE_NAME = 'INDEX_BROWSER'; var DEFAULT_EVENT_BATCH_SIZE = 10;