陕西省平利县人民法院
民事判决书
(2019)陕0926民初952号
原告:平利县金瑞建筑工程有限公司。地址:平利县。
法定代表人:汪德平,该公司总经理。
委托诉讼代理人:汪林,陕西康利达律师事务所律师。
被告:新华人寿保险股份有限公司安康中心支公司。地址:安康市汉滨区。
负责人:阎超,该公司副总经理。
委托诉讼代理人:王潇潇,陕西宁康律师事务所律师。
原告平利县金瑞建筑工程有限公司(以下简称金瑞建筑)与被告新华人寿保险股份有限公司安康中心支公司(以下简称新华人寿)意外伤害保险合同纠纷一案,本院于2019年9月11日立案后,依法适用简易程序,公开开庭进行了审理。原告平利县金瑞建筑工程有限公司的委托诉讼代理人汪林、被告新华人寿保险股份有限公司安康中心支公司的委托诉讼代理人王潇潇到庭参加了诉讼。本案现已审理终结。
原告平利县金瑞建筑工程有限公司向本院提出诉讼请求:责令被告赔偿意外伤害保险金50万元。事实与理由:2017年7月21日,原告中标承包平利县杨家梁城乡统筹示范区移民搬迁安置楼工程后,于2018年3月13日在被告处购买了“建筑工程团体意外伤害保险”,合同约定保险金额50万元,保险期间自2018年3月13日零时起至2019年3月8日24时止。《新华人寿保险股份有限公司建筑工程团体意外伤害保险条款》第2.2条规定:“保险期间:如工程延期,投保人需提前书面通知本公司并办理保险期间延期手续,除另有约定外,保险期间连续累计不超过施工合同规定的工程竣工之日起15个月。若投保人未提前书面通知本公司并办理延期手续,本公司不承担工程延期期间的保险责任。”2019年3月初,原告向被告申请第1次保险期间延期,2019年5月底被告业务员李超电话告诉原告保险期间延期至2019年6月9日止,为此,原告于2019年5月30日向被告申请了第2次保险期间延期。两次保险期间延期,原告均是按照被告及合同条款的要求,由原告向被告提交书面延期申请及工程量清单,由被告自行在系统中进行延期操作。2019年7月25日7时左右,原告的外墙施工人员邹富卫因外墙电动升降吊篮发生故障,从6楼外墙摔落至地面,经抢救无效死亡。事发后,原告找到被告公司的业务员李超办理保险理赔事宜,李超告知原告第2次保险期间延期申请没有被批准,理由是第1次已办理过免费延期,拒不给原告办理保险理赔。为此,原告向陕西省保监会及被告的上级公司投诉,均没有得到合理解决。
被告新华人寿保险股份有限公司安康中心支公司辩称,一、原、被告签订“建筑工程团体意外伤害保险”及“附加建工工程意外伤害团体医疗保险”属实。但双方签订的保险合同在2019年6月9日24时已经终止,原告主张的事故时间为2019年7月25日,已经超过保险期,因此,被告不承担保险责任。原、被告签订的保险合同约定的保险期间为本合同生效时起至施工合同规定的工程竣工之日止,并在保单上载明。原告的施工合同竣工日期为2018年7月20日,保单上载明的保险期间为2018年3月13日至2019年3月8日,按照保险合同约定的保险期间截止日期为2018年7月20日,按照保单上的保险期间被告实际上已经给原告宽延了几个月的保险期间。《保险法》及原、被告签订的《保险合同》中对于保险合同内容变更也作了明确说明:“投保人和本公司可以协商变更本合同的有关内容。变更本合同的,由本公司在保险单或其他保险凭证上批注或附贴批单。”原告向被告申请延期实际上是对保险期间作出变更,对保险合同内容作出变更需要原、被告一致同意才能变更,且被告对于原告的延期申请有权进行审核评估,原告在第一次申请延期后,被告同意为其免费延期一次并向原告出具了一份批单,批单上明确载明变更项目为保险期限变更,变更内容为:“变更后,本保单项下保险期间由361天变更为453天。保险期间相应变更为自2018年3月13日至2019年6月9日止。”双方对于保险期间的变更达成了一致意见。但原告第二次申请延期,因其不接受加收相应保费,被告才拒绝了其延期申请,双方对于保险期间的变更并没有达成一致意见,因此保险合同约定的原保险期间对双方均具有约束力,原保险期间截止时间为2019年6月9日,而原告主张事故的时间为2019年7月25日,此时,原、被告签订的保险合同已终止,原告主张的事故发生时间已不在被告的承保期限内,因此,被告不应承担保险责任。二、被告未同意原告第二次延期申请的原因在于原告。原告于2019年5月30日向被告申请第二次延期,被告于2019年6月3日、6月5日保险期间截止日之前向原告告知第二次延期不能免费办理需要加收相应保费,原告当时表明不续了,直至保险期限到期后一个多月时间内原告都未再与被告联系,发生事故的当日原告并未向被告报案,之后也未向被告提出理赔申请,被告直到接到诉状时才了解到原告工地发生事故的详细情况。因此,第二次延期申请未成功的原因完全在于原告,由于原告不愿续费导致双方对于保险期间的变更无法达成一致意见,保险期间未成功变更,保险期间截止2019年6月9日,故原告的主张无事实和法律依据,事故的发生不在双方约定的保险期间及责任范畴内,请求依法驳回原告的诉讼请求。
当事人围绕诉讼请求依法提交了证据,本院组织当事人进行了举证和质证。原告金瑞建筑提供了以下证据:
一、原告的营业执照,证明原告的诉讼主体适格。被告未提出异议;
二、建筑工程团体意外伤害保险合同、保险费收据、建设工程施工合同、停工报告、复工报告、延期申请、工程量清单等,证明原告在被告处购买了团体意外伤害险,合同中约定了保险期限,因建设工程存在停工的情况,故原告向被告申请保险期间延期。被告对该组证据的真实性无异议,对证明目的提出异议,认为保险合同中虽约定保险期间可以延期,但未约定是免费延期,且合同中约定变更合同应当由保险公司在保险单或者其他保险凭证上批注,工程停工也需提前书面通知保险公司并办理保险期间中止手续,原告并未向被告提供停工的中止手续,而建设施工合同上竣工时间是2018年7月20日,被告并未同意原告的第二次延期申请,原告停工、复工与本案无关;
三、李超的情况说明、保险期限变更的批单,证明原告在2019年5月30日向被告提出了保险期间延期申请,并提供了工程量清单,保险公司已收到相关材料;原告第一次申请延期批单于2019年7月29日第一次打印,证明原告两次向被告申请延期,被告并未向原告提供任何书面回复,只在自己的系统中操作。被告对李超的情况说明的真实性和证明目的有异议,认为保险公司的业务员李超被诱骗写下情况说明;对批单的真实性无异议,但对证明目的有异议,认为根据批单所注,保险期间变更为2018年3月13日至2019年6月9日,且原告已知晓变更内容且办理延期需要被告同意;
四、平利县住房和城乡建设局关于邹富卫工伤事故证明、平利县医院的居民死亡医学证明书、工伤赔偿协议书及死者亲属的身份证明、死者亲属的领条和帐户交易明细单等证据,证明在原告投保的工地上发生了工伤事故,且原告已给予赔偿,被告应在保险限额内赔偿50万元。被告对事故证明和死亡证明的真实性无异议,认为只能证明死者是坠落而死,而不能证明坠落地点;对工伤赔偿协议的真实性有异议,认为是原告与第三人签订的协议书,被告不知情;对于死者的身份信息无异议,但对亲属关系证明、领条真实性有异议,认为不符合证据形式,且领条是第三人给原告出具的,被告不知情。对交易明细的真实性无异议,但原告并未向被告报案,被告未到事故现场核查事故的真实情况。
被告新华保险提供了李超与汪丽(实名为汪莉)的微信聊天记录一份,证明被告已告知原告第二次不能免费办理延期,被告表示已知情,不延期就算了,说明被告业务员李超给原告出具的情况说明内容不真实。原告对该证据的真实性无异议,认为该证据证明李超与汪丽是被告公司的业务员,且聊天内容并未表述第二次延期要另收保费,因双方签订的保险合同中约定的取费方式是按工程面积收费,并没有延期另交保费的约定,而原告也按照被告的要求提供资料申请了第二次延期。
本院认为,原告提供的证据具有真实性、合法性、关联性,本院对该证据予以采信;对被告提供的证据,本院对该证据的真实性予以采信,对证明目的因无其他的证据相互印证,故不予采纳。
另,本院对汪莉制作了一份调查笔录,调取了五张李超通过支付宝向汪莉转帐的记录及其与李超的微信聊天记录一份,对该证据本院予以采信。
本院经审理认定事实如下:2017年7月21日,原告承建平利县杨家梁城乡统筹示范区移民搬迁安置楼工程,同年7月25日原告向发包方平利县住房和城乡建设局申请停工,2018年8月10日原告申请复工。2018年3月12日,原告向被告新华保险申请购买建筑工程团体保险,2018年3月14日被告向原告出具建筑工程团体意外伤害保险及附加建筑工程意外伤害团体医疗保险的保单,建筑工程团体意外伤害保险的保险金额每人500000元,附加建筑工程意外伤害团体医疗保险的保险金额每人50000元,保险期间自2018年3月13日零时起至2019年3月8日24时止,被保险人数1000人,该团体保险合同项下无任何附加协议。原告于2018年3月9日向被告支付了保险费用42000元。保险期间届满前,原告向被告申请保险期间延期,保险公司同意将保险期间延期至2019年6月9日。2019年5月30日,原告第二次向被告申请延期三个月,并提交了工程量清单。2019年7月25日,原告投保的工地上的工人邹富卫发生意外事故,经抢救无效死亡,同日,原告(乙方)与死者家属(甲方)达成工伤赔偿协议:一、由乙方赔偿甲方死亡赔偿金、安葬费、被扶养人生活费、精神抚慰金等共计125万元;......三、如果涉及第三方赔偿,第三方的赔偿款在总赔偿金额中扣减,与甲方无关。原告于2019年7月26日支付死者家属120万元,2019年8月1日支付了5万元。2019年7月29日,被告公司职工李超向原告出具了情况说明及第一次保险期间延期批单。
另查明,被告新华人寿在平利县无营业网点,原告购买的建筑工程团体意外伤害保险是通过中间人汪莉介绍,由被告的业务员办理的保险业务,且被告的业务员李超给汪莉支付有提成,2018年李超向汪莉支付了五笔类似的提成,而办理保险业务需要由投保人提供的资料,均由李超与汪莉联系。
本院认为,依法成立的合同受法律保护。原、被告双方签订的建筑工程团体意外伤害保险合同,是双方真实意思的表示,且原告对保险合同具有保险利益,该合同不违反法律规定,是有效合同,双方当事人应按照合同约定全面履行义务。原告按照合同约定已履行了支付保险费的义务,被告应按照合同约定承担保险责任。原告与发包方签订的建设工程施工合同中约定的工期是2017年7月20日至2018年7月20日,因多方原因导致停工,且停工亦经过发包方同意,故其工期应另行计算。原、被告在签订保险合同时工程处于停工状态,故该合同的保险期间以双方约定的时间为准,即自2018年3月13日至2019年3月8日。原、被告双方签订的保险合同是被告保险公司提供的格式合同,根据该合同第2.2条约定:“如工程延期,投保人须提前书面通知本公司并办理保险期间延期手续。除另有约定外,保险期间延期累计不超过施工合同规定的工程竣工之日起15个月。若投保人未提前书面通知本公司并办理延期手续,本公司不承担工程延期期间的保险责任。”说明原告在保险期间届满前向被告申请延期,只需要履行书面通知和提供延期资料的义务,再无其他要求,故原告第一次申请延期后该保险合同的保险期间变更为2018年3月13日至2019年6月9日。原告再次向被告申请延期亦按照合同的约定履行了义务,被告收到原告的申请后应积极处理延期事项并在保险期间届满前告知原告处理结果,以便原告作出最佳的选择;但被告未将申请延期的处理结果直接告知原告,而是告知了中间人汪莉,可被告无证据证实汪莉是原告的职工,可以代表原告处分延期事项,且原告与汪莉均否认其为原告的职工,而根据李超与汪莉之间的来往记录也不能认定汪莉是原告的职工,故可以确认被告并未将再次申请延期的处理结果告知原告,被告对此事的处置明显不当,应当承担相应的法律后果;根据该条的约定,原告再次申请延期时并未超过关于保险期间延期的规定,即“......不超过施工合同规定的工程竣工之日起15个月”,更未超过双方签订保险合同时约定的保险期间届满之日起15个月,且双方对保险期间延期的条件亦无特别的约定,原告再次申请延期的行为符合双方签订的保险合同的内容,被告未在合理期限内办理延期手续的行为违反了该合同的约定,其应当承担不履行合同义务的违约责任。同时,保险合同中关于责任免除的条款中没有此类情形,被告应在保险限额内承担保险责任。原告投保的工地发生人员伤亡的意外事故,死者邹富卫属于保险合同约定的被保险人之一,原告已向死者家属承担了全部赔偿责任,且死者家属将向第三方申请赔偿的权利让与原告,故原告要求被告给付50万元意外伤害保险金的诉讼请求,符合法律规定,本院予以支持;被告提出原告主张的事故发生时已超过双方约定的保险期间,被告不承担保险责任的辩解意见,与查明的事实不符,本院不予采纳。据此,依照《中华人民共和国合同法》第六十条、第一百零七条、《中华人民共和国保险法》第十二条、第十四条、第三十一条第一款第(四)项、最高人民法院《关于适用〈中华人民共和国保险法〉若干问题的解释(三)》第十三条之规定,判决如下:
由被告新华人寿保险股份有限公司安康中心支公司支付原告平利县金瑞建筑工程有限公司意外伤害保险金500000元,限于本判决生效后三日内履行。
如果未按本判决指定的期间履行给付金钱义务的,依照《中华人民共和国民事诉讼法》第二百五十三条之规定,加倍支付迟延履行期间的债务利息。
本案受理费8800元,减半收取4400元,由被告新华人寿保险股份有限公司安康中心支公司负担。
如不服本判决,可在判决书送达之日起十五日内向本院递交上诉状,并按对方当事人的人数提出副本,上诉于陕西省安康市中级人民法院。
审 判 员 刘怀芳
二O一九年十二月二日
书 记 员 宋 波
(function () {
var pb_blacklist = [];
var pb_whitelist = ["pan.baidu.com","www.kxdao.com","asia.flow.microsoft.com","docs.qq.com","zh.savefrom.net","www.gebi1.com","www.sqgj.gov.cn","livewhutedu-my.sharepoint.com","livewhutedu-my.sharepoint.com","www.clipconverter.cc","settings.shuax.com","www.right.com.cn","192.168.1.10","pub.alimama.com","carrot.ctfile.com","youku.com","qq.com","engage.wixapps.net","linkedin.com","google","www.gmail.com","www.pinterest.com","www.youtube.com","www.facebook.com","search.yahoo.com","chrome://newtab","www.food.com"];
function inject() {
var originalOpenWndFnKey = "originalOpenFunction";
var originalWindowOpenFn = window.open;
var originalCreateElementFn = document.createElement;
var originalAppendChildFn = HTMLElement.prototype.appendChild;
var originalCreateEventFn = document.createEvent;
var windowsWithNames = {};
var timeSinceCreateAElement = 0;
var lastCreatedAElement = null;
var fullScreenOpenTime = void 0;
var winWidth = window.innerWidth;
var winHeight = window.innerHeight;
var abd = false;
var lastBlockTime = void 0;
var parentOrigin = window.location != window.parent.location ? document.referrer || window.parent.location || '*' : document.location;
var parentRef = window.parent;
//window[originalOpenWndFnKey] = window.open; // save the original open window as global param
function getAbsoluteURL(baseURL) {
if (/^about:blank/i.test(baseURL)) {
return baseURL;
}
if (/^(https?:)?\/\//.test(baseURL)) {
return baseURL;
}
baseURL = location.origin + (!/^\//.test(baseURL) ? '/' : '') + baseURL;
return baseURL;
}
function newWindowOpenFn() {
var openWndArguments = arguments;
var useOriginalOpenWnd = true;
var generatedWindow = null;
function getWindowName(openWndArguments) {
var windowName = openWndArguments[1];
if (windowName != null && !["_blank", "_parent", "_self", "_top"].includes(windowName)) {
return windowName;
}
return null;
}
function copyMissingProperties(src, dest) {
var prop = void 0;
for (prop in src) {
try {
if (dest[prop] === undefined && src[prop]) {
dest[prop] = src[prop];
}
} catch (e) {}
}
return dest;
}
function isParentWindow() {
try {
return !!(parent.Window && capturingElement instanceof parent.Window);
} catch (e) {
return false;
}
}
function isOverlayish(el) {
var style = el && el.style;
if (style && /fixed|absolute/.test(style.position) && el.offsetWidth >= winWidth * 0.6 && el.offsetHeight >= winHeight * 0.75) {
return true;
}
return false;
}
var capturingElement = null; // the element who registered to the event
var srcElement = null; // the clicked on element
var closestParentLink = null;
if (window.event != null) {
capturingElement = window.event.currentTarget;
srcElement = window.event.srcElement;
}
if (srcElement != null && srcElement instanceof HTMLElement) {
closestParentLink = srcElement.closest('a');
if (closestParentLink && closestParentLink.href) {
openWndArguments[3] = closestParentLink.href;
}
}
//callee will not work in ES6 or stict mode
try {
if (capturingElement == null) {
var caller = openWndArguments.callee;
while (caller.arguments != null && caller.arguments.callee.caller != null) {
caller = caller.arguments.callee.caller;
}
if (caller.arguments != null && caller.arguments.length > 0 && caller.arguments[0].currentTarget != null) {
capturingElement = caller.arguments[0].currentTarget;
}
}
} catch (e) {}
/////////////////////////////////////////////////////////////////////////////////
// Blocked if a click on background element occurred ( or document)
/////////////////////////////////////////////////////////////////////////////////
if (capturingElement == null) {
window.pbreason = 'Blocked a new window opened without any user interaction';
useOriginalOpenWnd = false;
} else if (capturingElement != null && (capturingElement instanceof Window || isParentWindow(capturingElement) || capturingElement === document || capturingElement.URL != null && capturingElement.body != null || capturingElement.nodeName != null && (capturingElement.nodeName.toLowerCase() == "body" || capturingElement.nodeName.toLowerCase() == "document"))) {
window.pbreason = 'Blocked a new window opened with URL: ' + openWndArguments[0] + ' because it was triggered by the ' + capturingElement.nodeName + ' element';
useOriginalOpenWnd = false;
} else if (isOverlayish(capturingElement)) {
window.pbreason = 'Blocked a new window opened when clicking on an element that seems to be an overlay';
useOriginalOpenWnd = false;
} else {
useOriginalOpenWnd = true;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Block if a full screen was just initiated while opening this url.
/////////////////////////////////////////////////////////////////////////////////
var fullScreenElement = document.webkitFullscreenElement || document.mozFullscreenElement || document.fullscreenElement;
if (new Date().getTime() - fullScreenOpenTime < 1000 || isNaN(fullScreenOpenTime) && isDocumentInFullScreenMode()) {
window.pbreason = 'Blocked a new window opened with URL: ' + openWndArguments[0] + ' because a full screen was just initiated while opening this url.';
/* JRA REMOVED
if (window[script_params.fullScreenFnKey]) {
window.clearTimeout(window[script_params.fullScreenFnKey]);
}
*/
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
}
useOriginalOpenWnd = false;
}
/////////////////////////////////////////////////////////////////////////////////
var openUrl = openWndArguments[0];
var inWhitelist = isInWhitelist(openUrl);
if (inWhitelist) {
useOriginalOpenWnd = true;
} else if (isInBlacklist(openUrl)) {
useOriginalOpenWnd = false;
}
if (useOriginalOpenWnd == true) {
generatedWindow = originalWindowOpenFn.apply(this, openWndArguments);
// save the window by name, for latter use.
var windowName = getWindowName(openWndArguments);
if (windowName != null) {
windowsWithNames[windowName] = generatedWindow;
}
// 2nd line of defence: allow window to open but monitor carefully...
/////////////////////////////////////////////////////////////////////////////////
// Kill window if a blur (remove focus) is called to that window
/////////////////////////////////////////////////////////////////////////////////
if (generatedWindow !== window) {
var openTime = new Date().getTime();
var originalWndBlurFn = generatedWindow.blur;
generatedWindow.blur = function () {
if (new Date().getTime() - openTime < 1000 && !inWhitelist /* one second */) {
window.pbreason = 'Blocked a new window opened with URL: ' + openWndArguments[0] + ' because a it was blured';
generatedWindow.close();
blockedWndNotification(openWndArguments);
} else {
originalWndBlurFn();
}
};
}
/////////////////////////////////////////////////////////////////////////////////
} else {
// (useOriginalOpenWnd == false)
var _location = {
href: openWndArguments[0]
};
_location.replace = function (url) {
_location.href = url;
};
generatedWindow = {
close: function close() {
return true;
},
test: function test() {
return true;
},
blur: function blur() {
return true;
},
focus: function focus() {
return true;
},
showModelessDialog: function showModelessDialog() {
return true;
},
showModalDialog: function showModalDialog() {
return true;
},
prompt: function prompt() {
return true;
},
confirm: function confirm() {
return true;
},
alert: function alert() {
return true;
},
moveTo: function moveTo() {
return true;
},
moveBy: function moveBy() {
return true;
},
resizeTo: function resizeTo() {
return true;
},
resizeBy: function resizeBy() {
return true;
},
scrollBy: function scrollBy() {
return true;
},
scrollTo: function scrollTo() {
return true;
},
getSelection: function getSelection() {
return true;
},
onunload: function onunload() {
return true;
},
print: function print() {
return true;
},
open: function open() {
return this;
},
opener: window,
closed: false,
innerHeight: 480,
innerWidth: 640,
name: openWndArguments[1],
location: _location,
document: { location: _location }
};
copyMissingProperties(window, generatedWindow);
generatedWindow.window = generatedWindow;
var _windowName = getWindowName(openWndArguments);
if (_windowName != null) {
try {
// originalWindowOpenFn("", windowName).close();
windowsWithNames[_windowName].close();
} catch (err) {}
}
var fnGetUrl = function fnGetUrl() {
var url = void 0;
if (!(generatedWindow.location instanceof Object)) {
url = generatedWindow.location;
} else if (!(generatedWindow.document.location instanceof Object)) {
url = generatedWindow.document.location;
} else if (_location.href != null) {
url = _location.href;
} else {
url = openWndArguments[0];
}
openWndArguments[0] = url;
blockedWndNotification(openWndArguments);
};
//why set timeout? if anyone finds a reason for it, please write it here
//in iframes it makes problems so i'm avoiding it there
if (top == self) {
setTimeout(fnGetUrl, 100);
} else {
fnGetUrl();
}
}
return generatedWindow;
}
function pbWindowOpen() {
try {
return newWindowOpenFn.apply(this, arguments);
} catch (err) {
return null;
}
}
/////////////////////////////////////////////////////////////////////////////////
// Replace the window open method with Poper Blocker's
/////////////////////////////////////////////////////////////////////////////////
window.open = pbWindowOpen;
/////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// Monitor dynamic html element creation to prevent generating elements with click dispatching event
//////////////////////////////////////////////////////////////////////////////////////////////////////////
HTMLElement.prototype.appendChild = function () {
var newElement = originalAppendChildFn.apply(this, arguments);
if (newElement.nodeName == 'IFRAME' && newElement.contentWindow) {
try {
var code = '(function () {\n var pb_blacklist = ' + JSON.stringify(pb_blacklist) + ';\n var pb_whitelist = ' + JSON.stringify(pb_whitelist) + ';\n ' + inject.toString() + ';\n inject();\n })();';
var s = document.createElement('script');s.text = code;
newElement.contentWindow.document.body.appendChild(s);
} catch (e) {}
}
return newElement;
};
document.createElement = function () {
var newElement = originalCreateElementFn.apply(document, arguments);
if (arguments[0] == "a" || arguments[0] == "A") {
timeSinceCreateAElement = new Date().getTime();
var originalDispatchEventFn = newElement.dispatchEvent;
newElement.dispatchEvent = function (event) {
if (event.type != null && ('' + event.type).toLocaleLowerCase() == "click") {
if (!isInWhitelist(newElement.href)) {
window.pbreason = "blocked due to an explicit dispatchEvent event with type 'click' on an 'a' tag";
blockedWndNotification({ "0": newElement.href });
return true;
}
}
return originalDispatchEventFn.call(this, event);
};
lastCreatedAElement = newElement;
}
return newElement;
};
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Block artificial mouse click on frashly created elements
/////////////////////////////////////////////////////////////////////////////////
document.createEvent = function () {
try {
if (arguments[0].toLowerCase().includes("mouse") && new Date().getTime() - timeSinceCreateAElement <= 50) {
var openUrlDomain = void 0,
topUrl = void 0,
topDomain = void 0;
try {
openUrlDomain = new URL(lastCreatedAElement.href).hostname;
} catch (e) {}
try {
topUrl = window.location != window.parent.location ? document.referrer : document.location.href;
} catch (e) {}
try {
topDomain = new URL(topUrl).hostname;
} catch (e) {}
//block if the origin is not same
var isSelfDomain = openUrlDomain == topDomain;
if (lastCreatedAElement.href.trim() && !isInWhitelist(lastCreatedAElement.href) && !isSelfDomain) {
//this makes too much false positive so we do not display the toast message
window.pbreason = 'Blocked because \'a\' element was recently created and ' + arguments[0] + ' event was created shortly after';
arguments[0] = lastCreatedAElement.href;
blockedWndNotification({ "0": lastCreatedAElement.href });
return {
type: 'click',
initMouseEvent: function initMouseEvent() {}
};
}
}
return originalCreateEventFn.apply(document, arguments);
} catch (err) {}
};
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
// Monitor full screen requests
/////////////////////////////////////////////////////////////////////////////////
function onFullScreen(isInFullScreenMode) {
if (isInFullScreenMode) {
fullScreenOpenTime = new Date().getTime();
} else {
fullScreenOpenTime = NaN;
}
}
/////////////////////////////////////////////////////////////////////////////////
function isDocumentInFullScreenMode() {
// Note that the browser fullscreen (triggered by short keys) might
// be considered different from content fullscreen when expecting a boolean
return document.fullScreenElement && document.fullScreenElement !== null || // alternative standard methods
document.mozFullscreenElement != null || document.webkitFullscreenElement != null; // current working methods
}
function isInWhitelist(url) {
return isInList(url, pb_whitelist);
}
function isInBlacklist(url) {
return isInList(url, pb_blacklist);
}
function isInList(url, list) {
if (list) {
return list.some(function (li) {
return new RegExp("https?://(www\.|.*\.)?" + li + "+").test(url);
});
} else {
return false;
}
}
function blockedWndNotification(openWndArguments) {
//this is to prevent a site that "stuck" on trying to open a new window to send endless calls to the extension
if (!lastBlockTime || lastBlockTime < Date.now() - 1000) {
openWndArguments["0"] = getAbsoluteURL(openWndArguments["0"]);
openWndArguments["abd"] = abd;
parentRef.postMessage({ type: "blockedWindow", args: JSON.stringify(openWndArguments) }, parentOrigin);
}
lastBlockTime = Date.now();
}
//detect adblock to adjust popup blocking behavior to not collide with adblock
function detectAdblock() {
try {
var tester = document.createElement('div');
tester.innerHTML = '';
tester.className = 'adsbox';
tester.style.cssText = "position:absolute;top-1000px;left:-1000px;";
document.body.appendChild(tester);
window.setTimeout(function () {
if (tester.offsetHeight === 0) {
abd = true;
}
tester.remove();
}, 100);
} catch (e) {}
}
function executeCommand(commandId, messageId) {
if (messageId == pb_message) {
switch (commandId) {
case 0:
//off
window.open = originalWindowOpenFn;
document.createElement = originalCreateElementFn;
document.createEvent = originalCreateEventFn;
HTMLElement.prototype.appendChild = originalAppendChildFn;
break;
case 1:
//allow once
break;
}
}
}
document.addEventListener("fullscreenchange", function () {
onFullScreen(document.fullscreen);
}, false);
document.addEventListener("mozfullscreenchange", function () {
onFullScreen(document.mozFullScreen);
}, false);
document.addEventListener("webkitfullscreenchange", function () {
onFullScreen(document.webkitIsFullScreen);
}, false);
//document.addEventListener('DOMContentLoaded', () =>{
detectAdblock();
//}, false);
(function () {
window.pbExternalCommand = function (commandId, messageId) {
executeCommand(commandId, messageId);
};
})();
};
inject();
})();