Skip to content

Instantly share code, notes, and snippets.

@desyncr
Created December 3, 2013 05:52
Show Gist options
  • Save desyncr/7764508 to your computer and use it in GitHub Desktop.
Save desyncr/7764508 to your computer and use it in GitHub Desktop.
Vimprobable configuration
/*
(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 },
};
/*
(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