home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 57131 / 57131.xpi / chrome / beefree.jar / content / beefree / beefree.main.js < prev    next >
Encoding:
JavaScript  |  2010-01-25  |  14.3 KB  |  389 lines

  1. /*
  2.     2009 - Copyright by Bee <http://www.honeybeenet.altervista.org>.
  3.     This program is free software; you can redistribute it and/or
  4.     modify it under the terms of the GNU General Public License
  5.     as published by the Free Software Foundation; either version 2
  6.     of the License, or (at your option) any later version.
  7.  
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.  
  13.     You should have received a copy of the GNU General Public License
  14.     along with this program; if not, write to the Free Software
  15.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  16. */
  17.  
  18. /* It took me ages to write the right RegExps, i'm sill unsure if they're 100% ok!!!
  19. btw, i've got how they work!!!!!!!!!!!! and, as the best, i've got they work!!!!!!
  20. */
  21.  
  22.  
  23.  
  24. function beefree_replace(doc, link, handler_index, href, address)
  25. {
  26.     var stack = new Array();
  27.     var recursions_max = beefree_website_get_info(handler_index, "links.recursion") ? 127 : 1;
  28.     var tmp = href;
  29.     for(var recursions = 0; recursions < recursions_max; recursions++)
  30.     {
  31.         stack["address"] = href;
  32.         stack["current_page"] = address;
  33.         href = beefree_website_get_info(handler_index, "links.function.replace")(handler_index, stack);
  34.         if(href == tmp)
  35.             break;
  36.         tmp = href;
  37.     }
  38.     return href;
  39. }
  40.  
  41. function beefree_handler_find_from_url(address, include_disabled_engines /* = false*/)
  42. {
  43.     var stack = new Array();
  44.     var i = beefree_website_fetch_init();
  45.     while(beefree_website_fetch_test(++i))
  46.     {
  47.         stack["address"] = address;
  48.         if(
  49.                 (beefree_website_get_info(i, "enabled") || include_disabled_engines) && 
  50.                 (beefree_website_get_info(i, "test.domain")(i, stack))
  51.         )
  52.         {
  53.             return i;
  54.         }
  55.     }
  56.     return -1;
  57. }
  58.  
  59. function beefree_handler_find_from_host(hostname, include_disabled_engines /* = false*/)
  60. {
  61.     var stack = new Array();
  62.     var i = beefree_website_fetch_init();
  63.     while(beefree_website_fetch_test(++i))
  64.     {
  65.         stack["hostname"] = hostname;
  66.         if(
  67.                 (beefree_website_get_info(i, "enabled") || include_disabled_engines) && 
  68.                 (beefree_website_get_info(i, "test.host")(i, stack))
  69.         )
  70.         {
  71.             return i;
  72.         }
  73.     }
  74.     return -1;
  75. }
  76.  
  77. /*
  78. https://developer.mozilla.org/en/Creating_Sandboxed_HTTP_Connections#HTTP_notifications
  79. https://developer.mozilla.org/en/Extensions/Firefox
  80. https://developer.mozilla.org/en/Code_snippets
  81.  
  82. */
  83.  
  84. function beefree_update_time()
  85. {
  86.     var d = new Date();
  87.     return d.getTime();//ms
  88. }
  89.  
  90. function beefree_update_time_is_valid(old_time, delta /* ms */)
  91. {
  92.     return (old_time + delta) >= beefree_update_time();
  93. }
  94.  
  95. function beefree_execute(doc, link)
  96. {
  97.     var was_replaced = link.getUserData("beefree-flag-work") != null && link.getUserData("beefree-flag-work") == "REPLACED";
  98.     //
  99.     link.setUserData("beefree-flag", "HONEYBEE", null);
  100.     link.setUserData("beefree-flag-work", "", null);
  101.     link.setUserData("beefree-flag-last-update", beefree_update_time(), null);
  102.     //
  103.     var address = doc.location.href;
  104.     if(!beefree_is_protocol_web(address))
  105.     {
  106.         return false;
  107.     }
  108.     //
  109.     var i = 0;
  110.     var handler_index = beefree_handler_find_from_url(address, false);
  111.     if(!(handler_index >= 0))
  112.     {
  113.         var i = beefree_website_fetch_init();
  114.         while(beefree_website_fetch_test(++i))
  115.         {
  116.             if(beefree_website_get_info(i, "enabled") && beefree_website_get_info(i, "links.ignoredomain"))
  117.             {
  118.                 handler_index = i;
  119.                 break;
  120.             }
  121.         }
  122.         if(!(handler_index >= 0))
  123.         {
  124.             return false;
  125.         }
  126.     }
  127.     //
  128.     if(beefree_website_get_info(handler_index, "links.remove") == false)
  129.     {
  130.         //If BEEFREE is disabed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  131.         return false;
  132.     }
  133.     //
  134.     var link_href = link.hasAttribute("href") ? link.getAttribute("href") : "";
  135.     var link_title = link.hasAttribute("title") ? link.getAttribute("title") : "";
  136.     if(was_replaced)
  137.     {
  138.         link_href = link.getUserData("beefree-href-original");
  139.         link_title = link.getUserData("beefree-title");
  140.     }
  141.     var address_uri_object = beefree_make_uri_object(address, null, null);
  142.     link_href = address_uri_object.resolve(link_href);
  143.     var link_href_original = link_href;
  144.     //
  145.     var trackers = "";
  146.     try
  147.     {
  148.         trackers = beefree_website_get_info(handler_index, "name");
  149.         var stack = new Array();
  150.         stack["address"] = link_href;
  151.         stack["current_page"] = address;
  152.         if(!(beefree_website_get_info(handler_index, "links.function.accept")(handler_index, stack)))
  153.             return false;
  154.         link_href = beefree_replace(doc, link, handler_index, link_href, address);
  155.         if(beefree_website_get_info(handler_index, "links.metaengine"))
  156.         {
  157.             var tmp = link_href;
  158.             for(i = beefree_website_fetch_init(); beefree_website_fetch_test(++i); )
  159.             {
  160.                 /*var*/ //stack = new Array();
  161.                 stack["address"] = link_href;
  162.                 stack["current_page"] = address;
  163.                 if(!(beefree_website_get_info(i, "links.function.accept")(i, stack)))
  164.                     continue;
  165.                 link_href = beefree_replace(doc, link, i, link_href, address);
  166.                 if(link_href != tmp)
  167.                 {
  168.                     trackers+=", "+beefree_website_get_info(i, "name");
  169.                     i = beefree_website_fetch_init();
  170.                 }
  171.                 tmp = link_href;
  172.             }
  173.         }
  174.         /*var*/ //stack = new Array();
  175.         stack["address"] = link_href;
  176.         stack["current_page"] = address;
  177.         stack["address_original"] = link_href_original;
  178.         if(!(beefree_website_get_info(handler_index, "links.function.confirm")(handler_index, stack)))
  179.             return false;
  180.     } catch(e) { }
  181.     //
  182.     var msg = "[BeeFREE] " + (was_replaced ? "Repeated test on link." : "Yet another link replaced.");
  183.     msg += "\nOld address: " + link_href_original;
  184.     msg += "\nNew address: " + link_href;
  185.     //
  186.     //I took these attributes from http://www.w3.org/TR/html401/struct/links.html#edef-A
  187.     //and http://www.w3.org/TR/html5/text-level-semantics.html#the-a-element
  188.     //and http://www.w3schools.com/jsref/dom_obj_link.asp
  189.     var link_attributes = new Array("id", "style", "class", "type", "name", 
  190.                                     "hreflang", "rel", "rev", "accesskey", 
  191.                                     "shape", "coords", "tabindex", "ping", 
  192.                                     "media", "target",
  193.                                     "className", "dir", "lang",
  194.                                     "charset", "disabled");
  195.     if(was_replaced && link.hasAttribute("href") && link.getAttribute("href") != link_href)
  196.     {
  197.         link_attributes = new Array();
  198.         msg += "\nThis link was hacked. Attributes skipped.";
  199.     }
  200.     //
  201.     beefree_console_debug(msg);
  202.     //
  203.     var parent_node = link.parentNode;
  204.     var link_new = doc.createElementNS("http://www.w3.org/1999/xhtml","a");
  205.     for(i = 0; i < link_attributes.length; i++)
  206.         if(link.hasAttribute(link_attributes[i]))
  207.             link_new.setAttribute(link_attributes[i], link.getAttribute(link_attributes[i]));
  208.     if(link.hasAttribute("href"))
  209.         link_new.setAttribute("href", link_href);
  210.     link_new.setUserData("beefree-flag", "HONEYBEE", null);
  211.     link_new.setUserData("beefree-flag-work", "REPLACED", null);
  212.     link_new.setUserData("beefree-flag-last-update", beefree_update_time(), null);
  213.     link_new.setUserData("beefree-href", link_href, null);
  214.     link_new.setUserData("beefree-href-original", link_href_original, null);
  215.     link_new.setUserData("beefree-title", link_title, null);
  216.     link_new.setUserData("beefree-trackers", trackers, null);
  217.     link_new.innerHTML = link.innerHTML;
  218.     link.parentNode.replaceChild(link_new, link);
  219.     return true;
  220. }
  221.  
  222. var BEEFREE_LAST_TARGET = null;
  223.  
  224. function beefree_duty(ev)
  225. {
  226.     if(ev == null) return;
  227.     var link = ev.target;
  228.     if(link == null) return;
  229.     var tip = document.getElementById("beefree-tip");
  230.     while(link.nodeName.toLowerCase() != "#document" && link.nodeName.toUpperCase() != "A")
  231.     {
  232.         if(link.parentNode == null) return;
  233.         link = link.parentNode;
  234.         if(link == null) return;
  235.     }
  236.     if(link.nodeName.toUpperCase() == "A")
  237.     {
  238.         var doc = link.ownerDocument;
  239.         if(doc == null) return;
  240.         if(doc.location == null) return;
  241.         var address = doc.location.href;
  242.         if(address == null) return;
  243.         if(link.getUserData("beefree-flag") == null || link.getUserData("beefree-flag") != "HONEYBEE")
  244.         {
  245.             //This link was never tesed before
  246.             tip.hidePopup();
  247.             BEEFREE_LAST_TARGET = null;
  248.             beefree_execute(doc, link);
  249.         }
  250.         else
  251.         {
  252.             if(beefree_update_time_is_valid(link.getUserData("beefree-flag-last-update"), 1000/*ms*/))
  253.             {
  254.                 if(link.getUserData("beefree-flag-work") != null && link.getUserData("beefree-flag-work") == "REPLACED")
  255.                 {
  256.                     link.setUserData("beefree-flag-last-update", beefree_update_time(), null);//A
  257.  
  258.                     var label_target = null;
  259.                     var label_text = "";
  260.  
  261.                     {
  262.                         label_text = link.getUserData("beefree-title");
  263.                         label_target = document.getElementById("beefree-title");
  264.                         label_target.setAttribute("value", "Title: " + label_text);
  265.                         label_target.setAttribute("hidden", label_text.length == 0);
  266.                     }
  267.                     {
  268.                         label_text = link.href;
  269.                         label_target = document.getElementById("beefree-href");
  270.                         label_target.setAttribute("value", "Link: " + label_text);
  271.                         label_target.setAttribute("hidden", label_text.length == 0);
  272.                     }
  273.                     {
  274.                         label_text = link.getUserData("beefree-trackers");
  275.                         label_target = document.getElementById("beefree-trackers");
  276.                         label_target.setAttribute("value", 
  277.                             (beefree_substr_test(label_text, ",") ? "Trackers: " : "Tracker: ") + label_text);
  278.                         label_target.setAttribute("hidden", label_text.length == 0);
  279.                     }
  280.                     {
  281.                         var max_len = link.href.length < 60 ? 60 : link.href.length;
  282.                         label_text = link.getUserData("beefree-href-original");
  283.                         if(label_text.length > max_len) label_text = label_text.substr(0, max_len-3)+"...";
  284.                         label_target = document.getElementById("beefree-href-original");
  285.                         label_target.setAttribute("value", "URL: " + label_text);
  286.                         label_target.setAttribute("hidden", label_text.length == 0 || link.href == label_text);
  287.                     }
  288.  
  289.                     ev.target.setAttribute("tooltip", "beefree-tip");
  290.                     if(ev.screenX == undefined || ev.screenY == undefined)
  291.                     {
  292.                         if(BEEFREE_LAST_TARGET != ev.target)
  293.                         {
  294.                             tip.hidePopup();
  295.                             BEEFREE_LAST_TARGET = null;
  296.                         }
  297.                     }
  298.                     else
  299.                     {
  300.                         tip.openPopupAtScreen(ev.screenX, ev.screenY, false);
  301.                         if(BEEFREE_LAST_TARGET != ev.target)
  302.                         {
  303.                             tip.hidePopup();
  304.                             tip.openPopupAtScreen(ev.screenX, ev.screenY, false);
  305.                         }
  306.                         BEEFREE_LAST_TARGET = ev.target;
  307.                     }
  308.  
  309.                     link.setUserData("beefree-flag-last-update", beefree_update_time(), null);//B
  310.                 }
  311.                 else
  312.                 {
  313.                     //Well, this is a tested but normal link
  314.                     tip.hidePopup();
  315.                     BEEFREE_LAST_TARGET = null;
  316.                 }
  317.             }
  318.             else
  319.             {
  320.                 //Timed check has expired
  321.                 tip.hidePopup();
  322.                 BEEFREE_LAST_TARGET = null;
  323.                 beefree_execute(doc, link);
  324.             }
  325.         }
  326.     }
  327.     else
  328.     {
  329.         //Not a link selected
  330.         tip.hidePopup();
  331.         BEEFREE_LAST_TARGET = null;
  332.     }
  333. }
  334.  
  335.  
  336. function beefree_initialization(ev)
  337. {
  338.     if(ev == null) return;
  339.     var doc = ev.originalTarget;
  340.     if(doc == null) return;
  341.     var address = doc.location.href;
  342.     if(address == null) return;
  343.     if(!beefree_is_protocol_web(address) && !beefree_is_protocol(address, "javascript:"))
  344.     {
  345.         return;
  346.     }
  347.     var handler_index = beefree_handler_find_from_url(address, false);
  348.     if(handler_index >= 0)
  349.     {
  350.         if(beefree_website_get_info(handler_index, "links.onload"))
  351.         {
  352.             try
  353.             {
  354.                 var i = 0;
  355.                 var links = doc.getElementsByTagNameNS("*", "a");
  356.                 if(links)
  357.                 {
  358.                     for (i = 0; i < links.length; i++)
  359.                     {
  360.                         try
  361.                         {
  362.                             beefree_execute(doc, links[i]);
  363.                         } catch(e) {
  364.                             beefree_console_debug("[BeeFREE] This website uses timers or whatsoever. I've got this error: " + e);
  365.                         }
  366.                     }
  367.                 }
  368.             } catch(e) {
  369.                 beefree_console_debug("[BeeFREE] Cannot find links because of: " + e);
  370.             }
  371.         }
  372.     }
  373. }
  374.  
  375. (function(){ //unnamed function!!!!!!!!!!!!!!!!!
  376.     if(document.getElementById("appcontent"))//browser
  377.     {
  378.         window.addEventListener("mousemove", beefree_duty, false);
  379.         window.addEventListener("mouseover", beefree_duty, false);
  380.         window.addEventListener("click", beefree_duty, false);
  381.         window.addEventListener("scroll", beefree_duty, false);
  382.         window.addEventListener("keydown", beefree_duty, false);
  383.         window.addEventListener("keypress", beefree_duty, false);
  384.         var appcontent = document.getElementById("appcontent");
  385.         appcontent.addEventListener("pageshow", beefree_initialization, false);
  386.     }
  387. })();
  388.  
  389.