Skip to content

Commit 7745ea7

Browse files
committed
Added Optimizely contexts (closes snowplow#448)
1 parent aa6c394 commit 7745ea7

2 files changed

Lines changed: 231 additions & 0 deletions

File tree

src/js/lib/helpers.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,22 @@
322322
return window.location.hostname;
323323
};
324324

325+
/**
326+
* Checks whether a value is present within an array
327+
*
328+
* @param val The value to check for
329+
* @param array The array to check within
330+
* @return boolean Whether it exists
331+
*/
332+
object.isValueInArray = function (val, array) {
333+
for (var i = 0; i < array.length; i++) {
334+
if (array[i] === val) {
335+
return true;
336+
}
337+
}
338+
return false;
339+
}
340+
325341
/**
326342
* Deletes an arbitrary cookie by setting the expiration date to the past
327343
*

src/js/tracker.js

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,12 +738,46 @@
738738
*/
739739
function addCommonContexts(userContexts) {
740740
var combinedContexts = commonContexts.concat(userContexts || []);
741+
742+
// Add PerformanceTiming Context
741743
if (autoContexts.performanceTiming) {
742744
var performanceTimingContext = getPerformanceTimingContext();
743745
if (performanceTimingContext) {
744746
combinedContexts.push(performanceTimingContext);
745747
}
746748
}
749+
750+
// Add Optimizely Contexts
751+
if (window['optimizely']) {
752+
753+
if (autoContexts.optimizelyExperiments) {
754+
combinedContexts = combinedContexts.concat(getOptimizelyExperimentContexts());
755+
}
756+
757+
if (autoContexts.optimizelyStates) {
758+
combinedContexts = combinedContexts.concat(getOptimizelyStateContexts());
759+
}
760+
761+
if (autoContexts.optimizelyVariations) {
762+
combinedContexts = combinedContexts.concat(getOptimizelyVariationContexts());
763+
}
764+
765+
if (autoContexts.optimizelyVisitor) {
766+
var optimizelyVisitorContext = getOptimizelyVisitorContext();
767+
if (optimizelyVisitorContext) {
768+
combinedContexts.push(optimizelyVisitorContext);
769+
}
770+
}
771+
772+
if (autoContexts.optimizelyAudiences) {
773+
combinedContexts = combinedContexts.concat(getOptimizelyAudienceContexts());
774+
}
775+
776+
if (autoContexts.optimizelyDimensions) {
777+
combinedContexts = combinedContexts.concat(getOptimizelyDimensionContexts());
778+
}
779+
}
780+
747781
return combinedContexts;
748782
}
749783

@@ -795,6 +829,187 @@
795829
}
796830
}
797831

