MozillaFirefox/firefox-kde.patch
Wolfgang Rosenauer 297e7a3a3b - update to Firefox 63.0
* WebExtensions now run in their own process on Linux
  * The Ctrl+Tab shortcut now displays thumbnail previews of your
    tabs and cycles through tabs in recently used order. This new
    default behavior is activated only in new profiles and can be
    changed in preferences.
  * Added support for Web Components custom elements and shadow DOM
- requires NSPR 4.20, NSS 3.39 and Rust 1.28

OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaFirefox?expand=0&rev=691
2018-10-29 15:21:53 +00:00

1798 lines
82 KiB
Diff

# HG changeset patch
# Parent fdf78810e83396d10418791fbe32bed6bfe1558b
diff --git a/browser/base/content/browser-kde.xul b/browser/base/content/browser-kde.xul
new file mode 100644
--- /dev/null
+++ b/browser/base/content/browser-kde.xul
@@ -0,0 +1,1317 @@
+#filter substitution
+<?xml version="1.0"?>
+# -*- Mode: HTML -*-
+#
+# 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/.
+
+<!-- The "global.css" stylesheet is imported first to allow other stylesheets to
+ override rules using selectors with the same specificity. This applies to
+ both "content" and "skin" packages, which bug 1385444 will unify later. -->
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/tabbrowser.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/downloads/downloads.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/places/places.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/usercontext/usercontext.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/controlcenter/panel.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/customizableui/panelUI.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/downloads/downloads.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/searchbar.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/compacttheme.css" type="text/css" alternate="yes" title="Light/Dark"?>
+
+# All DTD information is stored in a separate file so that it can be shared by
+# hiddenWindow.xul.
+<!DOCTYPE window [
+#include browser-doctype.inc
+]>
+
+<window id="main-window"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&mainWindow.title;"
+ title_normal="&mainWindow.title;"
+#ifdef XP_MACOSX
+ title_privatebrowsing="&mainWindow.title;&mainWindow.titlemodifiermenuseparator;&mainWindow.titlePrivateBrowsingSuffix;"
+ titledefault="&mainWindow.title;"
+ titlemodifier=""
+ titlemodifier_normal=""
+ titlemodifier_privatebrowsing="&mainWindow.titlePrivateBrowsingSuffix;"
+#else
+ title_privatebrowsing="&mainWindow.titlemodifier; &mainWindow.titlePrivateBrowsingSuffix;"
+ titlemodifier="&mainWindow.titlemodifier;"
+ titlemodifier_normal="&mainWindow.titlemodifier;"
+ titlemodifier_privatebrowsing="&mainWindow.titlemodifier; &mainWindow.titlePrivateBrowsingSuffix;"
+#endif
+#ifdef XP_WIN
+ chromemargin="0,2,2,2"
+#else
+ chromemargin="0,-1,-1,-1"
+#endif
+ tabsintitlebar="true"
+ titlemenuseparator="&mainWindow.titlemodifiermenuseparator;"
+ windowtype="navigator:browser"
+ macanimationtype="document"
+ screenX="4" screenY="4"
+ fullscreenbutton="true"
+ sizemode="normal"
+ retargetdocumentfocus="urlbar"
+ persist="screenX screenY width height sizemode">
+
+# All JS files which are needed by browser.xul and other top level windows to
+# support MacOS specific features *must* go into the global-scripts.inc file so
+# that they can be shared with macWindow.inc.xul.
+#include global-scripts.inc
+
+<script type="application/javascript"
+#ifdef BROWSER_XHTML
+xmlns="http://www.w3.org/1999/xhtml"
+#endif
+>
+ Services.scriptloader.loadSubScript("chrome://global/content/contentAreaUtils.js", this);
+ Services.scriptloader.loadSubScript("chrome://browser/content/tabbrowser.js", this);
+
+ window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
+ window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);
+ window.onclose = WindowIsClosing;
+#ifdef BROWSER_XHTML
+ window.addEventListener("DOMContentLoaded",
+ gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });
+#else
+ window.addEventListener("MozBeforeInitialXULLayout",
+ gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });
+#endif
+ // The listener of DOMContentLoaded must be set on window, rather than
+ // document, because the window can go away before the event is fired.
+ // In that case, we don't want to initialize anything, otherwise we
+ // may be leaking things because they will never be destroyed after.
+ window.addEventListener("DOMContentLoaded",
+ gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true });
+</script>
+
+# All sets except for popupsets (commands, keys, and stringbundles)
+# *must* go into the browser-sets.inc file so that they can be shared with other
+# top level windows in macWindow.inc.xul.
+#include browser-sets.inc
+
+ <popupset id="mainPopupSet">
+ <menupopup id="tabContextMenu"
+ onpopupshowing="if (event.target == this) TabContextMenu.updateContextMenu(this);"
+ onpopuphidden="if (event.target == this) TabContextMenu.contextTab = null;">
+ <menuitem id="context_reloadTab" label="&reloadTab.label;" accesskey="&reloadTab.accesskey;"
+ oncommand="gBrowser.reloadTab(TabContextMenu.contextTab);"/>
+ <menuitem id="context_reloadSelectedTabs" label="&reloadSelectedTabs.label;" hidden="true"
+ accesskey="&reloadSelectedTabs.accesskey;"
+ oncommand="gBrowser.reloadMultiSelectedTabs();"/>
+ <menuitem id="context_toggleMuteTab" oncommand="TabContextMenu.contextTab.toggleMuteAudio();"/>
+ <menuitem id="context_toggleMuteSelectedTabs" hidden="true"
+ oncommand="gBrowser.toggleMuteAudioOnMultiSelectedTabs(TabContextMenu.contextTab);"/>
+ <menuseparator/>
+ <menuitem id="context_pinTab" label="&pinTab.label;"
+ accesskey="&pinTab.accesskey;"
+ oncommand="gBrowser.pinTab(TabContextMenu.contextTab);"/>
+ <menuitem id="context_unpinTab" label="&unpinTab.label;" hidden="true"
+ accesskey="&unpinTab.accesskey;"
+ oncommand="gBrowser.unpinTab(TabContextMenu.contextTab);"/>
+ <menuitem id="context_pinSelectedTabs" label="&pinSelectedTabs.label;" hidden="true"
+ accesskey="&pinSelectedTabs.accesskey;"
+ oncommand="gBrowser.pinMultiSelectedTabs();"/>
+ <menuitem id="context_unpinSelectedTabs" label="&unpinSelectedTabs.label;" hidden="true"
+ accesskey="&unpinSelectedTabs.accesskey;"
+ oncommand="gBrowser.unpinMultiSelectedTabs();"/>
+ <menuitem id="context_duplicateTab" label="&duplicateTab.label;"
+ accesskey="&duplicateTab.accesskey;"
+ oncommand="duplicateTabIn(TabContextMenu.contextTab, 'tab');"/>
+ <menu id="context_reopenInContainer"
+ label="&reopenInContainer.label;"
+ accesskey="&reopenInContainer.accesskey;"
+ hidden="true">
+ <menupopup oncommand="TabContextMenu.reopenInContainer(event);"
+ onpopupshowing="TabContextMenu.createReopenInContainerMenu(event);"/>
+ </menu>
+ <menuitem id="context_openTabInWindow" label="&moveToNewWindow.label;"
+ accesskey="&moveToNewWindow.accesskey;"
+ tbattr="tabbrowser-multiple"
+ oncommand="gBrowser.replaceTabsWithWindow(TabContextMenu.contextTab);"/>
+ <menuseparator id="context_sendTabToDevice_separator" class="sync-ui-item"/>
+ <menu id="context_sendTabToDevice" label="&sendTabToDevice.label;"
+ class="sync-ui-item"
+ accesskey="&sendTabToDevice.accesskey;">
+ <menupopup id="context_sendTabToDevicePopupMenu"
+ onpopupshowing="gSync.populateSendTabToDevicesMenu(event.target, TabContextMenu.contextTab.linkedBrowser.currentURI.spec, TabContextMenu.contextTab.linkedBrowser.contentTitle);"/>
+ </menu>
+ <menuseparator/>
+ <menuitem id="context_reloadAllTabs" label="&reloadAllTabs.label;" accesskey="&reloadAllTabs.accesskey;"
+ tbattr="tabbrowser-multiple-visible"
+ oncommand="gBrowser.reloadAllTabs();"/>
+ <menuitem id="context_bookmarkSelectedTabs"
+ hidden="true"
+ label="&bookmarkSelectedTabs.label;"
+ accesskey="&bookmarkSelectedTabs.accesskey;"
+ oncommand="PlacesCommandHook.bookmarkPages(PlacesCommandHook.uniqueSelectedPages);"/>
+ <menuitem id="context_bookmarkAllTabs"
+ label="&bookmarkAllTabs.label;"
+ accesskey="&bookmarkAllTabs.accesskey;"
+ command="Browser:BookmarkAllTabs"/>
+ <menuitem id="context_closeTabsToTheEnd" label="&closeTabsToTheEnd.label;" accesskey="&closeTabsToTheEnd.accesskey;"
+ oncommand="gBrowser.removeTabsToTheEndFrom(TabContextMenu.contextTab, {animate: true});"/>
+ <menuitem id="context_closeOtherTabs" label="&closeOtherTabs.label;" accesskey="&closeOtherTabs.accesskey;"
+ oncommand="gBrowser.removeAllTabsBut(TabContextMenu.contextTab);"/>
+ <menuseparator/>
+ <menuitem id="context_undoCloseTab"
+ label="&undoCloseTab.label;"
+ accesskey="&undoCloseTab.accesskey;"
+ observes="History:UndoCloseTab"/>
+ <menuitem id="context_closeTab" label="&closeTab.label;" accesskey="&closeTab.accesskey;"
+ oncommand="gBrowser.removeTab(TabContextMenu.contextTab, { animate: true });"/>
+ <menuitem id="context_closeSelectedTabs" label="&closeSelectedTabs.label;"
+ hidden="true" accesskey="&closeSelectedTabs.accesskey;"
+ oncommand="gBrowser.removeMultiSelectedTabs();"/>
+ </menupopup>
+
+ <!-- bug 415444/582485: event.stopPropagation is here for the cloned version
+ of this menupopup -->
+ <menupopup id="backForwardMenu"
+ onpopupshowing="return FillHistoryMenu(event.target);"
+ oncommand="gotoHistoryIndex(event); event.stopPropagation();"
+ onclick="checkForMiddleClick(this, event);"/>
+ <tooltip id="aHTMLTooltip" page="true"/>
+ <tooltip id="remoteBrowserTooltip"/>
+
+ <!-- for search and content formfill/pw manager -->
+
+ <panel type="autocomplete-richlistbox"
+ id="PopupAutoComplete"
+ role="group"
+ noautofocus="true"
+ hidden="true"
+ overflowpadding="4"
+ norolluponanchor="true"
+ nomaxresults="true" />
+
+ <!-- for search with one-off buttons -->
+ <panel type="autocomplete-richlistbox"
+ id="PopupSearchAutoComplete"
+ role="group"
+ noautofocus="true"
+ hidden="true" />
+
+ <!-- for url bar autocomplete -->
+ <panel type="autocomplete-richlistbox"
+ id="PopupAutoCompleteRichResult"
+ role="group"
+ noautofocus="true"
+ hidden="true"
+ flip="none"
+ level="parent"
+ overflowpadding="15" />
+
+ <!-- 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">
+ </panel>
+
+ <!-- for select dropdowns. The menupopup is what shows the list of options,
+ and the popuponly menulist makes things like the menuactive attributes
+ work correctly on the menupopup. ContentSelectDropdown expects the
+ popuponly menulist to be its immediate parent. -->
+ <menulist popuponly="true" id="ContentSelectDropdown" hidden="true">
+ <menupopup rolluponmousewheel="true"
+ activateontab="true" position="after_start"
+ level="parent"
+#ifdef XP_WIN
+ consumeoutsideclicks="false" ignorekeys="shortcuts"
+#endif
+ />
+ </menulist>
+
+ <!-- for invalid form error message -->
+ <panel id="invalid-form-popup" type="arrow" orient="vertical" noautofocus="true" hidden="true" level="parent">
+ <description/>
+ </panel>
+
+ <panel id="editBookmarkPanel"
+ type="arrow"
+ orient="vertical"
+ ignorekeys="true"
+ hidden="true"
+ tabspecific="true"
+ aria-labelledby="editBookmarkPanelTitle">
+ <box class="panel-header">
+ <label id="editBookmarkPanelTitle"/>
+ </box>
+ <html:div id="editBookmarkPanelFaviconContainer">
+ <html:img id="editBookmarkPanelFavicon"/>
+ </html:div>
+ <box id="editBookmarkPanelImage"/>
+#include ../../components/places/content/editBookmarkPanel.inc.xul
+ <vbox id="editBookmarkPanelBottomContent"
+ flex="1">
+ <checkbox id="editBookmarkPanel_showForNewBookmarks"
+ label="&editBookmark.showForNewBookmarks.label;"
+ accesskey="&editBookmark.showForNewBookmarks.accesskey;"
+ oncommand="StarUI.onShowForNewBookmarksCheckboxCommand();"/>
+ </vbox>
+ <hbox id="editBookmarkPanelBottomButtons"
+ style="min-width: &editBookmark.panel.width;;">
+#ifdef XP_UNIX
+ <button id="editBookmarkPanelDoneButton"
+ class="editBookmarkPanelBottomButton"
+ label="&editBookmark.done.label;"
+ default="true"
+ oncommand="StarUI.panel.hidePopup();"/>
+ <button id="editBookmarkPanelRemoveButton"
+ class="editBookmarkPanelBottomButton"
+ oncommand="StarUI.removeBookmarkButtonCommand();"/>
+#else
+ <button id="editBookmarkPanelRemoveButton"
+ class="editBookmarkPanelBottomButton"
+ oncommand="StarUI.removeBookmarkButtonCommand();"/>
+ <button id="editBookmarkPanelDoneButton"
+ class="editBookmarkPanelBottomButton"
+ label="&editBookmark.done.label;"
+ default="true"
+ oncommand="StarUI.panel.hidePopup();"/>
+#endif
+ </hbox>
+ </panel>
+
+ <!-- UI tour experience -->
+ <panel id="UITourTooltip"
+ type="arrow"
+ hidden="true"
+ noautofocus="true"
+ noautohide="true"
+ align="start"
+ orient="vertical"
+ role="alert">
+ <vbox>
+ <hbox id="UITourTooltipBody">
+ <image id="UITourTooltipIcon"/>
+ <vbox flex="1">
+ <hbox id="UITourTooltipTitleContainer">
+ <label id="UITourTooltipTitle" flex="1"/>
+ <toolbarbutton id="UITourTooltipClose" class="close-icon"
+ tooltiptext="&uiTour.infoPanel.close;"/>
+ </hbox>
+ <description id="UITourTooltipDescription" flex="1"/>
+ </vbox>
+ </hbox>
+ <hbox id="UITourTooltipButtons" flex="1" align="center"/>
+ </vbox>
+ </panel>
+ <!-- type="default" forces frames to be created so that the panel's size can be determined -->
+ <panel id="UITourHighlightContainer"
+ type="default"
+ hidden="true"
+ noautofocus="true"
+ noautohide="true"
+ flip="none"
+ consumeoutsideclicks="false"
+ mousethrough="always">
+ <box id="UITourHighlight"></box>
+ </panel>
+
+ <panel id="sidebarMenu-popup"
+ class="cui-widget-panel"
+ role="group"
+ type="arrow"
+ hidden="true"
+ flip="slide"
+ orient="vertical"
+ position="bottomcenter topleft">
+ <toolbarbutton id="sidebar-switcher-bookmarks"
+ type="checkbox"
+ label="&bookmarksButton.label;"
+ class="subviewbutton subviewbutton-iconic"
+ key="viewBookmarksSidebarKb"
+ oncommand="SidebarUI.show('viewBookmarksSidebar');"/>
+ <toolbarbutton id="sidebar-switcher-history"
+ type="checkbox"
+ label="&historyButton.label;"
+ class="subviewbutton subviewbutton-iconic"
+ key="key_gotoHistory"
+ oncommand="SidebarUI.show('viewHistorySidebar');"/>
+ <toolbarbutton id="sidebar-switcher-tabs"
+ type="checkbox"
+ label="&syncedTabs.sidebar.label;"
+ class="subviewbutton subviewbutton-iconic sync-ui-item"
+ oncommand="SidebarUI.show('viewTabsSidebar');"/>
+ <toolbarseparator/>
+ <!-- Extension toolbarbuttons go here. -->
+ <toolbarseparator id="sidebar-extensions-separator"/>
+ <toolbarbutton id="sidebar-reverse-position"
+ class="subviewbutton"
+ oncommand="SidebarUI.reversePosition()"/>
+ <toolbarseparator/>
+ <toolbarbutton label="&sidebarMenuClose.label;"
+ class="subviewbutton"
+ oncommand="SidebarUI.hide()"/>
+ </panel>
+
+ <menupopup id="toolbar-context-menu"
+ onpopupshowing="onViewToolbarsPopupShowing(event, document.getElementById('viewToolbarsMenuSeparator')); UpdateDownloadsAutoHide(this); UpdateManageExtension(this)">
+ <menuitem oncommand="openAboutAddonsForContextAction(this.parentElement)"
+ accesskey="&customizeMenu.manageExtension.accesskey;"
+ label="&customizeMenu.manageExtension.label;"
+ contexttype="toolbaritem"
+ class="customize-context-manageExtension"/>
+ <menuseparator/>
+ <menuitem oncommand="gCustomizeMode.addToPanel(document.popupNode)"
+ accesskey="&customizeMenu.pinToOverflowMenu.accesskey;"
+ label="&customizeMenu.pinToOverflowMenu.label;"
+ contexttype="toolbaritem"
+ class="customize-context-moveToPanel"/>
+ <menuitem oncommand="onDownloadsAutoHideChange(event)"
+ type="checkbox"
+ accesskey="&customizeMenu.autoHideDownloadsButton.accesskey;"
+ label="&customizeMenu.autoHideDownloadsButton.label;"
+ contexttype="toolbaritem"
+ class="customize-context-autoHide"/>
+ <menuitem oncommand="gCustomizeMode.removeFromArea(document.popupNode)"
+ accesskey="&customizeMenu.removeFromToolbar.accesskey;"
+ label="&customizeMenu.removeFromToolbar.label;"
+ contexttype="toolbaritem"
+ class="customize-context-removeFromToolbar"/>
+ <menuitem id="toolbar-context-reloadAllTabs"
+ class="toolbaritem-tabsmenu"
+ contexttype="tabbar"
+ oncommand="gBrowser.reloadAllTabs();"
+ label="&toolbarContextMenu.reloadAllTabs.label;"
+ accesskey="&toolbarContextMenu.reloadAllTabs.accesskey;"/>
+ <menuitem id="toolbar-context-bookmarkAllTabs"
+ class="toolbaritem-tabsmenu"
+ contexttype="tabbar"
+ command="Browser:BookmarkAllTabs"
+ label="&toolbarContextMenu.bookmarkAllTabs.label;"
+ accesskey="&toolbarContextMenu.bookmarkAllTabs.accesskey;"/>
+ <menuitem id="toolbar-context-undoCloseTab"
+ class="toolbaritem-tabsmenu"
+ contexttype="tabbar"
+ label="&toolbarContextMenu.undoCloseTab.label;"
+ accesskey="&toolbarContextMenu.undoCloseTab.accesskey;"
+ observes="History:UndoCloseTab"/>
+ <menuseparator/>
+ <menuseparator id="viewToolbarsMenuSeparator"/>
+ <!-- XXXgijs: we're using oncommand handler here to avoid the event being
+ redirected to the command element, thus preventing
+ listeners on the menupopup or further up the tree from
+ seeing the command event pass by. The observes attribute is
+ here so that the menuitem is still disabled and re-enabled
+ correctly. -->
+ <menuitem oncommand="gCustomizeMode.enter()"
+ observes="cmd_CustomizeToolbars"
+ class="viewCustomizeToolbar"
+ label="&viewCustomizeToolbar.label;"
+ accesskey="&viewCustomizeToolbar.accesskey;"/>
+ </menupopup>
+
+ <menupopup id="blockedPopupOptions"
+ onpopupshowing="gPopupBlockerObserver.fillPopupList(event);"
+ onpopuphiding="gPopupBlockerObserver.onPopupHiding(event);">
+ <menuitem id="blockedPopupAllowSite"
+ accesskey="&allowPopups.accesskey;"
+ oncommand="gPopupBlockerObserver.toggleAllowPopupsForSite(event);"/>
+ <menuitem
+#ifdef XP_WIN
+ label="&editPopupSettings.label;"
+#else
+ label="&editPopupSettingsUnix.label;"
+#endif
+ accesskey="&editPopupSettings.accesskey;"
+ oncommand="gPopupBlockerObserver.editPopupSettings();"/>
+ <menuitem id="blockedPopupDontShowMessage"
+ accesskey="&dontShowMessage.accesskey;"
+ type="checkbox"
+ oncommand="gPopupBlockerObserver.dontShowMessage();"/>
+ <menuseparator id="blockedPopupsSeparator"/>
+ </menupopup>
+
+ <menupopup id="autohide-context"
+ onpopupshowing="FullScreen.getAutohide(this.firstChild);">
+ <menuitem type="checkbox" label="&fullScreenAutohide.label;"
+ accesskey="&fullScreenAutohide.accesskey;"
+ oncommand="FullScreen.setAutohide();"/>
+ <menuseparator/>
+ <menuitem label="&fullScreenExit.label;"
+ accesskey="&fullScreenExit.accesskey;"
+ oncommand="BrowserFullScreen();"/>
+ </menupopup>
+
+ <menupopup id="contentAreaContextMenu" pagemenu="#page-menu-separator"
+ onpopupshowing="if (event.target != this)
+ return true;
+ gContextMenu = new nsContextMenu(this, event.shiftKey);
+ if (gContextMenu.shouldDisplay)
+ updateEditUIVisibility();
+ return gContextMenu.shouldDisplay;"
+ onpopuphiding="if (event.target != this)
+ return;
+ gContextMenu.hiding();
+ gContextMenu = null;
+ updateEditUIVisibility();">
+#include browser-context.inc
+ </menupopup>
+
+#include ../../components/places/content/placesContextMenu.inc.xul
+
+ <panel id="ctrlTab-panel" hidden="true" norestorefocus="true" level="top">
+ <hbox id="ctrlTab-previews"/>
+ <hbox id="ctrlTab-showAll-container" pack="center"/>
+ </panel>
+
+ <panel id="pageActionPanel"
+ class="cui-widget-panel"
+ role="group"
+ type="arrow"
+ hidden="true"
+ flip="slide"
+ photon="true"
+ position="bottomcenter topright"
+ tabspecific="true"
+ noautofocus="true"
+ copyURL-title="&pageAction.copyLink.label;"
+ emailLink-title="&emailPageCmd.label;"
+ sendToDevice-title="&pageAction.sendTabToDevice.label;"
+ sendToDevice-notReadyTitle="&sendToDevice.syncNotReady.label;"
+ shareURL-title="&pageAction.shareUrl.label;"
+ shareMore-label="&pageAction.shareMore.label;">
+ <panelmultiview id="pageActionPanelMultiView"
+ mainViewId="pageActionPanelMainView"
+ viewCacheId="appMenu-viewCache">
+ <panelview id="pageActionPanelMainView"
+ context="pageActionContextMenu"
+ class="PanelUI-subView">
+ <vbox class="panel-subview-body"/>
+ </panelview>
+ </panelmultiview>
+ </panel>
+
+ <panel id="confirmation-hint"
+ role="alert"
+ type="arrow"
+ hidden="true"
+ flip="slide"
+ position="bottomcenter topright"
+ tabspecific="true"
+ noautofocus="true">
+ <hbox id="confirmation-hint-checkmark-animation-container">
+ <image id="confirmation-hint-checkmark-image"/>
+ </hbox>
+ <label id="confirmation-hint-message"/>
+ </panel>
+
+ <menupopup id="pageActionContextMenu"
+ onpopupshowing="BrowserPageActions.onContextMenuShowing(event, this);">
+ <menuitem class="pageActionContextMenuItem builtInUnpinned"
+ label="&pageAction.addToUrlbar.label;"
+ oncommand="BrowserPageActions.togglePinningForContextAction();"/>
+ <menuitem class="pageActionContextMenuItem builtInPinned"
+ label="&pageAction.removeFromUrlbar.label;"
+ oncommand="BrowserPageActions.togglePinningForContextAction();"/>
+ <menuitem class="pageActionContextMenuItem extensionUnpinned"
+ label="&pageAction.allowInUrlbar.label;"
+ oncommand="BrowserPageActions.togglePinningForContextAction();"/>
+ <menuitem class="pageActionContextMenuItem extensionPinned"
+ label="&pageAction.disallowInUrlbar.label;"
+ oncommand="BrowserPageActions.togglePinningForContextAction();"/>
+ <menuseparator class="pageActionContextMenuItem extensionPinned extensionUnpinned"/>
+ <menuitem class="pageActionContextMenuItem extensionPinned extensionUnpinned"
+ label="&pageAction.manageExtension.label;"
+ oncommand="BrowserPageActions.openAboutAddonsForContextAction();"/>
+ </menupopup>
+
+#include ../../components/places/content/bookmarksHistoryTooltip.inc.xul
+
+ <tooltip id="tabbrowser-tab-tooltip" onpopupshowing="gBrowser.createTooltip(event);"/>
+
+ <tooltip id="back-button-tooltip">
+ <label class="tooltip-label" value="&backButton.tooltip;"/>
+#ifdef XP_MACOSX
+ <label class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
+#else
+ <label class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
+#endif
+ </tooltip>
+
+ <tooltip id="forward-button-tooltip">
+ <label class="tooltip-label" value="&forwardButton.tooltip;"/>
+#ifdef XP_MACOSX
+ <label class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
+#else
+ <label class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
+#endif
+ </tooltip>
+
+#include popup-notifications.inc
+
+#include ../../components/customizableui/content/panelUI.inc.xul
+#include ../../components/controlcenter/content/panel.inc.xul
+#include ../../components/downloads/content/downloadsPanel.inc.xul
+#include browser-allTabsMenu.inc.xul
+
+ <hbox id="downloads-animation-container" mousethrough="always">
+ <vbox id="downloads-notification-anchor" hidden="true">
+ <vbox id="downloads-indicator-notification"/>
+ </vbox>
+ </hbox>
+
+ <tooltip id="dynamic-shortcut-tooltip"
+ onpopupshowing="UpdateDynamicShortcutTooltipText(this);"/>
+
+ <menupopup id="SyncedTabsSidebarContext">
+ <menuitem label="&syncedTabs.context.open.label;"
+ accesskey="&syncedTabs.context.open.accesskey;"
+ id="syncedTabsOpenSelected" where="current"/>
+ <menuitem label="&syncedTabs.context.openInNewTab.label;"
+ accesskey="&syncedTabs.context.openInNewTab.accesskey;"
+ id="syncedTabsOpenSelectedInTab" where="tab"/>
+ <menuitem label="&syncedTabs.context.openInNewWindow.label;"
+ accesskey="&syncedTabs.context.openInNewWindow.accesskey;"
+ id="syncedTabsOpenSelectedInWindow" where="window"/>
+ <menuitem label="&syncedTabs.context.openInNewPrivateWindow.label;"
+ accesskey="&syncedTabs.context.openInNewPrivateWindow.accesskey;"
+ id="syncedTabsOpenSelectedInPrivateWindow" where="window" private="true"/>
+ <menuseparator/>
+ <menuitem label="&syncedTabs.context.bookmarkSingleTab.label;"
+ accesskey="&syncedTabs.context.bookmarkSingleTab.accesskey;"
+ id="syncedTabsBookmarkSelected"/>
+ <menuitem label="&syncedTabs.context.copy.label;"
+ accesskey="&syncedTabs.context.copy.accesskey;"
+ id="syncedTabsCopySelected"/>
+ <menuseparator/>
+ <menuitem label="&syncedTabs.context.openAllInTabs.label;"
+ accesskey="&syncedTabs.context.openAllInTabs.accesskey;"
+ id="syncedTabsOpenAllInTabs"/>
+ <menuitem label="&syncedTabs.context.managedevices.label;"
+ accesskey="&syncedTabs.context.managedevices.accesskey;"
+ id="syncedTabsManageDevices"
+ oncommand="gSync.openDevicesManagementPage('syncedtabs-sidebar');"/>
+ <menuitem label="&syncSyncNowItem.label;"
+ accesskey="&syncSyncNowItem.accesskey;"
+ id="syncedTabsRefresh"/>
+ </menupopup>
+ <menupopup id="SyncedTabsSidebarTabsFilterContext"
+ class="textbox-contextmenu">
+ <menuitem label="&undoCmd.label;"
+ accesskey="&undoCmd.accesskey;"
+ cmd="cmd_undo"/>
+ <menuseparator/>
+ <menuitem label="&cutCmd.label;"
+ accesskey="&cutCmd.accesskey;"
+ cmd="cmd_cut"/>
+ <menuitem label="&copyCmd.label;"
+ accesskey="&copyCmd.accesskey;"
+ cmd="cmd_copy"/>
+ <menuitem label="&pasteCmd.label;"
+ accesskey="&pasteCmd.accesskey;"
+ cmd="cmd_paste"/>
+ <menuitem label="&deleteCmd.label;"
+ accesskey="&deleteCmd.accesskey;"
+ cmd="cmd_delete"/>
+ <menuseparator/>
+ <menuitem label="&selectAllCmd.label;"
+ accesskey="&selectAllCmd.accesskey;"
+ cmd="cmd_selectAll"/>
+ <menuseparator/>
+ <menuitem label="&syncSyncNowItem.label;"
+ accesskey="&syncSyncNowItem.accesskey;"
+ id="syncedTabsRefreshFilter"/>
+ </menupopup>
+
+ <hbox id="statuspanel" inactive="true" layer="true">
+ <hbox id="statuspanel-inner">
+ <label id="statuspanel-label"
+ role="status"
+ aria-live="off"
+ flex="1"
+ crop="end"/>
+ </hbox>
+ </hbox>
+ </popupset>
+ <box id="appMenu-viewCache" hidden="true"/>
+
+<vbox id="titlebar">
+ <hbox id="titlebar-content">
+ <spacer id="titlebar-spacer" flex="1"/>
+ <hbox id="titlebar-buttonbox-container">
+ <hbox id="titlebar-buttonbox" class="titlebar-color">
+ <toolbarbutton class="titlebar-button" id="titlebar-min" oncommand="window.minimize();"/>
+ <toolbarbutton class="titlebar-button" id="titlebar-max" oncommand="onTitlebarMaxClick();"/>
+ <toolbarbutton class="titlebar-button" id="titlebar-close" command="cmd_closeWindow"/>
+ </hbox>
+ </hbox>
+#ifdef XP_MACOSX
+ <!-- OS X does not natively support RTL for its titlebar items, so we prevent this secondary
+ buttonbox from reversing order in RTL by forcing an LTR direction. -->
+ <hbox id="titlebar-secondary-buttonbox" dir="ltr">
+ <button class="accessibility-indicator" tooltiptext="&accessibilityIndicator.tooltip;" aria-live="polite"/>
+ <hbox class="private-browsing-indicator"/>
+ <hbox id="titlebar-fullscreen-button"/>
+ </hbox>
+#endif
+ </hbox>
+</vbox>
+
+ <toolbox id="navigator-toolbox">
+ <!-- Menu -->
+ <toolbar type="menubar" id="toolbar-menubar"
+ class="browser-toolbar chromeclass-menubar titlebar-color"
+ customizable="true"
+ mode="icons"
+#ifdef MENUBAR_CAN_AUTOHIDE
+ toolbarname="&menubarCmd.label;"
+ accesskey="&menubarCmd.accesskey;"
+ autohide="true"
+#endif
+ context="toolbar-context-menu">
+ <toolbaritem id="menubar-items" align="center">
+# The entire main menubar is placed into browser-menubar.inc, so that it can be
+# shared with other top level windows in macWindow.inc.xul.
+#include browser-menubar.inc
+ </toolbaritem>
+
+#ifndef XP_MACOSX
+ <hbox class="titlebar-placeholder" type="caption-buttons" ordinal="1000"
+ skipintoolbarset="true"/>
+#endif
+ </toolbar>
+
+ <toolbar id="TabsToolbar"
+ class="browser-toolbar titlebar-color"
+ fullscreentoolbar="true"
+ customizable="true"
+ mode="icons"
+ aria-label="&tabsToolbar.label;"
+ context="toolbar-context-menu">
+ <hbox class="titlebar-placeholder" type="pre-tabs"
+ skipintoolbarset="true"/>
+
+ <tabs id="tabbrowser-tabs"
+ flex="1"
+ setfocus="false"
+ tooltip="tabbrowser-tab-tooltip"
+ stopwatchid="FX_TAB_CLICK_MS">
+ <tab class="tabbrowser-tab" selected="true" visuallyselected="true" fadein="true"/>
+ </tabs>
+
+ <toolbarbutton id="new-tab-button"
+ class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&tabCmd.label;"
+ command="cmd_newNavigatorTab"
+ onclick="checkForMiddleClick(this, event);"
+ tooltip="dynamic-shortcut-tooltip"
+ ondrop="newTabButtonObserver.onDrop(event)"
+ ondragover="newTabButtonObserver.onDragOver(event)"
+ ondragenter="newTabButtonObserver.onDragOver(event)"
+ ondragexit="newTabButtonObserver.onDragExit(event)"
+ cui-areatype="toolbar"
+ removable="true"/>
+
+ <toolbarbutton id="alltabs-button"
+ class="toolbarbutton-1 chromeclass-toolbar-additional tabs-alltabs-button badged-button"
+ oncommand="gTabsPanel.showAllTabsPanel();"
+ label="&listAllTabs.label;"
+ tooltiptext="&listAllTabs.label;"
+ removable="false"/>
+
+ <hbox class="titlebar-placeholder" type="post-tabs"
+ ordinal="1000"
+ skipintoolbarset="true"/>
+
+ <button class="accessibility-indicator" tooltiptext="&accessibilityIndicator.tooltip;"
+ ordinal="1000"
+ aria-live="polite" skipintoolbarset="true"/>
+ <hbox class="private-browsing-indicator" skipintoolbarset="true"
+ ordinal="1000"/>
+ <hbox class="titlebar-placeholder" type="caption-buttons"
+#ifndef XP_MACOSX
+ ordinal="1000"
+#endif
+ skipintoolbarset="true"/>
+
+#ifdef XP_MACOSX
+ <hbox class="titlebar-placeholder" type="fullscreen-button"
+ skipintoolbarset="true"/>
+#endif
+ </toolbar>
+
+ <toolbar id="nav-bar"
+ class="browser-toolbar"
+ aria-label="&navbarCmd.label;"
+ fullscreentoolbar="true" mode="icons" customizable="true"
+ customizationtarget="nav-bar-customization-target"
+ overflowable="true"
+ overflowbutton="nav-bar-overflow-button"
+ overflowtarget="widget-overflow-list"
+ overflowpanel="widget-overflow"
+ context="toolbar-context-menu">
+
+ <hbox id="nav-bar-customization-target" flex="1">
+ <toolbarbutton id="back-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&backCmd.label;"
+ removable="false" overflows="false"
+ keepbroadcastattributeswhencustomizing="true"
+ command="Browser:BackOrBackDuplicate"
+ onclick="checkForMiddleClick(this, event);"
+ tooltip="back-button-tooltip"
+ context="backForwardMenu"/>
+ <toolbarbutton id="forward-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&forwardCmd.label;"
+ removable="false" overflows="false"
+ keepbroadcastattributeswhencustomizing="true"
+ command="Browser:ForwardOrForwardDuplicate"
+ onclick="checkForMiddleClick(this, event);"
+ tooltip="forward-button-tooltip"
+ context="backForwardMenu"/>
+ <toolbaritem id="stop-reload-button" class="chromeclass-toolbar-additional"
+ title="&reloadCmd.label;"
+ removable="true" overflows="false">
+ <toolbarbutton id="reload-button" class="toolbarbutton-1"
+ label="&reloadCmd.label;"
+ command="Browser:ReloadOrDuplicate"
+ onclick="checkForMiddleClick(this, event);"
+ tooltip="dynamic-shortcut-tooltip">
+ <box class="toolbarbutton-animatable-box">
+ <image class="toolbarbutton-animatable-image"/>
+ </box>
+ </toolbarbutton>
+ <toolbarbutton id="stop-button" class="toolbarbutton-1"
+ label="&stopCmd.label;"
+ command="Browser:Stop"
+ tooltip="dynamic-shortcut-tooltip">
+ <box class="toolbarbutton-animatable-box">
+ <image class="toolbarbutton-animatable-image"/>
+ </box>
+ </toolbarbutton>
+ </toolbaritem>
+ <toolbarbutton id="home-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ removable="true"
+ label="&homeButton.label;"
+ ondragover="homeButtonObserver.onDragOver(event)"
+ ondragenter="homeButtonObserver.onDragOver(event)"
+ ondrop="homeButtonObserver.onDrop(event)"
+ ondragexit="homeButtonObserver.onDragExit(event)"
+ key="goHome"
+ onclick="BrowserGoHome(event);"
+ cui-areatype="toolbar"
+ tooltiptext="&homeButton.defaultPage.tooltip;"/>
+ <toolbarspring cui-areatype="toolbar" class="chromeclass-toolbar-additional"/>
+ <toolbaritem id="urlbar-container" flex="400" persist="width"
+ removable="false"
+ class="chromeclass-location" overflows="false">
+ <textbox id="urlbar" flex="1"
+ placeholder="&urlbar.placeholder2;"
+ defaultPlaceholder="&urlbar.placeholder2;"
+ focused="true"
+ type="autocomplete"
+ autocompletesearch="unifiedcomplete"
+ autocompletesearchparam="enable-actions"
+ autocompletepopup="PopupAutoCompleteRichResult"
+ completeselectedindex="true"
+ tabscrolling="true"
+ newlines="stripsurroundingwhitespace"
+ ontextentered="this.handleCommand(param);"
+ ontextreverted="return this.handleRevert();"
+ pageproxystate="invalid">
+ <!-- Use onclick instead of normal popup= syntax since the popup
+ code fires onmousedown, and hence eats our favicon drag events. -->
+ <box id="identity-box" role="button"
+ align="center"
+ aria-label="&urlbar.viewSiteInfo.label;"
+ onclick="gIdentityHandler.handleIdentityButtonEvent(event);"
+ onkeypress="gIdentityHandler.handleIdentityButtonEvent(event);"
+ ondragstart="gIdentityHandler.onDragStart(event);">
+ <image id="identity-icon"
+ consumeanchor="identity-box"
+ onclick="PageProxyClickHandler(event);"/>
+ <image id="sharing-icon" mousethrough="always"/>
+ <box id="tracking-protection-icon-box" animationsenabled="true">
+ <image id="tracking-protection-icon"/>
+ <box id="tracking-protection-icon-animatable-box" flex="1">
+ <image id="tracking-protection-icon-animatable-image" flex="1"/>
+ </box>
+ </box>
+ <box id="blocked-permissions-container" align="center">
+ <image data-permission-id="geo" class="blocked-permission-icon geo-icon" role="button"
+ tooltiptext="&urlbar.geolocationBlocked.tooltip;"/>
+ <image data-permission-id="desktop-notification" class="blocked-permission-icon desktop-notification-icon" role="button"
+ tooltiptext="&urlbar.webNotificationsBlocked.tooltip;"/>
+ <image data-permission-id="camera" class="blocked-permission-icon camera-icon" role="button"
+ tooltiptext="&urlbar.cameraBlocked.tooltip;"/>
+ <image data-permission-id="microphone" class="blocked-permission-icon microphone-icon" role="button"
+ tooltiptext="&urlbar.microphoneBlocked.tooltip;"/>
+ <image data-permission-id="screen" class="blocked-permission-icon screen-icon" role="button"
+ tooltiptext="&urlbar.screenBlocked.tooltip;"/>
+ <image data-permission-id="persistent-storage" class="blocked-permission-icon persistent-storage-icon" role="button"
+ tooltiptext="&urlbar.persistentStorageBlocked.tooltip;"/>
+ <image data-permission-id="popup" class="blocked-permission-icon popup-icon" role="button"
+ tooltiptext="&urlbar.popupBlocked.tooltip;"/>
+ <image data-permission-id="autoplay-media" class="blocked-permission-icon autoplay-media-icon" role="button"
+ tooltiptext="&urlbar.autoplayMediaBlocked.tooltip;"/>
+ <image data-permission-id="canvas" class="blocked-permission-icon canvas-icon" role="button"
+ tooltiptext="&urlbar.canvasBlocked.tooltip;"/>
+ <image data-permission-id="plugin:flash" class="blocked-permission-icon plugin-icon" role="button"
+ tooltiptext="&urlbar.flashPluginBlocked.tooltip;"/>
+ <image data-permission-id="midi" class="blocked-permission-icon midi-icon" role="button"
+ tooltiptext="&urlbar.midiBlocked.tooltip;"/>
+ </box>
+ <box id="notification-popup-box"
+ hidden="true"
+ onmouseover="document.getElementById('identity-box').classList.add('no-hover');"
+ onmouseout="document.getElementById('identity-box').classList.remove('no-hover');"
+ align="center">
+ <image id="default-notification-icon" class="notification-anchor-icon" role="button"
+ tooltiptext="&urlbar.defaultNotificationAnchor.tooltip;"/>
+ <image id="geo-notification-icon" class="notification-anchor-icon geo-icon" role="button"
+ tooltiptext="&urlbar.geolocationNotificationAnchor.tooltip;"/>
+ <image id="autoplay-media-notification-icon" class="notification-anchor-icon autoplay-media-icon" role="button"
+ tooltiptext="&urlbar.autoplayNotificationAnchor.tooltip;"/>
+ <image id="addons-notification-icon" class="notification-anchor-icon install-icon" role="button"
+ tooltiptext="&urlbar.addonsNotificationAnchor.tooltip;"/>
+ <image id="canvas-notification-icon" class="notification-anchor-icon" role="button"
+ tooltiptext="&urlbar.canvasNotificationAnchor.tooltip;"/>
+ <image id="indexedDB-notification-icon" class="notification-anchor-icon indexedDB-icon" role="button"
+ tooltiptext="&urlbar.indexedDBNotificationAnchor.tooltip;"/>
+ <image id="password-notification-icon" class="notification-anchor-icon login-icon" role="button"
+ tooltiptext="&urlbar.passwordNotificationAnchor.tooltip;"/>
+ <stack id="plugins-notification-icon" class="notification-anchor-icon" role="button" align="center"
+ tooltiptext="&urlbar.pluginsNotificationAnchor.tooltip;">
+ <image class="plugin-icon" />
+ <image id="plugin-icon-badge" />
+ </stack>
+ <image id="web-notifications-notification-icon" class="notification-anchor-icon desktop-notification-icon" role="button"
+ tooltiptext="&urlbar.webNotificationAnchor.tooltip;"/>
+ <image id="webRTC-shareDevices-notification-icon" class="notification-anchor-icon camera-icon" role="button"
+ tooltiptext="&urlbar.webRTCShareDevicesNotificationAnchor.tooltip;"/>
+ <image id="webRTC-shareMicrophone-notification-icon" class="notification-anchor-icon microphone-icon" role="button"
+ tooltiptext="&urlbar.webRTCShareMicrophoneNotificationAnchor.tooltip;"/>
+ <image id="webRTC-shareScreen-notification-icon" class="notification-anchor-icon screen-icon" role="button"
+ tooltiptext="&urlbar.webRTCShareScreenNotificationAnchor.tooltip;"/>
+ <image id="servicesInstall-notification-icon" class="notification-anchor-icon service-icon" role="button"
+ tooltiptext="&urlbar.servicesNotificationAnchor.tooltip;"/>
+ <image id="translate-notification-icon" class="notification-anchor-icon translation-icon" role="button"
+ tooltiptext="&urlbar.translateNotificationAnchor.tooltip;"/>
+ <image id="translated-notification-icon" class="notification-anchor-icon translation-icon in-use" role="button"
+ tooltiptext="&urlbar.translatedNotificationAnchor.tooltip;"/>
+ <image id="eme-notification-icon" class="notification-anchor-icon drm-icon" role="button"
+ tooltiptext="&urlbar.emeNotificationAnchor.tooltip;"/>
+ <image id="persistent-storage-notification-icon" class="notification-anchor-icon persistent-storage-icon" role="button"
+ tooltiptext="&urlbar.persistentStorageNotificationAnchor.tooltip;"/>
+ <image id="midi-notification-icon" class="notification-anchor-icon midi-icon" role="button"
+ tooltiptext="&urlbar.midiNotificationAnchor.tooltip;"/>
+ <image id="webauthn-notification-icon" class="notification-anchor-icon" role="button"
+ tooltiptext="&urlbar.webAuthnAnchor.tooltip;"/>
+ </box>
+ <image id="connection-icon"/>
+ <image id="extension-icon"/>
+ <image id="remote-control-icon"
+ tooltiptext="&urlbar.remoteControlNotificationAnchor.tooltip;"/>
+ <hbox id="identity-icon-labels">
+ <label id="identity-icon-label" class="plain" flex="1"/>
+ <label id="identity-icon-country-label" class="plain"/>
+ </hbox>
+ </box>
+ <box id="urlbar-display-box" align="center">
+ <label id="switchtab" class="urlbar-display urlbar-display-switchtab" value="&urlbar.switchToTab.label;"/>
+ <label id="extension" class="urlbar-display urlbar-display-extension" value="&urlbar.extension.label;"/>
+ </box>
+ <hbox id="page-action-buttons" context="pageActionContextMenu">
+ <hbox id="contextual-feature-recommendation" role="button" hidden="true">
+ <hbox id="cfr-label-container">
+ <label id="cfr-label"/>
+ </hbox>
+ <image id="cfr-button"
+ class="urlbar-icon urlbar-page-action"
+ role="presentation"/>
+ </hbox>
+ <hbox id="userContext-icons" hidden="true">
+ <label id="userContext-label"/>
+ <image id="userContext-indicator"/>
+ </hbox>
+ <image id="reader-mode-button"
+ class="urlbar-icon urlbar-page-action"
+ tooltip="dynamic-shortcut-tooltip"
+ role="button"
+ hidden="true"
+ onclick="ReaderParent.buttonClick(event);"/>
+ <toolbarbutton id="urlbar-zoom-button"
+ onclick="FullZoom.reset();"
+ tooltip="dynamic-shortcut-tooltip"
+ hidden="true"/>
+ <box id="pageActionSeparator" class="urlbar-page-action"/>
+ <image id="pageActionButton"
+ class="urlbar-icon urlbar-page-action"
+ role="button"
+ tooltiptext="&pageActionButton.tooltip;"
+ onmousedown="BrowserPageActions.mainButtonClicked(event);"/>
+ <hbox id="star-button-box"
+ hidden="true"
+ class="urlbar-icon-wrapper urlbar-page-action"
+ onclick="BrowserPageActions.doCommandForAction(PageActions.actionForID('bookmark'), event, this);">
+ <image id="star-button"
+ class="urlbar-icon"
+ role="button"/>
+ <hbox id="star-button-animatable-box">
+ <image id="star-button-animatable-image"
+ role="presentation"/>
+ </hbox>
+ </hbox>
+ </hbox>
+ </textbox>
+ </toolbaritem>
+
+ <toolbarspring cui-areatype="toolbar" class="chromeclass-toolbar-additional"/>
+
+ <!-- This is a placeholder for the Downloads Indicator. It is visible
+ during the customization of the toolbar, in the palette, and before
+ the Downloads Indicator overlay is loaded. -->
+ <toolbarbutton id="downloads-button"
+ class="toolbarbutton-1 chromeclass-toolbar-additional badged-button"
+ key="key_openDownloads"
+ onmousedown="DownloadsIndicatorView.onCommand(event);"
+ ondrop="DownloadsIndicatorView.onDrop(event);"
+ ondragover="DownloadsIndicatorView.onDragOver(event);"
+ ondragenter="DownloadsIndicatorView.onDragOver(event);"
+ label="&downloads.label;"
+ removable="true"
+ overflows="false"
+ cui-areatype="toolbar"
+ hidden="true"
+ tooltip="dynamic-shortcut-tooltip"
+ indicator="true">
+ <!-- The panel's anchor area is smaller than the outer button, but must
+ always be visible and must not move or resize when the indicator
+ state changes, otherwise the panel could change its position or lose
+ its arrow unexpectedly. -->
+ <stack id="downloads-indicator-anchor"
+ consumeanchor="downloads-button">
+ <box id="downloads-indicator-icon"/>
+ <stack id="downloads-indicator-progress-outer">
+ <box id="downloads-indicator-progress-inner"/>
+ </stack>
+ </stack>
+ </toolbarbutton>
+
+ <toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
+ removable="true"
+ onmousedown="PanelUI.showSubView('appMenu-libraryView', this, event);"
+ closemenu="none"
+ cui-areatype="toolbar"
+ tooltiptext="&libraryButton.tooltip;"
+ label="&places.library.title;"/>
+
+ </hbox>
+
+ <toolbarbutton id="nav-bar-overflow-button"
+ class="toolbarbutton-1 chromeclass-toolbar-additional overflow-button"
+ skipintoolbarset="true"
+ tooltiptext="&navbarOverflow.label;">
+ <box class="toolbarbutton-animatable-box">
+ <image class="toolbarbutton-animatable-image"/>
+ </box>
+ </toolbarbutton>
+
+ <toolbaritem id="PanelUI-button"
+ removable="false">
+ <toolbarbutton id="PanelUI-menu-button"
+ class="toolbarbutton-1 badged-button"
+ consumeanchor="PanelUI-button"
+ label="&brandShortName;"
+ tooltiptext="&appmenu.tooltip;"/>
+ </toolbaritem>
+
+ <hbox id="window-controls" hidden="true" pack="end" skipintoolbarset="true"
+ ordinal="1000">
+ <toolbarbutton id="minimize-button"
+ tooltiptext="&fullScreenMinimize.tooltip;"
+ oncommand="window.minimize();"/>
+
+ <toolbarbutton id="restore-button"
+#ifdef XP_MACOSX
+# Prior to 10.7 there wasn't a native fullscreen button so we use #restore-button
+# to exit fullscreen and want it to behave like other toolbar buttons.
+ class="toolbarbutton-1"
+#endif
+ tooltiptext="&fullScreenRestore.tooltip;"
+ oncommand="BrowserFullScreen();"/>
+
+ <toolbarbutton id="close-button"
+ tooltiptext="&fullScreenClose.tooltip;"
+ oncommand="BrowserTryToCloseWindow();"/>
+ </hbox>
+ </toolbar>
+
+ <toolbar id="PersonalToolbar"
+ mode="icons"
+ class="browser-toolbar chromeclass-directories"
+ context="toolbar-context-menu"
+ toolbarname="&personalbarCmd.label;" accesskey="&personalbarCmd.accesskey;"
+ collapsed="true"
+ customizable="true">
+ <toolbaritem id="personal-bookmarks"
+ title="&bookmarksToolbarItem.label;"
+ cui-areatype="toolbar"
+ removable="true">
+ <toolbarbutton id="bookmarks-toolbar-placeholder"
+ class="bookmark-item"
+ label="&bookmarksToolbarItem.label;"/>
+ <toolbarbutton id="bookmarks-toolbar-button"
+ class="toolbarbutton-1"
+ flex="1"
+ label="&bookmarksToolbarItem.label;"
+ oncommand="PlacesToolbarHelper.onPlaceholderCommand();"/>
+ <hbox flex="1"
+ id="PlacesToolbar"
+ context="placesContext"
+ onmouseup="BookmarksEventHandler.onMouseUp(event);"
+ onclick="BookmarksEventHandler.onClick(event, this._placesView);"
+ oncommand="BookmarksEventHandler.onCommand(event);"
+ tooltip="bhTooltip"
+ popupsinherittooltip="true">
+ <hbox flex="1">
+ <hbox id="PlacesToolbarDropIndicatorHolder" align="center" collapsed="true">
+ <image id="PlacesToolbarDropIndicator"
+ mousethrough="always"
+ collapsed="true"/>
+ </hbox>
+ <scrollbox orient="horizontal"
+ id="PlacesToolbarItems"
+ flex="1"/>
+ <toolbarbutton type="menu"
+ id="PlacesChevron"
+ class="toolbarbutton-1"
+ mousethrough="never"
+ collapsed="true"
+ tooltiptext="&bookmarksToolbarChevron.tooltip;"
+ onpopupshowing="document.getElementById('PlacesToolbar')
+ ._placesView._onChevronPopupShowing(event);">
+ <menupopup id="PlacesChevronPopup"
+ placespopup="true"
+ tooltip="bhTooltip" popupsinherittooltip="true"
+ context="placesContext"/>
+ </toolbarbutton>
+ </hbox>
+ </hbox>
+ </toolbaritem>
+ </toolbar>
+
+ <toolbarpalette id="BrowserToolbarPalette">
+
+ <toolbarbutton id="print-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+#ifdef XP_MACOSX
+ command="cmd_print"
+ tooltip="dynamic-shortcut-tooltip"
+#else
+ command="cmd_printPreview"
+ tooltiptext="&printButton.tooltip;"
+#endif
+ label="&printButton.label;"/>
+
+
+ <toolbarbutton id="new-window-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&newNavigatorCmd.label;"
+ command="cmd_newNavigator"
+ tooltip="dynamic-shortcut-tooltip"
+ ondrop="newWindowButtonObserver.onDrop(event)"
+ ondragover="newWindowButtonObserver.onDragOver(event)"
+ ondragenter="newWindowButtonObserver.onDragOver(event)"
+ ondragexit="newWindowButtonObserver.onDragExit(event)"/>
+
+ <toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ observes="View:FullScreen"
+ type="checkbox"
+ label="&fullScreenCmd.label;"
+ tooltip="dynamic-shortcut-tooltip"/>
+
+ <toolbarbutton id="bookmarks-menu-button"
+ class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
+ type="menu"
+ label="&bookmarksMenuButton2.label;"
+ tooltip="dynamic-shortcut-tooltip"
+ anchor="dropmarker"
+ ondragenter="PlacesMenuDNDHandler.onDragEnter(event);"
+ ondragover="PlacesMenuDNDHandler.onDragOver(event);"
+ ondragleave="PlacesMenuDNDHandler.onDragLeave(event);"
+ ondrop="PlacesMenuDNDHandler.onDrop(event);"
+ oncommand="BookmarkingUI.onCommand(event);">
+ <menupopup id="BMB_bookmarksPopup"
+ class="cui-widget-panel cui-widget-panelview cui-widget-panelWithFooter PanelUI-subView"
+ placespopup="true"
+ context="placesContext"
+ openInTabs="children"
+ side="top"
+ onmouseup="BookmarksEventHandler.onMouseUp(event);"
+ oncommand="BookmarksEventHandler.onCommand(event);"
+ onclick="BookmarksEventHandler.onClick(event, this.parentNode._placesView);"
+ onpopupshowing="BookmarkingUI.onPopupShowing(event);
+ BookmarkingUI.attachPlacesView(event, this);"
+ tooltip="bhTooltip" popupsinherittooltip="true">
+ <menuitem id="BMB_viewBookmarksSidebar"
+ class="menuitem-iconic subviewbutton"
+ label-show="&viewBookmarksSidebar2.label;"
+ label-hide="&hideBookmarksSidebar.label;"
+ oncommand="SidebarUI.toggle('viewBookmarksSidebar');"/>
+ <!-- NB: temporary solution for bug 985024, this should go away soon. -->
+ <menuitem id="BMB_bookmarksShowAllTop"
+ class="menuitem-iconic subviewbutton"
+ label="&showAllBookmarks2.label;"
+ command="Browser:ShowAllBookmarks"
+ key="manBookmarkKb"/>
+ <menuseparator/>
+ <menu id="BMB_bookmarksToolbar"
+ class="menu-iconic bookmark-item subviewbutton"
+ label="&personalbarCmd.label;"
+ container="true">
+ <menupopup id="BMB_bookmarksToolbarPopup"
+ placespopup="true"
+ context="placesContext"
+ onpopupshowing="if (!this.parentNode._placesView)
+ new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.toolbarGuid}`,
+ PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);">
+ <menuitem id="BMB_viewBookmarksToolbar"
+ class="menuitem-iconic subviewbutton"
+ label-show="&viewBookmarksToolbar.label;"
+ label-hide="&hideBookmarksToolbar.label;"
+ oncommand="BookmarkingUI.toggleBookmarksToolbar();"/>
+ <menuseparator/>
+ <!-- Bookmarks toolbar items -->
+ </menupopup>
+ </menu>
+ <menu id="BMB_unsortedBookmarks"
+ class="menu-iconic bookmark-item subviewbutton"
+ label="&bookmarksMenuButton.other.label;"
+ container="true">
+ <menupopup id="BMB_unsortedBookmarksPopup"
+ placespopup="true"
+ context="placesContext"
+ onpopupshowing="if (!this.parentNode._placesView)
+ new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.unfiledGuid}`,
+ PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);"/>
+ </menu>
+ <menu id="BMB_mobileBookmarks"
+ class="menu-iconic bookmark-item subviewbutton"
+ label="&bookmarksMenuButton.mobile.label;"
+ hidden="true"
+ container="true">
+ <menupopup id="BMB_mobileBookmarksPopup"
+ placespopup="true"
+ context="placesContext"
+ onpopupshowing="if (!this.parentNode._placesView)
+ new PlacesMenu(event, `place:parent=${PlacesUtils.bookmarks.mobileGuid}`,
+ PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);"/>
+ </menu>
+
+ <menuseparator/>
+ <!-- Bookmarks menu items will go here -->
+ <menuitem id="BMB_bookmarksShowAll"
+ class="subviewbutton panel-subview-footer"
+ label="&showAllBookmarks2.label;"
+ command="Browser:ShowAllBookmarks"
+ key="manBookmarkKb"/>
+ </menupopup>
+ </toolbarbutton>
+
+ <toolbaritem id="search-container"
+ class="chromeclass-toolbar-additional"
+ title="&searchItem.title;"
+ align="center"
+ flex="100"
+ persist="width">
+ <searchbar id="searchbar" flex="1"/>
+ </toolbaritem>
+ </toolbarpalette>
+ <box id="library-animatable-box" class="toolbarbutton-animatable-box">
+ <image class="toolbarbutton-animatable-image"/>
+ </box>
+ </toolbox>
+
+ <hbox id="fullscr-toggler" hidden="true"/>
+
+ <deck id="content-deck" flex="1">
+ <hbox flex="1" id="browser">
+ <vbox id="browser-border-start" hidden="true" layer="true"/>
+ <vbox id="sidebar-box" hidden="true" class="chromeclass-extrachrome">
+ <sidebarheader id="sidebar-header" align="center">
+ <toolbarbutton id="sidebar-switcher-target" flex="1" class="tabbable">
+ <image id="sidebar-icon" consumeanchor="sidebar-switcher-target"/>
+ <label id="sidebar-title" crop="end" flex="1" control="sidebar"/>
+ <image id="sidebar-switcher-arrow"/>
+ </toolbarbutton>
+ <image id="sidebar-throbber"/>
+# To ensure the button label's intrinsic width doesn't expand the sidebar
+# if the label is long, the button needs flex=1.
+# To ensure the button doesn't expand unnecessarily for short labels, the
+# spacer should significantly out-flex the button.
+ <spacer flex="1000"/>
+ <toolbarbutton id="sidebar-close" class="close-icon tabbable" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="SidebarUI.hide();"/>
+ </sidebarheader>
+ <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true" disablefullscreen="true"
+ style="min-width: 14em; width: 18em; max-width: 36em;" tooltip="aHTMLTooltip"/>
+ </vbox>
+
+ <splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" hidden="true"/>
+ <vbox id="appcontent" flex="1">
+ <notificationbox id="high-priority-global-notificationbox" notificationside="top"/>
+ <tabbox id="tabbrowser-tabbox"
+ flex="1" tabcontainer="tabbrowser-tabs">
+ <tabpanels id="tabbrowser-tabpanels"
+ flex="1" class="plain" selectedIndex="0"/>
+ </tabbox>
+ </vbox>
+ <vbox id="browser-border-end" hidden="true" layer="true"/>
+ </hbox>
+#include ../../components/customizableui/content/customizeMode.inc.xul
+ </deck>
+
+ <html:div id="fullscreen-warning" class="pointerlockfswarning" hidden="true">
+ <html:div class="pointerlockfswarning-domain-text">
+ &fullscreenWarning.beforeDomain.label;
+ <html:span class="pointerlockfswarning-domain"/>
+ &fullscreenWarning.afterDomain.label;
+ </html:div>
+ <html:div class="pointerlockfswarning-generic-text">
+ &fullscreenWarning.generic.label;
+ </html:div>
+ <html:button id="fullscreen-exit-button"
+ onclick="FullScreen.exitDomFullScreen();">
+#ifdef XP_MACOSX
+ &exitDOMFullscreenMac.button;
+#else
+ &exitDOMFullscreen.button;
+#endif
+ </html:button>
+ </html:div>
+
+ <html:div id="pointerlock-warning" class="pointerlockfswarning" hidden="true">
+ <html:div class="pointerlockfswarning-domain-text">
+ &pointerlockWarning.beforeDomain.label;
+ <html:span class="pointerlockfswarning-domain"/>
+ &pointerlockWarning.afterDomain.label;
+ </html:div>
+ <html:div class="pointerlockfswarning-generic-text">
+ &pointerlockWarning.generic.label;
+ </html:div>
+ </html:div>
+
+ <vbox id="browser-bottombox" layer="true">
+ <notificationbox id="global-notificationbox" notificationside="bottom"/>
+ </vbox>
+
+</window>
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -28,16 +28,18 @@ browser.jar:
content/browser/aboutTabCrashed.js (content/aboutTabCrashed.js)
content/browser/aboutTabCrashed.xhtml (content/aboutTabCrashed.xhtml)
* content/browser/browser.css (content/browser.css)
content/browser/browser.js (content/browser.js)
#ifdef MOZ_BROWSER_XHTML
* content/browser/browser.xhtml (content/browser.xhtml)
#endif
* content/browser/browser.xul (content/browser.xul)
+* content/browser/browser-kde.xul (content/browser-kde.xul)
+% override chrome://browser/content/browser.xul chrome://browser/content/browser-kde.xul desktop=kde
content/browser/browser-addons.js (content/browser-addons.js)
content/browser/browser-allTabsMenu.js (content/browser-allTabsMenu.js)
content/browser/browser-captivePortal.js (content/browser-captivePortal.js)
content/browser/browser-ctrlTab.js (content/browser-ctrlTab.js)
content/browser/browser-customization.js (content/browser-customization.js)
content/browser/browser-data-submission-info-bar.js (content/browser-data-submission-info-bar.js)
content/browser/browser-compacttheme.js (content/browser-compacttheme.js)
content/browser/browser-contentblocking.js (content/browser-contentblocking.js)
diff --git a/browser/components/build/nsModule.cpp b/browser/components/build/nsModule.cpp
--- a/browser/components/build/nsModule.cpp
+++ b/browser/components/build/nsModule.cpp
@@ -8,17 +8,17 @@
#include "nsBrowserCompsCID.h"
#include "DirectoryProvider.h"
#if defined(XP_WIN)
#include "nsWindowsShellService.h"
#elif defined(XP_MACOSX)
#include "nsMacShellService.h"
#elif defined(MOZ_WIDGET_GTK)
-#include "nsGNOMEShellService.h"
+#include "nsUnixShellService.h"
#endif
#if defined(MOZ_WIDGET_COCOA)
#include "nsMacAttribution.h"
#endif
#if defined(XP_WIN)
#include "nsIEHistoryEnumerator.h"
@@ -34,18 +34,16 @@ using namespace mozilla::browser;
/////////////////////////////////////////////////////////////////////////////
NS_GENERIC_FACTORY_CONSTRUCTOR(DirectoryProvider)
#if defined(XP_WIN)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindowsShellService)
#elif defined(XP_MACOSX)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacShellService)
-#elif defined(MOZ_WIDGET_GTK)
-NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init)
#endif
#if defined(MOZ_WIDGET_COCOA)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacAttributionService)
#endif
#if defined(XP_WIN)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEHistoryEnumerator)
@@ -70,17 +68,17 @@ NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID)
NS_DEFINE_NAMED_CID(NS_MACATTRIBUTIONSERVICE_CID);
#endif
static const mozilla::Module::CIDEntry kBrowserCIDs[] = {
{ &kNS_BROWSERDIRECTORYPROVIDER_CID, false, nullptr, DirectoryProviderConstructor },
#if defined(XP_WIN)
{ &kNS_SHELLSERVICE_CID, false, nullptr, nsWindowsShellServiceConstructor },
#elif defined(MOZ_WIDGET_GTK)
- { &kNS_SHELLSERVICE_CID, false, nullptr, nsGNOMEShellServiceConstructor },
+ { &kNS_SHELLSERVICE_CID, false, nullptr, nsUnixShellServiceConstructor },
#endif
{ &kNS_FEEDSNIFFER_CID, false, nullptr, nsFeedSnifferConstructor },
{ &kNS_BROWSER_ABOUT_REDIRECTOR_CID, false, nullptr, AboutRedirector::Create },
#if defined(XP_WIN)
{ &kNS_WINIEHISTORYENUMERATOR_CID, false, nullptr, nsIEHistoryEnumeratorConstructor },
#elif defined(XP_MACOSX)
{ &kNS_SHELLSERVICE_CID, false, nullptr, nsMacShellServiceConstructor },
#endif
diff --git a/browser/components/preferences/in-content/main.js b/browser/components/preferences/in-content/main.js
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -327,16 +327,23 @@ var gMainPane = {
this._backoffIndex++ : backoffTimes.length - 1]);
};
window.setTimeout(() => {
window.requestIdleCallback(pollForDefaultBrowser);
}, backoffTimes[this._backoffIndex]);
}
+ var env = Components.classes["@mozilla.org/process/environment;1"]
+ .getService(Components.interfaces.nsIEnvironment);
+ var kde_session = 0;
+ if (env.get('KDE_FULL_SESSION') == "true") {
+ kde_session = 1;
+ }
+
this.initBrowserContainers();
this.buildContentProcessCountMenuList();
let performanceSettingsLink = document.getElementById("performanceSettingsLearnMore");
let performanceSettingsUrl = Services.urlFormatter.formatURLPref("app.support.baseURL") + "performance";
performanceSettingsLink.setAttribute("href", performanceSettingsUrl);
this.updateDefaultPerformanceSettingsPref();
@@ -962,16 +969,27 @@ var gMainPane = {
// Reset exponential backoff delay time in order to do visual update in pollForDefaultBrowser.
this._backoffIndex = 0;
let shellSvc = getShellService();
if (!shellSvc)
return;
try {
shellSvc.setDefaultBrowser(true, false);
+ if (kde_session == 1) {
+ var shellObj = Components.classes["@mozilla.org/file/local;1"]
+ .createInstance(Components.interfaces.nsILocalFile);
+ shellObj.initWithPath("/usr/bin/kwriteconfig");
+ var process = Components.classes["@mozilla.org/process/util;1"]
+ .createInstance(Components.interfaces.nsIProcess);
+ process.init(shellObj);
+ var args = ["--file", "kdeglobals", "--group", "General", "--key",
+ "BrowserApplication", "firefox"];
+ process.run(false, args, args.length);
+ }
} catch (ex) {
Cu.reportError(ex);
return;
}
let selectedIndex = shellSvc.isDefaultBrowser(false, true) ? 1 : 0;
document.getElementById("setDefaultPane").selectedIndex = selectedIndex;
}
diff --git a/browser/components/shell/moz.build b/browser/components/shell/moz.build
--- a/browser/components/shell/moz.build
+++ b/browser/components/shell/moz.build
@@ -39,16 +39,18 @@ if CONFIG['OS_ARCH'] == 'WINNT':
]
elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
SOURCES += [
'nsMacShellService.cpp',
]
elif 'gtk' in CONFIG['MOZ_WIDGET_TOOLKIT']:
SOURCES += [
'nsGNOMEShellService.cpp',
+ 'nsKDEShellService.cpp',
+ 'nsUnixShellService.cpp',
]
if SOURCES:
FINAL_LIBRARY = 'browsercomps'
EXTRA_JS_MODULES += [
'HeadlessShell.jsm',
'ShellService.jsm',
diff --git a/browser/components/shell/nsKDEShellService.cpp b/browser/components/shell/nsKDEShellService.cpp
new file mode 100644
--- /dev/null
+++ b/browser/components/shell/nsKDEShellService.cpp
@@ -0,0 +1,204 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+#include "mozilla/ArrayUtils.h"
+
+#include "nsCOMPtr.h"
+#include "nsKDEShellService.h"
+#include "nsShellService.h"
+#include "nsKDEUtils.h"
+#include "nsIPrefService.h"
+#include "nsIProcess.h"
+#include "nsIFile.h"
+#include "nsServiceManagerUtils.h"
+#include "nsComponentManagerUtils.h"
+#include "nsIMutableArray.h"
+#include "nsISupportsPrimitives.h"
+#include "nsArrayUtils.h"
+
+using namespace mozilla;
+
+nsresult
+nsKDEShellService::Init()
+{
+ if( !nsKDEUtils::kdeSupport())
+ return NS_ERROR_NOT_AVAILABLE;
+ return NS_OK;
+}
+
+NS_IMPL_ISUPPORTS(nsKDEShellService, nsIGNOMEShellService, nsIShellService)
+
+NS_IMETHODIMP
+nsKDEShellService::IsDefaultBrowser(bool aStartupCheck,
+ bool aForAllTypes,
+ bool* aIsDefaultBrowser)
+{
+ *aIsDefaultBrowser = false;
+ if (aStartupCheck)
+ mCheckedThisSession = true;
+
+ nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
+ if (!command)
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ if (!str)
+ return NS_ERROR_FAILURE;
+
+ str->SetData( NS_LITERAL_CSTRING( "ISDEFAULTBROWSER" ));
+ command->AppendElement( str );
+
+ if( nsKDEUtils::command( command ))
+ *aIsDefaultBrowser = true;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::SetDefaultBrowser(bool aClaimAllTypes,
+ bool aForAllUsers)
+{
+ nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
+ if (!command)
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> cmdstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ nsCOMPtr<nsISupportsCString> paramstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ if (!cmdstr || !paramstr)
+ return NS_ERROR_FAILURE;
+
+ cmdstr->SetData( NS_LITERAL_CSTRING( "SETDEFAULTBROWSER" ));
+ command->AppendElement( cmdstr );
+
+ paramstr->SetData( aClaimAllTypes ? NS_LITERAL_CSTRING( "ALLTYPES" ) : NS_LITERAL_CSTRING( "NORMAL" ));
+ command->AppendElement( paramstr );
+
+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::GetCanSetDesktopBackground(bool* aResult)
+{
+ *aResult = true;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::SetDesktopBackground(dom::Element* aElement,
+ int32_t aPosition,
+ const nsACString& aImageName)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::GetDesktopBackgroundColor(PRUint32 *aColor)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::SetDesktopBackgroundColor(PRUint32 aColor)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::OpenApplication(PRInt32 aApplication)
+{
+ nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
+ if (!command)
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ if (!str)
+ return NS_ERROR_FAILURE;
+
+ if( aApplication == APPLICATION_MAIL )
+ str->SetData( NS_LITERAL_CSTRING( "OPENMAIL" ));
+ else if( aApplication == APPLICATION_NEWS )
+ str->SetData( NS_LITERAL_CSTRING( "OPENNEWS" ));
+ else
+ return NS_ERROR_NOT_IMPLEMENTED;
+
+ command->AppendElement( str );
+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::OpenApplicationWithURI(nsIFile* aApplication, const nsACString& aURI)
+{
+ nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
+ if (!command)
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> cmdstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ nsCOMPtr<nsISupportsCString> appstr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ nsCOMPtr<nsISupportsCString> uristr = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ if (!cmdstr || !appstr || !uristr)
+ return NS_ERROR_FAILURE;
+
+ cmdstr->SetData( NS_LITERAL_CSTRING( "RUN" ));
+ command->AppendElement( cmdstr );
+ nsAutoCString app;
+ nsresult rv = aApplication->GetNativePath( app );
+ NS_ENSURE_SUCCESS( rv, rv );
+ appstr->SetData( app );
+ command->AppendElement( appstr );
+ uristr->SetData( aURI );
+ command->AppendElement( uristr );
+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::GetDefaultFeedReader(nsIFile** _retval)
+{
+ *_retval = nullptr;
+
+ nsCOMPtr<nsIMutableArray> command = do_CreateInstance( NS_ARRAY_CONTRACTID );
+ if( !command )
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> str = do_CreateInstance( NS_SUPPORTS_CSTRING_CONTRACTID );
+ if( !str )
+ return NS_ERROR_FAILURE;
+
+ str->SetData( NS_LITERAL_CSTRING( "GETDEFAULTFEEDREADER" ));
+ command->AppendElement( str );
+
+ nsCOMPtr<nsIArray> output;
+ if( !nsKDEUtils::command( command, getter_AddRefs( output ) ) )
+ return NS_ERROR_FAILURE;
+
+ PRUint32 length;
+ output->GetLength( &length );
+ if( length != 1 )
+ return NS_ERROR_FAILURE;
+
+ nsCOMPtr<nsISupportsCString> resstr = do_QueryElementAt( output, 0 );
+ if( !resstr )
+ return NS_ERROR_FAILURE;
+
+ nsAutoCString path;
+ resstr->GetData( path );
+ if (path.IsEmpty())
+ return NS_ERROR_FAILURE;
+
+ nsresult rv;
+ nsCOMPtr<nsIFile> defaultReader =
+ do_CreateInstance("@mozilla.org/file/local;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ rv = defaultReader->InitWithNativePath(path);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ bool exists;
+ rv = defaultReader->Exists(&exists);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!exists)
+ return NS_ERROR_FAILURE;
+
+ NS_ADDREF(*_retval = defaultReader);
+ return NS_OK;
+}
diff --git a/browser/components/shell/nsKDEShellService.h b/browser/components/shell/nsKDEShellService.h
new file mode 100644
--- /dev/null
+++ b/browser/components/shell/nsKDEShellService.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+#ifndef nskdeshellservice_h____
+#define nskdeshellservice_h____
+
+#include "nsIGNOMEShellService.h"
+#include "nsString.h"
+#include "mozilla/Attributes.h"
+
+class nsKDEShellService final : public nsIGNOMEShellService
+{
+public:
+ nsKDEShellService() : mCheckedThisSession(false) { }
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSISHELLSERVICE
+ NS_DECL_NSIGNOMESHELLSERVICE
+
+ nsresult Init();
+
+private:
+ ~nsKDEShellService() {}
+
+ bool mCheckedThisSession;
+};
+
+#endif // nskdeshellservice_h____
diff --git a/browser/components/shell/nsUnixShellService.cpp b/browser/components/shell/nsUnixShellService.cpp
new file mode 100644
--- /dev/null
+++ b/browser/components/shell/nsUnixShellService.cpp
@@ -0,0 +1,22 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+
+#include "nsUnixShellService.h"
+#include "nsGNOMEShellService.h"
+#include "nsKDEShellService.h"
+#include "nsKDEUtils.h"
+#include "mozilla/ModuleUtils.h"
+
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGNOMEShellService, Init)
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsKDEShellService, Init)
+
+NS_IMETHODIMP
+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult)
+{
+ if( nsKDEUtils::kdeSupport())
+ return nsKDEShellServiceConstructor( aOuter, aIID, aResult );
+ return nsGNOMEShellServiceConstructor( aOuter, aIID, aResult );
+}
diff --git a/browser/components/shell/nsUnixShellService.h b/browser/components/shell/nsUnixShellService.h
new file mode 100644
--- /dev/null
+++ b/browser/components/shell/nsUnixShellService.h
@@ -0,0 +1,15 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+
+#ifndef nsunixshellservice_h____
+#define nsunixshellservice_h____
+
+#include "nsIGNOMEShellService.h"
+
+NS_IMETHODIMP
+nsUnixShellServiceConstructor(nsISupports *aOuter, REFNSIID aIID, void **aResult);
+
+#endif // nsunixshellservice_h____
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -462,16 +462,18 @@
@RESPATH@/browser/defaults/settings/pinning
@RESPATH@/browser/defaults/settings/main
; 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
+@RESPATH@/defaults/pref/kde.js
+
; Services (gre) prefs
@RESPATH@/defaults/pref/services-sync.js
; [Layout Engine Resources]
; Style Sheets, Graphics and other Resources used by the layout engine.
@RESPATH@/res/EditorOverride.css
@RESPATH@/res/contenteditable.css
@RESPATH@/res/designmode.css