diff --git a/browser/base/content/urlbarBindings.xml b/browser/base/content/urlbarBindings.xml index 37d6f611c8a6..28d988b53fa6 100644 --- a/browser/base/content/urlbarBindings.xml +++ b/browser/base/content/urlbarBindings.xml @@ -3002,7 +3002,7 @@ // otherwise just rely on the panel id for common arrowpanels. let type = this._panel.firstChild.getAttribute("popupid") || this._panel.id; - if (type.startsWith("password-")) + if (type == "password") return "passwords"; if (type == "editBookmarkPanel") return "bookmarks"; diff --git a/browser/components/readinglist/sidebar.js b/browser/components/readinglist/sidebar.js index 02a3e3fb8e01..bc943110a295 100644 --- a/browser/components/readinglist/sidebar.js +++ b/browser/components/readinglist/sidebar.js @@ -54,6 +54,7 @@ let RLSidebar = { addEventListener("unload", () => this.uninit()); this.list = document.getElementById("list"); + this.emptyListInfo = document.getElementById("emptyListInfo"); this.itemTemplate = document.getElementById("item-template"); this.list.addEventListener("click", event => this.onListClick(event)); @@ -91,6 +92,8 @@ let RLSidebar = { this.list.appendChild(itemNode); this.itemNodesById.set(item.id, itemNode); this.itemsById.set(item.id, item); + + this.emptyListInfo.hidden = true; }, /** @@ -106,6 +109,8 @@ let RLSidebar = { this.itemsById.delete(item.id); // TODO: ensureListItems doesn't yet cope with needing to add one item. //this.ensureListItems(); + + this.emptyListInfo.hidden = (this.numItems > 0); }, /** @@ -148,6 +153,7 @@ let RLSidebar = { log.warn("Error adding item", e); } }); + this.emptyListInfo.hidden = (this.numItems > 0); }), /** @@ -350,6 +356,11 @@ let RLSidebar = { if (!itemNode) return; + if (event.target.classList.contains("remove-button")) { + ReadingList.deleteItem(this.getItemFromNode(itemNode)); + return; + } + this.activeItem = itemNode; this.openActiveItem(event); }, diff --git a/browser/components/readinglist/sidebar.xhtml b/browser/components/readinglist/sidebar.xhtml index 12f0342eaff7..7aaacb4f3fea 100644 --- a/browser/components/readinglist/sidebar.xhtml +++ b/browser/components/readinglist/sidebar.xhtml @@ -11,7 +11,7 @@ - + &readingList.label; @@ -19,12 +19,16 @@
-
+
+

+

