Created
December 3, 2013 05:52
-
-
Save desyncr/7764508 to your computer and use it in GitHub Desktop.
Vimprobable configuration
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
(c) 2009 by Leon Winter | |
(c) 2009-2012 by Hannes Schueller | |
(c) 2009-2010 by Matto Fransen | |
(c) 2010-2011 by Hans-Peter Deifel | |
(c) 2010-2011 by Thomas Adam | |
(c) 2011 by Albert Kim | |
(c) 2013 Daniel Carl | |
see LICENSE file | |
*/ | |
/* Vimprobable version number */ | |
#define VERSION "1.4.0" | |
#define INTERNAL_VERSION "Vimprobable2/"VERSION | |
extern Client client; | |
/* general settings */ | |
char startpage[MAX_SETTING_SIZE] = "http://www.vimprobable.org/"; | |
char useragent[MAX_SETTING_SIZE] = "Vimprobable2/" VERSION; | |
char acceptlanguage[MAX_SETTING_SIZE] = ""; | |
static const gboolean enablePlugins = TRUE; /* TRUE keeps plugins enabled */ | |
static const gboolean enableJava = TRUE; /* FALSE disables Java applets */ | |
static const gboolean enablePagecache = FALSE; /* TRUE turns on the page cache. */ | |
static gboolean escape_input_on_load = TRUE; /* TRUE will disable automatic focusing of input fields via Javascript*/ | |
char temp_dir[MAX_SETTING_SIZE] = "/tmp"; /* location of temporary files, default will be overridden if TEMPDIR is set */ | |
char downloads_path[MAX_SETTING_SIZE] = ""; | |
char statusfont[MAX_SETTING_SIZE] = "monospace bold 8"; /* font for status bar */ | |
/* appearance */ | |
char statusbgcolor[MAX_SETTING_SIZE] = "#000000"; /* background color for status bar */ | |
char statuscolor[MAX_SETTING_SIZE] = "#ffffff"; /* color for status bar */ | |
char sslbgcolor[MAX_SETTING_SIZE] = "#b0ff00"; /* background color for status bar with SSL url */ | |
char sslinvalidbgcolor[MAX_SETTING_SIZE]= "#ff0000"; /* background color for status bar with unverified SSL url */ | |
char sslcolor[MAX_SETTING_SIZE] = "#000000"; /* color for status bar with SSL url */ | |
/* normal, warning, error */ | |
char urlboxfont[][MAX_SETTING_SIZE] = { "monospace normal 8", "monospace normal 8", "monospace bold 8"}; | |
static const char *urlboxcolor[] = { "#666666", "#ff0000", "#ffffff" }; | |
static const char *urlboxbgcolor[] = { "#000000", "#000000", "#ff0000" }; | |
/* normal, error */ | |
char completionfont[2][MAX_SETTING_SIZE] = { "monospace normal 8", "monospace bold 8" }; | |
/* topborder color */ | |
static const char *completioncolor[] = { "#666666", "#ff00ff", "#000000" }; | |
/* current row background */ | |
static const char *completionbgcolor[] = { "#000000", "#000000", "#fff000" }; | |
/* pango markup for prefix highliting: opening, closing */ | |
#define COMPLETION_TAG_OPEN "<b>" | |
#define COMPLETION_TAG_CLOSE "</b>" | |
#define ENABLE_HISTORY_INDICATOR | |
#define ENABLE_INCREMENTAL_SEARCH | |
#define ENABLE_GTK_PROGRESS_BAR | |
#define ENABLE_WGET_PROGRESS_BAR | |
static const int progressbartick = 20; | |
static const char progressborderleft = '['; | |
static const char progressbartickchar = '='; | |
static const char progressbarcurrent = '>'; | |
static const char progressbarspacer = ' '; | |
static const char progressborderright = ']'; | |
/* external handlers: | |
* the handle (first string) contain what the handled links have to start with | |
* the handlers (second string) contain the external applications which should be called for this sort of link | |
* %s can be used as a placeholder for the link argument after the handler | |
* e.g.: "mailto:user@example.org | |
* "handle" is "mailto:" | |
* "%s" will translate to "user@example.org" | |
*/ | |
static URIHandler uri_handlers[] = { | |
{ "mailto:", "x-terminal-emulator -e mutt %s" }, | |
{ "vimprobableedit:", "x-terminal-emulator -e vi %s" }, | |
{ "ftp://", "x-terminal-emulator -e wget ftp://%s" }, | |
}; | |
/* cookies */ | |
#define ENABLE_COOKIE_SUPPORT | |
#define COOKIES_STORAGE_FILENAME "%s/vimprobable/cookies", client.config.config_base | |
#define COOKIES_STORAGE_READONLY FALSE /* if TRUE new cookies will be lost if you quit */ | |
SoupCookieJarAcceptPolicy CookiePolicy = SOUP_COOKIE_JAR_ACCEPT_ALWAYS; /* by default, accept all cookies */ | |
/* font size */ | |
#define DEFAULT_FONT_SIZE 12 | |
/* user styles */ | |
#define USER_STYLESHEET "%s/vimprobable/style.css", client.config.config_base | |
/* user javascript */ | |
#define ENABLE_USER_SCRIPTFILE | |
#define USER_SCRIPTFILE "%s/vimprobable/scripts.js", client.config.config_base | |
/* ssl */ | |
static gboolean strict_ssl = TRUE; /* FALSE will accept any SSL certificate at face value */ | |
static char ca_bundle[MAX_SETTING_SIZE] = "/etc/ssl/certs/ca-certificates.crt"; | |
/* proxy */ | |
static const gboolean use_proxy = TRUE; /* TRUE if you're going to use a proxy (whose address | |
is specified in http_proxy environment variable), false otherwise */ | |
/* scrolling */ | |
static unsigned int scrollstep = 40; /* cursor difference in pixel */ | |
static unsigned int pagingkeep = 40; /* pixels kept when paging */ | |
#define DISABLE_SCROLLBAR | |
/* searching */ | |
#define ENABLE_MATCH_HIGHLITING | |
static const int searchoptions = CaseInsensitive | Wrapping; | |
gboolean complete_case_sensitive = TRUE; | |
/* search engines */ | |
static Searchengine searchengines[] = { | |
{ "i", "http://ixquick.com/do/metasearch.pl?query=%s" }, | |
{ "w", "https://secure.wikimedia.org/wikipedia/en/w/index.php?title=Special%%3ASearch&search=%s&go=Go" }, | |
{ "wd", "https://secure.wikimedia.org/wikipedia/de/w/index.php?title=Special%%3ASearch&search=%s&go=Go" }, | |
{ "d", "https://duckduckgo.com/?q=%s&t=vimprobable" }, | |
{ "dd", "https://duckduckgo.com/html/?q=%s&t=vimprobable" }, | |
}; | |
static char defaultsearch[MAX_SETTING_SIZE] = "i"; | |
/* command mapping */ | |
Command commands[COMMANDSIZE] = { | |
/* command, function, argument */ | |
{ "ba", navigate, {NavigationBack} }, | |
{ "back", navigate, {NavigationBack} }, | |
{ "ec", script, {Info} }, | |
{ "echo", script, {Info} }, | |
{ "echoe", script, {Error} }, | |
{ "echoerr", script, {Error} }, | |
{ "fw", navigate, {NavigationForward} }, | |
{ "fo", navigate, {NavigationForward} }, | |
{ "forward", navigate, {NavigationForward} }, | |
{ "javascript", script, {Silent} }, | |
{ "o", open_arg, {TargetCurrent} }, | |
{ "open", open_arg, {TargetCurrent} }, | |
{ "q", quit, {0} }, | |
{ "quit", quit, {0} }, | |
{ "re", navigate, {NavigationReload} }, | |
{ "re!", navigate, {NavigationForceReload} }, | |
{ "reload", navigate, {NavigationReload} }, | |
{ "reload!", navigate, {NavigationForceReload} }, | |
{ "qt", search_tag, {0} }, | |
{ "st", navigate, {NavigationCancel} }, | |
{ "stop", navigate, {NavigationCancel} }, | |
{ "t", open_arg, {TargetNew} }, | |
{ "tabopen", open_arg, {TargetNew} }, | |
{ "print", print_frame, {0} }, | |
{ "bma", bookmark, {0} }, | |
{ "bookmark", bookmark, {0} }, | |
{ "source", view_source, {0} }, | |
{ "openeditor", open_editor, {0} }, | |
{ "set", browser_settings, {0} }, | |
{ "map", mappings, {0} }, | |
{ "inspect", open_inspector, {0} }, | |
{ "jumpleft", scroll, {ScrollJumpTo | DirectionLeft} }, | |
{ "jumpright", scroll, {ScrollJumpTo | DirectionRight} }, | |
{ "jumptop", scroll, {ScrollJumpTo | DirectionTop} }, | |
{ "jumpbottom", scroll, {ScrollJumpTo | DirectionBottom} }, | |
{ "pageup", scroll, {ScrollMove | DirectionTop | UnitPage} }, | |
{ "pagedown", scroll, {ScrollMove | DirectionBottom | UnitPage} }, | |
{ "navigationback", navigate, {NavigationBack} }, | |
{ "navigationforward", navigate, {NavigationForward} }, | |
{ "scrollleft", scroll, {ScrollMove | DirectionLeft | UnitLine} }, | |
{ "scrollright", scroll, {ScrollMove | DirectionRight | UnitLine} }, | |
{ "scrollup", scroll, {ScrollMove | DirectionTop | UnitLine} }, | |
{ "scrolldown", scroll, {ScrollMove | DirectionBottom | UnitLine} }, | |
{ "zi", zoom, {ZoomIn | ZoomText} }, | |
{ "zo", zoom, {ZoomOut | ZoomText} }, | |
{ "pgzi", zoom, {ZoomIn | ZoomFullContent} }, | |
{ "pgzo", zoom, {ZoomOut | ZoomFullContent} }, | |
}; | |
/* mouse bindings | |
you can use MOUSE_BUTTON_1 to MOUSE_BUTTON_5 | |
*/ | |
static Mouse mouse[] = { | |
/* modmask, modkey, button, function, argument */ | |
{ 0, 0, MOUSE_BUTTON_2, paste, {TargetCurrent | ClipboardPrimary | ClipboardGTK, client.state.rememberedURI} }, | |
{ GDK_CONTROL_MASK, 0, MOUSE_BUTTON_2, paste, {TargetNew | ClipboardPrimary | ClipboardGTK} }, | |
{ GDK_CONTROL_MASK, 0, MOUSE_BUTTON_1, open_remembered, {TargetNew} }, | |
}; | |
/* settings (arguments of :set command) */ | |
static Setting browsersettings[] = { | |
/* public name, internal variable webkit setting integer value? boolean value? colour value? reload page? */ | |
{ "useragent", useragent, "user-agent", FALSE, FALSE, FALSE, FALSE }, | |
{ "scripts", NULL, "enable-scripts", FALSE, TRUE, FALSE, FALSE }, | |
{ "plugins", NULL, "enable-plugins", FALSE, TRUE, FALSE, FALSE }, | |
{ "pagecache", NULL, "enable-page-cache", FALSE, TRUE, FALSE, FALSE }, | |
{ "java", NULL, "enable-java-applet", FALSE, TRUE, FALSE, FALSE }, | |
{ "images", NULL, "auto-load-images", FALSE, TRUE, FALSE, FALSE }, | |
{ "shrinkimages", NULL, "auto-shrink-images", FALSE, TRUE, FALSE, FALSE }, | |
{ "cursivefont", NULL, "cursive-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "defaultencoding", NULL, "default-encoding", FALSE, FALSE, FALSE, FALSE }, | |
{ "defaultfont", NULL, "default-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "fontsize", NULL, "default-font-size", TRUE, FALSE, FALSE, FALSE }, | |
{ "monofontsize", NULL, "default-monospace-font-size", TRUE, FALSE, FALSE, FALSE }, | |
{ "caret", NULL, "enable-caret-browsing", FALSE, TRUE, FALSE, FALSE }, | |
{ "fantasyfont", NULL, "fantasy-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "minimumfontsize", NULL, "minimum-font-size", TRUE, FALSE, FALSE, FALSE }, | |
{ "monofont", NULL, "monospace-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "backgrounds", NULL, "print-backgrounds", FALSE, TRUE, FALSE, FALSE }, | |
{ "sansfont", NULL, "sans-serif-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "seriffont", NULL, "serif-font-family", FALSE, FALSE, FALSE, FALSE }, | |
{ "stylesheet", NULL, "user-stylesheet-uri", FALSE, FALSE, FALSE, FALSE }, | |
{ "resizetextareas", NULL, "resizable-text-areas", FALSE, TRUE, FALSE, FALSE }, | |
{ "webinspector", NULL, "enable-developer-extras", FALSE, TRUE, FALSE, FALSE }, | |
{ "homepage", startpage, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "statusbgcolor", statusbgcolor, "", FALSE, FALSE, TRUE, TRUE }, | |
{ "statuscolor", statuscolor, "", FALSE, FALSE, TRUE, TRUE }, | |
{ "sslbgcolor", sslbgcolor, "", FALSE, FALSE, TRUE, TRUE }, | |
{ "sslcolor", sslcolor, "", FALSE, FALSE, TRUE, TRUE }, | |
{ "acceptlanguage", acceptlanguage, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "defaultsearch", defaultsearch, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "cookies", NULL, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "downloadspath", downloads_path, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "statusfont", statusfont, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "urlboxfontnormal",urlboxfont[0], "", FALSE, FALSE, FALSE, FALSE }, | |
{ "urlboxfontwarning",urlboxfont[1], "", FALSE, FALSE, FALSE, FALSE }, | |
{ "urlboxfonterror", urlboxfont[2], "", FALSE, FALSE, FALSE, FALSE }, | |
{ "completionfontnormal", completionfont[0], "", FALSE, FALSE, FALSE, FALSE }, | |
{ "completionfonterror", completionfont[1], "", FALSE, FALSE, FALSE, FALSE }, | |
{ "qmark", NULL, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "proxy", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "windowsize", NULL, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "scrollbars", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "statusbar", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "inputbox", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "completioncase", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "escapeinput", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "strictssl", NULL, "", FALSE, TRUE, FALSE, FALSE }, | |
{ "cabundle", ca_bundle, "", FALSE, FALSE, FALSE, FALSE }, | |
{ "tempdir", temp_dir, "", FALSE, FALSE, FALSE, FALSE }, | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
(c) 2009 by Leon Winter | |
(c) 2009, 2010 by Hannes Schueller | |
(c) 2010 by Hans-Peter Deifel | |
(c) 2011 by Daniel Carl | |
see LICENSE file | |
*/ | |
function Hints() { | |
var config = { | |
maxAllowedHints: 500, | |
hintCss: "z-index:100000;font-family:monospace;font-size:10px;" | |
+ "font-weight:bold;color:white;background-color:#666;" | |
+ "padding:0px 1px;position:absolute;", | |
hintClass: "hinting_mode_hint", | |
hintClassFocus: "hinting_mode_hint_focus", | |
elemBackground: "none", | |
elemBackgroundFocus: "none", | |
elemColor: "none" | |
}; | |
var hintContainer; | |
var currentFocusNum = 1; | |
var hints = []; | |
var mode; | |
this.createHints = function(inputText, hintMode) | |
{ | |
if (hintMode) { | |
mode = hintMode; | |
} | |
var topwin = window; | |
var top_height = topwin.innerHeight; | |
var top_width = topwin.innerWidth; | |
var xpath_expr; | |
var hintCount = 0; | |
this.clearHints(); | |
function helper (win, offsetX, offsetY) { | |
var doc = win.document; | |
var win_height = win.height; | |
var win_width = win.width; | |
/* Bounds */ | |
var minX = offsetX < 0 ? -offsetX : 0; | |
var minY = offsetY < 0 ? -offsetY : 0; | |
var maxX = offsetX + win_width > top_width ? top_width - offsetX : top_width; | |
var maxY = offsetY + win_height > top_height ? top_height - offsetY : top_height; | |
var scrollX = win.scrollX; | |
var scrollY = win.scrollY; | |
hintContainer = doc.createElement("div"); | |
hintContainer.id = "hint_container"; | |
xpath_expr = _getXpathXpression(inputText); | |
var res = doc.evaluate(xpath_expr, doc, | |
function (p) { | |
return "http://www.w3.org/1999/xhtml"; | |
}, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); | |
/* generate basic hint element which will be cloned and updated later */ | |
var hintSpan = doc.createElement("span"); | |
hintSpan.setAttribute("class", config.hintClass); | |
hintSpan.style.cssText = config.hintCss; | |
/* due to the different XPath result type, we will need two counter variables */ | |
var rect, elem, text, node, show_text; | |
for (var i = 0; i < res.snapshotLength; i++) { | |
if (hintCount >= config.maxAllowedHints) { | |
break; | |
} | |
elem = res.snapshotItem(i); | |
rect = elem.getBoundingClientRect(); | |
if (!rect || rect.left > maxX || rect.right < minX || rect.top > maxY || rect.bottom < minY) { | |
continue; | |
} | |
var style = topwin.getComputedStyle(elem, ""); | |
if (style.display == "none" || style.visibility != "visible") { | |
continue; | |
} | |
var leftpos = Math.max((rect.left + scrollX), scrollX); | |
var toppos = Math.max((rect.top + scrollY), scrollY); | |
/* making this block DOM compliant */ | |
var hint = hintSpan.cloneNode(false); | |
hint.setAttribute("id", "vimprobablehint" + hintCount); | |
hint.style.left = leftpos + "px"; | |
hint.style.top = toppos + "px"; | |
text = doc.createTextNode(hintCount + 1); | |
hint.appendChild(text); | |
hintContainer.appendChild(hint); | |
hintCount++; | |
hints.push({ | |
elem: elem, | |
number: hintCount, | |
span: hint, | |
background: elem.style.background, | |
foreground: elem.style.color} | |
); | |
/* make the link black to ensure it's readable */ | |
elem.style.color = config.elemColor; | |
elem.style.background = config.elemBackground; | |
} | |
doc.documentElement.appendChild(hintContainer); | |
/* recurse into any iframe or frame element */ | |
var frameTags = ["frame","iframe"]; | |
for (var f = 0; f < frameTags.length; ++f) { | |
var frames = doc.getElementsByTagName(frameTags[f]); | |
for (i = 0, nframes = frames.length; i < nframes; ++i) { | |
elem = frames[i]; | |
rect = elem.getBoundingClientRect(); | |
if (!elem.contentWindow || !rect || rect.left > maxX || rect.right < minX || rect.top > maxY || rect.bottom < minY) { | |
continue; | |
} | |
helper(elem.contentWindow, offsetX + rect.left, offsetY + rect.top); | |
} | |
} | |
} | |
helper(topwin, 0, 0); | |
this.clearFocus(); | |
this.focusHint(1); | |
if (hintCount == 1) { | |
/* just one hinted element - might as well follow it */ | |
return this.fire(1); | |
} | |
}; | |
/* set focus on hint with given number */ | |
this.focusHint = function(n) | |
{ | |
/* reset previous focused hint */ | |
var hint = _getHintByNumber(currentFocusNum); | |
if (hint !== null) { | |
hint.elem.className = hint.elem.className.replace(config.hintClassFocus, config.hintClass); | |
hint.elem.style.background = config.elemBackground; | |
} | |
currentFocusNum = n; | |
/* mark new hint as focused */ | |
hint = _getHintByNumber(currentFocusNum); | |
if (hint !== null) { | |
hint.elem.className = hint.elem.className.replace(config.hintClass, config.hintClassFocus); | |
hint.elem.style.background = config.elemBackgroundFocus; | |
} | |
}; | |
/* set focus to next avaiable hint */ | |
this.focusNextHint = function() | |
{ | |
var index = _getHintIdByNumber(currentFocusNum); | |
if (typeof(hints[index + 1]) != "undefined") { | |
this.focusHint(hints[index + 1].number); | |
} else { | |
this.focusHint(hints[0].number); | |
} | |
}; | |
/* set focus to previous avaiable hint */ | |
this.focusPreviousHint = function() | |
{ | |
var index = _getHintIdByNumber(currentFocusNum); | |
if (index !== 0 && typeof(hints[index - 1].number) != "undefined") { | |
this.focusHint(hints[index - 1].number); | |
} else { | |
this.focusHint(hints[hints.length - 1].number); | |
} | |
}; | |
/* filters hints matching given number */ | |
this.updateHints = function(n) | |
{ | |
if (n === 0) { | |
return this.createHints(); | |
} | |
/* remove none matching hints */ | |
var i, remove = []; | |
for (i = 0; i < hints.length; ++i) { | |
var hint = hints[i]; | |
if (0 !== hint.number.toString().indexOf(n.toString())) { | |
remove.push(hint.number); | |
} | |
} | |
for (i = 0; i < remove.length; ++i) { | |
_removeHint(remove[i]); | |
} | |
if (hints.length === 1) { | |
return this.fire(hints[0].number); | |
} else { | |
return this.focusHint(n); | |
} | |
}; | |
this.clearFocus = function() | |
{ | |
if (document.activeElement && document.activeElement.blur) { | |
document.activeElement.blur(); | |
} | |
}; | |
/* remove all hints and set previous style to them */ | |
this.clearHints = function() | |
{ | |
if (hints.length === 0) { | |
return; | |
} | |
for (var i = 0; i < hints.length; ++i) { | |
var hint = hints[i]; | |
if (typeof(hint.elem) != "undefined") { | |
hint.elem.style.background = hint.background; | |
hint.elem.style.color = hint.foreground; | |
hint.span.parentNode.removeChild(hint.span); | |
} | |
} | |
hints = []; | |
hintContainer.parentNode.removeChild(hintContainer); | |
window.onkeyup = null; | |
}; | |
/* fires the modeevent on hint with given number */ | |
this.fire = function(n) | |
{ | |
var doc, result; | |
n = n ? n : currentFocusNum; | |
var hint = _getHintByNumber(n); | |
if (typeof(hint.elem) == "undefined") { | |
return "done;"; | |
} | |
var el = hint.elem; | |
var tag = el.nodeName.toLowerCase(); | |
this.clearHints(); | |
if (tag == "iframe" || tag == "frame" || tag == "textarea" || tag == "input" && (el.type == "text" || el.type == "password" || el.type == "checkbox" || el.type == "radio") || tag == "select") { | |
el.focus(); | |
if (tag == "input" || tag == "textarea") { | |
return "insert;"; | |
} | |
return "done;"; | |
} | |
switch (mode) | |
{ | |
case "f": result = _open(el); break; | |
case "F": result = _openNewWindow(el); break; | |
case "i": result = "open;" + _getElemtSource(el); break; | |
case "I": result = "tabopen;" + _getElemtSource(el); break; | |
case "s": result = "save;" + _getElemtSource(el); break; | |
case "y": result = "yank;" + _getElemtSource(el); break; | |
case "O": result = "colon;" + _getElemtSource(el); break; | |
default: result = _getElemtSource(el); break; | |
} | |
return result; | |
}; | |
this.focusInput = function() | |
{ | |
if (document.getElementsByTagName("body")[0] === null || typeof(document.getElementsByTagName("body")[0]) != "object") { | |
return; | |
} | |
/* prefixing html: will result in namespace error */ | |
var hinttags = "//input[@type='text'] | //input[@type='password'] | //textarea"; | |
var r = document.evaluate(hinttags, document, | |
function(p) { | |
return "http://www.w3.org/1999/xhtml"; | |
}, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); | |
var i; | |
var j = 0; | |
var k = 0; | |
var first = null; | |
var tag; | |
for (i = 0; i < r.snapshotLength; i++) { | |
var elem = r.snapshotItem(i); | |
if (k === 0) { | |
if (elem.style.display != "none" && elem.style.visibility != "hidden") { | |
first = elem; | |
} else { | |
k--; | |
} | |
} | |
if (j === 1 && elem.style.display != "none" && elem.style.visibility != "hidden") { | |
elem.focus(); | |
return "insert;"; | |
} | |
if (elem == document.activeElement) { | |
j = 1; | |
} | |
k++; | |
} | |
/* no appropriate field found focused - focus the first one */ | |
if (j === 0 && first !== null) { | |
first.focus(); | |
return "insert;"; | |
} | |
}; | |
/* retrieves text content fro given element */ | |
function _getTextFromElement(el) | |
{ | |
if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) { | |
text = el.value; | |
} else if (el instanceof HTMLSelectElement) { | |
if (el.selectedIndex >= 0) { | |
text = el.item(el.selectedIndex).text; | |
} else{ | |
text = ""; | |
} | |
} else { | |
text = el.textContent; | |
} | |
return text.toLowerCase(); | |
} | |
/* retrieves the hint for given hint number */ | |
function _getHintByNumber(n) | |
{ | |
var index = _getHintIdByNumber(n); | |
if (index !== null) { | |
return hints[index]; | |
} | |
return null; | |
} | |
/* retrieves the id of hint with given number */ | |
function _getHintIdByNumber(n) | |
{ | |
for (var i = 0; i < hints.length; ++i) { | |
var hint = hints[i]; | |
if (hint.number === n) { | |
return i; | |
} | |
} | |
return null; | |
} | |
/* removes hint with given number from hints array */ | |
function _removeHint(n) | |
{ | |
var index = _getHintIdByNumber(n); | |
if (index === null) { | |
return; | |
} | |
var hint = hints[index]; | |
if (hint.number === n) { | |
hint.elem.style.background = hint.background; | |
hint.elem.style.color = hint.foreground; | |
hint.span.parentNode.removeChild(hint.span); | |
/* remove hints from all hints */ | |
hints.splice(index, 1); | |
} | |
} | |
/* opens given element */ | |
function _open(elem) | |
{ | |
if (elem.target == "_blank") { | |
elem.removeAttribute("target"); | |
} | |
_clickElement(elem); | |
return "done;"; | |
} | |
/* opens given element into new window */ | |
function _openNewWindow(elem) | |
{ | |
var oldTarget = elem.target; | |
/* set target to open in new window */ | |
elem.target = "_blank"; | |
_clickElement(elem); | |
elem.target = oldTarget; | |
return "done;"; | |
} | |
/* fire moudedown and click event on given element */ | |
function _clickElement(elem) | |
{ | |
doc = elem.ownerDocument; | |
view = elem.contentWindow; | |
var evObj = doc.createEvent("MouseEvents"); | |
evObj.initMouseEvent("mousedown", true, true, view, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, null); | |
elem.dispatchEvent(evObj); | |
evObj = doc.createEvent("MouseEvents"); | |
evObj.initMouseEvent("click", true, true, view, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, null); | |
elem.dispatchEvent(evObj); | |
} | |
/* retrieves the url of given element */ | |
function _getElemtSource(elem) | |
{ | |
var url = elem.href || elem.src; | |
return url; | |
} | |
/* retrieves the xpath expression according to mode */ | |
function _getXpathXpression(text) | |
{ | |
var expr; | |
if (typeof(text) == "undefined") { | |
text = ""; | |
} | |
switch (mode) { | |
case "f": | |
case "F": | |
if (text === "") { | |
expr = "//*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @class='lk' or @role='link' or @href] | //input[not(@type='hidden')] | //a[href] | //area | //textarea | //button | //select"; | |
} else { | |
expr = "//*[(@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @class='lk' or @role='link' or @href) and contains(., '" + text + "')] | //input[not(@type='hidden') and contains(., '" + text + "')] | //a[@href and contains(., '" + text + "')] | //area[contains(., '" + text + "')] | //textarea[contains(., '" + text + "')] | //button[contains(@value, '" + text + "')] | //select[contains(., '" + text + "')]"; | |
} | |
break; | |
case "i": | |
case "I": | |
if (text === "") { | |
expr = "//img[@src]"; | |
} else { | |
expr = "//img[@src and contains(., '" + text + "')]"; | |
} | |
break; | |
default: | |
if (text === "") { | |
expr = "//*[@role='link' or @href] | //a[href] | //area | //img[not(ancestor::a)]"; | |
} else { | |
expr = "//*[(@role='link' or @href) and contains(., '" + text + "')] | //a[@href and contains(., '" + text + "')] | //area[contains(., '" + text + "')] | //img[not(ancestor::a) and contains(., '" + text + "')]"; | |
} | |
break; | |
} | |
return expr; | |
} | |
}; | |
hints = new Hints(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment