@horat1us/detect-ad-block
Version:
Browser Ad Block add-ons detector
251 lines (213 loc) • 6.68 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
function Check(url, mode) {
return new Promise(function (end) {
if (mode === 'ajax') {
var readyStates = [false, false, false, false];
var status = null;
var respond = function respond(responseForce) {
if (responseForce !== undefined) {
end(responseForce);
} else {
if (status === 0) {
end(true);
return;
}
for (var i = 0; i < 4; i++) {
if (readyStates[i] === false) {
end(true);
return;
}
}
end(false);
}
};
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
readyStates[xmlHttp.readyState - 1] = true;
try {
status = xmlHttp.status;
} catch (e) {}
if (xmlHttp.readyState === 4) {
respond();
}
};
try {
xmlHttp.open('GET', url, true);
xmlHttp.send();
} catch (e) {
if (e.result == '2153644038') {
respond(true);
}
}
} else if (mode === 'script') {
var element = document.createElement('script');
element.src = url;
element.onerror = function () {
end(true);
window.document.body.removeChild(element);
};
element.onload = function () {
end(false);
window.document.body.removeChild(element);
};
window.document.body.appendChild(element);
} else {
end(false);
}
});
}
var HttpAjaxOptions = Object.freeze({
baitUrl: '/ad/banner/_adsense_/_adserver/_adview_.ad.json?adzone=top&adsize=300x250&advid={RANDOM}',
baitMode: "ajax"
});
var HttpScriptOptions = Object.freeze({
baitUrl: '/ad/banner/_adsense_/_adserver/_adview_.ad.js?adzone=top&adsize=300x250&advid={RANDOM}',
baitMode: "script"
});
function Http(options) {
return {
detect: function HttpDetectPlugin(resolve) {
Check(options.baitUrl.replace('{RANDOM}', Number(new Date()).toString()), options.baitMode).then(resolve);
},
name: "detect-ad-block/http" + (options.name || ":" + options.baitMode),
version: 1
};
}
var ajax = Http(HttpAjaxOptions);
var script = Http(HttpScriptOptions);
var HtmlDefaultOptions = Object.freeze({
name: "",
baitClass: 'pub_300x250 pub_300x250m pub_728x90 text-ad textAd text_ad text_ads text-ads text-ad-links',
baitStyle: 'width:1px!important;height:1px!important;position:absolute!important;left:-10000px!important;top:-1000px!important;',
interval: 50,
timeout: 950
});
function Bait(className, style) {
var element = window.document.createElement('div');
element.setAttribute('class', className);
element.setAttribute('style', style);
element.offsetParent;
element.offsetHeight;
element.offsetLeft;
element.offsetTop;
element.offsetWidth;
element.clientHeight;
element.clientWidth;
function append() {
var parent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.document.body;
parent.appendChild(element);
}
function check() {
if (element.offsetParent === null || element.offsetHeight == 0 || element.offsetLeft == 0 || element.offsetTop == 0 || element.offsetWidth == 0 || element.clientHeight == 0 || element.clientWidth == 0) {
return true;
}
var computedStyle = window.getComputedStyle(element);
return computedStyle.getPropertyValue('display') == 'none' || computedStyle.getPropertyValue('visibility') == 'hidden';
}
function remove() {
element.parentElement && element.parentElement.removeChild(element);
}
return Object.freeze({
element: element,
append: append,
check: check,
remove: remove
});
}
function Html() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : HtmlDefaultOptions;
return {
detect: function HtmlDetectPlugin(resolve) {
var bait = Bait(options.baitClass, options.baitStyle);
var _done = function done(result) {
resolve(result);
bait.remove();
clearInterval(intervalId);
_done = undefined;
};
bait.append();
setTimeout(function () {
_done && _done(false);
}, options.timeout);
var intervalId = setInterval(function () {
if (!bait.check()) {
return;
}
_done && _done(true);
}, options.interval);
},
name: "detect-ad-block/html" + options.name,
version: 1
};
}
var html = Html();
var index = /*#__PURE__*/Object.freeze({
HttpAjaxOptions: HttpAjaxOptions,
HttpScriptOptions: HttpScriptOptions,
Http: Http,
ajax: ajax,
script: script,
HtmlDefaultOptions: HtmlDefaultOptions,
Html: Html,
html: html
});
function DetectAdBlock() {
var pluginList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [html, ajax];
return {
perform: function perform() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
timeout: 1000
};
return new Promise(function (resolve, reject) {
var resolved = false;
var onRejected = function onRejected() {
if (!resolved) {
return;
}
resolved = true;
reject.apply(void 0, arguments);
};
var onFulfilled = function onFulfilled(result) {
if (resolved) {
return;
}
resolved = true;
resolve(result);
};
setTimeout(function () {
onRejected(new Error("Timeout"));
}, options.timeout);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = pluginList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var plugin = _step.value;
try {
plugin.detect(onFulfilled);
} catch (error) {
onRejected(error);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
});
},
pluginList: pluginList
};
}
exports.DetectAdBlock = DetectAdBlock;
exports.plugins = index;