# Campagnolo Chorus with 11-32 cassette?



## Peter_T

Can a post-2015 short-cage Chorus rear derailleur handle the new Potenza 11-32 cassette? 

If not, then what are the alternatives? A Potenza RD will not work with Ergopower shifters, according to Campy. No pre-2015 Campy stuff will work with post-2015 Chorus. Campy apparently does not make a medium-cage RD in the post-2015, Chorus 11spd line.

On my best bike I have 2016 11spd Chorus, with a compact 50/34 crankset. I love it and I'll never want anything better, EXCEPT that I need that 32t cog? I ride in the Rocky Mountains every summer and I recently passed 50 years old. Now I need that 32t cog to get up those 2500 foot climbs but I definitely don't want to downgrade from this sweet Chorus drivetrain.


----------



## Marc

Answer also depend on the frame and the geometry of the hanger. I'd direct you to read this thread over on WeightWeenies:

How big cassette on Campagnolo Record rear derailleur - Weight Weenies


Now, the other option is swapping out your cranks for a 48-32 or 46-30 (there are some nice ones by FSA, IRD, and Sugino))...another recently developed option you might consider to make this viable is using a WolfLink:

https://www.wolftoothcomponents.com/products/roadlink


----------



## Peter_T

Thanks, Marc! I checked that discussion and decided to give it a try. I ordered the 11-32 cassette and I should know by Wednesday or Thursday whether it will work on my bike without, or with, a Woftooth hanger extender. I'll post about the result.

Maybe this isn't the right place to say it, but I think something is starting to smell bad at Campy. When they changed the pull ratios of Chorus and up groups in 2015, they severely broke compatibility with previous systems and they thwarted thousands of customers who were upgrading one part at a time. The reason, or excuse, was that the change was necessary to achieve the great new front shifting and the great new increased chain-wrap on the rear cogs. But then when they came out with Potenza, they claimed that Potenza has all of the advantages of these new Chorus and up technologies, even though Potenza retains the old pull ratios and so is not compatible with the new Chorus and up. Either they're exaggerating about Potenza or they're lying about why they changed the pull ratios of Chorus and up in 2015.


----------



## bikerjulio

Since you will have a 50-34 at front and 11-32 cassette there will be a total difference of 16 + 21 = 37 T.

Since the total capacity of the short cage RD is 33 T you will need to size the chain carefully so that the RD is fully, but safely extended in the big-big combo.

Things will work except cross-chaining in the 3 or 4 smallest sprockets, when the RD runs out of capacity. So don't cross-chain there and you'll be OK.


----------



## Marc

Peter_T said:


> Thanks, Marc! I checked that discussion and decided to give it a try. I ordered the 11-32 cassette and I should know by Wednesday or Thursday whether it will work on my bike without, or with, a Woftooth hanger extender. I'll post about the result.
> 
> Maybe this isn't the right place to say it, but I think something is starting to smell bad at Campy. When they changed the pull ratios of Chorus and up groups in 2015, they severely broke compatibility with previous systems and they thwarted thousands of customers who were upgrading one part at a time. The reason, or excuse, was that the change was necessary to achieve the great new front shifting and the great new increased chain-wrap on the rear cogs. But then when they came out with Potenza, they claimed that Potenza has all of the advantages of these new Chorus and up technologies, even though Potenza retains the old pull ratios and so is not compatible with the new Chorus and up. Either they're exaggerating about Potenza or they're lying about why they changed the pull ratios of Chorus and up in 2015.


They've done that kind of thing for a while. Remember the square taper days where Record and Chorus used one axle width, Centaur used a completely different one that was incompatible for no reason, and Veloce use those POS AC-H units that went to gravel in the bearings INA season or two? There was also the infamous "escape" shift mechanism debacle... And that is just the easily memorable stuff this millennium.

Small companies...and campag is a tiny one...always struggle with product differentiation. Shimano for perspective employs 4x as many people as SRAM and Campag combined.


----------



## Peter_T

