0,0 → 1,107 |
var SelSearch = { |
init: function() |
{ |
var menu = document.getElementById('contentAreaContextMenu'); |
menu.addEventListener('popupshowing', SelSearch.onPopupShowing, false); |
}, |
|
onPopupShowing: function() |
{ |
try { |
var sel = getBrowserSelection(16); |
|
var submenu = document.getElementById('context-selsearch-submenu'); |
var popup = document.getElementById('context-selsearch-menupopup'); |
if(submenu && popup) { |
while(popup.hasChildNodes()){ |
popup.removeChild(popup.firstChild); |
} |
|
if(sel) { |
if(sel.length > 15) { |
sel = sel.substr(0,15) + "\u2026"; |
} |
|
submenu.hidden = false; |
submenu.label = 'Search "' + sel + '" in'; |
|
var ss = SelSearch.getSearchService(); |
var engines = ss.getVisibleEngines({ }); |
|
if(engines && engines.length > 0) { |
var curEngine; |
|
if(isElementVisible(BrowserSearch.searchBar)) { |
curEngine = ss.currentEngine.name; |
} |
else { |
curEngine = ss.defaultEngine.name; |
} |
|
// show the default engine |
for(var i = 0, l = engines.length; i < l; ++i) { |
if(engines[i].name == curEngine) { |
SelSearch.addMenuItem(popup, i, engines[i].name, engines[i].iconURI, true); |
popup.appendChild(document.createElementNS( |
'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'menuseparator')); |
break; |
} |
} |
// show all |
for(var i = 0, l = engines.length; i < l; ++i) { |
SelSearch.addMenuItem(popup, i, engines[i].name, engines[i].iconURI, engines[i].name == curEngine); |
} |
} |
} |
else { |
submenu.hidden = true; |
submenu.label = 'Search in'; |
} |
} |
} |
catch(ex) { |
alert(ex); |
} |
}, |
|
getSearchService: function() |
{ |
const nsIBSS = Components.interfaces.nsIBrowserSearchService; |
return Components.classes["@mozilla.org/browser/search-service;1"].getService(nsIBSS); |
}, |
|
addMenuItem: function(popup, num, label, iconURI, bold) |
{ |
var e = document.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'menuitem'); |
e.setAttribute('label', label); |
e.setAttribute('oncommand', 'SelSearch.search(' + num + ')'); |
e.setAttribute('class', 'menuitem-iconic'); |
|
if(iconURI) { |
e.style.listStyleImage = "url('" + iconURI.spec + "')"; |
} |
|
if(bold) { |
e.style.fontWeight = 'bold'; |
} |
|
popup.appendChild(e); |
}, |
|
search: function(num) { |
var sel = getBrowserSelection(); |
var ss = SelSearch.getSearchService(); |
var engines = ss.getVisibleEngines({ }); |
|
if(num < 0 || num >= engines.length) return; |
if(!sel) return; |
|
var submission = engines[num].getSubmission(sel, null); // HTML response |
|
if(!submission) return; |
|
getBrowser().loadOneTab(submission.uri.spec, null, null, submission.postData, null, false); |
}, |
}; |
|
window.addEventListener('load', SelSearch.init, false); |