gecko-dev/browser/base/content/searchDialog.js

212 строки
7.6 KiB
JavaScript

#if 0
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Mozilla Search Dialog.
*
* The Initial Developer of the Original Code is
* Gavin Sharp <gavin@gavinsharp.com>.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Pierre Chanial <p_ch@verizon.net>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the LGPL or the GPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#endif
var gDialog = {};
var gSelectedEngineIndex;
const kTabPref = "browser.tabs.opentabfor.searchdialog";
const kEnginePref = "browser.search.selectedEngineInDialog";
const kDefEnginePref = "browser.search.defaultenginename";
const nsIPLS = Components.interfaces.nsIPrefLocalizedString;
const kXUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
function onLoad() {
setTimeout(onAfterLoad, 0);
}
function onAfterLoad() {
gDialog.list = document.getElementById("searchEngineList");
gDialog.list.addEventListener("ValueChange", onEnginesListValueChange, false);
gDialog.input = document.getElementById("searchInput");
gDialog.newtab = document.getElementById("searchInNewTab");
gDialog.searchbundle = document.getElementById("searchbarBundle");
gDialog.browserbundle = document.getElementById("browserBundle");
var el = document.getAnonymousElementByAttribute(gDialog.input, "anonid",
"textbox-input-box");
gDialog.contextmenu = document.getAnonymousElementByAttribute(el,
"anonid", "input-box-contextmenu");
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch2);
var selectedEngine;
var tabChecked = false;
try {
selectedEngine = pref.getComplexValue(kEnginePref, nsIPLS).data;
} catch (ex) {
selectedEngine = pref.getComplexValue(kDefEnginePref, nsIPLS).data;
}
try {
tabChecked = pref.getBoolPref(kTabPref);
} catch (ex) { }
gDialog.newtab.setAttribute("checked", tabChecked);
for (var i=0; i < gDialog.list.menupopup.childNodes.length; i++) {
var label = gDialog.list.menupopup.childNodes[i].getAttribute("label");
if (label == selectedEngine)
gDialog.list.selectedIndex = i;
}
// Make sure we have a selected item
if (gDialog.list.selectedIndex == -1)
gDialog.list.selectedIndex = 0;
gSelectedEngineIndex = gDialog.list.selectedIndex;
// Add "Clear Search History" item to the text box context menu
var sep = document.createElementNS(kXUL_NS, "menuseparator");
gDialog.contextmenu.appendChild(sep);
var element = document.createElementNS(kXUL_NS, "menuitem");
var label = gDialog.searchbundle.getString("cmd_clearHistory");
var accesskey = gDialog.searchbundle.getString("cmd_clearHistory_accesskey");
element.setAttribute("label", label);
element.setAttribute("accesskey", accesskey);
element.setAttribute("cmd", "cmd_clearhistory");
gDialog.contextmenu.appendChild(element);
gDialog.input.controllers.appendController(clearHistoryController);
}
function onEnginesListValueChange() {
if (gDialog.list.value == "addengines") {
var url = gDialog.browserbundle.getString("searchEnginesURL");
window.opener.openNewWindowWith(url, null, false);
gDialog.list.selectedIndex = gSelectedEngineIndex;
} else {
gSelectedEngineIndex = gDialog.list.selectedIndex;
}
}
function updateAddEnginesItem(aAdd) {
// Remove the old item if it exists
var elem = document.getElementById("addenginemenuitem");
var sep = document.getElementById("addenginesep");
if (elem)
gDialog.list.menupopup.removeChild(elem);
if (sep)
gDialog.list.menupopup.removeChild(sep);
if (aAdd) {
// Add "Add Engines" item to the drop down
var sep = document.createElementNS(kXUL_NS, "menuseparator");
sep.setAttribute("id", "addenginesep");
gDialog.list.menupopup.appendChild(sep);
var label = gDialog.searchbundle.getString("cmd_addEngine");
var newItem = gDialog.list.appendItem(label, "addengines");
newItem.setAttribute("id", "addenginemenuitem");
newItem.setAttribute("class", "menuitem-iconic engine-icon");
}
}
function onDialogAccept() {
var searchText = gDialog.input.value;
var engine = gDialog.list.value;
var searchURL;
var searchSvc =
Components.classes["@mozilla.org/rdf/datasource;1?name=internetsearch"]
.getService(Components.interfaces.nsIInternetSearchService);
// XXX Bug 269994: Use dummy string if there is no user entered string
searchURL = searchSvc.GetInternetSearchURL(engine,
searchText ? encodeURIComponent(searchText):"A",
0, 0, {value:0});
if (searchText) {
// Add item to form history
var frmHistSvc = Components.classes["@mozilla.org/satchel/form-history;1"]
.getService(Components.interfaces.nsIFormHistory);
frmHistSvc.addEntry("searchbar-history", searchText);
} else {
try {
// Get the engine's base URL
searchURL = makeURI(searchURL).host;
} catch (ex) {}
}
setPrefs();
gDialog.input.controllers.removeController(clearHistoryController);
window.opener.delayedSearchLoadURL(searchURL, gDialog.newtab.checked);
// Delay closing slightly to avoid timing bug on Linux.
window.close();
return false;
}
function setPrefs() {
var pref = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch2);
var pls = Components.classes["@mozilla.org/pref-localizedstring;1"]
.createInstance(nsIPLS);
var name = gDialog.list.selectedItem.getAttribute("label");
pls.data = name;
pref.setComplexValue(kEnginePref, nsIPLS, pls);
pref.setBoolPref(kTabPref, gDialog.newtab.checked);
}
var clearHistoryController = {
frmHistSvc: Components.classes["@mozilla.org/satchel/form-history;1"]
.getService(Components.interfaces.nsIFormHistory),
autocompleteSearchParam: "searchbar-history",
supportsCommand: function (aCommand) {
return aCommand == "cmd_clearhistory";
},
isCommandEnabled: function (aCommand) {
return this.frmHistSvc.nameExists(this.autocompleteSearchParam);
},
doCommand: function (aCommand) {
this.frmHistSvc.removeEntriesForName(this.autocompleteSearchParam);
gDialog.input.value = "";
}
}