Skip to content

Commit

Permalink
User ID Module (prebid#3424)
Browse files Browse the repository at this point in the history
* add initial files

* add local storage and cookie browser support functions

* added additional test cases for functions related to local storage and cookie browser support

* added validate config function and first unit test

* add validate config test

* updated local storage key value to match change to requirements/spec

* updated submodule config key names to match requirements/spec

* added TODO with validation logic breakdown as well as a question on how to handle both 'value' and 'storage' existing in config

* add TODO addressing use-case: Publisher has integrated with OpenID on their own

* fixed comment

* rearranged unit tests for config functions to be grouped correctly

* added logic to valid that a submodule contains a config with a value or storage obj

* removed sinon mock of config.getConfig, replaced with obj literal definition in function arguments

* additional use cases added to validateConfig tests

* refactored init function

* refactored to remove a function and reduce number of iterations of submodules and configs

* add logic to pass config value obj data to adapter, also a small amount of refactoring/formatting cleanup

* added configuration examples to markdown file

* add add request bid hook to the initSubmodules function

* added requestBidBook in preparation to test mock setup/configuration. add test for one storage type active with only one module configured to use that type

* refactored requestBidHook with dependency injection for unit testing

* had to revert revision to use dependency injection in the requestBidHook due to necessary use of prebid global object affecting following tests

* created initial file for integration example

* updated integration using brett's test page.

* updated extendedBidRequestData to be a function expression, which allows watching the first element added to add the bid request hook

* removed redundant constant for enabled submodules within init submodules

* added retrieve storage value and logic to call submodule.getId if stored value does not exist

* added submodule getId fallback when storage value does not exist

* extended addUnit bid requests with universalId data, add logging for invalid config storage type, revised commenting

* add logic to set storage and pass decoded data in getId response handler

* updated initModules unit test mock data to fix broken tests from previous module additions/updates

* updated comments for consistency

* fixed module description comment

* add overrideId interface and implementation to the pubCommonId submodule

* fix to only check for override method value if submodule has a configKey set in the config

* added unit test for submodule override method implementation

* completed the pubCommonId submodule getId implementation; changed pubCommonId submodule default expires value to today + 8 years

* changed openId submodule default expires value to today + 8 years; added final todo comments, pertaining to openId submodule decode and getId methods

* fixed formatting to correct linting errors during building

* update jsdoc comments for IdSubmodule

* added jsdoc comments for overrideId submodule interface method

* changed the overrideId return value conditional to require a valid object, added a todo note to investigate using separate instance callbacks to handle multiple timers for syncDelay/auctionDelay

* add ajax request to openId submodule getId, awaiting values for request params and response structure and format for storage and structure for adding to bid requests

* updated openId submodule getId error logging and callback handling

* fix obj path access for syncDelay, updated example file with pubCommonId configured

* fix for broken unit tests resulting from update of overrideId addition to submodule interface

* replace use of built-in array find method, with import of 'core-js/library/fn/array/find', fixes/updates for integration example for module

* refactored config handling in initSubmodules to accept a plain js object opposed to a prebid Config object (this simplifies testing setup)

* created init method to wrap initSubmodules with config

* refactored module's config to watch/handle changes

* removed overrideId submodule interface, change openId to unifiedId

* update getId and decode uid data structure also updated integration example

* updated object structure for universal ids that is added to bid request, add universalID object handling to rubiconBidAdapter

* updated markdown example configuration

* fix for syncDelay, added auction end listener before setting syncDelay timer

* update to prepare universalID object if adUnits exists

* add gdpr consent data to request bids hook, warn on not found, info if found

* add test for valid gdpr consent string, exits universal id module on fail

* update gdpr consent to check gdprApplies, add cmp code to integration example. update init to use dependency injection

* implemented test for gdpr consent to store locally (purpose #1)

* added consentString decode to check for purpose #1 (user consents to have data stored locally)

* fix initSubmodule function arguments for changed signature

* changed submodule getId method signature to pass a consentData argument

* tests update with dependency container

* update spec to un-comment disabled expect statement

* in-progress DI conversion

* update to fix test missing dependency for utils

* removed getIdCallbackHandler function because it was inlined within initSubmodules. refactored dependencyContainer argument names to dependencies

* add unit test case for configurations that define invalid storage.type values (only cookie or html5 are valid)

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* fixes for html5 storage in module and unit tests. temp comment-out for gdpr test in requestBid hook as it's being refactored into getId submodule methods

* added opt_out cookie logic to init

* in-progress commit to update getId method signature with initialized consentManagement data

* changed priority to consent management module's value + 1

* updated both submodule getId functions with consent data handling.

* update hasGDPRConsent to remove unnecessary test for consentData obj since it's tested outside of function, removed utils from dependency injection

* update to move local declarations outside if block, added local var for log prefix since it was accessed more than twice

* changed log prefix to build the string locally instead of passing through getIdData obj

* bug fix for request bid hook priority race condition

* removed consentData prop from init dependencies obj, updated jsdoc comments removing consentData prop

* removed consentData prop from init arguments

* update integration example to test gdpr cmpApi type of 'static'

* refactor to combine request bid hooks into single hook, also other opts and formatting changes

* additions/updates to logging, additions/updates to jsdoc comments, various refactoring and formatting updates

* fixed how GDPR purpose 1 permission is checked, removed decode function and read from consentData.vendorConsents.purposeConsents[1] (key value 1 is for "purpose 1")

* fix for hasGDPRConsent functions, changed object prop accessor name from 'consentData.vendorConsent' to 'consentData.vendorData'

* small changes to log messages and code formatting

* changed submodule property configKey to configName for consistency with the submodule config property name

* updated logging message text and small format change

* updated jsdoc comment to reduce line length

* formatting fix and jsdoc update

* reverted changes to support universal id in rubiconBidAdapter, will open a separate PR for the adapter code changes.

* added logging messages to catch statements

* fix unit tests using the document cookie

* fix to extra module name in log message

* changed function return type array to undefined on invalid config

* moved encodeURIComponenent and decodeURIComponenent into setCookie and getCookie

* refactor to resolve issues creating certain unit tests

* add tests for config variations, small fixes for issues found writing tests

* removed debug console.log statements

* removed set initializedSubmodules value in init

* fix to remove test cookie from spec, updated example with submodule config value object

* added tests checking that config submodule props create correct number of submodules

* added test for syncDelay config update

* fixes for LGTM and imports for src are now relative

* formatting fix semicolon

* test reverted to debug circleci failure

* changed request bids hook priority to load after consentManagement

* test to resolve circle ci errors

* test to resolve circle ci errors

* fixed name camel case error

* changed unifiedid decode test property name from pubcid to ttid

* add universal id support to pbs bid adapter

* moved universal id pbs adapter support from this branch to it's own branch pbs-adapter-universal-id-support

* reverted pbs adapter removal

* always add ext.prebid.targeting.includewinners: true for openrtb

* removed unnecessary code

* renamed

* more renaming

* rename comment

* bugfixes and code removal

* reverted changes

* renamed

* fix

* formatting update

* bugfix for syncDelay in bidHook

* fix syncDelay === 0

* revisions from review with e.harper

* fix for storing unifiedid obj in local storage

* bug fix for expires days conversion

* changed default syncDelay

* removed comment example since it's in the markdown file

* added/updated comments

* tiny update to logic adding data to bids

* removed commented code

* formatting adjusted for consistency and comments added/updated

* bugfix changed conditional to use and instead of or

* optimization code removal

* updated bidRequestHook to reflect changes made in hooks.js, ect

* fixes for unit tests

* added more unit tests as well as small fixes for tests

* fixed import path

* removed unused import and sinon sandbox

* remove exports for unnecessary objects

* fix for circleci tests

* fix for util.setCookie exp format

* renamed module name references to User ID

* removed test for cookies enabled around the opt out, since the cookie will not be returned if not enabled. comments mentioning local storage updated with 'and cookies'

* add try catch around pubcommonid external function call, removed unused code, updated docs with other configuration examples

* fix for pub common id getId try catch

* Add microadBidAdapter

* change unified id to require either a url or partner config param

* Remove unnecessary encodeURIComponent from microadBidAdapter

* Submit Advangelists Prebid Adapter

* Submit Advangelists Prebid Adapter 1.1

* Correct procudtion endpoint for prebid

* updating example pubcid

* added support to opt-out with _pubcid_optout

* clear _pubcid_optout before tests

* disabled test that keeps timing out on circleci

* added logic for optout set in html5 local storage

* update fix conditional typeo

* removed skip on userId test

* added async done function call for failed circleci test

* update done called in bidsBackHandler in failed circleci test

* fix for lint error missing space after property name

* removed test that passes locally but fails with a timeout exceeded error on cirlceci for the Safari Browsers
  • Loading branch information
Isaac Dettman authored Apr 4, 2019
1 parent 98b7f7e commit eeddc24
Show file tree
Hide file tree
Showing 5 changed files with 1,125 additions and 0 deletions.
212 changes: 212 additions & 0 deletions integrationExamples/gpt/userId_example.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
<html>
<head>
<script>
(function(window, document) {
if (!window.__cmp) {
window.__cmp = (function() {
var listen = window.attachEvent || window.addEventListener;
listen('message', function(event) {
window.__cmp.receiveMessage(event);
}, false);

function addLocatorFrame() {
if (!window.frames['__cmpLocator']) {
if (document.body) {
var frame = document.createElement('iframe');
frame.style.display = 'none';
frame.name = '__cmpLocator';
document.body.appendChild(frame);
} else {
setTimeout(addLocatorFrame, 5);
}
}
}
addLocatorFrame();

var commandQueue = [];
var cmp = function(command, parameter, callback) {
if (command === 'ping') {
if (callback) {
callback({
gdprAppliesGlobally: !!(window.__cmp && window.__cmp.config && window.__cmp.config.storeConsentGlobally),
cmpLoaded: false
});
}
} else {
commandQueue.push({
command: command,
parameter: parameter,
callback: callback
});
}
};
cmp.commandQueue = commandQueue;
cmp.receiveMessage = function(event) {
var data = event && event.data && event.data.__cmpCall;
if (data) {
commandQueue.push({
callId: data.callId,
command: data.command,
parameter: data.parameter,
event: event
});
}
};
cmp.config = {
//
// Modify config values here
//
// globalVendorListLocation: 'https://vendorlist.consensu.org/vendorlist.json',
// customPurposeListLocation: './purposes.json',
// globalConsentLocation: './portal.html',
// storeConsentGlobally: false,
// storePublisherData: false,
logging: 'debug'//,
// localization: {},
// forceLocale: 'en-us'
};
return cmp;
}());
var t = document.createElement('script');
t.async = false;
t.src = 'http://acdn.adnxs.com/cmp/cmp.bundle.js';
var tag = document.getElementsByTagName('head')[0];
tag.appendChild(t);
}
})(window, document);
// window.__cmp('showConsentTool');
</script>

<script>
var FAILSAFE_TIMEOUT = 2000;

var adUnits = [
{
code: 'test-div',
sizes: [[300,250],[300,600],[728,90]],
bids: [
{
bidder: 'rubicon',
params: {
accountId: '1001',
siteId: '113932',
zoneId: '535510'
}
}
]
}
];

var pbjs = pbjs || {};
pbjs.que = pbjs.que || [];
</script>
<script src="../../build/dev/prebid.js" async></script>

<script>
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
googletag.cmd.push(function() {
googletag.pubads().disableInitialLoad();
});

pbjs.que.push(function() {
pbjs.setConfig({
debug: true,
consentManagement: {
cmpApi: 'iab',
timeout: 1000,
allowAuctionWithoutConsent: true
},
// consentManagement: {
// cmpApi: 'static',
// consentData: {
// consentString: 'BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA'
// vendorData: {
// purposeConsents: {
// '1': true
// }
// }
// }
// },
usersync: {
userIds: [{
name: "unifiedId",
params: {
partner: "prebid",
url: "http://match.adsrvr.org/track/rid?ttd_pid=prebid&fmt=json"
},
storage: {
type: "html5",
name: "unifiedid",
expires: 30
},

}, {
name: "pubCommonId",
storage: {
type: "cookie",
name: "pubcid",
expires: 365
},
// value: {
// foo: '9879878907987',
// bar:'93939'
// }
}],
syncDelay: 5000
}
});
pbjs.addAdUnits(adUnits);
pbjs.requestBids({
bidsBackHandler: sendAdserverRequest
});
});

function sendAdserverRequest() {
if (pbjs.adserverRequestSent) return;
pbjs.adserverRequestSent = true;
googletag.cmd.push(function() {
pbjs.que.push(function() {
pbjs.setTargetingForGPTAsync();
googletag.pubads().refresh();
});
});
}

setTimeout(function() {
sendAdserverRequest();
}, FAILSAFE_TIMEOUT);
</script>

<script>
(function () {
var gads = document.createElement('script');
gads.async = true;
gads.type = 'text/javascript';
var useSSL = 'https:' == document.location.protocol;
gads.src = (useSSL ? 'https:' : 'http:') +
'//www.googletagservices.com/tag/js/gpt.js';
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(gads, node);
})();
</script>

<script>
googletag.cmd.push(function() {
googletag.defineSlot('/112115922/FL_PB_MedRect', [[300, 250],[300,600]], 'test-div').addService(googletag.pubads());
googletag.pubads().enableSingleRequest();
googletag.enableServices();
});
</script>
</head>

<body>
<h2>Rubicon Project Prebid</h2>

<div id='test-div'>
<script>
googletag.cmd.push(function() { googletag.display('test-div'); });
</script>
</div>
</body>
</html>
Loading

0 comments on commit eeddc24

Please sign in to comment.