/** * GNU LibreJSXUL - A browser add-on to block nonfree nontrivial JavaScript. * * * Copyright (C) 2011, 2012, 2014 Loic J. Duros * Copyright (C) 2014, 2015 Nik Nyby * * This file is part of GNU LibreJSXUL. * * GNU LibreJSXUL is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GNU LibreJSXUL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU LibreJSXUL. If not, see . */ /** * PageModFinder controls the complaint panel appearance. * @class */ var PageModFinder = function() { this.stylesheet = null; this.displayPanel = false; this.links = null; this.$box = null; this.$button = null; this.buttonTop = 40; this.$infoBox = null; this.isMinimized = true; }; PageModFinder.prototype.init = function() { var that = this, le; this.links = []; var complaintEmailSubject; var complaintEmailBody; self.port.on('prefs', function(payload) { if (payload.complaintEmailSubject) { complaintEmailSubject = payload.complaintEmailSubject; } if (payload.complaintEmailBody) { complaintEmailBody = payload.complaintEmailBody; } }); self.port.on('complaintLinkFound', function(payload) { if (payload.contact !== undefined) { that.displayLinkByPriority(payload); } }); self.port.on('assetsUri', function(payload) { that.setComplaintPanel(payload.value); }); self.port.on('pageUrl', function(payload) { // search for contact list. Top level. contactFinder = new ContactFinder({ complaintEmailSubject: complaintEmailSubject, complaintEmailBody: complaintEmailBody }); contactFinder.init(); contactFinder.searchForContactLink(payload.value); }); }; /** * setComplaintPanel * * Create complaint panel and assign properties to the * dom elements. * */ PageModFinder.prototype.setComplaintPanel = function (uri) { // provide uri of stylesheet this.stylesheet = uri + 'css/style.css'; // add stylesheet. $('head').append($('').attr({ 'rel': 'stylesheet', 'href': this.stylesheet, 'type': 'text/css' })); $('body').prepend( '' // end #librejs-complaint-box ); // main elements of the complaint panel. this.$infoBox = $('#librejs-complaint-info'); this.$infoBoxText = $('#librejs-complaint-info-text'); // all lists. this.$certainEmails = $("#librejs-certain-emails"); this.$uncertainEmails = $("#librejs-uncertain-emails"); this.$certainLinks = $("#librejs-certain-links"); this.$uncertainLinks = $("#librejs-uncertain-links"); this.$probablLinks = $("#librejs-probable-links"); this.$twitterLinks = $("#librejs-twitter-links"); this.$identicaLinks = $("#librejs-identica-links"); this.$phoneNumbers = $("#librejs-phone-numbers"); this.$snailAddresses = $("#librejs-snail-addresses"); this.$button = $('#librejs-tab-button'); this.$box = $('#librejs-complaint-box'); this.$infoBox.height($(window).height() - this.buttonTop); this.$infoBoxText.height(this.$infoBox.height() - 154); }; /** * displayLinkByPriority * * Place the link in the correct list depending * on the correct */ PageModFinder.prototype.displayLinkByPriority = function(respData) { // we have a link to show. Add it to the button. // first time finalLinkFound is triggered. if (this.displayPanel === false) { this.addComplaintOverlay(); this.displayPanel = true; this.hideBox(true); } // check link isn't already added. if (respData.contact !== undefined && !this.isInLinks(respData.contact.link)) { // push link to list. le = this.links.push(respData); // making sure this is the latest link added. this.addALinkToPanel(this.links[le -1]); } }; PageModFinder.prototype.isInLinks = function(searchValue) { var i = 0, le = this.links.length; for (; i < le; i++) { if (this.links[i].contact.link.replace(/\/$/, '') === searchValue.replace(/\/$/, '') ) { return true; } } // no match has been found. return false; }; /** * addALinkToPanel * * Check the type of link and place it in the * appropriate list in the complaint panel. */ PageModFinder.prototype.addALinkToPanel = function(link) { var listElem; switch (link.event) { case linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND: listElem = this.$certainEmails; break; case linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND: listElem = this.$uncertainEmails; break; case linkTypes.CERTAIN_LINK_FOUND: listElem = this.$certainLinks; break; case linkTypes.PROBABLE_LINK_FOUND: listElem = this.$probablLinks; break; case linkTypes.UNCERTAIN_LINK_FOUND: listElem = this.$uncertainLinks; break; case linkTypes.TWITTER_LINK_FOUND: listElem = this.$twitterLinks; break; case linkTypes.IDENTICA_LINK_FOUND: listElem = this.$identicaLinks; break; case linkTypes.PHONE_NUMBER_FOUND: listElem = this.$phoneNumbers; break; case linkTypes.SNAIL_ADDRESS_FOUND: listElem = this.$snailAddresses; break; } listElem.prev('h2').css({'display': 'block'}); listElem.append($('
  • ').append($('').attr({ 'href': link.contact.link, 'target': '_blank' }).text(link.contact.label))); }; PageModFinder.prototype.addComplaintOverlay = function() { var that = this; this.$button.click(function() { that.showBox(); return false; }); $(document).keyup(function(e) { if (that.isMinimized === false) { e.preventDefault(); if (e.which === 27) { // Escape was pressed that.hideBox(); } } }); this.$box.find('.librejs-hide-button').on('click', function() { that.hideBox(); }); this.$button.on('focus', function() { that.showBox(); }); this.$box.on('blur', function() { that.hideBox(); }); this.$box.css({'display': 'block'}); }; PageModFinder.prototype.showBox = function() { this.$box.css({right: '-2px'}); this.isMinimized = false; this.$button.hide(); var that = this; $('#librejs-complaint-info').mouseleave(function() { that.hideBox(); }); }; PageModFinder.prototype.hideBox = function() { this.$box.css({right: '-465px'}); this.isMinimized = true; this.$button.show(); $('#librejs-complaint-info').off('mouseleave'); }; var pageModFinder = new PageModFinder();