home *** CD-ROM | disk | FTP | other *** search
- /*
- 2009 - Copyright by Bee <http://www.honeybeenet.altervista.org>.
- This program 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 2
- of the License, or (at your option) any later version.
-
- This program 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 this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
- /* It took me ages to write the right RegExps, i'm sill unsure if they're 100% ok!!!
- btw, i've got how they work!!!!!!!!!!!! and, as the best, i've got they work!!!!!!
- */
-
-
-
- function beefree_replace(doc, link, handler_index, href, address)
- {
- var stack = new Array();
- var recursions_max = beefree_website_get_info(handler_index, "links.recursion") ? 127 : 1;
- var tmp = href;
- for(var recursions = 0; recursions < recursions_max; recursions++)
- {
- stack["address"] = href;
- stack["current_page"] = address;
- href = beefree_website_get_info(handler_index, "links.function.replace")(handler_index, stack);
- if(href == tmp)
- break;
- tmp = href;
- }
- return href;
- }
-
- function beefree_handler_find_from_url(address, include_disabled_engines /* = false*/)
- {
- var stack = new Array();
- var i = beefree_website_fetch_init();
- while(beefree_website_fetch_test(++i))
- {
- stack["address"] = address;
- if(
- (beefree_website_get_info(i, "enabled") || include_disabled_engines) &&
- (beefree_website_get_info(i, "test.domain")(i, stack))
- )
- {
- return i;
- }
- }
- return -1;
- }
-
- function beefree_handler_find_from_host(hostname, include_disabled_engines /* = false*/)
- {
- var stack = new Array();
- var i = beefree_website_fetch_init();
- while(beefree_website_fetch_test(++i))
- {
- stack["hostname"] = hostname;
- if(
- (beefree_website_get_info(i, "enabled") || include_disabled_engines) &&
- (beefree_website_get_info(i, "test.host")(i, stack))
- )
- {
- return i;
- }
- }
- return -1;
- }
-
- /*
- https://developer.mozilla.org/en/Creating_Sandboxed_HTTP_Connections#HTTP_notifications
- https://developer.mozilla.org/en/Extensions/Firefox
- https://developer.mozilla.org/en/Code_snippets
-
- */
-
- function beefree_update_time()
- {
- var d = new Date();
- return d.getTime();//ms
- }
-
- function beefree_update_time_is_valid(old_time, delta /* ms */)
- {
- return (old_time + delta) >= beefree_update_time();
- }
-
- function beefree_execute(doc, link)
- {
- var was_replaced = link.getUserData("beefree-flag-work") != null && link.getUserData("beefree-flag-work") == "REPLACED";
- //
- link.setUserData("beefree-flag", "HONEYBEE", null);
- link.setUserData("beefree-flag-work", "", null);
- link.setUserData("beefree-flag-last-update", beefree_update_time(), null);
- //
- var address = doc.location.href;
- if(!beefree_is_protocol_web(address))
- {
- return false;
- }
- //
- var i = 0;
- var handler_index = beefree_handler_find_from_url(address, false);
- if(!(handler_index >= 0))
- {
- var i = beefree_website_fetch_init();
- while(beefree_website_fetch_test(++i))
- {
- if(beefree_website_get_info(i, "enabled") && beefree_website_get_info(i, "links.ignoredomain"))
- {
- handler_index = i;
- break;
- }
- }
- if(!(handler_index >= 0))
- {
- return false;
- }
- }
- //
- if(beefree_website_get_info(handler_index, "links.remove") == false)
- {
- //If BEEFREE is disabed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- return false;
- }
- //
- var link_href = link.hasAttribute("href") ? link.getAttribute("href") : "";
- var link_title = link.hasAttribute("title") ? link.getAttribute("title") : "";
- if(was_replaced)
- {
- link_href = link.getUserData("beefree-href-original");
- link_title = link.getUserData("beefree-title");
- }
- var address_uri_object = beefree_make_uri_object(address, null, null);
- link_href = address_uri_object.resolve(link_href);
- var link_href_original = link_href;
- //
- var trackers = "";
- try
- {
- trackers = beefree_website_get_info(handler_index, "name");
- var stack = new Array();
- stack["address"] = link_href;
- stack["current_page"] = address;
- if(!(beefree_website_get_info(handler_index, "links.function.accept")(handler_index, stack)))
- return false;
- link_href = beefree_replace(doc, link, handler_index, link_href, address);
- if(beefree_website_get_info(handler_index, "links.metaengine"))
- {
- var tmp = link_href;
- for(i = beefree_website_fetch_init(); beefree_website_fetch_test(++i); )
- {
- /*var*/ //stack = new Array();
- stack["address"] = link_href;
- stack["current_page"] = address;
- if(!(beefree_website_get_info(i, "links.function.accept")(i, stack)))
- continue;
- link_href = beefree_replace(doc, link, i, link_href, address);
- if(link_href != tmp)
- {
- trackers+=", "+beefree_website_get_info(i, "name");
- i = beefree_website_fetch_init();
- }
- tmp = link_href;
- }
- }
- /*var*/ //stack = new Array();
- stack["address"] = link_href;
- stack["current_page"] = address;
- stack["address_original"] = link_href_original;
- if(!(beefree_website_get_info(handler_index, "links.function.confirm")(handler_index, stack)))
- return false;
- } catch(e) { }
- //
- var msg = "[BeeFREE] " + (was_replaced ? "Repeated test on link." : "Yet another link replaced.");
- msg += "\nOld address: " + link_href_original;
- msg += "\nNew address: " + link_href;
- //
- //I took these attributes from http://www.w3.org/TR/html401/struct/links.html#edef-A
- //and http://www.w3.org/TR/html5/text-level-semantics.html#the-a-element
- //and http://www.w3schools.com/jsref/dom_obj_link.asp
- var link_attributes = new Array("id", "style", "class", "type", "name",
- "hreflang", "rel", "rev", "accesskey",
- "shape", "coords", "tabindex", "ping",
- "media", "target",
- "className", "dir", "lang",
- "charset", "disabled");
- if(was_replaced && link.hasAttribute("href") && link.getAttribute("href") != link_href)
- {
- link_attributes = new Array();
- msg += "\nThis link was hacked. Attributes skipped.";
- }
- //
- beefree_console_debug(msg);
- //
- var parent_node = link.parentNode;
- var link_new = doc.createElementNS("http://www.w3.org/1999/xhtml","a");
- for(i = 0; i < link_attributes.length; i++)
- if(link.hasAttribute(link_attributes[i]))
- link_new.setAttribute(link_attributes[i], link.getAttribute(link_attributes[i]));
- if(link.hasAttribute("href"))
- link_new.setAttribute("href", link_href);
- link_new.setUserData("beefree-flag", "HONEYBEE", null);
- link_new.setUserData("beefree-flag-work", "REPLACED", null);
- link_new.setUserData("beefree-flag-last-update", beefree_update_time(), null);
- link_new.setUserData("beefree-href", link_href, null);
- link_new.setUserData("beefree-href-original", link_href_original, null);
- link_new.setUserData("beefree-title", link_title, null);
- link_new.setUserData("beefree-trackers", trackers, null);
- link_new.innerHTML = link.innerHTML;
- link.parentNode.replaceChild(link_new, link);
- return true;
- }
-
- var BEEFREE_LAST_TARGET = null;
-
- function beefree_duty(ev)
- {
- if(ev == null) return;
- var link = ev.target;
- if(link == null) return;
- var tip = document.getElementById("beefree-tip");
- while(link.nodeName.toLowerCase() != "#document" && link.nodeName.toUpperCase() != "A")
- {
- if(link.parentNode == null) return;
- link = link.parentNode;
- if(link == null) return;
- }
- if(link.nodeName.toUpperCase() == "A")
- {
- var doc = link.ownerDocument;
- if(doc == null) return;
- if(doc.location == null) return;
- var address = doc.location.href;
- if(address == null) return;
- if(link.getUserData("beefree-flag") == null || link.getUserData("beefree-flag") != "HONEYBEE")
- {
- //This link was never tesed before
- tip.hidePopup();
- BEEFREE_LAST_TARGET = null;
- beefree_execute(doc, link);
- }
- else
- {
- if(beefree_update_time_is_valid(link.getUserData("beefree-flag-last-update"), 1000/*ms*/))
- {
- if(link.getUserData("beefree-flag-work") != null && link.getUserData("beefree-flag-work") == "REPLACED")
- {
- link.setUserData("beefree-flag-last-update", beefree_update_time(), null);//A
-
- var label_target = null;
- var label_text = "";
-
- {
- label_text = link.getUserData("beefree-title");
- label_target = document.getElementById("beefree-title");
- label_target.setAttribute("value", "Title: " + label_text);
- label_target.setAttribute("hidden", label_text.length == 0);
- }
- {
- label_text = link.href;
- label_target = document.getElementById("beefree-href");
- label_target.setAttribute("value", "Link: " + label_text);
- label_target.setAttribute("hidden", label_text.length == 0);
- }
- {
- label_text = link.getUserData("beefree-trackers");
- label_target = document.getElementById("beefree-trackers");
- label_target.setAttribute("value",
- (beefree_substr_test(label_text, ",") ? "Trackers: " : "Tracker: ") + label_text);
- label_target.setAttribute("hidden", label_text.length == 0);
- }
- {
- var max_len = link.href.length < 60 ? 60 : link.href.length;
- label_text = link.getUserData("beefree-href-original");
- if(label_text.length > max_len) label_text = label_text.substr(0, max_len-3)+"...";
- label_target = document.getElementById("beefree-href-original");
- label_target.setAttribute("value", "URL: " + label_text);
- label_target.setAttribute("hidden", label_text.length == 0 || link.href == label_text);
- }
-
- ev.target.setAttribute("tooltip", "beefree-tip");
- if(ev.screenX == undefined || ev.screenY == undefined)
- {
- if(BEEFREE_LAST_TARGET != ev.target)
- {
- tip.hidePopup();
- BEEFREE_LAST_TARGET = null;
- }
- }
- else
- {
- tip.openPopupAtScreen(ev.screenX, ev.screenY, false);
- if(BEEFREE_LAST_TARGET != ev.target)
- {
- tip.hidePopup();
- tip.openPopupAtScreen(ev.screenX, ev.screenY, false);
- }
- BEEFREE_LAST_TARGET = ev.target;
- }
-
- link.setUserData("beefree-flag-last-update", beefree_update_time(), null);//B
- }
- else
- {
- //Well, this is a tested but normal link
- tip.hidePopup();
- BEEFREE_LAST_TARGET = null;
- }
- }
- else
- {
- //Timed check has expired
- tip.hidePopup();
- BEEFREE_LAST_TARGET = null;
- beefree_execute(doc, link);
- }
- }
- }
- else
- {
- //Not a link selected
- tip.hidePopup();
- BEEFREE_LAST_TARGET = null;
- }
- }
-
-
- function beefree_initialization(ev)
- {
- if(ev == null) return;
- var doc = ev.originalTarget;
- if(doc == null) return;
- var address = doc.location.href;
- if(address == null) return;
- if(!beefree_is_protocol_web(address) && !beefree_is_protocol(address, "javascript:"))
- {
- return;
- }
- var handler_index = beefree_handler_find_from_url(address, false);
- if(handler_index >= 0)
- {
- if(beefree_website_get_info(handler_index, "links.onload"))
- {
- try
- {
- var i = 0;
- var links = doc.getElementsByTagNameNS("*", "a");
- if(links)
- {
- for (i = 0; i < links.length; i++)
- {
- try
- {
- beefree_execute(doc, links[i]);
- } catch(e) {
- beefree_console_debug("[BeeFREE] This website uses timers or whatsoever. I've got this error: " + e);
- }
- }
- }
- } catch(e) {
- beefree_console_debug("[BeeFREE] Cannot find links because of: " + e);
- }
- }
- }
- }
-
- (function(){ //unnamed function!!!!!!!!!!!!!!!!!
- if(document.getElementById("appcontent"))//browser
- {
- window.addEventListener("mousemove", beefree_duty, false);
- window.addEventListener("mouseover", beefree_duty, false);
- window.addEventListener("click", beefree_duty, false);
- window.addEventListener("scroll", beefree_duty, false);
- window.addEventListener("keydown", beefree_duty, false);
- window.addEventListener("keypress", beefree_duty, false);
- var appcontent = document.getElementById("appcontent");
- appcontent.addEventListener("pageshow", beefree_initialization, false);
- }
- })();
-
-