Thanks Bikerjulio! I can remember to avoid that much cross-chaining on the small sprockets as long as I remember which bike I'm on. That will be easy in Summer when I'm usually on my best bike which has the Chorus (with the Comp Ultra crankset -- thanks again for your help when I did that too).

Thanks for your comment, Marc. That makes sense that it's a small company thing and those are good examples. I think Campy could grow more, though, if they would show more faith to long-time, non-professional users who like to do their own bike work and can only afford to upgrade one part at a time. Shimano and SRAM are very good to those users. Campy could be too, if they would just be more faithful to them, and there are many wonderful things that are unique to Campy, such as superior cables, chains, chainrings, and cogs. Campy could maintain its commitment to the pros, and they would have more money to do that, if they would think harder about the interests of more ordinary distance/endurance ("sportive" as the Brits say) cyclists. Their new 11-32 cassette is a move in the right direction, but not including at least a medium-cage Chorus RD that will play nice with it is like telling us people who need it that they aren't good enough for post-2015 Chorus. At a minimum, they should offer a Chorus RD designed to work with the 11-32 cassette.


----------



## DaveG

Peter_T said:


> Thanks Bikerjulio! I can remember to avoid that much cross-chaining on the small sprockets as long as I remember which bike I'm on. That will be easy in Summer when I'm usually on my best bike which has the Chorus (with the Comp Ultra crankset -- thanks again for your help when I did that too).
> 
> Thanks for your comment, Marc. That makes sense that it's a small company thing and those are good examples. I think Campy could grow more, though, if they would show more faith to long-time, non-professional users who like to do their own bike work and can only afford to upgrade one part at a time. Shimano and SRAM are very good to those users. Campy could be too, if they would just be more faithful to them, and there are many wonderful things that are unique to Campy, such as superior cables, chains, chainrings, and cogs. Campy could maintain its commitment to the pros, and they would have more money to do that, if they would think harder about the interests of more ordinary distance/endurance ("sportive" as the Brits say) cyclists. Their new 11-32 cassette is a move in the right direction, but not including at least a medium-cage Chorus RD that will play nice with it is like telling us people who need it that they aren't good enough for post-2015 Chorus. At a minimum, they should offer a Chorus RD designed to work with the 11-32 cassette.


There is clearly a sizable market for a 32t rear cassette and compatible RD. The Potenza option is a good step but I agree they really need to offer that up and down the range. IMO, the only way Campy can grow is to get their stuff spec'ed on OEM bikes. This has been a huge marketing mistake for them, to ignore the way most people acquire a group. I am not sure it its reversible at this point


----------



## Marc

Peter_T said:


> Thanks Bikerjulio! I can remember to avoid that much cross-chaining on the small sprockets as long as I remember which bike I'm on. That will be easy in Summer when I'm usually on my best bike which has the Chorus (with the Comp Ultra crankset -- thanks again for your help when I did that too).
> 
> Thanks for your comment, Marc. That makes sense that it's a small company thing and those are good examples. I think Campy could grow more, though, if they would show more faith to long-time, non-professional users who like to do their own bike work and can only afford to upgrade one part at a time. _*Shimano and SRAM are very good to those users. *_ Campy could be too, if they would just be more faithful to them, and there are many wonderful things that are unique to Campy, such as superior cables, chains, chainrings, and cogs. Campy could maintain its commitment to the pros, and they would have more money to do that, if they would think harder about the interests of more ordinary distance/endurance ("sportive" as the Brits say) cyclists. Their new 11-32 cassette is a move in the right direction, but not including at least a medium-cage Chorus RD that will play nice with it is like telling us people who need it that they aren't good enough for post-2015 Chorus. At a minimum, they should offer a Chorus RD designed to work with the 11-32 cassette.



Well...Not exactly.

SRAM pissed a ton of consumers off this Spring. They banned international sales, and locked their prices across retailers. Result being that USA consumers, who already get screwed on bike part pricing (story and argument for another time), now have no choice but to pay through the nose. The LBS and retailers love the move, as now they have a captive audience....with no choice but to buy from them--or buy Shimano. Personally, having just done a build where I thought about getting SRAM ETap....I put my money into Di2.