832+
/**
833+
* Creates a context from the window['optimizely'].data.experiments object
834+
*
835+
* @return array Experiment contexts
836+
*/
837+
function getOptimizelyExperimentContexts() {
838+
var experiments = window['optimizely'].data.experiments;
839+
if (experiments) {
840+
var contexts = [];
841+
842+
for (var key in experiments) {
843+
var context = {};
844+
context['id'] = key;
845+
var e = experiments[key];
846+
if (e.hasOwnProperty('code')) context['code'] = e.code;
847+
if (e.hasOwnProperty('manual')) context['manual'] = e.manual;
848+
if (e.hasOwnProperty('conditional')) context['conditional'] = e.conditional;
849+
if (e.hasOwnProperty('name')) context['name'] = e.name;
850+
if (e.hasOwnProperty('variation_ids')) context['variationIds'] = e.variation_ids;
851+
852+
contexts.push({
853+
schema: 'iglu:com.optimizely/experiment/jsonschema/1-0-0',
854+
data: context
855+
});
856+
}
857+
return contexts;
858+
}
859+
return [];
860+
}
861+
862+
/**
863+
* Creates a context from the window['optimizely'].data.state object
864+
*
865+
* @return array State contexts
866+
*/
867+
function getOptimizelyStateContexts() {
868+
var experimentIds = [];
869+
var experiments = window['optimizely'].data.experiments;
870+
if (experiments) {
871+
for (var key in experiments) {
872+
experimentIds.push(key);
873+
}
874+
}
875+
876+
var state = window['optimizely'].data.state;
877+
if (state) {
878+
var contexts = [];
879+
var activeExperiments = state.hasOwnProperty('activeExperiments') ? state.activeExperiments : [];
880+
881+
for (var i = 0; i < experimentIds.length; i++) {
882+
var experimentId = experimentIds[i];
883+
var context = {};
884+
context['experimentId'] = experimentId;
885+
context['isActive'] = helpers.isValueInArray(experimentIds[i], activeExperiments);
886+
var variationMap = state.hasOwnProperty('variationMap') ? state.variationMap : {};
887+
if (variationMap.hasOwnProperty(experimentId)) context['variationIndex'] = variationMap[experimentId];
888+
var variationIdsMap = state.hasOwnProperty('variationIdsMap') ? state.variationIdsMap : {};
889+
if (variationIdsMap.hasOwnProperty(experimentId) && variationIdsMap[experimentId].length === 1) context['variationId'] = variationIdsMap[experimentId][0];
890+
var variationNamesMap = state.hasOwnProperty('variationNamesMap') ? state.variationNamesMap : {};
891+
if (variationNamesMap.hasOwnProperty(experimentId)) context['variationName'] = variationNamesMap[experimentId];
892+
893+
contexts.push({
894+
schema: 'iglu:com.optimizely/state/jsonschema/1-0-0',
895+
data: context
896+
});
897+
}
898+
return contexts;
899+
}
900+
return [];
901+
}
902+
903+
/**
904+
* Creates a context from the window['optimizely'].data.variations object
905+
*
906+
* @return array Variation contexts
907+
*/
908+
function getOptimizelyVariationContexts() {
909+
var variations = window['optimizely'].data.variations;
910+
if (variations) {
911+
var contexts = [];
912+
913+
for (var key in variations) {
914+
var context = {};
915+
context['id'] = key;
916+
var variation = variations[key];
917+
if (variation.hasOwnProperty('name')) context['name'] = variation.name;
918+
if (variation.hasOwnProperty('code')) context['code'] = variation.code;
919+
920+
contexts.push({
921+
schema: 'iglu:com.optimizely/variation/jsonschema/1-0-0',
922+
data: context
923+
});
924+
}
925+
return contexts;
926+
}
927+
return [];
928+
}
929+
930+
/**
931+
* Creates a context from the window['optimizely'].data.visitor object
932+
*
933+
* @return object Visitor context
934+
*/
935+
function getOptimizelyVisitorContext() {
936+
var visitor = window['optimizely'].data.visitor;
937+
if (visitor) {
938+
var context = {};
939+
if (visitor.hasOwnProperty('browser')) context['browser'] = visitor.browser;
940+
if (visitor.hasOwnProperty('browserVersion')) context['browserVersion'] = visitor.browserVersion;
941+
if (visitor.hasOwnProperty('device')) context['device'] = visitor.device;
942+
if (visitor.hasOwnProperty('deviceType')) context['deviceType'] = visitor.deviceType;
943+
if (visitor.hasOwnProperty('ip')) context['ip'] = visitor.ip;
944+
var platform = visitor.hasOwnProperty('platform') && visitor.platform ? visitor.platform : {};
945+
if (platform.hasOwnProperty('id')) context['platformId'] = platform.id;
946+
if (platform.hasOwnProperty('version')) context['platformVersion'] = platform.version;
947+
var location = visitor.hasOwnProperty('location') && visitor.location ? visitor.location : {};
948+
if (location.hasOwnProperty('city')) context['locationCity'] = location.city;
949+
if (location.hasOwnProperty('region')) context['locationRegion'] = location.region;
950+
if (location.hasOwnProperty('country')) context['locationCountry'] = location.country;
951+
if (visitor.hasOwnProperty('mobile')) context['mobile'] = visitor.mobile;
952+
if (visitor.hasOwnProperty('mobileId')) context['mobileId'] = visitor.mobileId;
953+
if (visitor.hasOwnProperty('referrer')) context['referrer'] = visitor.referrer;
954+
if (visitor.hasOwnProperty('os')) context['os'] = visitor.os;
955+
956+
return {
957+
schema: 'iglu:com.optimizely/visitor/jsonschema/1-0-0',
958+
data: context
959+
};
960+
}
961+
}
962+
963+
/**
964+
* Creates a context from the window['optimizely'].data.visitor.audiences object
965+
*
966+
* @return array VisitorAudience contexts
967+
*/
968+
function getOptimizelyAudienceContexts() {
969+
var audienceIds = window['optimizely'].data.visitor.audiences;
970+
if (audienceIds) {
971+
var contexts = [];
972+
973+
for (var key in audienceIds) {
974+
var context = {};
975+
context['id'] = key;
976+
context['isMember'] = audienceIds[key];
977+
978+
contexts.push({
979+
schema: 'iglu:com.optimizely/visitor_audience/jsonschema/1-0-0',
980+
data: context
981+
});
982+
}
983+
return contexts;
984+
}
985+
return [];
986+
}
987+
988+
/**
989+
* Creates a context from the window['optimizely'].data.visitor.dimensions object
990+
*
991+
* @return array VisitorDimension contexts
992+
*/
993+
function getOptimizelyDimensionContexts() {
994+
var dimensionIds = window['optimizely'].data.visitor.dimensions;
995+
if (dimensionIds) {
996+
var contexts = [];
997+
998+
for (var key in dimensionIds) {
999+
var context = {};
1000+
context['id'] = key;
1001+
context['value'] = dimensionIds[key];
1002+
1003+
contexts.push({
1004+
schema: 'iglu:com.optimizely/visitor_dimension/jsonschema/1-0-0',
1005+
data: context
1006+
});
1007+
}
1008+
return contexts;
1009+
}
1010+
return [];
1011+
}
1012+
7981013
/**
7991014
* Attempts to create a context using the geolocation API and add it to commonContexts
8001015
*/

0 commit comments

Comments
 (0)