431 lines
15 KiB
JavaScript
431 lines
15 KiB
JavaScript
/*
|
|
@author Ian Hickey, Rylan Doherty, David Westgate, Peter Atashian
|
|
@fileOverview The event listener, event handler, script writer, and script executer functions of firerecord
|
|
|
|
|
|
*/
|
|
var recordingx = false;
|
|
var path = null;
|
|
var loadx = null;
|
|
var page = null;
|
|
window.addEventListener("load", function load(event) {
|
|
window.removeEventListener("load", load, false); // remove listener, no
|
|
// longer needed
|
|
firerecord.init();
|
|
}, false);
|
|
var firerecord = function () {
|
|
var prefManager = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
|
|
return {
|
|
init: function () {
|
|
getBrowser().addEventListener("load", function () {
|
|
alert("loaded");
|
|
});
|
|
var appcontent = document.getElementById("appcontent"); // browser
|
|
if (appcontent) {
|
|
appcontent.addEventListener("DOMContentLoaded", firerecord.run, true);
|
|
}
|
|
},
|
|
/* @author rylan
|
|
*/
|
|
running: function () {
|
|
if (recordingx) {
|
|
recordingx = false;
|
|
alert("Stop Listen");
|
|
openUILinkIn(window.content.location.href, "current");
|
|
} else {
|
|
recordingx = true;
|
|
alert("Start Listen");
|
|
firerecord.run();
|
|
}
|
|
},
|
|
openfile: function () {
|
|
path = io.openPath();
|
|
},
|
|
newfile: function () {
|
|
path = io.newPath();
|
|
io.createFile(path);
|
|
},
|
|
/*
|
|
@author rylan
|
|
*/
|
|
checkpage: function (readloc) {
|
|
page = window.content.location.href;
|
|
if (page != readloc) {
|
|
openUILinkIn(readloc, "current");
|
|
}
|
|
},
|
|
/*
|
|
@author rylan, David
|
|
*/
|
|
playback: function () {
|
|
var wait = true;
|
|
var playThis = io.getScript(path);
|
|
var line1 = new Array();
|
|
var line2 = new Array();
|
|
for (var i = 0; i < playThis.length; i += 2) {
|
|
line1 = playThis[i];
|
|
line2 = playThis[i + 1].split(' :: ');
|
|
while (true) {
|
|
if (document.readyState == "complete") {
|
|
firerecord.checkpage(line1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
setTimeout(function () {
|
|
this.wait = false
|
|
}, 1000);
|
|
while (true) {
|
|
alert(wait);
|
|
if(wait == false)
|
|
break;
|
|
|
|
}
|
|
|
|
wait = true;
|
|
while (true) {
|
|
if (document.readyState == "complete") {
|
|
firerecord.fire(line2[0], line2[1], line2[2], line2[3], line2[4]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
setTimeout(function () {
|
|
wait = false;
|
|
}, 1000);
|
|
while (true) {
|
|
if(wait == false)
|
|
break;
|
|
}
|
|
wait = true;
|
|
}
|
|
|
|
},
|
|
/*
|
|
@author rylan
|
|
*/
|
|
nullCheck: function (elem) {
|
|
if (!elem.href) {
|
|
elem.href = "null";
|
|
}
|
|
if (!elem.name) {
|
|
elem.name = "null";
|
|
}
|
|
if (!elem.type) {
|
|
elem.type = "null";
|
|
}
|
|
if (!elem.value) {
|
|
elem.value = "null";
|
|
}
|
|
if (!elem.form) {
|
|
elem.form = "null";
|
|
}
|
|
if (!elem.length) {
|
|
elem.length = "null";
|
|
}
|
|
if (!elem.target) {
|
|
elem.target = "null";
|
|
}
|
|
if (!elem.action) {
|
|
elem.action = "null";
|
|
}
|
|
if (!elem.src) {
|
|
elem.src = "null";
|
|
}
|
|
if (!elem.charset) {
|
|
elem.charset = "null";
|
|
}
|
|
if (!elem.text) {
|
|
elem.text = "null";
|
|
}
|
|
if (!elem.index) {
|
|
elem.index = "null";
|
|
}
|
|
if (!elem.size) {
|
|
elem.size = "null";
|
|
}
|
|
if (!elem.summary) {
|
|
elem.summary = "null";
|
|
}
|
|
if (!elem.caption) {
|
|
elem.caption = "null";
|
|
}
|
|
return elem;
|
|
},
|
|
|
|
/*
|
|
@author rylan
|
|
*/
|
|
fire: function (b, c, d, e, f) {
|
|
var all = content.document.getElementsByTagName(b);
|
|
for (var i = 0; i < all.length; ++i) {
|
|
var elem = all[i];
|
|
elem = firerecord.nullCheck(elem);
|
|
switch (elem.tagName) {
|
|
// All of these cases need null checks for each attribute.
|
|
case "A":
|
|
if (elem.href == c) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "BUTTON":
|
|
if (elem.name == c && elem.type == d && elem.value == e && elem.form == f) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "FORM":
|
|
if (elem.name == c && elem.length == d && elem.target == e && elem.action == f) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "IMG":
|
|
if (elem.name == c && elem.src == d) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "INPUT":
|
|
if (elem.name == c && elem.type == d && elem.value == e) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "LINK":
|
|
if (elem.href == c && elem.type == d && elem.charset == e) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "OPTION":
|
|
if (elem.text == c && elem.value == d && elem.index == e) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "SELECT":
|
|
if (elem.type == c && elem.name == d && elem.size == e) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "TABLE":
|
|
if (elem.summary == c && elem.caption == d) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
case "TEXTAREA":
|
|
if (elem.name == c && elem.type == d && elem.value == e) {
|
|
var obj = document.createEvent("MouseEvents");
|
|
obj.initEvent("click", true, true);
|
|
elem.dispatchEvent(obj);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
/*
|
|
@author David, Peter, rylan, Ian
|
|
|
|
@description Find all elements attributes and add a listener
|
|
*/
|
|
run: function () {
|
|
var head = content.document.getElementsByTagName("head")[0],
|
|
style = content.document.getElementById("link-target-finder-style"),
|
|
all = content.document.getElementsByTagName("*"),
|
|
foundElements = 0;
|
|
var info = new Array(); // Made this global
|
|
var Recording = true; // Just need this until we finish with the
|
|
// the buttons.
|
|
if (!style) {
|
|
style = content.document.createElement("link");
|
|
style.id = "link-target-finder-style";
|
|
style.type = "text/css";
|
|
style.rel = "stylesheet";
|
|
style.href = "chrome://firerecord/skin/skin.css";
|
|
head.appendChild(style);
|
|
}
|
|
|
|
for (var i = 0; i < all.length; ++i) {
|
|
// Define the classname variable
|
|
elm = all[i];
|
|
// deleted local call to new array info
|
|
var validtags = ["A", "BUTTON", "FORM", "IMG", "INPUT", "LINK", "OPTION", "SELECT", "TABLE", "TEXTAREA"];
|
|
// Add a click event listener to all the valid tags.
|
|
if (validtags.indexOf(all[i].tagName) < 0) continue;
|
|
info[0] = all[i].tagName;
|
|
// Feel free to change this to a for each...
|
|
if (recordingx) {
|
|
switch (info[0]) {
|
|
// All of these cases need null checks for each attribute.
|
|
case "INPUT":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("keyup", handleType, false);
|
|
break;
|
|
case "A":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "BUTTON":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "FORM":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "IMG":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
/*
|
|
* case "INPUT":
|
|
*
|
|
* elm.className += ((elm.className.length > 0) ? " " : "") +
|
|
* "link-target-finder-selected";
|
|
* elm.addEventListener("click", handleEvent, false); break;
|
|
*/
|
|
case "LINK":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "OPTION":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "SELECT":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "TABLE":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
case "TEXTAREA":
|
|
elm.className += ((elm.className.length > 0) ? " " : "") + "link-target-finder-selected";
|
|
elm.addEventListener("click", handleEvent, false);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
};
|
|
/*
|
|
@author rylan
|
|
@description handles events
|
|
*/
|
|
function handleEvent(e) {
|
|
var targ;
|
|
if (!e) {
|
|
var e = window.event;
|
|
}
|
|
if (e.target) {
|
|
targ = e.target;
|
|
} else if (e.srcElement) {
|
|
targ = e.srcElement;
|
|
}
|
|
var taginfo = new Array();
|
|
taginfo[0] = targ.tagName;
|
|
var countr;
|
|
// Feel free to change this to a for each...
|
|
switch (taginfo[0]) {
|
|
// All of these cases need null checks for each attribute.
|
|
case "A":
|
|
taginfo[1] = targ.href;
|
|
break;
|
|
case "BUTTON":
|
|
taginfo[1] = targ.name;
|
|
taginfo[2] = targ.type;
|
|
taginfo[3] = targ.value;
|
|
taginfo[4] = targ.form;
|
|
break;
|
|
case "FORM":
|
|
taginfo[1] = targ.name;
|
|
taginfo[2] = targ.length;
|
|
taginfo[3] = targ.target;
|
|
taginfo[4] = targ.action;
|
|
break;
|
|
case "IMG":
|
|
taginfo[1] = targ.name;
|
|
taginfo[2] = targ.src;
|
|
break;
|
|
/*
|
|
* case "INPUT": taginfo[1] = targ.name; taginfo[2] = targ.type;
|
|
* taginfo[3] = targ.value;
|
|
*
|
|
* break;
|
|
*/
|
|
case "LINK":
|
|
taginfo[1] = targ.href;
|
|
taginfo[2] = targ.type;
|
|
taginfo[3] = targ.charset;
|
|
break;
|
|
case "OPTION":
|
|
taginfo[1] = targ.text;
|
|
taginfo[2] = targ.value;
|
|
taginfo[3] = targ.index;
|
|
break;
|
|
case "SELECT":
|
|
taginfo[1] = targ.type;
|
|
taginfo[2] = targ.name;
|
|
taginfo[3] = targ.size;
|
|
break;
|
|
case "TABLE":
|
|
taginfo[1] = targ.summary;
|
|
taginfo[2] = targ.caption;
|
|
break;
|
|
case "TEXTAREA":
|
|
taginfo[1] = targ.name;
|
|
taginfo[2] = targ.type;
|
|
taginfo[3] = targ.value;
|
|
break;
|
|
}
|
|
if (!taginfo[1]) {
|
|
taginfo[1] = "null";
|
|
}
|
|
if (!taginfo[2]) {
|
|
taginfo[2] = "null";
|
|
}
|
|
if (!taginfo[3]) {
|
|
taginfo[3] = "null";
|
|
}
|
|
if (!taginfo[4]) {
|
|
taginfo[4] = "null";
|
|
}
|
|
var contents = taginfo.join(' :: ') + "\n";
|
|
io.appendPath(path, window.content.location.href + "\n");
|
|
io.appendPath(path, contents);
|
|
e.cancelBubble = true;
|
|
};
|
|
}();
|
|
/*
|
|
@author Ian
|
|
@description handles types
|
|
*/
|
|
function handleType(e) {
|
|
var targ;
|
|
if (!e) {
|
|
var e = window.event;
|
|
}
|
|
if (e.target) {
|
|
targ = e.target;
|
|
} else if (e.srcElement) {
|
|
targ = e.srcElement;
|
|
}
|
|
alert("Type Changed");
|
|
e.cancelBubble = true;
|
|
}
|