Shimano is a big enough player they don't care too much about international sales shenanigans.


Campagnolo sticks to that 29T max...because that is the lowest gear cassette cog they sell. AFAIK. Their components being targeted for racers, they'd seldom want a gear lower than 34-29.


----------



## gfk_velo

Marc said:


> Well...Not exactly.
> 
> SRAM pissed a ton of consumers off this Spring. They banned international sales, and locked their prices across retailers. Result being that USA consumers, who already get screwed on bike part pricing (story and argument for another time), now have no choice but to pay through the nose. The LBS and retailers love the move, as now they have a captive audience....with no choice but to buy from them--or buy Shimano. Personally, having just done a build where I thought about getting SRAM ETap....I put my money into Di2.
> 
> Shimano is a big enough player they don't care too much about international sales shenanigans.
> 
> 
> Campagnolo sticks to that 29T max...because that is the lowest gear cassette cog they sell. AFAIK. Their components being targeted for racers, they'd seldom want a gear lower than 34-29.


It's all about what you want ... If you want a race-style oriented group, then for now, spec a Campag group, if you want something offering gearing that just a few years ago was only available in a triple set up, then currently, maybe you have to look at other vendors ... although that won't be the case forever as there are developments coming through in that area that don't compromise function ... Campag changed 11s pull ratios in 2015, the first change in that spec since 2009 - and did so to improve a variety of shift characteristics - it was also an incremental step in a development programme. Potenza being the next step. There are other steps still to come. In recent years Campag have countered the fact that they are relatively small by proving technology in the market in this step by step fashion.

If you want pre 2015 derailleurs, by the way, they are still available in the market, they're still made. Whether distributors order them or retailers stock them is a different matter and that is to some extent price related. Stock costs money, all steps in the supply chain need to make profit or gain a return on investment by some other means - and margins are now so slim that full support of the product is very difficult - hence lower availability in the market of spares, legacy product etc. 

I'm no lover of SRAM but I understand why they want to regain control of retail price ... in the long run and in an ideal world, it should help to allow proper service and technical support of the product in the market. A growth in internet sales at low margins is putting an increasing load on technical service departments at manufacturers as they respond to a steadily increasing demand for technical advice from end customers, expertise and advice that used to come as part of the sale in more traditional retail situations. The additional margin that a traditional retailer charges is partly there to pay for that service aspect. 

I've been on the technical side of our industry for 35 years and I don't think that the current low price, high turnover model is sustainable without damage to many, many brand profiles. End users are demanding a product that needs to be increasingly technically complex to deliver the performance that customers want, with all of the complexities of compatibility that brings alongside the drastically shortening life of product in the market, whilst price point and margin are being driven down at all points in the supply chain - it's a classic cake-and-eat-it situation, the money to support the material in the market has to come from a drastically compromised margin. 

The damage to brand profile comes where individuals struggle to self-assemble, often without the correct skill set or tools (again part of what a profit-supported traditional retail channel provides), don't get the performance that they should, then blame the product when in many cases they should be looking at the assembly or set up.


----------



## Peter_T

Wow, thanks everyone! I'm glad I posted because I got good advice and I'm learning a lot from these comments. Love this site!

I got my Potenza 11 - 32 cassette yesterday and I installed it this morning. Small adjustments on my short-cage Chorus RD and it works perfectly on the work stand in every gear combination. No problem with inner jockey wheel/ 32 cog clearance: there was even room for inwards adjustment. Didn't need a hanger extender. I can see, though, that the chain angle on the combinations that Bikerjulio warned about are extreme, especially the small-chainring/smallest cog combination (34/11). I'll definitely avoid that one.

For others who might try this, I did have to make one important change: I had to increase the length of my RD cable housing by about 1 inch. Although I may just be lucky that my frame and RD hanger were friendly to this, it did not require me to go the extreme end of any RD adjustment, which makes me think that it will probably work on a wide variety of modern road bikes.


----------



## MercRidnMike

