📄 nssidebar.js
字号:
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * ***** 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.org code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Stephen Lamm <slamm@netscape.com> * Robert John Churchill <rjc@netscape.com> * * Alternatively, the contents of this file may be used under the terms of * either of 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 GPL or the LGPL. 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 ***** *//* * No magic constructor behaviour, as is de rigeur for XPCOM. * If you must perform some initialization, and it could possibly fail (even * due to an out-of-memory condition), you should use an Init method, which * can convey failure appropriately (thrown exception in JS, * NS_FAILED(nsresult) return in C++). * * In JS, you can actually cheat, because a thrown exception will cause the * CreateInstance call to fail in turn, but not all languages are so lucky. * (Though ANSI C++ provides exceptions, they are verboten in Mozilla code * for portability reasons -- and even when you're building completely * platform-specific code, you can't throw across an XPCOM method boundary.) */const DEBUG = false; /* set to false to suppress debug messages */const PANELS_RDF_FILE = "UPnls"; /* directory services property to find panels.rdf */const SIDEBAR_CONTRACTID = "@mozilla.org/sidebar;1";const SIDEBAR_CID = Components.ID("{22117140-9c6e-11d3-aaf1-00805f8a4905}");const CONTAINER_CONTRACTID = "@mozilla.org/rdf/container;1";const DIR_SERV_CONTRACTID = "@mozilla.org/file/directory_service;1"const NETSEARCH_CONTRACTID = "@mozilla.org/rdf/datasource;1?name=internetsearch"const IO_SERV_CONTRACTID = "@mozilla.org/network/io-service;1";const nsISupports = Components.interfaces.nsISupports;const nsIFactory = Components.interfaces.nsIFactory;const nsISidebar = Components.interfaces.nsISidebar;const nsIRDFContainer = Components.interfaces.nsIRDFContainer;const nsIProperties = Components.interfaces.nsIProperties;const nsIFileURL = Components.interfaces.nsIFileURL;const nsIRDFRemoteDataSource = Components.interfaces.nsIRDFRemoteDataSource;const nsIInternetSearchService = Components.interfaces.nsIInternetSearchService;const nsIClassInfo = Components.interfaces.nsIClassInfo;function nsSidebar(){ const RDF_CONTRACTID = "@mozilla.org/rdf/rdf-service;1"; const nsIRDFService = Components.interfaces.nsIRDFService; this.rdf = Components.classes[RDF_CONTRACTID].getService(nsIRDFService); this.datasource_uri = getSidebarDatasourceURI(PANELS_RDF_FILE); debug('datasource_uri is ' + this.datasource_uri); this.resource = 'urn:sidebar:current-panel-list'; this.datasource = this.rdf.GetDataSource(this.datasource_uri); const PROMPTSERVICE_CONTRACTID = "@mozilla.org/embedcomp/prompt-service;1"; const nsIPromptService = Components.interfaces.nsIPromptService; this.promptService = Components.classes[PROMPTSERVICE_CONTRACTID].getService(nsIPromptService);}nsSidebar.prototype.nc = "http://home.netscape.com/NC-rdf#";nsSidebar.prototype.isPanel =function (aContentURL){ var container = Components.classes[CONTAINER_CONTRACTID].createInstance(nsIRDFContainer); container.Init(this.datasource, this.rdf.GetResource(this.resource)); /* Create a resource for the new panel and add it to the list */ var panel_resource = this.rdf.GetResource("urn:sidebar:3rdparty-panel:" + aContentURL); return (container.IndexOf(panel_resource) != -1);}function sidebarURLSecurityCheck(url){ if (!/(^http:|^ftp:|^https:)/i.test(url)) throw "Script attempted to add sidebar panel from illegal source";}/* decorate prototype to provide ``class'' methods and property accessors */nsSidebar.prototype.addPanel =function (aTitle, aContentURL, aCustomizeURL){ debug("addPanel(" + aTitle + ", " + aContentURL + ", " + aCustomizeURL + ")"); return this.addPanelInternal(aTitle, aContentURL, aCustomizeURL, false);}nsSidebar.prototype.addPersistentPanel =function(aTitle, aContentURL, aCustomizeURL){ debug("addPersistentPanel(" + aTitle + ", " + aContentURL + ", " + aCustomizeURL + ")\n"); return this.addPanelInternal(aTitle, aContentURL, aCustomizeURL, true);}nsSidebar.prototype.addPanelInternal =function (aTitle, aContentURL, aCustomizeURL, aPersist){ sidebarURLSecurityCheck(aContentURL); // Create a "container" wrapper around the current panels to // manipulate the RDF:Seq more easily. var panel_list = this.datasource.GetTarget(this.rdf.GetResource(this.resource), this.rdf.GetResource(nsSidebar.prototype.nc+"panel-list"), true); if (panel_list) { panel_list.QueryInterface(Components.interfaces.nsIRDFResource); } else { // Datasource is busted. Start over. debug("Sidebar datasource is busted\n"); } var container = Components.classes[CONTAINER_CONTRACTID].createInstance(nsIRDFContainer); container.Init(this.datasource, panel_list); /* Create a resource for the new panel and add it to the list */ var panel_resource = this.rdf.GetResource("urn:sidebar:3rdparty-panel:" + aContentURL); var panel_index = container.IndexOf(panel_resource); var stringBundle, brandStringBundle, titleMessage, dialogMessage; if (panel_index != -1) { try { stringBundle = srGetStrBundle("chrome://communicator/locale/sidebar/sidebar.properties"); brandStringBundle = srGetStrBundle("chrome://branding/locale/brand.properties"); if (stringBundle) { sidebarName = brandStringBundle.GetStringFromName("sidebarName"); titleMessage = stringBundle.GetStringFromName("dupePanelAlertTitle"); dialogMessage = stringBundle.GetStringFromName("dupePanelAlertMessage"); dialogMessage = dialogMessage.replace(/%url%/, aContentURL); dialogMessage = dialogMessage.replace(/%name%/, sidebarName); } } catch (e) { titleMessage = "Sidebar"; dialogMessage = aContentURL + " already exists in Sidebar. No string bundle"; } this.promptService.alert(null, titleMessage, dialogMessage); return; } try { stringBundle = srGetStrBundle("chrome://communicator/locale/sidebar/sidebar.properties"); brandStringBundle = srGetStrBundle("chrome://branding/locale/brand.properties"); if (stringBundle) { sidebarName = brandStringBundle.GetStringFromName("sidebarName"); titleMessage = stringBundle.GetStringFromName("addPanelConfirmTitle"); dialogMessage = stringBundle.GetStringFromName("addPanelConfirmMessage"); if (aPersist) { var warning = stringBundle.GetStringFromName("persistentPanelWarning"); dialogMessage += "\n" + warning; } dialogMessage = dialogMessage.replace(/%title%/, aTitle); dialogMessage = dialogMessage.replace(/%url%/, aContentURL); dialogMessage = dialogMessage.replace(/#/g, "\n"); dialogMessage = dialogMessage.replace(/%name%/g, sidebarName); } } catch (e) { titleMessage = "Add Tab to Sidebar"; dialogMessage = "No string bundle. Add the Tab '" + aTitle + "' to Sidebar?\n\n" + "Source: " + aContentURL; } var rv = this.promptService.confirm(null, titleMessage, dialogMessage); if (!rv) return; /* Now make some sidebar-ish assertions about it... */ this.datasource.Assert(panel_resource, this.rdf.GetResource(this.nc + "title"), this.rdf.GetLiteral(aTitle), true); this.datasource.Assert(panel_resource, this.rdf.GetResource(this.nc + "content"), this.rdf.GetLiteral(aContentURL), true); if (aCustomizeURL) this.datasource.Assert(panel_resource, this.rdf.GetResource(this.nc + "customize"), this.rdf.GetLiteral(aCustomizeURL), true); var persistValue = aPersist ? "true" : "false"; this.datasource.Assert(panel_resource, this.rdf.GetResource(this.nc + "persist"), this.rdf.GetLiteral(persistValue), true); container.AppendElement(panel_resource); // Use an assertion to pass a "refresh" event to all the sidebars. // They use observers to watch for this assertion (in sidebarOverlay.js). this.datasource.Assert(this.rdf.GetResource(this.resource), this.rdf.GetResource(this.nc + "refresh"),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -