User Agent Switcher (Advanced)
0
tab.linkedBrowser.currentURI.spec === url);
gBrowser.selectedTab = tab || gBrowser.addTab(url);
} else
toOpenWindowByType("Preferences:ConfigManager", url);
},
performAction: function() {
switch ($.gPref("pActionAfterSwitchingUserAgent")) {
case 0:
return true;
case 1:
gBrowser.reloadTab(gBrowser.selectedTab);
break;
case 2:
gBrowser.reloadAllTabs();
break;
}
return true;
},
setSelfState: function() {
let data = $.getCurrentUAData();
self.image = $.gPref("pUseCurrentUserAgentImageForButton") ?
data["image"] :
defaultImage;
self.tooltipText = self.name + " - ID#: " + self.id.slice(20) + "\n\n" +
"๐๐ฒ๐ณ๐ ๐ฐ๐น๐ถ๐ฐ๐ธ: Open User Agent selection menu\n" +
"๐ ๐ถ๐ฑ๐ฑ๐น๐ฒ ๐ผ๐ฟ " + $.accel() + " + ๐๐ฒ๐ณ๐ ๐ฐ๐น๐ถ๐ฐ๐ธ: Open Options\n\n" +
($.gPref("pShowCurrentUserAgentInfoOnButtonTooltip") ?
("๐๐๐ฟ๐ฟ๐ฒ๐ป๐ ๐จ๐๐ฒ๐ฟ ๐๐ด๐ฒ๐ป๐: " + data["label"] + "\n" +
data["agent"] + "\n\n") : "") +
"๐ฅ๐ฒ๐ฎ๐ฑ ๐๐ต๐ถ๐ ๐ฏ๐๐๐๐ผ๐ป ๐ต๐ฒ๐น๐ฝ ๐ณ๐ผ๐ฟ ๐๐ฒ๐ฟ๐ ๐ถ๐บ๐ฝ๐ผ๐ฟ๐๐ฎ๐ป๐ ๐๐๐ฎ๐ด๐ฒ ๐ป๐ผ๐๐ฒ๐.\n" +
"๐ฅ๐ถ๐ด๐ต๐ ๐ฐ๐น๐ถ๐ฐ๐ธ ๐ผ๐ป ๐ฏ๐๐๐๐ผ๐ป, \"๐๐๐๐๐ผ๐ป ๐๐ฒ๐น๐ฝ\" ๐ถ๐๐ฒ๐บ.";
},
addToHelpTab: function(aItemsObj) {
var helpContentOld = self.getAttribute("Help").split(""),
btnURL = custombuttons.makeButtonLink("edit", self.id),
cbService = custombuttons.cbService;
let helpContentNew;
try {
helpContentNew = helpContentOld[0] +
"" + JSON.stringify(aItemsObj, null, "\t") + "";
} finally {
var param = cbService.getButtonParameters(btnURL);
param = param.wrappedJSObject || param;
param.help = helpContentNew;
cbService.installButton(param); // Triggers onDestroy()
}
},
createElements: function() {
let popSet = $.$("mainPopupSet");
let m = $.$($._UID + "-menupopup");
if (popSet && !m) {
m = popSet.appendChild($.$CNS("menupopup", {
id: $._UID + "-menupopup",
cb_id: $._UID,
onpopupshowing: $.that + "populateMainMenu(this);event.stopPropagation();",
oncontextmenu: "event.stopPropagation();",
onpopuphiding: "event.stopPropagation();",
onpopupshown: "this.handleOpenState(event, true);event.stopPropagation();",
onpopuphidden: "this.handleOpenState(event, false);event.stopPropagation();",
onclick: "event.stopPropagation();",
oncommand: $.that + "setUserAgent(event);event.stopPropagation();",
orient: "vertical",
position: "after_start",
consumeoutsideclicks: false,
}));
m.handleOpenState = function(aE, aState) {
if (aState)
self.setAttribute("open", aState);
else
self.removeAttribute("open");
};
if ($.gPref("pConvertMenuToPanel")) {
m.style.MozAppearance = "none";
m.style.MozBinding = "url('chrome://global/content/bindings/popup.xml#arrowpanel')";
m.style.background = "transparent";
m.style.border = "none";
m.style.MozImageRegion = "auto";
}
}
},
setUserAgent: function(aE) {
let el = aE.target;
let ua = el.getAttribute("data-agent");
if (ua === "")
Services.prefs.clearUserPref($.uaPrefStr);
else {
let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
str.data = ua;
Services.prefs.setComplexValue(($.uaPrefStr), Ci.nsISupportsString, str);
}
setTimeout(function() {
$.performAction();
}, 100);
setTimeout(function() {
$.setSelfState();
}, 100);
},
populateMainMenu: function(aN) {
aN.textContent = "";
let pref = $.uaPref;
let rG = aN.appendChild($.$CNS("radiogroup"));
rG.appendChild($.$CNS("radio", {
label: "Default User Agent",
accesskey: "D",
src: "chrome://branding/content/icon16.png",
selected: pref === null,
"data-agent": "",
onclick: "event.stopPropagation();",
}));
rG.appendChild($.$CNS("menuseparator"));
let arr = $._mainArr;
let i = 0,
iLen = arr.length;
try {
if (arr && arr.length > 0) {
for (; i < iLen; i++) {
switch (arr[i]["label"]) {
case "[menuseparator]":
rG.appendChild($.$CNS("menuseparator"));
break;
default:
rG.appendChild($.$CNS("radio", {
label: arr[i]["label"],
tooltiptext: arr[i]["agent"],
src: arr[i]["image"],
accesskey: arr[i]["accesskey"],
selected: pref === arr[i]["agent"],
"data-agent": arr[i]["agent"],
onclick: "event.stopPropagation();",
}));
break;
}
}
}
} finally {
aN.appendChild($.$CNS("menuseparator"));
aN.appendChild($.$CNS("menuitem", {
label: "Edit menu",
tooltiptext: "Edit menu of User Agents",
oncommand: $.that + "editUserAgents();event.stopPropagation();",
onclick: "event.stopPropagation();",
}));
}
},
editUserAgents: function() {
var em = Services.ww.getWindowEnumerator();
var winName = $._UID + "_user_agents_editor";
var index = 1;
while (em.hasMoreElements()) {
let win = em.getNext();
if (win.name === winName) {
win.focus();
return;
}
index++;
}
let xul = $.getHelp("%UserAgentsEditor%");
let storage = {
img_to_b64_cback: $.img_to_b64_cback,
button: self,
custombuttons: custombuttons,
accel: $.accel,
data: $._mainArr,
};
xul = xul.replace(/>\s+<");
xul = xul.split("%U_I_D%").join($._UID);
xul = xul.split("%A_C_C_E_L%").join($.accel());
let url = "data:application/vnd.mozilla.xul+xml;text/plain," + encodeURIComponent(xul);
let win = openDialog(url, winName, "chrome, resizable, dialog=no, centerscreen, close");
win._storage = storage;
},
/**
* NEVER CHANGE TO "BRANCH OBSERVER"!!!!
* Works like absolute SHEET on SeaMonkey!!!!
*/
handlePrefObserver: function(aRem) {
var prefs = $.DefPrefs;
for (let key in prefs) {
let pref = $.Branch + key;
if (prefs.hasOwnProperty(key)) {
if (aRem)
Services.prefs.removeObserver(pref, $.prefObserver, false);
else
Services.prefs.addObserver(pref, $.prefObserver, false);
}
}
if (aRem)
Services.prefs.removeObserver($.uaPrefStr, $.prefObserver2, false);
else
Services.prefs.addObserver($.uaPrefStr, $.prefObserver2, false);
},
prefObserver: {
observe: function(aSubject, aTopic, aPStr) {
if (aTopic === "nsPref:changed") {
let prefName = aPStr.slice($.Branch.length);
switch (prefName) {
case "pUseCurrentUserAgentImageForButton":
case "pShowCurrentUserAgentInfoOnButtonTooltip":
$.setSelfState();
break;
case "pConvertMenuToPanel":
$.selfDestroy();
break;
}
}
}
},
prefObserver2: {
observe: function(aSubject, aTopic, aPStr) {
if (aTopic === "nsPref:changed") {
$.setSelfState();
}
}
},
$: function(aId) { // Return elements by Id
return document.getElementById(aId);
},
getHelp: function(aPlaceholder) { // Get specific data, surrounded by "placeholders", from the Help tab.
return $.$(self.id).getAttribute("Help").split("")[1];
},
$CNS: function(aElName, aAttrs, aNameSpace) { // Creates elements
var el = aNameSpace ?
document.createElementNS(aNameSpace, aElName) :
document.createElement(aElName);
if (aAttrs)
Object.keys(aAttrs).forEach(function(n) {
if (aAttrs[n] !== "")
el.setAttribute(n, aAttrs[n]);
});
return el;
},
img_to_b64_cback: function(aURL, aCallback) {
if (!aURL)
aCallback(false);
else {
let xhr = new XMLHttpRequest(),
nsIMIMEService = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
try {
xhr.open("GET", aURL, true);
} catch (aErr) {
aCallback(false);
return true;
}
xhr.responseType = "arraybuffer";
xhr.onload = function() {
let mediaType,
dataURI,
binary,
bytes;
bytes = new Uint8Array(xhr.response);
binary = [].map.call(bytes, function(aByte) {
return String.fromCharCode(aByte);
}).join("");
mediaType = xhr.getResponseHeader("Content-Type");
let base64 = btoa(binary);
if (mediaType.indexOf("image/") !== 0) {
try {
mediaType = nsIMIMEService.getTypeFromURI(Services.io.newURI(aURL, null, null));
} catch (aError) {
mediaType = "image/png";
}
}
dataURI = "data:" + mediaType + ";base64," + base64;
aCallback(dataURI);
};
xhr.onerror = function() {
aCallback(false);
};
xhr.send(null);
}
},
selfDestroy: function() {
self.destroy("update");
setTimeout(function() {
self.init();
}, 100);
},
accel: function(aE) {
if (aE)
return $.isOSX ? aE.metaKey : aE.ctrlKey;
return $.isOSX ? "๐๐ผ๐บ๐บ๐ฎ๐ป๐ฑ" : "๐๐ผ๐ป๐๐ฟ๐ผ๐น";
},
get uaPref() {
return (Services.prefs.getPrefType($.uaPrefStr) === 0 ?
null :
Services.prefs.getComplexValue($.uaPrefStr, Ci.nsISupportsString).data);
},
isOSX: Services.appinfo.OS.toLowerCase().startsWith("darwin"),
_UID: "__user_agent_switcher" + self.id.slice(20),
_mainArr: null,
that: "document.getElementById('" + self.id + "').UserAgentSwitcher.",
uaPrefStr: "general.useragent.override",
};
this.UserAgentSwitcher.Branch = "CB.UserAgentSwitcher.Id" + self.id.slice(20) + ".";
this.UserAgentSwitcher.DefPrefs = {
pOpenOptionsOnNewTab: false,
pConvertMenuToPanel: true,
pUseCurrentUserAgentImageForButton: true,
pShowCurrentUserAgentInfoOnButtonTooltip: true,
pActionAfterSwitchingUserAgent: 0,
};
this.UserAgentSwitcher.initPrefs = function() {
let branch = Services.prefs.getDefaultBranch(self.UserAgentSwitcher.Branch),
defaults = self.UserAgentSwitcher.DefPrefs;
for (let key in defaults) {
if (defaults.hasOwnProperty(key)) {
let val = defaults[key];
switch (typeof val) {
case "boolean":
branch.setBoolPref(key, val);
break;
case "number":
branch.setIntPref(key, val);
break;
case "string":
let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
str.data = val;
branch.setComplexValue((key), Ci.nsISupportsString, str);
break;
}
}
}
};
this.UserAgentSwitcher.gPref = function(aKey) {
let branch = Services.prefs.getBranch(self.UserAgentSwitcher.Branch);
switch (typeof self.UserAgentSwitcher.DefPrefs[aKey]) {
case "boolean":
return branch.getBoolPref(aKey);
case "number":
return branch.getIntPref(aKey);
case "string":
return branch.getComplexValue(aKey, Ci.nsISupportsString).data;
}
return null;
};
this.UserAgentSwitcher.sPref = function(aKey, aVal) {
let branch = Services.prefs.getBranch(self.UserAgentSwitcher.Branch);
switch (typeof aVal) {
case "boolean":
branch.setBoolPref(aKey, aVal);
break;
case "number":
branch.setIntPref(aKey, aVal);
break;
case "string":
let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
str.data = aVal;
branch.setComplexValue((aKey), Ci.nsISupportsString, str);
break;
}
};
this.UserAgentSwitcher.init();]]>
๐๐บ๐ฝ๐ผ๐ฟ๐๐ฎ๐ป๐ ๐ป๐ผ๐๐ฒ๐
โซ Posible values for ๐ฝ๐๐ฐ๐๐ถ๐ผ๐ป๐๐ณ๐๐ฒ๐ฟ๐ฆ๐๐ถ๐๐ฐ๐ต๐ถ๐ป๐ด๐จ๐๐ฒ๐ฟ๐๐ด๐ฒ๐ป๐ preference.
โซ 0 = Do nothing.
โซ 1 = Reload current tab.
โซ 2 = Reload all tabs.
๐ช๐๐ฅ๐ก๐๐ก๐โโ ๐๐ ๐๐๐ฅ๐๐๐จ๐ ๐๐ ๐ฌ๐ข๐จ ๐๐๐๐ง ๐ง๐๐ ๐๐๐๐ฃ ๐ง๐๐ ๐ข๐ ๐ง๐๐๐ฆ ๐๐จ๐ง๐ง๐ข๐กโโโ
๐๐ง ๐๐ข๐จ๐๐ ๐๐ฅ๐๐๐ ๐๐ง๐ฆ ๐๐จ๐ก๐๐๐ข๐ก๐๐๐๐ง๐ฌโโโ
[,]
/**
* ๐๐ฅ๐ข๐ ๐๐๐ฅ๐ ๐๐ข๐ช๐ก ๐๐ข ๐ก๐ข๐ง ๐ง๐ข๐จ๐๐ ๐๐ก๐ฌ๐ง๐๐๐ก๐
*/
<!--%UserAgentsEditor%--><?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="chrome://global/skin/" ?>
<?xml-stylesheet href="data:text/css;charset=utf-8,
window * {
font-family: "Open Sans", Helvetica, Arial, sans-serif !important;
}
.convert-to-panel {
-moz-appearance: none !important;
-moz-binding: url("chrome://global/content/bindings/popup.xml%23arrowpanel") !important;
background: transparent !important;
border: none !important;
-moz-image-region: auto !important;
}
caption .caption-text,
.bold_text {
font-weight: bold !important;
}
.warning{
font-weight: bold !important;
color: red !important;
}
button .button-text {
display: inline-block !important;
text-align: left !important;
}
button {
min-width: 0 !important;
}
.optional {
outline: 2px solid green !important;
}
.required {
outline: 2px solid orange !important;
}
.optional,
.required,
.experimental {
margin-top: 5px !important;
margin-bottom: 5px !important;
}
groupbox {
-moz-appearance: groupbox !important;
border: 2px groove ThreeDFace !important;
border-radius: 3px !important;
margin: 3px !important;
padding: 3px 3px 6px !important;
}
.groupbox-body {
padding: inherit !important;
}
caption {
margin: 0 6px !important;
background-color: -moz-Dialog !important;
}
/* !important is needed to override label in global.css */
.caption-text {
margin: 0 2px !important;
}
resizer {
-moz-appearance: none !important;
background-image: none !important;
}
.pseudo_menupopup {
-moz-appearance: menupopup !important;
padding: 5px !important;
overflow-x: auto !important;
overflow-y: auto !important;
}
.edit-user-agent {
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAABbklEQVQokX2QP0sCcRzGv+kZiC7+/PNT8w/INeh2kzl0bg4SUZESDSHkWwgMMsgGIdPBMDRvUQKXIpcgiTh0EITruPfgvY+n5YYG9YEPz/SBh4fICoDtWq0mtdvtCIAt2hQATlmWDwVB+Pb5fI1OpxNdKwGwZzKZA0EQVCL6JSKNMdYEEFgpAbCXSqU8Y+ydiKYWGmPsod/vr54HwKMoSiEWiw2I6MviJxgM3m2SXOPx+DQej78Q0YfFp9frvd80zzUcDk/C4XCHiF4dDsfA7Xa/BQKBW1VVfetO8IxGo2NRFB9FUax3u90LzvlTNpvdB2BfJ7kmk8lRKpVqcs7buVzuJplMXs7ncycBsCmKEq9Wq5Ku6/5KpSLpuu5vNBrp2Wx2Vi6Xr6LR6HMoFLqu1+sJAiDIslzknLd6vV76f+fz+XMACdM091qtVnE6ne4SAJthGJKmaYXlcrmzWCwKpmlGNE0rGIYhAbBZOAEIf/lbwByZlq46AAAAAElFTkSuQmCC") !important;
-moz-image-region: auto !important;
}
.delete-user-agent {
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAABVklEQVQokWNgoAT8//+f+////9xofB5cigXmGemnz9LRyX97+zbf29u3+Wbp6OTPN9TP+P//vwCGyavsrdLm8HH+XCDA/X6Fo33aSif71AUC3O/n8HH+XGFnmY5i0////7n3piTVH1aVfXFAVuT/aknB96skBd8fkBX5f0RV9sXelJQGZKdCNH3+LPaot7P2vL7yi1MaUv9PaUj9P6+v/OJxT0fd/8+fxTD9cPs23/6YoPSTJipvrxsr/L9urPD/pInK2/2xgRn/b9/mw/DDDh+7/AMGcu/vWKv9f+is++Khs+6LO9Zq/w8ayL3f4W1bgOKk////89yb0F763FPv22tfkxcfF0yo+7xwYu1rX5MXzz31vj2Y0F6KEbz///+X/r16Tsn3ma21/7+8FP//+bPY95mttT9WzS79//+/NK64EPv//7/E////GaFY4v///+JYFRMLAKUewtoAYB96AAAAAElFTkSuQmCC") !important;
-moz-image-region: auto !important;
}
.save_changes {
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACdElEQVQ4jWNgIBGE/mdgZvjPwEiqPgYGBgaGpCOGUhX3XFO630Zapp0xZiVJc/QSFb78aw4dXe/C3k/8lnCj73OkfcN/BiaiNEfsUpfKPGfV0fDE/33jc///PR8i/nW9iz5Rez/QnoGBgYHBYT4Dh/cGNdugHZqS6Jq9l8oJppyw6ml8FvCx6Lbz/7iThv8zL1n9r37k+6fgusdGBoYGBqbQvXpOmeecbqecsu33XKUiCtNsPJOBNXiHfm/NQ78veTcd/wcf0vofsF/9f+BBjX/RR40fxBwx8WNIOWinWHnPd3/di8B/1Q/93yYcse6yWSonqDddXCxgi/bkyge+XzOu2f332qv632238n+P3Sr//XZr3wnaoRvlOUmFnaHgivu2kocevz32qf5PvGT1r+Ke/2fvDdqz3NapL25+Efol8ZLVf8edCv9tt8n+t9sm999lu9oZv42adtqrtNkYGBgYGKy2yW212S73w2Sz5D+LrTL/k6/a/C+74/u/7I7P/9gLFv9NNknC8F+LdbIX7NcqO6IEkvpyLimdNcKLtdaK/tBaK/LfYKPE//Bzpv+DThn9198g/l9rrch/7TWif3SXS14wWSLvaTyTATP+pZYLycqvFFijuJL/p+JKgf9KqwT/K60U+K+4UuC/4gqBvyoLRS6oTRW1wZsCBRdxykks5loovoT7k/gS7v/iS7j/iy/i+S81i/eCTL+gJwMDEcmXdy6DOt88toW8C9h+8s1l+88/keOMSCuPI0MaFmfjAIwM/QwKbNMY1rJ0Mp5kKGOwIFYjDLAyCDAI8ITyaHH7cOszSDMIMzAQbzuqS4jxMwMDAwDtNu92OyP2UwAAAABJRU5ErkJggg==") !important;
-moz-image-region: auto !important;
}
.cancel_changes {
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAADdklEQVQ4jXVTb0yUBRx+3n+8977vve/BcXhIBzg5CMZRCAvGSIZQMCXpRFhkagRjTkjStdr6M9bW1/rCt1tZ0vDUU1E4QMHrAMk7F4zDY4qYRBdkyzJK0eMC9+sLOGnr+fo8z2+/Pc8eYBVtgHZSH2NzqqoJ/4Muk0l1WSxZLovFuI4oAKTjVXu2Tbd++tmNhsbac9HR0f81d8CoTVZUVk01t3x+vGJ3+U5AXuOi7BbL9q79jRf/cp5duvNRa9Cfld3YqaqxawIXNOPlrOy6UPORwJ9tX0Z69tV7X0vc9CoAHarzi2u/2P3GlZm6g0sP322lB4c/WAlVVk+NbEpp+QZQHIDcn7y5aXa7/fr95vdWHh75mGbr3444il4e3ZWZ+ybeyi89PdBwKLywrYLu5hfTvXI7LVbtodmcvJ/G8l9850p2dtN0uu3H+6U76Peicrr7wlb6e2sZ9ReWRRqyCvtRkbblpQMZz53tS9z8IGTaQLfNCfSb7XlaTH2W7lVW/fpHUfH8gmkD3TEn0A8xsRSKNpInLv7RgbiN/fbEDDsACGmCkNek6DvcmmFxVBRpWBDopiDQgiWJfjbF0QTL0iDDkJ/jyC1EhQ/xUefTgWIAurWcuAIgvUXQdZxStMcXeIHOAdQHhroB6gSoh2HIyfGPDzPc+RIgBwC/rqYagHsfyOvOsA0PWJLoGMfRUYCOAvQVw5A72kiuBEvwQ6C8BuDWmdsA8YQk5Z9R9Kd6FH3YxfPUDpCTYegEy1I7QCd5ntx6/cppWd/ZLkkFn6y97wAEF8+XXFDUbo8kh3tZjnoA8jAMjcYYadwcT98yDPUC1Mdy5JHkcK+i9BwTxTIHIOD7fXU7v0uxDg6K4pKXZWkEoHGWpRuSRBMJlvlgivX2TVmmwCrnZVkaEnVLg0bTiDstw47x6tquyS05ER/H0RhA0yxLIVlevqaqtwZEsXlA0e29ZjAEQ6r6z61VjY/jacK8cdmfneuFL7egxm8yXbouSY/mFIV+0bTlSU0LDIniwUuAwQHIHp1ubzDG4JtX1chcVBRNSfLSVVX1X7Va6/E1oBvmUTKT+Ez3fGFheNJqDfgEYb8HeLKFPkAbkaRd43GxvrlUa2TGbPaOcNwr/YDyJEh3UlLpZZvtzFRm5utjTy3tqSNiID5+x1BqivNicnJFGyACwL8fh1x5BGHtQgAAAABJRU5ErkJggg==") !important;
-moz-image-region: auto !important;
}
.extra_info_pop {
list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACaElEQVQ4jYWSS0wTYRSFb60xaNo0TjTj1mRaFkgZkuJmNmxN7FBpiBtTqgYbSSRhIiUmoImPnc6004elPKIGdWcirKS8dFHYuZBKRIxGxyISjKFI04H0uBhEsAVP8u/u/f57zz1EZSQIotUpBit5d0sd726pqzkjOQRBtJarLVGNeKWR84cnWWk0a+vOrNq6M6uslMpy/vAk77ns2bWxqqnVYveHEkzntE4KYAoDR2N5WKI6KAyQAjDBKZ1rVuJVTa2WEoDdH0ocvJNdJxWgKHAsuYaR2WXcndCwP7oOigAUAipuabrDJ8dKxmY6p3VSAYoBdB840r+Gp6+/4dqLzzAnNkBxbEGYq2m92h1o2DKM84cnKWT8TAnAlNxA45M5SMNzuPBsHof710BJGBAVILkIrlkeFwTBSk4xWMlKo1lSNwuSgGmgiJODGjILK/i0/AvHB1dAfQacosYUbHtK470dduIbW+ps1zOrFDFGp16AHgDmhwUMz343AI9XQP0A9WyuGAJsXTO5WjHg2hMw9Hbx/4Cas5KDlVI7VqABwDxQwFBmcY8VRjTe22bfNFGd2G4i9QLm3m2AR7lSE33KWH19vZEH3nPJw3RO7TjjoXgOo++W8PVnHif6FmCKFf+esSNdcJ6+6N6RBe68Eq+4remkAvtCedx4/gap2SW8ev8DPS8/wBX/aATp5hedOydHykbZ4ZdjTDCtk1KERc3DGsnDqhrvgKyDCaYLnO9epGyU/6jaHWjgmuVxtj2l2bpmcraumRwrjWicTxlzngq4d23cLkEQrLy3w14rBly1YsDFe9vsW4b9o9/mTMrMlE74aAAAAABJRU5ErkJggg==") !important;
-moz-image-region: auto !important;
}
" type="text/css" ?>
<window id="%U_I_D%_user_agents_editor"
onload="$.onLoad();"
onunload="$.onUnLoad();"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script><![CDATA[
var Cc = Components.classes;
var Ci = Components.interfaces;
var Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
var stg = window._storage;
var cb_btn = stg.button;
function $id(aID, aParent) {
if (!aParent)
return document.getElementById(aID);
return aParent.getElementById(aID);
}
var $ = {
onLoad: function() {
window.editPanelTarget = null;
$.populateBox();
window.addEventListener("focus", $, false);
window.addEventListener("blur", $, false);
$.highlightButton(cb_btn, 1);
},
handleEvent: function(aE) {
switch (aE.type) {
case "focus":
$.highlightButton(cb_btn, 1);
break;
case "blur":
$.highlightButton(cb_btn, 2);
break;
}
},
onUnLoad: function() {
$.highlightButton(cb_btn);
},
populateBox: function() {
let uaArray = stg.data;
let o = 0,
oLen = uaArray.length;
for (; o < oLen; o++) {
let obj = uaArray[o];
let lbl = obj["label"] || "";
$.createItems(lbl, obj);
}
},
highlightButtonTimer: null,
highlightButton: function(aEl, aStyle) {
aEl.style.removeProperty("border-color");
aEl.style.removeProperty("box-shadow");
aEl.style.removeProperty("outline");
aEl.style.removeProperty("outline-offset");
aEl.style.removeProperty("transition-duration");
if (!aStyle)
return true;
clearTimeout($.highlightButtonTimer);
$.highlightButtonTimer = setTimeout(function() {
switch (aStyle) {
case 1:
aEl.style.setProperty("border-color", "rgba(0,200,0,1)", "important");
aEl.style.setProperty("box-shadow", "0 0 1px 1px rgba(0,200,0,1)", "important");
aEl.style.setProperty("outline", "2px solid rgba(0,200,0,1)", "important");
aEl.style.setProperty("outline-offset", "-2px", "important");
aEl.style.setProperty("transition-duration", "10ms", "important");
break;
case 2:
aEl.style.setProperty("border-color", "rgba(0,200,0,.2)", "important");
aEl.style.setProperty("box-shadow", "0 0 1px 1px rgba(0,200,0,.2)", "important");
aEl.style.setProperty("outline", "2px dotted rgba(0,200,0,.2)", "important");
aEl.style.setProperty("outline-offset", "-2px", "important");
aEl.style.setProperty("transition-duration", "10ms", "important");
break;
}
}, 10);
},
highlightElement: function(aEl, aRem) {
aEl.style.removeProperty("background");
aEl.style.removeProperty("border-color");
aEl.style.removeProperty("box-shadow");
aEl.style.removeProperty("outline");
aEl.style.removeProperty("outline-offset");
if (aRem)
return true;
aEl.style.setProperty("background", "rgba(0,255,0,.25)", "important");
aEl.style.setProperty("border-color", "rgba(0,200,0,1)", "important");
aEl.style.setProperty("box-shadow", "0 0 1px 1px rgba(0,200,0,.5)", "important");
aEl.style.setProperty("outline", "2px solid rgba(0,200,0,1)", "important");
aEl.style.setProperty("outline-offset", "-2px", "important");
},
onAccept: function() {
let uaArray = [];
try {
let box = $id("container-box");
Array.prototype.slice.call(box.getElementsByTagName("menuitem")).forEach(function(aMI) {
uaArray.push(aMI._data);
});
} finally {
cb_btn.UserAgentSwitcher.addToHelpTab(uaArray);
setTimeout(function() {
close();
}, 100);
}
},
reportError: function(aRejectReason) {
try {
console.error(aRejectReason);
} catch (aErr) {
Cu.reportError([cb_btn.name + ": " + cb_btn.id, aRejectReason, aRejectReason.stack].join("\n"));
}
},
dummyData: function(aType) {
switch (aType) {
case "userAgent":
return {
"label": "User Agent",
"accesskey": "",
"image": "",
"agent": "",
};
case "[menuseparator]":
return {
"label": "[menuseparator]",
};
}
},
createItems: function(aLabel, aData) {
let box = $id("container-box");
let hbox = box.appendChild($.$CNS("hbox", {
align: "center"
}));
let mI = hbox.appendChild($.$CNS("menuitem", {
label: aLabel,
flex: "1",
class: "menuitem-iconic",
}));
mI._data = aData;
hbox.appendChild($.$CNS("button", {
tooltiptext: "Delete item",
mousethrough: "never",
class: "delete-user-agent",
oncommand: "$.removeItem(event, this);"
}));
if (aLabel !== "[menuseparator]") {
hbox.appendChild($.$CNS("button", {
tooltiptext: "Edit User Agent",
mousethrough: "never",
class: "edit-user-agent",
oncommand: "$.editItem(event);"
}));
}
},
removeItem: function(aE, aNode) {
if (stg.accel(aE)) {
aNode.parentNode.parentNode.removeChild(aNode.parentNode);
return true;
}
let cBox = stg.custombuttons.confirmBox("User Agent Switcher", "Delete item?\n\n" +
"Keep the " + stg.accel() + " key pressed to delete items without confirmation.", "Yes", "Cancel");
if (cBox) {
aNode.parentNode.parentNode.removeChild(aNode.parentNode);
} else
return false;
},
populateEditPanel: function(aFakeMI, aNode, aTarget) {
window.editPanelTarget = aTarget.parentNode;
$.highlightElement(window.editPanelTarget);
let dataObj = aFakeMI._data;
let vbox = $id("user_agent_box");
let tempBox;
try {
try {
let id = vbox.getAttribute("id");
tempBox = vbox.cloneNode(true);
tempBox.setAttribute("id", id + "-cloned");
} finally {
aNode.appendChild(tempBox);
}
} finally {
Array.prototype.slice.call(tempBox.getElementsByAttribute("data-attr", "*")).forEach(function(aEl) {
let attrName = aEl.getAttribute("data-attr");
let attrVal = dataObj[attrName];
// This crap doesn't work on normal textboxes, but it does on number textboxes.
aEl && (aEl.value = attrVal);
// And this crap doesn't work on number textboxes, but it does on normal textboxes. WTF!?!?!?!
aEl && aEl.setAttribute("value", attrVal);
});
}
},
editItem: function(aE, aType) {
let panel = $.panel;
if (panel && (panel.state === "open" || panel.state === "opening"))
return false;
let fakeMI = aE.target.parentNode.firstChild;
$.populateEditPanel(fakeMI, panel.firstChild, aE.target);
panel.openPopup(aE.target, "", 0, 0, false, null, null);
},
onEditPanelAccept: function() {
let panel = $.panel;
let item = window.editPanelTarget.firstChild;
try {
Array.prototype.slice.call(panel.getElementsByAttribute("data-attr", "*")).forEach(function(aEl) {
let attrName = aEl.getAttribute("data-attr");
item._data[attrName] = aEl.value || "";
});
} finally {
$.updateCustomEngine(item);
$.onEditPanelCancel();
}
},
updateCustomEngine: function(aItem) {
aItem.setAttribute("label", aItem._data["label"] || "");
},
onEditPanelCancel: function() {
let panel = $.panel;
panel && panel.hidePopup();
if (window.editPanelTarget) {
$.highlightElement(window.editPanelTarget, true);
}
},
onEditPanelHidden: function(aE, aN) {
if (aE.target !== aN)
return false;
aE.stopPropagation();
},
onEditPanelHiding: function(aE, aN) {
if (aE.target !== aN)
return false;
aN.firstChild.textContent = "";
$.highlightElement(window.editPanelTarget, true)
window.editPanelTarget = null;
aE.stopPropagation();
},
$CNS: function(aElName, aAttrs) { // Creates elements
var el = document.createElement(aElName);
if (aAttrs)
Object.keys(aAttrs).forEach(function(n) {
if (aAttrs[n] !== "")
el.setAttribute(n, aAttrs[n])
});
return el;
},
img_to_b64: function(aNode) {
let imgURL = aNode.parentNode.firstChild.value;
if (imgURL.search(/^data:image/) === 0 || imgURL === "")
return true;
stg.img_to_b64_cback(imgURL, function(aImgData) {
aImgData && (aNode.parentNode.firstChild.value = aImgData);
});
},
selectLocalImage: function(aNode) {
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
fp.init(window, "Select an image file", 0);
fp.appendFilters(fp.filterImages);
var res = fp.show();
if (res == fp.returnOK) {
aNode.parentNode.firstChild.value = fp.fileURL.spec;
}
},
draggedElement: null,
DragAndDropHandler: {
handleEvent: function(aE) {
switch (aE.type) {
case "dragstart":
if (!stg.accel(aE) || !!window.editPanelTarget)
return false;
let target = aE.target;
if (target.nodeName !== "hbox")
$.draggedElement = target.parentNode;
if ($.draggedElement.nodeName !== "hbox")
$.draggedElement = null;
if (getComputedStyle($.draggedElement).outlineStyle !== "none") {
$.draggedElement = null;
return false;
}
aE.dataTransfer.setData("text/plain", "dummy"); // Stupid piece of SHEET!!!!!
break;
case "dragover":
aE.preventDefault();
break;
case "drop":
aE.preventDefault();
let insPoint = aE.target.parentNode;
if (insPoint && insPoint.nodeName === "hbox") {
insPoint.parentNode.insertBefore($.draggedElement, insPoint);
} else if (aE.target.nodeName === "vbox") {
aE.target.appendChild($.draggedElement);
}
break;
}
aE.stopPropagation();
}
},
setTextboxValue: function(aE, aDataAttr) {
let el = $.panel.getElementsByAttribute("data-attr", aDataAttr)[0];
el && (el.value = aE.target.value);
},
get panel() {
return $id("edit-user-agent-panel");
},
};
]]></script>
<keyset>
<key keycode="VK_ESCAPE" oncommand="return false;"/>
</keyset>
<vbox flex="1">
<vbox id="container-box"
minheight="50"
flex="1"
class="pseudo_menupopup"
ondragstart="$.DragAndDropHandler.handleEvent(event);"
ondragover="$.DragAndDropHandler.handleEvent(event);"
ondrop="$.DragAndDropHandler.handleEvent(event);">
</vbox>
<separator/>
<hbox>
<spacer flex="1"/>
<button label="Insert a new item" type="menu">
<menupopup consumeoutsideclicks="false">
<menuitem label="Add an User Agent"
oncommand="event.stopPropagation();"
onclick="$.createItems('User Agent', $.dummyData('userAgent'));"/>
<menuitem label="Add a menuseparator"
oncommand="event.stopPropagation();"
onclick="$.createItems('[menuseparator]', $.dummyData('[menuseparator]'));"/>
</menupopup>
</button>
<button popup="extra_info_pop" tooltiptext="Extra info" class="extra_info_pop" />
<spacer flex="1"/>
</hbox>
<separator/>
<hbox>
<spacer flex="1"/>
<button label="Save changes" class="save_changes" oncommand="$.onAccept();"/>
<button label="Cancel" class="cancel_changes" oncommand="close();"/>
<spacer flex="1"/>
</hbox>
<vbox collapsed="true">
<groupbox id="user_agent_box" orient="vertical" flex="1">
<caption label="Edit User Agent item"/>
<grid>
<columns>
<column />
<column flex="1"/>
</columns>
<rows>
<row align="center">
<label value="Label"/>
<textbox data-attr="label" class="required"/>
</row>
<row align="center">
<label value="User Agent"/>
<textbox data-attr="agent" class="required"/>
</row>
<row align="center">
<label value="Accesskey"/>
<textbox data-attr="accesskey" class="optional"/>
</row>
<row align="center">
<label value="Image"/>
<hbox align="center">
<textbox data-attr="image" flex="1" class="optional"/>
<button label="..." oncommand="$.selectLocalImage(this);"/>
<button label="B64" oncommand="$.img_to_b64(this);"/>
</hbox>
</row>
</rows>
</grid>
</groupbox>
</vbox>
</vbox>
<separator/>
<popupset>
<panel id="edit-user-agent-panel"
consumeoutsideclicks="false"
noautohide="true"
backdrag="true"
minwidth="500"
flip="slide"
flex="1"
class="convert-to-panel"
position="end_before"
onpopuphidden="$.onEditPanelHidden(event, this);"
onpopuphiding="$.onEditPanelHiding(event, this);"
orient="vertical">
<vbox flex="1" />
<spacer flex="0"/>
<hbox>
<spacer flex="1"/>
<button label="Save" class="save_changes" oncommand="$.onEditPanelAccept();event.stopPropagation();"/>
<button label="Cancel" class="cancel_changes" oncommand="$.onEditPanelCancel();event.stopPropagation();"/>
<spacer flex="1"/>
</hbox>
<hbox>
<resizer element="edit-user-agent-panel" type="window" dir="bottomleft" left="0" bottom="0" width="10" height="10"/>
<spacer flex="1"/>
<resizer element="edit-user-agent-panel" type="window" dir="bottomright" right="0" bottom="0" width="10" height="10"/>
</hbox>
</panel>
<panel id="extra_info_pop" type="arrow" consumeoutsideclicks="false" orient="vertical" position="before_end" flip="slide">
<description>Rearrange items by dragging them while holding %A_C_C_E_L% key.</description>
</panel>
</popupset>
</window><!--%UserAgentsEditor%-->
<!--%UserAgents%-->[
{
"label": "Android 4.4.2 - Samsung Galaxy S5 (SM-G900P)",
"accesskey": "",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAV1BMVEX///+XwCScwzCkyD+WwCOUvh6YwSaYwSeawiubwy2VvyChxzmWvyGmykSTvR6exDOgxTaTvh2ixzyYwSWZwSitzVOexDKpy0urzE6XwCOx0Fq41Gmawim2D7p1AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHVJREFUeF51j1UKBDEQBVviNipr9z/nZkhowsLW3yta4Q8c4zrmk3Qw7i1ZcQ6JuIiw++4qqscLuLECPGqeEodGOfxdNBvGhj7O7VeYW2yrCMIqss2qi1ektmdRmBJikctm+3QeDYEwaYCQx1+W2jcK+AD0375hHQSxBc4RAwAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (Linux; Android 4.4.2; en-us; SAMSUNG SM-G900P Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.6"
},
{
"label": "Mobile Safari 9.0 - iOS",
"accesskey": "",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAARVBMVEX///9Kj+EzfNF7mbsFmNN6suB2jKO+wMCkzu4XsvBIpfi0QkQUftUHfspsbGysoqppZWV4en1fXWF8fICDdJLBqq18cJczfRzzAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHRJREFUeF5ti0cOxDAQwyyNa0nZ+v+nrmw42EsIXUhA7p4ji+PvuYaq5ctltZSqthzSwRezPICpaAReCobu5e/29B02Hgq+fFrzCmEEKuR0+iuYQkhRvi47icThG7k7YYzbpNPcBORwEm5hnJhkcUazqP8dP3A8BE4FOFjQAAAAAElFTkSuQmCC",
"agent": "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1"
},
{
"label": "[menuseparator]"
},
{
"label": "Chrome 50.0 - Win10 x64",
"accesskey": "C",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAt1BMVEX////dJCjhMTDlQTnmRj30zA1bs0dLs0iUtNDywBL5zgrpZFHgpCTiNTLpXk7UJifmST9GrkZEpkU/iz5Mi8dsnczpVkjK0qhJsUfjOTXipCFRjsiCpTnjh2RZksq1tyboUENEoERClUHjnx0tdaQrdLMtdrXgLC1jl8n4zhB8qNHeJyrmclztpBbhm0I7gcHIKCc4f7/hlVlyos74zQtoqEFEqUW+vbzlyRPZ1KDm15f66ZmrFQnYtYzKAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAALRJREFUeF41y1WOBDEMRVGHoZihkRmGef/rartL836iexTDY3EQBPEc/ifSuo7reSq6oXknpEylEBE/UT+xHY+iiPPdiTGG0Cb4ysnkuqIBGDNO2Nkej/ZHKe89gvmTdlpVU3vwBK0xxUtZjkZl+Yv9RpB93mjPBAoyvNGvm+12U9GJg5y+NPv1ev+NfXAwiG4a/YUH2LBEQfqYUfdAssiQtFKOmlYsF3k+c5c+pBqoeA/DIe9NMRA5+kWPaAAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
},
{
"label": "Chrome 50.0 - Linux x86_64",
"accesskey": "C",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAt1BMVEX////dJCjhMTDlQTnmRj30zA1bs0dLs0iUtNDywBL5zgrpZFHgpCTiNTLpXk7UJifmST9GrkZEpkU/iz5Mi8dsnczpVkjK0qhJsUfjOTXipCFRjsiCpTnjh2RZksq1tyboUENEoERClUHjnx0tdaQrdLMtdrXgLC1jl8n4zhB8qNHeJyrmclztpBbhm0I7gcHIKCc4f7/hlVlyos74zQtoqEFEqUW+vbzlyRPZ1KDm15f66ZmrFQnYtYzKAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAALRJREFUeF41y1WOBDEMRVGHoZihkRmGef/rartL836iexTDY3EQBPEc/ifSuo7reSq6oXknpEylEBE/UT+xHY+iiPPdiTGG0Cb4ysnkuqIBGDNO2Nkej/ZHKe89gvmTdlpVU3vwBK0xxUtZjkZl+Yv9RpB93mjPBAoyvNGvm+12U9GJg5y+NPv1ev+NfXAwiG4a/YUH2LBEQfqYUfdAssiQtFKOmlYsF3k+c5c+pBqoeA/DIe9NMRA5+kWPaAAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36"
},
{
"label": "Firefox 46.0 - Win10 x64",
"accesskey": "F",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAkFBMVEX///+jLiQtKFJuXGm6gD3ZayfRVSfLTijESyjAPiW5Yzw/frk7gsDafSgxVJZLLEORNC25TS4yOWl0h4tTgaQrRocrUZg3jsw2ltQ6oNtRrN1kst58wOzAyrvm03bqryOaLCOIKSHh1JKtgFz9509uIx5vs9vTfSvpvjaUy+r7yCH94DOWiXI6OV8wO26hxdsVO3lAAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKJJREFUeF5tzUVyA0EMQNFmHmZm2+H73y7qGo8ri/ydXqkk9Kzv0Z+6tu2gtwsqlwM19W04wWwbs01TOzesHgTnAcvyyjn7s+4AHADE2rDMAc6NOw3DsiiycfQguKIF9J1+7iNDSAohTErpFyHs4wEbGoQbk0Qkmt4nD17iiBBipsCglxyxCYIk9oCxVnAH3gsFI7RgrZWUUs/oapkxdKD/+gWY5wrmYyQ9ywAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:46.0) Gecko/20100101 Firefox/46.0"
},
{
"label": "Firefox 46.0 - Linux x86_64",
"accesskey": "F",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAkFBMVEX///+jLiQtKFJuXGm6gD3ZayfRVSfLTijESyjAPiW5Yzw/frk7gsDafSgxVJZLLEORNC25TS4yOWl0h4tTgaQrRocrUZg3jsw2ltQ6oNtRrN1kst58wOzAyrvm03bqryOaLCOIKSHh1JKtgFz9509uIx5vs9vTfSvpvjaUy+r7yCH94DOWiXI6OV8wO26hxdsVO3lAAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKJJREFUeF5tzUVyA0EMQNFmHmZm2+H73y7qGo8ri/ydXqkk9Kzv0Z+6tu2gtwsqlwM19W04wWwbs01TOzesHgTnAcvyyjn7s+4AHADE2rDMAc6NOw3DsiiycfQguKIF9J1+7iNDSAohTErpFyHs4wEbGoQbk0Qkmt4nD17iiBBipsCglxyxCYIk9oCxVnAH3gsFI7RgrZWUUs/oapkxdKD/+gWY5wrmYyQ9ywAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0"
},
{
"label": "IE 11.0 for Desktop - Win10 x64",
"accesskey": "I",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAP1BMVEX///8kfLYsgrk6kcZOn87ttAT72wdnv+jhmQsTbKscdrHNkzKNy9vGuGJ0zfP43h+F2ve64d1ym5zszzQscZeIWNhJAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAI1JREFUeF5NjlkOAzEIQ8NO1lna+5+1JJlK4x94lrFIL6mI/AHv/lkoG7l19X5DSj4Z7PpovU7DnHzzoZWJh1GeAb4OqXMhMwzGFvldZUYl/K6dEQAKDuMwutZ2PlrG4e2k8ijnpNrHwPe/zjZ4OXkGkgigjagHilHW84UiFJqVy0hfQGImDA6J+z7PC3/sBQWkg+0a4QAAAABJRU5ErkJggg==",
"agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
},
{
"label": "Safari Generic - MacOSX",
"accesskey": "S",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAARVBMVEX///9Kj+EzfNF7mbsFmNN6suB2jKO+wMCkzu4XsvBIpfi0QkQUftUHfspsbGysoqppZWV4en1fXWF8fICDdJLBqq18cJczfRzzAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHRJREFUeF5ti0cOxDAQwyyNa0nZ+v+nrmw42EsIXUhA7p4ji+PvuYaq5ctltZSqthzSwRezPICpaAReCobu5e/29B02Hgq+fFrzCmEEKuR0+iuYQkhRvi47icThG7k7YYzbpNPcBORwEm5hnJhkcUazqP8dP3A8BE4FOFjQAAAAAElFTkSuQmCC",
"agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/601.6.17 (KHTML, like Gecko) Version/9.1.1 Safari/601.6.17"
},
{
"label": "[menuseparator]"
},
{
"label": "Google Robot",
"accesskey": "G",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAMFBMVEX////qQzXsSzTwWjP7uQX2uAZNqkk0qFMzqFM1plc9mJI+j8VBhuxChfRChfPpQjX3rgXlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAABlSURBVHheTcixEUZAFADh9Qcu9L8K9KACgRbUIJXdhTKpXAuK0cAzGrgZ1wFvMGOjbxYoRP4AmcitJJLksFFCAn62rabiQf2Bqm4v9EFU2g4gruS+B3TH+QDzBby1AM4wYRrDACdpkiE9frmM1QAAAABJRU5ErkJggg==",
"agent": "Googlebot/2.1 (+http://www.google.com/bot.html)"
},
{
"label": "Bing Robot",
"accesskey": "B",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEVQUFBTUk9qYk2JelOegDSmhS7JnCbsrgv1swT+uQD/uQD+uQF+jgHzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAVklEQVR4Xj3LsQ2AQAwDQJOOjiHga7pvYQpoaVmDBRAjoJd4ZQSmQ5ETXJ1kG+qB1sA5BCSAH/fiKOh3Vh1a4iDkGYk0QWxzzWhWexUgq0G3pER9Cc8HuC1AzN7kl3IAAAAASUVORK5CYII=",
"agent": "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
},
{
"label": "Yahoo! Robot",
"accesskey": "Y",
"image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAaVBMVEX///86AYA9AYpBA4xQBLFSAsE5An44AXpDA5RHBJhJBZxIAp9HAqVLBKlPBqw7AYJQArg8AYf9/f67rdOOac1cBMvc0ero3vTu5vgvAXRfDcSWctQyAXs2AXje0+2UdMqTdcjh1+/j2fH5aTbhAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAALZJREFUeF49jUWOQ0EUxB428+fQwP0POR2NFG9K8sIFmCN8kIyAFImwElfqLnaEnltavlPJ6WsR8RWobbqMm+ptLKpCb7Hp2FX3oZtm/Bf3sa7jPkWajaKq7TyOs91UYp1REWnrGGtrUnyHHsskHUeSufOl+phzSfueSgnRIaDzPgT3erkQgucpiNk5+vkl7xyTAVN7Z36c54OZOxqw1hqs9boMmmqeFuz1nNjJey8LGDx88AH/APVoC3kTBsIDAAAAAElFTkSuQmCC",
"agent": "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
}
]<!--%UserAgents%-->