+
diff --git a/browser/devtools/webide/content/wifi-auth.js b/browser/devtools/webide/content/wifi-auth.js index 162aaf9f4e3a..23ef92046750 100644 --- a/browser/devtools/webide/content/wifi-auth.js +++ b/browser/devtools/webide/content/wifi-auth.js @@ -9,8 +9,6 @@ const { Services } = Cu.import("resource://gre/modules/Services.jsm"); const { require } = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools; const QR = require("devtools/toolkit/qrcode/index"); -const PROPERTIES = "chrome://browser/locale/devtools/webide.properties"; -const Strings = Services.strings.createBundle(PROPERTIES); window.addEventListener("load", function onLoad() { window.removeEventListener("load", onLoad); @@ -33,10 +31,6 @@ function createQR(oob) { } function createToken(oob) { - let spacedCert = oob.sha256.replace(/:/g, " ").toLowerCase(); - let certText = Strings.formatStringFromName("wifi_auth_cert", - [spacedCert], 1); - document.querySelector("#cert").textContent = certText; let token = oob.sha256.replace(/:/g, "").toLowerCase() + oob.k; document.querySelector("#token pre").textContent = token; } diff --git a/browser/devtools/webide/content/wifi-auth.xhtml b/browser/devtools/webide/content/wifi-auth.xhtml index da8efdff5487..ce71144dccbf 100644 --- a/browser/devtools/webide/content/wifi-auth.xhtml +++ b/browser/devtools/webide/content/wifi-auth.xhtml @@ -24,7 +24,6 @@
&wifi_auth_scan_request;
-
diff --git a/browser/locales/en-US/chrome/browser/browser.dtd b/browser/locales/en-US/chrome/browser/browser.dtd index f7c49269b3f7..e19170ff623d 100644 --- a/browser/locales/en-US/chrome/browser/browser.dtd +++ b/browser/locales/en-US/chrome/browser/browser.dtd @@ -853,7 +853,6 @@ just addresses the organization to follow, e.g. "This site is run by " --> - diff --git a/browser/locales/en-US/chrome/browser/devtools/webide.properties b/browser/locales/en-US/chrome/browser/devtools/webide.properties index 331daac3f594..d5c85c55e121 100644 --- a/browser/locales/en-US/chrome/browser/devtools/webide.properties +++ b/browser/locales/en-US/chrome/browser/devtools/webide.properties @@ -77,9 +77,3 @@ status_unknown=UNKNOWN # Device preferences and settings device_reset_default=Reset to default - -# WiFi Auth -# LOCALIZATION NOTE (wifi_auth_cert): Part of the dialog that instructs the -# user to transfer an authentication token to the server. -# %1$S: The client's cert fingerprint -wifi_auth_cert=My Cert: %1$S diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css index 33b7a3aa7968..899255777820 100644 --- a/browser/themes/linux/browser.css +++ b/browser/themes/linux/browser.css @@ -1195,8 +1195,7 @@ toolbarbutton[sdk-button="true"][cui-areatype="toolbar"] > .toolbarbutton-icon { list-style-image: url(chrome://global/skin/icons/question-64.png); } -.popup-notification-icon[popupid="password-save"], -.popup-notification-icon[popupid="password-change"] { +.popup-notification-icon[popupid="password"] { list-style-image: url(chrome://mozapps/skin/passwordmgr/key-64.png); } diff --git a/browser/themes/linux/jar.mn b/browser/themes/linux/jar.mn index 7077fdf07644..dae4617e9869 100644 --- a/browser/themes/linux/jar.mn +++ b/browser/themes/linux/jar.mn @@ -93,7 +93,7 @@ browser.jar: skin/classic/browser/reader-mode-16.png (../shared/reader/reader-mode-16.png) skin/classic/browser/readinglist/icons.svg (../shared/readinglist/icons.svg) skin/classic/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg) - skin/classic/browser/readinglist/sidebar.css (../shared/readinglist/sidebar.css) +* skin/classic/browser/readinglist/sidebar.css (readinglist/sidebar.css) skin/classic/browser/webRTC-shareDevice-16.png skin/classic/browser/webRTC-shareDevice-64.png skin/classic/browser/webRTC-sharingDevice-16.png (../shared/webrtc/webRTC-sharingDevice-16.png) diff --git a/browser/themes/linux/readinglist/sidebar.css b/browser/themes/linux/readinglist/sidebar.css new file mode 100644 index 000000000000..d01b514485f7 --- /dev/null +++ b/browser/themes/linux/readinglist/sidebar.css @@ -0,0 +1,29 @@ +/* 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 ../../shared/readinglist/sidebar.inc.css + +.item { + -moz-padding-end: 0; +} + +.item-title { + margin: 1px 0 0; +} + +.item-title, .item-domain { + -moz-margin-end: 6px; +} + +.remove-button { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 16, 16, 0); +} + +.remove-button:hover { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 32, 16, 16); +} + +.remove-button:hover:active { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.svg"), 0, 48, 16, 32); +} diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index a5453d384d5b..648ccaf17ab7 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -4220,8 +4220,7 @@ notification[value="loop-sharing-notification"] .messageImage { list-style-image: url(chrome://global/skin/icons/question-64.png); } -.popup-notification-icon[popupid="password-save"], -.popup-notification-icon[popupid="password-change"] { +.popup-notification-icon[popupid="password"] { list-style-image: url(chrome://mozapps/skin/passwordmgr/key-64.png); } diff --git a/browser/themes/osx/jar.mn b/browser/themes/osx/jar.mn index c3a95dab7e45..825f2c1dd977 100644 --- a/browser/themes/osx/jar.mn +++ b/browser/themes/osx/jar.mn @@ -144,7 +144,7 @@ browser.jar: skin/classic/browser/reader-mode-16@2x.png (../shared/reader/reader-mode-16@2x.png) skin/classic/browser/readinglist/icons.svg (../shared/readinglist/icons.svg) skin/classic/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg) - skin/classic/browser/readinglist/sidebar.css (../shared/readinglist/sidebar.css) +* skin/classic/browser/readinglist/sidebar.css (readinglist/sidebar.css) skin/classic/browser/webRTC-shareDevice-16.png skin/classic/browser/webRTC-shareDevice-16@2x.png skin/classic/browser/webRTC-shareDevice-64.png diff --git a/browser/themes/osx/readinglist/sidebar.css b/browser/themes/osx/readinglist/sidebar.css new file mode 100644 index 000000000000..54e5fa67928a --- /dev/null +++ b/browser/themes/osx/readinglist/sidebar.css @@ -0,0 +1,35 @@ +/* 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 ../../shared/readinglist/sidebar.inc.css + +.item-title { + margin: 4px 0 0; +} + +.remove-button { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 16, 16, 0); +} + +.remove-button:hover { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 32, 16, 16); +} + +.remove-button:hover:active { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 48, 16, 32); +} + +@media (min-resolution: 2dppx) { + .remove-button { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close@2x.png"), 0, 32, 32, 0); + } + + .remove-button:hover { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close@2x.png"), 0, 64, 32, 32); + } + + .remove-button:hover:active { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close@2x.png"), 0, 96, 32, 64); + } +} diff --git a/browser/themes/shared/readinglist/sidebar.css b/browser/themes/shared/readinglist/sidebar.inc.css similarity index 61% rename from browser/themes/shared/readinglist/sidebar.css rename to browser/themes/shared/readinglist/sidebar.inc.css index b8ce94d9396d..108e323363fe 100644 --- a/browser/themes/shared/readinglist/sidebar.css +++ b/browser/themes/shared/readinglist/sidebar.inc.css @@ -1,6 +1,6 @@ -/* 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/. */ +% 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/. :root, body { height: 100%; @@ -16,6 +16,12 @@ body { overflow: hidden; } +#emptyListInfo { + cursor: default; + padding: 3em 1em; + text-align: center; +} + #list { height: 100%; overflow-x: auto; @@ -52,11 +58,18 @@ body { flex-flow: column; -moz-padding-start: 4px; overflow: hidden; + flex-grow: 1; +} + +.item-title-lines { + display: flex; } .item-title { overflow: hidden; - height: 2.8em; + max-height: 2.8em; + line-height: 1.4; + flex-grow: 1; } .item-domain { @@ -70,3 +83,16 @@ body { .item:hover .item-domain { color: #008ACB; } + +.item:not(:hover) .remove-button { + display: none; +} + +.remove-button { + width: 16px; + height: 16px; + background-size: contain; + background-color: transparent; + border-width: 0; +} + diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index 5b4bf46735ab..3452ff91e37e 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -2217,8 +2217,7 @@ toolbarbutton.bookmark-item[dragover="true"][open="true"] { list-style-image: url(chrome://global/skin/icons/question-64.png); } -.popup-notification-icon[popupid="password-save"], -.popup-notification-icon[popupid="password-change"] { +.popup-notification-icon[popupid="password"] { list-style-image: url(chrome://mozapps/skin/passwordmgr/key-64.png); } diff --git a/browser/themes/windows/jar.mn b/browser/themes/windows/jar.mn index 7306e0051672..cc6b541f6548 100644 --- a/browser/themes/windows/jar.mn +++ b/browser/themes/windows/jar.mn @@ -112,7 +112,7 @@ browser.jar: skin/classic/browser/reader-mode-16.png (../shared/reader/reader-mode-16.png) skin/classic/browser/readinglist/icons.svg (../shared/readinglist/icons.svg) skin/classic/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg) - skin/classic/browser/readinglist/sidebar.css (../shared/readinglist/sidebar.css) +* skin/classic/browser/readinglist/sidebar.css (readinglist/sidebar.css) skin/classic/browser/notification-pluginNormal.png (../shared/plugins/notification-pluginNormal.png) skin/classic/browser/notification-pluginAlert.png (../shared/plugins/notification-pluginAlert.png) skin/classic/browser/notification-pluginBlocked.png (../shared/plugins/notification-pluginBlocked.png) @@ -584,7 +584,7 @@ browser.jar: skin/classic/aero/browser/reader-mode-16.png (../shared/reader/reader-mode-16.png) skin/classic/aero/browser/readinglist/icons.svg (../shared/readinglist/icons.svg) skin/classic/aero/browser/readinglist/readinglist-icon.svg (../shared/readinglist/readinglist-icon.svg) - skin/classic/aero/browser/readinglist/sidebar.css (../shared/readinglist/sidebar.css) +* skin/classic/aero/browser/readinglist/sidebar.css (readinglist/sidebar.css) skin/classic/aero/browser/notification-pluginNormal.png (../shared/plugins/notification-pluginNormal.png) skin/classic/aero/browser/notification-pluginAlert.png (../shared/plugins/notification-pluginAlert.png) skin/classic/aero/browser/notification-pluginBlocked.png (../shared/plugins/notification-pluginBlocked.png) diff --git a/browser/themes/windows/readinglist/sidebar.css b/browser/themes/windows/readinglist/sidebar.css new file mode 100644 index 000000000000..fc98d6d38cd4 --- /dev/null +++ b/browser/themes/windows/readinglist/sidebar.css @@ -0,0 +1,30 @@ +/* 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 ../../shared/readinglist/sidebar.inc.css + +.item { + -moz-padding-end: 0; +} + +.item-title { + margin: 1px 0 0; +} + +.item-title, .item-domain { + -moz-margin-end: 6px; +} + +.remove-button { + -moz-margin-end: 2px; + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 16, 16, 0); +} + +.remove-button:hover { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 32, 16, 16); +} + +.remove-button:hover:active { + background-image: -moz-image-rect(url("chrome://global/skin/icons/close.png"), 0, 48, 16, 32); +} diff --git a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js index 3c164873d52c..c36e9d433256 100644 --- a/toolkit/components/passwordmgr/nsLoginManagerPrompter.js +++ b/toolkit/components/passwordmgr/nsLoginManagerPrompter.js @@ -854,10 +854,12 @@ LoginManagerPrompter.prototype = { var { browser } = this._getNotifyWindow(); - aNotifyObj.show(browser, "password-save", notificationText, + aNotifyObj.show(browser, "password", notificationText, "password-notification-icon", mainAction, - secondaryActions, { timeout: Date.now() + 10000, - persistWhileVisible: true }); + secondaryActions, + { timeout: Date.now() + 10000, + persistWhileVisible: true, + passwordNotificationType: "password-save" }); } else { var notNowButtonText = this._getLocalizedString("notifyBarNotNowButtonText"); @@ -906,7 +908,7 @@ LoginManagerPrompter.prototype = { _removeLoginNotifications : function () { var popupNote = this._getPopupNote(); if (popupNote) - popupNote = popupNote.getNotification("password-save"); + popupNote = popupNote.getNotification("password"); if (popupNote) popupNote.remove(); @@ -1052,10 +1054,11 @@ LoginManagerPrompter.prototype = { var { browser } = this._getNotifyWindow(); Services.telemetry.getHistogramById("PWMGR_PROMPT_UPDATE_ACTION").add(PROMPT_DISPLAYED); - aNotifyObj.show(browser, "password-change", notificationText, + aNotifyObj.show(browser, "password", notificationText, "password-notification-icon", mainAction, null, { timeout: Date.now() + 10000, - persistWhileVisible: true }); + persistWhileVisible: true, + passwordNotificationType: "password-change" }); } else { var dontChangeButtonText = this._getLocalizedString("notifyBarDontChangeButtonText"); diff --git a/toolkit/components/passwordmgr/test/browser/browser.ini b/toolkit/components/passwordmgr/test/browser/browser.ini index 430fc39d386f..94ef96c8c683 100644 --- a/toolkit/components/passwordmgr/test/browser/browser.ini +++ b/toolkit/components/passwordmgr/test/browser/browser.ini @@ -1,7 +1,9 @@ [DEFAULT] support-files = authenticate.sjs + form_basic.html +[browser_notifications.js] [browser_passwordmgr_fields.js] [browser_passwordmgr_observers.js] [browser_passwordmgr_sort.js] diff --git a/toolkit/components/passwordmgr/test/browser/browser_notifications.js b/toolkit/components/passwordmgr/test/browser/browser_notifications.js new file mode 100644 index 000000000000..29e503f4c5cc --- /dev/null +++ b/toolkit/components/passwordmgr/test/browser/browser_notifications.js @@ -0,0 +1,33 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +add_task(function* test_save() { + let tab = gBrowser.addTab("https://example.com/browser/toolkit/components/" + + "passwordmgr/test/browser/form_basic.html"); + let browser = tab.linkedBrowser; + yield BrowserTestUtils.browserLoaded(browser); + gBrowser.selectedTab = tab; + + let promiseShown = BrowserTestUtils.waitForEvent(PopupNotifications.panel, + "Shown"); + yield ContentTask.spawn(browser, null, function* () { + content.document.getElementById("form-basic-username").value = "username"; + content.document.getElementById("form-basic-password").value = "password"; + content.document.getElementById("form-basic").submit(); + }); + yield promiseShown; + let notificationElement = PopupNotifications.panel.childNodes[0]; + + let promiseLogin = TestUtils.topicObserved("passwordmgr-storage-changed", + (_, data) => data == "addLogin"); + notificationElement.button.doCommand(); + let [login] = yield promiseLogin; + login.QueryInterface(Ci.nsILoginInfo); + + Assert.equal(login.username, "username"); + Assert.equal(login.password, "password"); + + // Cleanup. + Services.logins.removeAllLogins(); + gBrowser.removeTab(tab); +}); diff --git a/toolkit/components/passwordmgr/test/browser/form_basic.html b/toolkit/components/passwordmgr/test/browser/form_basic.html new file mode 100644 index 000000000000..df2083a93c7e --- /dev/null +++ b/toolkit/components/passwordmgr/test/browser/form_basic.html @@ -0,0 +1,12 @@ + + + + +
+ + + +
+ + diff --git a/toolkit/components/passwordmgr/test/notification_common.js b/toolkit/components/passwordmgr/test/notification_common.js index 2663aa1f1e29..8b774aae9b63 100644 --- a/toolkit/components/passwordmgr/test/notification_common.js +++ b/toolkit/components/passwordmgr/test/notification_common.js @@ -39,7 +39,11 @@ function getPopupNotifications(aWindow) { */ function getPopup(aPopupNote, aKind) { ok(true, "Looking for " + aKind + " popup notification"); - return aPopupNote.getNotification(aKind); + var notification = aPopupNote.getNotification("password"); + if (notification) { + is(notification.options.passwordNotificationType, aKind); + } + return notification; } diff --git a/toolkit/modules/PopupNotifications.jsm b/toolkit/modules/PopupNotifications.jsm index 2d79dc1aee8d..f45c5b8deee2 100644 --- a/toolkit/modules/PopupNotifications.jsm +++ b/toolkit/modules/PopupNotifications.jsm @@ -644,6 +644,9 @@ PopupNotifications.prototype = { notificationsToShow.forEach(function (n) { this._fireCallback(n, NOTIFICATION_EVENT_SHOWN); }, this); + // This notification is used by tests to know when all the processing + // required to display the panel has happened. + this.panel.dispatchEvent(new this.window.CustomEvent("Shown")); }); }, diff --git a/toolkit/mozapps/update/tests/TestAUSHelper.cpp b/toolkit/mozapps/update/tests/TestAUSHelper.cpp index 49d6879227a1..0e5fce365673 100644 --- a/toolkit/mozapps/update/tests/TestAUSHelper.cpp +++ b/toolkit/mozapps/update/tests/TestAUSHelper.cpp @@ -99,11 +99,15 @@ CheckMsg(const NS_tchar *path, const char *expected) struct stat ms; if (fstat(fileno(inFP), &ms)) { + fclose(inFP); + inFP = nullptr; return false; } char *mbuf = (char *) malloc(ms.st_size + 1); if (!mbuf) { + fclose(inFP); + inFP = nullptr; return false; } @@ -113,14 +117,19 @@ CheckMsg(const NS_tchar *path, const char *expected) r -= c; rb += c; if (c == 0 && r) { + free(mbuf); + fclose(inFP); + inFP = nullptr; return false; } mbuf[ms.st_size] = '\0'; rb = mbuf; + bool isMatch = strcmp(rb, expected) == 0; + free(mbuf); fclose(inFP); inFP = nullptr; - return strcmp(rb, expected) == 0; + return isMatch; } #ifdef XP_WIN diff --git a/toolkit/themes/windows/global/aboutReader.css b/toolkit/themes/windows/global/aboutReader.css index 41cb5325f8c2..577c0c3c5cdc 100644 --- a/toolkit/themes/windows/global/aboutReader.css +++ b/toolkit/themes/windows/global/aboutReader.css @@ -28,11 +28,11 @@ body { } .sans-serif { - font-family: sans-serif; + font-family: "Fira Sans", Helvetica, Arial, sans-serif; } .serif { - font-family: serif; + font-family: "Charis SIL", Georgia, "Times New Roman", serif; } .font-size1 { @@ -93,7 +93,7 @@ body { font-size: 0.9rem; line-height: 1.33rem; padding-bottom: 4px; - font-family: sans-serif; + font-family: "Fira Sans", Helvetica, Arial, sans-serif; text-decoration: none; border-bottom: 1px solid; color: #0095dd; @@ -231,7 +231,7 @@ body { /*======= Controls toolbar =======*/ .toolbar { - font-family: sans-serif; + font-family: "Fira Sans", Helvetica, Arial, sans-serif; position: fixed; height: 100%; top: 0px; @@ -286,7 +286,7 @@ body { background-color: #FBFBFB; visibility: hidden; border-radius: 4px; - border: 1px solid #B5B5B5; + border: 1px 1px 0 1px solid #B5B5B5; box-shadow: 0px 1px 12px #666; } @@ -319,6 +319,19 @@ body { flex-direction: row; } +#font-type-buttons > button:first-child { + border-top-left-radius: 3px; +} +#font-type-buttons > button:last-child { + border-top-right-radius: 3px; +} +#color-scheme-buttons > button:first-child { + border-bottom-left-radius: 3px; +} +#color-scheme-buttons > button:last-child { + border-bottom-right-radius: 3px; +} + #font-type-buttons > button, #font-size-buttons > button, #color-scheme-buttons > button { @@ -337,7 +350,7 @@ body { } #color-scheme-buttons > button { - width: 33%; + width: 33.33%; font-size: 14px; } @@ -350,12 +363,13 @@ body { #font-type-buttons > button { display: inline-block; font-size: 48px; - border-bottom: 3px solid transparent; } #font-type-buttons > button:active:hover, -#font-type-buttons > button.selected { - border-bottom: 3px solid #FC6420; +#font-type-buttons > button.selected, +#color-scheme-buttons > button:active:hover, +#color-scheme-buttons > button.selected { + box-shadow: inset 0 -3px 0 0 #FC6420; } #font-type-buttons > button > div { @@ -364,7 +378,8 @@ body { } .button:hover, -#font-size-buttons > button:hover { +#font-size-buttons > button:hover, +#font-type-buttons > button:hover { background-color: #EBEBEB; } @@ -381,7 +396,7 @@ body { } .serif-button { - font-family: serif; + font-family: "Charis SIL", Georgia, "Times New Roman", serif; } .minus-button, @@ -439,3 +454,9 @@ body { .plus-button { background-image: url("chrome://global/skin/reader/RM-Plus-24x24.svg"); } + +@media print { + .toolbar { + display: none; + } +}