Skip to content

Commit f6d5935

Browse files
fix(core): fix issue with user_data getting overriden when DMA params are added (#995)
- fix issue with user_data getting overriden when DMA params are added for v2/event APIs when user_data is already present - adds an error callback for setDMAParamsForEEA method
1 parent 0942bed commit f6d5935

File tree

7 files changed

+58
-24
lines changed

7 files changed

+58
-24
lines changed

.jshintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,6 @@
2828
"undef": true,
2929
"unused": true,
3030
"esversion": 6,
31-
"-W138": true
31+
"-W138": true,
32+
"-W073": true
3233
}

example.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ <h4>QR Code</h4>
8282
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
8383
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
8484
<script type="text/javascript">
85-
(function(b,r,a,n,c,h,_,s,d,k){if(!b[n]||!b[n]._q){for(;s<_.length;)c(h,_[s++]);d=r.createElement(a);d.async=1;d.src="https://cdn.branch.io/branch-latest.min.js";k=r.getElementsByTagName(a)[0];k.parentNode.insertBefore(d,k);b[n]=h}})(window,document,"script","branch",function(b,r){b[r]=function(){b._q.push([r,arguments])}},{_q:[],_v:1},"addListener banner closeBanner closeJourney data deepview deepviewCta first init link logout removeListener setBranchViewData setIdentity track trackCommerceEvent logEvent disableTracking getBrowserFingerprintId crossPlatformIds lastAttributedTouchData setAPIResponseCallback qrCode setRequestMetaData setAPIUrl getAPIUrl setDMAParamsForEEA".split(" "), 0);
85+
(function(b,r,a,n,c,h,_,s,d,k){if(!b[n]||!b[n]._q){for(;s<_.length;)c(h,_[s++]);d=r.createElement(a);d.async=1;d.src="https://cdn.branch.io/branch-latest.min.js";k=r.getElementsByTagName(a)[0];k.parentNode.insertBefore(d,k);b[n]=h}})(window,document,"script","branch",function(b,r){b[r]=function(){b._q.push([r,arguments])}},{_q:[],_v:1},"addListener banner closeBanner closeJourney data deepview deepviewCta first init link logout removeListener setBranchViewData setIdentity track trackCommerceEvent logEvent disableTracking getBrowserFingerprintId crossPlatformIds lastAttributedTouchData setAPIResponseCallback qrCode setRequestMetaData setDMAParamsForEEA setAPIUrl getAPIUrl".split(" "), 0);
8686

