{"_id":"@ekstra-bladet/jppol-safeframes","_rev":"11-e79c59d6d997e92a52f7a0083069cd53","name":"@ekstra-bladet/jppol-safeframes","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@ekstra-bladet/jppol-safeframes","version":"0.0.1","author":{"name":"tegner"},"license":"ISC","_id":"@ekstra-bladet/jppol-safeframes@0.0.1","maintainers":[{"name":"tegner","email":"jesper.h.tegner@jppol.dk"}],"homepage":"https://github.com/EkstraBladetUdvikling/jppol-safeframes#readme","bugs":{"url":"https://github.com/EkstraBladetUdvikling/jppol-safeframes/issues"},"dist":{"shasum":"e3810b7e047527ce89849daffbd1ffca6d03acc9","tarball":"https://registry.npmjs.org/@ekstra-bladet/jppol-safeframes/-/jppol-safeframes-0.0.1.tgz","integrity":"sha512-p7wVY2ojCLNCgwkGWc/ga6oTuD2vlOc87wnVXBXFz5EKdYeKz+fEwIUuSAVuHhPKquuIljzdnjVa090Ba6d+lg==","signatures":[{"sig":"MEQCIF5TQOVxawCwC6f/Y6DIEtE1o+cLP2VJQHNyN5k6BHDjAiBBnEpT4A2OlkAkQSz/uzSVgCqFCY6bFmnlWLmpsPk9Rg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"eccbd2399361b340497d1d421df55efafa75921e","scripts":{"ext":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/ext/ext.js\" -o \"safeframe/ext.min.js\" -c -m","dist":"npm run host && npm run ext && npm run prebid","host":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/host/host.js\" \"sf_api/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m","prebid":"uglifyjs \"node_modules/prebid.js/build/dist/prebid.js\" \"prebid/bidder-handling.js\" \"prebid/jppolPrebid.js\" -o \"safeframe/jppolPrebid.min.js\" -c -m","hostnpm":"uglifyjs \"node_modules/safeframe/src/js/lib/base.js\" \"node_modules/safeframe/src/js/host/host.js\" \"node_modules/safeframe/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m"},"_npmUser":{"name":"tegner","email":"Jesper.H.Tegner@jppol.dk"},"repository":{"url":"git+https://github.com/EkstraBladetUdvikling/jppol-safeframes.git","type":"git"},"_npmVersion":"5.5.1","description":"JPPol shared safeframes implementation","directories":{},"_nodeVersion":"8.9.1","dependencies":{"prebid.js":"^0.31.0","safeframe":"^1.1.3"},"devDependencies":{"uglify-js":"^3.0.24"},"_npmOperationalInternal":{"tmp":"tmp/jppol-safeframes-0.0.1.tgz_1511863056179_0.5086986408568919","host":"s3://npm-registry-packages"}},"0.0.2":{"name":"@ekstra-bladet/jppol-safeframes","version":"0.0.2","author":{"name":"tegner"},"license":"ISC","_id":"@ekstra-bladet/jppol-safeframes@0.0.2","maintainers":[{"name":"ekstrabladet","email":"udvikling@eb.dk"},{"name":"tegner","email":"Jesper.H.Tegner@jppol.dk"},{"name":"tcarlsen","email":"thomascarlsen86@gmail.com"}],"homepage":"https://github.com/EkstraBladetUdvikling/jppol-safeframes#readme","bugs":{"url":"https://github.com/EkstraBladetUdvikling/jppol-safeframes/issues"},"dist":{"shasum":"b4903148fc189158ddd70242fb9ad98ec7811565","tarball":"https://registry.npmjs.org/@ekstra-bladet/jppol-safeframes/-/jppol-safeframes-0.0.2.tgz","integrity":"sha512-yHWjisip47vUrM2ZqypQJEbN4Gw6QXt6+b5jUdtMA5qtwAZlwOR6p6SOipTiiUQ91vVkKG9bCewOsc5meTA+yg==","signatures":[{"sig":"MEYCIQCazPcBi/u7clkvYwqBcxPXJ23y+CWpy4xOFUemUMzgzgIhAMf2B3JBAJ+uz3bHnPDowOzICQPL5AojUzl5EBSV5iOC","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"6c026f939dc4a9d1aadfc78780334306240e2454","scripts":{"ext":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/ext/ext.js\" -o \"safeframe/ext.min.js\" -c -m","dist":"npm run host && npm run ext && npm run prebid","host":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/host/host.js\" \"sf_api/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m","prebid":"uglifyjs \"node_modules/prebid.js/build/dist/prebid.js\" \"prebid/bidder-handling.js\" \"prebid/jppolPrebid.js\" -o \"safeframe/jppolPrebid.min.js\" -c -m","hostnpm":"uglifyjs \"node_modules/safeframe/src/js/lib/base.js\" \"node_modules/safeframe/src/js/host/host.js\" \"node_modules/safeframe/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m"},"_npmUser":{"name":"tegner","email":"Jesper.H.Tegner@jppol.dk"},"repository":{"url":"git+https://github.com/EkstraBladetUdvikling/jppol-safeframes.git","type":"git"},"_npmVersion":"5.5.1","description":"JPPol shared safeframes implementation","directories":{},"_nodeVersion":"8.9.1","dependencies":{"prebid.js":"^0.31.0","safeframe":"^1.1.3"},"devDependencies":{"uglify-js":"^3.0.24"},"_npmOperationalInternal":{"tmp":"tmp/jppol-safeframes-0.0.2.tgz_1511864341116_0.35427151597104967","host":"s3://npm-registry-packages"}},"0.0.3":{"name":"@ekstra-bladet/jppol-safeframes","version":"0.0.3","author":{"name":"tegner"},"license":"ISC","_id":"@ekstra-bladet/jppol-safeframes@0.0.3","maintainers":[{"name":"ekstrabladet","email":"udvikling@eb.dk"},{"name":"tegner","email":"Jesper.H.Tegner@jppol.dk"},{"name":"tcarlsen","email":"thomascarlsen86@gmail.com"}],"homepage":"https://github.com/EkstraBladetUdvikling/jppol-safeframes#readme","bugs":{"url":"https://github.com/EkstraBladetUdvikling/jppol-safeframes/issues"},"dist":{"shasum":"141640968b44f19c5d9732a633049f3c916243c2","tarball":"https://registry.npmjs.org/@ekstra-bladet/jppol-safeframes/-/jppol-safeframes-0.0.3.tgz","integrity":"sha512-ZiXgl4gS1qERKDjR/IKHCmUJj0bioxYyFGRcZ6ffZbaCmkLMz4W6VNSnC/Jn+rvharAmS21mlA82d7zEIH3LXw==","signatures":[{"sig":"MEUCIExSvms5JGHTvgOEWGOj8kmETB6vycKfhTY7G2fbrPu0AiEAxsMG6d3xeMYjaFAHsKLCnqRTbIB0WsU9SFFk6C5yBXo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"index.js","gitHead":"3b3d195818f259e04d7b45460369e8f7eed13593","scripts":{"ext":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/ext/ext.js\" -o \"safeframe/ext.min.js\" -c -m","dist":"npm run host && npm run ext && npm run prebid","host":"uglifyjs \"util/log.js\" \"sf_api/src/js/lib/base.js\" \"sf_api/src/js/host/host.js\" \"sf_api/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m","prebid":"uglifyjs \"node_modules/prebid.js/build/dist/prebid.js\" \"prebid/bidder-handling.js\" \"prebid/jppolPrebid.js\" -o \"safeframe/jppolPrebid.min.js\" -c -m","hostnpm":"uglifyjs \"node_modules/safeframe/src/js/lib/base.js\" \"node_modules/safeframe/src/js/host/host.js\" \"node_modules/safeframe/src/js/lib/boot.js\" \"host/jppolhost.js\" -o \"host/jppolhost.min.js\" -c -m"},"_npmUser":{"name":"tegner","email":"Jesper.H.Tegner@jppol.dk"},"repository":{"url":"git+https://github.com/EkstraBladetUdvikling/jppol-safeframes.git","type":"git"},"_npmVersion":"5.6.0","description":"JPPol shared safeframes implementation","directories":{},"_nodeVersion":"8.9.1","dependencies":{"prebid.js":"^0.31.0","safeframe":"^1.1.3"},"devDependencies":{"uglify-js":"^3.0.24"},"_npmOperationalInternal":{"tmp":"tmp/jppol-safeframes-0.0.3.tgz_1513675177357_0.36164535861462355","host":"s3://npm-registry-packages"}}},"time":{"created":"2017-11-28T09:57:37.822Z","modified":"2025-10-07T13:03:48.006Z","0.0.1":"2017-11-28T09:57:37.822Z","0.0.2":"2017-11-28T10:19:02.595Z","0.0.3":"2017-12-19T09:19:39.023Z"},"bugs":{"url":"https://github.com/EkstraBladetUdvikling/jppol-safeframes/issues"},"author":{"name":"tegner"},"license":"ISC","homepage":"https://github.com/EkstraBladetUdvikling/jppol-safeframes#readme","repository":{"url":"git+https://github.com/EkstraBladetUdvikling/jppol-safeframes.git","type":"git"},"description":"JPPol shared safeframes implementation","maintainers":[{"email":"thomascarlsen86@gmail.com","name":"tcarlsen"},{"email":"jesper.h.tegner@jppol.dk","name":"tegner"},{"email":"npm@mail.mbje.dk","name":"mbjedk"},{"email":"mathias.nordby@eb.dk","name":"mathiasnordby"},{"email":"nathalie.r.andersen@jppol.dk","name":"rabell"},{"email":"hey@lasse-godtkjaer.dk","name":"lassegodtkjaer"}],"readme":"# jppol-safeframes\r\nJPPol shared safeframes implementation\r\n\r\nBased on https://github.com/InteractiveAdvertisingBureau/safeframe\r\n\r\n# Table of Contents\r\n1. [Install](#install)\r\n2. [Safeframe side setup](#safeframe-side)\r\n3. [Host side setup](#host-side)\r\n4. [Calling banner](#calling-banner)\r\n5. [Special formats - Callbacks](#callbacks)\r\n\r\n# install\r\n\r\n[View package on npm](https://www.npmjs.com/package/@ekstra-bladet/jppol-safeframes)\r\n\r\n```\r\nnpm install \"@ekstra-bladet/jppol-safeframes\" --save\r\n```\r\n\r\n# Safeframe side\r\nUpload the safeframe folder of this project to an external address\r\neg. //ebimg.dk/ux/data/safeframes/\r\n\r\n# Host side\r\nInclude jppolhost.min.js in page\r\nCreates an object called jppolAdOps, with the following exposed elements\r\n\r\n* [safeframeInit](#safeframeInit)\n* [setupFinalPos](#setupFinalPos)\r\n\r\n# Initialize JPPol Safeframes from publisher site\r\n## safeframeInit\r\n* function\r\n\r\nThe initialize function takes an object as argument, with [safeframeURL](#safeframeURL) and [adtechNetworkId](#adtechNetworkId) as mandatory settings\r\n\r\nInitialize function\r\n``` js\r\n  var sfOptions = {\r\n    safeframeURL: '//ebimg.dk/ux/data/safeframes/index.html', // [Path from setup](#safeframe-side)\r\n    adtechNetworkId: '123'\r\n  }\r\n  jppolAdOps.safeframeInit(sfOptions)\r\n```\n\nInitialize function with prebid enabled\n``` js\n  var sfOptions = {\n    prebid: true,\n    safeframeURL: '//ebimg.dk/ux/data/safeframes/index-prebid-dac.html', // [Path from setup](#safeframe-side)\n    adtechNetworkId: '123'\n  }\n  jppolAdOps.safeframeInit(sfOptions)\n```\r\n\r\n### debug info from safeframe\r\n\r\n[Se debug](#debug)\r\n\r\n## Options\r\n\n### safeframeURL\r\n* Mandatory [string]\r\n\r\nSet the URL of were the safeframe HTML file is placed\r\n\r\nsetup example\r\n```js\r\n  var sfOptions = {\r\n    safeframeURL: '//ebimg.dk/ux/data/safeframes/index.html' // [Path from setup](#safeframe-side)\r\n  }\r\n```\r\n\r\n### adtechNetworkId\r\n* Mandatory [string / object]\r\n\r\nSet the ADTECH network id, can be passed as an object to differentiate between network ids based on [device type](#device)\r\n\r\nString setup example\r\n```js\r\n  var sfOptions = {\r\n    adtechNetworkId: '123'\r\n  }\r\n```\r\n\r\nDevice Object setup example\r\n```js\r\n  var sfOptions = {\r\n    adtechNetworkId: {\r\n      desktop: '123',\r\n      smartphone: '123.0',\r\n      tablet: '123'\r\n    }\r\n  }\r\n```\r\n\n### prebid\n* optional [boolean]\n\nSet if prebid should be used or not\nNB! beware, remember to edit [safeframeURL](#safeframeURL) to '.../index-prebid-dac.html'\n\nsetup example\n```js\n  var sfOptions = {\n    prebid: true\n  }\n```\n\r\n### baseBannerSrc\r\n* Optional [string / object]\r\n* default: '//adserver.adtech.de/addyn/3.0/'\r\n\r\nSet the base banner url, from which the final banner script src will be build, can be passed as an object to differentiate between network ids based on [device type](#device)\r\n\r\nString setup example\r\n```js\r\n  var sfOptions = {\r\n    baseBannerSrc: '//adserver.adtech.de/addyn/3.0/'\r\n  }\r\n```\r\n\r\nDevice Object setup example\r\n```js\r\n  var sfOptions = {\r\n    adtechNetworkId: {\r\n      desktop: '123',\r\n      smartphone: '123.0',\r\n      tablet: '123'\r\n    }\r\n  }\r\n```\r\n\r\n### device\r\n* Optional [string]\r\n* default: 'desktop'\r\n\r\nSet current device type, used to differentiate adtechNetworkId and baseBannerSrc\r\n\r\nSetup example\r\n```js\r\n  var sfOptions = {\r\n    device: 'desktop'\r\n  }\r\n```\r\n\r\n### messageCallback\r\n* Optional [function]\r\n\r\nSee also: [Callbacks](#callbacks)\r\n\r\nSet the function which should be called when the safeframe is triggering onPosMsg\r\nAn object[example shown below] is passed as argument to the callback function containing 4\r\n\r\nArgument example\r\n``` js\r\nvar messageObject = {\r\n  'placement': 'string', // string\r\n  'type': 'string', // ['msg'/'error']\r\n  'content': 'string', // safeframes doesnt support other types at the moment\r\n  'nuked': nuked\r\n}\r\n```\r\n\r\nInit setup example\r\n```js\r\n  var sfOptions = {\r\n    messageCallback: handleCallBack\r\n  }\r\n```\r\n\r\n### wallpaper\r\n\r\n#### wallpaperHandler\r\n* Optional [boolean]\r\n* default: false\r\n\r\nShould be set to true if wallpaper is an option on the page, usually only for desktop devices\r\n\r\nexample\r\n```js\r\n  var sfOptions = {\r\n    wallpaperHandler: true\r\n  }\r\n```\r\n\r\n#### wallpaperSelector\r\n* Optional [string]\r\n\r\nCan be body or regular CSS selector / ID\r\n\r\nexample\r\n```js\r\n  var sfOptions = {\r\n    wallpaperSelector: 'adtechWallpaper'\r\n  }\r\n```\r\n\r\n#### wallpaperPositions\r\n* Optional [Array / string]\r\n\r\nName of positions of which to check for wallpaper.\r\n\r\nexample\r\n```js\r\n  var sfOptions = {\r\n    wallpaperPositions: ['wallpaper','monster']\r\n  }\r\n```\r\n\r\n### allowNuke\r\n* Optional [boolean]\r\n* default: true\r\n\r\nMainly for debugging purposes\r\n\r\nexample\r\n```js\r\n  var sfOptions = {\r\n    allowNuke: true\r\n  }\r\n```\r\n\r\n### debug\r\n* Optional [boolean]\r\n* default: false (will be set to true, if fulldebug is true)\r\n\r\nFor debugging purposes\r\nLog statements from jppol-safeframes is prefixed with jppol-safeframes, followed by either filename or \"inside safeframe\"\r\n\r\nsetup example\r\n```js\r\n  var sfOptions = {\r\n    debug: false\r\n  }\r\n```\r\n\r\noutput example\r\n```js\r\n  jppol-safeframes: jppolhost.js safeframe posMsg followleft msg safeframeloaded|w160|h604\r\n```\r\n\r\n\r\n### fulldebug\r\n* Optional [boolean]\r\n* default: false\r\n\r\nFor debugging purposes\r\nBEWARE: This will add debug information directly into the banner container\r\n\r\nexample\r\n```js\r\n  var sfOptions = {\r\n    fulldebug: false\r\n  }\r\n```\r\n\r\n\r\n\r\n# Calling a banner\r\n\r\nTo call a specific banner call [setupFinalPos](#setupFinalPos) with position data\r\n\r\n## setupFinalPos\r\n* function\r\n\r\nTakes an object with all the data needed to create the correct banner\r\n\r\npositionData\r\n\r\n```js\r\nvar positionData = {\r\n  placement: 'monster',\r\n  bannerID: '4040617',\r\n  type: '277',\r\n  sfWidth: 930,\r\n  sfHeight: 180,\r\n  sfZIndex: 1,\r\n  shared_data: {\r\n    elementPos: document.getElementById(destID).getBoundingClientRect()\r\n  }\r\n}\r\n```\r\n\r\n### placement\r\n* Mandatory [string]\r\n\r\nplacement id / name for banner\r\n\r\n\r\n```js\r\nvar positionData = {\r\n  placement: 'monster'\r\n}\r\n```\r\n\r\n### bannerID\r\n* Mandatory [string]\r\n\r\nADTECH placement ID or alias for banner\r\n\r\n```js\r\nvar positionData = {\r\n  bannerID: '4040617'\r\n}\r\n```\r\n\r\n### type\r\n* Mandatory [string]\r\n\r\nADTECH placement type / sizeid\r\n\r\n```js\r\nvar positionData = {\r\n  type: '277'\r\n}\r\n```\r\n\r\n### destID\r\n* Mandatory [string]\r\n\r\nID of element to serve banner in\r\n\r\n```js\r\nvar positionData = {\r\n  destID: 'monster_trgt'\r\n}\r\n```\r\n\r\n### Dimensions\r\n* Mandatory\r\n* sfWidth [number]\r\n* sfHeight [number]\r\n* sfZIndex [number]\r\n\r\nSet the width, height and z-index of the safeframe\r\n\r\n```js\r\nvar positionData = {\r\n  sfWidth: 930,\r\n  sfHeight: 180,\r\n  sfZIndex: 1\r\n}\r\n```\r\n\r\n### keyValues\r\n* optional [array]\r\n\r\nKey values to be added to banner called besides criteo, bluekai and rubicon key values\r\nCould be prebid key values\r\n\r\n```js\r\nvar positionData = {\r\n  keyValues: ['prebidwhatever=1']\r\n}\r\n```\r\n\r\n### shared_data\r\n* Optional [object]\r\n\r\nPass shared data to the safeframe, this data is open to every banner to use\r\n\r\n```js\r\nvar positionData = {\r\n  shared_data: {\r\n    elementPos_top: document.getElementById(destID).getBoundingClientRect().top\r\n  }\r\n}\r\n```\r\n\r\n## Passing private data to banner\r\n\r\n### privateDataOptions\r\n* Optional [object]\r\n\r\n```js\r\nvar privateDataOptions = {\r\n  key: 'privateKeyForSF',\r\n  private_data1: 'Private data',\r\n  private_data2: {\r\n    more_data: 'More private data'\r\n  }\r\n}\r\n```\r\n\r\n# Callbacks\r\n\r\nHandling special banner formats, like wallpaper, skyskraper(follow) etc.\r\n\r\nAt the moment safeframes only support strings to be sent from inside the safeframe\r\n\r\n## load\r\n\r\nWhen the banner is loaded the safeframe sends the a message with the content \"safeframeloaded\"\r\n\r\n### data\r\n\r\nSince the safeframe API doesnt support objects in messaging, additional data is appended with a pipe [|]\r\nIf a prebid placeholder is present the prebid type will be appended, otherwise the width and height dimensions will be appended.\r\nSee example implementation from safeframe below\r\n\r\n```js\r\nif (sf_align.querySelector('.prebidPlaceholder') !== null) {\r\n  loadedMessage += '|prebid'\r\n} else if (sf_align.querySelector('.prebidPlaceholder_xhb') !== null) {\r\n  loadedMessage += '|prebid_xhb'\r\n} else {\r\n  loadedMessage += '|w' + sf_align.clientWidth + '|h' + sf_align.clientHeight\r\n}\r\n```\r\n","readmeFilename":"README.md"}