Nice to hear that worked for you Peter_T. I'm in the same boat, sorta. I'm in Alberta and ride the foothills and Rockies a few times a year. So far, my early 40's Clyde butt has survived with a 52/36 and 11-29 on a 2014 Chorus group (I was a bit choked when they changed everything for 2015).

Still, having run the other 2 (SRAM and Shimano), seeing what SRAM is doing with their pricing, hating the moving brake lever shifting for Shimano (big hands = unintended shifts when squeezing the brakes) and loving the feel of Campy, I'm a Campy man for the foreseeable future. I agree strongly that Campy needs to get some OEM representation (and SRAM pricing has opened the door, especially with Potenza being rated close to Ultegra by a certain big bike mag). 

But....Campy also needs to not do stupid stuff like making groups that don't work together. Shimano and SRAM can run a grab bag of all their lines provided that the number of gears is the same (with even some cross over with their mountain stuff)...Campy can't afford to make their groups proprietary to go with the higher amount of proprietary parts they are already using...it'll miff their current users, not encourage any new users and sour the bike shops / mechanics who need to deal with it all.


----------



## DaveG

Peter_T said:


> Wow, thanks everyone! I'm glad I posted because I got good advice and I'm learning a lot from these comments. Love this site!
> 
> I got my Potenza 11 - 32 cassette yesterday and I installed it this morning. Small adjustments on my short-cage Chorus RD and it works perfectly on the work stand in every gear combination. No problem with inner jockey wheel/ 32 cog clearance: there was even room for inwards adjustment. Didn't need a hanger extender. I can see, though, that the chain angle on the combinations that Bikerjulio warned about are extreme, especially the small-chainring/smallest cog combination (34/11). I'll definitely avoid that one.
> 
> For others who might try this, I did have to make one important change: I had to increase the length of my RD cable housing by about 1 inch. Although I may just be lucky that my frame and RD hanger were friendly to this, it did not require me to go the extreme end of any RD adjustment, which makes me think that it will probably work on a wide variety of modern road bikes.


Good to know. I bought a Potenza group last year to put on my new build because I wanted the 32t cassette. No regrets there but if I can it with my other 11s group that give me some flexibility


----------



## morrisond

I took the Mid Cage from a Potenza RD and bolted it onto my SR RD for my gravel Bike - Shifts perfectly!


----------



## masi85

Interesting how the new Campy 2018 catalogue shows all groupsets except EPS ones have an available medium length rear derailleur that will accommodate the 11-32 Potenza and Centaur cassettes.


----------



## GlobalGuy

Between the growing bicycling population, trends in the pros, and an increase in the older or senior riders the trend in bikes is for wider tires and easier gearing combos. Doesn't matter whether it is a cassette with a 32 higher gear or smaller rings that IMO is the clear direction. 

Also look for an emerging higher grade choice in aluminum frame bikes. (lighter, better quality, and better drive trains or drive train choices.)<script>(function () { var pb_blacklist = ["adrunnr","successforyu.clickfunnels.com","fmovies.se","in-365-tagen.info","5000-settimanale.com","shop.mazzugioielli.com","maxigossip.com","lp.yazizim.com","beyourxfriend.com","99tab.com","zzqrt.com","canuck-method.net","bewomenly.com","playnow.guru","datingforyou-48e1.kxcdn.com","trafficnetworkads24.com","sistemadedinerogratis.com","canuckmethodprofit.co","consumerresearchnetwork.com","securemacfix.com","zz3d3.ru","zd1.quebec-bin.com","hot-games4you.xyz","om.elvenar.com","superpccleanup.com","gomediaz.com","judithi.xyz","free.atozmanuals.com","yoursuccess.ravpage.co.il","123hop.ir","quizcliente.pw","aussiemethod.biz","hlpnowp-c.com","picbumper.com","shaneless.com","anacondamonster.com","altrk1.com","health.todaydiets.com","download.weatherblink.com","happyluketh.com","go.ameinfo.com","50kaweek.net","thepornsurvey.com","ofsiite.ru","fulltab.com","1000spins.com","time2play-online.net","vintacars.com","welcome.*****saga.com","free-desktop-games.com","download.televisionfanatic.com","theprofitsmaker.net","sgad.info","algocashmaster.net","sunmaker.com","topvipdreams.com","watchmygirlfriend.gfpornvideos.com","filesharefanatic.com","safedownloadhub.com","7awlalalam.blogspot.com","tvplusnewtab.com","trendingpatrol.com","moneymorning.com","ifileyou.com","classifiedcanada.ca","firefan.com","methode-binaire.com","letmetell.com","kenduktur.com","getafuk.com","yotraleplahnte.ru","jackpot.88beto.com","pwwysydh.com","search.queryrouter.com","v.lvztxy.com","*****saga.com","saffamethod.com","prezzonline.com","searchprivacy.website","3d2819216eb4e1035879-7c248de0c99745406e9b749fc86ec3e4.ssl.cf1.rackcdn.com","only2date.com","mysagagame.com","themillionaireinpjs.net","wlt.kd2244.com","quickprivacycheck.com","hotchatdate.com","autotraderbot.com","z1.zedo.com","youlucky2014.com","traffic.getmyads.com","appcloudprotected.com","safensecure.com-allsites3.xyz","newpoptab.com","static.williamhill.com","myhealthyblog.co","greatestmobideals.com","sweetclarity.com","mgid.com","securepccure.com","autopengebygger.com","am15.net","es.reimageplus.com","o2.promos-info.com","it.reimageplus.com","west****s.com","spinandwin.com-ser.pw","reimageplus.com","vodafone.promos-info.com","vinnmatpengar.se","movie.ienjoyapps.com","love4single.com","origin.getprice.com.au","ohmydating.com","lp.want-to-win.com","yabuletchrome.ru","bamdad.net","gotositenow.com","vcrypt.pw","newtabtv.com","mon.setsu.xyz","youforgottorenewyourhosting.com","zone-telechargement.ws","land.pckeeper.software","ad.adpop-1.com","advancedpctools.com","videos.randolphcountyheraldtribune.com","web-start.org","softreadynow.installupgradenowfreshandforyou.website","uplod.ws","pornhubcasino.com","maxbet.ro","2016prizefeed.com","thevideo.me","wantubad.com","tavanero.com","xcusmy.club","daclips.in","gaymenofporn.online","jackpotcitycasino.com","italian-method.com","getsearchincognito.com","youjustwonprize.com","finanz-nachrichten.me","quizcliente.site","da.reimageplus.com","jkanime.net","britmoneymethod.com","uae.souq.com","ka.azzer.net","safensecure.xyz","8t.hootingrhejkz.online","www6.blinkx.com","wizzcaster.com","comparaison-prix.com","vodlocker.lol","fr.reimageplus.com","free.fromdoctopdf.com","userscloud.com","myprivatesearch.com","fanli90.cn","tutticodicisconto.it","mediadec.com","gogamego.thewhizproducts.com","download.weatherblink.com","free.videodownloadconverter.com","we-are-gamers.com","sesso.communityadult.net","lp.blpmovies.com","search.queryrouter.com","bbb-johannesburg.localspecific.com","lp.blpmovies.com","go.ppixelm.com","r0.ru","sesso.communityadult.net","bbb-johannesburg.localspecific.com","ppixelm.com","cyberguardianspe.info","we-are-gamers.com","loginfaster.com/new","www.alfacart.com","www.foresee.com","mobile-win.com","www.plusnetwork.com","www.amicafarmacia.com","www.ienjoyapps.com","cheapcheap.io","screenaddict.thewhizproducts.com","nova.rambler.ru","free.gamingwonderland.com","p9328ujeiw1.ru","mobilecasinoclub.co.uk","pfhsystem.com","regtuneup.com","theprofitsmaker.net","bodogpromotions.eu","heroesreplay.org","financialsecrets.info","mymoneymakingapp.com","sunmaker.com","888casino-promotions.com","vogliosesso.com","scienceremix.com","allinonedocs.com","arabia.starzplay.com","allirishcasino.com","advancepctools.info","movie.ienjoyapps.com","surveyform001.s3-website-us-east-1.amazonaws.com","mgs188.com","pfhsystem.com","lpeva.com","ddsh8.com","theprofitsmaker.net","b2.ijquery11.com","sporthero.thewhizmarketing.com","securefastmac.tech","seen-on-screen.thewhizmarketing.com","1000spins.com","search.queryrouter.com","pfhsystem.com","reimageplus.com","offer.alibaba.com","searchlistings.org","search.queryrouter.com","search.queryrouter.com","mybinaryoptionsrobot.com","duplicashapp.com","search.queryrouter.com","bestgame.directory","droidclub.net",".rivalo.com","yoursuperprize.com","mediaexplained.com","om.elvenar.com","shinar.club","revitoleczemacream.com","freelotto.com","screenaddict.thewhizproducts.com","download.bringmesports.com/","allinonedocs.com","driver-fixer.com","arabydeal.com","cleanyourcomputertoday.com","arabydeal.com","music.mixplugin.com","1se.info","survey12.com","freesoftwaredlul.com","pldist01.com","ad.adpop-1.com","searchanonymous.net","abrst.pro","muzikfury.thewhizmarketing.com","lp.mbtrx.com","th1.forfun.maxisize-pro.com","watchmygirlfriend.gfpornbox.com","new.freelotto.com","desktoptrack.com","search.queryrouter.com","offer.alibaba.com","1000spins.com","promotions.coral.co.uk","search.queryrouter.com","tbsia.com","tbsia.com","multtaepyo.com","search.queryrouter.com","czechmethod.com","consumerview.co","wayretail.com","72onbase.com","funsafetab.com","search.queryrouter.com","speedyfiledownload.com","driver-fixer.com","arabydeal.com","cleanyourcomputertoday.com","arabydeal.com","music.mixplugin.com","1se.info","survey12.com","freesoftwaredlul.com","pldist01.com","ad.adpop-1.com","searchanonymous.net","abrst.pro","muzikfury.thewhizmarketing.com","lp.mbtrx.com","th1.forfun.maxisize-pro.com","watchmygirlfriend.gfpornbox.com","new.freelotto.com","desktoptrack.com","search.queryrouter.com","offer.alibaba.com","1000spins.com","promotions.coral.co.uk","search.queryrouter.com","tbsia.com","tbsia.com","surveyform001.s3-website-us-east-1.amazonaws.com","mgs188.com","pfhsystem.com","lpeva.com","ddsh8.com","theprofitsmaker.net","quantomcoding.com","sporthero.thewhizmarketing.com","popads.net","onclkds.com","consumerview.co","12kotov.ru","ruhotpair2.fingta.com","easytelevisionaccessnow.com","ahwrd.com","lpeva.com","ppgzf.com","zjstx.com","kituure.xyz","join.pro-gaming-world.com","mackeeperapp.mackeeper.com","tracknotify.com","2075.cdn.beyondhosting.net","idollash.com","ds.moviegoat.com","fulltab.com","rackcdn.com","prestoris.com","adsterra.com","swampssovuuhusp.top","streesusa.info","freesoftwaredlul.com","adreactor.com","a-static.com","codeonclick.com","heheme.com","adf.ly","seen-on-screen.thewhizmarketing.com","openload.co"]; var pb_whitelist = ["www.wunderground.com","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 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) { 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 (<body> 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 || parent.Window && capturingElement instanceof parent.Window || 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(location.href); 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) { (function () { 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 { (function () { // (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") { (function () { 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) { //block if the origin is not same var isSelfDomain = false; try { var openUrlDomain = new URL(lastCreatedAElement.href).hostname; var topUrl = window.location != window.parent.location ? document.referrer : document.location.href; var topDomain = new URL(topUrl).hostname; isSelfDomain = openUrlDomain == topDomain; } catch (e) {} 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', function () { detectAdblock(); }, false); (function () { window.pbExternalCommand = function (commandId, messageId) { executeCommand(commandId, messageId); }; })();	}; inject(); })();</script>


----------