8787
branch.setAPIResponseCallback(function(url, method, requestBody, error, status, responseBody) {
8888
console.log('Request: ' + method + ' ' + url + ' body=' + JSON.stringify(requestBody));

src/1_utils.js

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ utils.currentRequestBrttTag = "";
3232
utils.allowDMAParamURLMap = {
3333
"/v1/open": "",
3434
"/v1/pageview": "",
35-
"/v2/event": "user_data"
35+
"/v2/event/standard": "user_data",
36+
"/v2/event/custom": "user_data"
3637
};
3738
utils.calculateBrtt = function(startTime) {
3839
if (!startTime || typeof startTime !== "number") {
@@ -1344,19 +1345,39 @@ utils.setDMAParams = function(data, dmaObj = {}, endPoint) {
13441345
[DMA_Ad_User_Data]: dmaObj.adUserDataUsageConsent || false
13451346
};
13461347

1347-
for (const [key, value] of Object.entries(utils.allowDMAParamURLMap)) {
1348+
const allowDMAParamURLMap = utils.allowDMAParamURLMap;
1349+
1350+
for (const [key, value] of Object.entries(allowDMAParamURLMap)) {
13481351
if (endPoint.includes(key)) {
1352+
13491353
if (value === '') {
13501354
Object.assign(data, dmaParams);
13511355
}
13521356
else {
1353-
data[value] = Object.assign({}, data[value], dmaParams);
1357+
let updatedValue;
1358+
const valueExists = value in data;
1359+
if (!valueExists || data[value] === '') {
1360+
updatedValue = JSON.stringify(dmaParams);
1361+
}
1362+
else {
1363+
try {
1364+
const innerJSONObject = JSON.parse(data[value]);
1365+
const mergedObject = Object.assign({}, innerJSONObject, dmaParams);
1366+
updatedValue = JSON.stringify(mergedObject);
1367+
} catch (error) {
1368+
console.error(`setDMAParams:: ${value} is not a valid JSON string`);
1369+
}
1370+
}
1371+
if (updatedValue) {
1372+
data[value] = updatedValue;
1373+
}
13541374
}
13551375
break;
13561376
}
13571377
}
13581378
};
13591379

1380+
13601381
/**
13611382
* @param {String} url
13621383
* A utility function to validate url

src/6_branch.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,7 +1955,7 @@ Branch.prototype['setAPIResponseCallback'] = wrap(callback_params.NO_CALLBACK, f
19551955
* @param {Boolean} adUserDataUsageConsent - If User has granted/denied consent for 3P transmission of user level data for ads.
19561956
* Sets the value of parameters required by Google Conversion APIs for DMA Compliance in EEA region.
19571957
*/
1958-
Branch.prototype['setDMAParamsForEEA'] = function(eeaRegion, adPersonalizationConsent, adUserDataUsageConsent) {
1958+
Branch.prototype['setDMAParamsForEEA'] = wrap(callback_params.CALLBACK_ERR, function(done, eeaRegion, adPersonalizationConsent, adUserDataUsageConsent) {
19591959
try {
19601960
var dmaObj = {};
19611961
dmaObj.eeaRegion = eeaRegion || false;
@@ -1966,7 +1966,8 @@ Branch.prototype['setDMAParamsForEEA'] = function(eeaRegion, adPersonalizationCo
19661966
catch (e) {
19671967
console.error("setDMAParamsForEEA::An error occured while setting DMA parameters for EEA", e);
19681968
}
1969-
};
1969+
done();
1970+
}, true);
19701971

19711972
/***
19721973
* @function Branch.setRequestMetaData

test/1_utils.js

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,7 +1329,8 @@ describe('utils', function() {
13291329
it('should return true for valid endpoints', function() {
13301330
assert.equal(utils.shouldAddDMAParams('/v1/open'), true);
13311331
assert.equal(utils.shouldAddDMAParams('/v1/pageview'), true);
1332-
assert.equal(utils.shouldAddDMAParams('/v2/event'), true);
1332+
assert.equal(utils.shouldAddDMAParams('/v2/event/standard'), true);
1333+
assert.equal(utils.shouldAddDMAParams('/v2/event/custom'), true);
13331334
});
13341335

13351336
it('should return false for invalid endpoints', function() {
@@ -1349,16 +1350,27 @@ describe('utils', function() {
13491350
utils.setDMAParams(data, dmaObj, '/v1/open');
13501351
assert.deepEqual(data, { dma_eea: true, dma_ad_personalization: true, dma_ad_user_data: false });
13511352
});
1352-
it('should add DMA parameters for valid endpoints: v2/event', () => {
1353+
it('should add DMA parameters for valid endpoints: v2/event/standard', () => {
13531354
const dmaObj = {
13541355
eeaRegion: true,
13551356
adPersonalizationConsent: true,
13561357
adUserDataUsageConsent: false
13571358
};
13581359

13591360
const data2 = {};
1360-
utils.setDMAParams(data2, dmaObj, '/v2/event');
1361-
assert.deepEqual(data2, { "user_data": { dma_eea: true, dma_ad_personalization: true, dma_ad_user_data: false } });
1361+
utils.setDMAParams(data2, dmaObj, '/v2/event/standard');
1362+
assert.deepEqual(data2, { "user_data":"{\"dma_eea\":true,\"dma_ad_personalization\":true,\"dma_ad_user_data\":false}" });
1363+
});
1364+
it('should add DMA parameters for valid endpoints: v2/event/custom', () => {
1365+
const dmaObj = {
1366+
eeaRegion: true,
1367+
adPersonalizationConsent: true,
1368+
adUserDataUsageConsent: false
1369+
};
1370+
1371+
const data2 = {};
1372+
utils.setDMAParams(data2, dmaObj, '/v2/event/custom');
1373+
assert.deepEqual(data2, { "user_data":"{\"dma_eea\":true,\"dma_ad_personalization\":true,\"dma_ad_user_data\":false}" });
13621374
});
13631375
it('should add DMA parameters for valid endpoints: v1/pageview', () => {
13641376
const dmaObj = {

test/6_branch_new.js

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ var sinon = require('sinon');
55

66
goog.require('Branch');
77
goog.require('utils');
8+
goog.require('task_queue');
89

910
describe('Branch - new', function() {
10-
var branch_instance = new Branch();
11-
var assert = testUtils.unplanned();
11+
const sandbox = sinon.createSandbox();
12+
const branch_instance = new Branch();
13+
const assert = testUtils.unplanned();
1214
afterEach(function() {
15+
sandbox.restore();
1316
sinon.restore();
1417
});
1518
describe('referringLink', function() {
@@ -56,21 +59,15 @@ describe('Branch - new', function() {
5659
});
5760
});
5861
describe('setDMAParamsForEEA', function() {
59-
let sandbox;
60-
beforeEach(() => {
61-
sandbox = sinon.createSandbox();
62-
});
63-
afterEach(() => {
64-
sandbox.restore();
65-
});
6662
it('test method exists', function() {
6763
sinon.assert.match(typeof branch_instance.setDMAParamsForEEA, "function");
6864
});
6965
it('should store dma params inside branch_dma_data of storage', function() {
7066
const thisObj = {
7167
_storage: {
7268
set: () => {}
73-
}
69+
},
70+
_queue: task_queue()
7471
};
7572
const storageSetStub = sandbox.stub(thisObj._storage, 'set');
7673
const dmaObj = {};
@@ -85,7 +82,8 @@ describe('Branch - new', function() {
8582
const thisObj = {
8683
_storage: {
8784
set: () => {}
88-
}
85+
},
86+
_queue: task_queue()
8987
};
9088
const storageSetStub = sandbox.stub(thisObj._storage, 'set');
9189
const dmaObj = {};
@@ -100,7 +98,8 @@ describe('Branch - new', function() {
10098
const thisObj = {
10199
_storage: {
102100
set: () => {}
103-
}
101+
},
102+
_queue: task_queue()
104103
};
105104
sandbox.stub(thisObj._storage, 'set').throws(new Error('Mock error'));
106105
const consoleErrorStub = sandbox.stub(console, 'error');

test/branch-deps.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ goog.addDependency('../../../../test/1_utils.js', [], ['utils'], {'lang': 'es6'}
2222
goog.addDependency('../../../../test/2_storage.js', [], ['storage']);
2323
goog.addDependency('../../../../test/3_api.js', [], ['Server', 'config', 'resources', 'safejson', 'storage', 'utils']);
2424
goog.addDependency('../../../../test/6_branch.js', [], ['Branch', 'banner_html', 'banner_utils', 'config', 'goog.json', 'resources', 'safejson', 'session', 'storage', 'utils']);
25-
goog.addDependency('../../../../test/6_branch_new.js', [], ['Branch', 'utils']);
25+
goog.addDependency('../../../../test/6_branch_new.js', [], ['Branch', 'task_queue', 'utils'], {'lang': 'es6'});
2626
goog.addDependency('../../../../test/7_integration.js', [], ['config', 'goog.json']);
2727
goog.addDependency('../../../../test/blob-banner.js', [], []);
2828
goog.addDependency('../../../../test/blob-interstitial.js', [], []);

0 commit comments

Comments
 (0)