1
0
MozillaFirefox/firefox-kde.patch
Wolfgang Rosenauer c3624659ef - update to Firefox 57.0b14
* Firefox Quantum
  * Photon UI
  * Unified address and search bar
  * AMD VP9 hardware video decoder support
  * Added support for Date/Time input
  * stricter security sandbox blocking filesystem reading and
    writing on Linux systems
  * middle mouse paste in the content area no longer navigates to
    URLs by default on Unix systems
  MFSA 2017-24
  * CVE-2017-7828 (bmo#1406750. bmo#1412252)
    Use-after-free of PressShell while restyling layout
  * CVE-2017-7830 (bmo#1408990)
    Cross-origin URL information leak through Resource Timing API
  * CVE-2017-7831 (bmo#1392026)
    Information disclosure of exposed properties on JavaScript proxy
    objects
  * CVE-2017-7832 (bmo#1408782)
    Domain spoofing through use of dotless 'i' character followed
    by accent markers
  * CVE-2017-7833 (bmo#1370497)
    Domain spoofing with Arabic and Indic vowel marker characters
  * CVE-2017-7834 (bmo#1358009)
    data: URLs opened in new tabs bypass CSP protections
  * CVE-2017-7835 (bmo#1402363)
    Mixed content blocking incorrectly applies with redirects
  * CVE-2017-7836 (bmo#1401339)
    Pingsender dynamically loads libcurl on Linux and OS X
  * CVE-2017-7837 (bmo#1325923)

OBS-URL: https://build.opensuse.org/package/show/mozilla:Factory/MozillaFirefox?expand=0&rev=610
2017-11-14 23:17:59 +00:00

1733 lines
77 KiB
Diff

# HG changeset patch
# Parent 9f19902f8bcde21fa63172a85818fb11714878d8
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,1252 @@
+#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/.
+
+<?xml-stylesheet href="chrome://browser/content/browser.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/controlcenter/panel.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/customizableui/panelUI.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
+
+<?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>
+<?xul-overlay href="chrome://browser/content/baseMenuOverlay.xul"?>
+<?xul-overlay href="chrome://browser/content/places/placesOverlay.xul"?>
+
+# All DTD information is stored in a separate file so that it can be shared by
+# hiddenWindow.xul.
+#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"
+ onload="gBrowserInit.onLoad()" onunload="gBrowserInit.onUnload()" onclose="return WindowIsClosing();"
+ 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 CAN_DRAW_IN_TITLEBAR
+#ifdef XP_WIN
+ chromemargin="0,2,2,2"
+#else
+ chromemargin="0,-1,-1,-1"
+#endif
+ tabsintitlebar="true"
+#endif
+ titlemenuseparator="&mainWindow.titlemodifiermenuseparator;"
+ lightweightthemes="true"
+ 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 not content (only) dependent that browser.xul
+# wishes to include *must* go into the global-scripts.inc file
+# so that they can be shared by macBrowserOverlay.xul.
+#include global-scripts.inc
+
+<script type="application/javascript">
+ Services.scriptloader.loadSubScript("chrome://global/content/contentAreaUtils.js", this);
+</script>
+
+# All sets except for popupsets (commands, keys, stringbundles and broadcasters) *must* go into the
+# browser-sets.inc file for sharing with hiddenWindow.xul.
+#define FULL_BROWSER_WINDOW
+#include browser-sets.inc
+#undef FULL_BROWSER_WINDOW
+
+ <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_toggleMuteTab" oncommand="TabContextMenu.contextTab.toggleMuteAudio();"/>
+ <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_duplicateTab" label="&duplicateTab.label;"
+ accesskey="&duplicateTab.accesskey;"
+ oncommand="duplicateTabIn(TabContextMenu.contextTab, 'tab');"/>
+ <menuitem id="context_openTabInWindow" label="&moveToNewWindow.label;"
+ accesskey="&moveToNewWindow.accesskey;"
+ tbattr="tabbrowser-multiple"
+ oncommand="gBrowser.replaceTabWithWindow(TabContextMenu.contextTab);"/>
+#ifdef E10S_TESTING_ONLY
+ <menuitem id="context_openNonRemoteWindow" label="Open in new non-e10s window"
+ tbattr="tabbrowser-remote"
+ hidden="true"
+ oncommand="gBrowser.openNonRemoteWindow(TabContextMenu.contextTab);"/>
+#endif
+ <menuseparator id="context_sendTabToDevice_separator"/>
+ <menu id="context_sendTabToDevice" label="&sendTabToDevice.label;"
+ 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_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 });"/>
+ </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"
+ noautofocus="true"
+ hidden="true"
+ overflowpadding="4"
+ norolluponanchor="true"
+ nomaxresults="true" />
+
+ <!-- for search with one-off buttons -->
+ <panel type="autocomplete" id="PopupSearchAutoComplete" noautofocus="true" hidden="true"/>
+
+ <!-- for url bar autocomplete -->
+ <panel type="autocomplete-richlistbox"
+ id="PopupAutoCompleteRichResult"
+ 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"
+ onpopupshown="StarUI.panelShown(event);"
+ aria-labelledby="editBookmarkPanelTitle">
+ <row id="editBookmarkPanelHeader" align="center" hidden="true">
+ <vbox align="center">
+ <image id="editBookmarkPanelStarIcon"/>
+ </vbox>
+ <vbox>
+ <label id="editBookmarkPanelTitle"/>
+ <description id="editBookmarkPanelDescription"/>
+ </vbox>
+ </row>
+ <vbox id="editBookmarkPanelContent" flex="1" hidden="true"/>
+ <hbox id="editBookmarkPanelBottomButtons" pack="end">
+#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();"
+ accesskey="&editBookmark.removeBookmark.accessKey;"/>
+#else
+ <button id="editBookmarkPanelRemoveButton"
+ class="editBookmarkPanelBottomButton"
+ oncommand="StarUI.removeBookmarkButtonCommand();"
+ accesskey="&editBookmark.removeBookmark.accessKey;"/>
+ <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"
+ class="subviewbutton subviewbutton-iconic"
+ key="viewBookmarksSidebarKb"
+ observes="viewBookmarksSidebar"
+ oncommand="SidebarUI.show('viewBookmarksSidebar');">
+ <observes element="viewBookmarksSidebar" attribute="checked"/>
+ </toolbarbutton>
+ <toolbarbutton id="sidebar-switcher-history"
+ label="&historyButton.label;"
+ class="subviewbutton subviewbutton-iconic"
+ key="key_gotoHistory"
+ observes="viewHistorySidebar"
+ oncommand="SidebarUI.show('viewHistorySidebar');">
+ <observes element="viewHistorySidebar" attribute="checked"/>
+ </toolbarbutton>
+ <toolbarbutton id="sidebar-switcher-tabs"
+ label="&syncedTabs.sidebar.label;"
+ class="subviewbutton subviewbutton-iconic"
+ observes="viewTabsSidebar"
+ oncommand="SidebarUI.show('viewTabsSidebar');">
+ <observes element="viewTabsSidebar" attribute="checked"/>
+ </toolbarbutton>
+ <toolbarseparator/>
+ <vbox id="sidebar-extensions"></vbox>
+ <toolbarseparator/>
+ <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'));">
+ <menuitem oncommand="gCustomizeMode.addToPanel(document.popupNode)"
+ accesskey="&customizeMenu.pinToOverflowMenu.accesskey;"
+ label="&customizeMenu.pinToOverflowMenu.label;"
+ contexttype="toolbaritem"
+ class="customize-context-moveToPanel"/>
+ <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 observes="blockedPopupAllowSite"/>
+ <menuitem observes="blockedPopupEditSettings"/>
+ <menuitem observes="blockedPopupDontShowMessage"/>
+ <menuseparator observes="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>
+
+ <menupopup id="placesContext"/>
+
+ <panel id="ctrlTab-panel" hidden="true" norestorefocus="true" level="top">
+ <hbox>
+ <button class="ctrlTab-preview" flex="1"/>
+ <button class="ctrlTab-preview" flex="1"/>
+ <button class="ctrlTab-preview" flex="1"/>
+ <button class="ctrlTab-preview" flex="1"/>
+ <button class="ctrlTab-preview" flex="1"/>
+ <button class="ctrlTab-preview" flex="1"/>
+ </hbox>
+ <hbox pack="center">
+ <button id="ctrlTab-showAll" class="ctrlTab-preview" noicon="true"/>
+ </hbox>
+ </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;">
+ <photonpanelmultiview id="pageActionPanelMultiView"
+ mainViewId="pageActionPanelMainView"
+ viewCacheId="appMenu-viewCache">
+ <panelview id="pageActionPanelMainView"
+ context="pageActionPanelContextMenu"
+ oncontextmenu="BrowserPageActions.onContextMenu(event);"
+ class="PanelUI-subView">
+ <vbox class="panel-subview-body"/>
+ </panelview>
+ </photonpanelmultiview>
+ </panel>
+ <panel id="pageActionFeedback"
+ role="alert"
+ type="arrow"
+ hidden="true"
+ flip="slide"
+ position="bottomcenter topright"
+ tabspecific="true"
+ noautofocus="true"
+ copyURLFeedback="&copyURLFeedback.label;"
+ sendToDeviceFeedback="&sendToDeviceFeedback.label;">
+ <hbox id="pageActionFeedbackAnimatableBox">
+ <image id="pageActionFeedbackAnimatableImage"/>
+ </hbox>
+ <label id="pageActionFeedbackMessage"/>
+ </panel>
+
+ <menupopup id="pageActionPanelContextMenu"
+ onpopupshowing="BrowserPageActions.onContextMenuShowing(event, this);">
+ <menuitem id="pageActionPanelContextMenu-toggleUrlbar"
+ add-label="&pageAction.addToUrlbar.label;"
+ remove-label="&pageAction.removeFromUrlbar.label;"
+ label="&pageAction.addToUrlbar.label;"
+ oncommand="BrowserPageActions.toggleShownInUrlbarForContextAction();"/>
+ </menupopup>
+
+ <!-- Bookmarks and history tooltip -->
+ <tooltip id="bhTooltip"/>
+
+ <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
+
+ <hbox id="downloads-animation-container" mousethrough="always">
+ <vbox id="downloads-notification-anchor" hidden="true">
+ <vbox id="downloads-indicator-notification"/>
+ </vbox>
+ </hbox>
+
+ <hbox id="bookmarked-notification-container" mousethrough="always">
+ <vbox id="bookmarked-notification-anchor">
+ <vbox id="bookmarked-notification"/>
+ </vbox>
+ <vbox id="bookmarked-notification-dropmarker-anchor">
+ <image id="bookmarked-notification-dropmarker-icon"/>
+ </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>
+ </popupset>
+ <box id="appMenu-viewCache" hidden="true"/>
+
+#ifdef CAN_DRAW_IN_TITLEBAR
+<vbox id="titlebar">
+ <hbox id="titlebar-content">
+ <spacer id="titlebar-spacer" flex="1"/>
+ <hbox id="titlebar-buttonbox-container">
+ <hbox id="titlebar-buttonbox">
+ <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>
+#endif
+
+<deck flex="1" id="tab-view-deck">
+<vbox flex="1" id="browser-panel">
+
+ <toolbox id="navigator-toolbox" mode="icons">
+ <!-- Menu -->
+ <toolbar type="menubar" id="toolbar-menubar" class="chromeclass-menubar" customizable="true"
+ mode="icons" iconsize="small"
+#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 by
+# hiddenWindow.xul.
+#include browser-menubar.inc
+ </toolbaritem>
+
+#ifdef CAN_DRAW_IN_TITLEBAR
+#ifndef XP_MACOSX
+ <hbox class="titlebar-placeholder" type="caption-buttons" ordinal="1000"
+ persist="width"
+ skipintoolbarset="true"/>
+#endif
+#endif
+ </toolbar>
+
+ <toolbar id="TabsToolbar"
+ fullscreentoolbar="true"
+ customizable="true"
+ mode="icons"
+ iconsize="small"
+ aria-label="&tabsToolbar.label;"
+ context="toolbar-context-menu"
+ collapsed="true">
+
+#ifdef CAN_DRAW_IN_TITLEBAR
+ <hbox class="titlebar-placeholder" type="pre-tabs"
+ skipintoolbarset="true"/>
+#endif
+
+ <tabs id="tabbrowser-tabs"
+ class="tabbrowser-tabs"
+ tabbrowser="content"
+ 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"
+ type="menu"
+ label="&listAllTabs.label;"
+ tooltiptext="&listAllTabs.label;"
+ removable="false">
+ <menupopup id="alltabs-popup"
+ position="after_end">
+ <menuitem id="alltabs_undoCloseTab"
+ key="key_undoCloseTab"
+ label="&undoCloseTab.label;"
+ observes="History:UndoCloseTab"/>
+ <menuseparator id="alltabs-popup-separator-1"/>
+ <menu id="alltabs_containersTab"
+ label="&newUserContext.label;">
+ <menupopup id="alltabs_containersMenuTab" />
+ </menu>
+ <menuseparator id="alltabs-popup-separator-2"/>
+ </menupopup>
+ </toolbarbutton>
+
+#ifdef CAN_DRAW_IN_TITLEBAR
+ <hbox class="titlebar-placeholder" type="post-tabs"
+ ordinal="1000"
+ skipintoolbarset="true"/>
+#endif
+
+ <button class="accessibility-indicator" tooltiptext="&accessibilityIndicator.tooltip;"
+ ordinal="1000"
+ aria-live="polite" skipintoolbarset="true"/>
+ <hbox class="private-browsing-indicator" skipintoolbarset="true"
+ ordinal="1000"/>
+#ifdef CAN_DRAW_IN_TITLEBAR
+ <hbox class="titlebar-placeholder" type="caption-buttons"
+ persist="width"
+#ifndef XP_MACOSX
+ ordinal="1000"
+#endif
+ skipintoolbarset="true"/>
+
+#ifdef XP_MACOSX
+ <hbox class="titlebar-placeholder" type="fullscreen-button"
+ persist="width"
+ skipintoolbarset="true"/>
+#endif
+#endif
+ </toolbar>
+
+ <toolbar id="nav-bar"
+ aria-label="&navbarCmd.label;"
+ fullscreentoolbar="true" mode="icons" customizable="true"
+ iconsize="small"
+ 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"
+ aboutHomeOverrideTooltip="&abouthome.pageTitle;"/>
+ <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;"
+ type="autocomplete"
+ autocompletesearch="unifiedcomplete"
+ autocompletesearchparam="enable-actions"
+ autocompletepopup="PopupAutoCompleteRichResult"
+ completeselectedindex="true"
+ shrinkdelay="250"
+ tabscrolling="true"
+ showcommentcolumn="true"
+ showimagecolumn="true"
+ enablehistory="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"/>
+ <image id="tracking-protection-icon"/>
+ <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="indexedDB" class="blocked-permission-icon indexedDB-icon" role="button"
+ tooltiptext="&urlbar.indexedDBBlocked.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;"/>
+ </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="addons-notification-icon" class="notification-anchor-icon install-icon" role="button"
+ tooltiptext="&urlbar.addonsNotificationAnchor.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;"/>
+ </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">
+ <hbox id="userContext-icons" hidden="true">
+ <label id="userContext-label"/>
+ <image id="userContext-indicator"/>
+ </hbox>
+ <image id="page-report-button"
+ class="urlbar-icon urlbar-page-action"
+ role="button"
+ hidden="true"
+ tooltiptext="&pageReportIcon.tooltip;"
+ onmousedown="gPopupBlockerObserver.onReportButtonMousedown(event);"/>
+ <image id="reader-mode-button"
+ class="urlbar-icon urlbar-page-action"
+ 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"
+ context="pageActionPanelContextMenu"
+ oncontextmenu="BrowserPageActions.onContextMenu(event);"
+ onclick="BrowserPageActions.doCommandForAction(PageActions.actionForID('bookmark'), event, this);">
+ <image id="star-button"
+ class="urlbar-icon"
+ role="button"
+ observes="bookmarkThisPageBroadcaster"/>
+ <hbox id="star-button-animatable-box">
+ <image id="star-button-animatable-image"
+ role="presentation"
+ observes="bookmarkThisPageBroadcaster"/>
+ </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"/>
+
+ <toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
+ removable="true"
+ onmousedown="PanelUI.showSubView('appMenu-libraryView', this, null, 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>
+
+ <toolbarset id="customToolbars" context="toolbar-context-menu"/>
+
+ <toolbar id="PersonalToolbar"
+ mode="icons" iconsize="small"
+ class="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);">
+ <observes element="bookmarkThisPageBroadcaster" attribute="starred"/>
+ <observes element="bookmarkThisPageBroadcaster" attribute="buttontooltiptext"/>
+ <menupopup id="BMB_bookmarksPopup"
+ class="cui-widget-panel cui-widget-panelview cui-widget-panelWithFooter PanelUI-subView"
+ placespopup="true"
+ context="placesContext"
+ openInTabs="children"
+ 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="subviewbutton"
+ label="&viewBookmarksSidebar2.label;"
+ type="checkbox"
+ oncommand="SidebarUI.toggle('viewBookmarksSidebar');">
+ <observes element="viewBookmarksSidebar" attribute="checked"/>
+ </menuitem>
+ <!-- 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:folder=TOOLBAR',
+ PlacesUIUtils.getViewForNode(this.parentNode.parentNode).options);">
+ <menuitem id="BMB_viewBookmarksToolbar"
+ placesanonid="view-toolbar"
+ toolbarId="PersonalToolbar"
+ type="checkbox"
+ oncommand="onViewToolbarCommand(event)"
+ label="&viewBookmarksToolbar.label;"/>
+ <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:folder=UNFILED_BOOKMARKS',
+ 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:folder=MOBILE_BOOKMARKS',
+ 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 panel-wide-item"
+ 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" persist="value" 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"/>
+ <tabbrowser id="content"
+ flex="1" contenttooltip="aHTMLTooltip"
+ tabcontainer="tabbrowser-tabs"
+ contentcontextmenu="contentAreaContextMenu"
+ autocompletepopup="PopupAutoComplete"
+ selectmenulist="ContentSelectDropdown"
+ datetimepicker="DateTimePickerPanel"/>
+ </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>
+
+</vbox>
+# <iframe id="tab-view"> is dynamically appended as the 2nd child of #tab-view-deck.
+# Introducing the iframe dynamically, as needed, was found to be better than
+# starting with an empty iframe here in browser.xul from a Ts standpoint.
+</deck>
+
+</window>
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -58,16 +58,18 @@ browser.jar:
content/browser/aboutRobots-icon.png (content/aboutRobots-icon.png)
content/browser/aboutRobots-widget-left.png (content/aboutRobots-widget-left.png)
content/browser/aboutTabCrashed.css (content/aboutTabCrashed.css)
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)
* 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-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)
#ifndef MOZILLA_OFFICIAL
content/browser/browser-development-helpers.js (content/browser-development-helpers.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(XP_WIN)
#include "nsIEHistoryEnumerator.h"
#endif
#include "rdf.h"
#include "nsFeedSniffer.h"
@@ -32,18 +32,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(XP_WIN)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEHistoryEnumerator)
#endif
NS_GENERIC_FACTORY_CONSTRUCTOR(nsFeedSniffer)
@@ -64,17 +62,17 @@ NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsSessionStoreUtils)
NS_DEFINE_NAMED_CID(NS_SESSIONSTOREUTILS_CID);
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
@@ -203,16 +203,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();
@@ -952,16 +959,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_COMPONENTS += [
'nsSetDefaultBrowser.js',
'nsSetDefaultBrowser.manifest',
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, false );
+
+ 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, false );
+
+ paramstr->SetData( aClaimAllTypes ? NS_LITERAL_CSTRING( "ALLTYPES" ) : NS_LITERAL_CSTRING( "NORMAL" ));
+ command->AppendElement( paramstr, false );
+
+ return nsKDEUtils::command( command ) ? NS_OK : NS_ERROR_FAILURE;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::GetCanSetDesktopBackground(bool* aResult)
+{
+ *aResult = true;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsKDEShellService::SetDesktopBackground(nsIDOMElement* 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, false );
+ 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, false );
+ nsAutoCString app;
+ nsresult rv = aApplication->GetNativePath( app );
+ NS_ENSURE_SUCCESS( rv, rv );
+ appstr->SetData( app );
+ command->AppendElement( appstr, false );
+ uristr->SetData( aURI );
+ command->AppendElement( uristr, false );
+ 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, false );
+
+ 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_NSIGNOMESHELLSERVICE
+ NS_DECL_NSISHELLSERVICE
+
+ 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
@@ -666,16 +666,18 @@
@RESPATH@/browser/defaults/blocklists
@RESPATH@/browser/defaults/pinning
; 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
+@BINPATH@/defaults/pref/kde.js
+
; Remote control protocol prefs
; defined in ../../testing/marionette/prefs/marionette.js
@RESPATH@/defaults/pref/marionette.js
; Services (gre) prefs
@RESPATH@/defaults/pref/services-sync.js
; [Layout Engine Resources]