/* 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/. */ /*** Downloads Panel ***/ richlistitem[type="download"] { -moz-binding: url('chrome://browser/content/downloads/download.xml#download'); } richlistitem[type="download"]:not([selected]) button { /* Only focus buttons in the selected item. */ -moz-user-focus: none; } .downloadsHideDropmarker > #downloadsFooterButtonsSplitter, .downloadsHideDropmarker > #downloadsFooterDropmarker { display: none; } richlistitem[type="download"].download-state[state="1"]:not([exists]) > .downloadButtonArea, richlistitem[type="download"].download-state[state="1"]:not([exists]) > toolbarseparator { display: none; } #downloadsSummary:not([inprogress]) > vbox > #downloadsSummaryProgress, #downloadsSummary:not([inprogress]) > vbox > #downloadsSummaryDetails, #downloadsFooter:not([showingsummary]) #downloadsSummary { display: none; } #downloadsFooter[showingdropdown] > stack > #downloadsSummary, #downloadsFooter[showingsummary] > stack:hover > #downloadsSummary, #downloadsFooter[showingsummary]:not([showingdropdown]) > stack:not(:hover) > #downloadsFooterButtons { /* If we used "visibility: hidden;" then the mouseenter event of #downloadsHistory wouldn't be triggered immediately, and the hover styling of the button would not apply until the mouse is moved again. "-moz-user-focus: ignore;" prevents the elements with "opacity: 0;" from being focused with the keyboard. */ opacity: 0; -moz-user-focus: ignore; } /*** Downloads View ***/ /** * The downloads richlistbox may list thousands of items, and it turns out * XBL binding attachment, and even more so detachment, is a performance hog. * This hack makes sure we don't apply any binding to inactive items (inactive * items are history downloads that haven't been in the visible area). * We can do this because the richlistbox implementation does not interact * much with the richlistitem binding. However, this may turn out to have * some side effects (see bug 828111 for the details). * * We might be able to do away with this workaround once bug 653881 is fixed. */ richlistitem.download { -moz-binding: none; } richlistitem.download[active] { -moz-binding: url("chrome://browser/content/downloads/download.xml#download"); } richlistitem.download button { /* These buttons should never get focus, as that would "disable" the downloads view controller (it's only used when the richlistbox is focused). */ -moz-user-focus: none; } /*** Visibility of controls inside download items ***/ .download-state:not(:-moz-any([state="6"], /* Blocked (parental) */ [state="8"], /* Blocked (dirty) */ [state="9"]) /* Blocked (policy) */) .downloadBlockedBadge, .download-state:not(:-moz-any([state="-1"],/* Starting (initial) */ [state="5"], /* Starting (queued) */ [state="0"], /* Downloading */ [state="4"], /* Paused */ [state="7"]) /* Scanning */) .downloadProgress, .download-state:not( [state="0"] /* Downloading */) .downloadPauseMenuItem, .download-state:not( [state="4"] /* Paused */) .downloadResumeMenuItem, /* Blocked (dirty) downloads that have not been confirmed and have temporary data. */ .download-state:not( [state="8"] /* Blocked (dirty) */) .downloadUnblockMenuItem, .download-state[state="8"]:not(.temporary-block) .downloadUnblockMenuItem, .download-state:not(:-moz-any([state="2"], /* Failed */ [state="4"]) /* Paused */) .downloadCancelMenuItem, .download-state:not(:-moz-any([state="1"], /* Finished */ [state="2"], /* Failed */ [state="3"], /* Canceled */ [state="6"], /* Blocked (parental) */ [state="8"], /* Blocked (dirty) */ [state="9"]) /* Blocked (policy) */) .downloadRemoveFromHistoryMenuItem, .download-state:not(:-moz-any([state="-1"],/* Starting (initial) */ [state="0"], /* Downloading */ [state="1"], /* Finished */ [state="4"], /* Paused */ [state="5"]) /* Starting (queued) */) .downloadShowMenuItem, .download-state[state="7"] .downloadCommandsSeparator { display: none; } /*** Visibility of download buttons ***/ .download-state:not(:-moz-any([state="-1"],/* Starting (initial) */ [state="5"], /* Starting (queued) */ [state="0"], /* Downloading */ [state="4"]) /* Paused */) .downloadCancel, /* Blocked (dirty) downloads that have not been confirmed and have temporary data, for the Malware case. */ .download-state:not( [state="8"] /* Blocked (dirty) */) .downloadConfirmBlock, .download-state[state="8"]:not(.temporary-block) .downloadConfirmBlock, .download-state[state="8"].temporary-block:not([verdict="Malware"]) .downloadConfirmBlock, /* Blocked (dirty) downloads that have not been confirmed and have temporary data, for the Potentially Unwanted case. */ .download-state:not( [state="8"] /* Blocked (dirty) */) .downloadChooseUnblock, .download-state[state="8"]:not(.temporary-block) .downloadChooseUnblock, .download-state[state="8"].temporary-block:not([verdict="PotentiallyUnwanted"]) .downloadChooseUnblock, /* Blocked (dirty) downloads that have not been confirmed and have temporary data, for the Uncommon case. */ .download-state:not( [state="8"] /* Blocked (dirty) */) .downloadChooseOpen, .download-state[state="8"]:not(.temporary-block) .downloadChooseOpen, .download-state[state="8"].temporary-block:not([verdict="Uncommon"]) .downloadChooseOpen, .download-state:not(:-moz-any([state="2"], /* Failed */ [state="3"]) /* Canceled */) .downloadRetry, .download-state:not( [state="1"] /* Finished */) .downloadShow, .download-state:-moz-any( [state="6"], /* Blocked (parental) */ [state="7"], /* Scanning */ [state="9"]) /* Blocked (policy) */ > toolbarseparator, /* The "show blocked info" button is shown only in the downloads panel. */ .downloadShowBlockedInfo { display: none; } /*** Downloads panel ***/ #downloadsPanel[hasdownloads] #emptyDownloads, #downloadsPanel:not([hasdownloads]) #downloadsListBox { display: none; } /*** Downloads panel multiview (main view and blocked-downloads subview) ***/ /* Hide all the usual buttons. */ #downloadsPanel-mainView .download-state[state="8"] .downloadCancel, #downloadsPanel-mainView .download-state[state="8"] .downloadConfirmBlock, #downloadsPanel-mainView .download-state[state="8"] .downloadChooseUnblock, #downloadsPanel-mainView .download-state[state="8"] .downloadChooseOpen, #downloadsPanel-mainView .download-state[state="8"] .downloadRetry, #downloadsPanel-mainView .download-state[state="8"] .downloadShow { display: none; } /* Make the panel wide enough to show the download list items without improperly truncating them. */ #downloadsPanel-multiView > .panel-viewcontainer, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack > .panel-mainview { max-width: unset; } /* Show the "show blocked info" button. */ #downloadsPanel-mainView .download-state[state="8"] .downloadShowBlockedInfo { display: inline; } /** When the main view is showing... **/ /* The subview should be off to the right and not visible at all. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype=main] > .panel-subviews { transform: translateX(101%); transition: transform var(--panelui-subview-transition-duration); } #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype=main] > .panel-subviews:-moz-locale-dir(rtl) { transform: translateX(-101%); } /** When the subview is showing... **/ /* Hide the buttons of all downloads except the one that triggered the subview. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] .download-state:not([showingsubview]) .downloadButton { visibility: hidden; } /* For the download that triggered the subview, move its button farther to the right by removing padding so that a minimum amount of the main view's right edge needs to be shown. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] .download-state[showingsubview] { padding: 0; } /* The main view should slide to the left and its right edge should remain visible. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype=subview] > .panel-mainview { transform: translateX(calc(-100% + 38px)); transition: transform var(--panelui-subview-transition-duration); } #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype=subview] > .panel-mainview:-moz-locale-dir(rtl) { transform: translateX(calc(100% - 38px)); } /* The subview should leave the right edge of the main view uncovered. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack > .panel-subviews { /* Use a margin instead of a transform like above so that the subview's width isn't wider than the panel. */ -moz-margin-start: 38px !important; } /* Prevent keyboard interaction in the main view by preventing all elements in the main view from being focused... */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] > .panel-mainview #downloadsListBox, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] > .panel-mainview richlistitem, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] > .panel-mainview .downloadButton, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] > .panel-mainview .downloadsPanelFooterButton, #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] > .panel-mainview #downloadsSummary { -moz-user-focus: ignore; } /* ... except for the downloadShowBlockedInfo button in the blocked download. Selecting it with the keyboard should show the main view again. */ #downloadsPanel-multiView > .panel-viewcontainer > .panel-viewstack[viewtype="subview"] .download-state[showingsubview] .downloadShowBlockedInfo { -moz-user-focus: normal; }