diff --git a/integrations/facebook-pixel/HISTORY.md b/integrations/facebook-pixel/HISTORY.md index c16b471bb..8bd36ed00 100644 --- a/integrations/facebook-pixel/HISTORY.md +++ b/integrations/facebook-pixel/HISTORY.md @@ -1,3 +1,17 @@ +2.11.1/ 2020-07-22 +================== + + * Add support to override the Data Processing Options by pass them in the load options object. + ``` + analytics.load("", { + integrations: { + 'Facebook Pixel': { + dataProcessingOptions: [['LDU'], 1, 1000] + } + } + }); + ``` + 2.11.0/ 2020-07-16 ================== diff --git a/integrations/facebook-pixel/lib/index.js b/integrations/facebook-pixel/lib/index.js index da319459f..6c471b36b 100644 --- a/integrations/facebook-pixel/lib/index.js +++ b/integrations/facebook-pixel/lib/index.js @@ -104,7 +104,9 @@ FacebookPixel.prototype.initialize = function() { window.fbq('set', 'autoConfig', false, this.options.pixelId); } if (this.options.limitedDataUse) { - window.fbq('dataProcessingOptions', ['LDU'], 0, 0); + this.validateAndSetDataProcessing( + this.options.dataProcessingOptions || [['LDU'], 0, 0] + ); } if (this.options.initWithExistingTraits) { var traits = this.formatTraits(this.analytics); @@ -718,6 +720,29 @@ FacebookPixel.prototype.buildPayload = function(track, isStandardEvent) { return payload; }; +/** + * Validates that a set of parameters are formatted correctly and passes them to the pixel instance. + * https://developers.facebook.com/docs/marketing-apis/data-processing-options#reference + * + * @param {Array} options + * + * @api private + */ +FacebookPixel.prototype.validateAndSetDataProcessing = function(params) { + var lenOk = params.length === 3; + var valOk = + Array.isArray(params[0]) && + typeof params[1] === 'number' && + typeof params[2] === 'number'; + + // Pass the data processing options if they're valid, otherwise, fallback to geolocation. + if (lenOk && valOk) { + window.fbq('dataProcessingOptions', params[0], params[1], params[2]); + } else { + window.fbq('dataProcessingOptions', ['LDU'], 0, 0); + } +}; + /** * Merge two javascript objects. This works similarly to `Object.assign({}, obj1, obj2)` * but it's compatible with old browsers. The properties of the first argument takes preference diff --git a/integrations/facebook-pixel/package.json b/integrations/facebook-pixel/package.json index 6910bbd81..6e96ee045 100644 --- a/integrations/facebook-pixel/package.json +++ b/integrations/facebook-pixel/package.json @@ -1,7 +1,7 @@ { "name": "@segment/analytics.js-integration-facebook-pixel", "description": "The Facebook Pixel analytics.js integration.", - "version": "2.11.0", + "version": "2.11.1", "keywords": [ "analytics.js", "analytics.js-integration", diff --git a/integrations/facebook-pixel/test/index.test.js b/integrations/facebook-pixel/test/index.test.js index 7e85a6eb8..4e3a8c5c2 100644 --- a/integrations/facebook-pixel/test/index.test.js +++ b/integrations/facebook-pixel/test/index.test.js @@ -200,6 +200,38 @@ describe('Facebook Pixel', function() { ); }); }); + + describe('#initialize with preset data processing options', function() { + before(function() { + options.dataProcessingOptions = [['LDU'], 99, 99]; + }); + + after(function() { + delete options.dataProcessingOptions; + }); + + it('should call dataProcessingOptions with the preset values', function() { + analytics.stub(window, 'fbq'); + analytics.initialize(); + analytics.called(window.fbq, 'dataProcessingOptions', ['LDU'], 99, 99); + }); + }); + + describe('#initialize with fallback data processing options', function() { + before(function() { + options.dataProcessingOptions = ['a string', true, 99]; + }); + + after(function() { + delete options.dataProcessingOptions; + }); + + it('should call dataProcessingOptions with fallback values', function() { + analytics.stub(window, 'fbq'); + analytics.initialize(); + analytics.called(window.fbq, 'dataProcessingOptions', ['LDU'], 0, 0); + }); + }); }); describe('loading', function() {