diff options
Diffstat (limited to 'application')
88 files changed, 3442 insertions, 1085 deletions
diff --git a/application/palemoon/app/Makefile.in b/application/palemoon/app/Makefile.in index 580fcb164..6f9bbfaf0 100644 --- a/application/palemoon/app/Makefile.in +++ b/application/palemoon/app/Makefile.in @@ -54,14 +54,6 @@ GARBAGE += $(addprefix $(FINAL_TARGET)/defaults/pref/, palemoon.js) endif -ifdef MOZ_WIDGET_GTK -libs:: - $(INSTALL) $(IFLAGS1) $(DIST)/branding/mozicon128.png $(FINAL_TARGET)/icons - $(INSTALL) $(IFLAGS1) $(DIST)/branding/default16.png $(FINAL_TARGET)/chrome/icons/default - $(INSTALL) $(IFLAGS1) $(DIST)/branding/default32.png $(FINAL_TARGET)/chrome/icons/default - $(INSTALL) $(IFLAGS1) $(DIST)/branding/default48.png $(FINAL_TARGET)/chrome/icons/default -endif - ifndef LIBXUL_SDK # channel-prefs.js is handled separate from other prefs due to bug 756325 libs:: $(srcdir)/profile/channel-prefs.js diff --git a/application/palemoon/base/content/abouthome/aboutHome.js b/application/palemoon/base/content/abouthome/aboutHome.js index 9e826b69e..6a970acd6 100644 --- a/application/palemoon/base/content/abouthome/aboutHome.js +++ b/application/palemoon/base/content/abouthome/aboutHome.js @@ -234,8 +234,8 @@ const SEARCH_ENGINES = { }; // This global tracks if the page has been set up before, to prevent double inits -let gInitialized = false; -let gObserver = new MutationObserver(function (mutations) { +var gInitialized = false; +var gObserver = new MutationObserver(function (mutations) { for (let mutation of mutations) { if (mutation.attributeName == "searchEngineURL") { setupSearchEngine(); diff --git a/application/palemoon/base/content/autocomplete.css b/application/palemoon/base/content/autocomplete.css new file mode 100644 index 000000000..960bdc456 --- /dev/null +++ b/application/palemoon/base/content/autocomplete.css @@ -0,0 +1,17 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); +@namespace html url("http://www.w3.org/1999/xhtml"); + +/* Apply crisp rendering for favicons at exactly 2dppx resolution */ +@media (resolution: 2dppx) { + .ac-site-icon { + image-rendering: -moz-crisp-edges; + } +} + +richlistitem > .ac-title-box > .ac-title > .ac-comment:not([selected]) > html|span.ac-selected-text { + display: none; +} diff --git a/application/palemoon/base/content/autocomplete.xml b/application/palemoon/base/content/autocomplete.xml new file mode 100644 index 000000000..3cb80b19d --- /dev/null +++ b/application/palemoon/base/content/autocomplete.xml @@ -0,0 +1,2122 @@ +<?xml version="1.0"?> +<!-- This Source Code Form is subject to the terms of the Mozilla Public + - License, v. 2.0. If a copy of the MPL was not distributed with this + - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> + +<bindings id="autocompleteBindings" + xmlns="http://www.mozilla.org/xbl" + xmlns:html="http://www.w3.org/1999/xhtml" + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" + xmlns:xbl="http://www.mozilla.org/xbl"> + + <binding id="autocomplete" role="xul:combobox" + extends="chrome://global/content/bindings/textbox.xml#textbox"> + <resources> + <stylesheet src="chrome://browser/content/autocomplete.css"/> + <stylesheet src="chrome://browser/skin/autocomplete.css"/> + </resources> + + <content sizetopopup="pref"> + <xul:hbox class="autocomplete-textbox-container" flex="1" xbl:inherits="focused"> + <children includes="image|deck|stack|box"> + <xul:image class="autocomplete-icon" allowevents="true"/> + </children> + + <xul:hbox anonid="textbox-input-box" class="textbox-input-box" flex="1" xbl:inherits="tooltiptext=inputtooltiptext"> + <children/> + <html:input anonid="input" class="autocomplete-textbox textbox-input" + allowevents="true" + xbl:inherits="tooltiptext=inputtooltiptext,value,type=inputtype,maxlength,disabled,size,readonly,placeholder,tabindex,accesskey,mozactionhint"/> + </xul:hbox> + <children includes="hbox"/> + </xul:hbox> + + <xul:dropmarker anonid="historydropmarker" class="autocomplete-history-dropmarker" + allowevents="true" + xbl:inherits="open,enablehistory,parentfocused=focused"/> + + <xul:popupset anonid="popupset" class="autocomplete-result-popupset"/> + + <children includes="toolbarbutton"/> + </content> + + <implementation implements="nsIAutoCompleteInput, nsIDOMXULMenuListElement"> + <field name="mController">null</field> + <field name="mSearchNames">null</field> + <field name="mIgnoreInput">false</field> + <field name="mEnterEvent">null</field> + + <field name="_searchBeginHandler">null</field> + <field name="_searchCompleteHandler">null</field> + <field name="_textEnteredHandler">null</field> + <field name="_textRevertedHandler">null</field> + + <constructor><![CDATA[ + this.mController = Components.classes["@mozilla.org/autocomplete/controller;1"]. + getService(Components.interfaces.nsIAutoCompleteController); + + this._searchBeginHandler = this.initEventHandler("searchbegin"); + this._searchCompleteHandler = this.initEventHandler("searchcomplete"); + this._textEnteredHandler = this.initEventHandler("textentered"); + this._textRevertedHandler = this.initEventHandler("textreverted"); + + // For security reasons delay searches on pasted values. + this.inputField.controllers.insertControllerAt(0, this._pasteController); + ]]></constructor> + + <destructor><![CDATA[ + this.inputField.controllers.removeController(this._pasteController); + ]]></destructor> + + <!-- =================== nsIAutoCompleteInput =================== --> + + <field name="popup"><![CDATA[ + // Wrap in a block so that the let statements don't + // create properties on 'this' (bug 635252). + { + let popup = null; + let popupId = this.getAttribute("autocompletepopup"); + if (popupId) + popup = document.getElementById(popupId); + if (!popup) { + popup = document.createElement("panel"); + popup.setAttribute("type", "autocomplete"); + popup.setAttribute("noautofocus", "true"); + + let popupset = document.getAnonymousElementByAttribute(this, "anonid", "popupset"); + popupset.appendChild(popup); + } + popup.mInput = this; + popup; + } + ]]></field> + + <property name="controller" onget="return this.mController;" readonly="true"/> + + <property name="popupOpen" + onget="return this.popup.popupOpen;" + onset="if (val) this.openPopup(); else this.closePopup();"/> + + <property name="disableAutoComplete" + onset="this.setAttribute('disableautocomplete', val); return val;" + onget="return this.getAttribute('disableautocomplete') == 'true';"/> + + <property name="completeDefaultIndex" + onset="this.setAttribute('completedefaultindex', val); return val;" + onget="return this.getAttribute('completedefaultindex') == 'true';"/> + + <property name="completeSelectedIndex" + onset="this.setAttribute('completeselectedindex', val); return val;" + onget="return this.getAttribute('completeselectedindex') == 'true';"/> + + <property name="forceComplete" + onset="this.setAttribute('forcecomplete', val); return val;" + onget="return this.getAttribute('forcecomplete') == 'true';"/> + + <property name="minResultsForPopup" + onset="this.setAttribute('minresultsforpopup', val); return val;" + onget="var m = parseInt(this.getAttribute('minresultsforpopup')); return isNaN(m) ? 1 : m;"/> + + <property name="showCommentColumn" + onset="this.setAttribute('showcommentcolumn', val); return val;" + onget="return this.getAttribute('showcommentcolumn') == 'true';"/> + + <property name="showImageColumn" + onset="this.setAttribute('showimagecolumn', val); return val;" + onget="return this.getAttribute('showimagecolumn') == 'true';"/> + + <property name="timeout" + onset="this.setAttribute('timeout', val); return val;"> + <getter><![CDATA[ + // For security reasons delay searches on pasted values. + if (this._valueIsPasted) { + let t = parseInt(this.getAttribute('pastetimeout')); + return isNaN(t) ? 1000 : t; + } + + let t = parseInt(this.getAttribute('timeout')); + return isNaN(t) ? 50 : t; + ]]></getter> + </property> + + <property name="searchParam" + onget="return this.getAttribute('autocompletesearchparam') || '';" + onset="this.setAttribute('autocompletesearchparam', val); return val;"/> + + <property name="searchCount" readonly="true" + onget="this.initSearchNames(); return this.mSearchNames.length;"/> + + <field name="shrinkDelay" readonly="true"> + parseInt(this.getAttribute("shrinkdelay")) || 0 + </field> + + <field name="PrivateBrowsingUtils" readonly="true"> + { + let utils = {}; + Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm", utils); + utils.PrivateBrowsingUtils + } + </field> + + <property name="inPrivateContext" readonly="true" + onget="return this.PrivateBrowsingUtils.isWindowPrivate(window);"/> + + <property name="noRollupOnCaretMove" readonly="true" + onget="return this.popup.getAttribute('norolluponanchor') == 'true'"/> + + <!-- This is the maximum number of drop-down rows we get when we + hit the drop marker beside fields that have it (like the URLbar).--> + <field name="maxDropMarkerRows" readonly="true">14</field> + + <method name="getSearchAt"> + <parameter name="aIndex"/> + <body><![CDATA[ + this.initSearchNames(); + return this.mSearchNames[aIndex]; + ]]></body> + </method> + + <property name="textValue" + onget="return this.value;"> + <setter><![CDATA[ + // Completing a result should simulate the user typing the result, + // so fire an input event. + // Trim popup selected values, but never trim results coming from + // autofill. + if (this.popup.selectedIndex == -1) + this._disableTrim = true; + this.value = val; + this._disableTrim = false; + + var evt = document.createEvent("UIEvents"); + evt.initUIEvent("input", true, false, window, 0); + this.mIgnoreInput = true; + this.dispatchEvent(evt); + this.mIgnoreInput = false; + return this.value; + ]]></setter> + </property> + + <method name="selectTextRange"> + <parameter name="aStartIndex"/> + <parameter name="aEndIndex"/> + <body><![CDATA[ + this.inputField.setSelectionRange(aStartIndex, aEndIndex); + ]]></body> + </method> + + <method name="onSearchBegin"> + <body><![CDATA[ + if (this.popup && typeof this.popup.onSearchBegin == "function") + this.popup.onSearchBegin(); + if (this._searchBeginHandler) + this._searchBeginHandler(); + ]]></body> + </method> + + <method name="onSearchComplete"> + <body><![CDATA[ + if (this.mController.matchCount == 0) + this.setAttribute("nomatch", "true"); + else + this.removeAttribute("nomatch"); + + if (this.ignoreBlurWhileSearching && !this.focused) { + this.handleEnter(); + this.detachController(); + } + + if (this._searchCompleteHandler) + this._searchCompleteHandler(); + ]]></body> + </method> + + <method name="onTextEntered"> + <body><![CDATA[ + let rv = false; + if (this._textEnteredHandler) + rv = this._textEnteredHandler(this.mEnterEvent); + this.mEnterEvent = null; + return rv; + ]]></body> + </method> + + <method name="onTextReverted"> + <body><![CDATA[ + if (this._textRevertedHandler) + return this._textRevertedHandler(); + return false; + ]]></body> + </method> + + <!-- =================== nsIDOMXULMenuListElement =================== --> + + <property name="editable" readonly="true" + onget="return true;" /> + + <property name="crop" + onset="this.setAttribute('crop',val); return val;" + onget="return this.getAttribute('crop');"/> + + <property name="open" + onget="return this.getAttribute('open') == 'true';"> + <setter><![CDATA[ + if (val) + this.showHistoryPopup(); + else + this.closePopup(); + ]]></setter> + </property> + + <!-- =================== PUBLIC MEMBERS =================== --> + + <field name="valueIsTyped">false</field> + <field name="_disableTrim">false</field> + <property name="value"> + <getter><![CDATA[ + if (typeof this.onBeforeValueGet == "function") { + var result = this.onBeforeValueGet(); + if (result) + return result.value; + } + return this.inputField.value; + ]]></getter> + <setter><![CDATA[ + this.mIgnoreInput = true; + + if (typeof this.onBeforeValueSet == "function") + val = this.onBeforeValueSet(val); + + if (typeof this.trimValue == "function" && !this._disableTrim) + val = this.trimValue(val); + + this.valueIsTyped = false; + this.inputField.value = val; + + if (typeof this.formatValue == "function") + this.formatValue(); + + this.mIgnoreInput = false; + var event = document.createEvent('Events'); + event.initEvent('ValueChange', true, true); + this.inputField.dispatchEvent(event); + return val; + ]]></setter> + </property> + + <property name="focused" readonly="true" + onget="return this.getAttribute('focused') == 'true';"/> + + <!-- maximum number of rows to display at a time --> + <property name="maxRows" + onset="this.setAttribute('maxrows', val); return val;" + onget="return parseInt(this.getAttribute('maxrows')) || 0;"/> + + <!-- option to allow scrolling through the list via the tab key, rather than + tab moving focus out of the textbox --> + <property name="tabScrolling" + onset="this.setAttribute('tabscrolling', val); return val;" + onget="return this.getAttribute('tabscrolling') == 'true';"/> + + <!-- option to completely ignore any blur events while searches are + still going on. --> + <property name="ignoreBlurWhileSearching" + onset="this.setAttribute('ignoreblurwhilesearching', val); return val;" + onget="return this.getAttribute('ignoreblurwhilesearching') == 'true';"/> + + <!-- disable key navigation handling in the popup results --> + <property name="disableKeyNavigation" + onset="this.setAttribute('disablekeynavigation', val); return val;" + onget="return this.getAttribute('disablekeynavigation') == 'true';"/> + + <!-- option to highlight entries that don't have any matches --> + <property name="highlightNonMatches" + onset="this.setAttribute('highlightnonmatches', val); return val;" + onget="return this.getAttribute('highlightnonmatches') == 'true';"/> + + <!-- =================== PRIVATE MEMBERS =================== --> + + <!-- ::::::::::::: autocomplete controller ::::::::::::: --> + + <method name="attachController"> + <body><![CDATA[ + this.mController.input = this; + ]]></body> + </method> + + <method name="detachController"> + <body><![CDATA[ + if (this.mController.input == this) + this.mController.input = null; + ]]></body> + </method> + + <!-- ::::::::::::: popup opening ::::::::::::: --> + + <method name="openPopup"> + <body><![CDATA[ + if (this.focused) + this.popup.openAutocompletePopup(this, this); + ]]></body> + </method> + + <method name="closePopup"> + <body><![CDATA[ + this.popup.closePopup(); + ]]></body> + </method> + + <method name="showHistoryPopup"> + <body><![CDATA[ + // history dropmarker pushed state + function cleanup(popup) { + popup.removeEventListener("popupshowing", onShow, false); + } + function onShow(event) { + var popup = event.target, input = popup.input; + cleanup(popup); + input.setAttribute("open", "true"); + function onHide() { + input.removeAttribute("open"); + popup.removeEventListener("popuphiding", onHide, false); + } + popup.addEventListener("popuphiding", onHide, false); + } + this.popup.addEventListener("popupshowing", onShow, false); + setTimeout(cleanup, 1000, this.popup); + + // Store our "normal" maxRows on the popup, so that it can reset the + // value when the popup is hidden. + this.popup._normalMaxRows = this.maxRows; + + // Increase our maxRows temporarily, since we want the dropdown to + // be bigger in this case. The popup's popupshowing/popuphiding + // handlers will take care of resetting this. + this.maxRows = this.maxDropMarkerRows; + + // Ensure that we have focus. + if (!this.focused) + this.focus(); + this.attachController(); + this.mController.startSearch(""); + ]]></body> + </method> + + <method name="toggleHistoryPopup"> + <body><![CDATA[ + if (!this.popup.popupOpen) + this.showHistoryPopup(); + else + this.closePopup(); + ]]></body> + </method> + + <!-- ::::::::::::: event dispatching ::::::::::::: --> + + <method name="initEventHandler"> + <parameter name="aEventType"/> + <body><![CDATA[ + let handlerString = this.getAttribute("on" + aEventType); + if (handlerString) { + return (new Function("eventType", "param", handlerString)).bind(this, aEventType); + } + return null; + ]]></body> + </method> + + <!-- ::::::::::::: key handling ::::::::::::: --> + + <field name="_selectionDetails">null</field> + <method name="onKeyPress"> + <parameter name="aEvent"/> + <body><![CDATA[ + return this.handleKeyPress(aEvent); + ]]></body> + </method> + + <method name="handleKeyPress"> + <parameter name="aEvent"/> + <body><![CDATA[ + if (aEvent.target.localName != "textbox") + return true; // Let child buttons of autocomplete take input + + //XXXpch this is so bogus... + if (aEvent.defaultPrevented) + return false; + + var cancel = false; + + let { AppConstants } = + Components.utils.import("resource://gre/modules/AppConstants.jsm", {}); + // Catch any keys that could potentially move the caret. Ctrl can be + // used in combination with these keys on Windows and Linux; and Alt + // can be used on OS X, so make sure the unused one isn't used. + let metaKey = AppConstants.platform == "macosx" ? aEvent.ctrlKey : aEvent.altKey; + if (!this.disableKeyNavigation && !metaKey) { + switch (aEvent.keyCode) { + case KeyEvent.DOM_VK_LEFT: + case KeyEvent.DOM_VK_RIGHT: + case KeyEvent.DOM_VK_HOME: + cancel = this.mController.handleKeyNavigation(aEvent.keyCode); + break; + } + } + + // Handle keys that are not part of a keyboard shortcut (no Ctrl or Alt) + if (!this.disableKeyNavigation && !aEvent.ctrlKey && !aEvent.altKey) { + switch (aEvent.keyCode) { + case KeyEvent.DOM_VK_TAB: + if (this.tabScrolling && this.popup.popupOpen) + cancel = this.mController.handleKeyNavigation(aEvent.shiftKey ? + KeyEvent.DOM_VK_UP : + KeyEvent.DOM_VK_DOWN); + else if (this.forceComplete && this.mController.matchCount >= 1) + this.mController.handleTab(); + break; + case KeyEvent.DOM_VK_UP: + case KeyEvent.DOM_VK_DOWN: + case KeyEvent.DOM_VK_PAGE_UP: + case KeyEvent.DOM_VK_PAGE_DOWN: + cancel = this.mController.handleKeyNavigation(aEvent.keyCode); + break; + } + } + + // Handle keys we know aren't part of a shortcut, even with Alt or + // Ctrl. + switch (aEvent.keyCode) { + case KeyEvent.DOM_VK_ESCAPE: + cancel = this.mController.handleEscape(); + break; + case KeyEvent.DOM_VK_RETURN: + if (AppConstants.platform == "macosx") { + // Prevent the default action, since it will beep on Mac + if (aEvent.metaKey) + aEvent.preventDefault(); + } + this.mEnterEvent = aEvent; + if (this.mController.selection) { + this._selectionDetails = { + index: this.mController.selection.currentIndex, + kind: "key" + }; + } + cancel = this.handleEnter(); + break; + case KeyEvent.DOM_VK_DELETE: + if (AppConstants.platform == "macosx" && !aEvent.shiftKey) { + break; + } + cancel = this.handleDelete(); + break; + case KeyEvent.DOM_VK_BACK_SPACE: + if (AppConstants.platform == "macosx" && aEvent.shiftKey) { + cancel = this.handleDelete(); + } + break; + case KeyEvent.DOM_VK_DOWN: + case KeyEvent.DOM_VK_UP: + if (aEvent.altKey) + this.toggleHistoryPopup(); + break; + case KeyEvent.DOM_VK_F4: + if (AppConstants.platform != "macosx") { + this.toggleHistoryPopup(); + } + break; + } + + if (cancel) { + aEvent.stopPropagation(); + aEvent.preventDefault(); + } + + return true; + ]]></body> + </method> + + <method name="handleEnter"> + <body><![CDATA[ + return this.mController.handleEnter(false); + ]]></body> + </method> + + <method name="handleDelete"> + <body><![CDATA[ + return this.mController.handleDelete(); + ]]></body> + </method> + + <!-- ::::::::::::: miscellaneous ::::::::::::: --> + + <method name="initSearchNames"> + <body><![CDATA[ + if (!this.mSearchNames) { + var names = this.getAttribute("autocompletesearch"); + if (!names) + this.mSearchNames = []; + else + this.mSearchNames = names.split(" "); + } + ]]></body> + </method> + + <method name="_focus"> + <!-- doesn't reset this.mController --> + <body><![CDATA[ + this._dontBlur = true; + this.focus(); + this._dontBlur = false; + ]]></body> + </method> + + <method name="resetActionType"> + <body><![CDATA[ + if (this.mIgnoreInput) + return; + this.removeAttribute("actiontype"); + ]]></body> + </method> + + <field name="_valueIsPasted">false</field> + <field name="_pasteController"><![CDATA[ + ({ + _autocomplete: this, + _kGlobalClipboard: Components.interfaces.nsIClipboard.kGlobalClipboard, + supportsCommand: aCommand => aCommand == "cmd_paste", + doCommand: function(aCommand) { + this._autocomplete._valueIsPasted = true; + this._autocomplete.editor.paste(this._kGlobalClipboard); + this._autocomplete._valueIsPasted = false; + }, + isCommandEnabled: function(aCommand) { + return this._autocomplete.editor.isSelectionEditable && + this._autocomplete.editor.canPaste(this._kGlobalClipboard); + }, + onEvent: function() {} + }) + ]]></field> + + <method name="onInput"> + <parameter name="aEvent"/> + <body><![CDATA[ + if (!this.mIgnoreInput && this.mController.input == this) { + this.valueIsTyped = true; + this.mController.handleText(); + } + this.resetActionType(); + ]]></body> + </method> + </implementation> + + <handlers> + <handler event="input"><![CDATA[ + this.onInput(event); + ]]></handler> + + <handler event="keypress" phase="capturing" + action="return this.onKeyPress(event);"/> + + <handler event="compositionstart" phase="capturing" + action="if (this.mController.input == this) this.mController.handleStartComposition();"/> + + <handler event="compositionend" phase="capturing" + action="if (this.mController.input == this) this.mController.handleEndComposition();"/> + + <handler event="focus" phase="capturing" + action="this.attachController();"/> + + <handler event="blur" phase="capturing"><![CDATA[ + if (!this._dontBlur) { + if (this.forceComplete && this.mController.matchCount >= 1) { + // mousemove sets selected index. Don't blindly use that selected + // index in this blur handler since if the popup is open you can + // easily "select" another match just by moving the mouse over it. + let filledVal = this.value.replace(/.+ >> /, "").toLowerCase(); + let selectedVal = null; + if (this.popup.selectedIndex >= 0) { + selectedVal = this.mController.getFinalCompleteValueAt( + this.popup.selectedIndex); + } + if (selectedVal && filledVal != selectedVal.toLowerCase()) { + for (let i = 0; i < this.mController.matchCount; i++) { + let matchVal = this.mController.getFinalCompleteValueAt(i); + if (matchVal.toLowerCase() == filledVal) { + this.popup.selectedIndex = i; + break; + } + } + } + this.mController.handleEnter(false); + } + if (!this.ignoreBlurWhileSearching) + this.detachController(); + } + ]]></handler> + </handlers> + </binding> + + <binding id="autocomplete-result-popup" extends="chrome://browser/content/autocomplete.xml#autocomplete-base-popup"> + <resources> + <stylesheet src="chrome://browser/content/autocomplete.css"/> + <stylesheet src="chrome://global/skin/tree.css"/> + <stylesheet src="chrome://browser/skin/autocomplete.css"/> + </resources> + + <content ignorekeys="true" level="top" consumeoutsideclicks="never"> + <xul:tree anonid="tree" class="autocomplete-tree plain" hidecolumnpicker="true" flex="1" seltype="single"> + <xul:treecols anonid="treecols"> + <xul:treecol id="treecolAutoCompleteValue" class="autocomplete-treecol" flex="1" overflow="true"/> + </xul:treecols> + <xul:treechildren class="autocomplete-treebody"/> + </xul:tree> + </content> + + <implementation> + <field name="mShowCommentColumn">false</field> + <field name="mShowImageColumn">false</field> + + <property name="showCommentColumn" + onget="return this.mShowCommentColumn;"> + <setter> + <![CDATA[ + if (!val && this.mShowCommentColumn) { + // reset the flex on the value column and remove the comment column + document.getElementById("treecolAutoCompleteValue").setAttribute("flex", 1); + this.removeColumn("treecolAutoCompleteComment"); + } else if (val && !this.mShowCommentColumn) { + // reset the flex on the value column and add the comment column + document.getElementById("treecolAutoCompleteValue").setAttribute("flex", 2); + this.addColumn({id: "treecolAutoCompleteComment", flex: 1}); + } + this.mShowCommentColumn = val; + return val; + ]]> + </setter> + </property> + + <property name="showImageColumn" + onget="return this.mShowImageColumn;"> + <setter> + <![CDATA[ + if (!val && this.mShowImageColumn) { + // remove the image column + this.removeColumn("treecolAutoCompleteImage"); + } else if (val && !this.mShowImageColumn) { + // add the image column + this.addColumn({id: "treecolAutoCompleteImage", flex: 1}); + } + this.mShowImageColumn = val; + return val; + ]]> + </setter> + </property> + + + <method name="addColumn"> + <parameter name="aAttrs"/> + <body> + <![CDATA[ + var col = document.createElement("treecol"); + col.setAttribute("class", "autocomplete-treecol"); + for (var name in aAttrs) + col.setAttribute(name, aAttrs[name]); + this.treecols.appendChild(col); + return col; + ]]> + </body> + </method> + + <method name="removeColumn"> + <parameter name="aColId"/> + <body> + <![CDATA[ + return this.treecols.removeChild(document.getElementById(aColId)); + ]]> + </body> + </method> + + <property name="selectedIndex" + onget="return this.tree.currentIndex;"> + <setter> + <![CDATA[ + this.tree.view.selection.select(val); + if (this.tree.treeBoxObject.height > 0) + this.tree.treeBoxObject.ensureRowIsVisible(val < 0 ? 0 : val); + // Fire select event on xul:tree so that accessibility API + // support layer can fire appropriate accessibility events. + var event = document.createEvent('Events'); + event.initEvent("select", true, true); + this.tree.dispatchEvent(event); + return val; + ]]></setter> + </property> + + <method name="adjustHeight"> + <body> + <![CDATA[ + // detect the desired height of the tree + var bx = this.tree.treeBoxObject; + var view = this.tree.view; + if (!view) + return; + var rows = this.maxRows; + if (!view.rowCount || (rows && view.rowCount < rows)) + rows = view.rowCount; + + var height = rows * bx.rowHeight; + + if (height == 0) { + this.tree.setAttribute("collapsed", "true"); + } else { + if (this.tree.hasAttribute("collapsed")) + this.tree.removeAttribute("collapsed"); + + this.tree.setAttribute("height", height); + } + this.tree.setAttribute("hidescrollbar", view.rowCount <= rows); + ]]> + </body> + </method> + + <method name="openAutocompletePopup"> + <parameter name="aInput"/> + <parameter name="aElement"/> + <body><![CDATA[ + // until we have "baseBinding", (see bug #373652) this allows + // us to override openAutocompletePopup(), but still call + // the method on the base class + this._openAutocompletePopup(aInput, aElement); + ]]></body> + </method> + + <method name="_openAutocompletePopup"> + <parameter name="aInput"/> + <parameter name="aElement"/> + <body><![CDATA[ + if (!this.mPopupOpen) { + this.mInput = aInput; + this.view = aInput.controller.QueryInterface(Components.interfaces.nsITreeView); + this.invalidate(); + + this.showCommentColumn = this.mInput.showCommentColumn; + this.showImageColumn = this.mInput.showImageColumn; + + var rect = aElement.getBoundingClientRect(); + var nav = aElement.ownerDocument.defaultView.QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebNavigation); + var docShell = nav.QueryInterface(Components.interfaces.nsIDocShell); + var docViewer = docShell.contentViewer; + var width = (rect.right - rect.left) * docViewer.fullZoom; + this.setAttribute("width", width > 100 ? width : 100); + + // Adjust the direction of the autocomplete popup list based on the textbox direction, bug 649840 + var popupDirection = aElement.ownerDocument.defaultView.getComputedStyle(aElement).direction; + this.style.direction = popupDirection; + + this.openPopup(aElement, "after_start", 0, 0, false, false); + } + ]]></body> + </method> + + <method name="invalidate"> + <body><![CDATA[ + this.adjustHeight(); + this.tree.treeBoxObject.invalidate(); + ]]></body> + </method> + + <method name="selectBy"> + <parameter name="aReverse"/> + <parameter name="aPage"/> + <body><![CDATA[ + try { + var amount = aPage ? 5 : 1; + this.selectedIndex = this.getNextIndex(aReverse, amount, this.selectedIndex, this.tree.view.rowCount-1); + if (this.selectedIndex == -1) { + this.input._focus(); + } + } catch (ex) { + // do nothing - occasionally timer-related js errors happen here + // e.g. "this.selectedIndex has no properties", when you type fast and hit a + // navigation key before this popup has opened + } + ]]></body> + </method> + + <!-- =================== PUBLIC MEMBERS =================== --> + + <field name="tree"> + document.getAnonymousElementByAttribute(this, "anonid", "tree"); + </field> + + <field name="treecols"> + document.getAnonymousElementByAttribute(this, "anonid", "treecols"); + </field> + + <property name="view" + onget="return this.mView;"> + <setter><![CDATA[ + // We must do this by hand because the tree binding may not be ready yet + this.mView = val; + this.tree.boxObject.view = val; + ]]></setter> + </property> + + </implementation> + </binding> + + <binding id="autocomplete-base-popup" role="none" +extends="chrome://global/content/bindings/popup.xml#popup"> + <implementation implements="nsIAutoCompletePopup"> + <field name="mInput">null</field> + <field name="mPopupOpen">false</field> + + <!-- =================== nsIAutoCompletePopup =================== --> + + <property name="input" readonly="true" + onget="return this.mInput"/> + + <property name="overrideValue" readonly="true" + onget="return null;"/> + + <property name="popupOpen" readonly="true" + onget="return this.mPopupOpen;"/> + + <method name="closePopup"> + <body> + <![CDATA[ + if (this.mPopupOpen) { + this.hidePopup(); + this.removeAttribute("width"); + } + ]]> + </body> + </method> + + <!-- This is the default number of rows that we give the autocomplete + popup when the textbox doesn't have a "maxrows" attribute + for us to use. --> + <field name="defaultMaxRows" readonly="true">6</field> + + <!-- In some cases (e.g. when the input's dropmarker button is clicked), + the input wants to display a popup with more rows. In that case, it + should increase its maxRows property and store the "normal" maxRows + in this field. When the popup is hidden, we restore the input's + maxRows to the value stored in this field. + + This field is set to -1 between uses so that we can tell when it's + been set by the input and when we need to set it in the popupshowing + handler. --> + <field name="_normalMaxRows">-1</field> + + <property name="maxRows" readonly="true"> + <getter> + <![CDATA[ + return (this.mInput && this.mInput.maxRows) || this.defaultMaxRows; + ]]> + </getter> + </property> + + <method name="getNextIndex"> + <parameter name="aReverse"/> + <parameter name="aAmount"/> + <parameter name="aIndex"/> + <parameter name="aMaxRow"/> + <body><![CDATA[ + if (aMaxRow < 0) + return -1; + + var newIdx = aIndex + (aReverse?-1:1)*aAmount; + if (aReverse && aIndex == -1 || newIdx > aMaxRow && aIndex != aMaxRow) + newIdx = aMaxRow; + else if (!aReverse && aIndex == -1 || newIdx < 0 && aIndex != 0) + newIdx = 0; + + if (newIdx < 0 && aIndex == 0 || newIdx > aMaxRow && aIndex == aMaxRow) + aIndex = -1; + else + aIndex = newIdx; + + return aIndex; + ]]></body> + </method> + + <method name="onPopupClick"> + <parameter name="aEvent"/> + <body><![CDATA[ + var controller = this.view.QueryInterface(Components.interfaces.nsIAutoCompleteController); + controller.handleEnter(true); + ]]></body> + </method> + </implementation> + + <handlers> + <handler event="popupshowing"><![CDATA[ + // If normalMaxRows wasn't already set by the input, then set it here + // so that we restore the correct number when the popup is hidden. + + // Null-check this.mInput; see bug 1017914 + if (this._normalMaxRows < 0 && this.mInput) { + this._normalMaxRows = this.mInput.maxRows; + } + + // Set an attribute for styling the popup based on the input. + let inputID = ""; + if (this.mInput && this.mInput.ownerDocument && + this.mInput.ownerDocument.documentURIObject.schemeIs("chrome")) { + inputID = this.mInput.id; + // Take care of elements with no id that are inside xbl bindings + if (!inputID) { + let bindingParent = this.mInput.ownerDocument.getBindingParent(this.mInput); + if (bindingParent) { + inputID = bindingParent.id; + } + } + } + this.setAttribute("autocompleteinput", inputID); + + this.mPopupOpen = true; + ]]></handler> + + <handler event="popuphiding"><![CDATA[ + var isListActive = true; + if (this.selectedIndex == -1) + isListActive = false; + var controller = this.view.QueryInterface(Components.interfaces.nsIAutoCompleteController); + controller.stopSearch(); + + this.removeAttribute("autocompleteinput"); + this.mPopupOpen = false; + + // Reset the maxRows property to the cached "normal" value, and reset + // _normalMaxRows so that we can detect whether it was set by the input + // when the popupshowing handler runs. + + // Null-check this.mInput; see bug 1017914 + if (this.mInput) + this.mInput.maxRows = this._normalMaxRows; + this._normalMaxRows = -1; + // If the list was being navigated and then closed, make sure + // we fire accessible focus event back to textbox + + // Null-check this.mInput; see bug 1017914 + if (isListActive && this.mInput) { + this.mInput.mIgnoreFocus = true; + this.mInput._focus(); + this.mInput.mIgnoreFocus = false; + } + ]]></handler> + </handlers> + </binding> + + <binding id="autocomplete-rich-result-popup" extends="chrome://browser/content/autocomplete.xml#autocomplete-base-popup"> + <resources> + <stylesheet src="chrome://browser/content/autocomplete.css"/> + <stylesheet src="chrome://browser/skin/autocomplete.css"/> + </resources> + + <content ignorekeys="true" level="top" consumeoutsideclicks="never"> + <xul:richlistbox anonid="richlistbox" class="autocomplete-richlistbox" flex="1"/> + <xul:hbox> + <children/> + </xul:hbox> + </content> + + <implementation implements="nsIAutoCompletePopup"> + <field name="_currentIndex">0</field> + <field name="_rowHeight">0</field> + <field name="_rlbAnimated">false</field> + + <!-- =================== nsIAutoCompletePopup =================== --> + + <property name="selectedIndex" + onget="return this.richlistbox.selectedIndex;"> + <setter> + <![CDATA[ + this.richlistbox.selectedIndex = val; + + // when clearing the selection (val == -1, so selectedItem will be + // null), we want to scroll back to the top. see bug #406194 + this.richlistbox.ensureElementIsVisible( + this.richlistbox.selectedItem || this.richlistbox.firstChild); + + return val; + ]]> + </setter> + </property> + + <method name="onSearchBegin"> + <body><![CDATA[ + this.richlistbox.mouseSelectedIndex = -1; + ]]></body> + </method> + + <method name="openAutocompletePopup"> + <parameter name="aInput"/> + <parameter name="aElement"/> + <body> + <![CDATA[ + // until we have "baseBinding", (see bug #373652) this allows + // us to override openAutocompletePopup(), but still call + // the method on the base class + this._openAutocompletePopup(aInput, aElement); + ]]> + </body> + </method> + + <method name="_openAutocompletePopup"> + <parameter name="aInput"/> + <parameter name="aElement"/> + <body> + <![CDATA[ + if (!this.mPopupOpen) { + this.mInput = aInput; + // clear any previous selection, see bugs 400671 and 488357 + this.selectedIndex = -1; + + var width = aElement.getBoundingClientRect().width; + this.setAttribute("width", width > 100 ? width : 100); + // invalidate() depends on the width attribute + this._invalidate(); + + this.openPopup(aElement, "after_start", 0, 0, false, false); + } + ]]> + </body> + </method> + + <method name="invalidate"> + <parameter name="reason"/> + <body> + <![CDATA[ + // Don't bother doing work if we're not even showing + if (!this.mPopupOpen) + return; + + this._invalidate(reason); + ]]> + </body> + </method> + + <method name="_invalidate"> + <parameter name="reason"/> + <body> + <![CDATA[ + // collapsed if no matches + this.richlistbox.collapsed = (this._matchCount == 0); + + // Update the richlistbox height. + if (this._adjustHeightTimeout) { + clearTimeout(this._adjustHeightTimeout); + } + if (this._shrinkTimeout) { + clearTimeout(this._shrinkTimeout); + } + this._adjustHeightTimeout = setTimeout(() => this.adjustHeight(), 0); + + this._currentIndex = 0; + if (this._appendResultTimeout) { + clearTimeout(this._appendResultTimeout); + } + this._appendCurrentResult(reason); + ]]> + </body> + </method> + + <property name="maxResults" readonly="true"> + <getter> + <![CDATA[ + // this is how many richlistitems will be kept around + // (note, this getter may be overridden) + return 20; + ]]> + </getter> + </property> + + <property name="_matchCount" readonly="true"> + <getter> + <![CDATA[ + return Math.min(this.mInput.controller.matchCount, this.maxResults); + ]]> + </getter> + </property> + + <method name="_collapseUnusedItems"> + <body> + <![CDATA[ + let existingItemsCount = this.richlistbox.childNodes.length; + for (let i = this._matchCount; i < existingItemsCount; ++i) { + this.richlistbox.childNodes[i].collapsed = true; + } + ]]> + </body> + </method> + + <method name="adjustHeight"> + <body> + <![CDATA[ + // Figure out how many rows to show + let rows = this.richlistbox.childNodes; + let numRows = Math.min(this._matchCount, this.maxRows, rows.length); + + this.removeAttribute("height"); + + // Default the height to 0 if we have no rows to show + let height = 0; + if (numRows) { + if (!this._rowHeight) { + let firstRowRect = rows[0].getBoundingClientRect(); + this._rowHeight = firstRowRect.height; + + let transition = + window.getComputedStyle(this.richlistbox).transitionProperty; + this._rlbAnimated = transition && transition != "none"; + + // Set a fixed max-height to avoid flicker when growing the panel. + this.richlistbox.style.maxHeight = (this._rowHeight * this.maxRows) + "px"; + } + + // Calculate the height to have the first row to last row shown + height = this._rowHeight * numRows; + } + + let animate = this._rlbAnimated && + this.getAttribute("dontanimate") != "true"; + let currentHeight = this.richlistbox.getBoundingClientRect().height; + if (height > currentHeight) { + // Grow immediately. + if (animate) { + this.richlistbox.removeAttribute("height"); + this.richlistbox.style.height = height + "px"; + } else { + this.richlistbox.style.removeProperty("height"); + this.richlistbox.height = height; + } + } else { + // Delay shrinking to avoid flicker. + this._shrinkTimeout = setTimeout(() => { + this._collapseUnusedItems(); + if (animate) { + this.richlistbox.removeAttribute("height"); + this.richlistbox.style.height = height + "px"; + } else { + this.richlistbox.style.removeProperty("height"); + this.richlistbox.height = height; + } + }, this.mInput.shrinkDelay); + } + ]]> + </body> + </method> + + <method name="_appendCurrentResult"> + <parameter name="invalidateReason"/> + <body> + <![CDATA[ + var controller = this.mInput.controller; + var matchCount = this._matchCount; + var existingItemsCount = this.richlistbox.childNodes.length; + + // Process maxRows per chunk to improve performance and user experience + for (let i = 0; i < this.maxRows; i++) { + if (this._currentIndex >= matchCount) + break; + + var item; + + // trim the leading/trailing whitespace + var trimmedSearchString = controller.searchString.replace(/^\s+/, "").replace(/\s+$/, ""); + + let url = controller.getValueAt(this._currentIndex); + + if (this._currentIndex < existingItemsCount) { + // re-use the existing item + item = this.richlistbox.childNodes[this._currentIndex]; + + // Completely reuse the existing richlistitem for invalidation + // due to new results, but only when: the item is the same, *OR* + // we are about to replace the currently mouse-selected item, to + // avoid surprising the user. + let iface = Components.interfaces.nsIAutoCompletePopup; + if (item.getAttribute("text") == trimmedSearchString && + invalidateReason == iface.INVALIDATE_REASON_NEW_RESULT && + (item.getAttribute("url") == url || + this.richlistbox.mouseSelectedIndex === this._currentIndex)) { + item.collapsed = false; + this._currentIndex++; + continue; + } + } + else { + // need to create a new item + item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "richlistitem"); + } + + // set these attributes before we set the class + // so that we can use them from the constructor + let iconURI = controller.getImageAt(this._currentIndex); + item.setAttribute("image", iconURI); + item.setAttribute("url", url); + item.setAttribute("title", controller.getCommentAt(this._currentIndex)); + item.setAttribute("type", controller.getStyleAt(this._currentIndex)); + item.setAttribute("text", trimmedSearchString); + + if (this._currentIndex < existingItemsCount) { + // re-use the existing item + item._adjustAcItem(); + item.collapsed = false; + } + else { + // set the class at the end so we can use the attributes + // in the xbl constructor + item.className = "autocomplete-richlistitem"; + this.richlistbox.appendChild(item); + } + + this._currentIndex++; + } + + if (typeof this.onResultsAdded == "function") + this.onResultsAdded(); + + if (this._currentIndex < matchCount) { + // yield after each batch of items so that typing the url bar is + // responsive + this._appendResultTimeout = setTimeout(() => this._appendCurrentResult(), 0); + } + ]]> + </body> + </method> + + <method name="selectBy"> + <parameter name="aReverse"/> + <parameter name="aPage"/> + <body> + <![CDATA[ + try { + var amount = aPage ? 5 : 1; + + // because we collapsed unused items, we can't use this.richlistbox.getRowCount(), we need to use the matchCount + this.selectedIndex = this.getNextIndex(aReverse, amount, this.selectedIndex, this._matchCount - 1); + if (this.selectedIndex == -1) { + this.input._focus(); + } + } catch (ex) { + // do nothing - occasionally timer-related js errors happen here + // e.g. "this.selectedIndex has no properties", when you type fast and hit a + // navigation key before this popup has opened + } + ]]> + </body> + </method> + + <field name="richlistbox"> + document.getAnonymousElementByAttribute(this, "anonid", "richlistbox"); + </field> + + <property name="view" + onget="return this.mInput.controller;" + onset="return val;"/> + + </implementation> + </binding> + + <binding id="autocomplete-richlistitem" extends="chrome://global/content/bindings/richlistbox.xml#richlistitem"> + <content> + <xul:hbox align="center" class="ac-title-box"> + <xul:image xbl:inherits="src=image" class="ac-site-icon"/> + <xul:hbox anonid="title-box" class="ac-title" flex="1" + onunderflow="_doUnderflow('_title');" + onoverflow="_doOverflow('_title');"> + <xul:description anonid="title" class="ac-normal-text ac-comment" xbl:inherits="selected"/> + </xul:hbox> + <xul:label anonid="title-overflow-ellipsis" xbl:inherits="selected" + class="ac-ellipsis-after ac-comment"/> + <xul:hbox anonid="extra-box" class="ac-extra" align="center" hidden="true"> + <xul:image class="ac-result-type-tag"/> + <xul:label class="ac-normal-text ac-comment" xbl:inherits="selected" value=":"/> + <xul:description anonid="extra" class="ac-normal-text ac-comment" xbl:inherits="selected"/> + </xul:hbox> + <xul:image anonid="type-image" class="ac-type-icon" xbl:inherits="selected"/> + </xul:hbox> + <xul:hbox align="center" class="ac-url-box"> + <xul:spacer class="ac-site-icon"/> + <xul:image class="ac-action-icon"/> + <xul:hbox anonid="url-box" class="ac-url" flex="1" + onunderflow="_doUnderflow('_url');" + onoverflow="_doOverflow('_url');"> + <xul:description anonid="url" class="ac-normal-text ac-url-text" + xbl:inherits="selected type"/> + <xul:description anonid="action" class="ac-normal-text ac-action-text" + xbl:inherits="selected type"/> + </xul:hbox> + <xul:label anonid="url-overflow-ellipsis" xbl:inherits="selected" + class="ac-ellipsis-after ac-url-text"/> + <xul:spacer class="ac-type-icon"/> + </xul:hbox> + </content> + <implementation implements="nsIDOMXULSelectControlItemElement"> + <constructor> + <![CDATA[ + let ellipsis = "\u2026"; + try { + ellipsis = Components.classes["@mozilla.org/preferences-service;1"]. + getService(Components.interfaces.nsIPrefBranch). + getComplexValue("intl.ellipsis", + Components.interfaces.nsIPrefLocalizedString).data; + } catch (ex) { + // Do nothing.. we already have a default + } + + this._urlOverflowEllipsis = document.getAnonymousElementByAttribute(this, "anonid", "url-overflow-ellipsis"); + this._titleOverflowEllipsis = document.getAnonymousElementByAttribute(this, "anonid", "title-overflow-ellipsis"); + + this._urlOverflowEllipsis.value = ellipsis; + this._titleOverflowEllipsis.value = ellipsis; + + this._typeImage = document.getAnonymousElementByAttribute(this, "anonid", "type-image"); + + this._urlBox = document.getAnonymousElementByAttribute(this, "anonid", "url-box"); + this._url = document.getAnonymousElementByAttribute(this, "anonid", "url"); + this._action = document.getAnonymousElementByAttribute(this, "anonid", "action"); + + this._titleBox = document.getAnonymousElementByAttribute(this, "anonid", "title-box"); + this._title = document.getAnonymousElementByAttribute(this, "anonid", "title"); + + this._extraBox = document.getAnonymousElementByAttribute(this, "anonid", "extra-box"); + this._extra = document.getAnonymousElementByAttribute(this, "anonid", "extra"); + + this._adjustAcItem(); + ]]> + </constructor> + + <property name="label" readonly="true"> + <getter> + <![CDATA[ + // This property is a string that is read aloud by screen readers, + // so it must not contain anything that should not be user-facing. + + let parts = [ + this.getAttribute("title"), + this.getAttribute("displayurl"), + ]; + let label = parts.filter(str => str).join(" ") + + // allow consumers that have extended popups to override + // the label values for the richlistitems + let panel = this.parentNode.parentNode; + if (panel.createResultLabel) { + return panel.createResultLabel(this, label); + } + + return label; + ]]> + </getter> + </property> + + <property name="_stringBundle"> + <getter><![CDATA[ + if (!this.__stringBundle) { + this.__stringBundle = Services.strings.createBundle("chrome://global/locale/autocomplete.properties"); + } + return this.__stringBundle; + ]]></getter> + </property> + + <field name="_boundaryCutoff">null</field> + + <property name="boundaryCutoff" readonly="true"> + <getter> + <![CDATA[ + if (!this._boundaryCutoff) { + this._boundaryCutoff = + Components.classes["@mozilla.org/preferences-service;1"]. + getService(Components.interfaces.nsIPrefBranch). + getIntPref("toolkit.autocomplete.richBoundaryCutoff"); + } + return this._boundaryCutoff; + ]]> + </getter> + </property> + + <method name="_getBoundaryIndices"> + <parameter name="aText"/> + <parameter name="aSearchTokens"/> + <body> + <![CDATA[ + // Short circuit for empty search ([""] == "") + if (aSearchTokens == "") + return [0, aText.length]; + + // Find which regions of text match the search terms + let regions = []; + for (let search of Array.prototype.slice.call(aSearchTokens)) { + let matchIndex = -1; + let searchLen = search.length; + + // Find all matches of the search terms, but stop early for perf + let lowerText = aText.substr(0, this.boundaryCutoff).toLowerCase(); + while ((matchIndex = lowerText.indexOf(search, matchIndex + 1)) >= 0) { + regions.push([matchIndex, matchIndex + searchLen]); + } + } + + // Sort the regions by start position then end position + regions = regions.sort((a, b) => { + let start = a[0] - b[0]; + return (start == 0) ? a[1] - b[1] : start; + }); + + // Generate the boundary indices from each region + let start = 0; + let end = 0; + let boundaries = []; + let len = regions.length; + for (let i = 0; i < len; i++) { + // We have a new boundary if the start of the next is past the end + let region = regions[i]; + if (region[0] > end) { + // First index is the beginning of match + boundaries.push(start); + // Second index is the beginning of non-match + boundaries.push(end); + + // Track the new region now that we've stored the previous one + start = region[0]; + } + + // Push back the end index for the current or new region + end = Math.max(end, region[1]); + } + + // Add the last region + boundaries.push(start); + boundaries.push(end); + + // Put on the end boundary if necessary + if (end < aText.length) + boundaries.push(aText.length); + + // Skip the first item because it's always 0 + return boundaries.slice(1); + ]]> + </body> + </method> + + <method name="_getSearchTokens"> + <parameter name="aSearch"/> + <body> + <![CDATA[ + let search = aSearch.toLowerCase(); + return search.split(/\s+/); + ]]> + </body> + </method> + + <method name="_setUpDescription"> + <parameter name="aDescriptionElement"/> + <parameter name="aText"/> + <parameter name="aNoEmphasis"/> + <body> + <![CDATA[ + // Get rid of all previous text + while (aDescriptionElement.hasChildNodes()) + aDescriptionElement.removeChild(aDescriptionElement.firstChild); + + // If aNoEmphasis is specified, don't add any emphasis + if (aNoEmphasis) { + aDescriptionElement.appendChild(document.createTextNode(aText)); + return; + } + + // Get the indices that separate match and non-match text + let search = this.getAttribute("text"); + let tokens = this._getSearchTokens(search); + let indices = this._getBoundaryIndices(aText, tokens); + + let next; + let start = 0; + let len = indices.length; + // Even indexed boundaries are matches, so skip the 0th if it's empty + for (let i = indices[0] == 0 ? 1 : 0; i < len; i++) { + next = indices[i]; + let text = aText.substr(start, next - start); + start = next; + + if (i % 2 == 0) { + // Emphasize the text for even indices + let span = aDescriptionElement.appendChild( + document.createElementNS("http://www.w3.org/1999/xhtml", "span")); + span.className = "ac-emphasize-text"; + span.textContent = text; + } else { + // Otherwise, it's plain text + aDescriptionElement.appendChild(document.createTextNode(text)); + } + } + ]]> + </body> + </method> + + <!-- + This will generate an array of emphasis pairs for use with + _setUpEmphasisedSections(). Each pair is a tuple (array) that + represents a block of text - containing the text of that block, and a + boolean for whether that block should have an emphasis styling applied + to it. + + These pairs are generated by parsing a localised string (aSourceString) + with parameters, in the format that is used by + nsIStringBundle.formatStringFromName(): + + "textA %1$S textB textC %2$S" + + Or: + + "textA %S" + + Where "%1$S", "%2$S", and "%S" are intended to be replaced by provided + replacement strings. These are specified an array of tuples + (aReplacements), each containing the replacement text and a boolean for + whether that text should have an emphasis styling applied. This is used + as a 1-based array - ie, "%1$S" is replaced by the item in the first + index of aReplacements, "%2$S" by the second, etc. "%S" will always + match the first index. + --> + <method name="_generateEmphasisPairs"> + <parameter name="aSourceString"/> + <parameter name="aReplacements"/> + <body> + <![CDATA[ + let pairs = []; + + // Split on %S, %1$S, %2$S, etc. ie: + // "textA %S" + // becomes ["textA ", "%S"] + // "textA %1$S textB textC %2$S" + // becomes ["textA ", "%1$S", " textB textC ", "%2$S"] + let parts = aSourceString.split(/(%(?:[0-9]+\$)?S)/); + + for (let part of parts) { + // The above regex will actually give us an empty string at the + // end - we don't want that, as we don't want to later generate an + // empty text node for it. + if (part.length === 0) + continue; + + // Determine if this token is a replacement token or a normal text + // token. If it is a replacement token, we want to extract the + // numerical number. However, we still want to match on "$S". + let match = part.match(/^%(?:([0-9]+)\$)?S$/); + + if (match) { + // "%S" doesn't have a numerical number in it, but will always + // be assumed to be 1. Furthermore, the input string specifies + // these with a 1-based index, but we want a 0-based index. + let index = (match[1] || 1) - 1; + + if (index >= 0 && index < aReplacements.length) { + pairs.push([...aReplacements[index]]); + } + } else { + pairs.push([part]); + } + } + + return pairs; + ]]> + </body> + </method> + + <!-- + _setUpEmphasisedSections() has the same use as _setUpDescription, + except instead of taking a string and highlighting given tokens, it takes + an array of pairs generated by _generateEmphasisPairs(). This allows + control over emphasising based on specific blocks of text, rather than + search for substrings. + --> + <method name="_setUpEmphasisedSections"> + <parameter name="aDescriptionElement"/> + <parameter name="aTextPairs"/> + <body> + <![CDATA[ + // Get rid of all previous text + while (aDescriptionElement.hasChildNodes()) + aDescriptionElement.firstChild.remove(); + + for (let [text, emphasise] of aTextPairs) { + if (emphasise) { + let span = aDescriptionElement.appendChild( + document.createElementNS("http://www.w3.org/1999/xhtml", "span")); + span.textContent = text; + switch(emphasise) { + case "match": + span.className = "ac-emphasize-text"; + break; + case "selected": + span.className = "ac-selected-text"; + break; + } + } else { + aDescriptionElement.appendChild(document.createTextNode(text)); + } + } + ]]> + </body> + </method> + + <field name="_textToSubURI">null</field> + <method name="_unescapeUrl"> + <parameter name="url"/> + <body> + <![CDATA[ + if (!this._textToSubURI) { + this._textToSubURI = + Components.classes["@mozilla.org/intl/texttosuburi;1"] + .getService(Components.interfaces.nsITextToSubURI); + } + return this._textToSubURI.unEscapeURIForUI("UTF-8", url); + ]]> + </body> + </method> + + <method name="_adjustAcItem"> + <body> + <![CDATA[ + let originalUrl = this.getAttribute("url"); + let title = this.getAttribute("title"); + let type = this.getAttribute("type"); + + let displayUrl; + let emphasiseTitle = true; + let emphasiseUrl = true; + + // Hide the title's extra box by default, until we find out later if + // we need extra stuff. + this._extraBox.hidden = true; + this._titleBox.flex = 1; + this._typeImage.hidden = false; + + this.removeAttribute("actiontype"); + this.classList.remove("overridable-action"); + + // The ellipses are hidden via their visibility so that they always + // take up space and don't pop in on top of text when shown. For + // keyword searches, however, the title ellipsis should not take up + // space when hidden. Setting the hidden property accomplishes that. + this._titleOverflowEllipsis.hidden = false; + + let types = new Set(type.split(/\s+/)); + + // Remove types that should ultimately not be in the `type` string. + let initialTypes = new Set(types); + types.delete("action"); + types.delete("autofill"); + types.delete("heuristic"); + types.delete("search"); + + type = [...types][0] || ""; + + // If the type includes an action, set up the item appropriately. + if (initialTypes.has("action")) { + let action = this._parseActionUrl(originalUrl); + this.setAttribute("actiontype", action.type); + + if (action.type == "switchtab") { + this.classList.add("overridable-action"); + displayUrl = this._unescapeUrl(action.params.url); + let desc = this._stringBundle.GetStringFromName("switchToTab"); + this._setUpDescription(this._action, desc, true); + } else if (action.type == "remotetab") { + displayUrl = this._unescapeUrl(action.params.url); + let desc = action.params.deviceName; + this._setUpDescription(this._action, desc, true); + } else if (action.type == "searchengine") { + emphasiseUrl = false; + + // The order here is not localizable, we default to appending + // "- Search with Engine" to the search string, to be able to + // properly generate emphasis pairs. That said, no localization + // changed the order while it was possible, so doesn't look like + // there's a strong need for that. + let {engineName, searchSuggestion, searchQuery} = action.params; + let engineStr = " - " + + this._stringBundle.formatStringFromName("searchWithEngine", + [engineName], 1); + + // Make the title by generating an array of pairs and its + // corresponding interpolation string (e.g., "%1$S") to pass to + // _generateEmphasisPairs. + let pairs; + if (searchSuggestion) { + // Check if the search query appears in the suggestion. It may + // not. If it does, then emphasize the query in the suggestion + // and otherwise just include the suggestion without emphasis. + let idx = searchSuggestion.indexOf(searchQuery); + if (idx >= 0) { + pairs = [ + [searchSuggestion.substring(0, idx), ""], + [searchQuery, "match"], + [searchSuggestion.substring(idx + searchQuery.length), ""], + ]; + } else { + pairs = [ + [searchSuggestion, ""], + ]; + } + } else { + pairs = [ + [searchQuery, ""], + ]; + } + pairs.push([engineStr, "selected"]); + let interpStr = pairs.map((pair, i) => `%${i + 1}$S`).join(""); + title = this._generateEmphasisPairs(interpStr, pairs); + + // If this is a default search match, we remove the image so we + // can style it ourselves with a generic search icon. + // We don't do this when matching an aliased search engine, + // because the icon helps with recognising which engine will be + // used (when using the default engine, we don't need that + // recognition). + if (!action.params.alias) { + this.removeAttribute("image"); + } + } else if (action.type == "visiturl") { + emphasiseUrl = false; + displayUrl = this._unescapeUrl(action.params.url); + let sourceStr = this._stringBundle.GetStringFromName("visitURL"); + title = this._generateEmphasisPairs(sourceStr, [ + [displayUrl, "match"], + ]); + } + } + + // Check if we have a search engine name + if (initialTypes.has("search")) { + emphasiseUrl = false; + + const TITLE_SEARCH_ENGINE_SEPARATOR = " \u00B7\u2013\u00B7 "; + + let searchEngine = ""; + [title, searchEngine] = title.split(TITLE_SEARCH_ENGINE_SEPARATOR); + displayUrl = this._stringBundle.formatStringFromName("searchWithEngine", [searchEngine], 1); + } + + if (!displayUrl) { + let input = this.parentNode.parentNode.input; + let url = typeof(input.trimValue) == "function" ? + input.trimValue(originalUrl) : + originalUrl; + displayUrl = this._unescapeUrl(url); + } + this.setAttribute("displayurl", displayUrl); + + // Check if we have an auto-fill URL + if (initialTypes.has("autofill")) { + emphasiseUrl = false; + + let sourceStr = this._stringBundle.GetStringFromName("visitURL"); + title = this._generateEmphasisPairs(sourceStr, [ + [displayUrl, "match"], + ]); + } + + // If we have a tag match, show the tags and icon + if (type == "tag" || type == "bookmark-tag") { + // Configure the extra box for tags display + this._extraBox.hidden = false; + this._extraBox.childNodes[0].hidden = false; + this._extraBox.childNodes[1].hidden = true; + this._extraBox.pack = "end"; + this._titleBox.flex = 1; + + // The title is separated from the tags by an endash + let tags; + [, title, tags] = title.match(/^(.+) \u2013 (.+)$/); + + // Each tag is split by a comma in an undefined order, so sort it + let sortedTags = tags.split(",").sort().join(", "); + + // Emphasize the matching text in the tags + this._setUpDescription(this._extra, sortedTags); + + // If we're suggesting bookmarks, then treat tagged matches as + // bookmarks for the star. + if (type == "bookmark-tag") { + type = "bookmark"; + } else { + this._typeImage.hidden = true; + } + // keyword and favicon type results for search engines + // have an extra magnifying glass icon after them + } else if (type == "keyword" || (initialTypes.has("search") && + initialTypes.has("favicon"))) { + // Configure the extra box for keyword display + this._extraBox.hidden = false; + this._extraBox.childNodes[0].hidden = true; + // The second child node is ":" and it should be hidden for non keyword types + this._extraBox.childNodes[1].hidden = type == "keyword" ? false : true; + this._extraBox.pack = "start"; + this._titleBox.flex = 0; + + // Hide the ellipsis so it doesn't take up space. + this._titleOverflowEllipsis.hidden = true; + + if (type == "keyword") { + // Put the parameters next to the title if we have any + let search = this.getAttribute("text"); + let params = ""; + let paramsIndex = search.indexOf(" "); + if (paramsIndex != -1) + params = search.substr(paramsIndex + 1); + + // Emphasize the keyword parameters + this._setUpDescription(this._extra, params); + + // Don't emphasize keyword searches in the title or url + emphasiseUrl = false; + emphasiseTitle = false; + } else { + // Don't show any description for non keyword types. + this._setUpDescription(this._extra, "", true); + } + // If the result has the type favicon and a known search provider, + // customize it the same way as a keyword result. + type = "keyword"; + } + + // Give the image the icon style and a special one for the type + this._typeImage.className = "ac-type-icon" + + (type ? " ac-result-type-" + type : ""); + + // Show the domain as the title if we don't have a title. + if (title == "") { + title = displayUrl; + try { + let uri = Services.io.newURI(originalUrl, null, null); + // Not all valid URLs have a domain. + if (uri.host) + title = uri.host; + } catch (e) {} + } + + // Emphasize the matching search terms for the description + if (Array.isArray(title)) + this._setUpEmphasisedSections(this._title, title); + else + this._setUpDescription(this._title, title, !emphasiseTitle); + + this._setUpDescription(this._url, displayUrl, !emphasiseUrl); + + // Set up overflow on a timeout because the contents of the box + // might not have a width yet even though we just changed them + setTimeout(this._setUpOverflow, 0, this._titleBox, this._titleOverflowEllipsis); + setTimeout(this._setUpOverflow, 0, this._urlBox, this._urlOverflowEllipsis); + ]]> + </body> + </method> + + <method name="_parseActionUrl"> + <parameter name="aUrl"/> + <body><![CDATA[ + if (!aUrl.startsWith("moz-action:")) + return null; + + // URL is in the format moz-action:ACTION,PARAMS + // Where PARAMS is a JSON encoded object. + let [, type, params] = aUrl.match(/^moz-action:([^,]+),(.*)$/); + + let action = { + type: type, + }; + + try { + action.params = JSON.parse(params); + for (let key in action.params) { + action.params[key] = decodeURIComponent(action.params[key]); + } + } catch (e) { + // If this failed, we assume that params is not a JSON object, and + // is instead just a flat string. This will happen when + // UnifiedComplete is disabled - in which case, the param is always + // a URL. + action.params = { + url: params, + } + } + + return action; + ]]></body> + </method> + + <method name="_setUpOverflow"> + <parameter name="aParentBox"/> + <parameter name="aEllipsis"/> + <body> + <![CDATA[ + // Hide the ellipsis incase there's just enough to not underflow + aEllipsis.style.visibility = "hidden"; + + // Start with the parent's width and subtract off its children + let tooltip = []; + let children = aParentBox.childNodes; + let widthDiff = aParentBox.boxObject.width; + + for (let i = 0; i < children.length; i++) { + // Only consider a child if it actually takes up space + let childWidth = children[i].boxObject.width; + if (childWidth > 0) { + // Subtract a little less to account for subpixel rounding + widthDiff -= childWidth - .5; + + // Add to the tooltip if it's not hidden and has text + let childText = children[i].textContent; + if (childText) + tooltip.push(childText); + } + } + + // If the children take up more space than the parent.. overflow! + if (widthDiff < 0) { + // Re-show the ellipsis now that we know it's needed + aEllipsis.style.visibility = "visible"; + + // Separate text components with a ndash -- + aParentBox.tooltipText = tooltip.join(" \u2013 "); + } + ]]> + </body> + </method> + + <method name="_doUnderflow"> + <parameter name="aName"/> + <body> + <![CDATA[ + // Hide the ellipsis right when we know we're underflowing instead of + // waiting for the timeout to trigger the _setUpOverflow calculations + this[aName + "Box"].tooltipText = ""; + this[aName + "OverflowEllipsis"].style.visibility = "hidden"; + ]]> + </body> + </method> + + <method name="_doOverflow"> + <parameter name="aName"/> + <body> + <![CDATA[ + this._setUpOverflow(this[aName + "Box"], + this[aName + "OverflowEllipsis"]); + ]]> + </body> + </method> + + </implementation> + </binding> + + <binding id="autocomplete-tree" extends="chrome://global/content/bindings/tree.xml#tree"> + <content> + <children includes="treecols"/> + <xul:treerows class="autocomplete-treerows tree-rows" xbl:inherits="hidescrollbar" flex="1"> + <children/> + </xul:treerows> + </content> + </binding> + + <binding id="autocomplete-richlistbox" extends="chrome://global/content/bindings/richlistbox.xml#richlistbox"> + <implementation> + <field name="mLastMoveTime">Date.now()</field> + <field name="mouseSelectedIndex">-1</field> + </implementation> + <handlers> + <handler event="mouseup"> + <![CDATA[ + // don't call onPopupClick for the scrollbar buttons, thumb, slider, etc. + let item = event.originalTarget; + while (item && item.localName != "richlistitem") { + item = item.parentNode; + } + + if (!item) + return; + + this.parentNode.onPopupClick(event); + ]]> + </handler> + + <handler event="mousemove"> + <![CDATA[ + if (Date.now() - this.mLastMoveTime > 30) { + let item = event.target; + while (item && item.localName != "richlistitem") { + item = item.parentNode; + } + + if (!item) + return; + + let index = this.getIndexOfItem(item); + if (index != this.selectedIndex) { + this.mouseSelectedIndex = this.selectedIndex = index; + } + + this.mLastMoveTime = Date.now(); + } + ]]> + </handler> + </handlers> + </binding> + + <binding id="autocomplete-treebody"> + <implementation> + <field name="mLastMoveTime">Date.now()</field> + </implementation> + + <handlers> + <handler event="mouseup" action="this.parentNode.parentNode.onPopupClick(event);"/> + + <handler event="mousedown"><![CDATA[ + var rc = this.parentNode.treeBoxObject.getRowAt(event.clientX, event.clientY); + if (rc != this.parentNode.currentIndex) + this.parentNode.view.selection.select(rc); + ]]></handler> + + <handler event="mousemove"><![CDATA[ + if (Date.now() - this.mLastMoveTime > 30) { + var rc = this.parentNode.treeBoxObject.getRowAt(event.clientX, event.clientY); + if (rc != this.parentNode.currentIndex) + this.parentNode.view.selection.select(rc); + this.mLastMoveTime = Date.now(); + } + ]]></handler> + </handlers> + </binding> + + <binding id="autocomplete-treerows"> + <content> + <xul:hbox flex="1" class="tree-bodybox"> + <children/> + </xul:hbox> + <xul:scrollbar xbl:inherits="collapsed=hidescrollbar" orient="vertical" class="tree-scrollbar"/> + </content> + </binding> + + <binding id="history-dropmarker" extends="chrome://global/content/bindings/general.xml#dropmarker"> + <implementation> + <method name="showPopup"> + <body><![CDATA[ + var textbox = document.getBindingParent(this); + textbox.showHistoryPopup(); + ]]></body> + </method> + </implementation> + + <handlers> + <handler event="mousedown" button="0"><![CDATA[ + this.showPopup(); + ]]></handler> + </handlers> + </binding> + +</bindings> diff --git a/application/palemoon/base/content/browser-addons.js b/application/palemoon/base/content/browser-addons.js index 7993a0c9c..f5c398f33 100644 --- a/application/palemoon/base/content/browser-addons.js +++ b/application/palemoon/base/content/browser-addons.js @@ -226,7 +226,7 @@ const gXPInstallObserver = { * - If an add-on was installed, incrementing the count, show the bar. * - If an add-on was uninstalled, and no more items are left, hide the bar. */ -let AddonsMgrListener = { +var AddonsMgrListener = { get addonBar() document.getElementById("addon-bar"), get statusBar() document.getElementById("status-bar"), getAddonBarItemCount: function() { @@ -461,7 +461,7 @@ var LightWeightThemeWebInstaller = { /* * Listen for Lightweight Theme styling changes and update the browser's theme accordingly. */ -let LightweightThemeListener = { +var LightweightThemeListener = { _modifiedStyles: [], init: function () { diff --git a/application/palemoon/base/content/browser-gestureSupport.js b/application/palemoon/base/content/browser-gestureSupport.js index d88f47c79..13eb71b99 100644 --- a/application/palemoon/base/content/browser-gestureSupport.js +++ b/application/palemoon/base/content/browser-gestureSupport.js @@ -13,7 +13,7 @@ // chrome-only, we must listen for the simple gesture events during // the capturing phase and call stopPropagation on every event. -let gGestureSupport = { +var gGestureSupport = { _currentRotation: 0, _lastRotateDelta: 0, _rotateMomentumThreshold: .75, @@ -532,7 +532,7 @@ let gGestureSupport = { }; // History Swipe Animation Support (bug 678392) -let gHistorySwipeAnimation = { +var gHistorySwipeAnimation = { active: false, isLTR: false, diff --git a/application/palemoon/base/content/browser-places.js b/application/palemoon/base/content/browser-places.js index cf9c28597..5c13a43f9 100644 --- a/application/palemoon/base/content/browser-places.js +++ b/application/palemoon/base/content/browser-places.js @@ -959,7 +959,7 @@ var PlacesMenuDNDHandler = { * This object handles the initialization and uninitialization of the bookmarks * toolbar. */ -let PlacesToolbarHelper = { +var PlacesToolbarHelper = { _place: "place:folder=TOOLBAR", get _viewElt() { @@ -1006,7 +1006,7 @@ let PlacesToolbarHelper = { * menu button. */ -let BookmarkingUI = { +var BookmarkingUI = { get button() { if (!this._button) { this._button = document.getElementById("bookmarks-menu-button"); diff --git a/application/palemoon/base/content/browser-syncui.js b/application/palemoon/base/content/browser-syncui.js index fc8c7f016..67056e221 100644 --- a/application/palemoon/base/content/browser-syncui.js +++ b/application/palemoon/base/content/browser-syncui.js @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. // gSyncUI handles updating the tools menu -let gSyncUI = { +var gSyncUI = { _obs: ["weave:service:sync:start", "weave:service:sync:delayed", "weave:service:quota:remaining", diff --git a/application/palemoon/base/content/browser-thumbnails.js b/application/palemoon/base/content/browser-thumbnails.js index b06dfd503..079b0ac1b 100644 --- a/application/palemoon/base/content/browser-thumbnails.js +++ b/application/palemoon/base/content/browser-thumbnails.js @@ -7,7 +7,7 @@ /** * Keeps thumbnails of open web pages up-to-date. */ -let gBrowserThumbnails = { +var gBrowserThumbnails = { /** * Pref that controls whether we can store SSL content on disk */ diff --git a/application/palemoon/base/content/browser-uacompat.js b/application/palemoon/base/content/browser-uacompat.js new file mode 100644 index 000000000..933aa55d1 --- /dev/null +++ b/application/palemoon/base/content/browser-uacompat.js @@ -0,0 +1,45 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var UserAgentCompatibility = { + PREF_UA_COMPAT: "general.useragent.compatMode", + PREF_UA_COMPAT_GECKO: "general.useragent.compatMode.gecko", + PREF_UA_COMPAT_FIREFOX: "general.useragent.compatMode.firefox", + + init: function() { + this.checkPreferences(); + Services.prefs.addObserver(this.PREF_UA_COMPAT, this, false); + Services.prefs.addObserver(this.PREF_UA_COMPAT_GECKO, this, false); + Services.prefs.addObserver(this.PREF_UA_COMPAT_FIREFOX, this, false); + }, + + uninit: function() { + Services.prefs.removeObserver(this.PREF_UA_COMPAT, this, false); + Services.prefs.removeObserver(this.PREF_UA_COMPAT_GECKO, this, false); + Services.prefs.removeObserver(this.PREF_UA_COMPAT_FIREFOX, this, false); + }, + + observe: function() { + this.checkPreferences(); + }, + + checkPreferences: function() { + var compatMode = Services.prefs.getIntPref(this.PREF_UA_COMPAT); + + switch(compatMode) { + case 0: + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_GECKO, false); + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_FIREFOX, false); + break; + case 1: + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_GECKO, true); + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_FIREFOX, false); + break; + case 2: + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_GECKO, true); + Services.prefs.setBoolPref(this.PREF_UA_COMPAT_FIREFOX, true); + break; + } + } +}; diff --git a/application/palemoon/base/content/browser-webrtcUI.js b/application/palemoon/base/content/browser-webrtcUI.js index a6c9008ca..d59134ce5 100644 --- a/application/palemoon/base/content/browser-webrtcUI.js +++ b/application/palemoon/base/content/browser-webrtcUI.js @@ -3,7 +3,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -let WebrtcIndicator = { +var WebrtcIndicator = { init: function () { let temp = {}; Cu.import("resource:///modules/webrtcUI.jsm", temp); diff --git a/application/palemoon/base/content/browser.css b/application/palemoon/base/content/browser.css index e6a84421b..a72d77488 100644 --- a/application/palemoon/base/content/browser.css +++ b/application/palemoon/base/content/browser.css @@ -280,6 +280,10 @@ panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .a -moz-binding: url("chrome://browser/content/urlbarBindings.xml#urlbar-rich-result-popup"); } +#DateTimePickerPanel[active="true"] { + -moz-binding: url("chrome://global/content/bindings/datetimepopup.xml#datetime-popup"); +} + /* Pale Moon: Address bar: Feeds */ #ub-feed-button > .button-box > .box-inherit > .button-text, #ub-feed-button > .button-box > .button-menu-dropmarker { @@ -324,6 +328,68 @@ panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .a visibility: hidden; } +/* Override xul.css for autocomplete bindings and css */ +textbox[type="autocomplete"] { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete"); +} + +panel[type="autocomplete"] { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-result-popup"); +} + +panel[type="autocomplete-richlistbox"] { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-rich-result-popup"); +} + +/* FIXME: bug 616258 */ + +.autocomplete-tree { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-tree"); + -moz-user-focus: ignore; +} + +.autocomplete-treebody { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-treebody"); +} + +.autocomplete-richlistbox { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-richlistbox"); + -moz-user-focus: ignore; +} + +.autocomplete-richlistbox > scrollbox { + overflow-x: hidden !important; +} + +.autocomplete-richlistitem { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-richlistitem"); + -moz-box-orient: vertical; + overflow: -moz-hidden-unscrollable; +} + +.autocomplete-treerows { + -moz-binding: url("chrome://browser/content/autocomplete.xml#autocomplete-treerows"); +} + +.autocomplete-history-dropmarker { + display: none; +} + +.autocomplete-history-dropmarker[enablehistory="true"] { + display: -moz-box; + -moz-binding: url("chrome://browser/content/autocomplete.xml#history-dropmarker"); +} + +.ac-ellipsis-after { + visibility: hidden; +} + +.ac-url-text[type~="action"], +.ac-action-text:not([type~="action"]) { + visibility: collapse; +} + + /* ::::: Unified Back-/Forward Button ::::: */ #back-button > .toolbarbutton-menu-dropmarker, #forward-button > .toolbarbutton-menu-dropmarker { @@ -542,11 +608,11 @@ window[chromehidden~="toolbar"] toolbar:not(.toolbar-primary):not(#nav-bar):not( max-width: 280px; } -.form-validation-anchor { +.popup-anchor { /* should occupy space but not be visible */ opacity: 0; - visibility: hidden; pointer-events: none; + -moz-stack-sizing: ignore; } #addon-progress-notification { @@ -627,10 +693,6 @@ statuspanel[inactive][previoustype=overLink] { -moz-box-align: end; } -.panel-inner-arrowcontentfooter[footertype="promobox"] { - -moz-binding: url("chrome://browser/content/urlbarBindings.xml#promobox"); -} - /* highlighter */ %include highlighter.css diff --git a/application/palemoon/base/content/browser.js b/application/palemoon/base/content/browser.js index b2d260101..c9f0aa4aa 100644 --- a/application/palemoon/base/content/browser.js +++ b/application/palemoon/base/content/browser.js @@ -7,6 +7,7 @@ var Ci = Components.interfaces; var Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource:///modules/RecentWindow.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "CharsetMenu", @@ -141,6 +142,7 @@ let gInitialPages = [ #include browser-plugins.js #include browser-tabPreviews.js #include browser-thumbnails.js +#include browser-uacompat.js #ifdef MOZ_WEBRTC #include browser-webrtcUI.js @@ -917,6 +919,7 @@ var gBrowserInit = { TabsInTitlebar.init(); retrieveToolbarIconsizesFromTheme(); ToolbarIconColor.init(); + UserAgentCompatibility.init(); #ifdef XP_WIN if (window.matchMedia("(-moz-os-version: windows-win8)").matches && @@ -1293,6 +1296,8 @@ var gBrowserInit = { DevToolsTheme.uninit(); #endif + UserAgentCompatibility.uninit(); + var enumerator = Services.wm.getEnumerator(null); enumerator.getNext(); if (!enumerator.hasMoreElements()) { @@ -2329,7 +2334,7 @@ function BrowserOnAboutPageLoad(doc) { /** * Handle command events bubbling up from error page content */ -let BrowserOnClick = { +var BrowserOnClick = { handleEvent: function BrowserOnClick_handleEvent(aEvent) { if (!aEvent.isTrusted || // Don't trust synthetic events aEvent.button == 2 || aEvent.target.localName != "button") { @@ -6998,7 +7003,8 @@ function focusNextFrame(event) { if (element.ownerDocument == document) focusAndSelectUrlBar(); } -let BrowserChromeTest = { + +var BrowserChromeTest = { _cb: null, _ready: false, markAsReady: function () { @@ -7016,7 +7022,7 @@ let BrowserChromeTest = { } }; -let ToolbarIconColor = { +var ToolbarIconColor = { init: function () { this._initialized = true; diff --git a/application/palemoon/base/content/browser.xul b/application/palemoon/base/content/browser.xul index df152bbaa..ea9c3f969 100644 --- a/application/palemoon/base/content/browser.xul +++ b/application/palemoon/base/content/browser.xul @@ -132,6 +132,20 @@ <!-- for url bar autocomplete --> <panel type="autocomplete-richlistbox" id="PopupAutoCompleteRichResult" noautofocus="true" hidden="true"/> + <!-- for date/time picker. consumeoutsideclicks is set to never, so that + clicks on the anchored input box are never consumed. --> + <panel id="DateTimePickerPanel" + type="arrow" + hidden="true" + orient="vertical" + noautofocus="true" + norolluponanchor="true" + consumeoutsideclicks="never" + level="parent" + tabspecific="true"> + <iframe id="dateTimePopupFrame"/> + </panel> + <!-- for invalid form error message --> <panel id="invalid-form-popup" type="arrow" orient="vertical" noautofocus="true" hidden="true" level="parent"> <description/> @@ -139,7 +153,6 @@ <panel id="editBookmarkPanel" type="arrow" - footertype="promobox" orient="vertical" ignorekeys="true" consumeoutsideclicks="true" @@ -946,7 +959,8 @@ flex="1" contenttooltip="aHTMLTooltip" tabcontainer="tabbrowser-tabs" contentcontextmenu="contentAreaContextMenu" - autocompletepopup="PopupAutoComplete"/> + autocompletepopup="PopupAutoComplete" + datetimepicker="DateTimePickerPanel"/> <chatbar id="pinnedchats" layer="true" mousethrough="always" hidden="true"/> <statuspanel id="statusbar-display" inactive="true"/> </vbox> diff --git a/application/palemoon/base/content/newtab/drag.js b/application/palemoon/base/content/newtab/drag.js index 8f0bf674e..fbd688faa 100644 --- a/application/palemoon/base/content/newtab/drag.js +++ b/application/palemoon/base/content/newtab/drag.js @@ -7,7 +7,7 @@ /** * This singleton implements site dragging functionality. */ -let gDrag = { +var gDrag = { /** * The site offset to the drag start point. */ diff --git a/application/palemoon/base/content/newtab/dragDataHelper.js b/application/palemoon/base/content/newtab/dragDataHelper.js index a66e4e87e..54348ab14 100644 --- a/application/palemoon/base/content/newtab/dragDataHelper.js +++ b/application/palemoon/base/content/newtab/dragDataHelper.js @@ -4,7 +4,7 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #endif -let gDragDataHelper = { +var gDragDataHelper = { get mimeType() { return "text/x-moz-url"; }, diff --git a/application/palemoon/base/content/newtab/drop.js b/application/palemoon/base/content/newtab/drop.js index d7bf30506..748652455 100644 --- a/application/palemoon/base/content/newtab/drop.js +++ b/application/palemoon/base/content/newtab/drop.js @@ -11,7 +11,7 @@ const DELAY_REARRANGE_MS = 100; /** * This singleton implements site dropping functionality. */ -let gDrop = { +var gDrop = { /** * The last drop target. */ diff --git a/application/palemoon/base/content/newtab/dropPreview.js b/application/palemoon/base/content/newtab/dropPreview.js index 903762345..fd7587a35 100644 --- a/application/palemoon/base/content/newtab/dropPreview.js +++ b/application/palemoon/base/content/newtab/dropPreview.js @@ -9,7 +9,7 @@ * indicate the transformation that results from dropping a cell at a certain * position. */ -let gDropPreview = { +var gDropPreview = { /** * Rearranges the sites currently contained in the grid when a site would be * dropped onto the given cell. diff --git a/application/palemoon/base/content/newtab/dropTargetShim.js b/application/palemoon/base/content/newtab/dropTargetShim.js index a85a6ccd6..046dbea1e 100644 --- a/application/palemoon/base/content/newtab/dropTargetShim.js +++ b/application/palemoon/base/content/newtab/dropTargetShim.js @@ -9,7 +9,7 @@ * the default DnD target detection relies on the cursor's position. We want * to pick a drop target based on the dragged site's position. */ -let gDropTargetShim = { +var gDropTargetShim = { /** * Cache for the position of all cells, cleaned after drag finished. */ diff --git a/application/palemoon/base/content/newtab/grid.js b/application/palemoon/base/content/newtab/grid.js index 3b7dfc35f..46e0b804b 100644 --- a/application/palemoon/base/content/newtab/grid.js +++ b/application/palemoon/base/content/newtab/grid.js @@ -7,7 +7,7 @@ /** * This singleton represents the grid that contains all sites. */ -let gGrid = { +var gGrid = { /** * The DOM node of the grid. */ diff --git a/application/palemoon/base/content/newtab/newTab.js b/application/palemoon/base/content/newtab/newTab.js index 6d8647ab6..bba73fd7a 100644 --- a/application/palemoon/base/content/newtab/newTab.js +++ b/application/palemoon/base/content/newtab/newTab.js @@ -18,7 +18,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "Rect", XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"); -let { +var { links: gLinks, allPages: gAllPages, linkChecker: gLinkChecker, diff --git a/application/palemoon/base/content/newtab/page.js b/application/palemoon/base/content/newtab/page.js index afe5bfba8..fc836a55e 100644 --- a/application/palemoon/base/content/newtab/page.js +++ b/application/palemoon/base/content/newtab/page.js @@ -8,7 +8,7 @@ * This singleton represents the whole 'New Tab Page' and takes care of * initializing all its components. */ -let gPage = { +var gPage = { /** * Initializes the page. */ diff --git a/application/palemoon/base/content/newtab/transformations.js b/application/palemoon/base/content/newtab/transformations.js index 6d1554f5f..0711d7d0a 100644 --- a/application/palemoon/base/content/newtab/transformations.js +++ b/application/palemoon/base/content/newtab/transformations.js @@ -9,7 +9,7 @@ * in the DOM and by showing or hiding the node. It additionally provides * convenience methods to work with a site's DOM node. */ -let gTransformation = { +var gTransformation = { /** * Returns the width of the left and top border of a cell. We need to take it * into account when measuring and comparing site and cell positions. diff --git a/application/palemoon/base/content/newtab/undo.js b/application/palemoon/base/content/newtab/undo.js index 5f619e980..b856914d2 100644 --- a/application/palemoon/base/content/newtab/undo.js +++ b/application/palemoon/base/content/newtab/undo.js @@ -8,7 +8,7 @@ * Dialog allowing to undo the removal of single site or to completely restore * the grid's original state. */ -let gUndoDialog = { +var gUndoDialog = { /** * The undo dialog's timeout in miliseconds. */ diff --git a/application/palemoon/base/content/newtab/updater.js b/application/palemoon/base/content/newtab/updater.js index 7b483e037..e6da37f87 100644 --- a/application/palemoon/base/content/newtab/updater.js +++ b/application/palemoon/base/content/newtab/updater.js @@ -8,7 +8,7 @@ * This singleton provides functionality to update the current grid to a new * set of pinned and blocked sites. It adds, moves and removes sites. */ -let gUpdater = { +var gUpdater = { /** * Updates the current grid according to its pinned and blocked sites. * This removes old, moves existing and creates new sites to fill gaps. diff --git a/application/palemoon/base/content/nsContextMenu.js b/application/palemoon/base/content/nsContextMenu.js index 017ab87cc..1fe592b52 100644 --- a/application/palemoon/base/content/nsContextMenu.js +++ b/application/palemoon/base/content/nsContextMenu.js @@ -1394,9 +1394,8 @@ nsContextMenu.prototype = { isDisabledForEvents: function(aNode) { let ownerDoc = aNode.ownerDocument; - return - ownerDoc.defaultView && - ownerDoc.defaultView + return ownerDoc.defaultView && + ownerDoc.defaultView .QueryInterface(Components.interfaces.nsIInterfaceRequestor) .getInterface(Components.interfaces.nsIDOMWindowUtils) .isNodeDisabledForEvents(aNode); diff --git a/application/palemoon/base/content/openLocation.js b/application/palemoon/base/content/openLocation.js index 5b731c7e8..316dfac70 100644 --- a/application/palemoon/base/content/openLocation.js +++ b/application/palemoon/base/content/openLocation.js @@ -7,7 +7,7 @@ var browser; var dialog = {}; var pref = null; -let openLocationModule = {}; +var openLocationModule = {}; try { pref = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); @@ -16,7 +16,7 @@ try { } Components.utils.import("resource:///modules/openLocationLastURL.jsm", openLocationModule); -let gOpenLocationLastURL = new openLocationModule.OpenLocationLastURL(window.opener); +var gOpenLocationLastURL = new openLocationModule.OpenLocationLastURL(window.opener); function onLoad() { diff --git a/application/palemoon/base/content/popup-notifications.inc b/application/palemoon/base/content/popup-notifications.inc index 7be975b7f..31a72b489 100644 --- a/application/palemoon/base/content/popup-notifications.inc +++ b/application/palemoon/base/content/popup-notifications.inc @@ -2,7 +2,6 @@ <panel id="notification-popup" type="arrow" - footertype="promobox" position="after_start" hidden="true" orient="vertical" diff --git a/application/palemoon/base/content/sync/aboutSyncTabs.js b/application/palemoon/base/content/sync/aboutSyncTabs.js index 535c43e56..bc624a459 100644 --- a/application/palemoon/base/content/sync/aboutSyncTabs.js +++ b/application/palemoon/base/content/sync/aboutSyncTabs.js @@ -11,7 +11,7 @@ Cu.import("resource://gre/modules/PlacesUtils.jsm", this); Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -let RemoteTabViewer = { +var RemoteTabViewer = { _tabsList: null, init: function () { diff --git a/application/palemoon/base/content/sync/addDevice.js b/application/palemoon/base/content/sync/addDevice.js index 556e75768..40862a791 100644 --- a/application/palemoon/base/content/sync/addDevice.js +++ b/application/palemoon/base/content/sync/addDevice.js @@ -15,7 +15,7 @@ const ADD_DEVICE_PAGE = 0; const SYNC_KEY_PAGE = 1; const DEVICE_CONNECTED_PAGE = 2; -let gSyncAddDevice = { +var gSyncAddDevice = { init: function init() { this.pin1.setAttribute("maxlength", PIN_PART_LENGTH); diff --git a/application/palemoon/base/content/sync/genericChange.js b/application/palemoon/base/content/sync/genericChange.js index 6d1ce9485..0c6dc145e 100644 --- a/application/palemoon/base/content/sync/genericChange.js +++ b/application/palemoon/base/content/sync/genericChange.js @@ -8,7 +8,7 @@ const Cc = Components.classes; Components.utils.import("resource://services-sync/main.js"); Components.utils.import("resource://gre/modules/Services.jsm"); -let Change = { +var Change = { _dialog: null, _dialogType: null, _status: null, diff --git a/application/palemoon/base/content/sync/progress.js b/application/palemoon/base/content/sync/progress.js index 2063f612a..101160fa8 100644 --- a/application/palemoon/base/content/sync/progress.js +++ b/application/palemoon/base/content/sync/progress.js @@ -6,8 +6,8 @@ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://services-sync/main.js"); -let gProgressBar; -let gCounter = 0; +var gProgressBar; +var gCounter = 0; function onLoad(event) { Services.obs.addObserver(onEngineSync, "weave:engine:sync:finish", false); diff --git a/application/palemoon/base/content/sync/quota.js b/application/palemoon/base/content/sync/quota.js index 7117a2ddf..454052754 100644 --- a/application/palemoon/base/content/sync/quota.js +++ b/application/palemoon/base/content/sync/quota.js @@ -10,7 +10,7 @@ const Cu = Components.utils; Cu.import("resource://services-sync/main.js"); Cu.import("resource://gre/modules/DownloadUtils.jsm"); -let gSyncQuota = { +var gSyncQuota = { init: function init() { this.bundle = document.getElementById("quotaStrings"); @@ -86,7 +86,7 @@ let gSyncQuota = { }; -let gUsageTreeView = { +var gUsageTreeView = { _ignored: {keys: true, meta: true, diff --git a/application/palemoon/base/content/sync/utils.js b/application/palemoon/base/content/sync/utils.js index 0c02b5bc0..d41ecf18a 100644 --- a/application/palemoon/base/content/sync/utils.js +++ b/application/palemoon/base/content/sync/utils.js @@ -8,7 +8,7 @@ const PERMISSIONS_RWUSR = 0x180; // Weave should always exist before before this file gets included. -let gSyncUtils = { +var gSyncUtils = { get bundle() { delete this.bundle; return this.bundle = Services.strings.createBundle("chrome://browser/locale/syncSetup.properties"); diff --git a/application/palemoon/base/content/tabbrowser.xml b/application/palemoon/base/content/tabbrowser.xml index 4b10855a7..a7cc6deea 100644 --- a/application/palemoon/base/content/tabbrowser.xml +++ b/application/palemoon/base/content/tabbrowser.xml @@ -30,7 +30,7 @@ <xul:vbox flex="1" class="browserContainer"> <xul:stack flex="1" class="browserStack" anonid="browserStack"> <xul:browser anonid="initialBrowser" type="content-primary" message="true" disablehistory="true" - xbl:inherits="tooltip=contenttooltip,contextmenu=contentcontextmenu,autocompletepopup"/> + xbl:inherits="tooltip=contenttooltip,contextmenu=contentcontextmenu,autocompletepopup,datetimepicker"/> </xul:stack> </xul:vbox> </xul:hbox> @@ -73,7 +73,7 @@ .getService(Components.interfaces.nsIFaviconService); </field> <field name="_placesAutocomplete" readonly="true"> - Components.classes["@mozilla.org/autocomplete/search;1?name=unifiedcomplete"] + Components.classes["@mozilla.org/autocomplete/search;1?name=history"] .getService(Components.interfaces.mozIPlacesAutoComplete); </field> <field name="mTabBox" readonly="true"> @@ -138,19 +138,19 @@ ]]></getter> </property> - <property name="formValidationAnchor" readonly="true"> + <property name="popupAnchor" readonly="true"> <getter><![CDATA[ - if (this.mCurrentTab._formValidationAnchor) { - return this.mCurrentTab._formValidationAnchor; + if (this.mCurrentTab._popupAnchor) { + return this.mCurrentTab._popupAnchor; } let stack = this.mCurrentBrowser.parentNode; - // Create an anchor for the form validation popup + // Create an anchor for the popup const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; - let formValidationAnchor = document.createElementNS(NS_XUL, "hbox"); - formValidationAnchor.className = "form-validation-anchor"; - formValidationAnchor.hidden = true; - stack.appendChild(formValidationAnchor); - return this.mCurrentTab._formValidationAnchor = formValidationAnchor; + let popupAnchor = document.createElementNS(NS_XUL, "hbox"); + popupAnchor.className = "popup-anchor"; + popupAnchor.hidden = true; + stack.appendChild(popupAnchor); + return this.mCurrentTab._popupAnchor = popupAnchor; ]]></getter> </property> @@ -1451,6 +1451,10 @@ b.setAttribute("autocompletepopup", this.getAttribute("autocompletepopup")); b.setAttribute("autoscrollpopup", this._autoScrollPopup.id); + if (this.hasAttribute("datetimepicker")) { + b.setAttribute("datetimepicker", this.getAttribute("datetimepicker")); + } + // Create the browserStack container var stack = document.createElementNS(NS_XUL, "stack"); stack.className = "browserStack"; diff --git a/application/palemoon/base/content/urlbarBindings.xml b/application/palemoon/base/content/urlbarBindings.xml index c99819f0d..6b4350f99 100644 --- a/application/palemoon/base/content/urlbarBindings.xml +++ b/application/palemoon/base/content/urlbarBindings.xml @@ -17,7 +17,7 @@ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:xbl="http://www.mozilla.org/xbl"> - <binding id="urlbar" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete"> + <binding id="urlbar" extends="chrome://browser/content/autocomplete.xml#autocomplete"> <content sizetopopup="pref"> <xul:hbox anonid="textbox-container" @@ -769,7 +769,7 @@ </binding> <!-- Note: this binding is applied to the autocomplete popup used in the Search bar and in web page content --> - <binding id="browser-autocomplete-result-popup" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete-result-popup"> + <binding id="browser-autocomplete-result-popup" extends="chrome://browser/content/autocomplete.xml#autocomplete-result-popup"> <implementation> <method name="openAutocompletePopup"> <parameter name="aInput"/> @@ -823,7 +823,7 @@ </implementation> </binding> - <binding id="urlbar-rich-result-popup" extends="chrome://global/content/bindings/autocomplete.xml#autocomplete-rich-result-popup"> + <binding id="urlbar-rich-result-popup" extends="chrome://browser/content/autocomplete.xml#autocomplete-rich-result-popup"> <implementation> <field name="_maxResults">0</field> @@ -1764,195 +1764,6 @@ </implementation> </binding> - <binding id="promobox"> - <content> - <xul:hbox class="panel-promo-box" align="start" flex="1"> - <xul:hbox align="center" flex="1"> - <xul:image class="panel-promo-icon"/> - <xul:description anonid="promo-message" class="panel-promo-message" flex="1"> - <xul:description anonid="promo-link" - class="plain text-link inline-link" - onclick="document.getBindingParent(this).onLinkClick();"/> - </xul:description> - </xul:hbox> - <xul:toolbarbutton class="panel-promo-closebutton close-icon" - oncommand="document.getBindingParent(this).onCloseButtonCommand();" - tooltiptext="&closeNotification.tooltip;"/> - </xul:hbox> - </content> - - <implementation implements="nsIDOMEventListener"> - <constructor><![CDATA[ - this._panel.addEventListener("popupshowing", this, false); - ]]></constructor> - - <destructor><![CDATA[ - this._panel.removeEventListener("popupshowing", this, false); - ]]></destructor> - - <field name="_panel" readonly="true"><![CDATA[ - let node = this.parentNode; - while(node && node.localName != "panel") { - node = node.parentNode; - } - node; - ]]></field> - <field name="_promomessage" readonly="true"> - document.getAnonymousElementByAttribute(this, "anonid", "promo-message"); - </field> - <field name="_promolink" readonly="true"> - document.getAnonymousElementByAttribute(this, "anonid", "promo-link"); - </field> - <field name="_brandBundle" readonly="true"> - Services.strings.createBundle("chrome://branding/locale/brand.properties"); - </field> - <property name="_viewsLeftMap"> - <getter><![CDATA[ - let viewsLeftMap = {}; - try { - viewsLeftMap = JSON.parse(Services.prefs.getCharPref("browser.syncPromoViewsLeftMap")); - } catch (ex) { - // If the old preference exists, migrate it to the new one. - try { - let oldPref = Services.prefs.getIntPref("browser.syncPromoViewsLeft"); - Services.prefs.clearUserPref("browser.syncPromoViewsLeft"); - viewsLeftMap.bookmarks = oldPref; - viewsLeftMap.passwords = oldPref; - Services.prefs.setCharPref("browser.syncPromoViewsLeftMap", - JSON.stringify(viewsLeftMap)); - } catch (ex2) {} - } - return viewsLeftMap; - ]]></getter> - </property> - <property name="_viewsLeft"> - <getter><![CDATA[ - let views = 5; - let map = this._viewsLeftMap; - if (this._notificationType in map) { - views = map[this._notificationType]; - } - return views; - ]]></getter> - <setter><![CDATA[ - let map = this._viewsLeftMap; - map[this._notificationType] = val; - Services.prefs.setCharPref("browser.syncPromoViewsLeftMap", - JSON.stringify(map)); - return val; - ]]></setter> - </property> - <property name="_notificationType"> - <getter><![CDATA[ - // Use the popupid attribute to identify the notification type, - // otherwise just rely on the panel id for common arrowpanels. - let type = this._panel.firstChild.getAttribute("popupid") || - this._panel.id; - if (type.startsWith("password-")) - return "passwords"; - if (type == "editBookmarkPanel") - return "bookmarks"; - if (type == "addon-install-complete") { - if (!Services.prefs.prefHasUserValue("services.sync.username")) - return "addons"; - if (!Services.prefs.getBoolPref("services.sync.engine.addons")) - return "addons-sync-disabled"; - } - return null; - ]]></getter> - </property> - <property name="_notificationMessage"> - <getter><![CDATA[ - return gNavigatorBundle.getFormattedString( - "syncPromoNotification." + this._notificationType + ".description", - [this._brandBundle.GetStringFromName("syncBrandShortName")] - ); - ]]></getter> - </property> - <property name="_notificationLink"> - <getter><![CDATA[ - if (this._notificationType == "addons-sync-disabled") { - return "https://forum.palemoon.org/viewforum.php?f=52"; - } - return "http://www.palemoon.org/sync/"; - ]]></getter> - </property> - <method name="onCloseButtonCommand"> - <body><![CDATA[ - this._viewsLeft = 0; - this.hidden = true; - ]]></body> - </method> - <method name="onLinkClick"> - <body><![CDATA[ - // Open a new selected tab and close the current panel. - gBrowser.loadOneTab(this._promolink.getAttribute("href"), - { inBackground: false }); - this._panel.hidePopup(); - ]]></body> - </method> - <method name="handleEvent"> - <parameter name="event"/> - <body><![CDATA[ - if (event.type != "popupshowing" || event.target != this._panel) - return; - - // A previous notification may have unhidden this. - this.hidden = true; - - // Only handle supported notification panels. - if (!this._notificationType) { - return; - } - - let viewsLeft = this._viewsLeft; - if (viewsLeft) { - // XXX: Short-circuit this for now. - // TO-DO: Clean up this code for sync promotion - this._viewsLeft = 0; - viewsLeft = 0; - return; - // XXX - - if (Services.prefs.prefHasUserValue("services.sync.username") && - this._notificationType != "addons-sync-disabled") { - // If the user has already setup Sync, don't show the notification. - this._viewsLeft = 0; - // Be sure to hide the panel, in case it was visible and the user - // decided to setup Sync after noticing it. - viewsLeft = 0; - // The panel is still hidden, just bail out. - return; - } - else { - this._viewsLeft = viewsLeft - 1; - } - - this._promolink.setAttribute("href", this._notificationLink); - this._promolink.value = gNavigatorBundle.getString("syncPromoNotification.learnMoreLinkText"); - - this.hidden = false; - - // HACK: The description element doesn't wrap correctly in panels, - // thus set a width on it, based on the available space, before - // setting its textContent. Then set its height as well, to - // fix wrong height calculation on Linux (bug 659578). - this._panel.addEventListener("popupshown", function panelShown() { - this._panel.removeEventListener("popupshown", panelShown, true); - // Previous popupShown events may close the panel or change - // its contents, so ensure this is still valid. - if (this._panel.state != "open" || !this._notificationType) - return; - this._promomessage.width = this._promomessage.getBoundingClientRect().width; - this._promomessage.firstChild.textContent = this._notificationMessage; - this._promomessage.height = this._promomessage.getBoundingClientRect().height; - }.bind(this), true); - } - ]]></body> - </method> - </implementation> - </binding> - <binding id="toolbarbutton-badged" display="xul:button" extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton"> <content> diff --git a/application/palemoon/base/jar.mn b/application/palemoon/base/jar.mn index 29896341e..fd2df79e1 100644 --- a/application/palemoon/base/jar.mn +++ b/application/palemoon/base/jar.mn @@ -108,6 +108,8 @@ browser.jar: * content/browser/sanitize.xul (content/sanitize.xul) * content/browser/sanitizeDialog.js (content/sanitizeDialog.js) content/browser/sanitizeDialog.css (content/sanitizeDialog.css) +* content/browser/autocomplete.css (content/autocomplete.css) +* content/browser/autocomplete.xml (content/autocomplete.xml) content/browser/tabbrowser.css (content/tabbrowser.css) * content/browser/tabbrowser.xml (content/tabbrowser.xml) * content/browser/urlbarBindings.xml (content/urlbarBindings.xml) diff --git a/application/palemoon/branding/official/pref/palemoon-branding.js b/application/palemoon/branding/official/pref/palemoon-branding.js index 4f5d196d7..8e8703fb7 100644 --- a/application/palemoon/branding/official/pref/palemoon-branding.js +++ b/application/palemoon/branding/official/pref/palemoon-branding.js @@ -8,6 +8,8 @@ pref("app.releaseNotesURL", "http://www.palemoon.org/releasenotes.shtml"); // Enable Firefox compatmode by default.
pref("general.useragent.compatMode", 2);
+pref("general.useragent.compatMode.gecko", true);
+pref("general.useragent.compatMode.firefox", true);
// ========================= updates ========================
#if defined(XP_WIN)
diff --git a/application/palemoon/branding/shared/branding.mozbuild b/application/palemoon/branding/shared/branding.mozbuild index fc832dbe7..284520add 100644 --- a/application/palemoon/branding/shared/branding.mozbuild +++ b/application/palemoon/branding/shared/branding.mozbuild @@ -38,13 +38,19 @@ def ApplicationBranding(): 'dsstore', 'firefox.icns', ] - elif CONFIG['MOZ_WIDGET_GTK']: + elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']: BRANDING_FILES += [ 'default16.png', 'default32.png', 'default48.png', 'mozicon128.png', ] + FINAL_TARGET_FILES.icons += ['mozicon128.png'] + FINAL_TARGET_FILES.chrome.icons.default += [ + 'default16.png', + 'default32.png', + 'default48.png', + ] DEFINES['MOZ_APP_VERSION'] = CONFIG['MOZ_APP_VERSION'] DEFINES['MOZ_BRANDING_DIRECTORY'] = CONFIG['MOZ_BRANDING_DIRECTORY'] diff --git a/application/palemoon/branding/unstable/pref/palemoon-branding.js b/application/palemoon/branding/unstable/pref/palemoon-branding.js index 4c088f76d..dda6f86a5 100644 --- a/application/palemoon/branding/unstable/pref/palemoon-branding.js +++ b/application/palemoon/branding/unstable/pref/palemoon-branding.js @@ -8,6 +8,8 @@ pref("app.releaseNotesURL", "http://www.palemoon.org/unstable/releasenotes.shtml // Enable Firefox compatmode by default.
pref("general.useragent.compatMode", 2);
+pref("general.useragent.compatMode.gecko", true);
+pref("general.useragent.compatMode.firefox", true);
// ========================= updates ========================
#if defined(XP_WIN)
diff --git a/application/palemoon/components/downloads/DownloadsCommon.jsm b/application/palemoon/components/downloads/DownloadsCommon.jsm index 0921f8400..c6614e780 100644 --- a/application/palemoon/components/downloads/DownloadsCommon.jsm +++ b/application/palemoon/components/downloads/DownloadsCommon.jsm @@ -104,7 +104,7 @@ const kPartialDownloadSuffix = ".part"; const kPrefBranch = Services.prefs.getBranch("browser.download."); -let PrefObserver = { +var PrefObserver = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]), getPref: function PO_getPref(name) { diff --git a/application/palemoon/components/downloads/content/contentAreaDownloadsView.js b/application/palemoon/components/downloads/content/contentAreaDownloadsView.js index 29e2e368c..fbb18ab04 100644 --- a/application/palemoon/components/downloads/content/contentAreaDownloadsView.js +++ b/application/palemoon/components/downloads/content/contentAreaDownloadsView.js @@ -4,7 +4,7 @@ Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); -let ContentAreaDownloadsView = { +var ContentAreaDownloadsView = { init: function CADV_init() { let view = new DownloadsPlacesView(document.getElementById("downloadsRichListBox")); // Do not display the Places downloads in private windows diff --git a/application/palemoon/components/nsBrowserGlue.js b/application/palemoon/components/nsBrowserGlue.js index cdb0b7522..225cddd52 100644 --- a/application/palemoon/components/nsBrowserGlue.js +++ b/application/palemoon/components/nsBrowserGlue.js @@ -35,6 +35,8 @@ Cu.import("resource://gre/modules/Services.jsm"); ["OS", "resource://gre/modules/osfile.jsm"], ["LoginManagerParent", "resource://gre/modules/LoginManagerParent.jsm"], ["FormValidationHandler", "resource:///modules/FormValidationHandler.jsm"], + ["AutoCompletePopup", "resource:///modules/AutoCompletePopup.jsm"], + ["DateTimePickerHelper", "resource://gre/modules/DateTimePickerHelper.jsm"], ].forEach(([name, resource]) => XPCOMUtils.defineLazyModuleGetter(this, name, resource)); const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser"; @@ -167,6 +169,7 @@ BrowserGlue.prototype = { } catch (e) { Cu.reportError("Could not end startup crash tracking in quit-application-granted: " + e); } + DateTimePickerHelper.uninit(); break; #ifdef OBSERVE_LASTWINDOW_CLOSE_TOPICS case "browser-lastwindow-close-requested": @@ -403,6 +406,8 @@ BrowserGlue.prototype = { #endif FormValidationHandler.init(); + AutoCompletePopup.init(); + LoginManagerParent.init(); Services.obs.notifyObservers(null, "browser-ui-startup-complete", ""); @@ -496,6 +501,8 @@ BrowserGlue.prototype = { } #endif + DateTimePickerHelper.init(); + this._trackSlowStartup(); }, @@ -511,6 +518,7 @@ BrowserGlue.prototype = { webrtcUI.uninit(); #endif FormValidationHandler.uninit(); + AutoCompletePopup.uninit(); this._dispose(); }, diff --git a/application/palemoon/components/places/BrowserPlaces.manifest b/application/palemoon/components/places/BrowserPlaces.manifest deleted file mode 100644 index 3b25f50f4..000000000 --- a/application/palemoon/components/places/BrowserPlaces.manifest +++ /dev/null @@ -1,2 +0,0 @@ -component {6bcb9bde-9018-4443-a071-c32653469597} PlacesProtocolHandler.js -contract @mozilla.org/network/protocol;1?name=place {6bcb9bde-9018-4443-a071-c32653469597} diff --git a/application/palemoon/components/places/PlacesProtocolHandler.js b/application/palemoon/components/places/PlacesProtocolHandler.js deleted file mode 100644 index ebffd2e28..000000000 --- a/application/palemoon/components/places/PlacesProtocolHandler.js +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * vim: sw=2 ts=2 sts=2 et - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -const Cc = Components.classes; -const Ci = Components.interfaces; - -Components.utils.import("resource://gre/modules/NetUtil.jsm"); -Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); - -const SCHEME = "place"; -const URL = "chrome://browser/content/places/content-ui/controller.xhtml"; - -function PlacesProtocolHandler() {} - -PlacesProtocolHandler.prototype = { - scheme: SCHEME, - defaultPort: -1, - protocolFlags: Ci.nsIProtocolHandler.URI_DANGEROUS_TO_LOAD | - Ci.nsIProtocolHandler.URI_IS_LOCAL_RESOURCE | - Ci.nsIProtocolHandler.URI_NORELATIVE | - Ci.nsIProtocolHandler.URI_NOAUTH, - - newURI: function PPH_newURI(aSpec, aOriginCharset, aBaseUri) { - let uri = Cc["@mozilla.org/network/simple-uri;1"].createInstance(Ci.nsIURI); - uri.spec = aSpec; - return uri; - }, - - newChannel: function PPH_newChannel(aUri) { - let chan = NetUtil.newChannel(URL); - chan.originalURI = aUri; - return chan; - }, - - allowPort: function PPH_allowPort(aPort, aScheme) { - return false; - }, - - QueryInterface: XPCOMUtils.generateQI([ - Ci.nsIProtocolHandler - ]), - - classID: Components.ID("{6bcb9bde-9018-4443-a071-c32653469597}") -}; - -this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PlacesProtocolHandler]); diff --git a/application/palemoon/components/places/content/controller.js b/application/palemoon/components/places/content/controller.js index 4d3773905..e2ae2afb0 100644 --- a/application/palemoon/components/places/content/controller.js +++ b/application/palemoon/components/places/content/controller.js @@ -1603,7 +1603,7 @@ PlacesController.prototype = { * the view that the item(s) have been dropped on was not necessarily active. * Drop functions are passed the view that is being dropped on. */ -let PlacesControllerDragHelper = { +var PlacesControllerDragHelper = { /** * DOM Element currently being dragged over */ diff --git a/application/palemoon/components/places/content/places.js b/application/palemoon/components/places/content/places.js index 9ecdfebe0..a94193823 100644 --- a/application/palemoon/components/places/content/places.js +++ b/application/palemoon/components/places/content/places.js @@ -1377,7 +1377,7 @@ var ViewMenu = { } } -let ContentArea = { +var ContentArea = { _specialViews: new Map(), init: function CA_init() { @@ -1511,7 +1511,7 @@ let ContentArea = { } }; -let ContentTree = { +var ContentTree = { init: function CT_init() { this._view = document.getElementById("placeContent"); }, diff --git a/application/palemoon/components/places/moz.build b/application/palemoon/components/places/moz.build index fc69beed9..2e35e1951 100644 --- a/application/palemoon/components/places/moz.build +++ b/application/palemoon/components/places/moz.build @@ -6,9 +6,5 @@ JAR_MANIFESTS += ['jar.mn'] -EXTRA_COMPONENTS += [ - 'BrowserPlaces.manifest', - 'PlacesProtocolHandler.js', -] EXTRA_JS_MODULES += [ 'PlacesUIUtils.jsm' ] diff --git a/application/palemoon/components/preferences/aboutPermissions.js b/application/palemoon/components/preferences/aboutPermissions.js index 106d45f89..31b48f88e 100644 --- a/application/palemoon/components/preferences/aboutPermissions.js +++ b/application/palemoon/components/preferences/aboutPermissions.js @@ -13,15 +13,15 @@ Cu.import("resource://gre/modules/AddonManager.jsm"); Cu.import("resource://gre/modules/NetUtil.jsm"); Cu.import("resource://gre/modules/ForgetAboutSite.jsm"); -let gFaviconService = Cc["@mozilla.org/browser/favicon-service;1"]. +var gFaviconService = Cc["@mozilla.org/browser/favicon-service;1"]. getService(Ci.nsIFaviconService); -let gPlacesDatabase = Cc["@mozilla.org/browser/nav-history-service;1"]. +var gPlacesDatabase = Cc["@mozilla.org/browser/nav-history-service;1"]. getService(Ci.nsPIPlacesDatabase). DBConnection. clone(true); -let gSitesStmt = gPlacesDatabase.createAsyncStatement( +var gSitesStmt = gPlacesDatabase.createAsyncStatement( "SELECT get_unreversed_host(rev_host) AS host " + "FROM moz_places " + "WHERE rev_host > '.' " + @@ -30,12 +30,12 @@ let gSitesStmt = gPlacesDatabase.createAsyncStatement( "ORDER BY MAX(frecency) DESC " + "LIMIT :limit"); -let gVisitStmt = gPlacesDatabase.createAsyncStatement( +var gVisitStmt = gPlacesDatabase.createAsyncStatement( "SELECT SUM(visit_count) AS count " + "FROM moz_places " + "WHERE rev_host = :rev_host"); -let gFlash = { +var gFlash = { name: "Shockwave Flash", betterName: "Adobe Flash", type: "application/x-shockwave-flash", @@ -290,7 +290,7 @@ Site.prototype = { * * Inspired by pageinfo/permissions.js */ -let PermissionDefaults = { +var PermissionDefaults = { UNKNOWN: Ci.nsIPermissionManager.UNKNOWN_ACTION, // 0 ALLOW: Ci.nsIPermissionManager.ALLOW_ACTION, // 1 DENY: Ci.nsIPermissionManager.DENY_ACTION, // 2 @@ -449,7 +449,7 @@ let PermissionDefaults = { /** * AboutPermissions manages the about:permissions page. */ -let AboutPermissions = { +var AboutPermissions = { /** * Maximum number of sites to return from the places database. */ diff --git a/application/palemoon/components/preferences/sanitize.js b/application/palemoon/components/preferences/sanitize.js index 893155e62..15e6f58f4 100644 --- a/application/palemoon/components/preferences/sanitize.js +++ b/application/palemoon/components/preferences/sanitize.js @@ -3,7 +3,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -let gSanitizeDialog = Object.freeze({ +var gSanitizeDialog = Object.freeze({ onClearHistoryChanged: function () { let downloadsPref = document.getElementById("privacy.clearOnShutdown.downloads"); let historyPref = document.getElementById("privacy.clearOnShutdown.history"); diff --git a/application/palemoon/components/preferences/sync.js b/application/palemoon/components/preferences/sync.js index 9c7f1aa1f..f29728dbf 100644 --- a/application/palemoon/components/preferences/sync.js +++ b/application/palemoon/components/preferences/sync.js @@ -9,7 +9,7 @@ const PAGE_NO_ACCOUNT = 0; const PAGE_HAS_ACCOUNT = 1; const PAGE_NEEDS_UPDATE = 2; -let gSyncPane = { +var gSyncPane = { _stringBundle: null, prefArray: ["engine.bookmarks", "engine.passwords", "engine.prefs", "engine.tabs", "engine.history"], diff --git a/application/palemoon/components/sessionstore/SessionStorage.jsm b/application/palemoon/components/sessionstore/SessionStorage.jsm index 192352c49..64aef35a5 100644 --- a/application/palemoon/components/sessionstore/SessionStorage.jsm +++ b/application/palemoon/components/sessionstore/SessionStorage.jsm @@ -38,7 +38,7 @@ this.SessionStorage = { Object.freeze(SessionStorage); -let DomStorage = { +var DomStorage = { /** * Reads all session storage data from the given docShell. * @param aDocShell @@ -142,7 +142,7 @@ let DomStorage = { } }; -let History = { +var History = { /** * Returns a given history entry's URI. * @param aHistory diff --git a/application/palemoon/components/sessionstore/SessionStore.jsm b/application/palemoon/components/sessionstore/SessionStore.jsm index 5e09ff5c8..f7c495be8 100644 --- a/application/palemoon/components/sessionstore/SessionStore.jsm +++ b/application/palemoon/components/sessionstore/SessionStore.jsm @@ -88,7 +88,7 @@ XPCOMUtils.defineLazyServiceGetter(this, "gScreenManager", // retrieved from a given docShell if not already collected before. // This is made so they're automatically in sync with all nsIDocShell.allow* // properties. -let gDocShellCapabilities = (function () { +var gDocShellCapabilities = (function () { let caps; return docShell => { @@ -247,7 +247,7 @@ this.SessionStore = { // Freeze the SessionStore object. We don't want anyone to modify it. Object.freeze(SessionStore); -let SessionStoreInternal = { +var SessionStoreInternal = { QueryInterface: XPCOMUtils.generateQI([ Ci.nsIDOMEventListener, Ci.nsIObserver, @@ -2404,7 +2404,7 @@ let SessionStoreInternal = { for (var [host, isPinned] in Iterator(internalWindow.hosts)) { let list; try { - list = Services.cookies.getCookiesFromHost(host); + list = Services.cookies.getCookiesFromHost(host, {}); } catch (ex) { debug("getCookiesFromHost failed. Host: " + host); @@ -3655,7 +3655,7 @@ let SessionStoreInternal = { try { Services.cookies.add(cookie.host, cookie.path || "", cookie.name || "", cookie.value, !!cookie.secure, !!cookie.httponly, true, - "expiry" in cookie ? cookie.expiry : MAX_EXPIRY); + "expiry" in cookie ? cookie.expiry : MAX_EXPIRY, {}); } catch (ex) { Cu.reportError(ex); } // don't let a single cookie stop recovering } @@ -4471,7 +4471,7 @@ let SessionStoreInternal = { * pinned, visible and hidden tabs in that and FIFO order. Hidden tabs are only * restored with restore_hidden_tabs=true. */ -let TabRestoreQueue = { +var TabRestoreQueue = { // The separate buckets used to store tabs. tabs: {priority: [], visible: [], hidden: []}, @@ -4608,7 +4608,7 @@ let TabRestoreQueue = { // A map storing a closed window's state data until it goes aways (is GC'ed). // This ensures that API clients can still read (but not write) states of // windows they still hold a reference to but we don't. -let DyingWindowCache = { +var DyingWindowCache = { _data: new WeakMap(), has: function (window) { @@ -4631,7 +4631,7 @@ let DyingWindowCache = { // A set of tab attributes to persist. We will read a given list of tab // attributes when collecting tab data and will re-set those attributes when // the given tab data is restored to a new tab. -let TabAttributes = { +var TabAttributes = { _attrs: new Set(), // We never want to directly read or write those attributes. @@ -4677,7 +4677,7 @@ let TabAttributes = { // This is used to help meter the number of restoring tabs. This is the control // point for telling the next tab to restore. It gets attached to each gBrowser // via gBrowser.addTabsProgressListener -let gRestoreTabsProgressListener = { +var gRestoreTabsProgressListener = { onStateChange: function(aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) { // Ignore state changes on browsers that we've already restored and state // changes that aren't applicable. diff --git a/application/palemoon/components/sessionstore/_SessionFile.jsm b/application/palemoon/components/sessionstore/_SessionFile.jsm index 9d40b9cca..62b4d1687 100644 --- a/application/palemoon/components/sessionstore/_SessionFile.jsm +++ b/application/palemoon/components/sessionstore/_SessionFile.jsm @@ -130,7 +130,7 @@ const TaskUtils = { } }; -let SessionFileInternal = { +var SessionFileInternal = { /** * A promise fulfilled once initialization is complete */ diff --git a/application/palemoon/components/sessionstore/nsSessionStartup.js b/application/palemoon/components/sessionstore/nsSessionStartup.js index 7f07e9050..04037c10e 100644 --- a/application/palemoon/components/sessionstore/nsSessionStartup.js +++ b/application/palemoon/components/sessionstore/nsSessionStartup.js @@ -50,7 +50,7 @@ function debug(aMsg) { Services.console.logStringMessage(aMsg); } -let gOnceInitializedDeferred = Promise.defer(); +var gOnceInitializedDeferred = Promise.defer(); /* :::::::: The Service ::::::::::::::: */ diff --git a/application/palemoon/components/shell/ShellService.jsm b/application/palemoon/components/shell/ShellService.jsm index 12e275bdb..74632b692 100644 --- a/application/palemoon/components/shell/ShellService.jsm +++ b/application/palemoon/components/shell/ShellService.jsm @@ -17,7 +17,7 @@ XPCOMUtils.defineLazyModuleGetter(this, "WindowsRegistry", /** * Internal functionality to save and restore the docShell.allow* properties. */ -let ShellServiceInternal = { +var ShellServiceInternal = { /** * Used to determine whether or not to offer "Set as desktop background" * functionality. Even if shell service is available it is not diff --git a/application/palemoon/configure.in b/application/palemoon/configure.in index df5fb98a1..0dbb0d8bc 100644 --- a/application/palemoon/configure.in +++ b/application/palemoon/configure.in @@ -7,10 +7,10 @@ dnl file, You can obtain one at http://mozilla.org/MPL/2.0/. dnl Things we need to carry from confvars.sh AC_DEFINE(MOZ_PHOENIX) AC_SUBST(MOZ_PHOENIX) - AC_DEFINE(MC_PALEMOON) AC_SUBST(MC_PALEMOON) - +AC_DEFINE(MOZ_PHOENIX_EXTENSIONS) +AC_SUBST(MOZ_PHOENIX_EXTENSIONS) dnl Optional parts of the build. diff --git a/application/palemoon/fonts/moz.build b/application/palemoon/fonts/moz.build index 314d41bd0..02c027c46 100644 --- a/application/palemoon/fonts/moz.build +++ b/application/palemoon/fonts/moz.build @@ -4,7 +4,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -if CONFIG['OS_ARCH'] in ('WINNT'): +if CONFIG['OS_ARCH'] in ('WINNT', 'Linux'): DIST_SUBDIR = '' FINAL_TARGET_FILES.fonts += [ 'TwemojiMozilla.ttf' diff --git a/application/palemoon/installer/Makefile.in b/application/palemoon/installer/Makefile.in index 7ba8ae9e8..368b16efc 100644 --- a/application/palemoon/installer/Makefile.in +++ b/application/palemoon/installer/Makefile.in @@ -34,9 +34,9 @@ ifdef MOZ_ENABLE_GNOME_COMPONENT DEFINES += -DMOZ_ENABLE_GNOME_COMPONENT=1 endif -ifdef MOZ_WIDGET_GTK +ifneq (,$(filter gtk%,$(MOZ_WIDGET_TOOLKIT))) DEFINES += -DMOZ_GTK=1 -ifdef MOZ_ENABLE_GTK3 +ifeq ($(MOZ_WIDGET_TOOLKIT),gtk3) DEFINES += -DMOZ_GTK3=1 endif endif @@ -65,18 +65,14 @@ endif DEFINES += -DMOZ_CHILD_PROCESS_NAME=$(MOZ_CHILD_PROCESS_NAME) # Set MSVC dlls version to package, if any. -ifdef WIN32_REDIST_DIR ifdef MOZ_NO_DEBUG_RTL +ifdef WIN32_REDIST_DIR DEFINES += -DMOZ_PACKAGE_MSVC_DLLS=1 DEFINES += -DMSVC_C_RUNTIME_DLL=$(MSVC_C_RUNTIME_DLL) DEFINES += -DMSVC_CXX_RUNTIME_DLL=$(MSVC_CXX_RUNTIME_DLL) -DEFINES += -DMSVC_OPENMP_DLL=$(MSVC_OPENMP_DLL) -ifdef MSVC_APPCRT_DLL -DEFINES += -DMSVC_APPCRT_DLL=$(MSVC_APPCRT_DLL) -endif -ifdef MSVC_DESKTOPCRT_DLL -DEFINES += -DMSVC_DESKTOPCRT_DLL=$(MSVC_DESKTOPCRT_DLL) endif +ifdef WIN_UCRT_REDIST_DIR +DEFINES += -DMOZ_PACKAGE_WIN_UCRT_DLLS=1 endif endif @@ -135,16 +131,17 @@ AB = $(firstword $(subst -, ,$(AB_CD))) DEFINES += -DAB=$(AB) DEFINES += -DMOZ_ICU_VERSION=$(MOZ_ICU_VERSION) -ifdef MOZ_NATIVE_ICU -DEFINES += -DMOZ_NATIVE_ICU +ifdef MOZ_SYSTEM_ICU +DEFINES += -DMOZ_SYSTEM_ICU endif -ifdef MOZ_SHARED_ICU -DEFINES += -DMOZ_SHARED_ICU +ifdef MOZ_ICU_DATA_ARCHIVE +DEFINES += -DMOZ_ICU_DATA_ARCHIVE endif ifdef MOZ_JEMALLOC3 DEFINES += -DMOZ_JEMALLOC3 endif DEFINES += -DMOZ_ICU_DBG_SUFFIX=$(MOZ_ICU_DBG_SUFFIX) +DEFINES += -DICU_DATA_FILE=$(ICU_DATA_FILE) ifdef CLANG_CXX DEFINES += -DCLANG_CXX endif @@ -161,7 +158,7 @@ endif libs:: - $(MAKE) -C $(DEPTH)/browser/locales langpack + $(MAKE) -C $(DEPTH)/application/palemoon/locales langpack ifeq (WINNT,$(OS_ARCH)) PKGCOMP_FIND_OPTS = diff --git a/application/palemoon/installer/package-manifest.in b/application/palemoon/installer/package-manifest.in index ffe033596..f7b12838b 100644 --- a/application/palemoon/installer/package-manifest.in +++ b/application/palemoon/installer/package-manifest.in @@ -35,10 +35,11 @@ #ifdef XP_MACOSX ; Mac bundle stuff @APPNAME@/Contents/Info.plist +@APPNAME@/Contents/Library/LaunchServices @APPNAME@/Contents/PkgInfo @RESPATH@/firefox.icns @RESPATH@/document.icns -@RESPATH@/@AB@.lproj/* +@RESPATH@/@LPROJ_ROOT@.lproj/* #endif [@AB_CD@] @@ -51,14 +52,14 @@ @RESPATH@/browser/defaults/profile/localstore.rdf @RESPATH@/browser/defaults/profile/mimeTypes.rdf @RESPATH@/dictionaries/* -#if defined(XP_WIN) +#if defined(XP_WIN) || defined(XP_LINUX) @RESPATH@/fonts/* #endif @RESPATH@/hyphenation/* @RESPATH@/browser/@PREF_DIR@/palemoon-l10n.js @RESPATH@/browser/searchplugins/* -#ifdef XP_WIN32 -@RESPATH@/uninstall/helper.exe +#ifdef HAVE_MAKENSISU +@BINPATH@/uninstall/helper.exe #endif #ifdef MOZ_UPDATER @RESPATH@/update.locale @@ -67,10 +68,6 @@ [xpcom] @RESPATH@/dependentlibs.list -#ifdef GKMEDIAS_SHARED_LIBRARY -@BINPATH@/@DLL_PREFIX@gkmedias@DLL_SUFFIX@ -#endif -@BINPATH@/@DLL_PREFIX@mozalloc@DLL_SUFFIX@ #ifdef MOZ_SHARED_MOZGLUE @BINPATH@/@DLL_PREFIX@mozglue@DLL_SUFFIX@ #endif @@ -80,7 +77,7 @@ #ifdef MOZ_DMD @BINPATH@/@DLL_PREFIX@dmd@DLL_SUFFIX@ #endif -#ifndef MOZ_NATIVE_NSPR +#ifndef MOZ_SYSTEM_NSPR #ifndef MOZ_FOLD_LIBS @BINPATH@/@DLL_PREFIX@nspr4@DLL_SUFFIX@ @BINPATH@/@DLL_PREFIX@plc4@DLL_SUFFIX@ @@ -100,60 +97,32 @@ #endif #ifdef XP_WIN32 @BINPATH@/plugin-hang-ui@BIN_SUFFIX@ -#ifdef MOZ_PACKAGE_MSVC_DLLS +#if MOZ_PACKAGE_MSVC_DLLS @BINPATH@/@MSVC_C_RUNTIME_DLL@ @BINPATH@/@MSVC_CXX_RUNTIME_DLL@ -@BINPATH@/@MSVC_OPENMP_DLL@ -#ifdef MSVC_APPCRT_DLL -@BINPATH@/@MSVC_APPCRT_DLL@ -#endif -#ifdef MSVC_DESKTOPCRT_DLL -@BINPATH@/@MSVC_DESKTOPCRT_DLL@ -#endif -#endif -#endif -#ifndef MOZ_NATIVE_ICU -#ifdef MOZ_SHARED_ICU -#ifdef XP_WIN -#ifdef MOZ_DEBUG -@BINPATH@/icudt@MOZ_ICU_DBG_SUFFIX@@MOZ_ICU_VERSION@.dll -@BINPATH@/icuin@MOZ_ICU_DBG_SUFFIX@@MOZ_ICU_VERSION@.dll -@BINPATH@/icuuc@MOZ_ICU_DBG_SUFFIX@@MOZ_ICU_VERSION@.dll -#else -@BINPATH@/icudt@MOZ_ICU_VERSION@.dll -@BINPATH@/icuin@MOZ_ICU_VERSION@.dll -@BINPATH@/icuuc@MOZ_ICU_VERSION@.dll #endif -#elif defined(XP_MACOSX) -@BINPATH@/libicudata.@MOZ_ICU_VERSION@.dylib -@BINPATH@/libicui18n.@MOZ_ICU_VERSION@.dylib -@BINPATH@/libicuuc.@MOZ_ICU_VERSION@.dylib -#elif defined(XP_UNIX) -@BINPATH@/libicudata.so.@MOZ_ICU_VERSION@ -@BINPATH@/libicui18n.so.@MOZ_ICU_VERSION@ -@BINPATH@/libicuuc.so.@MOZ_ICU_VERSION@ +#if MOZ_PACKAGE_WIN_UCRT_DLLS +@BINPATH@/api-ms-win-*.dll +@BINPATH@/ucrtbase.dll #endif #endif -#endif -#ifdef MOZ_REPLACE_MALLOC -#ifndef MOZ_JEMALLOC3 -@BINPATH@/@DLL_PREFIX@replace_jemalloc@DLL_SUFFIX@ -#endif +#ifdef MOZ_ICU_DATA_ARCHIVE +@RESPATH@/@ICU_DATA_FILE@ #endif #ifdef MOZ_GTK3 @BINPATH@/@DLL_PREFIX@mozgtk@DLL_SUFFIX@ -@BINPATH@/@DLL_PREFIX@mozgtk2@DLL_SUFFIX@ +@BINPATH@/gtk2/@DLL_PREFIX@mozgtk@DLL_SUFFIX@ #endif [browser] ; [Base Browser Files] #ifndef XP_UNIX @BINPATH@/@MOZ_APP_NAME@.exe -@BINPATH@/palemoon.VisualElementsManifest.xml +@BINPATH@/@MOZ_APP_NAME@.VisualElementsManifest.xml @BINPATH@/browser/VisualElements/VisualElements_150.png @BINPATH@/browser/VisualElements/VisualElements_70.png #else -@RESPATH@/@MOZ_APP_NAME@-bin +@BINPATH@/@MOZ_APP_NAME@-bin @BINPATH@/@MOZ_APP_NAME@ #endif @RESPATH@/application.ini @@ -161,490 +130,67 @@ @RESPATH@/update-settings.ini #endif @RESPATH@/platform.ini -#ifndef MOZ_NATIVE_SQLITE +#ifndef MOZ_SYSTEM_SQLITE #ifndef MOZ_FOLD_LIBS @BINPATH@/@DLL_PREFIX@mozsqlite3@DLL_SUFFIX@ #endif #endif +@BINPATH@/@DLL_PREFIX@lgpllibs@DLL_SUFFIX@ +#ifdef MOZ_FFVPX +@BINPATH@/@DLL_PREFIX@mozavutil@DLL_SUFFIX@ +@BINPATH@/@DLL_PREFIX@mozavcodec@DLL_SUFFIX@ +#endif @RESPATH@/browser/blocklist.xml #ifdef XP_UNIX #ifndef XP_MACOSX @RESPATH@/run-mozilla.sh #endif #endif +#ifdef XP_WIN +#ifdef _AMD64_ +@BINPATH@/@DLL_PREFIX@qipcap64@DLL_SUFFIX@ +#else +@BINPATH@/@DLL_PREFIX@qipcap@DLL_SUFFIX@ +#endif +#endif ; [Components] -@RESPATH@/browser/components/components.manifest -@RESPATH@/components/alerts.xpt +@RESPATH@/components/* +@RESPATH@/browser/components/* +#ifdef MOZ_ARTIFACT_BUILDS +#endif #ifdef ACCESSIBILITY #ifdef XP_WIN32 +@BINPATH@/Accessible.tlb @BINPATH@/AccessibleMarshal.dll +@BINPATH@/IA2Marshal.dll +#endif #endif -@RESPATH@/components/accessibility.xpt -#endif -@RESPATH@/components/appshell.xpt -@RESPATH@/components/appstartup.xpt -@RESPATH@/components/autocomplete.xpt -@RESPATH@/components/autoconfig.xpt -@RESPATH@/components/browser-element.xpt -@RESPATH@/browser/components/browsercompsbase.xpt -@RESPATH@/browser/components/browser-feeds.xpt -@RESPATH@/components/caps.xpt -@RESPATH@/components/chrome.xpt -@RESPATH@/components/commandhandler.xpt -@RESPATH@/components/commandlines.xpt -@RESPATH@/components/compartments.xpt -@RESPATH@/components/composer.xpt -@RESPATH@/components/content_events.xpt -@RESPATH@/components/content_html.xpt -@RESPATH@/components/content_goannamediaplugins.xpt #ifdef MOZ_WEBRTC -@RESPATH@/components/content_webrtc.xpt -#endif -@RESPATH@/components/content_xslt.xpt -@RESPATH@/components/cookie.xpt -@RESPATH@/components/devtools_security.xpt -@RESPATH@/components/directory.xpt -@RESPATH@/components/docshell.xpt -@RESPATH@/components/dom.xpt -#ifdef MOZ_ACTIVITIES -@RESPATH@/components/dom_activities.xpt -@RESPATH@/components/dom_messages.xpt -#endif -@RESPATH@/components/dom_apps.xpt -@RESPATH@/components/dom_base.xpt -@RESPATH@/components/dom_system.xpt -#ifdef MOZ_B2G_BT -@RESPATH@/components/dom_bluetooth.xpt -#endif -@RESPATH@/components/dom_canvas.xpt -@RESPATH@/components/dom_alarm.xpt -@RESPATH@/components/dom_core.xpt -@RESPATH@/components/dom_css.xpt -@RESPATH@/components/dom_devicestorage.xpt -@RESPATH@/components/dom_events.xpt -@RESPATH@/components/dom_geolocation.xpt -@RESPATH@/components/dom_media.xpt -@RESPATH@/components/dom_network.xpt -@RESPATH@/components/dom_notification.xpt -@RESPATH@/components/dom_html.xpt -@RESPATH@/components/dom_offline.xpt -@RESPATH@/components/dom_json.xpt -@RESPATH@/components/dom_power.xpt -@RESPATH@/components/dom_quota.xpt -@RESPATH@/components/dom_range.xpt -@RESPATH@/components/dom_security.xpt -@RESPATH@/components/dom_settings.xpt -@RESPATH@/components/dom_permissionsettings.xpt -@RESPATH@/components/dom_sidebar.xpt -@RESPATH@/components/dom_cellbroadcast.xpt -@RESPATH@/components/dom_mobilemessage.xpt -@RESPATH@/components/dom_storage.xpt -@RESPATH@/components/dom_stylesheets.xpt -@RESPATH@/components/dom_telephony.xpt -@RESPATH@/components/dom_traversal.xpt -@RESPATH@/components/dom_tv.xpt -@RESPATH@/components/dom_voicemail.xpt +#endif #ifdef MOZ_WEBSPEECH -@RESPATH@/components/dom_webspeechrecognition.xpt -#endif -@RESPATH@/components/dom_workers.xpt -@RESPATH@/components/dom_xbl.xpt -@RESPATH@/components/dom_xpath.xpt -@RESPATH@/components/dom_xul.xpt -#ifdef MOZ_GAMEPAD -@RESPATH@/components/dom_gamepad.xpt -#endif -#ifdef MOZ_PAY -@RESPATH@/components/dom_payment.xpt -#endif -@RESPATH@/components/dom_presentation.xpt -@RESPATH@/components/downloads.xpt -@RESPATH@/components/editor.xpt -@RESPATH@/components/embed_base.xpt -@RESPATH@/components/extensions.xpt -@RESPATH@/components/exthandler.xpt -@RESPATH@/components/exthelper.xpt -@RESPATH@/components/fastfind.xpt -@RESPATH@/components/feeds.xpt -#ifdef MOZ_GTK -@RESPATH@/components/filepicker.xpt -#endif -@RESPATH@/components/find.xpt -@RESPATH@/browser/components/fuel.xpt -@RESPATH@/components/gfx.xpt -@RESPATH@/components/html5.xpt -@RESPATH@/components/htmlparser.xpt -@RESPATH@/components/identity.xpt -@RESPATH@/components/imglib2.xpt -@RESPATH@/components/inspector.xpt -@RESPATH@/components/intl.xpt -@RESPATH@/components/jar.xpt -@RESPATH@/components/jsdebugger.xpt -@RESPATH@/components/jsdownloads.xpt -@RESPATH@/browser/components/jsinspector.xpt -@RESPATH@/components/layout_base.xpt - -#ifdef NS_PRINTING -@RESPATH@/components/layout_printing.xpt -#endif -@RESPATH@/components/layout_xul_tree.xpt -@RESPATH@/components/layout_xul.xpt -@RESPATH@/components/locale.xpt -@RESPATH@/components/lwbrk.xpt -@RESPATH@/browser/components/migration.xpt -@RESPATH@/components/mimetype.xpt -@RESPATH@/components/mozfind.xpt -@RESPATH@/components/necko_about.xpt -@RESPATH@/components/necko_cache.xpt -@RESPATH@/components/necko_cache2.xpt -@RESPATH@/components/necko_cookie.xpt -@RESPATH@/components/necko_dns.xpt -@RESPATH@/components/necko_file.xpt -@RESPATH@/components/necko_ftp.xpt -@RESPATH@/components/necko_http.xpt -@RESPATH@/components/necko_res.xpt -@RESPATH@/components/necko_socket.xpt -@RESPATH@/components/necko_strconv.xpt -@RESPATH@/components/necko_viewsource.xpt -@RESPATH@/components/necko_websocket.xpt -#ifdef NECKO_WIFI -@RESPATH@/components/necko_wifi.xpt #endif -@RESPATH@/components/necko_wyciwyg.xpt -@RESPATH@/components/necko.xpt -@RESPATH@/components/loginmgr.xpt -@RESPATH@/components/parentalcontrols.xpt -#ifdef MOZ_WEBRTC -@RESPATH@/components/peerconnection.xpt -#endif -@RESPATH@/components/places.xpt -@RESPATH@/components/plugin.xpt -@RESPATH@/components/pref.xpt -@RESPATH@/components/prefetch.xpt -@RESPATH@/components/profiler.xpt -@RESPATH@/components/rdf.xpt -@RESPATH@/components/satchel.xpt -@RESPATH@/components/saxparser.xpt -@RESPATH@/browser/components/sessionstore.xpt -@RESPATH@/components/services-crypto-component.xpt -#ifdef MOZ_CAPTIVEDETECT -@RESPATH@/components/captivedetect.xpt -#endif -@RESPATH@/browser/components/shellservice.xpt -#ifdef MOZ_BROWSER_STATUSBAR -@RESPATH@/browser/components/status4evar.xpt -#endif -@RESPATH@/components/shistory.xpt -@RESPATH@/components/spellchecker.xpt -@RESPATH@/components/storage.xpt -@RESPATH@/components/toolkit_asyncshutdown.xpt -@RESPATH@/components/toolkit_filewatcher.xpt -@RESPATH@/components/toolkit_finalizationwitness.xpt -@RESPATH@/components/toolkit_formautofill.xpt -@RESPATH@/components/toolkit_osfile.xpt -@RESPATH@/components/toolkit_xulstore.xpt -@RESPATH@/components/toolkitprofile.xpt -#ifdef MOZ_ENABLE_XREMOTE -@RESPATH@/components/toolkitremote.xpt -#endif -@RESPATH@/components/txtsvc.xpt -@RESPATH@/components/txmgr.xpt -@RESPATH@/components/uconv.xpt -@RESPATH@/components/unicharutil.xpt -@RESPATH@/components/update.xpt -@RESPATH@/components/uriloader.xpt -@RESPATH@/components/urlformatter.xpt -@RESPATH@/components/webBrowser_core.xpt -@RESPATH@/components/webbrowserpersist.xpt -@RESPATH@/components/widget.xpt -#ifdef XP_MACOSX -@RESPATH@/components/widget_cocoa.xpt -#endif -@RESPATH@/components/windowds.xpt -@RESPATH@/components/windowwatcher.xpt -@RESPATH@/components/xpcom_base.xpt -@RESPATH@/components/xpcom_system.xpt -@RESPATH@/components/xpcom_components.xpt -@RESPATH@/components/xpcom_ds.xpt -@RESPATH@/components/xpcom_io.xpt -@RESPATH@/components/xpcom_threads.xpt -@RESPATH@/components/xpcom_xpti.xpt -@RESPATH@/components/xpconnect.xpt -@RESPATH@/components/xulapp.xpt -@RESPATH@/components/xul.xpt -@RESPATH@/components/xultmpl.xpt -@RESPATH@/components/zipwriter.xpt -@RESPATH@/components/telemetry.xpt - -; JavaScript components -@RESPATH@/components/ChromeNotifications.js -@RESPATH@/components/ChromeNotifications.manifest -@RESPATH@/components/ConsoleAPI.manifest -@RESPATH@/components/ConsoleAPIStorage.js -@RESPATH@/components/BrowserElementParent.manifest -@RESPATH@/components/BrowserElementParent.js -@RESPATH@/components/FeedProcessor.manifest -@RESPATH@/components/FeedProcessor.js -@RESPATH@/browser/components/BrowserFeeds.manifest -@RESPATH@/browser/components/FeedConverter.js -@RESPATH@/browser/components/FeedWriter.js -@RESPATH@/browser/components/fuelApplication.manifest -@RESPATH@/browser/components/fuelApplication.js -@RESPATH@/browser/components/WebContentConverter.js -@RESPATH@/browser/components/BrowserComponents.manifest -@RESPATH@/browser/components/nsBrowserContentHandler.js -@RESPATH@/browser/components/nsBrowserGlue.js -@RESPATH@/browser/components/nsSetDefaultBrowser.manifest -@RESPATH@/browser/components/nsSetDefaultBrowser.js -@RESPATH@/browser/components/BrowserDownloads.manifest -@RESPATH@/browser/components/DownloadsStartup.js -@RESPATH@/browser/components/DownloadsUI.js -@RESPATH@/browser/components/BrowserPlaces.manifest -@RESPATH@/components/Downloads.manifest -@RESPATH@/components/DownloadLegacy.js -@RESPATH@/components/BrowserPageThumbs.manifest -@RESPATH@/components/crashmonitor.manifest -@RESPATH@/components/nsCrashMonitor.js -@RESPATH@/components/SiteSpecificUserAgent.js -@RESPATH@/components/SiteSpecificUserAgent.manifest -@RESPATH@/components/toolkitsearch.manifest -@RESPATH@/components/nsSearchService.js -@RESPATH@/components/nsSearchSuggestions.js -@RESPATH@/components/nsSidebar.js -@RESPATH@/components/passwordmgr.manifest -@RESPATH@/components/nsLoginInfo.js -@RESPATH@/components/nsLoginManager.js -@RESPATH@/components/nsLoginManagerPrompter.js -@RESPATH@/components/storage-json.js -@RESPATH@/components/crypto-SDR.js -@RESPATH@/components/jsconsole-clhandler.manifest -@RESPATH@/components/jsconsole-clhandler.js -#ifdef MOZ_DEVTOOLS -@RESPATH@/browser/components/devtools-startup.manifest -@RESPATH@/browser/components/devtools-startup.js -#endif -@RESPATH@/components/webvtt.xpt -@RESPATH@/components/WebVTT.manifest -@RESPATH@/components/WebVTTParserWrapper.js #ifdef MOZ_GTK -@RESPATH@/components/nsFilePicker.manifest -@RESPATH@/components/nsFilePicker.js -#endif -@RESPATH@/components/nsHelperAppDlg.manifest -@RESPATH@/components/nsHelperAppDlg.js -@RESPATH@/components/NetworkGeolocationProvider.manifest -@RESPATH@/components/NetworkGeolocationProvider.js -@RESPATH@/components/extensions.manifest -@RESPATH@/components/addonManager.js -@RESPATH@/components/amContentHandler.js -@RESPATH@/components/amInstallTrigger.js -@RESPATH@/components/amWebInstallListener.js -@RESPATH@/components/nsBlocklistService.js -#ifdef MOZ_UPDATER -@RESPATH@/components/nsUpdateService.manifest -@RESPATH@/components/nsUpdateService.js -@RESPATH@/components/nsUpdateServiceStub.js -#endif -@RESPATH@/components/nsUpdateTimerManager.manifest -@RESPATH@/components/nsUpdateTimerManager.js -@RESPATH@/components/addoncompat.manifest -@RESPATH@/components/multiprocessShims.js -@RESPATH@/components/remoteTagService.js -@RESPATH@/components/pluginGlue.manifest -@RESPATH@/components/ProcessSingleton.manifest -@RESPATH@/components/MainProcessSingleton.js -@RESPATH@/components/ContentProcessSingleton.js -@RESPATH@/browser/components/nsSessionStore.manifest -@RESPATH@/browser/components/nsSessionStartup.js -@RESPATH@/browser/components/nsSessionStore.js -@RESPATH@/components/nsURLFormatter.manifest -@RESPATH@/components/nsURLFormatter.js -@RESPATH@/browser/components/@DLL_PREFIX@browsercomps@DLL_SUFFIX@ -@RESPATH@/components/txEXSLTRegExFunctions.manifest -@RESPATH@/components/txEXSLTRegExFunctions.js -@RESPATH@/components/toolkitplaces.manifest -@RESPATH@/components/nsLivemarkService.js -@RESPATH@/components/nsTaggingService.js -@RESPATH@/components/nsPlacesAutoComplete.manifest -@RESPATH@/components/nsPlacesAutoComplete.js -@RESPATH@/components/UnifiedComplete.manifest -@RESPATH@/components/UnifiedComplete.js -@RESPATH@/components/nsPlacesExpiration.js -@RESPATH@/browser/components/PlacesProtocolHandler.js -@RESPATH@/components/PlacesCategoriesStarter.js -@RESPATH@/components/ColorAnalyzer.js -@RESPATH@/components/PageThumbsProtocol.js -@RESPATH@/components/nsDefaultCLH.manifest -@RESPATH@/components/nsDefaultCLH.js -@RESPATH@/components/nsContentPrefService.manifest -@RESPATH@/components/nsContentPrefService.js -@RESPATH@/components/nsContentDispatchChooser.manifest -@RESPATH@/components/nsContentDispatchChooser.js -@RESPATH@/components/nsHandlerService.manifest -@RESPATH@/components/nsHandlerService.js -@RESPATH@/components/nsWebHandlerApp.manifest -@RESPATH@/components/nsWebHandlerApp.js -@RESPATH@/components/satchel.manifest -@RESPATH@/components/nsFormAutoComplete.js -@RESPATH@/components/nsFormHistory.js -@RESPATH@/components/FormHistoryStartup.js -@RESPATH@/components/nsInputListAutoComplete.js -@RESPATH@/components/formautofill.manifest -@RESPATH@/components/FormAutofillContentService.js -@RESPATH@/components/FormAutofillStartup.js -@RESPATH@/components/contentAreaDropListener.manifest -@RESPATH@/components/contentAreaDropListener.js -@RESPATH@/browser/components/BrowserProfileMigrators.manifest -@RESPATH@/browser/components/ProfileMigrator.js -@RESPATH@/browser/components/ChromeProfileMigrator.js -@RESPATH@/browser/components/FirefoxProfileMigrator.js -#ifdef MOZ_BROWSER_STATUSBAR -@RESPATH@/browser/components/status4evar.js -@RESPATH@/browser/components/status4evar.manifest #endif -#ifdef XP_WIN -@RESPATH@/browser/components/IEProfileMigrator.js -@RESPATH@/browser/components/SafariProfileMigrator.js +#ifdef NS_PRINTING #endif -#ifdef XP_MACOSX -@RESPATH@/browser/components/SafariProfileMigrator.js -#endif -#ifdef MOZ_ENABLE_DBUS -@RESPATH@/components/@DLL_PREFIX@dbusservice@DLL_SUFFIX@ -#endif -#ifdef MOZ_ENABLE_GNOME_COMPONENT -@RESPATH@/components/@DLL_PREFIX@mozgnome@DLL_SUFFIX@ -#endif -#ifdef MOZ_ENABLE_GNOMEVFS -@RESPATH@/components/@DLL_PREFIX@nkgnomevfs@DLL_SUFFIX@ -#endif -#if defined(MOZ_ENABLE_DBUS) || defined(MOZ_ENABLE_GNOME_COMPONENT) || defined(MOZ_ENABLE_GNOMEVFS) -@RESPATH@/components/components.manifest -#endif -@RESPATH@/components/nsINIProcessor.manifest -@RESPATH@/components/nsINIProcessor.js -@RESPATH@/components/nsPrompter.manifest -@RESPATH@/components/nsPrompter.js -#ifdef MOZ_DATA_REPORTING -@RESPATH@/components/DataReporting.manifest -@RESPATH@/components/DataReportingService.js -#endif -#ifdef MOZ_SERVICES_HEALTHREPORT -@RESPATH@/components/HealthReportComponents.manifest -@RESPATH@/browser/components/SelfSupportService.manifest -@RESPATH@/browser/components/SelfSupportService.js -#endif -#ifdef MOZ_SERVICES_SYNC -@RESPATH@/components/SyncComponents.manifest -@RESPATH@/components/Weave.js -#endif -#ifdef MOZ_CAPTIVEDETECT -@RESPATH@/components/CaptivePortalDetectComponents.manifest -@RESPATH@/components/captivedetect.js -#endif -@RESPATH@/components/servicesComponents.manifest -@RESPATH@/components/cryptoComponents.manifest -@RESPATH@/components/TelemetryStartup.js -@RESPATH@/components/TelemetryStartup.manifest -@RESPATH@/components/XULStore.js -@RESPATH@/components/XULStore.manifest -@RESPATH@/components/messageWakeupService.js -@RESPATH@/components/messageWakeupService.manifest -@RESPATH@/components/SettingsManager.js -@RESPATH@/components/SettingsManager.manifest -@RESPATH@/components/Webapps.js -@RESPATH@/components/Webapps.manifest -@RESPATH@/components/AppsService.js -@RESPATH@/components/AppsService.manifest -@RESPATH@/components/nsDOMIdentity.js -@RESPATH@/components/nsIDService.js -@RESPATH@/components/Identity.manifest -@RESPATH@/components/recording-cmdline.js -@RESPATH@/components/recording-cmdline.manifest -@RESPATH@/components/htmlMenuBuilder.js -@RESPATH@/components/htmlMenuBuilder.manifest - -@RESPATH@/components/RequestSync.manifest -@RESPATH@/components/RequestSyncManager.js -@RESPATH@/components/RequestSyncScheduler.js - -@RESPATH@/components/PermissionSettings.js -@RESPATH@/components/PermissionSettings.manifest -@RESPATH@/components/ContactManager.js -@RESPATH@/components/ContactManager.manifest -@RESPATH@/components/PhoneNumberService.js -@RESPATH@/components/PhoneNumberService.manifest -@RESPATH@/components/NotificationStorage.js -@RESPATH@/components/NotificationStorage.manifest -@RESPATH@/components/AlarmsManager.js -@RESPATH@/components/AlarmsManager.manifest -@RESPATH@/components/Push.js -@RESPATH@/components/Push.manifest -@RESPATH@/components/PushServiceLauncher.js - -@RESPATH@/components/SlowScriptDebug.manifest -@RESPATH@/components/SlowScriptDebug.js - -#ifndef RELEASE_BUILD -@RESPATH@/components/InterAppComm.manifest -@RESPATH@/components/InterAppCommService.js -@RESPATH@/components/InterAppConnection.js -@RESPATH@/components/InterAppMessagePort.js +#ifdef MOZ_ENABLE_PROFILER_SPS #endif - -@RESPATH@/components/TCPSocket.js -@RESPATH@/components/TCPServerSocket.js -@RESPATH@/components/TCPSocketParentIntermediary.js -@RESPATH@/components/TCPSocket.manifest - -#ifdef MOZ_ACTIVITIES -@RESPATH@/components/SystemMessageCache.js -@RESPATH@/components/SystemMessageInternal.js -@RESPATH@/components/SystemMessageManager.js -@RESPATH@/components/SystemMessageManager.manifest - -@RESPATH@/components/Activities.manifest -@RESPATH@/components/ActivityProxy.js -@RESPATH@/components/ActivityRequestHandler.js -@RESPATH@/components/ActivityWrapper.js -@RESPATH@/components/ActivityMessageConfigurator.js +#ifdef ENABLE_INTL_API #endif - -#ifdef MOZ_PAY -@RESPATH@/components/Payment.js -@RESPATH@/components/PaymentFlowInfo.js -@RESPATH@/components/Payment.manifest +#ifdef NECKO_WIFI #endif - #ifdef MOZ_WEBRTC -@RESPATH@/components/PeerConnection.js -@RESPATH@/components/PeerConnection.manifest +#endif +#ifdef MOZ_ENABLE_PROFILER_SPS +#endif +#ifdef MOZ_ENABLE_XREMOTE +#endif +#ifdef XP_MACOSX #endif @RESPATH@/chrome/marionette@JAREXT@ @RESPATH@/chrome/marionette.manifest -@RESPATH@/components/MarionetteComponents.manifest -@RESPATH@/components/marionettecomponent.js - -#ifdef MOZ_WEBSPEECH -@RESPATH@/components/dom_webspeechsynth.xpt -#endif - -@RESPATH@/components/nsAsyncShutdown.manifest -@RESPATH@/components/nsAsyncShutdown.js - -@RESPATH@/components/PresentationDeviceInfoManager.manifest -@RESPATH@/components/PresentationDeviceInfoManager.js - -; InputMethod API -@RESPATH@/components/MozKeyboard.js -@RESPATH@/components/InputMethod.manifest - -#if defined(ENABLE_TESTS) && defined(MOZ_DEBUG) -@RESPATH@/components/TestInterfaceJS.js -@RESPATH@/components/TestInterfaceJS.manifest -#endif ; Modules @RESPATH@/browser/modules/* @@ -658,15 +204,17 @@ #ifdef MOZ_D3DCOMPILER_VISTA_DLL @BINPATH@/@MOZ_D3DCOMPILER_VISTA_DLL@ #endif - #endif # MOZ_ANGLE_RENDERER ; [Browser Chrome Files] @RESPATH@/browser/chrome.manifest @RESPATH@/browser/chrome/browser@JAREXT@ @RESPATH@/browser/chrome/browser.manifest -@RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf +#ifdef XP_WIN +@RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/chrome.manifest +#endif @RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png +@RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf @RESPATH@/chrome/toolkit@JAREXT@ @RESPATH@/chrome/toolkit.manifest @RESPATH@/chrome/recording.manifest @@ -686,7 +234,7 @@ @RESPATH@/browser/chrome/devtools@JAREXT@ @RESPATH@/browser/chrome/devtools.manifest @RESPATH@/browser/@PREF_DIR@/devtools.js - + ; shell icons #ifdef XP_UNIX #ifndef XP_MACOSX @@ -703,28 +251,16 @@ ; All the pref files must be part of base to prevent migration bugs @RESPATH@/browser/@PREF_DIR@/palemoon.js @RESPATH@/browser/@PREF_DIR@/palemoon-branding.js -@RESPATH@/goanna.js -@RESPATH@/defaults/autoconfig/platform.js +@RESPATH@/greprefs.js @RESPATH@/defaults/autoconfig/prefcalls.js -@RESPATH@/browser/defaults/profile/prefs.js -#ifndef LIBXUL_SDK ; Warning: changing the path to channel-prefs.js can cause bugs (Bug 756325) ; Technically this is an app pref file, but we are keeping it in the original ; gre location for now. @RESPATH@/defaults/pref/channel-prefs.js -#else -; For Fx-on-xr, channel-prefs lives with the app preferences. (Bug 762588) -@RESPATH@/@PREF_DIR@/channel-prefs.js -#endif ; Services (gre) prefs -#ifdef MOZ_SERVICES_NOTIFICATIONS -@RESPATH@/defaults/pref/services-notifications.js -#endif -#ifdef MOZ_SERVICES_SYNC @RESPATH@/defaults/pref/services-sync.js -#endif ; [Layout Engine Resources] ; Style Sheets, Graphics and other Resources used by the layout engine. @@ -759,7 +295,7 @@ @RESPATH@/res/fonts/* @RESPATH@/res/dtd/* @RESPATH@/res/html/* -#if defined(XP_MACOSX) || defined(XP_WIN) +#if defined(XP_MACOSX) ; For SafariProfileMigrator.js. @RESPATH@/res/langGroups.properties #endif @@ -771,15 +307,13 @@ ; svg @RESPATH@/res/svg.css -@RESPATH@/components/dom_svg.xpt -@RESPATH@/components/dom_smil.xpt ; [Personal Security Manager] ; ; NSS libraries are signed in the staging directory, ; meaning their .chk files are created there directly. ; -#ifndef MOZ_NATIVE_NSS +#ifndef MOZ_SYSTEM_NSS #if defined(XP_LINUX) && !defined(ANDROID) @BINPATH@/@DLL_PREFIX@freeblpriv3@DLL_SUFFIX@ #else @@ -799,20 +333,22 @@ #endif @RESPATH@/chrome/pippki@JAREXT@ @RESPATH@/chrome/pippki.manifest -@RESPATH@/components/pipboot.xpt -@RESPATH@/components/pipnss.xpt -@RESPATH@/components/pippki.xpt ; For process sandboxing #if defined(MOZ_SANDBOX) #if defined(XP_WIN) -@BINPATH@/@DLL_PREFIX@sandboxbroker@DLL_SUFFIX@ #if defined(WOW_HELPER) @BINPATH@/wow_helper.exe #endif #endif #endif +#if defined(MOZ_SANDBOX) +#if defined(XP_LINUX) +@BINPATH@/@DLL_PREFIX@mozsandbox@DLL_SUFFIX@ +#endif +#endif + ; for Solaris SPARC #ifdef SOLARIS bin/libfreebl_32fpu_3.so @@ -830,13 +366,7 @@ bin/libfreebl_32int64_3.so #endif #endif -@RESPATH@/components/DataStore.manifest -@RESPATH@/components/DataStoreImpl.js -@RESPATH@/components/dom_datastore.xpt - ; Shutdown Terminator -@RESPATH@/components/nsTerminatorTelemetry.js -@RESPATH@/components/terminator.manifest #if defined(CLANG_CXX) #if defined(MOZ_ASAN) || defined(MOZ_TSAN) @@ -845,5 +375,5 @@ bin/libfreebl_32int64_3.so #endif #if defined(MOZ_ASAN) && defined(CLANG_CL) -@BINPATH@/clang_rt.asan_dynamic-i386.dll +@BINPATH@/clang_rt.asan_dynamic-*.dll #endif diff --git a/application/palemoon/installer/removed-files.in b/application/palemoon/installer/removed-files.in index 8bfd72e4e..8801d1cb0 100644 --- a/application/palemoon/installer/removed-files.in +++ b/application/palemoon/installer/removed-files.in @@ -65,29 +65,27 @@ # platforms. # Common File Removals +# This is located under the "distribution/" directory and it was added before +# Firefox 27 +@DIR_MACOS@distribution/extensions/testpilot@labs.mozilla.com.xpi -# Some users are ending up with unpacked chrome instead of omni.ja. This -# causes updates to break badly, see bug 1063052. Removing the toplevel -# chrome.manifest causes us to use the updated omni.ja. -#ifndef MOZ_GTK - @DIR_MACOS@chrome.manifest - #ifdef XP_MACOSX - @DIR_RESOURCES@chrome.manifest - #endif +# Mac OS X v2 signing removals +#ifdef XP_MACOSX + @DIR_MACOS@active-update.xml + @DIR_MACOS@update-settings.ini + @DIR_MACOS@updates.xml + @DIR_MACOS@defaults/* + @DIR_MACOS@updates/* #endif # Common Directory removals +@DIR_MACOS@chrome/ #ifdef XP_UNIX #ifndef XP_MACOSX chrome/icons/ chrome/icons/default/ #endif #endif - -# Remove previously-bundled ruby/s4e extensions -@DIR_MACOS@distribution/bundles/statusbar@palemoon.org/* -@DIR_MACOS@distribution/bundles/{3ff46564-d77c-491c-bfc5-fc555c87dbc4}/* - @DIR_MACOS@chrome/overlayinfo/ @DIR_MACOS@components/ @DIR_MACOS@defaults/autoconfig/ @@ -114,4 +112,5 @@ @DIR_MACOS@plugins/MRJPlugin.plugin/* Contents/Plug-Ins/PrintPDE.plugin/* #endif +@DIR_MACOS@searchplugins/* @DIR_MACOS@webapprt/components/ diff --git a/application/palemoon/installer/windows/Makefile.in b/application/palemoon/installer/windows/Makefile.in index 600bdfeb6..8c434c54f 100644 --- a/application/palemoon/installer/windows/Makefile.in +++ b/application/palemoon/installer/windows/Makefile.in @@ -5,7 +5,7 @@ include $(topsrcdir)/toolkit/mozapps/installer/package-name.mk CONFIG_DIR = instgen -SFX_MODULE = $(topsrcdir)/other-licenses/7zstub/uxp/7zSD.sfx +SFX_MODULE = $(topsrcdir)/other-licenses/7zstub/palemoon/7zSD.sfx INSTALLER_FILES = \ app.tag \ diff --git a/application/palemoon/locales/en-US/chrome/browser/browser.properties b/application/palemoon/locales/en-US/chrome/browser/browser.properties index 8b3fea4d5..bf363d103 100644 --- a/application/palemoon/locales/en-US/chrome/browser/browser.properties +++ b/application/palemoon/locales/en-US/chrome/browser/browser.properties @@ -363,26 +363,6 @@ restartButton=Restart # menu, set this to "true". Otherwise, you can leave it as "false". browser.menu.showCharacterEncoding=false -# LOCALIZATION NOTE (syncPromoNotification.bookmarks.label): This appears in -# the add bookmark star panel. %S will be replaced by syncBrandShortName. -# The final space separates this text from the Learn More link. -syncPromoNotification.bookmarks.description=You can access your bookmarks on all your devices with %S.\u0020 -# LOCALIZATION NOTE (syncPromoNotification.passwords.label): This appears in -# the remember password panel. %S will be replaced by syncBrandShortName. -# The final space separates this text from the Learn More link. -syncPromoNotification.passwords.description=You can access your passwords on all your devices with %S.\u0020 -syncPromoNotification.learnMoreLinkText=Learn More -# LOCALIZATION NOTE (syncPromoNotification.addons.label): This appears in -# the add-on install complete panel when Sync isn't set. -# %S will be replaced by syncBrandShortName. -# The final space separates this text from the Learn More link. -syncPromoNotification.addons.description=You can access your add-ons on all your devices with %S.\u0020 -# LOCALIZATION NOTE (syncPromoNotification.addons-sync-disabled.label): -# This appears in the add-on install complete panel when Sync is set -# but addons sync is not. %S will be replaced by syncBrandShortName. -# The final space separates this text from the Learn More link. -syncPromoNotification.addons-sync-disabled.description=You can use your %S account to synchronize add-ons across multiple devices.\u0020 - # Mozilla data reporting notification (Telemetry, Firefox Health Report, etc) dataReportingNotification.message = %1$S automatically sends some data to %2$S so that we can improve your experience. dataReportingNotification.button.label = Choose What I Share diff --git a/application/palemoon/locales/en-US/chrome/overrides/netError.dtd b/application/palemoon/locales/en-US/chrome/overrides/netError.dtd index 51aedb275..c97bd1b59 100644 --- a/application/palemoon/locales/en-US/chrome/overrides/netError.dtd +++ b/application/palemoon/locales/en-US/chrome/overrides/netError.dtd @@ -51,7 +51,6 @@ <p>&brandShortName; can’t load this page for some reason.</p> "> -<!ENTITY malformedURI.title "The address isn't valid"> <!ENTITY captivePortal.title "Login to network"> <!ENTITY captivePortal.longDesc " <p>This network may require you to login to access the internet.</p> @@ -59,7 +58,7 @@ <!ENTITY openPortalLoginPage.label "Open Login Page"> -<!ENTITY malformedURI.title "The address isn’t valid"> +<!ENTITY malformedURI.title "The address isn't valid"> <!ENTITY malformedURI.longDesc " <ul> <li>Web addresses are usually written like diff --git a/application/palemoon/locales/generic/install.rdf b/application/palemoon/locales/generic/install.rdf deleted file mode 100644 index d04c67a61..000000000 --- a/application/palemoon/locales/generic/install.rdf +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0"?> -<!-- -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -#filter substitution ---> - -<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:em="http://www.mozilla.org/2004/em-rdf#"> - <Description about="urn:mozilla:install-manifest" - em:id="@MOZ_LANGPACK_EID@" - em:name="@MOZ_LANG_TITLE@ Language Pack" - em:version="@MOZ_APP_VERSION@" - em:type="8" - em:creator="@MOZ_LANGPACK_CREATOR@"> -#ifdef MOZ_LANGPACK_CONTRIBUTORS - @MOZ_LANGPACK_CONTRIBUTORS@ -#endif - - <em:targetApplication> - <Description> - <em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id> - <em:minVersion>@MOZ_APP_VERSION@</em:minVersion> - <em:maxVersion>@MOZ_APP_MAXVERSION@</em:maxVersion> - </Description> - </em:targetApplication> - </Description> -</RDF> diff --git a/application/palemoon/locales/l10n.ini b/application/palemoon/locales/l10n.ini index df5eb7ac0..9a466b65e 100644 --- a/application/palemoon/locales/l10n.ini +++ b/application/palemoon/locales/l10n.ini @@ -3,14 +3,14 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. [general] -depth = ../.. -all = browser/locales/all-locales +depth = ../../.. +all = application/palemoon/locales/all-locales [compare] -dirs = browser +dirs = application/palemoon extensions/reporter other-licenses/branding/firefox - browser/branding/official + application/palemoon/branding/official [includes] # non-central apps might want to use %(topsrcdir)s here, or other vars diff --git a/application/palemoon/modules/AutoCompletePopup.jsm b/application/palemoon/modules/AutoCompletePopup.jsm new file mode 100644 index 000000000..c3698f905 --- /dev/null +++ b/application/palemoon/modules/AutoCompletePopup.jsm @@ -0,0 +1,293 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cu = Components.utils; + +this.EXPORTED_SYMBOLS = [ "AutoCompletePopup" ]; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); + +// nsITreeView implementation that feeds the autocomplete popup +// with the search data. +var AutoCompleteTreeView = { + // nsISupports + QueryInterface: XPCOMUtils.generateQI([Ci.nsITreeView, + Ci.nsIAutoCompleteController]), + + // Private variables + treeBox: null, + results: [], + + // nsITreeView + selection: null, + + get rowCount() { return this.results.length; }, + setTree: function(treeBox) { this.treeBox = treeBox; }, + getCellText: function(idx, column) { return this.results[idx].value }, + isContainer: function(idx) { return false; }, + getCellValue: function(idx, column) { return false }, + isContainerOpen: function(idx) { return false; }, + isContainerEmpty: function(idx) { return false; }, + isSeparator: function(idx) { return false; }, + isSorted: function() { return false; }, + isEditable: function(idx, column) { return false; }, + canDrop: function(idx, orientation, dt) { return false; }, + getLevel: function(idx) { return 0; }, + getParentIndex: function(idx) { return -1; }, + hasNextSibling: function(idx, after) { return idx < this.results.length - 1 }, + toggleOpenState: function(idx) { }, + getCellProperties: function(idx, column) { return this.results[idx].style || ""; }, + getRowProperties: function(idx) { return ""; }, + getImageSrc: function(idx, column) { return null; }, + getProgressMode : function(idx, column) { }, + cycleHeader: function(column) { }, + cycleCell: function(idx, column) { }, + selectionChanged: function() { }, + performAction: function(action) { }, + performActionOnCell: function(action, index, column) { }, + getColumnProperties: function(column) { return ""; }, + + // nsIAutoCompleteController + get matchCount() { + return this.rowCount; + }, + + handleEnter: function(aIsPopupSelection) { + AutoCompletePopup.handleEnter(aIsPopupSelection); + }, + + stopSearch: function() {}, + + // Internal JS-only API + clearResults: function() { + this.results = []; + }, + + setResults: function(results) { + this.results = results; + }, +}; + +this.AutoCompletePopup = { + MESSAGES: [ + "FormAutoComplete:SelectBy", + "FormAutoComplete:GetSelectedIndex", + "FormAutoComplete:SetSelectedIndex", + "FormAutoComplete:MaybeOpenPopup", + "FormAutoComplete:ClosePopup", + "FormAutoComplete:Disconnect", + "FormAutoComplete:RemoveEntry", + "FormAutoComplete:Invalidate", + ], + + init: function() { + for (let msg of this.MESSAGES) { + Services.mm.addMessageListener(msg, this); + } + }, + + uninit: function() { + for (let msg of this.MESSAGES) { + Services.mm.removeMessageListener(msg, this); + } + }, + + handleEvent: function(evt) { + switch (evt.type) { + case "popupshowing": { + this.sendMessageToBrowser("FormAutoComplete:PopupOpened"); + break; + } + + case "popuphidden": { + this.sendMessageToBrowser("FormAutoComplete:PopupClosed"); + this.openedPopup = null; + this.weakBrowser = null; + evt.target.removeEventListener("popuphidden", this); + evt.target.removeEventListener("popupshowing", this); + break; + } + } + }, + + // Along with being called internally by the receiveMessage handler, + // this function is also called directly by the login manager, which + // uses a single message to fill in the autocomplete results. See + // "RemoteLogins:autoCompleteLogins". + showPopupWithResults: function({ browser, rect, dir, results }) { + if (!results.length || this.openedPopup) { + // We shouldn't ever be showing an empty popup, and if we + // already have a popup open, the old one needs to close before + // we consider opening a new one. + return; + } + + let window = browser.ownerDocument.defaultView; + let tabbrowser = window.gBrowser; + if (Services.focus.activeWindow != window || + tabbrowser.selectedBrowser != browser) { + // We were sent a message from a window or tab that went into the + // background, so we'll ignore it for now. + return; + } + + this.weakBrowser = Cu.getWeakReference(browser); + this.openedPopup = browser.autoCompletePopup; + this.openedPopup.hidden = false; + // don't allow the popup to become overly narrow + this.openedPopup.setAttribute("width", Math.max(100, rect.width)); + this.openedPopup.style.direction = dir; + + AutoCompleteTreeView.setResults(results); + this.openedPopup.view = AutoCompleteTreeView; + this.openedPopup.selectedIndex = -1; + this.openedPopup.invalidate(); + + if (results.length) { + // Reset fields that were set from the last time the search popup was open + this.openedPopup.mInput = null; + this.openedPopup.showCommentColumn = false; + this.openedPopup.showImageColumn = false; + this.openedPopup.addEventListener("popuphidden", this); + this.openedPopup.addEventListener("popupshowing", this); + this.openedPopup.openPopupAtScreenRect("after_start", rect.left, rect.top, + rect.width, rect.height, false, + false); + } else { + this.closePopup(); + } + }, + + invalidate(results) { + if (!this.openedPopup) { + return; + } + + if (!results.length) { + this.closePopup(); + } else { + AutoCompleteTreeView.setResults(results); + // We need to re-set the view in order for the + // tree to know the view has changed. + this.openedPopup.view = AutoCompleteTreeView; + this.openedPopup.invalidate(); + } + }, + + closePopup() { + if (this.openedPopup) { + // Note that hidePopup() closes the popup immediately, + // so popuphiding or popuphidden events will be fired + // and handled during this call. + this.openedPopup.hidePopup(); + } + AutoCompleteTreeView.clearResults(); + }, + + removeLogin(login) { + Services.logins.removeLogin(login); + }, + + receiveMessage: function(message) { + if (!message.target.autoCompletePopup) { + // Returning false to pacify ESLint, but this return value is + // ignored by the messaging infrastructure. + return false; + } + + switch (message.name) { + case "FormAutoComplete:SelectBy": { + this.openedPopup.selectBy(message.data.reverse, message.data.page); + break; + } + + case "FormAutoComplete:GetSelectedIndex": { + if (this.openedPopup) { + return this.openedPopup.selectedIndex; + } + // If the popup was closed, then the selection + // has not changed. + return -1; + } + + case "FormAutoComplete:SetSelectedIndex": { + let { index } = message.data; + if (this.openedPopup) { + this.openedPopup.selectedIndex = index; + } + break; + } + + case "FormAutoComplete:MaybeOpenPopup": { + let { results, rect, dir } = message.data; + this.showPopupWithResults({ browser: message.target, rect, dir, + results }); + break; + } + + case "FormAutoComplete:Invalidate": { + let { results } = message.data; + this.invalidate(results); + break; + } + + case "FormAutoComplete:ClosePopup": { + this.closePopup(); + break; + } + + case "FormAutoComplete:Disconnect": { + // The controller stopped controlling the current input, so clear + // any cached data. This is necessary cause otherwise we'd clear data + // only when starting a new search, but the next input could not support + // autocomplete and it would end up inheriting the existing data. + AutoCompleteTreeView.clearResults(); + break; + } + } + // Returning false to pacify ESLint, but this return value is + // ignored by the messaging infrastructure. + return false; + }, + + /** + * Despite its name, this handleEnter is only called when the user clicks on + * one of the items in the popup since the popup is rendered in the parent process. + * The real controller's handleEnter is called directly in the content process + * for other methods of completing a selection (e.g. using the tab or enter + * keys) since the field with focus is in that process. + */ + handleEnter(aIsPopupSelection) { + if (this.openedPopup) { + this.sendMessageToBrowser("FormAutoComplete:HandleEnter", { + selectedIndex: this.openedPopup.selectedIndex, + isPopupSelection: aIsPopupSelection, + }); + } + }, + + /** + * If a browser exists that AutoCompletePopup knows about, + * sends it a message. Otherwise, this is a no-op. + * + * @param {string} msgName + * The name of the message to send. + * @param {object} data + * The optional data to send with the message. + */ + sendMessageToBrowser(msgName, data) { + let browser = this.weakBrowser ? this.weakBrowser.get() + : null; + if (browser) { + browser.messageManager.sendAsyncMessage(msgName, data); + } + }, + + stopSearch: function() {} +} diff --git a/application/palemoon/modules/BrowserNewTabPreloader.jsm b/application/palemoon/modules/BrowserNewTabPreloader.jsm index 719a9e05e..778698fba 100644 --- a/application/palemoon/modules/BrowserNewTabPreloader.jsm +++ b/application/palemoon/modules/BrowserNewTabPreloader.jsm @@ -79,7 +79,7 @@ this.BrowserNewTabPreloader = { Object.freeze(BrowserNewTabPreloader); -let Initializer = { +var Initializer = { _timer: null, _observing: false, @@ -120,7 +120,7 @@ let Initializer = { } }; -let Preferences = { +var Preferences = { _enabled: null, _branch: null, @@ -157,7 +157,7 @@ let Preferences = { }, }; -let HiddenBrowsers = { +var HiddenBrowsers = { _browsers: null, _updateTimer: null, @@ -379,7 +379,7 @@ HiddenBrowser.prototype = { } }; -let HostFrame = { +var HostFrame = { _frame: null, _deferred: null, diff --git a/application/palemoon/modules/FormSubmitObserver.jsm b/application/palemoon/modules/FormSubmitObserver.jsm index 72c5ca601..e4d3e765e 100644 --- a/application/palemoon/modules/FormSubmitObserver.jsm +++ b/application/palemoon/modules/FormSubmitObserver.jsm @@ -9,14 +9,14 @@ "use strict"; -let Cc = Components.classes; -let Ci = Components.interfaces; -let Cu = Components.utils; - -let HTMLInputElement = Ci.nsIDOMHTMLInputElement; -let HTMLTextAreaElement = Ci.nsIDOMHTMLTextAreaElement; -let HTMLSelectElement = Ci.nsIDOMHTMLSelectElement; -let HTMLButtonElement = Ci.nsIDOMHTMLButtonElement; +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cu = Components.utils; + +var HTMLInputElement = Ci.nsIDOMHTMLInputElement; +var HTMLTextAreaElement = Ci.nsIDOMHTMLTextAreaElement; +var HTMLSelectElement = Ci.nsIDOMHTMLSelectElement; +var HTMLButtonElement = Ci.nsIDOMHTMLButtonElement; this.EXPORTED_SYMBOLS = [ "FormSubmitObserver" ]; diff --git a/application/palemoon/modules/FormValidationHandler.jsm b/application/palemoon/modules/FormValidationHandler.jsm index 05be510e1..387c221d7 100644 --- a/application/palemoon/modules/FormValidationHandler.jsm +++ b/application/palemoon/modules/FormValidationHandler.jsm @@ -8,15 +8,15 @@ "use strict"; -let Cc = Components.classes; -let Ci = Components.interfaces; -let Cu = Components.utils; +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cu = Components.utils; this.EXPORTED_SYMBOLS = [ "FormValidationHandler" ]; Cu.import("resource://gre/modules/Services.jsm"); -let FormValidationHandler = +var FormValidationHandler = { _panel: null, _anchor: null, @@ -122,7 +122,7 @@ let FormValidationHandler = this._panel.hidden = false; let tabBrowser = aWindow.gBrowser; - this._anchor = tabBrowser.formValidationAnchor; + this._anchor = tabBrowser.popupAnchor; this._anchor.left = aPanelData.contentRect.left; this._anchor.top = aPanelData.contentRect.top; this._anchor.width = aPanelData.contentRect.width; diff --git a/application/palemoon/modules/NetworkPrioritizer.jsm b/application/palemoon/modules/NetworkPrioritizer.jsm index ea4a87790..23d688a30 100644 --- a/application/palemoon/modules/NetworkPrioritizer.jsm +++ b/application/palemoon/modules/NetworkPrioritizer.jsm @@ -34,8 +34,8 @@ const PRIORITY_DELTA = -10; // Variables -let _lastFocusedWindow = null; -let _windows = []; +var _lastFocusedWindow = null; +var _windows = []; // Exported symbol @@ -64,7 +64,7 @@ function _handleEvent(aEvent) { // Methods that impact a browser. Put into single object for organization. -let BrowserHelper = { +var BrowserHelper = { onOpen: function NP_BH_onOpen(aBrowser) { // If the tab is in the focused window, leave priority as it is if (aBrowser.ownerDocument.defaultView != _lastFocusedWindow) @@ -91,7 +91,7 @@ let BrowserHelper = { // Methods that impact a window. Put into single object for organization. -let WindowHelper = { +var WindowHelper = { addWindow: function NP_WH_addWindow(aWindow) { // Build internal data object _windows.push({ window: aWindow, lastSelectedBrowser: null }); diff --git a/application/palemoon/modules/PopupNotifications.jsm b/application/palemoon/modules/PopupNotifications.jsm index 9b2e8e5d1..d2faf52c3 100644 --- a/application/palemoon/modules/PopupNotifications.jsm +++ b/application/palemoon/modules/PopupNotifications.jsm @@ -18,8 +18,8 @@ const ICON_ATTRIBUTE_SHOWING = "showing"; const PREF_SECURITY_DELAY = "security.notification_enable_delay"; -let popupNotificationsMap = new WeakMap(); -let gNotificationParents = new WeakMap; +var popupNotificationsMap = new WeakMap(); +var gNotificationParents = new WeakMap; function getAnchorFromBrowser(aBrowser) { let anchor = aBrowser.getAttribute("popupnotificationanchor") || diff --git a/application/palemoon/modules/SharedFrame.jsm b/application/palemoon/modules/SharedFrame.jsm index 4d248ae5b..b9d59bfa9 100644 --- a/application/palemoon/modules/SharedFrame.jsm +++ b/application/palemoon/modules/SharedFrame.jsm @@ -18,7 +18,7 @@ const Cu = Components.utils; * when another one of the placeholder is meant to be displayed. * */ -let Frames = new Map(); +var Frames = new Map(); /** * The Frames map is the main data structure that holds information diff --git a/application/palemoon/modules/moz.build b/application/palemoon/modules/moz.build index f7717ef89..67fd22338 100644 --- a/application/palemoon/modules/moz.build +++ b/application/palemoon/modules/moz.build @@ -9,6 +9,7 @@ EXTRA_JS_MODULES += [ 'promise.js' ] EXTRA_JS_MODULES += [ + 'AutoCompletePopup.jsm', 'BrowserNewTabPreloader.jsm', 'CharsetMenu.jsm', 'FormSubmitObserver.jsm', diff --git a/application/palemoon/modules/openLocationLastURL.jsm b/application/palemoon/modules/openLocationLastURL.jsm index 0d653df28..3f58db8ce 100644 --- a/application/palemoon/modules/openLocationLastURL.jsm +++ b/application/palemoon/modules/openLocationLastURL.jsm @@ -10,11 +10,11 @@ Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); this.EXPORTED_SYMBOLS = [ "OpenLocationLastURL" ]; -let prefSvc = Components.classes["@mozilla.org/preferences-service;1"] +var prefSvc = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); -let gOpenLocationLastURLData = ""; +var gOpenLocationLastURLData = ""; -let observer = { +var observer = { QueryInterface: function (aIID) { if (aIID.equals(Components.interfaces.nsIObserver) || aIID.equals(Components.interfaces.nsISupports) || @@ -35,7 +35,7 @@ let observer = { } }; -let os = Components.classes["@mozilla.org/observer-service;1"] +var os = Components.classes["@mozilla.org/observer-service;1"] .getService(Components.interfaces.nsIObserverService); os.addObserver(observer, "last-pb-context-exited", true); os.addObserver(observer, "browser:purge-session-history", true); diff --git a/application/palemoon/modules/promise.js b/application/palemoon/modules/promise.js index 7c96f02cf..74065c8db 100644 --- a/application/palemoon/modules/promise.js +++ b/application/palemoon/modules/promise.js @@ -24,7 +24,7 @@ module.metadata = { 'stability': 'unstable' }; -let promised = (function() { +var promised = (function() { // Note: Define shortcuts and utility functions here in order to avoid // slower property accesses and unnecessary closure creations on each // call of this popular function. diff --git a/application/palemoon/themes/linux/autocomplete.css b/application/palemoon/themes/linux/autocomplete.css new file mode 100644 index 000000000..fffa2b1f0 --- /dev/null +++ b/application/palemoon/themes/linux/autocomplete.css @@ -0,0 +1,210 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* ===== autocomplete.css ================================================= + == Styles used by the autocomplete widget. + ======================================================================= */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); +@namespace html url("http://www.w3.org/1999/xhtml"); + +/* ::::: autocomplete ::::: */ + +/* .padded is used by autocomplete widgets that don't have an icon. Gross. -dwh */ +textbox:not(.padded) { + cursor: default; + padding: 0; +} + +textbox[enablehistory="true"] { + -moz-appearance: none; + border: 0; + background-color: transparent; +} + +textbox[nomatch="true"][highlightnonmatches="true"] { + color: red; +} + +.autocomplete-textbox-container { + -moz-box-align: center; +} + +textbox[enablehistory="true"] > .autocomplete-textbox-container { + -moz-appearance: menulist-textfield; +} + +textbox:not(.padded) .textbox-input-box { + margin: 0 3px; +} + +.textbox-input-box { + -moz-box-align: center; +} + +/* ::::: autocomplete popups ::::: */ + +panel[type="autocomplete"], +panel[type="autocomplete-richlistbox"], +.autocomplete-history-popup { + border-width: 1px; + -moz-border-top-colors: ThreeDDarkShadow; + -moz-border-right-colors: ThreeDDarkShadow; + -moz-border-bottom-colors: ThreeDDarkShadow; + -moz-border-left-colors: ThreeDDarkShadow; + padding: 0; + background-color: -moz-Field; +} + +.autocomplete-history-popup { + max-height: 180px; +} + +/* ::::: tree ::::: */ + +.autocomplete-tree { + -moz-appearance: none !important; + border: none !important; + background-color: transparent !important; + color: MenuText; +} + +.autocomplete-treecol { + -moz-appearance: none !important; + margin: 0 !important; + border: none !important; + padding: 0 !important; +} + +/* GTK calculates space for a sort arrow */ +.autocomplete-treecol > .treecol-sortdirection { + -moz-appearance: none !important; +} + +.autocomplete-treebody::-moz-tree-cell-text { + -moz-padding-start: 8px; +} + +treechildren.autocomplete-treebody::-moz-tree-row(selected) { + background-color: Highlight; +} + +treechildren.autocomplete-treebody::-moz-tree-cell-text(selected) { + color: HighlightText !important; +} + +.autocomplete-treebody::-moz-tree-image(treecolAutoCompleteValue) { + max-width: 16px; + height: 16px; +} + +/* ::::: richlistbox autocomplete ::::: */ + +.autocomplete-richlistbox { + -moz-appearance: none; + margin: 1px; + background-color: transparent; +} + +.autocomplete-richlistitem[selected="true"] { + background-color: Highlight; + color: HighlightText; +} + +.autocomplete-richlistitem { + padding: 6px 2px; + color: MenuText; +} + +.ac-url-box { + /* When setting a vertical margin here, half of that needs to be added + .ac-title-box's translateY for when .ac-url-box is hidden (see below). */ + margin-top: 1px; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box, +.autocomplete-richlistitem[type~="autofill"] .ac-url-box { + visibility: hidden; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box, +.autocomplete-richlistitem[type~="autofill"] .ac-title-box { + /* Center the title by moving it down by half of .ac-url-box's height, + including vertical margins (if any). */ + transform: translateY(.5em); +} + +.ac-site-icon { + width: 16px; + height: 16px; + margin-bottom: -2px; + -moz-margin-start: 3px; + -moz-margin-end: 6px; +} + +.ac-type-icon { + width: 16px; + height: 16px; + -moz-margin-start: 6px; + -moz-margin-end: 4px; +} + +.ac-extra > .ac-result-type-tag { + margin: 0 4px; +} + +.ac-extra > .ac-comment { + padding-right: 4px; +} + +.ac-ellipsis-after { + margin: 0 !important; + padding: 0; + min-width: 1em; +} + +.ac-normal-text { + margin: 0 !important; + padding: 0; +} + +.ac-normal-text > html|span { + margin: 0 !important; + padding: 0; +} + +html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(0,0,0,0.1); + background-color: rgba(0,0,0,0.05); + border-radius: 2px; + text-shadow: 0 0 currentColor; /*faux bold effect*/ +} + +.ac-url-text > html|span.ac-emphasize-text, +.ac-action-text > html|span.ac-emphasize-text { + box-shadow: none; +} + +.ac-normal-text[selected="true"] > html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(255,255,255,0.3); + background-color: rgba(255,255,255,0.2); +} + +.ac-title, .ac-url { + overflow: hidden; +} + +/* ::::: textboxes inside toolbarpaletteitems ::::: */ + +toolbarpaletteitem > toolbaritem > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} + +toolbarpaletteitem > toolbaritem > * > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} diff --git a/application/palemoon/themes/linux/browser.css b/application/palemoon/themes/linux/browser.css index a396ea5fd..334062613 100644 --- a/application/palemoon/themes/linux/browser.css +++ b/application/palemoon/themes/linux/browser.css @@ -1559,29 +1559,6 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action- min-width: 27em; } -.panel-promo-box { - margin: 8px -10px -10px -10px; - padding: 8px 10px; - border-top: 1px solid ThreeDShadow; - background-image: linear-gradient(hsla(0,0%,0%,.15), hsla(0,0%,0%,.08) 6px); -} - -.panel-promo-icon { - list-style-image: url("chrome://browser/skin/sync-notification-24.png"); - -moz-margin-end: 10px; - vertical-align: middle; -} - -.panel-promo-closebutton { - margin-top: 0; - margin-bottom: 0; -} - -.panel-promo-closebutton > .toolbarbutton-text { - padding: 0; - margin: 0; -} - /* Content area */ #sidebar { background-color: Window; diff --git a/application/palemoon/themes/linux/jar.mn b/application/palemoon/themes/linux/jar.mn index 44d837778..7e67d0129 100644 --- a/application/palemoon/themes/linux/jar.mn +++ b/application/palemoon/themes/linux/jar.mn @@ -16,6 +16,7 @@ browser.jar: #ifdef MOZ_SERVICES_SYNC skin/classic/browser/aboutSyncTabs.css #endif +* skin/classic/browser/autocomplete.css skin/classic/browser/actionicon-tab.png * skin/classic/browser/browser.css skin/classic/browser/click-to-play-warning-stripes.png @@ -130,7 +131,6 @@ browser.jar: skin/classic/browser/sync-128.png skin/classic/browser/sync-desktopIcon.png skin/classic/browser/sync-mobileIcon.png - skin/classic/browser/sync-notification-24.png skin/classic/browser/syncSetup.css skin/classic/browser/syncCommon.css skin/classic/browser/syncQuota.css diff --git a/application/palemoon/themes/linux/sync-notification-24.png b/application/palemoon/themes/linux/sync-notification-24.png Binary files differdeleted file mode 100644 index d67eb47ac..000000000 --- a/application/palemoon/themes/linux/sync-notification-24.png +++ /dev/null diff --git a/application/palemoon/themes/osx/autocomplete.css b/application/palemoon/themes/osx/autocomplete.css new file mode 100644 index 000000000..42b4ee430 --- /dev/null +++ b/application/palemoon/themes/osx/autocomplete.css @@ -0,0 +1,198 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); +@namespace html url("http://www.w3.org/1999/xhtml"); + +/* .padded is used by autocomplete widgets that don't have an icon. Gross. -dwh */ +textbox:not(.padded) { + cursor: default; + padding: 0; +} + +textbox[nomatch="true"][highlightnonmatches="true"] { + color: red; +} + +textbox:not(.padded) .textbox-input-box { + margin: 0 3px; +} + +.textbox-input-box { + -moz-box-align: center; +} + +/* ::::: history button ::::: */ + +.autocomplete-history-dropmarker { + -moz-appearance: none !important; + border: none !important; + background-color: transparent !important; + padding: 0px; + list-style-image: url("chrome://global/skin/icons/autocomplete-dropmarker.png"); + margin: 0px; +} + +/* ::::: autocomplete popups ::::: */ + +panel[type="autocomplete"], +panel[type="autocomplete-richlistbox"], +.autocomplete-history-popup { + padding: 0px !important; + color: -moz-FieldText; + background-color: -moz-Field; + font: icon; + -moz-appearance: none; +} + +.autocomplete-history-popup { + max-height: 180px; +} + +/* ::::: tree ::::: */ + +.autocomplete-tree { + -moz-appearance: none !important; + border: none !important; + background-color: transparent !important; +} + +.autocomplete-treecol { + -moz-appearance: none !important; + margin: 0 !important; + border: none !important; + padding: 0 !important; +} + +.autocomplete-treebody::-moz-tree-cell-text { + padding-left: 2px; +} + +.autocomplete-treebody::-moz-tree-row { + border-top: none; +} + +treechildren.autocomplete-treebody::-moz-tree-row(selected) { + background-color: Highlight; +} + +treechildren.autocomplete-treebody::-moz-tree-cell-text(selected) { + color: HighlightText !important; +} + +.autocomplete-treebody::-moz-tree-image(treecolAutoCompleteValue) { + max-width: 16px; + height: 16px; +} + +/* ::::: richlistbox autocomplete ::::: */ + +.autocomplete-richlistbox { + -moz-appearance: none; + margin: 0; +} + +.autocomplete-richlistitem[selected="true"] { + background-color: Highlight; + color: HighlightText; + background-image: linear-gradient(rgba(255,255,255,0.3), transparent); +} + +.autocomplete-richlistitem { + padding: 5px 2px; +} + +.ac-url-box { + /* When setting a vertical margin here, half of that needs to be added + .ac-title-box's translateY for when .ac-url-box is hidden (see below). */ + margin-top: 1px; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box, +.autocomplete-richlistitem[type~="autofill"] .ac-url-box { + visibility: hidden; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box, +.autocomplete-richlistitem[type~="autofill"] .ac-title-box { + /* Center the title by moving it down by half of .ac-url-box's height, + including vertical margins (if any). */ + transform: translateY(.5em); +} + +.ac-site-icon { + width: 16px; + height: 16px; + margin-bottom: -1px; + -moz-margin-start: 7px; + -moz-margin-end: 5px; +} + +.ac-type-icon { + width: 16px; + height: 16px; + -moz-margin-start: 6px; + -moz-margin-end: 4px; +} + +.ac-url-box > .ac-site-icon, +.ac-url-box > .ac-type-icon { + /* Otherwise the spacer is big enough to stretch its container */ + height: auto; +} + +.ac-extra > .ac-result-type-tag { + margin: 0 4px; +} + +.ac-extra > .ac-comment { + padding-right: 4px; +} + +.ac-ellipsis-after { + margin: 0 !important; + padding: 0; + min-width: 1.1em; +} + +.ac-normal-text { + margin: 0 !important; + padding: 0; +} + +.ac-normal-text > html|span { + margin: 0 !important; + padding: 0; +} + +html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(208,208,208,0.4); + background-color: rgba(208,208,208,0.2); + border-radius: 2px; + text-shadow: 0 0 currentColor; +} + +.ac-url-text > html|span.ac-emphasize-text, +.ac-action-text > html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(183,210,226,0.4); + background-color: rgba(183,210,226,0.3); +} + +.ac-title, .ac-url { + overflow: hidden; +} + +/* ::::: textboxes inside toolbarpaletteitems ::::: */ + +toolbarpaletteitem > toolbaritem > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} + +toolbarpaletteitem > toolbaritem > * > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} diff --git a/application/palemoon/themes/osx/browser.css b/application/palemoon/themes/osx/browser.css index aa5918bab..a66ddacfc 100644 --- a/application/palemoon/themes/osx/browser.css +++ b/application/palemoon/themes/osx/browser.css @@ -1338,41 +1338,6 @@ richlistitem[type~="action"][actiontype="switchtab"][selected="true"] > .ac-url- min-width: 27em; } -.panel-promo-box { - margin: 10px -10px -10px; - padding: 8px 10px; - border-top: 1px solid ThreeDShadow; - background-image: linear-gradient(hsla(0,0%,0%,.15), hsla(0,0%,0%,.08) 6px); - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -@media (-moz-mac-lion-theme) { - .panel-promo-box { - border-top-style: none; - background: #f1f5fb; - color: GrayText; - box-shadow: 0px 1px 2px rgb(204,214,234) inset; - } -} - -.panel-promo-icon { - list-style-image: url("chrome://browser/skin/sync-notification-24.png"); - -moz-margin-end: 10px; - vertical-align: middle; -} - -.panel-promo-closebutton { - border: none; - -moz-margin-end: -14px; - margin-top: -8px; -} - -.panel-promo-closebutton > .toolbarbutton-text { - padding: 0; - margin: 0; -} - /* ::::: content area ::::: */ #sidebar { diff --git a/application/palemoon/themes/osx/jar.mn b/application/palemoon/themes/osx/jar.mn index 8742f1b87..186cd8a75 100644 --- a/application/palemoon/themes/osx/jar.mn +++ b/application/palemoon/themes/osx/jar.mn @@ -15,6 +15,7 @@ browser.jar: #ifdef MOZ_SERVICES_SYNC skin/classic/browser/aboutSyncTabs.css #endif +* skin/classic/browser/autocomplete.css skin/classic/browser/actionicon-tab.png skin/classic/browser/appmenu-icons.png skin/classic/browser/appmenu-dropmarker.png @@ -163,7 +164,6 @@ browser.jar: skin/classic/browser/sync-bg.png skin/classic/browser/sync-desktopIcon.png skin/classic/browser/sync-mobileIcon.png - skin/classic/browser/sync-notification-24.png skin/classic/browser/syncSetup.css skin/classic/browser/syncCommon.css skin/classic/browser/syncQuota.css diff --git a/application/palemoon/themes/osx/sync-notification-24.png b/application/palemoon/themes/osx/sync-notification-24.png Binary files differdeleted file mode 100644 index fc9a4e63d..000000000 --- a/application/palemoon/themes/osx/sync-notification-24.png +++ /dev/null diff --git a/application/palemoon/themes/windows/autocomplete.css b/application/palemoon/themes/windows/autocomplete.css new file mode 100644 index 000000000..f0f16cc27 --- /dev/null +++ b/application/palemoon/themes/windows/autocomplete.css @@ -0,0 +1,238 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* ===== autocomplete.css ================================================= + == Styles used by the autocomplete widget. + ======================================================================= */ + +@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); +@namespace html url("http://www.w3.org/1999/xhtml"); + +/* ::::: autocomplete ::::: */ + +/* .padded is used by autocomplete widgets that don't have an icon. Gross. -dwh */ +textbox:not(.padded) { + cursor: default; + padding: 0; +} + +textbox[nomatch="true"][highlightnonmatches="true"] { + color: red; +} + +.autocomplete-textbox-container { + -moz-box-align: center; +} + +textbox:not(.padded) .textbox-input-box { + margin: 0 3px; +} + +.textbox-input-box { + -moz-box-align: center; +} + +/* ::::: autocomplete popups ::::: */ + +panel[type="autocomplete"], +panel[type="autocomplete-richlistbox"], +.autocomplete-history-popup { + -moz-appearance: none; + border-width: 1px; + -moz-border-top-colors: ThreeDShadow; + -moz-border-right-colors: ThreeDShadow; + -moz-border-bottom-colors: ThreeDShadow; + -moz-border-left-colors: ThreeDShadow; + padding: 0; + color: -moz-FieldText; + background-color: -moz-Field; +} + +.autocomplete-history-popup { + max-height: 180px; +} + +/* ::::: tree ::::: */ + +.autocomplete-tree { + -moz-appearance: none !important; + border: none !important; + background-color: transparent !important; +} + +.autocomplete-treecol { + -moz-appearance: none !important; + margin: 0 !important; + border: none !important; + padding: 0 !important; +} + +/* GTK calculates space for a sort arrow */ +.autocomplete-treecol > .treecol-sortdirection { + -moz-appearance: none !important; +} + +.autocomplete-treebody::-moz-tree-cell-text { + -moz-padding-start: 8px; +} + +treechildren.autocomplete-treebody::-moz-tree-row(selected) { + background-color: Highlight; +} + +treechildren.autocomplete-treebody::-moz-tree-cell-text(selected) { + color: HighlightText !important; +} + +.autocomplete-treebody::-moz-tree-image(treecolAutoCompleteValue) { + max-width: 16px; + height: 16px; +} + +/* ::::: richlistbox autocomplete ::::: */ + +.autocomplete-richlistbox { + -moz-appearance: none; + margin: 0; +} + +.autocomplete-richlistitem { + padding: 1px; +} + +.autocomplete-richlistitem[selected="true"] { + background-color: Highlight; + color: HighlightText; +} + +%ifdef XP_WIN +@media (-moz-os-version: windows-vista) and (-moz-windows-default-theme), + (-moz-os-version: windows-win7) and (-moz-windows-default-theme) { + .autocomplete-richlistitem[selected="true"] { + color: inherit; + background-color: transparent; + /* four gradients for the bevel highlights on each edge, one for blue background */ + background-image: + linear-gradient(to bottom, rgba(255,255,255,0.9) 3px, transparent 3px), + linear-gradient(to right, rgba(255,255,255,0.5) 3px, transparent 3px), + linear-gradient(to left, rgba(255,255,255,0.5) 3px, transparent 3px), + linear-gradient(to top, rgba(255,255,255,0.4) 3px, transparent 3px), + linear-gradient(to bottom, rgba(163,196,247,0.3), rgba(122,180,246,0.3)); + background-clip: content-box; + border-radius: 6px; + outline: 1px solid rgb(124,163,206); + -moz-outline-radius: 3px; + outline-offset: -2px; + } +} +%endif + +.ac-title-box { + margin-top: 4px; +} + +.ac-url-box { + /* When setting a vertical margin here, half of that needs to be added + .ac-title-box's translateY for when .ac-url-box is hidden (see below). */ + margin: 1px 0 4px; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box, +.autocomplete-richlistitem[type~="autofill"] .ac-url-box { + visibility: hidden; +} + +.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box, +.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box, +.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box, +.autocomplete-richlistitem[type~="autofill"] .ac-title-box { + /* Center the title by moving it down by half of .ac-url-box's height, + including vertical margins (if any). */ + transform: translateY(calc(.5em + 2px)); +} + +.ac-site-icon { + width: 16px; + height: 16px; + margin: 0 5px -2px; +} + +.ac-type-icon { + width: 16px; + height: 16px; + -moz-margin-start: 6px; + -moz-margin-end: 4px; + margin-bottom: -1px; +} + +.ac-url-box > .ac-site-icon, +.ac-url-box > .ac-type-icon { + /* Otherwise the spacer is big enough to stretch its container */ + height: auto; +} + +.ac-extra > .ac-result-type-tag { + margin: 0 4px; +} + +.ac-extra > .ac-comment { + padding-right: 4px; +} + +.ac-ellipsis-after { + margin: 0 !important; + padding: 0; + min-width: 1em; +} + +.ac-normal-text { + margin: 0 !important; + padding: 0; +} + +.ac-normal-text > html|span { + margin: 0 !important; + padding: 0; +} + +html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(208,208,208,0.5); + background-color: rgba(208,208,208,0.3); + border-radius: 2px; + text-shadow: 0 0 currentColor; +} + +@media (-moz-windows-default-theme) { + @media not all and (-moz-os-version: windows-xp) { + html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(0,0,0,0.1); + background-color: rgba(0,0,0,0.05); + } + } + + @media (-moz-os-version: windows-xp) { + .ac-url-text > html|span.ac-emphasize-text, + .ac-action-text > html|span.ac-emphasize-text { + box-shadow: inset 0 0 1px 1px rgba(202,214,201,0.3); + background-color: rgba(202,214,201,0.2); + } + } +} + +.ac-title, .ac-url { + overflow: hidden; +} + +/* ::::: textboxes inside toolbarpaletteitems ::::: */ + +toolbarpaletteitem > toolbaritem > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} + +toolbarpaletteitem > toolbaritem > * > textbox > hbox > hbox > html|*.textbox-input { + visibility: hidden; +} + diff --git a/application/palemoon/themes/windows/browser.css b/application/palemoon/themes/windows/browser.css index 3e8c63af4..a64955f0f 100644 --- a/application/palemoon/themes/windows/browser.css +++ b/application/palemoon/themes/windows/browser.css @@ -1778,42 +1778,6 @@ richlistitem[type~="action"][actiontype="switchtab"] > .ac-url-box > .ac-action- min-width: 27em; } -.panel-promo-box { - margin: 10px -10px -10px; - padding: 8px 10px; - border-top: 1px solid ThreeDShadow; - background-image: linear-gradient(hsla(0,0%,0%,.15), hsla(0,0%,0%,.08) 6px); - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -@media (-moz-windows-default-theme) { - .panel-promo-box { - border-top-style: none; - background: #f1f5fb; - color: GrayText; - box-shadow: 0px 1px 2px rgb(204,214,234) inset; - } -} - -.panel-promo-icon { - list-style-image: url("chrome://browser/skin/sync-notification-24.png"); - -moz-margin-end: 10px; - vertical-align: middle; -} - -.panel-promo-closebutton { - -moz-appearance: none; - border: none; - -moz-margin-end: -10px; - margin-top: -5px; -} - -.panel-promo-closebutton > .toolbarbutton-text { - padding: 0; - margin: 0; -} - /* ::::: content area ::::: */ #sidebar { diff --git a/application/palemoon/themes/windows/jar.mn b/application/palemoon/themes/windows/jar.mn index 994e87be3..a66714b13 100644 --- a/application/palemoon/themes/windows/jar.mn +++ b/application/palemoon/themes/windows/jar.mn @@ -15,6 +15,7 @@ browser.jar: #ifdef MOZ_SERVICES_SYNC skin/classic/browser/aboutSyncTabs.css #endif +* skin/classic/browser/autocomplete.css skin/classic/browser/actionicon-tab.png skin/classic/browser/appmenu-icons.png skin/classic/browser/appmenu-dropmarker.png @@ -159,7 +160,6 @@ browser.jar: skin/classic/browser/sync-bg.png skin/classic/browser/sync-desktopIcon.png skin/classic/browser/sync-mobileIcon.png - skin/classic/browser/sync-notification-24.png skin/classic/browser/syncSetup.css skin/classic/browser/syncCommon.css skin/classic/browser/syncQuota.css diff --git a/application/palemoon/themes/windows/sync-notification-24.png b/application/palemoon/themes/windows/sync-notification-24.png Binary files differdeleted file mode 100644 index fc9a4e63d..000000000 --- a/application/palemoon/themes/windows/sync-notification-24.png +++ /dev/null |