docs: function(){
  			var doc = document;
  			var categories = [];
  			function getCategory(number) {
  				if (!categories[number]) {
  					categories[number] = doc.createDocumentFragment();
  				}
  				return categories[number];
  			}
  			var serviceRegistry = this._serviceRegistry;
  			PageLinks.getPageLinksInfo(serviceRegistry, "orion.page.link.user").then(function(pageLinksInfo) { //$NON-NLS-0$
  				if(this._dropdown) {
  					this._dropdown.empty();
  				} else if(this._dropdownNode) {
  					lib.empty(this._dropdownNode);
  				}
  
  				// Read extension-contributed links
  				var pageLinks = pageLinksInfo.getAllLinks();
  				pageLinks = pageLinks.sort(function(a, b){
  					if (a.order && b.order){
  						return a.order - b.order;
  					}
  					return 0;
  				});
  				pageLinks.forEach(function(item) {
  					var categoryNumber, match;
  					if (item.category && (match = /user\.(\d+)/.exec(item.category))) {
  						categoryNumber = parseInt(match[1], 10);
  					}
  					if (typeof categoryNumber !== "number" || isNaN(categoryNumber)) { //$NON-NLS-0$
  						categoryNumber = 1;
  					}
  					var category = getCategory(categoryNumber);
  
  					var li = doc.createElement("li");//$NON-NLS-0$
  					var link = doc.createElement("a"); //$NON-NLS-0$
  					link.setAttribute("role", "menuitem"); //$NON-NLS-0$ //$NON-NLS-1$
  					if(typeof this._dropDownItemClass === "string") {//$NON-NLS-0$
  						if(this._dropDownItemClass !== "") {
  							link.classList.add(this._dropDownItemClass);
  						}
  					} else {
  						link.classList.add("dropdownMenuItem"); //$NON-NLS-0$
  					}
  					link.href = item.href;
  					if (link.hostname !== "localhost" && util.isElectron) {
  						link.target = "_blank";
  					}
  					link.textContent = item.textContent;
  					li.appendChild(link);
  					category.appendChild(li);
  					link.addEventListener("keydown", function(e) { //$NON-NLS-0$
  						if (e.keyCode === lib.KEY.ENTER || e.keyCode === lib.KEY.SPACE) {	
  							link.click();
  						}
  					}, false);
  				}.bind(this));
  
  				if(this.keyAssistFunction){
  					var element = this._makeMenuItem(messages["Keyboard Shortcuts"], this.keyAssistFunction);
  					if(typeof this._keyAssistClass === "string") {//$NON-NLS-0$
  						if(this._keyAssistClass !== "") {
  							element.classList.add(this._keyAssistClass);
  						}
  					} else {
  						element.classList.add("key-assist-menuitem"); //$NON-NLS-0$
  					}
  					var keyAssist = element.parentNode;
  					getCategory(0).appendChild(keyAssist);
  				}
  
  				if (util.isElectron) {
  					var clearLocalStorage = this._makeMenuItem(messages["Clear Local Storage"], function() { localStorage.clear(); });
  					getCategory(0).appendChild(clearLocalStorage.parentNode);
  					var about = this._makeMenuItem(messages["About"], function() {
  						var newDialog = new dialog.Dialog();
  						newDialog.TEMPLATE =
  							'<div>' +
  								'<div><label id="appVersion">${Version: }<span>' + window.__electron.remote.app.getVersion() + '</span></label></div>' +
  								'<div><label id="buildID">${Build ID: }<span>' + window.__electron.remote.app.buildId + '</span></label></div>' +
  								'<div><label id="updateChannel">${Update Channel: }' + 
  									'<select id="channelOptions"><option id="stable">${Stable}</option><option id="alpha">${Alpha}</option></select>' + 
  								'</label></div>' + 
  								'<div><label id="updateAvailable">${Update available. Download now?}</label></div>' +
  								'<div><label id="updateUnavailable">${No updates available.}</label></div>' +
  								'<div><label id="updateError">${Error occurred while checking for updates.}</label></div>' +
  								'<div><label id="updateDownloading">${Update is downloading in the background.}</label></div>' +
  							'</div>';
  						newDialog.messages = messages;
  						newDialog.title = messages["About"];
  						newDialog.buttons = [
  						{ 
  							text: messages["Download"],
  							callback: function() {
  								var progress = serviceRegistry.getService("orion.page.progress"); //$NON-NLS-0$
  								var progressService = serviceRegistry.getService("orion.page.message");
  								var deferred = progress.progress(this.downloadUpdateOperation(), messages["Downloading"]);
  								progressService.createProgressMonitor(deferred, messages["Downloading"]);
  								deferred.then(function(result) {
  									document.querySelector("#updateDownloading").style.display = updateDownloading;
  									document.querySelector("#updateChannel").style.display = 
  									document.querySelector("#aboutDownloadUpdates").style.display =
  									document.querySelector("#updateAvailable").style.display = "none";
  								}, function(error) {
  									document.querySelector("#updateError").style.display = updateError;
  									document.querySelector("#aboutDownloadUpdates").style.display =
  									document.querySelector("#updateDownloading").style.display =
  									document.querySelector("#updateAvailable").style.display = "none";
  								});
  							}.bind(this),
  							id: "aboutDownloadUpdates" 
  						},
  						{
  							text: messages["Check for Updates"],
  							callback: function() {
  								var	updateChannel = channelOptions.options[channelOptions.selectedIndex].id;
  								var progress = serviceRegistry.getService("orion.page.progress"); //$NON-NLS-0$
  								var progressService = serviceRegistry.getService("orion.page.message");
  								var deferred = progress.progress(this.checkForUpdateOperation('/update/resolveNewVersion?updateChannel=' + updateChannel), messages["Checking for Update"]);
  								progressService.createProgressMonitor(deferred, messages["Checking for Update"]);
  								deferred.then(function(result) {
  										if (result && result.newVersion) {
  											document.querySelector("#aboutDownloadUpdates").style.display = aboutDownloadUpdates;
  											document.querySelector("#updateAvailable").style.display = updateAvailable;
  											document.querySelector("#updateUnavailable").style.display = 
  											document.querySelector("#updateChannel").style.display = 
  											document.querySelector("#aboutResolveNewVersion").style.display = 
  											document.querySelector("#updateError").style.display = "none";
  										} else {
  											document.querySelector("#updateUnavailable").style.display = updateUnavailable;
  										}
  									}, function(error) {
  										document.querySelector("#updateError").style.display = updateError;
  										document.querySelector("#aboutResolveNewVersion").style.display = "none";
  								});
  							}.bind(this),
  							id: "aboutResolveNewVersion"
  						},
  						{
  							text: messages["Close"],
  							callback: function() {
  								newDialog.hide();
  							}, 
  							id: "aboutClose" 
  						}
  						];
  						newDialog.modal = true;
  						newDialog._initialize();
  						var aboutDownloadUpdates = document.querySelector("#aboutDownloadUpdates").style.display;
  						var updateUnavailable = document.querySelector("#updateUnavailable").style.display;
  						var updateAvailable = document.querySelector("#updateAvailable").style.display;
  						var updateError = document.querySelector("#updateError").style.display;
  						var updateDownloading = document.querySelector("#updateDownloading").style.display;
  						var channelOptions = document.getElementById('channelOptions');
  						document.querySelector("#aboutDownloadUpdates").style.display = 
  						document.querySelector("#updateAvailable").style.display = 
  						document.querySelector("#updateUnavailable").style.display = 
  						document.querySelector("#updateError").style.display = 
  						document.querySelector("#updateDownloading").style.display = "none";
  						this.prefsService.get("/updateChannel").then(function(prefs) {
  							channelOptions.selectedIndex = prefs.name && prefs.name === "alpha" ? 1 : 0;
  						});
  						channelOptions.addEventListener("change", function(event){
  							this.prefsService.put("/updateChannel", {
  								name : channelOptions[channelOptions.selectedIndex].id
  							});
  						}.bind(this));
  						newDialog.show();
  					}.bind(this));
  					getCategory(0).appendChild(about.parentNode);
  				}
  
  				// Add categories to _dropdownNode
  				var _self = this;
  				categories.sort(function(a, b) { return a - b; }).forEach(function(category, i) {
  					if (i < categories.length - 1 && !this._noSeparator) {
  						// Add a separator
  						var li = Dropdown.createSeparator();
  						category.appendChild(li);
  					}
  					_self._dropdownNode.appendChild(category);
  				}.bind(this));
  
  				if(this.isSingleService()){
  					//add sign out only for single service.
  					for(var i in this.authenticatedServices){
  						if (this.authenticatedServices.hasOwnProperty(i)) {
  							this._renderAuthenticatedService(i, 0);
  						}
  					}
  				}
  			}.bind(this));
  		}