From 455cec2d732a842a657ad4e9c284cea3b72ae79e Mon Sep 17 00:00:00 2001 From: Bryce Dorn Date: Tue, 13 Nov 2018 11:26:06 -0600 Subject: [PATCH 1/5] add article positition to ad call --- src/helpers/TargetingPairs.js | 29 +++++++++++++++++++++---- src/helpers/TargetingPairs.spec.jest.js | 15 +++++++++++++ src/manager.js | 2 +- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/helpers/TargetingPairs.js b/src/helpers/TargetingPairs.js index 55f7845..e3c48dd 100644 --- a/src/helpers/TargetingPairs.js +++ b/src/helpers/TargetingPairs.js @@ -31,24 +31,44 @@ var TargetingPairs = { return (tagMeta.tags || '').split(','); }, + /** + * Gets index of article position in reading list + * + * @param HTMLElement adContainer the ad container currently being filled + * @param object kinjaMeta kinja-specific post meta + */ + getArticlePosition: function (adContainer, kinjaMeta) { + if (document && adContainer && kinjaMeta.pageType === "permalink" && !kinjaMeta.post.isFeatured) { + var readingListPostIds = Array.from(document.getElementsByClassName('js_reading-list-item')).map(post => post.dataset.postId); + if (readingListPostIds.length > 0) { + var currentPostId = adContainer.closest('.js_reading-list-item').dataset.postId; + return readingListPostIds.indexOf(currentPostId) + 1; + } + } + + return 'none'; + }, + /** * Constructs associative array of targeting pairs from post meta * * @param Window scope the window to use for the kinja meta info. * */ - buildTargetingPairs: function (scope, positionTargeting) { + buildTargetingPairs: function (scope, positionTargeting, adContainer) { var kinjaMeta = scope.kinja.meta, post = scope.kinja.postMeta || {}, content = scope.kinja.postContentRatings || [], experimentVariation = Experiments.getExperimentVariation(scope), experimentId = Experiments.getExperimentId(scope), socialTargeting, key, - targeting = {}; + targeting = {}, + articlePosition = TargetingPairs.getArticlePosition(adContainer, kinjaMeta); // Begin slot level params AKA 'scp' targeting.slotOptions = { // Standard targeting options + articlePosition, pos: positionTargeting || null, postId: post ? post.postId : null, socialReferrer: SocialReferrer.getSocialReferrer(), @@ -78,9 +98,10 @@ var TargetingPairs = { * * @param string forcedAdZone forced ad zone, if any * @param Window scope the window to use for the kinja meta info. + * @param element adContainer optional ad container to determine positioning * */ - getTargetingPairs: function (forcedAdZone, positionTargeting) { + getTargetingPairs: function (forcedAdZone, positionTargeting, adContainer) { if (forcedAdZone && !window.kinja) { return { pageOptions : { forcedAdZone : forcedAdZone} }; } @@ -88,7 +109,7 @@ var TargetingPairs = { return {}; } - var targetingOptions = this.buildTargetingPairs(window, positionTargeting); + var targetingOptions = this.buildTargetingPairs(window, positionTargeting, adContainer); targetingOptions.pageOptions.forcedAdZone = forcedAdZone || false; diff --git a/src/helpers/TargetingPairs.spec.jest.js b/src/helpers/TargetingPairs.spec.jest.js index 88ed3a8..b173448 100644 --- a/src/helpers/TargetingPairs.spec.jest.js +++ b/src/helpers/TargetingPairs.spec.jest.js @@ -235,5 +235,20 @@ describe('TargetingPairs', function() { expect(spy).not.toHaveBeenCalled(); }); }); + + describe('article positioning', function() { + beforeEach(function() { + window.document.body.innerHTML = ` +
+
+
+ `; + }); + + it('returns the index of the article in reading list', function() { + var childElement = document.body.getElementsByClassName('ad-container')[0]; + expect(TargetingPairs.getArticlePosition(childElement, {})).toEqual('none'); + }); + }); }); }); diff --git a/src/manager.js b/src/manager.js index be2517c..575ad27 100644 --- a/src/manager.js +++ b/src/manager.js @@ -494,7 +494,7 @@ AdManager.prototype.slotInfo = function () { AdManager.prototype.setSlotTargeting = function (element, slot, adUnitConfig) { var slotTargeting = element.dataset.targeting ? JSON.parse(element.dataset.targeting) : {}; slotTargeting.pos = slotTargeting.pos || adUnitConfig.pos || adUnitConfig.slotName || element.dataset.adUnit; - var kinjaPairs = TargetingPairs.getTargetingPairs(AdZone.forcedAdZone(), slotTargeting.pos).slotOptions; + var kinjaPairs = TargetingPairs.getTargetingPairs(AdZone.forcedAdZone(), slotTargeting.pos, element).slotOptions; slotTargeting = utils.extend(kinjaPairs, slotTargeting); From 8266a8c5b8b4a957161c6022b9e0edb1a5a81881 Mon Sep 17 00:00:00 2001 From: Bryce Dorn Date: Wed, 14 Nov 2018 10:58:15 -0600 Subject: [PATCH 2/5] minor safety checks --- src/helpers/TargetingPairs.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/helpers/TargetingPairs.js b/src/helpers/TargetingPairs.js index e3c48dd..046bf2b 100644 --- a/src/helpers/TargetingPairs.js +++ b/src/helpers/TargetingPairs.js @@ -38,11 +38,15 @@ var TargetingPairs = { * @param object kinjaMeta kinja-specific post meta */ getArticlePosition: function (adContainer, kinjaMeta) { - if (document && adContainer && kinjaMeta.pageType === "permalink" && !kinjaMeta.post.isFeatured) { + if (document && adContainer && kinjaMeta.pageType === "permalink" && !(kinjaMeta.post && kinjaMeta.post.isFeatured)) { var readingListPostIds = Array.from(document.getElementsByClassName('js_reading-list-item')).map(post => post.dataset.postId); + if (readingListPostIds.length > 0) { - var currentPostId = adContainer.closest('.js_reading-list-item').dataset.postId; - return readingListPostIds.indexOf(currentPostId) + 1; + var readingListItem = adContainer.closest('.js_reading-list-item'); + if (readingListItem) { + var currentPostId = readingListItem.dataset.postId; + return readingListPostIds.indexOf(currentPostId) + 1; + } } } From b1805562512c57ae2f1c26bd976fd6be393de1ca Mon Sep 17 00:00:00 2001 From: Bryce Dorn Date: Wed, 14 Nov 2018 15:06:07 -0600 Subject: [PATCH 3/5] camelcase -> snakecase to match dfp --- src/helpers/TargetingPairs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/TargetingPairs.js b/src/helpers/TargetingPairs.js index 046bf2b..fbbb2bc 100644 --- a/src/helpers/TargetingPairs.js +++ b/src/helpers/TargetingPairs.js @@ -72,7 +72,7 @@ var TargetingPairs = { // Begin slot level params AKA 'scp' targeting.slotOptions = { // Standard targeting options - articlePosition, + article_position: articlePosition, pos: positionTargeting || null, postId: post ? post.postId : null, socialReferrer: SocialReferrer.getSocialReferrer(), From a283039739bc3cbc6521797799b27d7cf3c42cdc Mon Sep 17 00:00:00 2001 From: Bryce Dorn Date: Wed, 14 Nov 2018 15:33:21 -0600 Subject: [PATCH 4/5] start indexing at starter post --- src/helpers/TargetingPairs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/helpers/TargetingPairs.js b/src/helpers/TargetingPairs.js index fbbb2bc..486e4db 100644 --- a/src/helpers/TargetingPairs.js +++ b/src/helpers/TargetingPairs.js @@ -45,12 +45,12 @@ var TargetingPairs = { var readingListItem = adContainer.closest('.js_reading-list-item'); if (readingListItem) { var currentPostId = readingListItem.dataset.postId; - return readingListPostIds.indexOf(currentPostId) + 1; + return readingListPostIds.indexOf(currentPostId) + 2; } } } - return 'none'; + return 1; }, /** From 8dcfb8f24dbb0cf37e9eb5b099088e8d876d2dbc Mon Sep 17 00:00:00 2001 From: Bryce Dorn Date: Wed, 14 Nov 2018 15:46:36 -0600 Subject: [PATCH 5/5] update test for position val --- src/helpers/TargetingPairs.spec.jest.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/helpers/TargetingPairs.spec.jest.js b/src/helpers/TargetingPairs.spec.jest.js index b173448..9122c99 100644 --- a/src/helpers/TargetingPairs.spec.jest.js +++ b/src/helpers/TargetingPairs.spec.jest.js @@ -247,7 +247,7 @@ describe('TargetingPairs', function() { it('returns the index of the article in reading list', function() { var childElement = document.body.getElementsByClassName('ad-container')[0]; - expect(TargetingPairs.getArticlePosition(childElement, {})).toEqual('none'); + expect(TargetingPairs.getArticlePosition(childElement, {})).toEqual(1); }); }); });