author | shindli <shindli@mozilla.com> |
Tue, 05 Dec 2017 11:57:21 +0200 | |
changeset 394987 | 390c1aad9d4d5bd44bc5f347d2233d14eb9a2944 |
parent 394986 | f2cf6d1473808039be5ecd8727cc3791d5d7d2d4 (current diff) |
parent 394984 | ba48231d04a8a6cee4a0cccea4985c416029ed25 (diff) |
child 394988 | b4cef8d1dff06a1ec2b9bb17211c0c3c7f5b76fa |
push id | 97987 |
push user | nerli@mozilla.com |
push date | Tue, 05 Dec 2017 13:52:50 +0000 |
treeherder | mozilla-inbound@8842dba7396b [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge, merge |
milestone | 59.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/browser/base/content/test/favicons/browser_preferred_icons.js +++ b/browser/base/content/test/favicons/browser_preferred_icons.js @@ -1,14 +1,17 @@ /* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ const ROOT = "http://mochi.test:8888/browser/browser/base/content/test/favicons/"; function waitIcon(url) { + // Make sure we don't miss out on an icon if it was previously used in a test + PlacesUtils.favicons.removeFailedFavicon(makeURI(url)); + // Because there is debounce logic in ContentLinkHandler.jsm to reduce the // favicon loads, we have to wait some time before checking that icon was // stored properly. return BrowserTestUtils.waitForCondition( () => { let tabIcon = gBrowser.getIcon(); info("Found icon " + tabIcon); return tabIcon == url; @@ -19,17 +22,18 @@ function waitIcon(url) { function createLinks(linkInfos) { return ContentTask.spawn(gBrowser.selectedBrowser, linkInfos, links => { let doc = content.document; let head = doc.getElementById("linkparent"); for (let l of links) { let link = doc.createElement("link"); link.rel = "icon"; link.href = l.href; - link.type = l.type; + if (l.type) + link.type = l.type; if (l.size) link.setAttribute("sizes", `${l.size}x${l.size}`); head.appendChild(link); } }); } add_task(async function setup() { @@ -73,25 +77,90 @@ add_task(async function prefer_sized() { type: "image/x-icon" }, ]); await promise; // Must have at least one test. Assert.ok(true, "The expected icon has been set"); }); -add_task(async function prefer_ico() { +add_task(async function prefer_last_ico() { let promise = waitIcon(ROOT + "icon2.ico"); await createLinks([ { href: ROOT + "icon.ico", type: "image/x-icon" }, { href: ROOT + "icon.png", type: "image/png", }, { href: ROOT + "icon2.ico", - type: "image/x-icon" - }, + type: "image/x-icon" + }, + ]); + await promise; + // Must have at least one test. + Assert.ok(true, "The expected icon has been set"); +}); + +add_task(async function fuzzy_ico() { + let promise = waitIcon(ROOT + "microsoft.ico"); + await createLinks([ + { href: ROOT + "icon.ico", + type: "image/x-icon" + }, + { href: ROOT + "icon.png", + type: "image/png", + }, + { href: ROOT + "microsoft.ico", + type: "image/vnd.microsoft.icon" + }, ]); await promise; // Must have at least one test. Assert.ok(true, "The expected icon has been set"); }); + +add_task(async function guess_svg() { + let promise = waitIcon(ROOT + "icon.svg"); + await createLinks([ + { href: ROOT + "icon.svg" }, + { href: ROOT + "icon.png", + type: "image/png", + size: 16 * Math.ceil(window.devicePixelRatio) + }, + { href: ROOT + "icon.ico", + type: "image/x-icon" + }, + ]); + await promise; + // Must have at least one test. + Assert.ok(true, "The expected icon has been set"); +}); + +add_task(async function guess_ico() { + let promise = waitIcon(ROOT + "icon.ico"); + await createLinks([ + { href: ROOT + "icon.ico" }, + { href: ROOT + "icon.png", + type: "image/png", + }, + ]); + await promise; + // Must have at least one test. + Assert.ok(true, "The expected icon has been set"); +}); + +add_task(async function guess_invalid() { + let promise = waitIcon(ROOT + "icon.svg"); + // Create strange links to make sure they don't break us + await createLinks([ + { href: ROOT + "icon.svg" }, + { href: ROOT + "icon" }, + { href: ROOT + "icon?.svg" }, + { href: ROOT + "icon#.svg" }, + { href: "data:text/plain,icon" }, + { href: "file:///icon" }, + { href: "about:icon" }, + ]); + await promise; + // Must have at least one test. + Assert.ok(true, "The expected icon has been set"); +});
--- a/browser/components/extensions/ext-tabs.js +++ b/browser/components/extensions/ext-tabs.js @@ -612,16 +612,22 @@ this.tabs = class extends ExtensionAPI { let lastInsertion = new Map(); let tabs = tabIds.map(tabId => tabTracker.getTab(tabId)); for (let nativeTab of tabs) { // If the window is not specified, use the window from the tab. let window = destinationWindow || nativeTab.ownerGlobal; let gBrowser = window.gBrowser; + // If we are not moving the tab to a different window, and the window + // only has one tab, do nothing. + if (nativeTab.ownerGlobal == window && gBrowser.tabs.length === 1) { + continue; + } + let insertionPoint = indexMap.get(window) || moveProperties.index; // If the index is -1 it should go to the end of the tabs. if (insertionPoint == -1) { insertionPoint = gBrowser.tabs.length; } // We can only move pinned tabs to a point within, or just after, // the current set of pinned tabs. Unpinned tabs, likewise, can only
--- a/browser/components/newtab/aboutNewTabService.js +++ b/browser/components/newtab/aboutNewTabService.js @@ -16,17 +16,17 @@ XPCOMUtils.defineLazyModuleGetter(this, "resource:///modules/AboutNewTab.jsm"); const LOCAL_NEWTAB_URL = "chrome://browser/content/newtab/newTab.xhtml"; const TOPIC_APP_QUIT = "quit-application-granted"; const TOPIC_LOCALES_CHANGE = "intl:requested-locales-changed"; // Automated tests ensure packaged locales are in this list. Copied output of: // https://github.com/mozilla/activity-stream/blob/master/bin/render-activity-stream-html.js -const ACTIVITY_STREAM_LOCALES = new Set("en-US ach ar ast az be bg bn-BD bn-IN br bs ca cak cs cy da de dsb el en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mk ml mr ms my nb-NO ne-NP nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" ")); +const ACTIVITY_STREAM_LOCALES = new Set("en-US ach ar ast az be bg bn-BD bn-IN br bs ca cak cs cy da de dsb el en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mk ml mr ms my nb-NO ne-NP nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru si sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" ")); const ABOUT_URL = "about:newtab"; const IS_MAIN_PROCESS = Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT; const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA; // Pref that tells if activity stream is enabled
--- a/browser/components/places/content/controller.js +++ b/browser/components/places/content/controller.js @@ -5,29 +5,16 @@ XPCOMUtils.defineLazyModuleGetter(this, "ForgetAboutSite", "resource://gre/modules/ForgetAboutSite.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"); -// XXXmano: we should move most/all of these constants to PlacesUtils -const ORGANIZER_ROOT_BOOKMARKS = "place:folder=BOOKMARKS_MENU&excludeItems=1&queryType=1"; - -// No change to the view, preserve current selection -const RELOAD_ACTION_NOTHING = 0; -// Inserting items new to the view, select the inserted rows -const RELOAD_ACTION_INSERT = 1; -// Removing items from the view, select the first item after the last selected -const RELOAD_ACTION_REMOVE = 2; -// Moving items within a view, don't treat the dropped items as additional -// rows. -const RELOAD_ACTION_MOVE = 3; - /** * Represents an insertion point within a container where we can insert * items. * @param {object} an object containing the following properties: * - parentId * The identifier of the parent container * - parentGuid * The unique identifier of the parent container
--- a/browser/extensions/activity-stream/bootstrap.js +++ b/browser/extensions/activity-stream/bootstrap.js @@ -176,17 +176,17 @@ this.install = function install(data, re this.startup = function startup(data, reason) { // Cache startup data which contains stuff like the version number, etc. // so we can use it when we init startupData = data; startupReason = reason; // Only start Activity Stream up when the browser UI is ready - if (Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup).startingUp) { + if (Services.startup.startingUp) { Services.obs.addObserver(observe, BROWSER_READY_NOTIFICATION); } else { // Handle manual install or automatic install after manual uninstall onBrowserReady(); } }; this.shutdown = function shutdown(data, reason) {
--- a/browser/extensions/activity-stream/common/Actions.jsm +++ b/browser/extensions/activity-stream/common/Actions.jsm @@ -64,18 +64,20 @@ for (const type of [ "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", + "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_RESET", + "SNIPPET_BLOCKED", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_EDIT",
--- a/browser/extensions/activity-stream/css/activity-stream-linux.css +++ b/browser/extensions/activity-stream/css/activity-stream-linux.css @@ -18,40 +18,40 @@ button, input { font-family: inherit; font-size: inherit; } [hidden] { display: none !important; } .icon { - display: inline-block; - width: 16px; - height: 16px; - background-size: 16px; background-position: center center; background-repeat: no-repeat; - vertical-align: middle; + background-size: 16px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.8); - -moz-context-properties: fill; } + height: 16px; + vertical-align: middle; + width: 16px; } .icon.icon-spacer { margin-inline-end: 8px; } .icon.icon-small-spacer { margin-inline-end: 6px; } .icon.icon-bookmark-added { background-image: url("chrome://browser/skin/bookmark.svg"); } .icon.icon-bookmark-hollow { background-image: url("chrome://browser/skin/bookmark-hollow.svg"); } .icon.icon-delete { background-image: url("../data/content/assets/glyph-delete-16.svg"); } .icon.icon-modal-delete { background-image: url("../data/content/assets/glyph-modal-delete-32.svg"); - width: 32px; + background-size: 32px; height: 32px; - background-size: 32px; } + width: 32px; } .icon.icon-dismiss { background-image: url("../data/content/assets/glyph-dismiss-16.svg"); } .icon.icon-info { background-image: url("../data/content/assets/glyph-info-16.svg"); } .icon.icon-import { background-image: url("../data/content/assets/glyph-import-16.svg"); } .icon.icon-new-window { background-image: url("../data/content/assets/glyph-newWindow-16.svg"); } @@ -66,18 +66,17 @@ input { .icon.icon-edit { background-image: url("../data/content/assets/glyph-edit-16.svg"); } .icon.icon-pocket { background-image: url("../data/content/assets/glyph-pocket-16.svg"); } .icon.icon-historyItem { background-image: url("../data/content/assets/glyph-historyItem-16.svg"); } .icon.icon-trending { background-image: url("../data/content/assets/glyph-trending-16.svg"); - transform: translateY(2px); - /* trending bolt is visually top heavy */ } + transform: translateY(2px); } .icon.icon-now { background-image: url("chrome://browser/skin/history.svg"); } .icon.icon-topsites { background-image: url("../data/content/assets/glyph-topsites-16.svg"); } .icon.icon-pin-small { background-image: url("../data/content/assets/glyph-pin-12.svg"); background-size: 12px; height: 12px; @@ -120,65 +119,65 @@ h2 { a { color: #0060DF; text-decoration: none; } a:hover { color: #008EA4; } .sr-only { - position: absolute; - width: 1px; + border: 0; + clip: rect(0, 0, 0, 0); height: 1px; - padding: 0; margin: -1px; overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; } + padding: 0; + position: absolute; + width: 1px; } .inner-border { border: 1px solid #D7D7DB; border-radius: 3px; + height: 100%; + left: 0; + pointer-events: none; position: absolute; top: 0; - left: 0; width: 100%; - height: 100%; - pointer-events: none; z-index: 100; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .show-on-init { opacity: 0; transition: opacity 0.2s ease-in; } .show-on-init.on { - opacity: 1; - animation: fadeIn 0.2s; } + animation: fadeIn 0.2s; + opacity: 1; } .actions { border-top: 1px solid #D7D7DB; display: flex; flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; margin: 0; - padding: 15px 25px 0 25px; - justify-content: flex-start; - flex-wrap: wrap; } + padding: 15px 25px 0; } .actions button { background-color: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; color: inherit; cursor: pointer; + margin-bottom: 15px; padding: 10px 30px; - margin-bottom: 15px; white-space: nowrap; } .actions button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .actions button.dismiss { border: 0; padding: 0; text-decoration: underline; } @@ -188,26 +187,26 @@ a { color: #FFF; margin-inline-start: auto; } #snippets-container { z-index: 1; } .outer-wrapper { display: flex; - padding: 40px 32px 32px; + flex-grow: 1; height: 100%; - flex-grow: 1; } + padding: 40px 32px 32px; } .outer-wrapper.fixed-to-top { height: auto; } main { margin: auto; - width: 224px; - padding-bottom: 48px; } + padding-bottom: 48px; + width: 224px; } @media (min-width: 416px) { main { width: 352px; } } @media (min-width: 544px) { main { width: 480px; } } @media (min-width: 800px) { main { @@ -240,157 +239,161 @@ main { .body-wrapper.on .sections-list .section:last-of-type, .body-wrapper.on .topic { opacity: 1; } .top-sites-list { list-style: none; margin: 0; margin-bottom: -18px; - padding: 0; - margin-inline-end: -32px; } + margin-inline-end: -32px; + padding: 0; } @media (max-width: 416px) { .top-sites-list :nth-child(2n+1) .context-menu { + margin-inline-end: auto; margin-inline-start: auto; - margin-inline-end: auto; - offset-inline-start: -32px; - offset-inline-end: auto; } + offset-inline-end: auto; + offset-inline-start: -32px; } .top-sites-list :nth-child(2n) .context-menu { - margin-inline-start: auto; margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 416px) and (max-width: 544px) { - .top-sites-list :nth-child(3n+2) .context-menu, .top-sites-list :nth-child(3n) .context-menu { - margin-inline-start: auto; + .top-sites-list :nth-child(3n+2) .context-menu, + .top-sites-list :nth-child(3n) .context-menu { margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .top-sites-list :nth-child(4n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 768px) { .top-sites-list :nth-child(4n+3) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .top-sites-list :nth-child(6n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1024px) { .top-sites-list :nth-child(6n+5) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .top-sites-list li { display: inline-block; margin: 0 0 8px; margin-inline-end: 32px; } .top-sites-list .top-site-outer { position: relative; } .top-sites-list .top-site-outer > a { + color: inherit; display: block; - color: inherit; outline: none; } - .top-sites-list .top-site-outer > a.active .tile, .top-sites-list .top-site-outer > a:focus .tile { + .top-sites-list .top-site-outer > a:-moz-any(.active, :focus) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .top-sites-list .top-site-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .top-sites-list .top-site-outer .context-menu-button:focus, .top-sites-list .top-site-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } - .top-sites-list .top-site-outer:hover .tile, .top-sites-list .top-site-outer:focus .tile, .top-sites-list .top-site-outer.active .tile { + width: 27px; } + .top-sites-list .top-site-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .top-sites-list .top-site-outer:hover .context-menu-button, .top-sites-list .top-site-outer:focus .context-menu-button, .top-sites-list .top-site-outer.active .context-menu-button { - transform: scale(1); - opacity: 1; } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .edit-menu { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .context-menu-button { + opacity: 1; + transform: scale(1); } .top-sites-list .top-site-outer .tile { - position: relative; - height: 96px; - width: 96px; border-radius: 6px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 96px; + position: relative; + width: 96px; + align-items: center; color: #737373; - font-weight: 200; + display: flex; font-size: 32px; - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; } + font-weight: 200; + justify-content: center; + text-transform: uppercase; } .top-sites-list .top-site-outer .tile::before { content: attr(data-fallback); } .top-sites-list .top-site-outer.placeholder .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .top-sites-list .top-site-outer.placeholder .screenshot { display: none; } .top-sites-list .top-site-outer .screenshot { + background-color: #FFF; + background-position: top left; + background-size: cover; + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + height: 100%; + left: 0; + opacity: 0; position: absolute; top: 0; - left: 0; - height: 100%; - width: 100%; - background-color: #FFF; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); - background-size: cover; - background-position: top left; transition: opacity 1s; - opacity: 0; } + width: 100%; } .top-sites-list .top-site-outer .screenshot.active { opacity: 1; } .top-sites-list .top-site-outer .top-site-icon { - position: absolute; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + background-color: #F9F9FA; background-position: center center; background-repeat: no-repeat; - background-color: #F9F9FA; } + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + position: absolute; } .top-sites-list .top-site-outer .rich-icon { - top: 0; + background-size: 96px; + height: 100%; offset-inline-start: 0; - height: 100%; - width: 100%; - background-size: 96px; } + top: 0; + width: 100%; } .top-sites-list .top-site-outer .default-icon { + background-size: 32px; bottom: -6px; height: 42px; offset-inline-end: -6px; width: 42px; - background-size: 32px; + align-items: center; display: flex; - align-items: center; - justify-content: center; - font-size: 20px; } + font-size: 20px; + justify-content: center; } .top-sites-list .top-site-outer .default-icon[data-fallback]::before { content: attr(data-fallback); } .top-sites-list .top-site-outer .title { font: message-box; height: 30px; line-height: 30px; text-align: center; width: 96px; @@ -418,17 +421,17 @@ main { offset-inline-end: -12.5px; opacity: 0; overflow: hidden; top: -12.5px; transform: scale(0.25); transition-property: transform, opacity; transition-duration: 200ms; z-index: 1000; } - .top-sites-list .top-site-outer .edit-menu:focus, .top-sites-list .top-site-outer .edit-menu:active { + .top-sites-list .top-site-outer .edit-menu:-moz-any(:active, :focus) { transform: scale(1); opacity: 1; } .top-sites-list .top-site-outer .edit-menu button { border: 0; border-right: 1px solid #B1B1B3; background-color: #FFF; cursor: pointer; height: 100%; @@ -438,34 +441,31 @@ main { .top-sites-list .top-site-outer .edit-menu button:first-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:last-child:dir(rtl) { width: 30px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { width: 28px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr) { border-right: 0; } .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { border-right: 0; } - .top-sites-list .top-site-outer:hover .edit-menu, .top-sites-list .top-site-outer:focus .edit-menu, .top-sites-list .top-site-outer.active .edit-menu { - transform: scale(1); - opacity: 1; } .edit-topsites-wrapper .edit-topsites-button { border-right: 1px solid #D7D7DB; line-height: 13px; offset-inline-end: 24px; opacity: 0; padding: 0 10px; pointer-events: none; position: absolute; top: 2px; transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } .edit-topsites-wrapper .edit-topsites-button:dir(rtl) { border-left: 1px solid #D7D7DB; border-right: 0; } - .edit-topsites-wrapper .edit-topsites-button:focus, .edit-topsites-wrapper .edit-topsites-button:active { + .edit-topsites-wrapper .edit-topsites-button:-moz-any(:active, :focus) { opacity: 1; } .edit-topsites-wrapper .edit-topsites-button button { background: none; border: 0; color: #737373; cursor: pointer; font-size: 12px; padding: 0; } @@ -494,17 +494,17 @@ main { width: auto; } .edit-topsites-wrapper .show-more:dir(rtl), .edit-topsites-wrapper .show-less:dir(rtl) { background-position: right 10px center; } .edit-topsites-wrapper .show-more span, .edit-topsites-wrapper .show-less span { padding-inline-start: 3px; } -section.top-sites:not(.collapsed):hover .edit-topsites-button { +.top-sites:not(.collapsed):hover .edit-topsites-button { opacity: 1; pointer-events: auto; } .topsite-form .form-wrapper { margin: auto; max-width: 350px; padding: 15px 0; } .topsite-form .form-wrapper .field { @@ -559,69 +559,69 @@ section.top-sites:not(.collapsed):hover 0% { opacity: 0; transform: translateY(15px); } 100% { opacity: 1; transform: translateY(0); } } .sections-list .section-list { - margin: 0; display: grid; + grid-gap: 32px; grid-template-columns: repeat(auto-fit, 224px); - grid-gap: 32px; } + margin: 0; } @media (max-width: 544px) { .sections-list .section-list .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .sections-list .section-list :nth-child(2n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .sections-list .section-list :nth-child(3n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .sections-list .section-empty-state { - width: 100%; - height: 266px; + border: 1px solid #D7D7DB; + border-radius: 3px; display: flex; - border: 1px solid #D7D7DB; - border-radius: 3px; } + height: 266px; + width: 100%; } .sections-list .section-empty-state .empty-state { margin: auto; max-width: 350px; } .sections-list .section-empty-state .empty-state .empty-state-icon { - background-size: 50px 50px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 50px 50px; + -moz-context-properties: fill; + display: block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 50px; - width: 50px; margin: 0 auto; - display: block; } + width: 50px; } .sections-list .section-empty-state .empty-state .empty-state-message { - margin-bottom: 0; + color: #737373; font-size: 13px; - color: #737373; + margin-bottom: 0; text-align: center; } .topic { + color: #737373; font-size: 12px; - color: #737373; - margin-top: 12px; - line-height: 1.6; } + line-height: 1.6; + margin-top: 12px; } @media (min-width: 800px) { .topic { line-height: 16px; } } .topic ul { margin: 0; padding: 0; } @media (min-width: 800px) { .topic ul { @@ -651,110 +651,110 @@ section.top-sites:not(.collapsed):hover fill: #008EA4; height: 16px; margin-inline-start: 5px; vertical-align: top; width: 12px; } .topic .topic-read-more:dir(rtl)::after { transform: scaleX(-1); } .topic::after { - content: ""; - display: table; - clear: both; } + clear: both; + content: ''; + display: table; } .search-wrapper { cursor: default; display: flex; - position: relative; + height: 35px; margin: 1px 1px 40px; - width: 100%; - height: 35px; } + position: relative; + width: 100%; } .search-wrapper input { - border: none; + border: 0; border-radius: 3px; box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.15); color: inherit; + font-size: 15px; padding: 0; padding-inline-end: 36px; padding-inline-start: 35px; - width: 100%; - font-size: 15px; } + width: 100%; } .search-wrapper:hover input { box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.25); } .search-wrapper:active input, .search-wrapper input:focus { box-shadow: 0 0 0 3px #0A84FF; } .search-wrapper .search-label { background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; + height: 100%; + offset-inline-start: 0; position: absolute; - offset-inline-start: 0; - height: 100%; width: 35px; } .search-wrapper .search-button { background: url("chrome://browser/skin/forward.svg") no-repeat center center; - border-radius: 0 3px 3px 0; + background-size: 16px 16px; border: 0; - width: 36px; + border-radius: 0 3px 3px 0; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; - background-size: 16px 16px; height: 100%; offset-inline-end: 0; - position: absolute; } + position: absolute; + width: 36px; } .search-wrapper .search-button:focus, .search-wrapper .search-button:hover { background-color: rgba(12, 12, 13, 0.1); cursor: pointer; } .search-wrapper .search-button:active { background-color: rgba(12, 12, 13, 0.2); } .search-wrapper .search-button:dir(rtl) { transform: scaleX(-1); } .search-wrapper .contentSearchSuggestionTable { border: 0; transform: translateY(2px); } .context-menu { + background: #F9F9FA; + border-radius: 5px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); display: block; - position: absolute; font-size: 14px; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); - top: 6.75px; - offset-inline-start: 100%; margin-inline-start: 5px; - z-index: 10000; - background: #F9F9FA; - border-radius: 5px; } + offset-inline-start: 100%; + position: absolute; + top: 6.75px; + z-index: 10000; } .context-menu > ul { + list-style: none; margin: 0; - padding: 5px 0; - list-style: none; } + padding: 5px 0; } .context-menu > ul > li { margin: 0; width: 100%; } .context-menu > ul > li.separator { - margin: 5px 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); } + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + margin: 5px 0; } .context-menu > ul > li > a { - outline: none; - cursor: pointer; + align-items: center; color: inherit; - white-space: nowrap; - padding: 3px 12px; + cursor: pointer; + display: flex; line-height: 16px; - display: flex; - align-items: center; } - .context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus { + outline: none; + padding: 3px 12px; + white-space: nowrap; } + .context-menu > ul > li > a:-moz-any(:focus, :hover) { background: #0060DF; color: #FFF; } - .context-menu > ul > li > a:hover a, .context-menu > ul > li > a:focus a { + .context-menu > ul > li > a:-moz-any(:focus, :hover) a { color: #0C0C0D; } - .context-menu > ul > li > a:hover .icon, .context-menu > ul > li > a:focus .icon { + .context-menu > ul > li > a:-moz-any(:focus, :hover) .icon { fill: #FFF; } - .context-menu > ul > li > a:hover:hover, .context-menu > ul > li > a:hover:focus, .context-menu > ul > li > a:focus:hover, .context-menu > ul > li > a:focus:focus { + .context-menu > ul > li > a:-moz-any(:focus, :hover):-moz-any(:focus, :hover) { color: #FFF; } .prefs-pane { color: #4A4A4F; font-size: 14px; line-height: 21px; } .prefs-pane .sidebar { background: #FFF; @@ -854,79 +854,79 @@ section.top-sites:not(.collapsed):hover offset-inline-start: 0; position: absolute; top: 0; width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after, .prefs-pane [type='checkbox']:checked + label::after { background: url("chrome://global/skin/in-content/check.svg") no-repeat center center; content: ''; + -moz-context-properties: fill, stroke; + fill: #0060DF; height: 21px; offset-inline-start: 0; position: absolute; + stroke: none; top: 0; - width: 21px; - -moz-context-properties: fill, stroke; - fill: #0060DF; - stroke: none; } + width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after { opacity: 0; } .prefs-pane [type='checkbox']:checked + label::after { opacity: 1; } .prefs-pane [type='checkbox']:not(:disabled) + label:hover::before { border: 1px solid #0060DF; } .prefs-pane [type='checkbox']:not(:disabled):checked:focus + label::before, .prefs-pane [type='checkbox']:not(:disabled):not(:checked):focus + label::before { border: 1px dotted #0060DF; } .prefs-pane-button button { background-color: transparent; border: 0; cursor: pointer; fill: rgba(12, 12, 13, 0.6); + offset-inline-end: 15px; padding: 15px; position: fixed; - offset-inline-end: 15px; top: 15px; z-index: 12001; } .prefs-pane-button button:hover { background-color: #EDEDF0; } .prefs-pane-button button:active { background-color: #F9F9FA; } .confirmation-dialog .modal { - position: fixed; - width: 400px; - top: 20%; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); left: 50%; margin-left: -200px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.08); } + position: fixed; + top: 20%; + width: 400px; } .confirmation-dialog section { margin: 0; } .confirmation-dialog .modal-message { + display: flex; padding: 16px; - padding-bottom: 0; - display: flex; } + padding-bottom: 0; } .confirmation-dialog .modal-message p { margin: 0; margin-bottom: 16px; } .confirmation-dialog .actions { - padding: 0px 16px 0 16px; - border: none; + border: 0; + display: flex; flex-wrap: nowrap; - display: flex; } + padding: 0 16px; } .confirmation-dialog .actions button { margin-inline-end: 16px; width: 50%; } .confirmation-dialog .actions button.done { - margin-inline-start: 0; - margin-inline-end: 0; } + margin-inline-end: 0; + margin-inline-start: 0; } .confirmation-dialog .icon { margin-inline-end: 16px; } .modal-overlay { background: #EDEDF0; height: 100%; left: 0; @@ -940,142 +940,142 @@ section.top-sites:not(.collapsed):hover background: #FFF; border: 1px solid #D7D7DB; border-radius: 5px; font-size: 15px; z-index: 11002; } .card-outer { background: #FFF; + border-radius: 3px; display: inline-block; + height: 266px; margin-inline-end: 32px; - width: 224px; - border-radius: 3px; - height: 266px; - position: relative; } + position: relative; + width: 224px; } .card-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .card-outer .context-menu-button:focus, .card-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } + width: 27px; } + .card-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } .card-outer.placeholder { background: transparent; } .card-outer.placeholder .card { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .card-outer .card { - height: 100%; border-radius: 3px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); } + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 100%; } .card-outer > a { + color: inherit; display: block; - color: inherit; height: 100%; outline: none; position: absolute; width: 224px; } - .card-outer > a.active .card, .card-outer > a:focus .card { + .card-outer > a:-moz-any(.active, :focus) .card { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .card-outer > a.active .card-title, .card-outer > a:focus .card-title { + .card-outer > a:-moz-any(.active, :focus) .card-title { color: #0060DF; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) { - outline: none; box-shadow: 0 0 0 5px #D7D7DB; - transition: box-shadow 150ms; } + transition: box-shadow 150ms; + outline: none; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .context-menu-button { - transform: scale(1); - opacity: 1; } + opacity: 1; + transform: scale(1); } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .card-title { color: #0060DF; } .card-outer .card-preview-image-outer { background-color: #F9F9FA; - position: relative; + border-radius: 3px 3px 0 0; height: 122px; - border-radius: 3px 3px 0 0; - overflow: hidden; } + overflow: hidden; + position: relative; } .card-outer .card-preview-image-outer::after { border-bottom: 1px solid rgba(0, 0, 0, 0.05); bottom: 0; - content: " "; + content: ''; position: absolute; width: 100%; } .card-outer .card-preview-image-outer .card-preview-image { - width: 100%; - height: 100%; - background-size: cover; background-position: center; background-repeat: no-repeat; + background-size: cover; + height: 100%; opacity: 0; - transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); } + transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); + width: 100%; } .card-outer .card-preview-image-outer .card-preview-image.loaded { opacity: 1; } .card-outer .card-details { padding: 15px 16px 12px; } .card-outer .card-details.no-image { padding-top: 16px; } .card-outer .card-text { - overflow: hidden; - max-height: 78px; } + max-height: 78px; + overflow: hidden; } .card-outer .card-text.no-image { max-height: 192px; } .card-outer .card-text.no-host-name, .card-outer .card-text.no-context { max-height: 97px; } .card-outer .card-text.no-image.no-host-name, .card-outer .card-text.no-image.no-context { max-height: 211px; } .card-outer .card-text.no-host-name.no-context { max-height: 116px; } .card-outer .card-text.no-image.no-host-name.no-context { max-height: 230px; } .card-outer .card-text:not(.no-description) .card-title { max-height: 57px; overflow: hidden; } .card-outer .card-host-name { color: #737373; font-size: 10px; + overflow: hidden; padding-bottom: 4px; - text-transform: uppercase; - overflow: hidden; - text-overflow: ellipsis; } + text-overflow: ellipsis; + text-transform: uppercase; } .card-outer .card-title { + font-size: 14px; + line-height: 19px; margin: 0 0 2px; - font-size: 14px; - word-wrap: break-word; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-description { font-size: 12px; + line-height: 19px; margin: 0; - word-wrap: break-word; overflow: hidden; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-context { + bottom: 0; + color: #737373; + display: flex; + font-size: 11px; + left: 0; padding: 12px 16px 12px 14px; position: absolute; - bottom: 0; - left: 0; - right: 0; - color: #737373; - font-size: 11px; - display: flex; } + right: 0; } .card-outer .card-context-icon { fill: rgba(12, 12, 13, 0.6); margin-inline-end: 6px; } .card-outer .card-context-label { flex-grow: 1; line-height: 16px; overflow: hidden; text-overflow: ellipsis; @@ -1098,23 +1098,23 @@ section.top-sites:not(.collapsed):hover .manual-migration-container p { align-self: center; display: flex; justify-content: space-between; } } .manual-migration-container .icon { display: none; } @media (min-width: 544px) { .manual-migration-container .icon { + align-self: center; display: block; fill: rgba(12, 12, 13, 0.6); - margin-inline-end: 6px; - align-self: center; } } + margin-inline-end: 6px; } } .manual-migration-actions { - border: none; + border: 0; display: block; flex-wrap: nowrap; } @media (min-width: 544px) { .manual-migration-actions { display: flex; justify-content: space-between; padding: 0; } } .manual-migration-actions button { @@ -1126,102 +1126,102 @@ section.top-sites:not(.collapsed):hover .collapsible-section .section-title .click-target { cursor: pointer; vertical-align: top; white-space: nowrap; } .collapsible-section .section-title .icon-arrowhead-down, .collapsible-section .section-title .icon-arrowhead-forward { - margin-top: -1px; - margin-inline-start: 8px; } + margin-inline-start: 8px; + margin-top: -1px; } .collapsible-section .section-top-bar { position: relative; } .collapsible-section .section-top-bar .section-info-option { offset-inline-end: 0; position: absolute; top: 0; } .collapsible-section .section-top-bar .info-option-icon { background-image: url("../data/content/assets/glyph-info-option-12.svg"); - background-size: 12px 12px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 12px 12px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 16px; - width: 16px; - display: inline-block; margin-bottom: -2px; opacity: 0; - transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:focus, .collapsible-section .section-top-bar .info-option-icon:active { + transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + width: 16px; } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] { + background-color: rgba(12, 12, 13, 0.1); + border-radius: 1px; + box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); + fill: rgba(12, 12, 13, 0.8); } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] + .info-option { + opacity: 1; + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: visible; } + .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded='true']) + .info-option { + pointer-events: none; } + .collapsible-section .section-top-bar .info-option-icon:-moz-any(:active, :focus) { opacity: 1; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] { - background-color: rgba(12, 12, 13, 0.1); - border-radius: 1px; - box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); - fill: rgba(12, 12, 13, 0.8); } .collapsible-section .section-top-bar .section-info-option .info-option { - visibility: hidden; opacity: 0; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: hidden; } .collapsible-section .section-top-bar .section-info-option .info-option::after, .collapsible-section .section-top-bar .section-info-option .info-option::before { - content: ""; + content: ''; offset-inline-end: 0; position: absolute; } .collapsible-section .section-top-bar .section-info-option .info-option::before { background-image: url("chrome://global/skin/arrow/panelarrow-vertical-themed.svg"); background-position: right 6px bottom; background-repeat: no-repeat; background-size: 20px 10px; height: 32px; top: -32px; width: 43px; } .collapsible-section .section-top-bar .section-info-option .info-option:dir(rtl)::before { background-position-x: 6px; } .collapsible-section .section-top-bar .section-info-option .info-option::after { height: 10px; offset-inline-start: 0; top: -10px; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option { - visibility: visible; - opacity: 1; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded="true"]) + .info-option { - pointer-events: none; } .collapsible-section .section-top-bar .info-option { - z-index: 9999; - position: absolute; background: #FFF; border: 1px solid #D7D7DB; border-radius: 3px; + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); font-size: 13px; line-height: 120%; margin-inline-end: -9px; offset-inline-end: 0; + padding: 24px; + position: absolute; top: 26px; + -moz-user-select: none; width: 320px; - padding: 24px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); - -moz-user-select: none; } + z-index: 9999; } .collapsible-section .section-top-bar .info-option-header { font-size: 15px; font-weight: 600; } .collapsible-section .section-top-bar .info-option-body { margin: 0; margin-top: 12px; } .collapsible-section .section-top-bar .info-option-link { color: #0060DF; margin-left: 7px; } .collapsible-section .section-top-bar .info-option-manage { margin-top: 24px; } .collapsible-section .section-top-bar .info-option-manage button { - background: none; - border: none; + background: 0; + border: 0; color: #0060DF; cursor: pointer; margin: 0; padding: 0; } .collapsible-section .section-top-bar .info-option-manage button::after { background-image: url("../data/content/assets/topic-show-more-12.svg"); background-repeat: no-repeat; content: ''; @@ -1251,24 +1251,24 @@ section.top-sites:not(.collapsed):hover width: 340px; } } @media (min-width: 800px) { .collapsible-section .section-disclaimer .section-disclaimer-text { width: 610px; } } .collapsible-section .section-disclaimer a { color: #008EA4; padding-left: 3px; } .collapsible-section .section-disclaimer button { - margin-top: 2px; - offset-inline-end: 0; - min-height: 26px; - max-width: 130px; background: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; - cursor: pointer; } + cursor: pointer; + margin-top: 2px; + max-width: 130px; + min-height: 26px; + offset-inline-end: 0; } .collapsible-section .section-disclaimer button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } @media (min-width: 416px) { .collapsible-section .section-disclaimer button { position: absolute; } } .collapsible-section .section-body {
--- a/browser/extensions/activity-stream/css/activity-stream-mac.css +++ b/browser/extensions/activity-stream/css/activity-stream-mac.css @@ -18,40 +18,40 @@ button, input { font-family: inherit; font-size: inherit; } [hidden] { display: none !important; } .icon { - display: inline-block; - width: 16px; - height: 16px; - background-size: 16px; background-position: center center; background-repeat: no-repeat; - vertical-align: middle; + background-size: 16px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.8); - -moz-context-properties: fill; } + height: 16px; + vertical-align: middle; + width: 16px; } .icon.icon-spacer { margin-inline-end: 8px; } .icon.icon-small-spacer { margin-inline-end: 6px; } .icon.icon-bookmark-added { background-image: url("chrome://browser/skin/bookmark.svg"); } .icon.icon-bookmark-hollow { background-image: url("chrome://browser/skin/bookmark-hollow.svg"); } .icon.icon-delete { background-image: url("../data/content/assets/glyph-delete-16.svg"); } .icon.icon-modal-delete { background-image: url("../data/content/assets/glyph-modal-delete-32.svg"); - width: 32px; + background-size: 32px; height: 32px; - background-size: 32px; } + width: 32px; } .icon.icon-dismiss { background-image: url("../data/content/assets/glyph-dismiss-16.svg"); } .icon.icon-info { background-image: url("../data/content/assets/glyph-info-16.svg"); } .icon.icon-import { background-image: url("../data/content/assets/glyph-import-16.svg"); } .icon.icon-new-window { background-image: url("../data/content/assets/glyph-newWindow-16.svg"); } @@ -66,18 +66,17 @@ input { .icon.icon-edit { background-image: url("../data/content/assets/glyph-edit-16.svg"); } .icon.icon-pocket { background-image: url("../data/content/assets/glyph-pocket-16.svg"); } .icon.icon-historyItem { background-image: url("../data/content/assets/glyph-historyItem-16.svg"); } .icon.icon-trending { background-image: url("../data/content/assets/glyph-trending-16.svg"); - transform: translateY(2px); - /* trending bolt is visually top heavy */ } + transform: translateY(2px); } .icon.icon-now { background-image: url("chrome://browser/skin/history.svg"); } .icon.icon-topsites { background-image: url("../data/content/assets/glyph-topsites-16.svg"); } .icon.icon-pin-small { background-image: url("../data/content/assets/glyph-pin-12.svg"); background-size: 12px; height: 12px; @@ -120,65 +119,65 @@ h2 { a { color: #0060DF; text-decoration: none; } a:hover { color: #008EA4; } .sr-only { - position: absolute; - width: 1px; + border: 0; + clip: rect(0, 0, 0, 0); height: 1px; - padding: 0; margin: -1px; overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; } + padding: 0; + position: absolute; + width: 1px; } .inner-border { border: 1px solid #D7D7DB; border-radius: 3px; + height: 100%; + left: 0; + pointer-events: none; position: absolute; top: 0; - left: 0; width: 100%; - height: 100%; - pointer-events: none; z-index: 100; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .show-on-init { opacity: 0; transition: opacity 0.2s ease-in; } .show-on-init.on { - opacity: 1; - animation: fadeIn 0.2s; } + animation: fadeIn 0.2s; + opacity: 1; } .actions { border-top: 1px solid #D7D7DB; display: flex; flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; margin: 0; - padding: 15px 25px 0 25px; - justify-content: flex-start; - flex-wrap: wrap; } + padding: 15px 25px 0; } .actions button { background-color: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; color: inherit; cursor: pointer; + margin-bottom: 15px; padding: 10px 30px; - margin-bottom: 15px; white-space: nowrap; } .actions button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .actions button.dismiss { border: 0; padding: 0; text-decoration: underline; } @@ -188,26 +187,26 @@ a { color: #FFF; margin-inline-start: auto; } #snippets-container { z-index: 1; } .outer-wrapper { display: flex; - padding: 40px 32px 32px; + flex-grow: 1; height: 100%; - flex-grow: 1; } + padding: 40px 32px 32px; } .outer-wrapper.fixed-to-top { height: auto; } main { margin: auto; - width: 224px; - padding-bottom: 48px; } + padding-bottom: 48px; + width: 224px; } @media (min-width: 416px) { main { width: 352px; } } @media (min-width: 544px) { main { width: 480px; } } @media (min-width: 800px) { main { @@ -240,157 +239,161 @@ main { .body-wrapper.on .sections-list .section:last-of-type, .body-wrapper.on .topic { opacity: 1; } .top-sites-list { list-style: none; margin: 0; margin-bottom: -18px; - padding: 0; - margin-inline-end: -32px; } + margin-inline-end: -32px; + padding: 0; } @media (max-width: 416px) { .top-sites-list :nth-child(2n+1) .context-menu { + margin-inline-end: auto; margin-inline-start: auto; - margin-inline-end: auto; - offset-inline-start: -32px; - offset-inline-end: auto; } + offset-inline-end: auto; + offset-inline-start: -32px; } .top-sites-list :nth-child(2n) .context-menu { - margin-inline-start: auto; margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 416px) and (max-width: 544px) { - .top-sites-list :nth-child(3n+2) .context-menu, .top-sites-list :nth-child(3n) .context-menu { - margin-inline-start: auto; + .top-sites-list :nth-child(3n+2) .context-menu, + .top-sites-list :nth-child(3n) .context-menu { margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .top-sites-list :nth-child(4n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 768px) { .top-sites-list :nth-child(4n+3) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .top-sites-list :nth-child(6n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1024px) { .top-sites-list :nth-child(6n+5) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .top-sites-list li { display: inline-block; margin: 0 0 8px; margin-inline-end: 32px; } .top-sites-list .top-site-outer { position: relative; } .top-sites-list .top-site-outer > a { + color: inherit; display: block; - color: inherit; outline: none; } - .top-sites-list .top-site-outer > a.active .tile, .top-sites-list .top-site-outer > a:focus .tile { + .top-sites-list .top-site-outer > a:-moz-any(.active, :focus) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .top-sites-list .top-site-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .top-sites-list .top-site-outer .context-menu-button:focus, .top-sites-list .top-site-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } - .top-sites-list .top-site-outer:hover .tile, .top-sites-list .top-site-outer:focus .tile, .top-sites-list .top-site-outer.active .tile { + width: 27px; } + .top-sites-list .top-site-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .top-sites-list .top-site-outer:hover .context-menu-button, .top-sites-list .top-site-outer:focus .context-menu-button, .top-sites-list .top-site-outer.active .context-menu-button { - transform: scale(1); - opacity: 1; } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .edit-menu { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .context-menu-button { + opacity: 1; + transform: scale(1); } .top-sites-list .top-site-outer .tile { - position: relative; - height: 96px; - width: 96px; border-radius: 6px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 96px; + position: relative; + width: 96px; + align-items: center; color: #737373; - font-weight: 200; + display: flex; font-size: 32px; - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; } + font-weight: 200; + justify-content: center; + text-transform: uppercase; } .top-sites-list .top-site-outer .tile::before { content: attr(data-fallback); } .top-sites-list .top-site-outer.placeholder .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .top-sites-list .top-site-outer.placeholder .screenshot { display: none; } .top-sites-list .top-site-outer .screenshot { + background-color: #FFF; + background-position: top left; + background-size: cover; + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + height: 100%; + left: 0; + opacity: 0; position: absolute; top: 0; - left: 0; - height: 100%; - width: 100%; - background-color: #FFF; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); - background-size: cover; - background-position: top left; transition: opacity 1s; - opacity: 0; } + width: 100%; } .top-sites-list .top-site-outer .screenshot.active { opacity: 1; } .top-sites-list .top-site-outer .top-site-icon { - position: absolute; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + background-color: #F9F9FA; background-position: center center; background-repeat: no-repeat; - background-color: #F9F9FA; } + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + position: absolute; } .top-sites-list .top-site-outer .rich-icon { - top: 0; + background-size: 96px; + height: 100%; offset-inline-start: 0; - height: 100%; - width: 100%; - background-size: 96px; } + top: 0; + width: 100%; } .top-sites-list .top-site-outer .default-icon { + background-size: 32px; bottom: -6px; height: 42px; offset-inline-end: -6px; width: 42px; - background-size: 32px; + align-items: center; display: flex; - align-items: center; - justify-content: center; - font-size: 20px; } + font-size: 20px; + justify-content: center; } .top-sites-list .top-site-outer .default-icon[data-fallback]::before { content: attr(data-fallback); } .top-sites-list .top-site-outer .title { font: message-box; height: 30px; line-height: 30px; text-align: center; width: 96px; @@ -418,17 +421,17 @@ main { offset-inline-end: -12.5px; opacity: 0; overflow: hidden; top: -12.5px; transform: scale(0.25); transition-property: transform, opacity; transition-duration: 200ms; z-index: 1000; } - .top-sites-list .top-site-outer .edit-menu:focus, .top-sites-list .top-site-outer .edit-menu:active { + .top-sites-list .top-site-outer .edit-menu:-moz-any(:active, :focus) { transform: scale(1); opacity: 1; } .top-sites-list .top-site-outer .edit-menu button { border: 0; border-right: 1px solid #B1B1B3; background-color: #FFF; cursor: pointer; height: 100%; @@ -438,34 +441,31 @@ main { .top-sites-list .top-site-outer .edit-menu button:first-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:last-child:dir(rtl) { width: 30px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { width: 28px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr) { border-right: 0; } .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { border-right: 0; } - .top-sites-list .top-site-outer:hover .edit-menu, .top-sites-list .top-site-outer:focus .edit-menu, .top-sites-list .top-site-outer.active .edit-menu { - transform: scale(1); - opacity: 1; } .edit-topsites-wrapper .edit-topsites-button { border-right: 1px solid #D7D7DB; line-height: 13px; offset-inline-end: 24px; opacity: 0; padding: 0 10px; pointer-events: none; position: absolute; top: 2px; transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } .edit-topsites-wrapper .edit-topsites-button:dir(rtl) { border-left: 1px solid #D7D7DB; border-right: 0; } - .edit-topsites-wrapper .edit-topsites-button:focus, .edit-topsites-wrapper .edit-topsites-button:active { + .edit-topsites-wrapper .edit-topsites-button:-moz-any(:active, :focus) { opacity: 1; } .edit-topsites-wrapper .edit-topsites-button button { background: none; border: 0; color: #737373; cursor: pointer; font-size: 12px; padding: 0; } @@ -494,17 +494,17 @@ main { width: auto; } .edit-topsites-wrapper .show-more:dir(rtl), .edit-topsites-wrapper .show-less:dir(rtl) { background-position: right 10px center; } .edit-topsites-wrapper .show-more span, .edit-topsites-wrapper .show-less span { padding-inline-start: 3px; } -section.top-sites:not(.collapsed):hover .edit-topsites-button { +.top-sites:not(.collapsed):hover .edit-topsites-button { opacity: 1; pointer-events: auto; } .topsite-form .form-wrapper { margin: auto; max-width: 350px; padding: 15px 0; } .topsite-form .form-wrapper .field { @@ -559,69 +559,69 @@ section.top-sites:not(.collapsed):hover 0% { opacity: 0; transform: translateY(15px); } 100% { opacity: 1; transform: translateY(0); } } .sections-list .section-list { - margin: 0; display: grid; + grid-gap: 32px; grid-template-columns: repeat(auto-fit, 224px); - grid-gap: 32px; } + margin: 0; } @media (max-width: 544px) { .sections-list .section-list .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .sections-list .section-list :nth-child(2n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .sections-list .section-list :nth-child(3n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .sections-list .section-empty-state { - width: 100%; - height: 266px; + border: 1px solid #D7D7DB; + border-radius: 3px; display: flex; - border: 1px solid #D7D7DB; - border-radius: 3px; } + height: 266px; + width: 100%; } .sections-list .section-empty-state .empty-state { margin: auto; max-width: 350px; } .sections-list .section-empty-state .empty-state .empty-state-icon { - background-size: 50px 50px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 50px 50px; + -moz-context-properties: fill; + display: block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 50px; - width: 50px; margin: 0 auto; - display: block; } + width: 50px; } .sections-list .section-empty-state .empty-state .empty-state-message { - margin-bottom: 0; + color: #737373; font-size: 13px; - color: #737373; + margin-bottom: 0; text-align: center; } .topic { + color: #737373; font-size: 12px; - color: #737373; - margin-top: 12px; - line-height: 1.6; } + line-height: 1.6; + margin-top: 12px; } @media (min-width: 800px) { .topic { line-height: 16px; } } .topic ul { margin: 0; padding: 0; } @media (min-width: 800px) { .topic ul { @@ -651,110 +651,110 @@ section.top-sites:not(.collapsed):hover fill: #008EA4; height: 16px; margin-inline-start: 5px; vertical-align: top; width: 12px; } .topic .topic-read-more:dir(rtl)::after { transform: scaleX(-1); } .topic::after { - content: ""; - display: table; - clear: both; } + clear: both; + content: ''; + display: table; } .search-wrapper { cursor: default; display: flex; - position: relative; + height: 35px; margin: 1px 1px 40px; - width: 100%; - height: 35px; } + position: relative; + width: 100%; } .search-wrapper input { - border: none; + border: 0; border-radius: 3px; box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.15); color: inherit; + font-size: 15px; padding: 0; padding-inline-end: 36px; padding-inline-start: 35px; - width: 100%; - font-size: 15px; } + width: 100%; } .search-wrapper:hover input { box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.25); } .search-wrapper:active input, .search-wrapper input:focus { box-shadow: 0 0 0 3px #0A84FF; } .search-wrapper .search-label { background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; + height: 100%; + offset-inline-start: 0; position: absolute; - offset-inline-start: 0; - height: 100%; width: 35px; } .search-wrapper .search-button { background: url("chrome://browser/skin/forward.svg") no-repeat center center; - border-radius: 0 3px 3px 0; + background-size: 16px 16px; border: 0; - width: 36px; + border-radius: 0 3px 3px 0; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; - background-size: 16px 16px; height: 100%; offset-inline-end: 0; - position: absolute; } + position: absolute; + width: 36px; } .search-wrapper .search-button:focus, .search-wrapper .search-button:hover { background-color: rgba(12, 12, 13, 0.1); cursor: pointer; } .search-wrapper .search-button:active { background-color: rgba(12, 12, 13, 0.2); } .search-wrapper .search-button:dir(rtl) { transform: scaleX(-1); } .search-wrapper .contentSearchSuggestionTable { border: 0; transform: translateY(2px); } .context-menu { + background: #F9F9FA; + border-radius: 5px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); display: block; - position: absolute; font-size: 14px; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); - top: 6.75px; - offset-inline-start: 100%; margin-inline-start: 5px; - z-index: 10000; - background: #F9F9FA; - border-radius: 5px; } + offset-inline-start: 100%; + position: absolute; + top: 6.75px; + z-index: 10000; } .context-menu > ul { + list-style: none; margin: 0; - padding: 5px 0; - list-style: none; } + padding: 5px 0; } .context-menu > ul > li { margin: 0; width: 100%; } .context-menu > ul > li.separator { - margin: 5px 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); } + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + margin: 5px 0; } .context-menu > ul > li > a { - outline: none; - cursor: pointer; + align-items: center; color: inherit; - white-space: nowrap; - padding: 3px 12px; + cursor: pointer; + display: flex; line-height: 16px; - display: flex; - align-items: center; } - .context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus { + outline: none; + padding: 3px 12px; + white-space: nowrap; } + .context-menu > ul > li > a:-moz-any(:focus, :hover) { background: #0060DF; color: #FFF; } - .context-menu > ul > li > a:hover a, .context-menu > ul > li > a:focus a { + .context-menu > ul > li > a:-moz-any(:focus, :hover) a { color: #0C0C0D; } - .context-menu > ul > li > a:hover .icon, .context-menu > ul > li > a:focus .icon { + .context-menu > ul > li > a:-moz-any(:focus, :hover) .icon { fill: #FFF; } - .context-menu > ul > li > a:hover:hover, .context-menu > ul > li > a:hover:focus, .context-menu > ul > li > a:focus:hover, .context-menu > ul > li > a:focus:focus { + .context-menu > ul > li > a:-moz-any(:focus, :hover):-moz-any(:focus, :hover) { color: #FFF; } .prefs-pane { color: #4A4A4F; font-size: 14px; line-height: 21px; } .prefs-pane .sidebar { background: #FFF; @@ -854,79 +854,79 @@ section.top-sites:not(.collapsed):hover offset-inline-start: 0; position: absolute; top: 0; width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after, .prefs-pane [type='checkbox']:checked + label::after { background: url("chrome://global/skin/in-content/check.svg") no-repeat center center; content: ''; + -moz-context-properties: fill, stroke; + fill: #0060DF; height: 21px; offset-inline-start: 0; position: absolute; + stroke: none; top: 0; - width: 21px; - -moz-context-properties: fill, stroke; - fill: #0060DF; - stroke: none; } + width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after { opacity: 0; } .prefs-pane [type='checkbox']:checked + label::after { opacity: 1; } .prefs-pane [type='checkbox']:not(:disabled) + label:hover::before { border: 1px solid #0060DF; } .prefs-pane [type='checkbox']:not(:disabled):checked:focus + label::before, .prefs-pane [type='checkbox']:not(:disabled):not(:checked):focus + label::before { border: 1px dotted #0060DF; } .prefs-pane-button button { background-color: transparent; border: 0; cursor: pointer; fill: rgba(12, 12, 13, 0.6); + offset-inline-end: 15px; padding: 15px; position: fixed; - offset-inline-end: 15px; top: 15px; z-index: 12001; } .prefs-pane-button button:hover { background-color: #EDEDF0; } .prefs-pane-button button:active { background-color: #F9F9FA; } .confirmation-dialog .modal { - position: fixed; - width: 400px; - top: 20%; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); left: 50%; margin-left: -200px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.08); } + position: fixed; + top: 20%; + width: 400px; } .confirmation-dialog section { margin: 0; } .confirmation-dialog .modal-message { + display: flex; padding: 16px; - padding-bottom: 0; - display: flex; } + padding-bottom: 0; } .confirmation-dialog .modal-message p { margin: 0; margin-bottom: 16px; } .confirmation-dialog .actions { - padding: 0px 16px 0 16px; - border: none; + border: 0; + display: flex; flex-wrap: nowrap; - display: flex; } + padding: 0 16px; } .confirmation-dialog .actions button { margin-inline-end: 16px; width: 50%; } .confirmation-dialog .actions button.done { - margin-inline-start: 0; - margin-inline-end: 0; } + margin-inline-end: 0; + margin-inline-start: 0; } .confirmation-dialog .icon { margin-inline-end: 16px; } .modal-overlay { background: #EDEDF0; height: 100%; left: 0; @@ -940,142 +940,142 @@ section.top-sites:not(.collapsed):hover background: #FFF; border: 1px solid #D7D7DB; border-radius: 5px; font-size: 15px; z-index: 11002; } .card-outer { background: #FFF; + border-radius: 3px; display: inline-block; + height: 266px; margin-inline-end: 32px; - width: 224px; - border-radius: 3px; - height: 266px; - position: relative; } + position: relative; + width: 224px; } .card-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .card-outer .context-menu-button:focus, .card-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } + width: 27px; } + .card-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } .card-outer.placeholder { background: transparent; } .card-outer.placeholder .card { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .card-outer .card { - height: 100%; border-radius: 3px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); } + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 100%; } .card-outer > a { + color: inherit; display: block; - color: inherit; height: 100%; outline: none; position: absolute; width: 224px; } - .card-outer > a.active .card, .card-outer > a:focus .card { + .card-outer > a:-moz-any(.active, :focus) .card { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .card-outer > a.active .card-title, .card-outer > a:focus .card-title { + .card-outer > a:-moz-any(.active, :focus) .card-title { color: #0060DF; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) { - outline: none; box-shadow: 0 0 0 5px #D7D7DB; - transition: box-shadow 150ms; } + transition: box-shadow 150ms; + outline: none; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .context-menu-button { - transform: scale(1); - opacity: 1; } + opacity: 1; + transform: scale(1); } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .card-title { color: #0060DF; } .card-outer .card-preview-image-outer { background-color: #F9F9FA; - position: relative; + border-radius: 3px 3px 0 0; height: 122px; - border-radius: 3px 3px 0 0; - overflow: hidden; } + overflow: hidden; + position: relative; } .card-outer .card-preview-image-outer::after { border-bottom: 1px solid rgba(0, 0, 0, 0.05); bottom: 0; - content: " "; + content: ''; position: absolute; width: 100%; } .card-outer .card-preview-image-outer .card-preview-image { - width: 100%; - height: 100%; - background-size: cover; background-position: center; background-repeat: no-repeat; + background-size: cover; + height: 100%; opacity: 0; - transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); } + transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); + width: 100%; } .card-outer .card-preview-image-outer .card-preview-image.loaded { opacity: 1; } .card-outer .card-details { padding: 15px 16px 12px; } .card-outer .card-details.no-image { padding-top: 16px; } .card-outer .card-text { - overflow: hidden; - max-height: 78px; } + max-height: 78px; + overflow: hidden; } .card-outer .card-text.no-image { max-height: 192px; } .card-outer .card-text.no-host-name, .card-outer .card-text.no-context { max-height: 97px; } .card-outer .card-text.no-image.no-host-name, .card-outer .card-text.no-image.no-context { max-height: 211px; } .card-outer .card-text.no-host-name.no-context { max-height: 116px; } .card-outer .card-text.no-image.no-host-name.no-context { max-height: 230px; } .card-outer .card-text:not(.no-description) .card-title { max-height: 57px; overflow: hidden; } .card-outer .card-host-name { color: #737373; font-size: 10px; + overflow: hidden; padding-bottom: 4px; - text-transform: uppercase; - overflow: hidden; - text-overflow: ellipsis; } + text-overflow: ellipsis; + text-transform: uppercase; } .card-outer .card-title { + font-size: 14px; + line-height: 19px; margin: 0 0 2px; - font-size: 14px; - word-wrap: break-word; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-description { font-size: 12px; + line-height: 19px; margin: 0; - word-wrap: break-word; overflow: hidden; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-context { + bottom: 0; + color: #737373; + display: flex; + font-size: 11px; + left: 0; padding: 12px 16px 12px 14px; position: absolute; - bottom: 0; - left: 0; - right: 0; - color: #737373; - font-size: 11px; - display: flex; } + right: 0; } .card-outer .card-context-icon { fill: rgba(12, 12, 13, 0.6); margin-inline-end: 6px; } .card-outer .card-context-label { flex-grow: 1; line-height: 16px; overflow: hidden; text-overflow: ellipsis; @@ -1098,23 +1098,23 @@ section.top-sites:not(.collapsed):hover .manual-migration-container p { align-self: center; display: flex; justify-content: space-between; } } .manual-migration-container .icon { display: none; } @media (min-width: 544px) { .manual-migration-container .icon { + align-self: center; display: block; fill: rgba(12, 12, 13, 0.6); - margin-inline-end: 6px; - align-self: center; } } + margin-inline-end: 6px; } } .manual-migration-actions { - border: none; + border: 0; display: block; flex-wrap: nowrap; } @media (min-width: 544px) { .manual-migration-actions { display: flex; justify-content: space-between; padding: 0; } } .manual-migration-actions button { @@ -1126,102 +1126,102 @@ section.top-sites:not(.collapsed):hover .collapsible-section .section-title .click-target { cursor: pointer; vertical-align: top; white-space: nowrap; } .collapsible-section .section-title .icon-arrowhead-down, .collapsible-section .section-title .icon-arrowhead-forward { - margin-top: -1px; - margin-inline-start: 8px; } + margin-inline-start: 8px; + margin-top: -1px; } .collapsible-section .section-top-bar { position: relative; } .collapsible-section .section-top-bar .section-info-option { offset-inline-end: 0; position: absolute; top: 0; } .collapsible-section .section-top-bar .info-option-icon { background-image: url("../data/content/assets/glyph-info-option-12.svg"); - background-size: 12px 12px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 12px 12px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 16px; - width: 16px; - display: inline-block; margin-bottom: -2px; opacity: 0; - transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:focus, .collapsible-section .section-top-bar .info-option-icon:active { + transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + width: 16px; } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] { + background-color: rgba(12, 12, 13, 0.1); + border-radius: 1px; + box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); + fill: rgba(12, 12, 13, 0.8); } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] + .info-option { + opacity: 1; + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: visible; } + .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded='true']) + .info-option { + pointer-events: none; } + .collapsible-section .section-top-bar .info-option-icon:-moz-any(:active, :focus) { opacity: 1; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] { - background-color: rgba(12, 12, 13, 0.1); - border-radius: 1px; - box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); - fill: rgba(12, 12, 13, 0.8); } .collapsible-section .section-top-bar .section-info-option .info-option { - visibility: hidden; opacity: 0; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: hidden; } .collapsible-section .section-top-bar .section-info-option .info-option::after, .collapsible-section .section-top-bar .section-info-option .info-option::before { - content: ""; + content: ''; offset-inline-end: 0; position: absolute; } .collapsible-section .section-top-bar .section-info-option .info-option::before { background-image: url("chrome://global/skin/arrow/panelarrow-vertical@2x.png"); background-position: right 7px bottom; background-repeat: no-repeat; background-size: 18px 10px; height: 32px; top: -32px; width: 43px; } .collapsible-section .section-top-bar .section-info-option .info-option:dir(rtl)::before { background-position-x: 7px; } .collapsible-section .section-top-bar .section-info-option .info-option::after { height: 10px; offset-inline-start: 0; top: -10px; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option { - visibility: visible; - opacity: 1; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded="true"]) + .info-option { - pointer-events: none; } .collapsible-section .section-top-bar .info-option { - z-index: 9999; - position: absolute; background: #FFF; border: 1px solid #D7D7DB; border-radius: 3px; + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); font-size: 13px; line-height: 120%; margin-inline-end: -9px; offset-inline-end: 0; + padding: 24px; + position: absolute; top: 26px; + -moz-user-select: none; width: 320px; - padding: 24px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); - -moz-user-select: none; } + z-index: 9999; } .collapsible-section .section-top-bar .info-option-header { font-size: 15px; font-weight: 600; } .collapsible-section .section-top-bar .info-option-body { margin: 0; margin-top: 12px; } .collapsible-section .section-top-bar .info-option-link { color: #0060DF; margin-left: 7px; } .collapsible-section .section-top-bar .info-option-manage { margin-top: 24px; } .collapsible-section .section-top-bar .info-option-manage button { - background: none; - border: none; + background: 0; + border: 0; color: #0060DF; cursor: pointer; margin: 0; padding: 0; } .collapsible-section .section-top-bar .info-option-manage button::after { background-image: url("../data/content/assets/topic-show-more-12.svg"); background-repeat: no-repeat; content: ''; @@ -1251,24 +1251,24 @@ section.top-sites:not(.collapsed):hover width: 340px; } } @media (min-width: 800px) { .collapsible-section .section-disclaimer .section-disclaimer-text { width: 610px; } } .collapsible-section .section-disclaimer a { color: #008EA4; padding-left: 3px; } .collapsible-section .section-disclaimer button { - margin-top: 2px; - offset-inline-end: 0; - min-height: 26px; - max-width: 130px; background: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; - cursor: pointer; } + cursor: pointer; + margin-top: 2px; + max-width: 130px; + min-height: 26px; + offset-inline-end: 0; } .collapsible-section .section-disclaimer button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } @media (min-width: 416px) { .collapsible-section .section-disclaimer button { position: absolute; } } .collapsible-section .section-body {
--- a/browser/extensions/activity-stream/css/activity-stream-windows.css +++ b/browser/extensions/activity-stream/css/activity-stream-windows.css @@ -18,40 +18,40 @@ button, input { font-family: inherit; font-size: inherit; } [hidden] { display: none !important; } .icon { - display: inline-block; - width: 16px; - height: 16px; - background-size: 16px; background-position: center center; background-repeat: no-repeat; - vertical-align: middle; + background-size: 16px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.8); - -moz-context-properties: fill; } + height: 16px; + vertical-align: middle; + width: 16px; } .icon.icon-spacer { margin-inline-end: 8px; } .icon.icon-small-spacer { margin-inline-end: 6px; } .icon.icon-bookmark-added { background-image: url("chrome://browser/skin/bookmark.svg"); } .icon.icon-bookmark-hollow { background-image: url("chrome://browser/skin/bookmark-hollow.svg"); } .icon.icon-delete { background-image: url("../data/content/assets/glyph-delete-16.svg"); } .icon.icon-modal-delete { background-image: url("../data/content/assets/glyph-modal-delete-32.svg"); - width: 32px; + background-size: 32px; height: 32px; - background-size: 32px; } + width: 32px; } .icon.icon-dismiss { background-image: url("../data/content/assets/glyph-dismiss-16.svg"); } .icon.icon-info { background-image: url("../data/content/assets/glyph-info-16.svg"); } .icon.icon-import { background-image: url("../data/content/assets/glyph-import-16.svg"); } .icon.icon-new-window { background-image: url("../data/content/assets/glyph-newWindow-16.svg"); } @@ -66,18 +66,17 @@ input { .icon.icon-edit { background-image: url("../data/content/assets/glyph-edit-16.svg"); } .icon.icon-pocket { background-image: url("../data/content/assets/glyph-pocket-16.svg"); } .icon.icon-historyItem { background-image: url("../data/content/assets/glyph-historyItem-16.svg"); } .icon.icon-trending { background-image: url("../data/content/assets/glyph-trending-16.svg"); - transform: translateY(2px); - /* trending bolt is visually top heavy */ } + transform: translateY(2px); } .icon.icon-now { background-image: url("chrome://browser/skin/history.svg"); } .icon.icon-topsites { background-image: url("../data/content/assets/glyph-topsites-16.svg"); } .icon.icon-pin-small { background-image: url("../data/content/assets/glyph-pin-12.svg"); background-size: 12px; height: 12px; @@ -120,65 +119,65 @@ h2 { a { color: #0060DF; text-decoration: none; } a:hover { color: #008EA4; } .sr-only { - position: absolute; - width: 1px; + border: 0; + clip: rect(0, 0, 0, 0); height: 1px; - padding: 0; margin: -1px; overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; } + padding: 0; + position: absolute; + width: 1px; } .inner-border { border: 1px solid #D7D7DB; border-radius: 3px; + height: 100%; + left: 0; + pointer-events: none; position: absolute; top: 0; - left: 0; width: 100%; - height: 100%; - pointer-events: none; z-index: 100; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .show-on-init { opacity: 0; transition: opacity 0.2s ease-in; } .show-on-init.on { - opacity: 1; - animation: fadeIn 0.2s; } + animation: fadeIn 0.2s; + opacity: 1; } .actions { border-top: 1px solid #D7D7DB; display: flex; flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; margin: 0; - padding: 15px 25px 0 25px; - justify-content: flex-start; - flex-wrap: wrap; } + padding: 15px 25px 0; } .actions button { background-color: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; color: inherit; cursor: pointer; + margin-bottom: 15px; padding: 10px 30px; - margin-bottom: 15px; white-space: nowrap; } .actions button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .actions button.dismiss { border: 0; padding: 0; text-decoration: underline; } @@ -188,26 +187,26 @@ a { color: #FFF; margin-inline-start: auto; } #snippets-container { z-index: 1; } .outer-wrapper { display: flex; - padding: 40px 32px 32px; + flex-grow: 1; height: 100%; - flex-grow: 1; } + padding: 40px 32px 32px; } .outer-wrapper.fixed-to-top { height: auto; } main { margin: auto; - width: 224px; - padding-bottom: 48px; } + padding-bottom: 48px; + width: 224px; } @media (min-width: 416px) { main { width: 352px; } } @media (min-width: 544px) { main { width: 480px; } } @media (min-width: 800px) { main { @@ -240,157 +239,161 @@ main { .body-wrapper.on .sections-list .section:last-of-type, .body-wrapper.on .topic { opacity: 1; } .top-sites-list { list-style: none; margin: 0; margin-bottom: -18px; - padding: 0; - margin-inline-end: -32px; } + margin-inline-end: -32px; + padding: 0; } @media (max-width: 416px) { .top-sites-list :nth-child(2n+1) .context-menu { + margin-inline-end: auto; margin-inline-start: auto; - margin-inline-end: auto; - offset-inline-start: -32px; - offset-inline-end: auto; } + offset-inline-end: auto; + offset-inline-start: -32px; } .top-sites-list :nth-child(2n) .context-menu { - margin-inline-start: auto; margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 416px) and (max-width: 544px) { - .top-sites-list :nth-child(3n+2) .context-menu, .top-sites-list :nth-child(3n) .context-menu { - margin-inline-start: auto; + .top-sites-list :nth-child(3n+2) .context-menu, + .top-sites-list :nth-child(3n) .context-menu { margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + margin-inline-start: auto; + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .top-sites-list :nth-child(4n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 768px) { .top-sites-list :nth-child(4n+3) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .top-sites-list :nth-child(6n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1024px) { .top-sites-list :nth-child(6n+5) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .top-sites-list li { display: inline-block; margin: 0 0 8px; margin-inline-end: 32px; } .top-sites-list .top-site-outer { position: relative; } .top-sites-list .top-site-outer > a { + color: inherit; display: block; - color: inherit; outline: none; } - .top-sites-list .top-site-outer > a.active .tile, .top-sites-list .top-site-outer > a:focus .tile { + .top-sites-list .top-site-outer > a:-moz-any(.active, :focus) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } .top-sites-list .top-site-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .top-sites-list .top-site-outer .context-menu-button:focus, .top-sites-list .top-site-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } - .top-sites-list .top-site-outer:hover .tile, .top-sites-list .top-site-outer:focus .tile, .top-sites-list .top-site-outer.active .tile { + width: 27px; } + .top-sites-list .top-site-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .top-sites-list .top-site-outer:hover .context-menu-button, .top-sites-list .top-site-outer:focus .context-menu-button, .top-sites-list .top-site-outer.active .context-menu-button { - transform: scale(1); - opacity: 1; } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .edit-menu { + opacity: 1; + transform: scale(1); } + .top-sites-list .top-site-outer:-moz-any(.active, :focus, :hover) .context-menu-button { + opacity: 1; + transform: scale(1); } .top-sites-list .top-site-outer .tile { - position: relative; - height: 96px; - width: 96px; border-radius: 6px; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 96px; + position: relative; + width: 96px; + align-items: center; color: #737373; - font-weight: 200; + display: flex; font-size: 32px; - text-transform: uppercase; - display: flex; - align-items: center; - justify-content: center; } + font-weight: 200; + justify-content: center; + text-transform: uppercase; } .top-sites-list .top-site-outer .tile::before { content: attr(data-fallback); } .top-sites-list .top-site-outer.placeholder .tile { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .top-sites-list .top-site-outer.placeholder .screenshot { display: none; } .top-sites-list .top-site-outer .screenshot { + background-color: #FFF; + background-position: top left; + background-size: cover; + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + height: 100%; + left: 0; + opacity: 0; position: absolute; top: 0; - left: 0; - height: 100%; - width: 100%; - background-color: #FFF; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); - background-size: cover; - background-position: top left; transition: opacity 1s; - opacity: 0; } + width: 100%; } .top-sites-list .top-site-outer .screenshot.active { opacity: 1; } .top-sites-list .top-site-outer .top-site-icon { - position: absolute; - border-radius: 6px; - box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + background-color: #F9F9FA; background-position: center center; background-repeat: no-repeat; - background-color: #F9F9FA; } + border-radius: 6px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); + position: absolute; } .top-sites-list .top-site-outer .rich-icon { - top: 0; + background-size: 96px; + height: 100%; offset-inline-start: 0; - height: 100%; - width: 100%; - background-size: 96px; } + top: 0; + width: 100%; } .top-sites-list .top-site-outer .default-icon { + background-size: 32px; bottom: -6px; height: 42px; offset-inline-end: -6px; width: 42px; - background-size: 32px; + align-items: center; display: flex; - align-items: center; - justify-content: center; - font-size: 20px; } + font-size: 20px; + justify-content: center; } .top-sites-list .top-site-outer .default-icon[data-fallback]::before { content: attr(data-fallback); } .top-sites-list .top-site-outer .title { font: message-box; height: 30px; line-height: 30px; text-align: center; width: 96px; @@ -418,17 +421,17 @@ main { offset-inline-end: -12.5px; opacity: 0; overflow: hidden; top: -12.5px; transform: scale(0.25); transition-property: transform, opacity; transition-duration: 200ms; z-index: 1000; } - .top-sites-list .top-site-outer .edit-menu:focus, .top-sites-list .top-site-outer .edit-menu:active { + .top-sites-list .top-site-outer .edit-menu:-moz-any(:active, :focus) { transform: scale(1); opacity: 1; } .top-sites-list .top-site-outer .edit-menu button { border: 0; border-right: 1px solid #B1B1B3; background-color: #FFF; cursor: pointer; height: 100%; @@ -438,34 +441,31 @@ main { .top-sites-list .top-site-outer .edit-menu button:first-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:last-child:dir(rtl) { width: 30px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { width: 28px; } .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr) { border-right: 0; } .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) { border-right: 0; } - .top-sites-list .top-site-outer:hover .edit-menu, .top-sites-list .top-site-outer:focus .edit-menu, .top-sites-list .top-site-outer.active .edit-menu { - transform: scale(1); - opacity: 1; } .edit-topsites-wrapper .edit-topsites-button { border-right: 1px solid #D7D7DB; line-height: 13px; offset-inline-end: 24px; opacity: 0; padding: 0 10px; pointer-events: none; position: absolute; top: 2px; transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } .edit-topsites-wrapper .edit-topsites-button:dir(rtl) { border-left: 1px solid #D7D7DB; border-right: 0; } - .edit-topsites-wrapper .edit-topsites-button:focus, .edit-topsites-wrapper .edit-topsites-button:active { + .edit-topsites-wrapper .edit-topsites-button:-moz-any(:active, :focus) { opacity: 1; } .edit-topsites-wrapper .edit-topsites-button button { background: none; border: 0; color: #737373; cursor: pointer; font-size: 12px; padding: 0; } @@ -494,17 +494,17 @@ main { width: auto; } .edit-topsites-wrapper .show-more:dir(rtl), .edit-topsites-wrapper .show-less:dir(rtl) { background-position: right 10px center; } .edit-topsites-wrapper .show-more span, .edit-topsites-wrapper .show-less span { padding-inline-start: 3px; } -section.top-sites:not(.collapsed):hover .edit-topsites-button { +.top-sites:not(.collapsed):hover .edit-topsites-button { opacity: 1; pointer-events: auto; } .topsite-form .form-wrapper { margin: auto; max-width: 350px; padding: 15px 0; } .topsite-form .form-wrapper .field { @@ -559,69 +559,69 @@ section.top-sites:not(.collapsed):hover 0% { opacity: 0; transform: translateY(15px); } 100% { opacity: 1; transform: translateY(0); } } .sections-list .section-list { - margin: 0; display: grid; + grid-gap: 32px; grid-template-columns: repeat(auto-fit, 224px); - grid-gap: 32px; } + margin: 0; } @media (max-width: 544px) { .sections-list .section-list .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 544px) and (max-width: 800px) { .sections-list .section-list :nth-child(2n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } @media (min-width: 800px) and (max-width: 1248px) { .sections-list .section-list :nth-child(3n) .context-menu { + margin-inline-end: 5px; margin-inline-start: auto; - margin-inline-end: 5px; - offset-inline-start: auto; - offset-inline-end: 0; } } + offset-inline-end: 0; + offset-inline-start: auto; } } .sections-list .section-empty-state { - width: 100%; - height: 266px; + border: 1px solid #D7D7DB; + border-radius: 3px; display: flex; - border: 1px solid #D7D7DB; - border-radius: 3px; } + height: 266px; + width: 100%; } .sections-list .section-empty-state .empty-state { margin: auto; max-width: 350px; } .sections-list .section-empty-state .empty-state .empty-state-icon { - background-size: 50px 50px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 50px 50px; + -moz-context-properties: fill; + display: block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 50px; - width: 50px; margin: 0 auto; - display: block; } + width: 50px; } .sections-list .section-empty-state .empty-state .empty-state-message { - margin-bottom: 0; + color: #737373; font-size: 13px; - color: #737373; + margin-bottom: 0; text-align: center; } .topic { + color: #737373; font-size: 12px; - color: #737373; - margin-top: 12px; - line-height: 1.6; } + line-height: 1.6; + margin-top: 12px; } @media (min-width: 800px) { .topic { line-height: 16px; } } .topic ul { margin: 0; padding: 0; } @media (min-width: 800px) { .topic ul { @@ -651,110 +651,110 @@ section.top-sites:not(.collapsed):hover fill: #008EA4; height: 16px; margin-inline-start: 5px; vertical-align: top; width: 12px; } .topic .topic-read-more:dir(rtl)::after { transform: scaleX(-1); } .topic::after { - content: ""; - display: table; - clear: both; } + clear: both; + content: ''; + display: table; } .search-wrapper { cursor: default; display: flex; - position: relative; + height: 35px; margin: 1px 1px 40px; - width: 100%; - height: 35px; } + position: relative; + width: 100%; } .search-wrapper input { - border: none; + border: 0; border-radius: 3px; box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.15); color: inherit; + font-size: 15px; padding: 0; padding-inline-end: 36px; padding-inline-start: 35px; - width: 100%; - font-size: 15px; } + width: 100%; } .search-wrapper:hover input { box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.25); } .search-wrapper:active input, .search-wrapper input:focus { box-shadow: 0 0 0 1px #0A84FF; } .search-wrapper .search-label { background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; + height: 100%; + offset-inline-start: 0; position: absolute; - offset-inline-start: 0; - height: 100%; width: 35px; } .search-wrapper .search-button { background: url("chrome://browser/skin/forward.svg") no-repeat center center; - border-radius: 0 3px 3px 0; + background-size: 16px 16px; border: 0; - width: 36px; + border-radius: 0 3px 3px 0; + -moz-context-properties: fill; fill: rgba(12, 12, 13, 0.4); - -moz-context-properties: fill; - background-size: 16px 16px; height: 100%; offset-inline-end: 0; - position: absolute; } + position: absolute; + width: 36px; } .search-wrapper .search-button:focus, .search-wrapper .search-button:hover { background-color: rgba(12, 12, 13, 0.1); cursor: pointer; } .search-wrapper .search-button:active { background-color: rgba(12, 12, 13, 0.2); } .search-wrapper .search-button:dir(rtl) { transform: scaleX(-1); } .search-wrapper .contentSearchSuggestionTable { border: 0; transform: translateY(2px); } .context-menu { + background: #F9F9FA; + border-radius: 5px; + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); display: block; - position: absolute; font-size: 14px; - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2); - top: 6.75px; - offset-inline-start: 100%; margin-inline-start: 5px; - z-index: 10000; - background: #F9F9FA; - border-radius: 5px; } + offset-inline-start: 100%; + position: absolute; + top: 6.75px; + z-index: 10000; } .context-menu > ul { + list-style: none; margin: 0; - padding: 5px 0; - list-style: none; } + padding: 5px 0; } .context-menu > ul > li { margin: 0; width: 100%; } .context-menu > ul > li.separator { - margin: 5px 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.2); } + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + margin: 5px 0; } .context-menu > ul > li > a { - outline: none; - cursor: pointer; + align-items: center; color: inherit; - white-space: nowrap; - padding: 3px 12px; + cursor: pointer; + display: flex; line-height: 16px; - display: flex; - align-items: center; } - .context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus { + outline: none; + padding: 3px 12px; + white-space: nowrap; } + .context-menu > ul > li > a:-moz-any(:focus, :hover) { background: #0060DF; color: #FFF; } - .context-menu > ul > li > a:hover a, .context-menu > ul > li > a:focus a { + .context-menu > ul > li > a:-moz-any(:focus, :hover) a { color: #0C0C0D; } - .context-menu > ul > li > a:hover .icon, .context-menu > ul > li > a:focus .icon { + .context-menu > ul > li > a:-moz-any(:focus, :hover) .icon { fill: #FFF; } - .context-menu > ul > li > a:hover:hover, .context-menu > ul > li > a:hover:focus, .context-menu > ul > li > a:focus:hover, .context-menu > ul > li > a:focus:focus { + .context-menu > ul > li > a:-moz-any(:focus, :hover):-moz-any(:focus, :hover) { color: #FFF; } .prefs-pane { color: #4A4A4F; font-size: 14px; line-height: 21px; } .prefs-pane .sidebar { background: #FFF; @@ -854,79 +854,79 @@ section.top-sites:not(.collapsed):hover offset-inline-start: 0; position: absolute; top: 0; width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after, .prefs-pane [type='checkbox']:checked + label::after { background: url("chrome://global/skin/in-content/check.svg") no-repeat center center; content: ''; + -moz-context-properties: fill, stroke; + fill: #0060DF; height: 21px; offset-inline-start: 0; position: absolute; + stroke: none; top: 0; - width: 21px; - -moz-context-properties: fill, stroke; - fill: #0060DF; - stroke: none; } + width: 21px; } .prefs-pane [type='checkbox']:not(:checked) + label::after { opacity: 0; } .prefs-pane [type='checkbox']:checked + label::after { opacity: 1; } .prefs-pane [type='checkbox']:not(:disabled) + label:hover::before { border: 1px solid #0060DF; } .prefs-pane [type='checkbox']:not(:disabled):checked:focus + label::before, .prefs-pane [type='checkbox']:not(:disabled):not(:checked):focus + label::before { border: 1px dotted #0060DF; } .prefs-pane-button button { background-color: transparent; border: 0; cursor: pointer; fill: rgba(12, 12, 13, 0.6); + offset-inline-end: 15px; padding: 15px; position: fixed; - offset-inline-end: 15px; top: 15px; z-index: 12001; } .prefs-pane-button button:hover { background-color: #EDEDF0; } .prefs-pane-button button:active { background-color: #F9F9FA; } .confirmation-dialog .modal { - position: fixed; - width: 400px; - top: 20%; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.1); left: 50%; margin-left: -200px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.08); } + position: fixed; + top: 20%; + width: 400px; } .confirmation-dialog section { margin: 0; } .confirmation-dialog .modal-message { + display: flex; padding: 16px; - padding-bottom: 0; - display: flex; } + padding-bottom: 0; } .confirmation-dialog .modal-message p { margin: 0; margin-bottom: 16px; } .confirmation-dialog .actions { - padding: 0px 16px 0 16px; - border: none; + border: 0; + display: flex; flex-wrap: nowrap; - display: flex; } + padding: 0 16px; } .confirmation-dialog .actions button { margin-inline-end: 16px; width: 50%; } .confirmation-dialog .actions button.done { - margin-inline-start: 0; - margin-inline-end: 0; } + margin-inline-end: 0; + margin-inline-start: 0; } .confirmation-dialog .icon { margin-inline-end: 16px; } .modal-overlay { background: #EDEDF0; height: 100%; left: 0; @@ -940,142 +940,142 @@ section.top-sites:not(.collapsed):hover background: #FFF; border: 1px solid #D7D7DB; border-radius: 5px; font-size: 15px; z-index: 11002; } .card-outer { background: #FFF; + border-radius: 3px; display: inline-block; + height: 266px; margin-inline-end: 32px; - width: 224px; - border-radius: 3px; - height: 266px; - position: relative; } + position: relative; + width: 224px; } .card-outer .context-menu-button { - cursor: pointer; - position: absolute; - top: -13.5px; - offset-inline-end: -13.5px; - width: 27px; - height: 27px; + background-clip: padding-box; background-color: #FFF; background-image: url("chrome://browser/skin/page-action.svg"); background-position: 55%; - background-clip: padding-box; border: 1px solid #B1B1B3; border-radius: 100%; box-shadow: 0 2px rgba(12, 12, 13, 0.1); + cursor: pointer; fill: rgba(12, 12, 13, 0.8); + height: 27px; + offset-inline-end: -13.5px; + opacity: 0; + position: absolute; + top: -13.5px; transform: scale(0.25); - opacity: 0; + transition-duration: 200ms; transition-property: transform, opacity; - transition-duration: 200ms; } - .card-outer .context-menu-button:focus, .card-outer .context-menu-button:active { - transform: scale(1); - opacity: 1; } + width: 27px; } + .card-outer .context-menu-button:-moz-any(:active, :focus) { + opacity: 1; + transform: scale(1); } .card-outer.placeholder { background: transparent; } .card-outer.placeholder .card { box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); } .card-outer .card { - height: 100%; border-radius: 3px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); } + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); + height: 100%; } .card-outer > a { + color: inherit; display: block; - color: inherit; height: 100%; outline: none; position: absolute; width: 224px; } - .card-outer > a.active .card, .card-outer > a:focus .card { + .card-outer > a:-moz-any(.active, :focus) .card { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } - .card-outer > a.active .card-title, .card-outer > a:focus .card-title { + .card-outer > a:-moz-any(.active, :focus) .card-title { color: #0060DF; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) { - outline: none; box-shadow: 0 0 0 5px #D7D7DB; - transition: box-shadow 150ms; } + transition: box-shadow 150ms; + outline: none; } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .context-menu-button { - transform: scale(1); - opacity: 1; } + opacity: 1; + transform: scale(1); } .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .card-title { color: #0060DF; } .card-outer .card-preview-image-outer { background-color: #F9F9FA; - position: relative; + border-radius: 3px 3px 0 0; height: 122px; - border-radius: 3px 3px 0 0; - overflow: hidden; } + overflow: hidden; + position: relative; } .card-outer .card-preview-image-outer::after { border-bottom: 1px solid rgba(0, 0, 0, 0.05); bottom: 0; - content: " "; + content: ''; position: absolute; width: 100%; } .card-outer .card-preview-image-outer .card-preview-image { - width: 100%; - height: 100%; - background-size: cover; background-position: center; background-repeat: no-repeat; + background-size: cover; + height: 100%; opacity: 0; - transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); } + transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); + width: 100%; } .card-outer .card-preview-image-outer .card-preview-image.loaded { opacity: 1; } .card-outer .card-details { padding: 15px 16px 12px; } .card-outer .card-details.no-image { padding-top: 16px; } .card-outer .card-text { - overflow: hidden; - max-height: 78px; } + max-height: 78px; + overflow: hidden; } .card-outer .card-text.no-image { max-height: 192px; } .card-outer .card-text.no-host-name, .card-outer .card-text.no-context { max-height: 97px; } .card-outer .card-text.no-image.no-host-name, .card-outer .card-text.no-image.no-context { max-height: 211px; } .card-outer .card-text.no-host-name.no-context { max-height: 116px; } .card-outer .card-text.no-image.no-host-name.no-context { max-height: 230px; } .card-outer .card-text:not(.no-description) .card-title { max-height: 57px; overflow: hidden; } .card-outer .card-host-name { color: #737373; font-size: 10px; + overflow: hidden; padding-bottom: 4px; - text-transform: uppercase; - overflow: hidden; - text-overflow: ellipsis; } + text-overflow: ellipsis; + text-transform: uppercase; } .card-outer .card-title { + font-size: 14px; + line-height: 19px; margin: 0 0 2px; - font-size: 14px; - word-wrap: break-word; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-description { font-size: 12px; + line-height: 19px; margin: 0; - word-wrap: break-word; overflow: hidden; - line-height: 19px; } + word-wrap: break-word; } .card-outer .card-context { + bottom: 0; + color: #737373; + display: flex; + font-size: 11px; + left: 0; padding: 12px 16px 12px 14px; position: absolute; - bottom: 0; - left: 0; - right: 0; - color: #737373; - font-size: 11px; - display: flex; } + right: 0; } .card-outer .card-context-icon { fill: rgba(12, 12, 13, 0.6); margin-inline-end: 6px; } .card-outer .card-context-label { flex-grow: 1; line-height: 16px; overflow: hidden; text-overflow: ellipsis; @@ -1098,23 +1098,23 @@ section.top-sites:not(.collapsed):hover .manual-migration-container p { align-self: center; display: flex; justify-content: space-between; } } .manual-migration-container .icon { display: none; } @media (min-width: 544px) { .manual-migration-container .icon { + align-self: center; display: block; fill: rgba(12, 12, 13, 0.6); - margin-inline-end: 6px; - align-self: center; } } + margin-inline-end: 6px; } } .manual-migration-actions { - border: none; + border: 0; display: block; flex-wrap: nowrap; } @media (min-width: 544px) { .manual-migration-actions { display: flex; justify-content: space-between; padding: 0; } } .manual-migration-actions button { @@ -1126,102 +1126,102 @@ section.top-sites:not(.collapsed):hover .collapsible-section .section-title .click-target { cursor: pointer; vertical-align: top; white-space: nowrap; } .collapsible-section .section-title .icon-arrowhead-down, .collapsible-section .section-title .icon-arrowhead-forward { - margin-top: -1px; - margin-inline-start: 8px; } + margin-inline-start: 8px; + margin-top: -1px; } .collapsible-section .section-top-bar { position: relative; } .collapsible-section .section-top-bar .section-info-option { offset-inline-end: 0; position: absolute; top: 0; } .collapsible-section .section-top-bar .info-option-icon { background-image: url("../data/content/assets/glyph-info-option-12.svg"); - background-size: 12px 12px; + background-position: center; background-repeat: no-repeat; - background-position: center; + background-size: 12px 12px; + -moz-context-properties: fill; + display: inline-block; fill: rgba(12, 12, 13, 0.6); - -moz-context-properties: fill; height: 16px; - width: 16px; - display: inline-block; margin-bottom: -2px; opacity: 0; - transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:focus, .collapsible-section .section-top-bar .info-option-icon:active { + transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + width: 16px; } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] { + background-color: rgba(12, 12, 13, 0.1); + border-radius: 1px; + box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); + fill: rgba(12, 12, 13, 0.8); } + .collapsible-section .section-top-bar .info-option-icon[aria-expanded='true'] + .info-option { + opacity: 1; + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: visible; } + .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded='true']) + .info-option { + pointer-events: none; } + .collapsible-section .section-top-bar .info-option-icon:-moz-any(:active, :focus) { opacity: 1; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] { - background-color: rgba(12, 12, 13, 0.1); - border-radius: 1px; - box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1); - fill: rgba(12, 12, 13, 0.8); } .collapsible-section .section-top-bar .section-info-option .info-option { - visibility: hidden; opacity: 0; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } + transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); + visibility: hidden; } .collapsible-section .section-top-bar .section-info-option .info-option::after, .collapsible-section .section-top-bar .section-info-option .info-option::before { - content: ""; + content: ''; offset-inline-end: 0; position: absolute; } .collapsible-section .section-top-bar .section-info-option .info-option::before { background-image: url("chrome://global/skin/arrow/panelarrow-vertical-themed.svg"); background-position: right 6px bottom; background-repeat: no-repeat; background-size: 20px 10px; height: 32px; top: -32px; width: 43px; } .collapsible-section .section-top-bar .section-info-option .info-option:dir(rtl)::before { background-position-x: 6px; } .collapsible-section .section-top-bar .section-info-option .info-option::after { height: 10px; offset-inline-start: 0; top: -10px; } - .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option { - visibility: visible; - opacity: 1; - transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); } - .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded="true"]) + .info-option { - pointer-events: none; } .collapsible-section .section-top-bar .info-option { - z-index: 9999; - position: absolute; background: #FFF; border: 1px solid #D7D7DB; border-radius: 3px; + box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); font-size: 13px; line-height: 120%; margin-inline-end: -9px; offset-inline-end: 0; + padding: 24px; + position: absolute; top: 26px; + -moz-user-select: none; width: 320px; - padding: 24px; - box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); - -moz-user-select: none; } + z-index: 9999; } .collapsible-section .section-top-bar .info-option-header { font-size: 15px; font-weight: 600; } .collapsible-section .section-top-bar .info-option-body { margin: 0; margin-top: 12px; } .collapsible-section .section-top-bar .info-option-link { color: #0060DF; margin-left: 7px; } .collapsible-section .section-top-bar .info-option-manage { margin-top: 24px; } .collapsible-section .section-top-bar .info-option-manage button { - background: none; - border: none; + background: 0; + border: 0; color: #0060DF; cursor: pointer; margin: 0; padding: 0; } .collapsible-section .section-top-bar .info-option-manage button::after { background-image: url("../data/content/assets/topic-show-more-12.svg"); background-repeat: no-repeat; content: ''; @@ -1251,24 +1251,24 @@ section.top-sites:not(.collapsed):hover width: 340px; } } @media (min-width: 800px) { .collapsible-section .section-disclaimer .section-disclaimer-text { width: 610px; } } .collapsible-section .section-disclaimer a { color: #008EA4; padding-left: 3px; } .collapsible-section .section-disclaimer button { - margin-top: 2px; - offset-inline-end: 0; - min-height: 26px; - max-width: 130px; background: #F9F9FA; border: 1px solid #B1B1B3; border-radius: 4px; - cursor: pointer; } + cursor: pointer; + margin-top: 2px; + max-width: 130px; + min-height: 26px; + offset-inline-end: 0; } .collapsible-section .section-disclaimer button:hover:not(.dismiss) { box-shadow: 0 0 0 5px #D7D7DB; transition: box-shadow 150ms; } @media (min-width: 416px) { .collapsible-section .section-disclaimer button { position: absolute; } } .collapsible-section .section-body {
--- a/browser/extensions/activity-stream/data/content/activity-stream.bundle.js +++ b/browser/extensions/activity-stream/data/content/activity-stream.bundle.js @@ -89,17 +89,17 @@ const globalImportContext = typeof Windo // Create an object that avoids accidental differing key/value pairs: // { // INIT: "INIT", // UNINIT: "UNINIT" // } const actionTypes = {}; -for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "DISABLE_ONBOARDING", "INIT", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_DELETED", "PLACES_LINK_BLOCKED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_DATA", "SNIPPETS_RESET", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_EDIT", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) { +for (const type of ["BLOCK_URL", "BOOKMARK_URL", "DELETE_BOOKMARK_BY_ID", "DELETE_HISTORY_URL", "DELETE_HISTORY_URL_CONFIRM", "DIALOG_CANCEL", "DIALOG_OPEN", "DISABLE_ONBOARDING", "INIT", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_CHANGED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_DELETED", "PLACES_LINK_BLOCKED", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_FIREFOX_ACCOUNTS", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_ADD", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_EDIT", "TOP_SITES_PIN", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "UNINIT"]) { actionTypes[type] = type; } // Helper function for creating routed actions between content and main // Not intended to be used by consumers function _RouteMessage(action, options) { const meta = action.meta ? Object.assign({}, action.meta) : {}; if (!options || !options.from || !options.to) { @@ -305,37 +305,37 @@ module.exports = ReactIntl; /***/ (function(module, exports) { module.exports = ReactRedux; /***/ }), /* 4 */ /***/ (function(module, exports) { -var g; - -// This works in non-strict mode -g = (function() { - return this; -})(); - -try { - // This works if eval is allowed (see CSP) - g = g || Function("return this")() || (1,eval)("this"); -} catch(e) { - // This works if the window reference is available - if(typeof window === "object") - g = window; -} - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - -module.exports = g; +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1,eval)("this"); +} catch(e) { + // This works if the window reference is available + if(typeof window === "object") + g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; /***/ }), /* 5 */ /***/ (function(module, exports) { module.exports = { TOP_SITES_SOURCE: "TOP_SITES", @@ -2468,21 +2468,16 @@ class Search extends React.PureComponent // more details) const searchSource = IS_NEWTAB ? "newtab" : "homepage"; // gContentSearchController needs to exist as a global so that tests for // the existing about:home can find it; and so it allows these tests to pass. // In the future, when activity stream is default about:home, this can be renamed window.gContentSearchController = new ContentSearchUIController(input, input.parentNode, healthReportKey, searchSource); addEventListener("ContentSearchClient", this); - - // Focus the search box if we are on about:home - if (!IS_NEWTAB) { - input.focus(); - } } else { window.gContentSearchController = null; removeEventListener("ContentSearchClient", this); } } /* * Do not change the ID on the input field, as legacy newtab code @@ -3764,18 +3759,19 @@ class SnippetsMap extends Map { */ async blockSnippetById(id) { if (!id) { return; } let blockList = this.blockList; if (!blockList.includes(id)) { blockList.push(id); + this._dispatch(ac.SendToMain({ type: at.SNIPPETS_BLOCKLIST_UPDATED, data: blockList })); + await this.set("blockList", blockList); } - await this.set("blockList", blockList); } disableOnboarding() { this._dispatch(ac.SendToMain({ type: at.DISABLE_ONBOARDING })); } showFirefoxAccounts() { this._dispatch(ac.SendToMain({ type: at.SHOW_FIREFOX_ACCOUNTS })); @@ -3888,16 +3884,17 @@ class SnippetsMap extends Map { * remote location, or else default snippets if the remote * snippets cannot be retrieved. */ class SnippetsProvider { constructor(dispatch) { // Initialize the Snippets Map and attaches it to a global so that // the snippet payload can interact with it. global.gSnippetsMap = new SnippetsMap(dispatch); + this._onAction = this._onAction.bind(this); } get snippetsMap() { return global.gSnippetsMap; } async _refreshSnippets() { // Check if the cached version of of the snippets in snippetsMap. If it's too @@ -3953,43 +3950,56 @@ class SnippetsProvider { throw new Error("No remote snippets were found in gSnippetsMap."); } if (typeof payload !== "string") { throw new Error("Snippet payload was incorrectly formatted"); } // Note that injecting snippets can throw if they're invalid XML. + // eslint-disable-next-line no-unsanitized/property snippetsEl.innerHTML = payload; // Scripts injected by innerHTML are inactive, so we have to relocate them // through DOM manipulation to activate their contents. for (const scriptEl of snippetsEl.getElementsByTagName("script")) { const relocatedScript = document.createElement("script"); relocatedScript.text = scriptEl.text; scriptEl.parentNode.replaceChild(relocatedScript, scriptEl); } } + _onAction(msg) { + if (msg.data.type === at.SNIPPET_BLOCKED) { + this.snippetsMap.set("blockList", msg.data.data); + document.getElementById("snippets-container").style.display = "none"; + } + } + /** * init - Fetch the snippet payload and show snippets * * @param {obj} options * @param {str} options.appData.snippetsURL The URL from which we fetch snippets * @param {int} options.appData.version The current snippets version * @param {str} options.elementId The id of the element in which to inject snippets * @param {bool} options.connect Should gSnippetsMap connect to indexedDB? */ async init(options) { Object.assign(this, { appData: {}, elementId: "snippets", connect: true }, options); + // Add listener so we know when snippets are blocked on other pages + if (global.addMessageListener) { + global.addMessageListener("ActivityStream:MainToContent", this._onAction); + } + // TODO: Requires enabling indexedDB on newtab // Restore the snippets map from indexedDB if (this.connect) { try { await this.snippetsMap.connect(); } catch (e) { console.error(e); // eslint-disable-line no-console } @@ -4014,16 +4024,19 @@ class SnippetsProvider { this._forceOnboardingVisibility(true); this.initialized = true; } uninit() { window.dispatchEvent(new Event(SNIPPETS_DISABLED_EVENT)); this._forceOnboardingVisibility(false); + if (global.removeMessageListener) { + global.removeMessageListener("ActivityStream:MainToContent", this._onAction); + } this.initialized = false; } } /** * addSnippetsSubscriber - Creates a SnippetsProvider that Initializes * when the store has received the appropriate * Snippet data.
--- a/browser/extensions/activity-stream/install.rdf.in +++ b/browser/extensions/activity-stream/install.rdf.in @@ -3,17 +3,17 @@ #filter substitution <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>activity-stream@mozilla.org</em:id> <em:type>2</em:type> <em:bootstrap>true</em:bootstrap> <em:unpack>false</em:unpack> - <em:version>2017.11.16.1254-39442ee8</em:version> + <em:version>2017.12.02.0024-b0532674</em:version> <em:name>Activity Stream</em:name> <em:description>A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox.</em:description> <em:multiprocessCompatible>true</em:multiprocessCompatible> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>@MOZ_APP_VERSION@</em:minVersion>
--- a/browser/extensions/activity-stream/lib/ActivityStream.jsm +++ b/browser/extensions/activity-stream/lib/ActivityStream.jsm @@ -36,20 +36,16 @@ const DEFAULT_SITES = new Map([ ["FR", "https://www.youtube.com/,https://www.facebook.com/,https://www.wikipedia.org/,https://www.amazon.fr/,https://www.leboncoin.fr/,https://twitter.com/"] ]); const GEO_PREF = "browser.search.region"; const REASON_ADDON_UNINSTALL = 6; // Configure default Activity Stream prefs with a plain `value` or a `getValue` // that computes a value. A `value_local_dev` is used for development defaults. const PREFS_CONFIG = new Map([ - ["aboutHome.autoFocus", { - title: "Focus the about:home search box on load", - value: false - }], ["default.sites", { title: "Comma-separated list of default top sites to fill in behind visited sites", getValue: ({geo}) => DEFAULT_SITES.get(DEFAULT_SITES.has(geo) ? geo : "") }], ["feeds.section.topstories.options", { title: "Configuration options for top stories feed", // This is a dynamic pref as it depends on the feed being shown or not getValue: args => JSON.stringify({
--- a/browser/extensions/activity-stream/lib/NewTabInit.jsm +++ b/browser/extensions/activity-stream/lib/NewTabInit.jsm @@ -35,23 +35,16 @@ this.NewTabInit = class NewTabInit { case at.NEW_TAB_STATE_REQUEST: this.reply(action.meta.fromTarget); break; case at.NEW_TAB_INIT: // Initialize data for early tabs that might REQUEST twice if (action.data.simulated) { this._repliedEarlyTabs.set(action.data.portID, false); } - - if (action.data.url === "about:home") { - const prefs = this.store.getState().Prefs.values; - if (prefs["aboutHome.autoFocus"] && prefs.showSearch) { - action.data.browser.focus(); - } - } break; case at.NEW_TAB_UNLOAD: // Clean up for any tab (no-op if not an early tab) this._repliedEarlyTabs.delete(action.meta.fromTarget); break; } } };
--- a/browser/extensions/activity-stream/lib/SnippetsFeed.jsm +++ b/browser/extensions/activity-stream/lib/SnippetsFeed.jsm @@ -138,13 +138,16 @@ this.SnippetsFeed = class SnippetsFeed { this.init(); break; case at.UNINIT: this.uninit(); break; case at.SHOW_FIREFOX_ACCOUNTS: this.showFirefoxAccounts(action._target.browser); break; + case at.SNIPPETS_BLOCKLIST_UPDATED: + this.store.dispatch(ac.BroadcastToContent({type: at.SNIPPET_BLOCKED, data: action.data})); + break; } } }; this.EXPORTED_SYMBOLS = ["SnippetsFeed"];
--- a/browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-prerendered.html +++ b/browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-prerendered.html @@ -3,17 +3,17 @@ <head> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> </head> <body class="activity-stream"> - <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="123967595"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">Guetar na web</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="Guetar na web" title="Guetar na web" data-reactid="7"/><button id="searchSubmit" class="search-button" title="Guetar" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">Guetar</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">Sitios destacaos</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="Información" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">Top Sites</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">Access the websites you visit most.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">New Tab Preferences</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="Customize your Top Sites section" data-reactid="69"><span data-reactid="70">Edit</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Recommended by Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">Temes populares:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">Los destacaos</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> + <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-194534958"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">Guetar na web</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="Guetar na web" title="Guetar na web" data-reactid="7"/><button id="searchSubmit" class="search-button" title="Guetar" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">Guetar</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">Más visitaos</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="Información" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">Más visitaos</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">Acceder a les webs que más visites.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">Preferencies de Llingüeta nueva</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="Personalizar la seición de Más visitaos" data-reactid="69"><span data-reactid="70">Editar</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Recomendáu por Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">Temes populares:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">Destacaos</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> <div id="snippets-container"> <div id="snippets"></div> </div> <script> // Don't directly load the following scripts as part of html to let the page // finish loading to render the content sooner. for (const src of [ "resource://activity-stream/prerendered/static/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ast/activity-stream-strings.js @@ -1,18 +1,18 @@ // Note - this is a generated file. window.gActivityStreamStrings = { "newtab_page_title": "Llingüeta nueva", "default_label_loading": "Cargando…", - "header_top_sites": "Sitios destacaos", + "header_top_sites": "Más visitaos", "header_stories": "Histories destacaes", - "header_highlights": "Los destacaos", + "header_highlights": "Destacaos", "header_visit_again": "Visitar de nueves", "header_bookmarks": "Marcadores recientes", - "header_recommended_by": "Recommended by {provider}", + "header_recommended_by": "Recomendáu por {provider}", "header_bookmarks_placeholder": "Entá nun tienes dengún marcador.", "header_stories_from": "de", "type_label_visited": "Visitóse", "type_label_bookmarked": "Amestóse a marcadores", "type_label_synced": "Sincronizóse dende otru preséu", "type_label_recommended": "Tendencia", "type_label_open": "Abrir", "type_label_topic": "Tema", @@ -34,65 +34,65 @@ window.gActivityStreamStrings = { "search_button": "Guetar", "search_header": "Gueta en {search_engine_name}", "search_web_placeholder": "Guetar na web", "search_settings": "Camudar axustes de gueta", "section_info_option": "Información", "section_info_send_feedback": "Unviar comentarios", "section_info_privacy_notice": "Nota de privacidá", "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories_linktext": "Deprendi cómo furrula.", + "section_disclaimer_topstories_buttontext": "Val, píllolo", "welcome_title": "Afáyate na llingüeta nueva", "welcome_body": "Firefox usará esti espaciu p'amosate los marcadores, artículos, vídeos y páxines más relevantes que visitares apocayá, asina pues volver a ellos de mou cenciellu.", - "welcome_label": "Identifying your Highlights", + "welcome_label": "Identificando los tos destacaos", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}d", - "settings_pane_button_label": "Customize your New Tab page", - "settings_pane_header": "New Tab Preferences", - "settings_pane_body2": "Choose what you see on this page.", + "settings_pane_button_label": "Personalizar páxina Llingüeta nueva", + "settings_pane_header": "Preferencies de Llingüeta nueva", + "settings_pane_body2": "Escueyi qué quies ver nesta páxina", "settings_pane_search_header": "Search", - "settings_pane_search_body": "Search the Web from your new tab.", - "settings_pane_topsites_header": "Top Sites", - "settings_pane_topsites_body": "Access the websites you visit most.", - "settings_pane_topsites_options_showmore": "Show two rows", - "settings_pane_bookmarks_header": "Recent Bookmarks", - "settings_pane_bookmarks_body": "Your newly created bookmarks in one handy location.", - "settings_pane_visit_again_header": "Visit Again", - "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.", - "settings_pane_highlights_header": "Highlights", - "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", - "settings_pane_highlights_options_bookmarks": "Bookmarks", - "settings_pane_highlights_options_visited": "Visited Sites", - "settings_pane_snippets_header": "Snippets", - "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", + "settings_pane_search_body": "Restolar na Web dende la nueva llingüeta", + "settings_pane_topsites_header": "Más visitaos", + "settings_pane_topsites_body": "Acceder a les webs que más visites.", + "settings_pane_topsites_options_showmore": "Amosar dos fileres", + "settings_pane_bookmarks_header": "Marcadores recientes", + "settings_pane_bookmarks_body": "Los marcadores recién fechos, nun llugar accesible.", + "settings_pane_visit_again_header": "Visitar de nueves", + "settings_pane_visit_again_body": "Firefox va amosate partes del to historial de navegación que a lo meyor prestaríate remembrar o volver visitar.", + "settings_pane_highlights_header": "Destacaos", + "settings_pane_highlights_body2": "Atopa otra vegada les coses interesantes que yá visitaras o marcaras.", + "settings_pane_highlights_options_bookmarks": "Marcadores", + "settings_pane_highlights_options_visited": "Sitios visitaos", + "settings_pane_snippets_header": "Retayos", + "settings_pane_snippets_body": "Llei anovamientos curtios de Mozilla tocante a Firefox, la cultura d'internet y un meme de xemes en cuandu.", "settings_pane_done_button": "Fecho", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", - "edit_topsites_button_text": "Edit", - "edit_topsites_button_label": "Customize your Top Sites section", + "settings_pane_topstories_options_sponsored": "Amosar hestories patrocinaes", + "edit_topsites_button_text": "Editar", + "edit_topsites_button_label": "Personalizar la seición de Más visitaos", "edit_topsites_showmore_button": "Amosar más", - "edit_topsites_showless_button": "Show Fewer", + "edit_topsites_showless_button": "Amosar menos", "edit_topsites_done_button": "Fecho", - "edit_topsites_pin_button": "Pin this site", - "edit_topsites_unpin_button": "Unpin this site", - "edit_topsites_edit_button": "Edit this site", - "edit_topsites_dismiss_button": "Dismiss this site", - "edit_topsites_add_button": "Add", - "topsites_form_add_header": "New Top Site", - "topsites_form_edit_header": "Edit Top Site", - "topsites_form_title_placeholder": "Enter a title", - "topsites_form_url_placeholder": "Type or paste a URL", + "edit_topsites_pin_button": "Fixar esti sitiu", + "edit_topsites_unpin_button": "Desfixar esti sitiu", + "edit_topsites_edit_button": "Editar esti sitiu", + "edit_topsites_dismiss_button": "Escartar esti sitiu", + "edit_topsites_add_button": "Amestar", + "topsites_form_add_header": "Nuevu Sitiu más visitáu", + "topsites_form_edit_header": "Editar Sitiu más visitáu", + "topsites_form_title_placeholder": "Introducir títulu", + "topsites_form_url_placeholder": "Escribi o apega una URL", "topsites_form_add_button": "Amestar", "topsites_form_save_button": "Guardar", "topsites_form_cancel_button": "Encaboxar", - "topsites_form_url_validation": "Valid URL required", + "topsites_form_url_validation": "Ríquese una URL válida", "pocket_read_more": "Temes populares:", "pocket_read_even_more": "Ver más histories", "pocket_feedback_header": "The best of the web, curated by over 25 million people.", "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", - "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.", - "manual_migration_cancel_button": "No Thanks", - "manual_migration_import_button": "Import Now" + "manual_migration_explanation2": "Prueba Firefox colos marcadores, hestorial y contraseñes d'otru restolador.", + "manual_migration_cancel_button": "Non, gracies", + "manual_migration_import_button": "Importar agora" };
--- a/browser/extensions/activity-stream/prerendered/locales/be/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/be/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Шукаць {search_term} у:", "search_button": "Шукаць", "search_header": "Шукаць у {search_engine_name}", "search_web_placeholder": "Пошук у Інтэрнэце", "search_settings": "Змяніць налады пошуку", "section_info_option": "Звесткі", "section_info_send_feedback": "Даслаць водгук", "section_info_privacy_notice": "Паведамленне аб прыватнасці", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Самыя цікавыя гісторыі з інтэрнэту на аснове таго, што вы чытаеце. Падборка ад Pocket, які цяпер частка Mozilla.", + "section_disclaimer_topstories_linktext": "Даведайцеся, як гэта працуе.", + "section_disclaimer_topstories_buttontext": "Зразумела", "welcome_title": "Калі ласка ў новую картку", "welcome_body": "Firefox будзе выкарыстоўваць гэта месца, каб адлюстроўваць самыя актуальныя закладкі, артыкулы, відэа і старонкі, якія вы нядаўна наведалі, каб вы змаглі лёгка трапіць на іх зноў.", "welcome_label": "Вызначэнне вашага выбранага", "time_label_less_than_minute": "<1 хв", "time_label_minute": "{number} хв", "time_label_hour": "{number} г", "time_label_day": "{number} д", "settings_pane_button_label": "Наладзіць вашу старонку новай карткі", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox пакажа вам элементы гісторыі прагляду, якія вы, магчыма, захочаце запомніць або наведаць зноў.", "settings_pane_highlights_header": "Выбранае", "settings_pane_highlights_body2": "Знайдзіце зваротны шлях да цікавых рэчаў, якія вы нядаўна наведалі або дадалі ў закладкі.", "settings_pane_highlights_options_bookmarks": "Закладкі", "settings_pane_highlights_options_visited": "Наведаныя сайты", "settings_pane_snippets_header": "Урыўкі", "settings_pane_snippets_body": "Чытайце кароткія і радасныя навіны ад Mozilla аб Firefox, інтэрнэт-культуру і выпадковыя мемы.", "settings_pane_done_button": "Гатова", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Паказаць артыкулы ад спонсараў", "edit_topsites_button_text": "Правіць", "edit_topsites_button_label": "Наладзіць раздзел папулярных сайтаў", "edit_topsites_showmore_button": "Паказаць больш", "edit_topsites_showless_button": "Паказаць менш", "edit_topsites_done_button": "Гатова", "edit_topsites_pin_button": "Замацаваць гэты сайт", "edit_topsites_unpin_button": "Адшпіліць гэты сайт", "edit_topsites_edit_button": "Рэдагаваць гэты сайт",
--- a/browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/bn-BD/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "{search_term} এর জন্য খুঁজুন সাথে:", "search_button": "অনুসন্ধান", "search_header": "{search_engine_name} খুঁজুন", "search_web_placeholder": "ওয়েবে সন্ধান করুন", "search_settings": "সার্চ সেটিংস বদল করুন", "section_info_option": "তথ্য", "section_info_send_feedback": "মতামত পাঠান", "section_info_privacy_notice": "গোপনীয়তা বিজ্ঞপ্তি", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "মজার মজার সব গল্প নির্বাচিত হয়েছে, আপনি যেমনটা পড়েন। Pocket এখন থেকে Mozilla এর অংশ।", + "section_disclaimer_topstories_linktext": "কিভাবে কাজ করে জানুন।", + "section_disclaimer_topstories_buttontext": "ঠিক আছে, বুঝেছি", "welcome_title": "নতুন ট্যাবে আপনাকে স্বাগতম", "welcome_body": "আপনার সাথে মিলে এমন বুর্কমার্ক, নিবন্ধ, ভিডিও এবং পাতা যেগুলো আপনি সম্প্রতি ভ্রমণ করেছে তা Firefox এই জায়গায় দেখাবে, যাতে আপনি সেগুলো দ্রুত খুঁজে পান।", "welcome_label": "আপনার হাইলাইট সমূহ চিহ্নিত করুন", "time_label_less_than_minute": "<1মিনিট", "time_label_minute": "{number} মিনিট", "time_label_hour": "{number} ঘন্টা", "time_label_day": "{number} দিন", "settings_pane_button_label": "আপনার নতুন ট্যাব পেজটি কাস্টমাইজ করুন", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox আপনার ব্রাউজিং ইতিহাসের এমন একটি অংশ দেখাবে যা আপনি মনে রাখতে চান বা যাতে আবার ফিরে যেতে চান।", "settings_pane_highlights_header": "হাইলাইটস", "settings_pane_highlights_body2": "আপনি সম্প্রতি পরিদর্শন করেছেন বা বুকমার্ক করেছেন এমন আকর্ষণীয় বিষয়গুলিতে ফিরে যাবার পথ পান।", "settings_pane_highlights_options_bookmarks": "বুকমার্ক", "settings_pane_highlights_options_visited": "পূর্বে পরিদর্শন করা সাইটগুলি", "settings_pane_snippets_header": "টুকিটাকি", "settings_pane_snippets_body": "Mozilla থেকে Firefox, ইন্টারনেট সংস্কৃতি, এবং মাঝে মাঝে উদ্দেশ্যহীন মেমে সম্পর্কে ছোট এবং মিষ্টি আপডেটগুলি পড়ুন।", "settings_pane_done_button": "হয়েছে", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "বিজ্ঞাপনী গল্প দেখাও", "edit_topsites_button_text": "সম্পাদনা", "edit_topsites_button_label": "আপনার টপ সাইট সেকশন কাস্টমাইজ করুন", "edit_topsites_showmore_button": "আরও দেখান", "edit_topsites_showless_button": "কম দেখান", "edit_topsites_done_button": "হয়েছে", "edit_topsites_pin_button": "সাইটটি পিন করুন", "edit_topsites_unpin_button": "এই সাইট আনপিন করুন", "edit_topsites_edit_button": "সাইটটি সম্পাদনা করুন",
--- a/browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/bn-IN/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "{search_term} এর জন্য খুঁজুন সাথে:", "search_button": "অনুসন্ধান", "search_header": "{search_engine_name} এ অনুসন্ধান করুন", "search_web_placeholder": "ওয়েবে সন্ধান করুন", "search_settings": "সার্চ সেটিংস বদল করুন", "section_info_option": "তথ্য", "section_info_send_feedback": "মতামত পাঠান", "section_info_privacy_notice": "গোপনীয়তা বিজ্ঞপ্তি", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "মজার মজার সব গল্প নির্বাচিত হয়েছে, আপনি যেমনটা পড়েন। Pocket এখন থেকে Mozilla এর অংশ।", + "section_disclaimer_topstories_linktext": "কিভাবে কাজ করে জানুন।", + "section_disclaimer_topstories_buttontext": "ঠিক আছে, বুঝেছি", "welcome_title": "নতুন ট্যাবে স্বাগতম", "welcome_body": "আপনার সাথে মিলে এমন বুর্কমার্ক, নিবন্ধ, ভিডিও এবং পাতা যেগুলো আপনি সম্প্রতি ভ্রমণ করেছে তা Firefox এই জায়গায় দেখাবে, যাতে আপনি সেগুলো দ্রুত খুঁজে পান।", "welcome_label": "আপনার হাইলাইট সমূহ চিহ্নিত করা হচ্ছে", "time_label_less_than_minute": "<1মিনিট", "time_label_minute": "{number} মিনিট", "time_label_hour": "{number} ঘন্টা", "time_label_day": "{number} দিন", "settings_pane_button_label": "আপনার নতুন ট্যাব পেজটি কাস্টমাইজ করুন", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox আপনার ব্রাউজিং ইতিহাসের এমন একটি অংশ দেখাবে যা আপনি মনে রাখতে চান বা যাতে আবার ফিরে যেতে চান।", "settings_pane_highlights_header": "হাইলাইটস", "settings_pane_highlights_body2": "আপনি সম্প্রতি পরিদর্শন করেছেন বা বুকমার্ক করেছেন এমন আকর্ষণীয় বিষয়গুলিতে ফিরে যাবার পথ পান।", "settings_pane_highlights_options_bookmarks": "বুকমার্ক", "settings_pane_highlights_options_visited": "পূর্বে পরিদর্শন করা সাইটগুলি", "settings_pane_snippets_header": "টুকিটাকি", "settings_pane_snippets_body": "Mozilla থেকে Firefox, ইন্টারনেট সংস্কৃতি, এবং মাঝে মাঝে উদ্দেশ্যহীন মেমে সম্পর্কে ছোট এবং মিষ্টি আপডেটগুলি পড়ুন।", "settings_pane_done_button": "হয়েছে", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "বিজ্ঞাপনী গল্প দেখাও", "edit_topsites_button_text": "সম্পাদনা", "edit_topsites_button_label": "আপনার শীর্ষ সাইট সেকশন কাস্টমাইজ করুন", "edit_topsites_showmore_button": "আরও দেখান", "edit_topsites_showless_button": "কম দেখান", "edit_topsites_done_button": "হয়েছে", "edit_topsites_pin_button": "সাইটটি পিন করুন", "edit_topsites_unpin_button": "এই সাইট আনপিন করুন", "edit_topsites_edit_button": "সাইটটি সম্পাদনা করুন",
--- a/browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/es-AR/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Buscar {search_term} con:", "search_button": "Buscar", "search_header": "Buscar con {search_engine_name}", "search_web_placeholder": "Buscar en la web", "search_settings": "Cambiar opciones de búsqueda", "section_info_option": "Información", "section_info_send_feedback": "Enviar opinión", "section_info_privacy_notice": "Nota de privacidad", - "section_disclaimer_topstories": "Las más interesantes historias en la web, seleccionadas basándonos en los que lees. Desde Pocket, ahora parte de Mozilla.", - "section_disclaimer_topstories_linktext": "Saber como trabaja.", - "section_disclaimer_topstories_buttontext": "Está bien, lo entiendo", + "section_disclaimer_topstories": "Las historias más interesantes en la web, seleccionadas en base a lo que lees. Gracias a Pocket, ahora parte de Mozilla.", + "section_disclaimer_topstories_linktext": "Aprendé cómo funciona.", + "section_disclaimer_topstories_buttontext": "Listo, lo entendí", "welcome_title": "Bienvenido a una nueva pestaña", "welcome_body": "Firefox usará este espacio para mostrar sus marcadores, artículos, videos y páginas más relevantes que se hayan visitado para poder volver más fácilmente.", "welcome_label": "Identificar los destacados", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}d", "settings_pane_button_label": "Personalizar la página nueva pestaña",
--- a/browser/extensions/activity-stream/prerendered/locales/et/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/et/activity-stream-strings.js @@ -34,18 +34,18 @@ window.gActivityStreamStrings = { "search_button": "Otsi", "search_header": "{search_engine_name}", "search_web_placeholder": "Otsi veebist", "search_settings": "Muuda otsingu sätteid", "section_info_option": "Teave", "section_info_send_feedback": "Saada tagasisidet", "section_info_privacy_notice": "Privaatsusreeglid", "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories_linktext": "Vaata, kuidas see töötab.", + "section_disclaimer_topstories_buttontext": "Olgu, sain aru", "welcome_title": "Tere tulemast uuele kaardile", "welcome_body": "Firefox kasutab seda lehte, et kuvada sulle kõige olulisemaid järjehoidjaid, artikleid, videoid ja lehti, mida oled hiljuti külastanud, nii et pääseksid kergelt nende juurde tagasi.", "welcome_label": "Esiletõstetava sisu tuvastamine", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}t", "time_label_day": "{number}p", "settings_pane_button_label": "Kohanda uue kaardi lehte",
--- a/browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/fi/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Hae {search_term} palvelusta:", "search_button": "Haku", "search_header": "{search_engine_name}-haku", "search_web_placeholder": "Verkkohaku", "search_settings": "Muuta hakuasetuksia", "section_info_option": "Tietoa", "section_info_send_feedback": "Anna palautetta", "section_info_privacy_notice": "Tietosuojakäytäntö", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Verkon kiinnostavimmat jutut, lukemasi perusteella valittuna. Pocketilta, joka on nyt osa Mozillaa.", + "section_disclaimer_topstories_linktext": "Lue, miten tämä toimii.", + "section_disclaimer_topstories_buttontext": "Selvä", "welcome_title": "Tervetuloa uuteen välilehteen", "welcome_body": "Firefox käyttää tätä tilaa näyttämään olennaisimmat kirjanmerkit, artikkelit, videot ja sivut, joita olet katsellut, jotta pääset niihin takaisin nopeasti.", "welcome_label": "Tunnistetaan nostojasi", "time_label_less_than_minute": "<1 min", "time_label_minute": "{number} min", "time_label_hour": "{number} h", "time_label_day": "{number} pv", "settings_pane_button_label": "Muokkaa Uusi välilehti -sivua", @@ -59,20 +59,20 @@ window.gActivityStreamStrings = { "settings_pane_bookmarks_header": "Uusimmat kirjanmerkit", "settings_pane_bookmarks_body": "Uusimmat kirjanmerkkisi, yhdessä kätevässä paikassa.", "settings_pane_visit_again_header": "Käy toistekin", "settings_pane_visit_again_body": "Firefox näyttää selaushistoriastasi palasia, jotka saatat haluta muistaa tai joissa haluat ehkä käydä.", "settings_pane_highlights_header": "Nostot", "settings_pane_highlights_body2": "Löydä tiesi takaisin kiinnostaviin juttuihin, joissa olet käynyt tai jotka olet lisännyt kirjanmerkkeihin viime aikoina.", "settings_pane_highlights_options_bookmarks": "Kirjanmerkit", "settings_pane_highlights_options_visited": "Vieraillut sivustot", - "settings_pane_snippets_header": "Snippets", - "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", + "settings_pane_snippets_header": "Tiedonmuruset", + "settings_pane_snippets_body": "Lue Mozillan lyhyitä päivityksiä liittyen Firefoxiin, internetkulttuuriin ja satunnaisiin meemeihin.", "settings_pane_done_button": "Valmis", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Näytä sponsoroidut jutut", "edit_topsites_button_text": "Muokkaa", "edit_topsites_button_label": "Muokkaa Ykkössivustot-osiota", "edit_topsites_showmore_button": "Näytä enemmän", "edit_topsites_showless_button": "Näytä vähemmän", "edit_topsites_done_button": "Valmis", "edit_topsites_pin_button": "Kiinnitä tämä sivusto", "edit_topsites_unpin_button": "Poista tämän sivuston kiinnitys", "edit_topsites_edit_button": "Muokkaa tätä sivustoa", @@ -84,15 +84,15 @@ window.gActivityStreamStrings = { "topsites_form_url_placeholder": "Kirjoita tai liitä osoite", "topsites_form_add_button": "Lisää", "topsites_form_save_button": "Tallenna", "topsites_form_cancel_button": "Peruuta", "topsites_form_url_validation": "Kelvollinen osoite vaaditaan", "pocket_read_more": "Suositut aiheet:", "pocket_read_even_more": "Katso lisää juttuja", "pocket_feedback_header": "Netin parhaat palat, valikoitu yli 25 miljoonan ihmisen voimin.", - "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", - "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", + "pocket_description": "Löydä laadukasta sisältöä, josta olisit muutoin ehkä jäänyt paitsi. Pocketilta, joka on nyt osa Mozillaa.", + "highlights_empty_state": "Ala selata, niin tässä alkaa näkyä hyviä juttuja, videoita ja muita sivuja, joilla olet käynyt hiljattain tai jotka olet lisännyt kirjanmerkkeihin.", "topstories_empty_state": "Ei enempää suosituksia juuri nyt. Katso myöhemmin uudestaan lisää ykkösjuttuja lähteestä {provider}. Etkö malta odottaa? Valitse suosittu aihe ja löydä lisää hyviä juttuja ympäri verkkoa.", - "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.", + "manual_migration_explanation2": "Kokeile Firefoxia toisesta selaimesta tuotujen kirjanmerkkien, historian ja salasanojen kanssa.", "manual_migration_cancel_button": "Ei kiitos", "manual_migration_import_button": "Tuo nyt" };
--- a/browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/fy-NL/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Sykje nei {search_term} mei:", "search_button": "Sykje", "search_header": "{search_engine_name} trochsykje", "search_web_placeholder": "Sykje op it web", "search_settings": "Sykynstellingen wizigje", "section_info_option": "Ynfo", "section_info_send_feedback": "Kommentaar ferstjoere", "section_info_privacy_notice": "Privacyferklearring", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "De meast ynteressante ferhalen op it web, selektearre op basis fan wat jo lêzen hawwe. Fan Pocket, no ûnderdiel fan Mozilla.", + "section_disclaimer_topstories_linktext": "Lês hoe't it wurket.", + "section_disclaimer_topstories_buttontext": "Oké, begrepen", "welcome_title": "Wolkom by it nije ljepblêd", "welcome_body": "Firefox brûkt dizze romte om jo meast relevante blêdwizers, artikelen, fideo’s en siden dy't jo koartlyn besocht hawwe wer te jaan, sadat jo dizze ienfâldichwei weromfine kinne.", "welcome_label": "Jo hichtepunten oantsjutte", "time_label_less_than_minute": "< 1 m", "time_label_minute": "{number} m", "time_label_hour": "{number} o", "time_label_day": "{number} d", "settings_pane_button_label": "Jo side foar nije ljepblêden oanpasse", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox sil jo ûnderdielen fan jo sneupskiednis toane dy't jo miskien ûnthâlde of nei werom gean wolle.", "settings_pane_highlights_header": "Hichtepunten", "settings_pane_highlights_body2": "Fyn fluch ynteressante saken werom út jo blêdwizers en resint besocht siden.", "settings_pane_highlights_options_bookmarks": "Blêdwizers", "settings_pane_highlights_options_visited": "Besochte websites", "settings_pane_snippets_header": "Koarte ynformaasje", "settings_pane_snippets_body": "Lês koart nijs fan Mozilla oer Firefox, ynternetkultuer en somtiden in meme.", "settings_pane_done_button": "Dien", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Sponsore ferhalen toane", "edit_topsites_button_text": "Bewurkje", "edit_topsites_button_label": "Jo seksje Topwebsites oanpasse", "edit_topsites_showmore_button": "Mear toane", "edit_topsites_showless_button": "Minder toane", "edit_topsites_done_button": "Dien", "edit_topsites_pin_button": "Dizze side fêstsette", "edit_topsites_unpin_button": "Dizze webstee loskeppelje", "edit_topsites_edit_button": "Dizze side bewurkje",
--- a/browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/gu-IN/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "શોધ કરો {search_term} ની સાથે:", "search_button": "શોધો", "search_header": "{search_engine_name} શોધ કરો", "search_web_placeholder": "વેબ પર શોધો", "search_settings": "શોધ ના સેટિંગ્સ બદલો", "section_info_option": "માહિતી", "section_info_send_feedback": "પ્રતિસાદ મોકલ", "section_info_privacy_notice": "ગોપનીયતા સૂચના", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "વેબ પરની સૌથી રસપ્રદ વાર્તાઓ, તમે જે વાંચો છો તેના આધારે પસંદ કરેલ છે. Pocket થી, હવે Mozilla નો ભાગ.", + "section_disclaimer_topstories_linktext": "તે કેવી રીતે કાર્ય કરે છે તે જાણો.", + "section_disclaimer_topstories_buttontext": "ઠીક છે, સમજાઇ ગયું", "welcome_title": "નવી વિન્ડોમાં આપનું સ્વાગત છે", "welcome_body": "ફાયરફોક્સ, તમારા સૌથી સંબંધિત બુકમાર્ક્સ, લેખો, વિડિઓઝ, અને પૃષ્ઠો જે તમે તાજેતરમાં મુલાકાત લીધી એ બતાવવા માટે આ જગ્યાનો ઉપયોગ કરશે જેથી તમે પાછા તેમને સરળતાથી મેળવી શકો છો.", "welcome_label": "તમારા હાઇલાઇટ્સ ઓળખવા", "time_label_less_than_minute": "<1મિનિટ", "time_label_minute": "{number}મિનિટ", "time_label_hour": "{number}કલાક", "time_label_day": "{number}દિવસ", "settings_pane_button_label": "તમારા નવા ટૅબ પૃષ્ઠને કસ્ટમાઇઝ કરો", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "ફાયરફોક્સ તમને તમારા બ્રાઉઝિંગ હિસ્ટરીનાં ભાગો બતાવશે જે તમે યાદ રાખવા અથવા પાછા આવવા ઇચ્છતા હોવ.", "settings_pane_highlights_header": "વીતી ગયેલું", "settings_pane_highlights_body2": "તમે તાજેતરમાં મુલાકાત લીધેલા અથવા બુકમાર્ક કરેલી રસપ્રદ વસ્તુઓ પર તમારી રીત શોધો.", "settings_pane_highlights_options_bookmarks": "બુકમાર્ક્સ", "settings_pane_highlights_options_visited": "મુલાકાત લીધેલ સાઇટ્સ", "settings_pane_snippets_header": "જાણકારી આપનારા ઉતારા ક કાપલીઓ", "settings_pane_snippets_body": "ટૂંકી અને મીઠી સુધારાઓ વાંચો મોઝિલ્લાથી ફાયરફોક્સ વિશે, ઇન્ટરનેટ સંસ્કૃતિ અને પ્રસંગોપાત ફાવે તેમ મેમે વિશે.", "settings_pane_done_button": "પૂરું", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "પ્રાયોજિત વાર્તાઓ બતાવો", "edit_topsites_button_text": "ફેરફાર કરો", "edit_topsites_button_label": "તમારા ટોચના સાઇટ્સ વિભાગને કસ્ટમાઇઝ કરો", "edit_topsites_showmore_button": "વધારે બતાવો", "edit_topsites_showless_button": "થોડું બતાવો", "edit_topsites_done_button": "પૂરું", "edit_topsites_pin_button": "આ સાઇટને પિન કરો", "edit_topsites_unpin_button": "આ સાઇટ અનપિન કરો", "edit_topsites_edit_button": "આ સાઇટને સંપાદિત કરો",
--- a/browser/extensions/activity-stream/prerendered/locales/it/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/it/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Cerca {search_term} con:", "search_button": "Cerca", "search_header": "Ricerca {search_engine_name}", "search_web_placeholder": "Cerca sul Web", "search_settings": "Cambia impostazioni di ricerca", "section_info_option": "Info", "section_info_send_feedback": "Invia feedback", "section_info_privacy_notice": "Informativa sulla privacy", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Le storie più interessanti del Web, selezionate in base alle tue letture. Direttamente da Pocket, ora parte del gruppo Mozilla.", + "section_disclaimer_topstories_linktext": "Scopri come funziona.", + "section_disclaimer_topstories_buttontext": "Ho capito.", "welcome_title": "Benvenuto nella nuova scheda", "welcome_body": "Firefox utilizzerà questo spazio per visualizzare gli elementi più significativi, come segnalibri, articoli, video e pagine visitate di recente, in modo che siano sempre facili da raggiungere.", "welcome_label": "Identificazione elementi in evidenza…", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}g", "settings_pane_button_label": "Personalizza la pagina Nuova scheda", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox mostrerà alcuni elementi, estratti dalla cronologia di navigazione, che potresti voler visitare di nuovo.", "settings_pane_highlights_header": "In evidenza", "settings_pane_highlights_body2": "Ritrova pagine interessanti che avevi visitato o aggiunto ai segnalibri.", "settings_pane_highlights_options_bookmarks": "Segnalibri", "settings_pane_highlights_options_visited": "Siti visitati", "settings_pane_snippets_header": "Snippet", "settings_pane_snippets_body": "Brevi notizie direttamente da Mozilla a proposito di Firefox, Internet, senza dimenticare qualche meme di tanto in tanto.", "settings_pane_done_button": "Fatto", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Visualizza articoli sponsorizzati", "edit_topsites_button_text": "Modifica", "edit_topsites_button_label": "Personalizza la sezione Siti principali", "edit_topsites_showmore_button": "Visualizza altri", "edit_topsites_showless_button": "Nascondi altri", "edit_topsites_done_button": "Fatto", "edit_topsites_pin_button": "Aggiungi sito alla bacheca", "edit_topsites_unpin_button": "Rimuovi sito dalla bacheca", "edit_topsites_edit_button": "Modifica questo sito",
--- a/browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ka/activity-stream-strings.js @@ -3,32 +3,32 @@ window.gActivityStreamStrings = { "newtab_page_title": "ახალი ჩანართი", "default_label_loading": "იტვირთება…", "header_top_sites": "რჩეული საიტები", "header_stories": "რჩეული სტატიები", "header_highlights": "მნიშვნელოვანი საიტები", "header_visit_again": "ხელახლა ნახვა", "header_bookmarks": "ბოლოს ჩანიშნულები", "header_recommended_by": "რეკომენდებულია {provider}-ის მიერ", - "header_bookmarks_placeholder": "სანიშნეები ჯერ არაა დამატებული.", + "header_bookmarks_placeholder": "სანიშნები ჯერ არაა დამატებული.", "header_stories_from": "-იდან", "type_label_visited": "მონახულებული", "type_label_bookmarked": "ჩანიშნული", "type_label_synced": "სხვა მოწყობილობიდან დასინქრონებული", "type_label_recommended": "პოპულარული", "type_label_open": "გახსნა", "type_label_topic": "თემა", "type_label_now": "ახლა", "menu_action_bookmark": "ჩანიშვნა", - "menu_action_remove_bookmark": "სანიშნეებიდან ამოღება", + "menu_action_remove_bookmark": "სანიშნებიდან ამოღება", "menu_action_copy_address": "მისამართის დაკოპირება", "menu_action_email_link": "ბმულის გაგზავნა…", "menu_action_open_new_window": "ახალ ფანჯარაში გახსნა", "menu_action_open_private_window": "ახალ პირად ფანჯარაში გახსნა", - "menu_action_dismiss": "დახურვა", + "menu_action_dismiss": "დამალვა", "menu_action_delete": "ისტორიიდან ამოშლა", "menu_action_pin": "მიმაგრება", "menu_action_unpin": "მოხსნა", "confirm_history_delete_p1": "ნამდვილად გსურთ, ამ გვერდის ყველა ჩანაწერის ისტორიიდან ამოშლა?", "confirm_history_delete_notice_p2": "ეს ქმედება შეუქცევადია.", "menu_action_save_to_pocket": "Pocket-ში შენახვა", "search_for_something_with": "{search_term} -ის ძიება:", "search_button": "ძიება", @@ -37,37 +37,37 @@ window.gActivityStreamStrings = { "search_settings": "ძიების პარამეტრების შეცვლა", "section_info_option": "ინფორმაცია", "section_info_send_feedback": "უკუკავშირი", "section_info_privacy_notice": "პირადი მონაცემების დაცვა", "section_disclaimer_topstories": "საუკეთესო და საინტერესო სიახლეები ინტერნეტიდან, შერჩეული თქვენ მიერ მონახულებული გვერდების საფუძველზე. Pocket-იდან, რომელიც უკვე Mozilla-ს ნაწილია.", "section_disclaimer_topstories_linktext": "ნახეთ, როგორ მუშაობს.", "section_disclaimer_topstories_buttontext": "კარგი, გასაგებია", "welcome_title": "მოგესალმებით ახალ ჩანართზე", - "welcome_body": "Firefox ამ სივრცეს გამოიყენებს თქვენთვის ყველაზე საჭირო სანიშნეების, სტატიების, ვიდეოებისა და ბოლოს მონახულებული გვერდებისთვის, რომ ადვილად შეძლოთ მათზე დაბრუნება.", + "welcome_body": "Firefox ამ სივრცეს გამოიყენებს თქვენთვის ყველაზე საჭირო სანიშნების, სტატიების, ვიდეოებისა და ბოლოს მონახულებული გვერდებისთვის, რომ ადვილად შეძლოთ მათზე დაბრუნება.", "welcome_label": "მნიშვნელოვანი საიტების დადგენა", "time_label_less_than_minute": "<1წთ", "time_label_minute": "{number}წთ", "time_label_hour": "{number}სთ", "time_label_day": "{number}დღე", "settings_pane_button_label": "მოირგეთ ახალი ჩანართის გვერდი", "settings_pane_header": "ახალი ჩანართის პარამეტრები", "settings_pane_body2": "მიუთითეთ, რისი ხილვა გსურთ ამ გვერდზე.", "settings_pane_search_header": "ძიება", "settings_pane_search_body": "ძიება ინტერნეტში ახალი ჩანართიდან.", "settings_pane_topsites_header": "რჩეული საიტები", "settings_pane_topsites_body": "წვდომა ხშირად მონახულებულ საიტებთან.", "settings_pane_topsites_options_showmore": "ორ რიგად ჩვენება", "settings_pane_bookmarks_header": "ბოლოს ჩანიშნულები", - "settings_pane_bookmarks_body": "ახლად შექმნილი სანიშნეები, ერთი ხელის გაწვდენაზე.", + "settings_pane_bookmarks_body": "ახლად შექმნილი სანიშნები, ერთი ხელის გაწვდენაზე.", "settings_pane_visit_again_header": "ხელახლა ნახვა", "settings_pane_visit_again_body": "Firefox გაჩვენებთ მონახულებული გვერდების ისტორიიდან იმას, რისი გახსენებაც ან რაზე დაბრუნებაც გენდომებათ.", "settings_pane_highlights_header": "მნიშვნელოვანი საიტები", "settings_pane_highlights_body2": "მარტივად დაუბრუნდით ბოლოს მონახულებულ, ან ჩანიშნულ გვერდებს.", - "settings_pane_highlights_options_bookmarks": "სანიშნეები", + "settings_pane_highlights_options_bookmarks": "სანიშნები", "settings_pane_highlights_options_visited": "მონახულებული საიტები", "settings_pane_snippets_header": "ცნობები", "settings_pane_snippets_body": "გაეცანით მოკლე, საინტერესო სიახლეებს Mozilla-სგან, Firefox-ის, ინტერნეტ სამყაროს მიღწევებისა და სხვა დასამახსოვრებელი ფაქტების შესახებ.", "settings_pane_done_button": "მზადაა", "settings_pane_topstories_options_sponsored": "დარეკლამებული სტატიების ჩვენება", "edit_topsites_button_text": "ჩასწორება", "edit_topsites_button_label": "მოირგეთ რჩეული საიტების განყოფილება", "edit_topsites_showmore_button": "მეტის გამოჩენა", @@ -87,12 +87,12 @@ window.gActivityStreamStrings = { "topsites_form_cancel_button": "გაუქმება", "topsites_form_url_validation": "საჭიროა მართებული URL", "pocket_read_more": "პოპულარული თემები:", "pocket_read_even_more": "მეტი სიახლის ნახვა", "pocket_feedback_header": "საუკეთესოები ინტერნეტიდან, 25 მილიონზე მეტი ადამიანის მიერ არჩეული.", "pocket_description": "გაეცანით ინტერნეტში არსებულ მაღალი ხარისხის მასალას Pocket-ის საშუალებით, რომელიც ახლა უკვე Mozilla-ს ნაწილს წარმოადგენს.", "highlights_empty_state": "დაიწყეთ გვერდების დათვალიერება და აქ გამოჩნდება თქვენი რჩეული სტატიები, ვიდეოები და ბოლოს მონახულებული, ან ჩანიშნული საიტები.", "topstories_empty_state": "უკვე ყველაფერი წაკითხული გაქვთ. {provider}-იდან ახალი რჩეული სტატიების მისაღებად, მოგვიანებით შემოიარეთ. თუ ვერ ითმენთ, აირჩიეთ რომელიმე მოთხოვნადი თემა, ახალი საინტერესო სტატიების მოსაძიებლად.", - "manual_migration_explanation2": "გადმოიტანეთ სხვა ბრაუზერებიდან თქვენი სანიშნეები, ისტორია და პაროლები Firefox-ში.", + "manual_migration_explanation2": "გადმოიტანეთ სხვა ბრაუზერებიდან თქვენი სანიშნები, ისტორია და პაროლები Firefox-ში.", "manual_migration_cancel_button": "არა, გმადლობთ", "manual_migration_import_button": "ახლავე გადმოტანა" };
--- a/browser/extensions/activity-stream/prerendered/locales/km/activity-stream-prerendered.html +++ b/browser/extensions/activity-stream/prerendered/locales/km/activity-stream-prerendered.html @@ -3,17 +3,17 @@ <head> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> </head> <body class="activity-stream"> - <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-592150916"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">ស្វែងរកបណ្ដាញ</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="ស្វែងរកបណ្ដាញ" title="ស្វែងរកបណ្ដាញ" data-reactid="7"/><button id="searchSubmit" class="search-button" title="Search" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">Search</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">វិបសាយលើគេ</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="Info" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">Top Sites</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">Access the websites you visit most.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">New Tab Preferences</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="Customize your Top Sites section" data-reactid="69"><span data-reactid="70">Edit</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Recommended by Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">Popular Topics:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">ការរំលេច</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> + <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-2120605812"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">ស្វែងរកបណ្ដាញ</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="ស្វែងរកបណ្ដាញ" title="ស្វែងរកបណ្ដាញ" data-reactid="7"/><button id="searchSubmit" class="search-button" title="ស្វែងរក" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">ស្វែងរក</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">វិបសាយលើគេ</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="ព័ត៌មាន" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">សាយកំពូល</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">ចូលវេបសាយដែលអ្នកទស្សនាច្រើនបំផុត។</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">ចំណង់ចំណូលចិត្ត ផ្ទាំងថ្មី</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="Customize your Top Sites section" data-reactid="69"><span data-reactid="70">កែសម្រួល</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">បានណែនាំដោយ Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">ប្រធានបទកំពុងពេញនិយម៖</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">រឿងសំខាន់ៗ</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> <div id="snippets-container"> <div id="snippets"></div> </div> <script> // Don't directly load the following scripts as part of html to let the page // finish loading to render the content sooner. for (const src of [ "resource://activity-stream/prerendered/static/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/prerendered/locales/km/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/km/activity-stream-strings.js @@ -1,98 +1,98 @@ // Note - this is a generated file. window.gActivityStreamStrings = { "newtab_page_title": "ផ្ទាំងថ្មី", "default_label_loading": "កំពុងផ្ទុក...", "header_top_sites": "វិបសាយលើគេ", - "header_stories": "Top Stories", - "header_highlights": "ការរំលេច", - "header_visit_again": "Visit Again", - "header_bookmarks": "Recent Bookmarks", - "header_recommended_by": "Recommended by {provider}", - "header_bookmarks_placeholder": "You don’t have any bookmarks yet.", - "header_stories_from": "from", + "header_stories": "រឿងរ៉ាវកំពូល", + "header_highlights": "រឿងសំខាន់ៗ", + "header_visit_again": "ទស្សនាម្តងទៀត", + "header_bookmarks": "ចំណាំថ្មីៗ", + "header_recommended_by": "បានណែនាំដោយ {provider}", + "header_bookmarks_placeholder": "អ្នកមិនមានចំណាំណាមួយនៅឡើយទេ ។", + "header_stories_from": "មកពី", "type_label_visited": "បានចូលមើល", "type_label_bookmarked": "បានចំណាំ", "type_label_synced": "បានធ្វើសមកាលកម្មពីឧបករណ៍ផ្សេងទៀត", - "type_label_recommended": "Trending", + "type_label_recommended": "និន្នាការ", "type_label_open": "បើក", "type_label_topic": "ប្រធានបទ", - "type_label_now": "Now", + "type_label_now": "ឥឡូវនេះ", "menu_action_bookmark": "ចំណាំ", "menu_action_remove_bookmark": "លុបចំណាំចេញ", "menu_action_copy_address": "ចម្លងអាសយដ្ឋាន", "menu_action_email_link": "តំណអ៊ីមែល...", "menu_action_open_new_window": "បើកនៅក្នុងបង្អួចថ្មី", "menu_action_open_private_window": "បើកនៅក្នុងបង្អួចឯកជនថ្មី", "menu_action_dismiss": "បោះបង់ចោល", "menu_action_delete": "លុបពីប្រវត្តិ", - "menu_action_pin": "Pin", - "menu_action_unpin": "Unpin", - "confirm_history_delete_p1": "Are you sure you want to delete every instance of this page from your history?", - "confirm_history_delete_notice_p2": "This action cannot be undone.", - "menu_action_save_to_pocket": "Save to Pocket", + "menu_action_pin": "ខ្ទាស់", + "menu_action_unpin": "ដកខ្ទាស់", + "confirm_history_delete_p1": "តើអ្នកប្រាកដថាអ្នកចង់លុបគ្រប់វត្ថុនៃទំព័រនេះពីប្រវត្តិរបស់អ្នកឬ?", + "confirm_history_delete_notice_p2": "សកម្មភាពនេះមិនអាចមិនធ្វើឡើងវិញបានទេ។", + "menu_action_save_to_pocket": "រក្សាទុកទៅ Pocket", "search_for_something_with": "ស្វែងរក {search_term} ជាមួយ៖", - "search_button": "Search", + "search_button": "ស្វែងរក", "search_header": "{search_engine_name} ស្វែងរក", "search_web_placeholder": "ស្វែងរកបណ្ដាញ", "search_settings": "ផ្លាស់ប្ដូរការកំណត់ស្វែងរក", - "section_info_option": "Info", - "section_info_send_feedback": "Send Feedback", - "section_info_privacy_notice": "Privacy Notice", + "section_info_option": "ព័ត៌មាន", + "section_info_send_feedback": "ផ្ញើមតិត្រឡប់", + "section_info_privacy_notice": "សេចក្តីជូនដំណឹងអំពីភាពឯកជន", "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories_buttontext": "យល់ហើយ", "welcome_title": "ស្វាគមន៍មកកាន់ផ្ទាំងថ្មី", "welcome_body": "Firefox នឹងប្រើប្រាស់កន្លែងទំនេរនេះ ដើម្បីបង្ហាញចំណាំ អត្ថបទ វីដេអូ និងទំព័រដែលទាក់ទងអ្នកបំផុត ដែលអ្នកបានចូលមើលថ្មីៗនេះ ដូច្នេះអ្នកអាចត្រឡប់ទៅកាន់វាវិញបានយ៉ាងងាយស្រួល។", "welcome_label": "កំពុងបញ្ជាក់ការរំលេចរបស់អ្នក", "time_label_less_than_minute": "<1 នាទី", "time_label_minute": "{number} នាទី", "time_label_hour": "{number} ម៉ោង", "time_label_day": "{number} ថ្ងៃ", "settings_pane_button_label": "Customize your New Tab page", - "settings_pane_header": "New Tab Preferences", - "settings_pane_body2": "Choose what you see on this page.", - "settings_pane_search_header": "Search", - "settings_pane_search_body": "Search the Web from your new tab.", - "settings_pane_topsites_header": "Top Sites", - "settings_pane_topsites_body": "Access the websites you visit most.", - "settings_pane_topsites_options_showmore": "Show two rows", - "settings_pane_bookmarks_header": "Recent Bookmarks", - "settings_pane_bookmarks_body": "Your newly created bookmarks in one handy location.", - "settings_pane_visit_again_header": "Visit Again", + "settings_pane_header": "ចំណង់ចំណូលចិត្ត ផ្ទាំងថ្មី", + "settings_pane_body2": "ជ្រើសរើសអ្វីដែលអ្នកឃើញនៅលើទំព័រនេះ។", + "settings_pane_search_header": "ស្វែងរក", + "settings_pane_search_body": "ស្វែងរកបណ្តាញពីផ្ទាំងថ្មីរបស់អ្នក។", + "settings_pane_topsites_header": "សាយកំពូល", + "settings_pane_topsites_body": "ចូលវេបសាយដែលអ្នកទស្សនាច្រើនបំផុត។", + "settings_pane_topsites_options_showmore": "បង្ហាញជួរដេកពីរ", + "settings_pane_bookmarks_header": "ចំណាំថ្មីៗ", + "settings_pane_bookmarks_body": "ចំណាំថ្មីៗ ដែលបានបង្កើតរបស់អ្នកនៅក្នុងទីតាំងដែលងាយស្រួល។", + "settings_pane_visit_again_header": "ទស្សនាម្ដងទៀត", "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.", - "settings_pane_highlights_header": "Highlights", + "settings_pane_highlights_header": "រឿងសំខាន់ៗ", "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", - "settings_pane_highlights_options_bookmarks": "Bookmarks", - "settings_pane_highlights_options_visited": "Visited Sites", - "settings_pane_snippets_header": "Snippets", + "settings_pane_highlights_options_bookmarks": "ចំណាំ", + "settings_pane_highlights_options_visited": "សាយដែលបានទស្សនា", + "settings_pane_snippets_header": "អត្ថបទសង្ខេប", "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", - "settings_pane_done_button": "Done", + "settings_pane_done_button": "ធ្វើរួច", "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", - "edit_topsites_button_text": "Edit", + "edit_topsites_button_text": "កែសម្រួល", "edit_topsites_button_label": "Customize your Top Sites section", - "edit_topsites_showmore_button": "Show More", - "edit_topsites_showless_button": "Show Fewer", - "edit_topsites_done_button": "Done", - "edit_topsites_pin_button": "Pin this site", - "edit_topsites_unpin_button": "Unpin this site", - "edit_topsites_edit_button": "Edit this site", - "edit_topsites_dismiss_button": "Dismiss this site", - "edit_topsites_add_button": "Add", - "topsites_form_add_header": "New Top Site", - "topsites_form_edit_header": "Edit Top Site", - "topsites_form_title_placeholder": "Enter a title", - "topsites_form_url_placeholder": "Type or paste a URL", - "topsites_form_add_button": "Add", - "topsites_form_save_button": "Save", - "topsites_form_cancel_button": "Cancel", - "topsites_form_url_validation": "Valid URL required", - "pocket_read_more": "Popular Topics:", - "pocket_read_even_more": "View More Stories", - "pocket_feedback_header": "The best of the web, curated by over 25 million people.", + "edit_topsites_showmore_button": "បង្ហាញច្រើនទៀត", + "edit_topsites_showless_button": "បង្ហាញតិចជាងនេះ", + "edit_topsites_done_button": "ធ្វើរួច", + "edit_topsites_pin_button": "ខ្ទាស់សាយនេះ", + "edit_topsites_unpin_button": "ដកខ្ទាស់សាយនេះ", + "edit_topsites_edit_button": "កែសម្រួលសាយនេះ", + "edit_topsites_dismiss_button": "ច្រានចោលសាយនេះ", + "edit_topsites_add_button": "បន្ថែម", + "topsites_form_add_header": "សាយកំពូលថ្មី", + "topsites_form_edit_header": "កែសម្រួលសាយកំពូល", + "topsites_form_title_placeholder": "បញ្ចូលចំណងជើង", + "topsites_form_url_placeholder": "វាយបញ្ចូល ឬបិទភ្ជាប់ URL", + "topsites_form_add_button": "បន្ថែម", + "topsites_form_save_button": "រក្សាទុក", + "topsites_form_cancel_button": "បោះបង់", + "topsites_form_url_validation": "ត្រូវការ URL ដែលត្រឹមត្រូវ", + "pocket_read_more": "ប្រធានបទកំពុងពេញនិយម៖", + "pocket_read_even_more": "មើលរឿងរ៉ាវច្រើនទៀត", + "pocket_feedback_header": "បណ្តាញល្អបំផុត ដែលបានវាយតម្លៃដោយមនុស្សជាង 25 លាននាក់។", "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", - "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.", - "manual_migration_cancel_button": "No Thanks", - "manual_migration_import_button": "Import Now" + "manual_migration_explanation2": "សាកល្បងប្រើ Firefox ជាមួយចំណាំ ប្រវត្តិ និងពាក្យសម្ងាត់ពីកម្មវិធីរុករកផ្សេងទៀត។", + "manual_migration_cancel_button": "ទេ អរគុណ", + "manual_migration_import_button": "នាំចូលឥឡូវនេះ" };
--- a/browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ko/activity-stream-strings.js @@ -34,18 +34,18 @@ window.gActivityStreamStrings = { "search_button": "검색", "search_header": "{search_engine_name} 검색", "search_web_placeholder": "웹 검색", "search_settings": "검색 설정 바꾸기", "section_info_option": "정보", "section_info_send_feedback": "의견 보내기", "section_info_privacy_notice": "개인 정보 보호 정책", "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories_linktext": "어떻게 작동 하는지 알아봅시다.", + "section_disclaimer_topstories_buttontext": "알겠습니다.", "welcome_title": "새 탭을 소개합니다", "welcome_body": "최근에 방문한 관련있는 즐겨찾기나 글, 동영상, 페이지를 Firefox가 여기에 표시해서 쉽게 다시 찾아볼 수 있게 할 것입니다.", "welcome_label": "하이라이트 확인", "time_label_less_than_minute": "<1분", "time_label_minute": "{number}분", "time_label_hour": "{number}시", "time_label_day": "{number}일", "settings_pane_button_label": "새 탭 페이지 꾸미기", @@ -57,22 +57,22 @@ window.gActivityStreamStrings = { "settings_pane_topsites_body": "가장 많이 방문한 웹 사이트에 접근하세요.", "settings_pane_topsites_options_showmore": "두 줄로 보기", "settings_pane_bookmarks_header": "최근 북마크", "settings_pane_bookmarks_body": "최근 북마크가 편리하게 한 곳에 나타납니다.", "settings_pane_visit_again_header": "다시 방문", "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.", "settings_pane_highlights_header": "하이라이트", "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", - "settings_pane_highlights_options_bookmarks": "Bookmarks", - "settings_pane_highlights_options_visited": "Visited Sites", + "settings_pane_highlights_options_bookmarks": "즐겨찾기", + "settings_pane_highlights_options_visited": "방문한 사이트", "settings_pane_snippets_header": "Snippets", "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", "settings_pane_done_button": "완료", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "후원된 스토리", "edit_topsites_button_text": "수정", "edit_topsites_button_label": "상위 사이트 영역 꾸미기", "edit_topsites_showmore_button": "더보기", "edit_topsites_showless_button": "줄이기", "edit_topsites_done_button": "완료", "edit_topsites_pin_button": "이 사이트 고정", "edit_topsites_unpin_button": "이 사이트 고정 취소", "edit_topsites_edit_button": "이 사이트 수정", @@ -85,14 +85,14 @@ window.gActivityStreamStrings = { "topsites_form_add_button": "추가", "topsites_form_save_button": "저장", "topsites_form_cancel_button": "취소", "topsites_form_url_validation": "유효한 URL이 필요합니다", "pocket_read_more": "인기 주제:", "pocket_read_even_more": "더 많은 이야기 보기", "pocket_feedback_header": "2천 5백만 명에 의해 추천되는 최고의 웹입니다.", "pocket_description": "Mozilla와 하나가 된 Pocket의 도움으로 놓칠지도 모르는 고품질의 컨텐츠를 접해보세요.", - "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", + "highlights_empty_state": "브라우징을 시작하면 최근 방문하거나 북마크한 좋은 글이나 영상, 페이지를 여기에 보여줍니다.", "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", "manual_migration_explanation2": "다른 브라우저에 있는 북마크, 기록, 비밀번호를 사용해 Firefox를 이용해 보세요.", "manual_migration_cancel_button": "괜찮습니다", "manual_migration_import_button": "지금 가져오기" };
--- a/browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-prerendered.html +++ b/browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-prerendered.html @@ -3,17 +3,17 @@ <head> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> </head> <body class="activity-stream"> - <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-1353654196"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">ຄົ້ນຫາເວັບ</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="ຄົ້ນຫາເວັບ" title="ຄົ້ນຫາເວັບ" data-reactid="7"/><button id="searchSubmit" class="search-button" title="ຊອກຫາ" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">ຊອກຫາ</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">ເວັບໄຊຕ໌ຍອດນິຍົມ</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="Info" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">ເວັບໄຊທ໌ຍອດນິຍົມ</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">ເຂົ້າເວັບໄຊທ໌ທີ່ທ່ານໄດ້ເຂົ້າໄປຫລາຍທີ່ສຸດ.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">ການຕັ້ງຄ່າແທັບໃຫມ່</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="ປັບແຕ່ງພາກສ່ວນເວັບໄຊທ໌ຍອດນິຍົມຂອງທ່ານ" data-reactid="69"><span data-reactid="70">ແກ້ໄຂ</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Recommended by Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">Popular Topics:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">ຈຸດເດັ່ນ</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> + <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="29217771"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">ຄົ້ນຫາເວັບ</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="ຄົ້ນຫາເວັບ" title="ຄົ້ນຫາເວັບ" data-reactid="7"/><button id="searchSubmit" class="search-button" title="ຊອກຫາ" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">ຊອກຫາ</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">ເວັບໄຊຕ໌ຍອດນິຍົມ</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="Info" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">ເວັບໄຊທ໌ຍອດນິຍົມ</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">ເຂົ້າເວັບໄຊທ໌ທີ່ທ່ານໄດ້ເຂົ້າໄປຫລາຍທີ່ສຸດ.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">ການຕັ້ງຄ່າແທັບໃຫມ່</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="ປັບແຕ່ງພາກສ່ວນເວັບໄຊທ໌ຍອດນິຍົມຂອງທ່ານ" data-reactid="69"><span data-reactid="70">ແກ້ໄຂ</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Recommended by Pocket</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">ຫົວຂໍ້ຍອດນິຍົມ:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">ລາຍການເດັ່ນ</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> <div id="snippets-container"> <div id="snippets"></div> </div> <script> // Don't directly load the following scripts as part of html to let the page // finish loading to render the content sooner. for (const src of [ "resource://activity-stream/prerendered/static/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/lo/activity-stream-strings.js @@ -1,15 +1,15 @@ // Note - this is a generated file. window.gActivityStreamStrings = { "newtab_page_title": "ແທັບໃຫມ່", "default_label_loading": "ກຳລັງໂຫລດ…", "header_top_sites": "ເວັບໄຊຕ໌ຍອດນິຍົມ", "header_stories": "Top Stories", - "header_highlights": "ຈຸດເດັ່ນ", + "header_highlights": "ລາຍການເດັ່ນ", "header_visit_again": "Visit Again", "header_bookmarks": "Recent Bookmarks", "header_recommended_by": "Recommended by {provider}", "header_bookmarks_placeholder": "You don’t have any bookmarks yet.", "header_stories_from": "from", "type_label_visited": "ເຂົ້າໄປເບິງມາແລ້ວ", "type_label_bookmarked": "ບຸກມາກໄວ້ແລ້ວ", "type_label_synced": "ໄດ້ Sync ມາຈາກອຸປະກອນອື່ນ", @@ -24,17 +24,17 @@ window.gActivityStreamStrings = { "menu_action_open_new_window": "ເປີດລີ້ງໃນຫນ້າຕ່າງໃຫມ່", "menu_action_open_private_window": "ເປີດໃນຫນ້າຕ່າງສ່ວນຕົວໃຫມ່", "menu_action_dismiss": "ຍົກເລີກ", "menu_action_delete": "ລຶບອອກຈາກປະຫວັດການນຳໃຊ້", "menu_action_pin": "Pin", "menu_action_unpin": "Unpin", "confirm_history_delete_p1": "Are you sure you want to delete every instance of this page from your history?", "confirm_history_delete_notice_p2": "This action cannot be undone.", - "menu_action_save_to_pocket": "Save to Pocket", + "menu_action_save_to_pocket": "ບັນທືກໄປທີ່ Pocket", "search_for_something_with": "ຄົ້ນຫາສໍາລັບ {search_term} ດ້ວຍ:", "search_button": "ຊອກຫາ", "search_header": "ຄົ້ນຫາ {search_engine_name}", "search_web_placeholder": "ຄົ້ນຫາເວັບ", "search_settings": "ປ່ຽນການຕັ້ງຄ່າການຄົ້ນຫາ", "section_info_option": "Info", "section_info_send_feedback": "Send Feedback", "section_info_privacy_notice": "Privacy Notice", @@ -59,42 +59,40 @@ window.gActivityStreamStrings = { "settings_pane_bookmarks_header": "Recent Bookmarks", "settings_pane_bookmarks_body": "Your newly created bookmarks in one handy location.", "settings_pane_visit_again_header": "Visit Again", "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.", "settings_pane_highlights_header": "ຈຸດເດັ່ນ", "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", "settings_pane_highlights_options_bookmarks": "Bookmarks", "settings_pane_highlights_options_visited": "Visited Sites", - "settings_pane_snippets_header": "Snippets", + "settings_pane_snippets_header": "ສ່ວນຍ່ອຍ", "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", "settings_pane_done_button": "ສຳເລັດ", "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", "edit_topsites_button_text": "ແກ້ໄຂ", "edit_topsites_button_label": "ປັບແຕ່ງພາກສ່ວນເວັບໄຊທ໌ຍອດນິຍົມຂອງທ່ານ", "edit_topsites_showmore_button": "ສະແດງເພີ່ມເຕີມ", "edit_topsites_showless_button": "ສະແດງນ້ອຍລົງ", "edit_topsites_done_button": "ສຳເລັດ", "edit_topsites_pin_button": "Pin ເວັບໄຊທ໌ນີ້", "edit_topsites_unpin_button": "Unpin this site", "edit_topsites_edit_button": "ແກ້ໄຂເວັບໄຊທ໌ນີ້", "edit_topsites_dismiss_button": "ຍົກເລີກເວັບໄຊທ໌ນີ້", "edit_topsites_add_button": "Add", "topsites_form_add_header": "New Top Site", "topsites_form_edit_header": "Edit Top Site", - "topsites_form_title_placeholder": "Enter a title", + "topsites_form_title_placeholder": "ປ້ອນຊື່ເລື່ອງ", "topsites_form_url_placeholder": "Type or paste a URL", "topsites_form_add_button": "Add", "topsites_form_save_button": "Save", "topsites_form_cancel_button": "Cancel", "topsites_form_url_validation": "Valid URL required", - "pocket_read_more": "Popular Topics:", + "pocket_read_more": "ຫົວຂໍ້ຍອດນິຍົມ:", "pocket_read_even_more": "View More Stories", "pocket_feedback_header": "The best of the web, curated by over 25 million people.", "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.", "manual_migration_cancel_button": "No Thanks", - "manual_migration_import_button": "Import Now", - "settings_pane_body": "ເລືອກສິ່ງທີ່ທ່ານເຫັນເມື່ອທ່ານເປີດແທັບໃຫມ່.", - "settings_pane_highlights_body": "ຍ້ອນຄືນກັບໄປເບິງປະຫວັດການທ່ອງເວັບທີ່ຫາກາເຂົ້າໄປ ແລະ ບຸກມາກທີ່ໄດ້ຮັບການສ້າງຂື້ນມາໃຫມ່ຂອງທ່ານ." + "manual_migration_import_button": "ນຳເຂົ້າຕອນນີ້" };
--- a/browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/lt/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Ieškoti „{search_term}“ per:", "search_button": "Ieškoti", "search_header": "{search_engine_name} paieška", "search_web_placeholder": "Ieškokite saityne", "search_settings": "Keisti paieškos nuostatas", "section_info_option": "Informacija", "section_info_send_feedback": "Siųsti atsiliepimą", "section_info_privacy_notice": "Privatumo nuostatai", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Įdomiausi saityno straipsniai, parinkti pagal jūsų skaitymo įpročius. Iš „Pocket“, kuri dabar priklauso „Mozillai“.", + "section_disclaimer_topstories_linktext": "Sužinokite, kaip tai veikia.", + "section_disclaimer_topstories_buttontext": "Gerai, supratau", "welcome_title": "Sveiki, čia nauja kortelė", "welcome_body": "„Firefox“ naudos šią vietą jums aktualiausių adresyno įrašų, straipsnių, vaizdo įrašų bei neseniai lankytų tinklalapių rodymui, kad galėtumėte lengvai į juos sugrįžti.", "welcome_label": "Nustatomi jūsų akcentai", "time_label_less_than_minute": "<1 min.", "time_label_minute": "{number} min.", "time_label_hour": "{number} val.", "time_label_day": "{number} d.", "settings_pane_button_label": "Tinkinkite savo naujos kortelės puslapį", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "„Firefox“ pateiks ištraukas iš jūsų naršymo žurnalo, kurias galbūt norėtumėte prisiminti.", "settings_pane_highlights_header": "Akcentai", "settings_pane_highlights_body2": "Sugrįžkite prie įdomių dalykų, kuriuose neseniai lankėtės ar įtraukėte į adresyną.", "settings_pane_highlights_options_bookmarks": "Adresynas", "settings_pane_highlights_options_visited": "Aplankytos svetainės", "settings_pane_snippets_header": "Iškarpos", "settings_pane_snippets_body": "Skaitykite trumpas ir mielas naujienas iš „Mozillos“ apie „Firefox“, interneto kultūrą bei atsitiktinį memą.", "settings_pane_done_button": "Atlikta", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Rodyti rėmėjų straipsnius", "edit_topsites_button_text": "Keisti", "edit_topsites_button_label": "Tinkinkite savo lankomiausių svetainių skiltį", "edit_topsites_showmore_button": "Rodyti daugiau", "edit_topsites_showless_button": "Rodyti mažiau", "edit_topsites_done_button": "Atlikta", "edit_topsites_pin_button": "Įsegti šią svetainę", "edit_topsites_unpin_button": "Išsegti šią svetainę", "edit_topsites_edit_button": "Redaguoti šią svetainę",
--- a/browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ml/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "തിരയാൻ {search_term} : എന്നത് ഉപയോഗിയ്ക്കുക", "search_button": "തിരയുക", "search_header": "{search_engine_name} തിരയുക", "search_web_placeholder": "ഇൻറർനെറ്റിൽ തിരയുക", "search_settings": "തിരയാനുള്ള രീതികൾ മാറ്റുക", "section_info_option": "വിവരം", "section_info_send_feedback": "ഫീഡ്ബാക്ക് അയയ്ക്കുക", "section_info_privacy_notice": "സ്വകാര്യതാ അറിയിപ്പ്", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "വെബിലെ ഏറ്റവും രസകരമായ അറിവുകൾ, നിങ്ങൾ വായിച്ചവ അടിസ്ഥാനമാക്കി തിരഞ്ഞെടുത്തത്. ഇപ്പോൾ മോസില്ലയുടെ ഭാഗമായ പോക്കറ്റിൽ നിന്നും.", + "section_disclaimer_topstories_linktext": "എങ്ങനെ പ്രവര്ത്തിക്കുന്നു എന്ന് കാണുക.", + "section_disclaimer_topstories_buttontext": "ശരി, മനസ്സിലായി", "welcome_title": "പുതിയ ജാലകത്തിലേക്കു സ്വാഗതം", "welcome_body": "നിങ്ങളുടെ ഏറ്റവും ശ്രദ്ധേയമായ അടയാളങ്ങൾ, ലേഖനങ്ങൾ, വീഡിയോകൾ, കൂടാതെ നിങ്ങൾ സമീപകാലത്ത് സന്ദർശിച്ച താളുകൾ എന്നിവ കാണിക്കുന്നതിനായി ഫയർഫോക്സ് ഈ ഇടം ഉപയോഗിക്കും, അതിനാൽ നിങ്ങൾക്ക് എളുപ്പത്തിൽ അവയിലേക്ക് തിരിച്ചു പോകാം.", "welcome_label": "താങ്കളുടെ ഹൈലൈറ്റ്സ് തിരിച്ചറിയുന്നു", "time_label_less_than_minute": "<1 മിനിറ്റ്", "time_label_minute": "{number} മിനിറ്റ്", "time_label_hour": "{number} മിനിറ്റ്", "time_label_day": "{number} മിനിറ്റ്", "settings_pane_button_label": "നിങ്ങളുടെ പുതിയ ടാബ് താള് ഇഷ്ടാനുസൃതമാക്കുക", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "നിങ്ങൾ ഓർത്തുവയ്ക്കാനോ അല്ലെങ്കിൽ തിരികെ ചെല്ലാനോ ആഗ്രഹിക്കുന്ന ബ്രൌസിംഗ് ചരിത്രത്തിന്റെ ഭാഗങ്ങൾ നിങ്ങൾക്ക് ഫയർഫോക്സ് കാണിച്ച് തരും.", "settings_pane_highlights_header": "ഹൈലൈറ്റുകൾ", "settings_pane_highlights_body2": "നിങ്ങൾ സമീപകാലത്ത് സന്ദർശിച്ചതോ അല്ലെങ്കിൽ ബുക്ക്മാർക്ക് ചെയ്തതോ ആയ രസകരമായ കാര്യങ്ങളിലേക്ക് വഴി കണ്ടെത്തുക.", "settings_pane_highlights_options_bookmarks": "ബുക്ക്മാർക്കുകൾ", "settings_pane_highlights_options_visited": "സന്ദർശിച്ച സൈറ്റുകൾ", "settings_pane_snippets_header": "ലഘു കുറിപ്പുകൾ", "settings_pane_snippets_body": "മോസില്ലയിൽ നിന്നും ഫയർഫോക്സ്, ഇന്റർനെറ്റ് സംസ്കാരം, വല്ലപ്പോഴുമുള്ള ക്രമമില്ലാത്ത മെമെ, എന്നിവയിൽ ചെറുതും മധുരവുമായ പരിഷ്കരണങ്ങൾ വായിക്കുക.", "settings_pane_done_button": "തീർന്നു", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "സ്പോൺസർ ചെയ്തവ കാണിക്കുക", "edit_topsites_button_text": "തിരുത്തുക", "edit_topsites_button_label": "നിങ്ങളുടെ മുന്നേറിയ സൈറ്റുകളുടെ വിഭാഗം ഇഷ്ടാനുസൃതമാക്കുക", "edit_topsites_showmore_button": "കൂടുതൽ കാണിക്കുക", "edit_topsites_showless_button": "കുറച്ച് കാണിക്കുക", "edit_topsites_done_button": "തീർന്നു", "edit_topsites_pin_button": "ഈ സൈറ്റ് പിൻ ചെയ്യുക", "edit_topsites_unpin_button": "ഈ സൈറ്റ് അണ്പിന് ചെയ്യുക", "edit_topsites_edit_button": "ഈ സൈറ്റ് തിരുത്തുക",
--- a/browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/pt-BR/activity-stream-strings.js @@ -22,26 +22,26 @@ window.gActivityStreamStrings = { "menu_action_copy_address": "Copiar endereço", "menu_action_email_link": "Enviar link por e-mail…", "menu_action_open_new_window": "Abrir em uma nova janela", "menu_action_open_private_window": "Abrir em uma nova janela privativa", "menu_action_dismiss": "Dispensar", "menu_action_delete": "Excluir do histórico", "menu_action_pin": "Fixar", "menu_action_unpin": "Desafixar", - "confirm_history_delete_p1": "Você tem certeza que deseja deletar todas as ocorrências dessa página do seu histórico?", + "confirm_history_delete_p1": "Você tem certeza que deseja excluir todas as instâncias desta página do seu histórico?", "confirm_history_delete_notice_p2": "Essa ação não pode ser desfeita.", "menu_action_save_to_pocket": "Salvar no Pocket", "search_for_something_with": "Pesquisar por {search_term} com:", "search_button": "Pesquisar", "search_header": "Pesquisa {search_engine_name}", "search_web_placeholder": "Pesquisar na Web", "search_settings": "Alterar configurações de pesquisa", "section_info_option": "Info", - "section_info_send_feedback": "Enviar opinião", + "section_info_send_feedback": "Enviar feedback", "section_info_privacy_notice": "Política de Privacidade", "section_disclaimer_topstories": "As histórias mais interessantes na web, selecionadas baseadas no que você lê. Do Pocket, agora parte da Mozilla.", "section_disclaimer_topstories_linktext": "Saiba como funciona.", "section_disclaimer_topstories_buttontext": "Ok, entendi", "welcome_title": "Bem-vindo a nova aba", "welcome_body": "O Firefox usará este espaço para mostrar seus favoritos, artigos, vídeos e páginas mais relevantes visitados recentemente, assim você pode voltar mais facilmente.", "welcome_label": "Identificando seus destaques", "time_label_less_than_minute": "<1m",
--- a/browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/pt-PT/activity-stream-strings.js @@ -36,28 +36,28 @@ window.gActivityStreamStrings = { "search_web_placeholder": "Pesquisar na Web", "search_settings": "Alterar definições de pesquisa", "section_info_option": "Informação", "section_info_send_feedback": "Enviar feedback", "section_info_privacy_notice": "Aviso de privacidade", "section_disclaimer_topstories": "As histórias mais interessantes na web, selecionadas baseadas no que você lê. Do Pocket, agora parte da Mozilla.", "section_disclaimer_topstories_linktext": "Saiba como funciona.", "section_disclaimer_topstories_buttontext": "Ok, entendi", - "welcome_title": "Bem-vindo ao novo separador", + "welcome_title": "Bem-vindo(a) ao novo separador", "welcome_body": "O Firefox irá utilizar este espaço para lhe mostrar os seus marcadores, artigos, vídeos, e páginas mais relevantes que visitou recentemente, para que possa regressar a estes mais facilmente.", "welcome_label": "A identificar os seus destaques", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}d", "settings_pane_button_label": "Personalizar a sua página de novo separador", "settings_pane_header": "Preferências de novo separador", "settings_pane_body2": "Escolha o que vê nesta página.", "settings_pane_search_header": "Pesquisa", - "settings_pane_search_body": "Pesquise na Web a partir do seu novo separador.", + "settings_pane_search_body": "Pesquise na Web a partir do seu 'Novo separador'.", "settings_pane_topsites_header": "Sites mais visitados", "settings_pane_topsites_body": "Aceda aos websites que mais visita.", "settings_pane_topsites_options_showmore": "Mostrar duas linhas", "settings_pane_bookmarks_header": "Marcadores recentes", "settings_pane_bookmarks_body": "Os seus marcadores recém-criados num único local acessível.", "settings_pane_visit_again_header": "Visitar novamente", "settings_pane_visit_again_body": "O Firefox irá mostrar-lhe partes do seu histórico de navegação que pode querer relembrar ou voltar a aceder.", "settings_pane_highlights_header": "Destaques", @@ -88,11 +88,11 @@ window.gActivityStreamStrings = { "topsites_form_url_validation": "URL válido requerido", "pocket_read_more": "Tópicos populares:", "pocket_read_even_more": "Ver mais histórias", "pocket_feedback_header": "O melhor da web, com curadoria de mais de 25 milhões de pessoas.", "pocket_description": "Descubra conteúdo de alta qualidade que podia de outra maneira perder, com a ajuda do Pocket, agora parte da Mozilla.", "highlights_empty_state": "Comece a navegar, e iremos mostrar-lhe alguns dos ótimos artigos, vídeos, e outras páginas que visitou recentemente ou adicionou aos marcadores aqui.", "topstories_empty_state": "Já apanhou tudo. Verifique mais tarde para mais histórias principais de {provider}. Não pode esperar? Selecione um tópico popular para encontrar mais boas histórias de toda a web.", "manual_migration_explanation2": "Experimente o Firefox com marcadores, histórico e palavras-passe de outro navegador.", - "manual_migration_cancel_button": "Não obrigado", + "manual_migration_cancel_button": "Não, obrigado", "manual_migration_import_button": "Importar agora" };
--- a/browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ro/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Caută {search_term} cu: ", "search_button": "Caută", "search_header": "Căutare {search_engine_name}", "search_web_placeholder": "Caută pe web", "search_settings": "Schimbă setările de căutare", "section_info_option": "Informații", "section_info_send_feedback": "Trimite feedback", "section_info_privacy_notice": "Politica de confidențialitate", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Cele mai interesante articole de pe web, alese pe baza lucrurilor pe care le citești. De la Pocket, acum parte din Mozilla.", + "section_disclaimer_topstories_linktext": "Află cum funcționează.", + "section_disclaimer_topstories_buttontext": "Ok, am înțeles", "welcome_title": "Bun venit în noua filă", "welcome_body": "Firefox va folosi acest spațiu pentru a arăta cele mai relevante semne de carte, articole, videouri și pagini vizitate recent pentru a reveni la acestea ușor.", "welcome_label": "Se identifică evidențierile tale", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}d", "settings_pane_button_label": "Particularizează pagina de filă nouă", @@ -56,23 +56,23 @@ window.gActivityStreamStrings = { "settings_pane_topsites_header": "Site-uri de top", "settings_pane_topsites_body": "Accesează site-urile pe care le vizitezi mai des.", "settings_pane_topsites_options_showmore": "Arată două rânduri", "settings_pane_bookmarks_header": "Marcaje recente", "settings_pane_bookmarks_body": "Marcajele memorate recent, organizate și accesibile într-un singur log.", "settings_pane_visit_again_header": "Vizitează din nou", "settings_pane_visit_again_body": "Firefox îți va arăta părți din istoricul navigării tale la care ai vrea să revii mai târziu.", "settings_pane_highlights_header": "Evidențieri", - "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", + "settings_pane_highlights_body2": "Regăsește lucrurile interesante pe care le-ai vizitat sau marcat recent.", "settings_pane_highlights_options_bookmarks": "Marcaje", "settings_pane_highlights_options_visited": "Site-uri vizitate", - "settings_pane_snippets_header": "Snippets", - "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", + "settings_pane_snippets_header": "Fragmente", + "settings_pane_snippets_body": "Citește actualizări scurte de la Mozilla despre Firefox, cultura internetului și meme-ul ocazional.", "settings_pane_done_button": "Gata", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Arată articolele sponsorizate", "edit_topsites_button_text": "Editează", "edit_topsites_button_label": "Particularizează secțiunea site-urilor de top", "edit_topsites_showmore_button": "Arată mai mult", "edit_topsites_showless_button": "Arată mai puțin", "edit_topsites_done_button": "Gata", "edit_topsites_pin_button": "Fixează acest site", "edit_topsites_unpin_button": "Anulează fixarea acestui site", "edit_topsites_edit_button": "Editează acest site", @@ -84,15 +84,15 @@ window.gActivityStreamStrings = { "topsites_form_url_placeholder": "Tastează sau lipește un URL", "topsites_form_add_button": "Adaugă", "topsites_form_save_button": "Salvează", "topsites_form_cancel_button": "Renunță", "topsites_form_url_validation": "URL valid necesar", "pocket_read_more": "Subiecte populare:", "pocket_read_even_more": "Vezi mai multe articole", "pocket_feedback_header": "Cel mai bun de pe web, întreţinut de peste 25 de milioane de oameni.", - "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", - "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", - "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", + "pocket_description": "Descoperă conținut de calitate pe care l-ai putea rata, cu ajutorul Pocket, acum parte din Mozilla.", + "highlights_empty_state": "Începe să navighezi și noi îți vom arăta articole interesante, videouri sau alte pagini pe care le-ai vizitat sau marcat recent.", + "topstories_empty_state": "Ai ajuns la capăt. Revino mai târziu pentru alte articole de la {provider}. Nu mai vrei să aștepți? Alege un subiect popular și găsește alte articole interesante de pe web.", "manual_migration_explanation2": "Încearcă Firefox cu marcajele, istoricul și parolele din alt navigator.", "manual_migration_cancel_button": "Nu, mulțumesc", "manual_migration_import_button": "Importă acum" };
new file mode 100644 --- /dev/null +++ b/browser/extensions/activity-stream/prerendered/locales/si/activity-stream-prerendered.html @@ -0,0 +1,37 @@ +<!doctype html> +<html lang="si" dir="ltr"> + <head> + <meta charset="utf-8"> + <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> + <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> + <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> + <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> + </head> + <body class="activity-stream"> + <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="602757434"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">ජාලය තුළ සොයන්න</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="ජාලය තුළ සොයන්න" title="ජාලය තුළ සොයන්න" data-reactid="7"/><button id="searchSubmit" class="search-button" title="සොයන්න" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">සොයන්න</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">ප්රමුඛ අඩවි</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="තොරතුරු" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">ප්රමුඛ අඩවි</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">ඔබ නිරතුරුව පිවිසෙන වෙබ් අඩවි වෙත ප්රවේශය.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">නව ටැබ අභිප්රේත</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="Customize your Top Sites section" data-reactid="69"><span data-reactid="70">සැකසුම්</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Pocket විසින් නිර්දේශිතයි</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">ජනප්රිය මාතෘකා:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">ඉස්මතු කිරීම්</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> + <div id="snippets-container"> + <div id="snippets"></div> + </div> + <script> +// Don't directly load the following scripts as part of html to let the page +// finish loading to render the content sooner. +for (const src of [ + "resource://activity-stream/prerendered/static/activity-stream-initial-state.js", + "chrome://browser/content/contentSearchUI.js", + "resource://activity-stream/vendor/react.js", + "resource://activity-stream/vendor/react-dom.js", + "resource://activity-stream/vendor/react-intl.js", + "resource://activity-stream/vendor/redux.js", + "resource://activity-stream/vendor/react-redux.js", + "resource://activity-stream/prerendered/si/activity-stream-strings.js", + "resource://activity-stream/data/content/activity-stream.bundle.js" +]) { + // These dynamically inserted scripts by default are async, but we need them + // to load in the desired order (i.e., bundle last). + const script = document.body.appendChild(document.createElement("script")); + script.async = false; + script.src = src; +} + </script> + </body> +</html>
new file mode 100644 --- /dev/null +++ b/browser/extensions/activity-stream/prerendered/locales/si/activity-stream-strings.js @@ -0,0 +1,98 @@ +// Note - this is a generated file. +window.gActivityStreamStrings = { + "newtab_page_title": "නව ටැබය", + "default_label_loading": "පූරණය වෙමින්…", + "header_top_sites": "ප්රමුඛ අඩවි", + "header_stories": "ප්රමුඛ පුවත්", + "header_highlights": "ඉස්මතු කිරීම්", + "header_visit_again": "යළි පිවිසෙන්න", + "header_bookmarks": "නැවුම් පිටු සලකුණු", + "header_recommended_by": "{provider} විසින් නිර්දේශිතයි", + "header_bookmarks_placeholder": "ඔබ සතුව තවම පිටුසලකුණු නැත.", + "header_stories_from": "සිට", + "type_label_visited": "ප්රවේශිත", + "type_label_bookmarked": "පිටු සලකුණු තැබූ", + "type_label_synced": "වෙනත් උපාංගයක් වෙතින් සමකාලීන කර ඇත", + "type_label_recommended": "Trending", + "type_label_open": "විවෘත", + "type_label_topic": "මාතෘකාව", + "type_label_now": "දැන්", + "menu_action_bookmark": "පිටු සලකුණ", + "menu_action_remove_bookmark": "පිටු සලකුණ ඉවත් කරන්න", + "menu_action_copy_address": "ලිපිනය පිටපත් කරන්න", + "menu_action_email_link": "විද්යුත් තැපැල් සබැඳි…", + "menu_action_open_new_window": "නව කවුළුවක විවෘත කරන්න", + "menu_action_open_private_window": "නව පුද්ගලික කවුළුවක විවෘත කරන්න", + "menu_action_dismiss": "ඉවත් කරන්න", + "menu_action_delete": "අතිතයෙන් මකන්න කරන්න", + "menu_action_pin": "ඇමිණීම", + "menu_action_unpin": "ඇමුණුම ඉවත් කරන්න", + "confirm_history_delete_p1": "ඔබට මෙම පිටුවට අදාල සියලුම සිදුවීම් ඔබේ අතීතයන් මැකීමට අවශ්ය ද?", + "confirm_history_delete_notice_p2": "මෙම ක්රියාව අහෝසි කළ නොහැක.", + "menu_action_save_to_pocket": "Save to Pocket", + "search_for_something_with": "{search_term} සදහා සෙවීමට භාවිත කළ යුත්තේ:", + "search_button": "සොයන්න", + "search_header": "{search_engine_name} ෙසවුම", + "search_web_placeholder": "ජාලය තුළ සොයන්න", + "search_settings": "සෙවුම් සැකසුම් වෙනස් කරන්න", + "section_info_option": "තොරතුරු", + "section_info_send_feedback": "ප්රතිචාරය යවන්න", + "section_info_privacy_notice": "පෞද්ගලිකත්ව දැනුම්දීම්", + "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", + "section_disclaimer_topstories_linktext": "එය ක්රියාකරන්නේ කෙසේදැයි අධ්යපනය කරන්න.", + "section_disclaimer_topstories_buttontext": "හරි, තේරුණා", + "welcome_title": "නව ටැබයට සාදරයෙන් පිළිගනිමු", + "welcome_body": "ඔබට පහසුවෙන් යළි භාවිතයට පහසු කරවීමට, Firefox මෙම ඉඩ ඔබට වඩාත් අදාල පිටු සළකුණු, ලිපි, විඩියෝ සහ ඔබ මෑතකදී පිවිසි පිටු පෙන්වීම සදහා භාවිත කරයි.", + "welcome_label": "ඔබේ ඉස්මතු කිරීම් හදුනාගනිමින්", + "time_label_less_than_minute": "<1m", + "time_label_minute": "{number} මිනිත්තු", + "time_label_hour": "{number}පැය", + "time_label_day": "{number}දින", + "settings_pane_button_label": "ඔබේ නව ටැබ පිටුව රුචිකරණය කරන්න", + "settings_pane_header": "නව ටැබ අභිප්රේත", + "settings_pane_body2": "මෙම පිටුවේ ඔබ දැකිය යුතු දේ තෝරන්න.", + "settings_pane_search_header": "සොයන්න", + "settings_pane_search_body": "ඔබේ නව ටැබයෙන් වෙබ් සෙවීම.", + "settings_pane_topsites_header": "ප්රමුඛ අඩවි", + "settings_pane_topsites_body": "ඔබ නිරතුරුව පිවිසෙන වෙබ් අඩවි වෙත ප්රවේශය.", + "settings_pane_topsites_options_showmore": "පේළි දෙකක් පෙන්වන්න", + "settings_pane_bookmarks_header": "නැවුම් පිටු සලකුණු", + "settings_pane_bookmarks_body": "ඔබේ නැවුම් පිටු සලකුණු එක් ස්ථානයක.", + "settings_pane_visit_again_header": "යළි පිවිසෙන්න", + "settings_pane_visit_again_body": "Firefox will show you parts of your browsing history that you might want to remember or get back to.", + "settings_pane_highlights_header": "ඉස්මතු කිරීම්", + "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", + "settings_pane_highlights_options_bookmarks": "පිටු සලකුණු", + "settings_pane_highlights_options_visited": "පිවිසුණු අඩවි", + "settings_pane_snippets_header": "Snippets", + "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", + "settings_pane_done_button": "", + "settings_pane_topstories_options_sponsored": "අනුග්රහක පුවත් පෙන්වන්න", + "edit_topsites_button_text": "සැකසුම්", + "edit_topsites_button_label": "Customize your Top Sites section", + "edit_topsites_showmore_button": "තවත් පෙන්වන්න", + "edit_topsites_showless_button": "අඩුවෙන් පෙන්වන්න", + "edit_topsites_done_button": "කළා", + "edit_topsites_pin_button": "Pin this site", + "edit_topsites_unpin_button": "Unpin this site", + "edit_topsites_edit_button": "මෙම අඩවිය සකසන්න", + "edit_topsites_dismiss_button": "මෙම අඩවිය ඉවත ලන්න", + "edit_topsites_add_button": "එක් කරන්න", + "topsites_form_add_header": "නව ප්රමුඛ අඩවියක්", + "topsites_form_edit_header": "ප්රමුඛ අඩවිය සකසන්න", + "topsites_form_title_placeholder": "සිරස්තල එක් කරන්න", + "topsites_form_url_placeholder": "URL එකක් ඇතුළත් කරන්න", + "topsites_form_add_button": "එක් කරන්න", + "topsites_form_save_button": "සුරකින්න", + "topsites_form_cancel_button": "අවලංගු කරන්න", + "topsites_form_url_validation": "වලංගු URL එකක් අවශ්ය වේ", + "pocket_read_more": "ජනප්රිය මාතෘකා:", + "pocket_read_even_more": "තවත් බොහෝ දැ", + "pocket_feedback_header": "The best of the web, curated by over 25 million people.", + "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", + "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", + "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", + "manual_migration_explanation2": "Firefox වෙනත් ගවේශයකය පිටය සලකුණු, අතීතය සහ මුරපද සමග උත්සාහ කර බලන්න.", + "manual_migration_cancel_button": "එපා, ස්තුතියි", + "manual_migration_import_button": "දැන් ආයාත කරන්න" +};
new file mode 100644 --- /dev/null +++ b/browser/extensions/activity-stream/prerendered/locales/si/activity-stream.html @@ -0,0 +1,36 @@ +<!doctype html> +<html lang="si" dir="ltr"> + <head> + <meta charset="utf-8"> + <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> + <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> + <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> + <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> + </head> + <body class="activity-stream"> + <div id="root"></div> + <div id="snippets-container"> + <div id="snippets"></div> + </div> + <script> +// Don't directly load the following scripts as part of html to let the page +// finish loading to render the content sooner. +for (const src of [ + "chrome://browser/content/contentSearchUI.js", + "resource://activity-stream/vendor/react.js", + "resource://activity-stream/vendor/react-dom.js", + "resource://activity-stream/vendor/react-intl.js", + "resource://activity-stream/vendor/redux.js", + "resource://activity-stream/vendor/react-redux.js", + "resource://activity-stream/prerendered/si/activity-stream-strings.js", + "resource://activity-stream/data/content/activity-stream.bundle.js" +]) { + // These dynamically inserted scripts by default are async, but we need them + // to load in the desired order (i.e., bundle last). + const script = document.body.appendChild(document.createElement("script")); + script.async = false; + script.src = src; +} + </script> + </body> +</html>
--- a/browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-prerendered.html +++ b/browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-prerendered.html @@ -3,17 +3,17 @@ <head> <meta charset="utf-8"> <meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp"> <link rel="icon" type="image/png" id="favicon" href="chrome://branding/content/icon32.png"/> <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" /> <link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" /> </head> <body class="activity-stream"> - <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="1728466482"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">இணையத்தில் தேடு</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="இணையத்தில் தேடு" title="இணையத்தில் தேடு" data-reactid="7"/><button id="searchSubmit" class="search-button" title="தேடு" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">தேடு</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">சிறந்த தளங்கள்</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="தகவல்" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">சிறந்த தளங்கள்</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">நீங்கள் அடிக்கடி பார்க்கும் தளங்களை அணுகவும்.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">புதிய கீற்றின் முன்னுரிமைகள்</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="உங்களின் சிறந்த தளங்களுக்கான தொகுதியை விருப்பமை" data-reactid="69"><span data-reactid="70">தொகு</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Pocket என்பவரால் பரிந்துரைக்கப்பட்டது</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">பிரபலமான தலைப்புகள்:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">Highlights</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> + <div id="root"><div class="outer-wrapper fixed-to-top" data-reactroot="" data-reactid="1" data-react-checksum="-1453923718"><main data-reactid="2"><div class="search-wrapper" data-reactid="3"><label for="newtab-search-text" class="search-label" data-reactid="4"><span class="sr-only" data-reactid="5"><span data-reactid="6">இணையத்தில் தேடு</span></span></label><input type="search" id="newtab-search-text" maxlength="256" placeholder="இணையத்தில் தேடு" title="இணையத்தில் தேடு" data-reactid="7"/><button id="searchSubmit" class="search-button" title="தேடு" data-reactid="8"><span class="sr-only" data-reactid="9"><span data-reactid="10">தேடு</span></span></button></div><div class="body-wrapper" data-reactid="11"><section class="collapsible-section top-sites animation-enabled" data-reactid="12"><div class="section-top-bar" data-reactid="13"><h3 class="section-title" data-reactid="14"><span class="click-target" data-reactid="15"><span class="icon icon-small-spacer icon-topsites" data-reactid="16"></span><span data-reactid="17">சிறந்த தளங்கள்</span><span class="icon icon-arrowhead-down" data-reactid="18"></span></span></h3><span class="section-info-option" data-reactid="19"><img class="info-option-icon" title="தகவல்" aria-haspopup="true" aria-controls="info-option" aria-expanded="false" role="note" tabindex="0" data-reactid="20"/><div class="info-option" data-reactid="21"><div class="info-option-header" role="heading" data-reactid="22"><span data-reactid="23">சிறந்த தளங்கள்</span></div><p class="info-option-body" data-reactid="24"><span data-reactid="25">நீங்கள் அடிக்கடி பார்க்கும் தளங்களை அணுகவும்.</span></p><div class="info-option-manage" data-reactid="26"><button data-reactid="27"><span data-reactid="28">புதிய கீற்றின் முன்னுரிமைகள்</span></button></div></div></span></div><div class="section-body" data-reactid="29"><ul class="top-sites-list" data-reactid="30"><li class="top-site-outer placeholder" data-reactid="31"><a data-reactid="32"><div class="tile" aria-hidden="true" data-reactid="33"><div class="screenshot" style="background-image:none;" data-reactid="34"></div></div><div class="title " data-reactid="35"><span dir="auto" data-reactid="36"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="37"><a data-reactid="38"><div class="tile" aria-hidden="true" data-reactid="39"><div class="screenshot" style="background-image:none;" data-reactid="40"></div></div><div class="title " data-reactid="41"><span dir="auto" data-reactid="42"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="43"><a data-reactid="44"><div class="tile" aria-hidden="true" data-reactid="45"><div class="screenshot" style="background-image:none;" data-reactid="46"></div></div><div class="title " data-reactid="47"><span dir="auto" data-reactid="48"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="49"><a data-reactid="50"><div class="tile" aria-hidden="true" data-reactid="51"><div class="screenshot" style="background-image:none;" data-reactid="52"></div></div><div class="title " data-reactid="53"><span dir="auto" data-reactid="54"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="55"><a data-reactid="56"><div class="tile" aria-hidden="true" data-reactid="57"><div class="screenshot" style="background-image:none;" data-reactid="58"></div></div><div class="title " data-reactid="59"><span dir="auto" data-reactid="60"></span></div></a></li><li class="top-site-outer placeholder" data-reactid="61"><a data-reactid="62"><div class="tile" aria-hidden="true" data-reactid="63"><div class="screenshot" style="background-image:none;" data-reactid="64"></div></div><div class="title " data-reactid="65"><span dir="auto" data-reactid="66"></span></div></a></li></ul><div class="edit-topsites-wrapper" data-reactid="67"><div class="edit-topsites-button" data-reactid="68"><button class="edit" title="உங்களின் சிறந்த தளங்களுக்கான தொகுதியை விருப்பமை" data-reactid="69"><span data-reactid="70">தொகு</span></button></div></div></div></section><div class="sections-list" data-reactid="71"><section class="collapsible-section section animation-enabled" data-reactid="72"><div class="section-top-bar" data-reactid="73"><h3 class="section-title" data-reactid="74"><span class="click-target" data-reactid="75"><span class="icon icon-small-spacer icon-pocket" data-reactid="76"></span><span data-reactid="77">Pocket என்பவரால் பரிந்துரைக்கப்பட்டது</span><span class="icon icon-arrowhead-down" data-reactid="78"></span></span></h3></div><div class="section-body" data-reactid="79"><ul class="section-list" style="padding:0;" data-reactid="80"><li class="card-outer placeholder" data-reactid="81"><a data-reactid="82"><div class="card" data-reactid="83"><div class="card-details no-image" data-reactid="84"><div class="card-text no-context no-description no-host-name no-image" data-reactid="85"><h4 class="card-title" dir="auto" data-reactid="86"></h4><p class="card-description" dir="auto" data-reactid="87"></p></div><div class="card-context" data-reactid="88"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="89"><a data-reactid="90"><div class="card" data-reactid="91"><div class="card-details no-image" data-reactid="92"><div class="card-text no-context no-description no-host-name no-image" data-reactid="93"><h4 class="card-title" dir="auto" data-reactid="94"></h4><p class="card-description" dir="auto" data-reactid="95"></p></div><div class="card-context" data-reactid="96"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="97"><a data-reactid="98"><div class="card" data-reactid="99"><div class="card-details no-image" data-reactid="100"><div class="card-text no-context no-description no-host-name no-image" data-reactid="101"><h4 class="card-title" dir="auto" data-reactid="102"></h4><p class="card-description" dir="auto" data-reactid="103"></p></div><div class="card-context" data-reactid="104"></div></div></div></a></li></ul><div class="topic" data-reactid="105"><span data-reactid="106"><span data-reactid="107">பிரபலமான தலைப்புகள்:</span></span><ul data-reactid="108"></ul></div></div></section><section class="collapsible-section section animation-enabled" data-reactid="109"><div class="section-top-bar" data-reactid="110"><h3 class="section-title" data-reactid="111"><span class="click-target" data-reactid="112"><span class="icon icon-small-spacer icon-highlights" data-reactid="113"></span><span data-reactid="114">மிளிர்ப்புகள்</span><span class="icon icon-arrowhead-down" data-reactid="115"></span></span></h3></div><div class="section-body" data-reactid="116"><ul class="section-list" style="padding:0;" data-reactid="117"><li class="card-outer placeholder" data-reactid="118"><a data-reactid="119"><div class="card" data-reactid="120"><div class="card-details no-image" data-reactid="121"><div class="card-text no-context no-description no-host-name no-image" data-reactid="122"><h4 class="card-title" dir="auto" data-reactid="123"></h4><p class="card-description" dir="auto" data-reactid="124"></p></div><div class="card-context" data-reactid="125"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="126"><a data-reactid="127"><div class="card" data-reactid="128"><div class="card-details no-image" data-reactid="129"><div class="card-text no-context no-description no-host-name no-image" data-reactid="130"><h4 class="card-title" dir="auto" data-reactid="131"></h4><p class="card-description" dir="auto" data-reactid="132"></p></div><div class="card-context" data-reactid="133"></div></div></div></a></li><li class="card-outer placeholder" data-reactid="134"><a data-reactid="135"><div class="card" data-reactid="136"><div class="card-details no-image" data-reactid="137"><div class="card-text no-context no-description no-host-name no-image" data-reactid="138"><h4 class="card-title" dir="auto" data-reactid="139"></h4><p class="card-description" dir="auto" data-reactid="140"></p></div><div class="card-context" data-reactid="141"></div></div></div></a></li></ul></div></section></div></div><!-- react-empty: 142 --></main></div></div> <div id="snippets-container"> <div id="snippets"></div> </div> <script> // Don't directly load the following scripts as part of html to let the page // finish loading to render the content sooner. for (const src of [ "resource://activity-stream/prerendered/static/activity-stream-initial-state.js",
--- a/browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/ta/activity-stream-strings.js @@ -1,15 +1,15 @@ // Note - this is a generated file. window.gActivityStreamStrings = { "newtab_page_title": "புதிய கீற்று", "default_label_loading": "ஏற்றுகிறது…", "header_top_sites": "சிறந்த தளங்கள்", "header_stories": "முக்கிய கதைகள்", - "header_highlights": "Highlights", + "header_highlights": "மிளிர்ப்புகள்", "header_visit_again": "மீண்டும் வருக", "header_bookmarks": "சமீபத்திய புத்தகக்குறிகள்", "header_recommended_by": "{provider} என்பவரால் பரிந்துரைக்கப்பட்டது", "header_bookmarks_placeholder": "நீங்கள் புத்தகக்குறிகளைக் கொண்டிருக்கவில்லை .", "header_stories_from": "அனுப்பியவர்", "type_label_visited": "பார்த்தவை", "type_label_bookmarked": "புத்தகக்குறியிடப்பட்டது", "type_label_synced": "இன்னொரு சாதனத்திலிருந்து ஒத்திசைக்கப்பட்டது", @@ -31,18 +31,18 @@ window.gActivityStreamStrings = { "confirm_history_delete_notice_p2": "இச்செயலை மீட்க முடியாது.", "menu_action_save_to_pocket": "பாக்கட்டில் சேமி", "search_for_something_with": "{search_term} சொல்லிற்காகத் தேடு:", "search_button": "தேடு", "search_header": "{search_engine_name} தேடுபொறியில் தேடு", "search_web_placeholder": "இணையத்தில் தேடு", "search_settings": "தேடல் அமைவுகளை மாற்று", "section_info_option": "தகவல்", - "section_info_send_feedback": "Send Feedback", - "section_info_privacy_notice": "Privacy Notice", + "section_info_send_feedback": "பின்னூட்டம் அனுப்பு", + "section_info_privacy_notice": "தனியுரிம கொள்கை", "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", "section_disclaimer_topstories_linktext": "Learn how it works.", "section_disclaimer_topstories_buttontext": "Okay, got it", "welcome_title": "புதிய கீற்றுக்கு வருக", "welcome_body": "உங்களுக்கு மிகவும் பொருத்தமான புத்தகக்குறிகள், கட்டுரைகள், காணொளிகள் மற்றும் சமீபத்தில் பார்வையிட்ட பக்கங்களைக் காண்பிக்க பயர்பாக்ஸ் இந்த இடத்தைப் பயன்படுத்தும், எனவே நீங்கள் அவற்றை எளிதாகத் திரும்பப் பெறலாம்.", "welcome_label": "உங்களின் முக்கியம்சங்களை அடையாளம் காண்கிறோம்", "time_label_less_than_minute": "<1நி", "time_label_minute": "{number}நி", @@ -55,20 +55,20 @@ window.gActivityStreamStrings = { "settings_pane_search_body": "புதிய கீற்றிலீருந்து இணையத்தை தேடு.", "settings_pane_topsites_header": "சிறந்த தளங்கள்", "settings_pane_topsites_body": "நீங்கள் அடிக்கடி பார்க்கும் தளங்களை அணுகவும்.", "settings_pane_topsites_options_showmore": "இரு வரிசைகளைக் காண்பி", "settings_pane_bookmarks_header": "சமீபத்திய புத்தகக்குறிகள்", "settings_pane_bookmarks_body": "ஒரு வசதியான இடத்தில் உங்கள் புதிதாக உருவாக்கப்பட்ட புத்தகக்குறிகள்.", "settings_pane_visit_again_header": "மீண்டும் வருக", "settings_pane_visit_again_body": "பயர்பாக்ஸ் நீங்கள் நினைவுப்படுத்த (அ) திரும்பப் பெற விரும்பும் உங்கள் உலாவல் வரலாற்றின் சில பகுதிகளைக் காட்டும்.", - "settings_pane_highlights_header": "Highlights", + "settings_pane_highlights_header": "மிளிர்ப்புகள்", "settings_pane_highlights_body2": "Find your way back to interesting things you’ve recently visited or bookmarked.", - "settings_pane_highlights_options_bookmarks": "Bookmarks", - "settings_pane_highlights_options_visited": "Visited Sites", + "settings_pane_highlights_options_bookmarks": "புத்தகக்குறிகள்", + "settings_pane_highlights_options_visited": "பார்வையிடப்பட்ட தளம்", "settings_pane_snippets_header": "Snippets", "settings_pane_snippets_body": "Read short and sweet updates from Mozilla about Firefox, internet culture, and the occasional random meme.", "settings_pane_done_button": "முடிந்தது", "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", "edit_topsites_button_text": "தொகு", "edit_topsites_button_label": "உங்களின் சிறந்த தளங்களுக்கான தொகுதியை விருப்பமை", "edit_topsites_showmore_button": "கூடுதலாகக் காட்டுக", "edit_topsites_showless_button": "குறைவாகக் காண்பி", @@ -89,15 +89,10 @@ window.gActivityStreamStrings = { "pocket_read_more": "பிரபலமான தலைப்புகள்:", "pocket_read_even_more": "இன்னும் கதைகளைப் பார்க்கவும்", "pocket_feedback_header": "இணையத்தின் சிறந்த செயலி, 250 இலட்ச மக்களால் தேர்ந்தெடுக்கப்பட்டது.", "pocket_description": "Discover high-quality content you might otherwise miss, with help from Pocket, now part of Mozilla.", "highlights_empty_state": "Start browsing, and we’ll show some of the great articles, videos, and other pages you’ve recently visited or bookmarked here.", "topstories_empty_state": "You’ve caught up. Check back later for more top stories from {provider}. Can’t wait? Select a popular topic to find more great stories from around the web.", "manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.", "manual_migration_cancel_button": "பரவாயில்லை", - "manual_migration_import_button": "இப்போது இறக்கு", - "settings_pane_body": "ஒரு புதிய கீற்றைத் திறக்கும்போது நீங்கள் பார்ப்பதை தேர்க.", - "settings_pane_pocketstories_header": "முக்கிய கதைகள்", - "settings_pane_pocketstories_body": "Pocket, ஒரு மொசில்லா குடும்ப உறுப்பினராக, உயர்தர உள்ளடக்கங்களுடன் இணைய உதவுகிறது, இது இல்லையேல் அது சாத்தியமாகது.", - "pocket_feedback_body": "Pocket, ஒரு மொசில்லா குடும்ப உறுப்பினராக, உயர்தர உள்ளடக்கங்களுடன் இணைய உதவுகிறது, இது இல்லையேல் அது சாத்தியமாகது.", - "pocket_send_feedback": "கருத்துகளைத் தெறிவிக்கவும்" + "manual_migration_import_button": "இப்போது இறக்கு" };
--- a/browser/extensions/activity-stream/prerendered/locales/th/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/th/activity-stream-strings.js @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Firefox จะแสดงประวัติการท่องเว็บที่คุณอาจต้องการให้จดจำหรือกลับไปเยี่ยมชมอีกครั้งที่นี่", "settings_pane_highlights_header": "รายการเด่น", "settings_pane_highlights_body2": "ค้นหาทางของคุณกลับไปยังสิ่งที่น่าสนใจที่คุณได้เยี่ยมชมหรือเพิ่มที่คั่นหน้าไว้ล่าสุด", "settings_pane_highlights_options_bookmarks": "ที่คั่นหน้า", "settings_pane_highlights_options_visited": "ไซต์ที่เยี่ยมชมแล้ว", "settings_pane_snippets_header": "ส่วนย่อย", "settings_pane_snippets_body": "อ่านข้อมูลอัปเดตที่สั้นและไพเราะจาก Mozilla เกี่ยวกับ Firefox, วัฒนธรรมอินเทอร์เน็ต และมีมแบบสุ่มเป็นครั้งคราว", "settings_pane_done_button": "เสร็จสิ้น", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "แสดงเรื่องราวที่ได้รับการสนับสนุน", "edit_topsites_button_text": "แก้ไข", "edit_topsites_button_label": "ปรับแต่งส่วนไซต์เด่นของคุณ", "edit_topsites_showmore_button": "แสดงเพิ่มเติม", "edit_topsites_showless_button": "แสดงน้อยลง", "edit_topsites_done_button": "เสร็จสิ้น", "edit_topsites_pin_button": "ปักหมุดไซต์นี้", "edit_topsites_unpin_button": "ถอนหมุดไซต์นี้", "edit_topsites_edit_button": "แก้ไขไซต์นี้",
--- a/browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-strings.js +++ b/browser/extensions/activity-stream/prerendered/locales/tl/activity-stream-strings.js @@ -33,19 +33,19 @@ window.gActivityStreamStrings = { "search_for_something_with": "Maghanap ng mga {search_term} na may:", "search_button": "Hanapin", "search_header": "{search_engine_name} Hanapin", "search_web_placeholder": "Hanapin sa Web", "search_settings": "Baguhin ang mga Setting ng Paghahanap", "section_info_option": "Impormasyon", "section_info_send_feedback": "Magbigay ng Feedback", "section_info_privacy_notice": "Abiso sa Privacy", - "section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.", - "section_disclaimer_topstories_linktext": "Learn how it works.", - "section_disclaimer_topstories_buttontext": "Okay, got it", + "section_disclaimer_topstories": "Ang pinaka-kagiliw-giliw na mga kwento sa web, pinili batay sa kung ano ang iyong nabasa. Mula sa Pocket, bahagi na ngayon ng Mozilla.", + "section_disclaimer_topstories_linktext": "Alamin kung paano ito gumagana.", + "section_disclaimer_topstories_buttontext": "Sige, nakuha ko", "welcome_title": "Maligayang pagdating sa bagong tab", "welcome_body": "Firefox ay gagamit ng puwang upang ipakita ang iyong mga pinaka-kaugnay na bookmark, artikulo, video, at mga pahina ng kamakailan na iyong binisita, kaya maaari kang bumalik sa mga ito ng madali.", "welcome_label": "Ang pagkilala sa iyong Highlights", "time_label_less_than_minute": "<1m", "time_label_minute": "{number}m", "time_label_hour": "{number}h", "time_label_day": "{number}d", "settings_pane_button_label": "I-customize ang iyong pahina ng Bagong Tab", @@ -62,17 +62,17 @@ window.gActivityStreamStrings = { "settings_pane_visit_again_body": "Ipapakita sa iyo ng Firefox ang mga bahagi ng iyong kasaysayan ng pagba-browse na maaaring gusto mong matandaan o makabalik.", "settings_pane_highlights_header": "Mga highlight", "settings_pane_highlights_body2": "Hanapin ang iyong daan pabalik sa mga kagiliw-giliw na bagay na kamakailan mong binisita o na-bookmark.", "settings_pane_highlights_options_bookmarks": "Mga bookmark", "settings_pane_highlights_options_visited": "Mga binisitang site", "settings_pane_snippets_header": "Mga snippet", "settings_pane_snippets_body": "Magbasa ng maikli at matamis na mga update mula sa Mozilla tungkol sa Firefox, kultura sa internet, at paminsan-minsang random na meme.", "settings_pane_done_button": "Tapos", - "settings_pane_topstories_options_sponsored": "Show Sponsored Stories", + "settings_pane_topstories_options_sponsored": "Ipakita ang Mga Na-sponsor na Kuwento", "edit_topsites_button_text": "I-edit", "edit_topsites_button_label": "I-customize ang iyong Tuktok na mga seksyon ng Sites", "edit_topsites_showmore_button": "Magpakita ng higit pa", "edit_topsites_showless_button": "Magpakita ng mas kaunti", "edit_topsites_done_button": "Tapos", "edit_topsites_pin_button": "I-pin sa site na ito", "edit_topsites_unpin_button": "I-unpin ang site na ito", "edit_topsites_edit_button": "I-edit ang site na ito",
--- a/browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/NewTabInit.test.js @@ -14,60 +14,16 @@ describe("NewTabInit", () => { instance.store = store; }); it("should reply with a copy of the state immediately", () => { requestFromTab(123); const resp = ac.SendToContent({type: at.NEW_TAB_INITIAL_STATE, data: STATE}, 123); assert.calledWith(store.dispatch, resp); }); - describe("about:home search auto focus", () => { - let action; - beforeEach(() => { - STATE.Prefs = { - values: { - "aboutHome.autoFocus": true, - "showSearch": true - } - }; - action = { - type: at.NEW_TAB_INIT, - data: { - url: "about:home", - browser: {focus: sinon.spy()} - } - }; - }); - it("should focus the content browser when NEW_TAB_INIT", () => { - instance.onAction(action); - - assert.calledOnce(action.data.browser.focus); - }); - it("should NOT focus the content browser when NEW_TAB_INIT for about:newtab", () => { - action.data.url = "about:newtab"; - - instance.onAction(action); - - assert.notCalled(action.data.browser.focus); - }); - it("should NOT focus the content browser when NEW_TAB_INIT when autoFocus pref is off", () => { - STATE.Prefs.values["aboutHome.autoFocus"] = false; - - instance.onAction(action); - - assert.notCalled(action.data.browser.focus); - }); - it("should NOT focus the content browser when NEW_TAB_INIT when there's no search", () => { - STATE.Prefs.values.showSearch = false; - - instance.onAction(action); - - assert.notCalled(action.data.browser.focus); - }); - }); describe("early / simulated new tabs", () => { const simulateTabInit = portID => instance.onAction({ type: at.NEW_TAB_INIT, data: {portID, simulated: true} }); beforeEach(() => { simulateTabInit("foo"); });
--- a/browser/extensions/activity-stream/test/unit/lib/SnippetsFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/SnippetsFeed.test.js @@ -83,16 +83,25 @@ describe("SnippetsFeed", () => { it("should broadcast a SNIPPETS_RESET on uninit", () => { const feed = new SnippetsFeed(); feed.store = {dispatch: sandbox.stub()}; feed.uninit(); assert.calledWith(feed.store.dispatch, ac.BroadcastToContent({type: at.SNIPPETS_RESET})); }); + it("should broadcast a SNIPPET_BLOCKED when a SNIPPETS_BLOCKLIST_UPDATED is received", () => { + const feed = new SnippetsFeed(); + feed.store = {dispatch: sandbox.stub()}; + const blockList = ["foo", "bar", "baz"]; + + feed.onAction({type: at.SNIPPETS_BLOCKLIST_UPDATED, data: blockList}); + + assert.calledWith(feed.store.dispatch, ac.BroadcastToContent({type: at.SNIPPET_BLOCKED, data: blockList})); + }); it("should dispatch an update event when the Search observer is called", async () => { const feed = new SnippetsFeed(); feed.store = {dispatch: sandbox.stub()}; sandbox.stub(feed, "getSelectedSearchEngine") .returns(Promise.resolve(searchData)); await feed.observe(null, "browser-search-engine-modified");
--- a/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js +++ b/browser/extensions/activity-stream/test/unit/lib/TelemetryFeed.test.js @@ -127,17 +127,17 @@ describe("TelemetryFeed", () => { assert.propertyVal(session.perf, "load_trigger_type", "first_window_opened"); }); it("should not set load_trigger_type to first_window_opened on the second about:home seen", () => { instance.addSession("foo", "about:home"); const session2 = instance.addSession("foo", "about:home"); - assert.propertyNotVal(session2.perf, "load_trigger_type", + assert.notPropertyVal(session2.perf, "load_trigger_type", "first_window_opened"); }); it("should set load_trigger_ts to the value of perfService.timeOrigin", () => { const session = instance.addSession("foo", "about:home"); assert.propertyVal(session.perf, "load_trigger_ts", 123456); });
--- a/browser/extensions/formautofill/FormAutofillHandler.jsm +++ b/browser/extensions/formautofill/FormAutofillHandler.jsm @@ -406,17 +406,17 @@ class FormAutofillSection { option.selected = true; element.dispatchEvent(new element.ownerGlobal.UIEvent("input", {bubbles: true})); element.dispatchEvent(new element.ownerGlobal.Event("change", {bubbles: true})); } // Autofill highlight appears regardless if value is changed or not this.changeFieldState(fieldDetail, FIELD_STATES.AUTO_FILLED); } if (fieldDetail.state == FIELD_STATES.AUTO_FILLED) { - element.addEventListener("input", this); + element.addEventListener("input", this, {mozSystemGroup: true}); } } } /** * Populates result to the preview layers with given profile. * * @param {Object} profile @@ -508,18 +508,18 @@ class FormAutofillSection { continue; } // Only reset value for input element. if (fieldDetail.state == FIELD_STATES.AUTO_FILLED && element instanceof Ci.nsIDOMHTMLInputElement) { element.setUserInput(""); } - this.changeFieldState(fieldDetail, FIELD_STATES.NORMAL); } + this.resetFieldStates(); } /** * Change the state of a field to correspond with different presentations. * * @param {Object} fieldDetail * A fieldDetail of which its element is about to update the state. * @param {string} nextState @@ -552,17 +552,17 @@ class FormAutofillSection { } fieldDetail.state = nextState; } resetFieldStates() { for (let fieldDetail of this._validDetails) { const element = fieldDetail.elementWeakRef.get(); - element.removeEventListener("input", this); + element.removeEventListener("input", this, {mozSystemGroup: true}); this.changeFieldState(fieldDetail, FIELD_STATES.NORMAL); } this.address.filledRecordGUID = null; this.creditCard.filledRecordGUID = null; } isFilled() { return !!(this.address.filledRecordGUID || this.creditCard.filledRecordGUID); @@ -745,17 +745,17 @@ class FormAutofillSection { const target = event.target; const fieldDetail = this.getFieldDetailByElement(target); const targetSet = this._getTargetSet(target); this.changeFieldState(fieldDetail, FIELD_STATES.NORMAL); if (!targetSet.fieldDetails.some(detail => detail.state == FIELD_STATES.AUTO_FILLED)) { targetSet.filledRecordGUID = null; } - target.removeEventListener("input", this); + target.removeEventListener("input", this, {mozSystemGroup: true}); break; } } } } /** * Handles profile autofill for a DOM Form element. @@ -871,17 +871,17 @@ class FormAutofillHandler { allValidDetails.push(...section.validDetails); } for (let detail of allValidDetails) { let input = detail.elementWeakRef.get(); if (!input) { continue; } - input.addEventListener("input", this); + input.addEventListener("input", this, {mozSystemGroup: true}); } this.fieldDetails = allValidDetails; return allValidDetails; } getSectionByElement(element) { let section = this._sectionCache.get(element); @@ -949,42 +949,42 @@ class FormAutofillHandler { } if (e.type == "reset") { for (let section of this.sections) { section.resetFieldStates(); } } // Unregister listeners once no field is in AUTO_FILLED state. if (!this.hasFilledSection()) { - this.form.rootElement.removeEventListener("input", onChangeHandler); - this.form.rootElement.removeEventListener("reset", onChangeHandler); + this.form.rootElement.removeEventListener("input", onChangeHandler, {mozSystemGroup: true}); + this.form.rootElement.removeEventListener("reset", onChangeHandler, {mozSystemGroup: true}); } }; if (noFilledSectionsPreviously) { // Handle the highlight style resetting caused by user's correction afterward. log.debug("register change handler for filled form:", this.form); - this.form.rootElement.addEventListener("input", onChangeHandler); - this.form.rootElement.addEventListener("reset", onChangeHandler); + this.form.rootElement.addEventListener("input", onChangeHandler, {mozSystemGroup: true}); + this.form.rootElement.addEventListener("reset", onChangeHandler, {mozSystemGroup: true}); } } handleEvent(event) { switch (event.type) { case "input": if (!event.isTrusted) { return; } for (let detail of this.fieldDetails) { let input = detail.elementWeakRef.get(); if (!input) { continue; } - input.removeEventListener("input", this); + input.removeEventListener("input", this, {mozSystemGroup: true}); } this.timeStartedFillingMS = Date.now(); break; } } /** * Collect the filled sections within submitted form and convert all the valid
--- a/browser/modules/ContentLinkHandler.jsm +++ b/browser/modules/ContentLinkHandler.jsm @@ -23,16 +23,19 @@ const SIZES_TELEMETRY_ENUM = { ANY: 1, DIMENSION: 2, INVALID: 3, }; const FAVICON_PARSING_TIMEOUT = 100; const FAVICON_RICH_ICON_MIN_WIDTH = 96; +const TYPE_ICO = "image/x-icon"; +const TYPE_SVG = "image/svg+xml"; + /* * Create a nsITimer. * * @param {function} aCallback A timeout callback function. * @param {Number} aDelay A timeout interval in millisecond. * @return {nsITimer} A nsITimer object. */ function setTimeout(aCallback, aDelay) { @@ -115,20 +118,37 @@ function setIconForLink(aIconInfo, aChro { url: aIconInfo.iconUri.spec, loadingPrincipal: aIconInfo.loadingPrincipal, requestContextID: aIconInfo.requestContextID, canUseForTab: !aIconInfo.isRichIcon, }); } /** - * Checks whether the icon info represents an ICO image. + * Guess a type for an icon based on its declared type or file extension. */ -function isICO(icon) { - return icon.type == "image/x-icon" || icon.type == "image/vnd.microsoft.icon"; +function guessType(icon) { + // No type with no icon + if (!icon) { + return ""; + } + + // Use the file extension to guess at a type we're interested in + if (!icon.type) { + let extension = icon.iconUri.filePath.split(".").pop(); + switch (extension) { + case "ico": + return TYPE_ICO; + case "svg": + return TYPE_SVG; + } + } + + // Fuzzily prefer the type or fall back to the declared type + return icon.type == "image/vnd.microsoft.icon" ? TYPE_ICO : icon.type || ""; } /* * Timeout callback function for loading favicon. * * @param {Map} aFaviconLoads A map of page URL and FaviconLoad object pairs, * where the FaviconLoad object looks like { * timer: a nsITimer object, @@ -137,36 +157,34 @@ function isICO(icon) { * @param {String} aPageUrl A page URL string for this callback. * @param {Object} aChromeGlobal A global chrome object. */ function faviconTimeoutCallback(aFaviconLoads, aPageUrl, aChromeGlobal) { let load = aFaviconLoads.get(aPageUrl); if (!load) return; - let preferredIcon = { - type: null - }; + let preferredIcon; let preferredWidth = 16 * Math.ceil(aChromeGlobal.content.devicePixelRatio); // Other links with the "icon" tag are the default icons let defaultIcon; // Rich icons are either apple-touch or fluid icons, or the ones of the // dimension 96x96 or greater let largestRichIcon; for (let icon of load.iconInfos) { if (!icon.isRichIcon) { // First check for svg. If it's not available check for an icon with a // size adapt to the current resolution. If both are not available, prefer // ico files. When multiple icons are in the same set, the latest wins. - if (icon.type == "image/svg+xml") { + if (guessType(icon) == TYPE_SVG) { preferredIcon = icon; - } else if (icon.width == preferredWidth && preferredIcon.type != "image/svg+xml") { + } else if (icon.width == preferredWidth && guessType(preferredIcon) != TYPE_SVG) { preferredIcon = icon; - } else if (isICO(icon) && (preferredIcon.type == null || isICO(preferredIcon))) { + } else if (guessType(icon) == TYPE_ICO && (!preferredIcon || guessType(preferredIcon) == TYPE_ICO)) { preferredIcon = icon; } } // Note that some sites use hi-res icons without specifying them as // apple-touch or fluid icons. if (icon.isRichIcon || icon.width >= FAVICON_RICH_ICON_MIN_WIDTH) { if (!largestRichIcon || largestRichIcon.width < icon.width) { @@ -180,17 +198,17 @@ function faviconTimeoutCallback(aFavicon // Now set the favicons for the page in the following order: // 1. Set the best rich icon if any. // 2. Set the preferred one if any, otherwise use the default one. // This order allows smaller icon frames to eventually override rich icon // frames. if (largestRichIcon) { setIconForLink(largestRichIcon, aChromeGlobal); } - if (preferredIcon.type) { + if (preferredIcon) { setIconForLink(preferredIcon, aChromeGlobal); } else if (defaultIcon) { setIconForLink(defaultIcon, aChromeGlobal); } load.timer = null; aFaviconLoads.delete(aPageUrl); }
--- a/devtools/client/framework/devtools-browser.js +++ b/devtools/client/framework/devtools-browser.js @@ -371,19 +371,18 @@ var gDevToolsBrowser = exports.gDevTools if (child == mm) { processId = i; break; } } if (processId) { return this._getContentProcessTarget(processId) .then(target => { - // Display a new toolbox, in a new window, with debugger by default - return gDevTools.showToolbox(target, "jsdebugger", - Toolbox.HostType.WINDOW); + // Display a new toolbox in a new window + return gDevTools.showToolbox(target, null, Toolbox.HostType.WINDOW); }); } let msg = L10N.getStr("toolbox.noContentProcessForTab.message"); Services.prompt.alert(null, "", msg); return Promise.reject(msg); },
--- a/dom/animation/test/css-animations/file_animations-dynamic-changes.html +++ b/dom/animation/test/css-animations/file_animations-dynamic-changes.html @@ -21,17 +21,17 @@ promise_test(function(t) { // Wait a moment so we can confirm the startTime doesn't change (and doesn't // simply reflect the current time). return originalAnimation.ready.then(function() { originalStartTime = originalAnimation.startTime; originalCurrentTime = originalAnimation.currentTime; // Wait a moment so we can confirm the startTime doesn't change (and // doesn't simply reflect the current time). - return waitForFrame(); + return waitForNextFrame(); }).then(function() { div.style.animationDuration = '200s'; var animation = div.getAnimations()[0]; assert_equals(animation, originalAnimation, 'The same Animation is returned after updating' + ' animation duration'); assert_equals(animation.startTime, originalStartTime, 'Animations returned by getAnimations preserve'
--- a/dom/base/CustomElementRegistry.cpp +++ b/dom/base/CustomElementRegistry.cpp @@ -13,16 +13,67 @@ #include "mozilla/dom/WebComponentsBinding.h" #include "mozilla/dom/DocGroup.h" #include "nsHTMLTags.h" #include "jsapi.h" namespace mozilla { namespace dom { +//----------------------------------------------------- +// CustomElementUpgradeReaction + +class CustomElementUpgradeReaction final : public CustomElementReaction +{ +public: + explicit CustomElementUpgradeReaction(CustomElementDefinition* aDefinition) + : mDefinition(aDefinition) + { +#if DEBUG + mIsUpgradeReaction = true; +#endif + } + +private: + virtual void Invoke(Element* aElement, ErrorResult& aRv) override + { + CustomElementRegistry::Upgrade(aElement, mDefinition, aRv); + } + + CustomElementDefinition* mDefinition; +}; + +//----------------------------------------------------- +// CustomElementCallbackReaction + +class CustomElementCallbackReaction final : public CustomElementReaction +{ + public: + explicit CustomElementCallbackReaction(UniquePtr<CustomElementCallback> aCustomElementCallback) + : mCustomElementCallback(Move(aCustomElementCallback)) + { + } + + virtual void Traverse(nsCycleCollectionTraversalCallback& aCb) const override + { + mCustomElementCallback->Traverse(aCb); + } + + private: + virtual void Invoke(Element* aElement, ErrorResult& aRv) override + { + mCustomElementCallback->Call(); + } + + UniquePtr<CustomElementCallback> mCustomElementCallback; +}; + +//----------------------------------------------------- +// CustomElementCallback + void CustomElementCallback::Call() { IgnoredErrorResult rv; switch (mType) { case nsIDocument::eConnected: static_cast<LifecycleConnectedCallback *>(mCallback.get())->Call(mThisObject, rv); break; @@ -83,16 +134,17 @@ CustomElementConstructor::Construct(cons RefPtr<Element> element; if (NS_FAILED(UNWRAP_OBJECT(Element, &result, element))) { return nullptr; } return element.forget(); } + //----------------------------------------------------- // CustomElementData CustomElementData::CustomElementData(nsAtom* aType) : CustomElementData(aType, CustomElementData::State::eUndefined) { } @@ -1115,29 +1167,10 @@ CustomElementDefinition::CustomElementDe : mType(aType), mLocalName(aLocalName), mConstructor(new CustomElementConstructor(aConstructor)), mObservedAttributes(Move(aObservedAttributes)), mCallbacks(aCallbacks) { } - -//----------------------------------------------------- -// CustomElementUpgradeReaction - -/* virtual */ void -CustomElementUpgradeReaction::Invoke(Element* aElement, ErrorResult& aRv) -{ - CustomElementRegistry::Upgrade(aElement, mDefinition, aRv); -} - -//----------------------------------------------------- -// CustomElementCallbackReaction - -/* virtual */ void -CustomElementCallbackReaction::Invoke(Element* aElement, ErrorResult& aRv) -{ - mCustomElementCallback->Call(); -} - } // namespace dom } // namespace mozilla
--- a/dom/base/CustomElementRegistry.h +++ b/dom/base/CustomElementRegistry.h @@ -204,51 +204,16 @@ public: return mIsUpgradeReaction; } protected: bool mIsUpgradeReaction = false; #endif }; -class CustomElementUpgradeReaction final : public CustomElementReaction -{ -public: - explicit CustomElementUpgradeReaction(CustomElementDefinition* aDefinition) - : mDefinition(aDefinition) - { -#if DEBUG - mIsUpgradeReaction = true; -#endif - } - -private: - virtual void Invoke(Element* aElement, ErrorResult& aRv) override; - - CustomElementDefinition* mDefinition; -}; - -class CustomElementCallbackReaction final : public CustomElementReaction -{ - public: - explicit CustomElementCallbackReaction(UniquePtr<CustomElementCallback> aCustomElementCallback) - : mCustomElementCallback(Move(aCustomElementCallback)) - { - } - - virtual void Traverse(nsCycleCollectionTraversalCallback& aCb) const override - { - mCustomElementCallback->Traverse(aCb); - } - - private: - virtual void Invoke(Element* aElement, ErrorResult& aRv) override; - UniquePtr<CustomElementCallback> mCustomElementCallback; -}; - // https://html.spec.whatwg.org/multipage/scripting.html#custom-element-reactions-stack class CustomElementReactionsStack { public: NS_INLINE_DECL_REFCOUNTING(CustomElementReactionsStack) CustomElementReactionsStack() : mIsBackupQueueProcessing(false)
--- a/dom/base/nsRange.cpp +++ b/dom/base/nsRange.cpp @@ -195,58 +195,87 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aEndOffset) { NS_PRECONDITION(aNode, "bad arg"); nsINode* n = GetNextRangeCommonAncestor(aNode); NS_ASSERTION(n || !aNode->IsSelectionDescendant(), "orphan selection descendant"); - // Collect the potential ranges and their selection objects. - RangeHashTable ancestorSelectionRanges; + // Collect the selection objects for potential ranges. nsTHashtable<nsPtrHashKey<Selection>> ancestorSelections; + Selection* prevSelection = nullptr; uint32_t maxRangeCount = 0; for (; n; n = GetNextRangeCommonAncestor(n->GetParentNode())) { LinkedList<nsRange>* ranges = n->GetExistingCommonAncestorRanges(); if (!ranges) { continue; } for (nsRange* range : *ranges) { MOZ_ASSERT(range->IsInSelection(), "Why is this range registeed with a node?"); // Looks like that IsInSelection() assert fails sometimes... - if (!range->Collapsed() && range->IsInSelection()) { - ancestorSelectionRanges.PutEntry(range); + if (range->IsInSelection()) { Selection* selection = range->mSelection; - ancestorSelections.PutEntry(selection); + if (prevSelection != selection) { + prevSelection = selection; + ancestorSelections.PutEntry(selection); + } maxRangeCount = std::max(maxRangeCount, selection->RangeCount()); } } } - if (!ancestorSelectionRanges.IsEmpty()) { - nsTArray<const nsRange*> sortedRanges(maxRangeCount); + IsItemInRangeComparator comparator = { aNode, aStartOffset, aEndOffset }; + if (!ancestorSelections.IsEmpty()) { for (auto iter = ancestorSelections.ConstIter(); !iter.Done(); iter.Next()) { Selection* selection = iter.Get()->GetKey(); - // Sort the found ranges for |selection| in document order + // Binary search the sorted ranges in this selection. // (Selection::GetRangeAt returns its ranges ordered). - for (uint32_t i = 0, len = selection->RangeCount(); i < len; ++i) { - nsRange* range = selection->GetRangeAt(i); - if (ancestorSelectionRanges.Contains(range)) { - sortedRanges.AppendElement(range); + size_t low = 0; + size_t high = selection->RangeCount(); + + while (high != low) { + size_t middle = low + (high - low) / 2; + + const nsRange* const range = selection->GetRangeAt(middle); + int result = comparator(range); + if (result == 0) { + if (!range->Collapsed()) + return true; + + const nsRange* middlePlus1; + const nsRange* middleMinus1; + // if node end > start of middle+1, result = 1 + if (middle + 1 < high && + (middlePlus1 = selection->GetRangeAt(middle + 1)) && + nsContentUtils::ComparePoints( + aNode, static_cast<int32_t>(aEndOffset), + middlePlus1->GetStartContainer(), + static_cast<int32_t>(middlePlus1->StartOffset())) > 0) { + result = 1; + // if node start < end of middle - 1, result = -1 + } else if (middle >= 1 && + (middleMinus1 = selection->GetRangeAt(middle - 1)) && + nsContentUtils::ComparePoints( + aNode, static_cast<int32_t>(aStartOffset), + middleMinus1->GetEndContainer(), + static_cast<int32_t>(middleMinus1->EndOffset())) < 0) { + result = -1; + } else { + return false; + } + } + + if (result < 0) { + high = middle; + } else { + low = middle + 1; } } - MOZ_ASSERT(!sortedRanges.IsEmpty()); - // Binary search the now sorted ranges. - IsItemInRangeComparator comparator = { aNode, aStartOffset, aEndOffset }; - size_t unused; - if (mozilla::BinarySearchIf(sortedRanges, 0, sortedRanges.Length(), comparator, &unused)) { - return true; - } - sortedRanges.ClearAndRetainStorage(); } } return false; } /****************************************************** * constructor/destructor ******************************************************/
--- a/dom/encoding/FallbackEncoding.cpp +++ b/dom/encoding/FallbackEncoding.cpp @@ -29,16 +29,17 @@ static constexpr nsUConvProp domainsFall static constexpr nsUConvProp nonParticipatingDomains[] = { #include "nonparticipatingdomains.properties.h" }; NS_IMPL_ISUPPORTS(FallbackEncoding, nsIObserver) FallbackEncoding* FallbackEncoding::sInstance = nullptr; bool FallbackEncoding::sGuessFallbackFromTopLevelDomain = true; +bool FallbackEncoding::sFallbackToUTF8ForFile = false; FallbackEncoding::FallbackEncoding() : mFallback(nullptr) { MOZ_ASSERT(!FallbackEncoding::sInstance, "Singleton already exists."); } @@ -134,16 +135,18 @@ FallbackEncoding::Initialize() MOZ_ASSERT(!FallbackEncoding::sInstance, "Initializing pre-existing fallback cache."); FallbackEncoding::sInstance = new FallbackEncoding; Preferences::RegisterCallback(FallbackEncoding::PrefChanged, "intl.charset.fallback.override", nullptr); Preferences::AddBoolVarCache(&sGuessFallbackFromTopLevelDomain, "intl.charset.fallback.tld"); + Preferences::AddBoolVarCache(&sFallbackToUTF8ForFile, + "intl.charset.fallback.utf8_for_file"); nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); if (obs) { obs->AddObserver(sInstance, "intl:requested-locales-changed", true); } } void
--- a/dom/encoding/FallbackEncoding.h +++ b/dom/encoding/FallbackEncoding.h @@ -22,16 +22,21 @@ public: NS_DECL_NSIOBSERVER /** * Whether FromTopLevelDomain() should be used. */ static bool sGuessFallbackFromTopLevelDomain; /** + * Whether UTF-8 should be used for file URLs. + */ + static bool sFallbackToUTF8ForFile; + + /** * Gets the locale-dependent fallback encoding for legacy HTML and plain * text content. * * @param aFallback the outparam for the fallback encoding */ static NotNull<const Encoding*> FromLocale(); /**
--- a/dom/html/nsHTMLDocument.cpp +++ b/dom/html/nsHTMLDocument.cpp @@ -481,16 +481,22 @@ nsHTMLDocument::TryTLD(int32_t& aCharset void nsHTMLDocument::TryFallback(int32_t& aCharsetSource, NotNull<const Encoding*>& aEncoding) { if (kCharsetFromFallback <= aCharsetSource) return; aCharsetSource = kCharsetFromFallback; + bool isFile = false; + if (FallbackEncoding::sFallbackToUTF8ForFile && mDocumentURI && + NS_SUCCEEDED(mDocumentURI->SchemeIs("file", &isFile)) && isFile) { + aEncoding = UTF_8_ENCODING; + return; + } aEncoding = FallbackEncoding::FromLocale(); } void nsHTMLDocument::SetDocumentCharacterSet(NotNull<const Encoding*> aEncoding) { nsDocument::SetDocumentCharacterSet(aEncoding); // Make sure to stash this charset on our channel as needed if it's a wyciwyg
--- a/dom/html/nsHTMLDocument.h +++ b/dom/html/nsHTMLDocument.h @@ -357,18 +357,18 @@ protected: NotNull<const Encoding*>& aEncoding); static void TryCacheCharset(nsICachingChannel* aCachingChannel, int32_t& aCharsetSource, NotNull<const Encoding*>& aEncoding); void TryParentCharset(nsIDocShell* aDocShell, int32_t& charsetSource, NotNull<const Encoding*>& aEncoding); void TryTLD(int32_t& aCharsetSource, NotNull<const Encoding*>& aCharset); - static void TryFallback(int32_t& aCharsetSource, - NotNull<const Encoding*>& aEncoding); + void TryFallback(int32_t& aCharsetSource, + NotNull<const Encoding*>& aEncoding); // Override so we can munge the charset on our wyciwyg channel as needed. virtual void SetDocumentCharacterSet(NotNull<const Encoding*> aEncoding) override; // Tracks if we are currently processing any document.write calls (either // implicit or explicit). Note that if a write call writes out something which // would block the parser, then mWriteLevel will be incorrect until the parser
--- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -1697,30 +1697,32 @@ MediaManager::EnumerateRawDevices(uint64 if (aVideoType == MediaSourceEnum::Camera) { Preferences::GetCString("media.video_loopback_dev", videoLoopDev); } if (aAudioType == MediaSourceEnum::Microphone) { Preferences::GetCString("media.audio_loopback_dev", audioLoopDev); } } + bool hasVideo = aVideoType != MediaSourceEnum::Other; + bool hasAudio = aAudioType != MediaSourceEnum::Other; + bool fakeCams = aFake && aVideoType == MediaSourceEnum::Camera; + bool fakeMics = aFake && aAudioType == MediaSourceEnum::Microphone; + bool realDevicesRequested = (!fakeCams && hasVideo) || (!fakeMics && hasAudio); + RefPtr<Runnable> task = NewTaskFrom([id, aWindowId, audioLoopDev, videoLoopDev, aVideoType, - aAudioType, aFake]() mutable { + aAudioType, hasVideo, hasAudio, + fakeCams, fakeMics, realDevicesRequested]() { // Only enumerate what's asked for, and only fake cams and mics. - bool hasVideo = aVideoType != MediaSourceEnum::Other; - bool hasAudio = aAudioType != MediaSourceEnum::Other; - bool fakeCams = aFake && aVideoType == MediaSourceEnum::Camera; - bool fakeMics = aFake && aAudioType == MediaSourceEnum::Microphone; - RefPtr<MediaEngine> fakeBackend, realBackend; if (fakeCams || fakeMics) { fakeBackend = new MediaEngineDefault(); } - if ((!fakeCams && hasVideo) || (!fakeMics && hasAudio)) { + if (realDevicesRequested) { MediaManager* manager = MediaManager::GetIfExists(); MOZ_RELEASE_ASSERT(manager); // Must exist while media thread is alive realBackend = manager->GetBackend(aWindowId); // We need to listen to this event even JS didn't listen to it. realBackend->AddDeviceChangeCallback(manager); } auto result = MakeUnique<SourceSet>(); @@ -1753,19 +1755,17 @@ MediaManager::EnumerateRawDevices(uint64 RefPtr<PledgeSourceSet> p = mgr->mOutstandingPledges.Remove(id); if (p) { p->Resolve(result.release()); } return NS_OK; })); }); - if (!aFake && - (aVideoType == MediaSourceEnum::Camera || - aAudioType == MediaSourceEnum::Microphone) && + if (realDevicesRequested && Preferences::GetBool("media.navigator.permission.device", false)) { // Need to ask permission to retrieve list of all devices; // notify frontend observer and wait for callback notification to post task. const char16_t* const type = (aVideoType != MediaSourceEnum::Camera) ? u"audio" : (aAudioType != MediaSourceEnum::Microphone) ? u"video" : u"all"; nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); @@ -2506,19 +2506,25 @@ MediaManager::GetUserMedia(nsPIDOMWindow nsString callID; rv = GenerateUUID(callID); NS_ENSURE_SUCCESS(rv, rv); bool fake = c.mFake.WasPassed()? c.mFake.Value() : Preferences::GetBool("media.navigator.streams.fake"); + bool hasVideo = videoType != MediaSourceEnum::Other; + bool hasAudio = audioType != MediaSourceEnum::Other; + bool fakeCams = fake && videoType == MediaSourceEnum::Camera; + bool fakeMics = fake && audioType == MediaSourceEnum::Microphone; + bool realDevicesRequested = (!fakeCams && hasVideo) || (!fakeMics && hasAudio); + bool askPermission = (!privileged || Preferences::GetBool("media.navigator.permission.force")) && - (!fake || Preferences::GetBool("media.navigator.permission.fake")); + (realDevicesRequested || Preferences::GetBool("media.navigator.permission.fake")); RefPtr<PledgeSourceSet> p = EnumerateDevicesImpl(windowID, videoType, audioType, fake); RefPtr<MediaManager> self = this; p->Then([self, onSuccess, onFailure, windowID, c, windowListener, sourceListener, askPermission, prefs, isHTTPS, callID, principalInfo, isChrome, resistFingerprinting](SourceSet*& aDevices) mutable { // grab result
--- a/dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html +++ b/dom/media/webaudio/test/test_mediaElementAudioSourceNodeFidelity.html @@ -41,43 +41,52 @@ function debugCanvas(analyser) { } function checkFrequency(an) { an.getFloatFrequencyData(frequencyArray); // We should have no energy when checking the data largely outside the index // for 440Hz (the frequency of the sine wave), start checking an octave above, // the Opus compression can add some harmonics to the pure since wave. - var index = binIndexForFrequency(880, an); - var underTreshold = true; - for (var i = index; i < frequencyArray.length; i++) { - // Let some slack, there might be some noise here because of int -> float - // conversion or the Opus encoding. - if (frequencyArray[i] > an.minDecibels + 40) { - return false; + var maxNoiseIndex = binIndexForFrequency(880, an); + for (var i = maxNoiseIndex + 1; i < frequencyArray.length; i++) { + if (frequencyArray[i] > frequencyArray[maxNoiseIndex]) { + maxNoiseIndex = i; } } // On the other hand, we should find a peak at 440Hz. Our sine wave is not // attenuated, we're expecting the peak to reach 0dBFs. - index = binIndexForFrequency(440, an); - info("energy at 440: " + frequencyArray[index] + ", threshold " + (an.maxDecibels - 10)); + var index = binIndexForFrequency(440, an); + info("energy at 440: " + frequencyArray[index] + + ", threshold " + (an.maxDecibels - 10) + + "; max noise at index " + maxNoiseIndex + + ": " + frequencyArray[maxNoiseIndex] ); if (frequencyArray[index] < (an.maxDecibels - 10)) { return false; } + // Let some slack, there might be some noise here because of int -> float + // conversion or the Opus encoding. + if (frequencyArray[maxNoiseIndex] > an.minDecibels + 40) { + return false; + } return true; } var audioElement = new Audio(); audioElement.src = 'sine-440-10s.opus' audioElement.loop = true; var ac = new AudioContext(); var mediaElementSource = ac.createMediaElementSource(audioElement); var an = ac.createAnalyser(); +// Use no smoothing as this would just average with previous +// getFloatFrequencyData() calls. Non-seamless looping would introduce noise, +// and smoothing would spread this into calls after the loop point. +an.smoothingTimeConstant = 0; frequencyArray = new Float32Array(an.frequencyBinCount); // Uncomment this to check what the analyser is doing. // debugCanvas(an); mediaElementSource.connect(an) audioElement.play();
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp +++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp @@ -902,17 +902,22 @@ nsEventStatus AsyncPanZoomController::Ha if (!gfxPrefs::APZDragEnabled()) { return nsEventStatus_eIgnore; } if (!GetApzcTreeManager()) { return nsEventStatus_eConsumeNoDefault; } + if (aEvent.mType == MouseInput::MouseType::MOUSE_DOWN) { + SetState(SCROLLBAR_DRAG); + } + if (aEvent.mType == MouseInput::MouseType::MOUSE_UP) { + SetState(NOTHING); ScrollSnap(); } if (aEvent.mType != MouseInput::MouseType::MOUSE_MOVE) { return nsEventStatus_eConsumeNoDefault; } RefPtr<HitTestingTreeNode> node = @@ -1143,16 +1148,17 @@ nsEventStatus AsyncPanZoomController::On case OVERSCROLL_ANIMATION: case WHEEL_SCROLL: case KEYBOARD_SCROLL: case PAN_MOMENTUM: case AUTOSCROLL: MOZ_ASSERT(GetCurrentTouchBlock()); GetCurrentTouchBlock()->GetOverscrollHandoffChain()->CancelAnimations(ExcludeOverscroll); MOZ_FALLTHROUGH; + case SCROLLBAR_DRAG: case NOTHING: { mX.StartTouch(point.x, aEvent.mTime); mY.StartTouch(point.y, aEvent.mTime); if (RefPtr<GeckoContentController> controller = GetGeckoContentController()) { MOZ_ASSERT(GetCurrentTouchBlock()); controller->NotifyAPZStateChange( GetGuid(), APZStateChange::eStartTouch, GetCurrentTouchBlock()->GetOverscrollHandoffChain()->CanBePanned(this)); @@ -1217,16 +1223,17 @@ nsEventStatus AsyncPanZoomController::On // The scale gesture listener should have handled this. NS_WARNING("Gesture listener should have handled pinching in OnTouchMove."); return nsEventStatus_eIgnore; case WHEEL_SCROLL: case KEYBOARD_SCROLL: case OVERSCROLL_ANIMATION: case AUTOSCROLL: + case SCROLLBAR_DRAG: // Should not receive a touch-move in the OVERSCROLL_ANIMATION state // as touch blocks that begin in an overscrolled state cancel the // animation. The same is true for wheel scroll animations. NS_WARNING("Received impossible touch in OnTouchMove"); break; } return nsEventStatus_eConsumeNoDefault; @@ -1299,16 +1306,17 @@ nsEventStatus AsyncPanZoomController::On // Scale gesture listener should have handled this. NS_WARNING("Gesture listener should have handled pinching in OnTouchEnd."); return nsEventStatus_eIgnore; case WHEEL_SCROLL: case KEYBOARD_SCROLL: case OVERSCROLL_ANIMATION: case AUTOSCROLL: + case SCROLLBAR_DRAG: // Should not receive a touch-end in the OVERSCROLL_ANIMATION state // as touch blocks that begin in an overscrolled state cancel the // animation. The same is true for WHEEL_SCROLL. NS_WARNING("Received impossible touch in OnTouchEnd"); break; } return nsEventStatus_eConsumeNoDefault;
--- a/gfx/layers/apz/src/AsyncPanZoomController.h +++ b/gfx/layers/apz/src/AsyncPanZoomController.h @@ -923,17 +923,18 @@ protected: PINCHING, /* nth touch-start, where n > 1. this mode allows pan and zoom */ ANIMATING_ZOOM, /* animated zoom to a new rect */ OVERSCROLL_ANIMATION, /* Spring-based animation used to relieve overscroll once the finger is lifted. */ SMOOTH_SCROLL, /* Smooth scrolling to destination. Used by CSSOM-View smooth scroll-behavior */ WHEEL_SCROLL, /* Smooth scrolling to a destination for a wheel event. */ KEYBOARD_SCROLL, /* Smooth scrolling to a destination for a keyboard event. */ - AUTOSCROLL /* Autoscroll animation. */ + AUTOSCROLL, /* Autoscroll animation. */ + SCROLLBAR_DRAG /* Async scrollbar drag. */ }; // This is in theory protected by |mRecursiveMutex|; that is, it should be held whenever // this is updated. In practice though... see bug 897017. PanZoomState mState; private: friend class StateChangeNotificationBlocker; /**
--- a/js/xpconnect/src/nsXPConnect.cpp +++ b/js/xpconnect/src/nsXPConnect.cpp @@ -1127,23 +1127,16 @@ nsXPConnect::ReadFunction(nsIObjectInput /* These are here to be callable from a debugger */ extern "C" { JS_EXPORT_API(void) DumpJSStack() { xpc_DumpJSStack(true, true, false); } -JS_EXPORT_API(const char*) PrintJSStack() -{ - if (JSContext* cx = nsContentUtils::GetCurrentJSContext()) - return xpc_PrintJSStack(cx, true, true, false).release(); - return "There is no JSContext on the stack.\n"; -} - JS_EXPORT_API(void) DumpCompleteHeap() { nsCOMPtr<nsICycleCollectorListener> listener = do_CreateInstance("@mozilla.org/cycle-collector-logger;1"); if (!listener) { NS_WARNING("Failed to create CC logger"); return; }
--- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -3645,18 +3645,18 @@ ScrollFrameHelper::BuildDisplayList(nsDi // a displayport for this frame. We'll add the item later on. if (!mWillBuildScrollableLayer) { int32_t zIndex = MaxZIndexInListOfItemsContainedInFrame(scrolledContent.PositionedDescendants(), mOuter); if (aBuilder->BuildCompositorHitTestInfo()) { CompositorHitTestInfo info = CompositorHitTestInfo::eVisibleToHitTest | CompositorHitTestInfo::eDispatchToContent; nsDisplayCompositorHitTestInfo* hitInfo = - new (aBuilder) nsDisplayCompositorHitTestInfo(aBuilder, mScrolledFrame, info, 1); - hitInfo->SetArea(mScrollPort + aBuilder->ToReferenceFrame(mOuter)); + new (aBuilder) nsDisplayCompositorHitTestInfo(aBuilder, mScrolledFrame, info, 1, + Some(mScrollPort + aBuilder->ToReferenceFrame(mOuter))); AppendInternalItemToTop(scrolledContent, hitInfo, zIndex); } if (aBuilder->IsBuildingLayerEventRegions()) { nsDisplayLayerEventRegions* inactiveRegionItem = new (aBuilder) nsDisplayLayerEventRegions(aBuilder, mScrolledFrame, 1); inactiveRegionItem->AddInactiveScrollPort(mScrolledFrame, mScrollPort + aBuilder->ToReferenceFrame(mOuter)); AppendInternalItemToTop(scrolledContent, inactiveRegionItem, zIndex); }
--- a/layout/painting/nsDisplayList.cpp +++ b/layout/painting/nsDisplayList.cpp @@ -4939,17 +4939,18 @@ nsDisplayEventReceiver::CreateWebRenderC // list for WebRender consumption, so this function should never get called. MOZ_ASSERT(false); return true; } nsDisplayCompositorHitTestInfo::nsDisplayCompositorHitTestInfo(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, mozilla::gfx::CompositorHitTestInfo aHitTestInfo, - uint32_t aIndex) + uint32_t aIndex, + const mozilla::Maybe<nsRect>& aArea) : nsDisplayEventReceiver(aBuilder, aFrame) , mHitTestInfo(aHitTestInfo) , mIndex(aIndex) { MOZ_COUNT_CTOR(nsDisplayCompositorHitTestInfo); // We should never even create this display item if we're not building // compositor hit-test info or if the computed hit info indicated the // frame is invisible to hit-testing @@ -4957,56 +4958,55 @@ nsDisplayCompositorHitTestInfo::nsDispla MOZ_ASSERT(mHitTestInfo != mozilla::gfx::CompositorHitTestInfo::eInvisibleToHitTest); if (aBuilder->GetCurrentScrollbarFlags() != nsDisplayOwnLayerFlags::eNone) { // In the case of scrollbar frames, we use the scrollbar's target scrollframe // instead of the scrollframe with which the scrollbar actually moves. MOZ_ASSERT(mHitTestInfo & CompositorHitTestInfo::eScrollbar); mScrollTarget = Some(aBuilder->GetCurrentScrollbarTarget()); } -} - -void -nsDisplayCompositorHitTestInfo::SetArea(const nsRect& aArea) -{ - mArea = Some(aArea); + + if (aArea.isSome()) { + mArea = *aArea; + } else { + nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetScrollableFrameFor(mFrame); + if (scrollFrame) { + // If the frame is content of a scrollframe, then we need to pick up the + // area corresponding to the overflow rect as well. Otherwise the parts of + // the overflow that are not occupied by descendants get skipped and the + // APZ code sends touch events to the content underneath instead. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=1127773#c15. + mArea = mFrame->GetScrollableOverflowRect(); + } else { + mArea = nsRect(nsPoint(0, 0), mFrame->GetSize()); + } + + // Note that it's important to do this call to ToReferenceFrame here in the + // nsDisplayCompositorHitTestInfo constructor, because then we'll hit the good + // fast path (because aBuilder will already have the info we want cached). + // This is as opposed to, say, calling it in CreateWebRenderCommands where + // we would not hit the fast path. + mArea += aBuilder->ToReferenceFrame(mFrame); + } } bool nsDisplayCompositorHitTestInfo::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder, mozilla::wr::IpcResourceUpdateQueue& aResources, const StackingContextHelper& aSc, mozilla::layers::WebRenderLayerManager* aManager, nsDisplayListBuilder* aDisplayListBuilder) { - if (mArea.isNothing()) { - nsRect borderBox; - nsIScrollableFrame* scrollFrame = nsLayoutUtils::GetScrollableFrameFor(mFrame); - if (scrollFrame) { - // If the frame is content of a scrollframe, then we need to pick up the - // area corresponding to the overflow rect as well. Otherwise the parts of - // the overflow that are not occupied by descendants get skipped and the - // APZ code sends touch events to the content underneath instead. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=1127773#c15. - borderBox = mFrame->GetScrollableOverflowRect(); - } else { - borderBox = nsRect(nsPoint(0, 0), mFrame->GetSize()); - } - - if (borderBox.IsEmpty()) { - return true; - } - - mArea = Some(borderBox + aDisplayListBuilder->ToReferenceFrame(mFrame)); - } - - MOZ_ASSERT(mArea.isSome()); + if (mArea.IsEmpty()) { + return true; + } + wr::LayoutRect rect = aSc.ToRelativeLayoutRect( LayoutDeviceRect::FromAppUnits( - *mArea, + mArea, mFrame->PresContext()->AppUnitsPerDevPixel())); // XXX: eventually this scrollId computation and the SetHitTestInfo // call will get moved out into the WR display item iteration code so that // we don't need to do it as often, and so that we can do it for other // display item types as well (reducing the need for as many instances of // this display item). FrameMetrics::ViewID scrollId = mScrollTarget.valueOrFrom(
--- a/layout/painting/nsDisplayList.h +++ b/layout/painting/nsDisplayList.h @@ -4353,44 +4353,44 @@ public: * this gets built when we're doing widget painting and we need to send the * compositor some hit-test info for a frame. This is effectively a dummy item * whose sole purpose is to carry the hit-test info to the compositor. */ class nsDisplayCompositorHitTestInfo : public nsDisplayEventReceiver { public: nsDisplayCompositorHitTestInfo(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, mozilla::gfx::CompositorHitTestInfo aHitTestInfo, - uint32_t aIndex = 0); + uint32_t aIndex = 0, + const mozilla::Maybe<nsRect>& aArea = mozilla::Nothing()); #ifdef NS_BUILD_REFCNT_LOGGING virtual ~nsDisplayCompositorHitTestInfo() { MOZ_COUNT_DTOR(nsDisplayCompositorHitTestInfo); } #endif mozilla::gfx::CompositorHitTestInfo HitTestInfo() const { return mHitTestInfo; } - void SetArea(const nsRect& aArea); bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder, mozilla::wr::IpcResourceUpdateQueue& aResources, const StackingContextHelper& aSc, mozilla::layers::WebRenderLayerManager* aManager, nsDisplayListBuilder* aDisplayListBuilder) override; void WriteDebugInfo(std::stringstream& aStream) override; uint32_t GetPerFrameKey() const override; int32_t ZIndex() const override; void SetOverrideZIndex(int32_t aZIndex); NS_DISPLAY_DECL_NAME("CompositorHitTestInfo", TYPE_COMPOSITOR_HITTEST_INFO) private: mozilla::gfx::CompositorHitTestInfo mHitTestInfo; mozilla::Maybe<mozilla::layers::FrameMetrics::ViewID> mScrollTarget; - mozilla::Maybe<nsRect> mArea; + nsRect mArea; uint32_t mIndex; mozilla::Maybe<int32_t> mOverrideZIndex; }; /** * A display item that tracks event-sensitive regions which will be set * on the ContainerLayer that eventually contains this item. *
--- a/layout/printing/DrawEventRecorder.cpp +++ b/layout/printing/DrawEventRecorder.cpp @@ -14,22 +14,16 @@ DrawEventRecorderPRFileDesc::RecordEvent { WriteElement(mOutputStream, aEvent.GetType()); aEvent.RecordToStream(mOutputStream); Flush(); } -DrawEventRecorderPRFileDesc::DrawEventRecorderPRFileDesc(const char* aFilename) -{ - mOutputStream.Open(aFilename); - WriteHeader(mOutputStream); -} - DrawEventRecorderPRFileDesc::~DrawEventRecorderPRFileDesc() { if (IsOpen()) { Close(); } } void @@ -40,21 +34,21 @@ DrawEventRecorderPRFileDesc::Flush() bool DrawEventRecorderPRFileDesc::IsOpen() { return mOutputStream.IsOpen(); } void -DrawEventRecorderPRFileDesc::OpenNew(const char* aFilename) +DrawEventRecorderPRFileDesc::OpenFD(PRFileDesc* aFd) { MOZ_ASSERT(!IsOpen()); - mOutputStream.Open(aFilename); + mOutputStream.OpenFD(aFd); WriteHeader(mOutputStream); } void DrawEventRecorderPRFileDesc::Close() { MOZ_ASSERT(IsOpen());
--- a/layout/printing/DrawEventRecorder.h +++ b/layout/printing/DrawEventRecorder.h @@ -20,19 +20,20 @@ class PRFileDescStream : public mozilla: // Most writes, as seen in the print IPC use case, are very small (<32 bytes), // with a small number of very large (>40KB) writes. Writes larger than this // value are not buffered. static const size_t kBufferSize = 1024; public: PRFileDescStream() : mFd(nullptr), mBuffer(nullptr), mBufferPos(0), mGood(true) {} - void Open(const char* aFilename) { + void OpenFD(PRFileDesc* aFd) + { MOZ_ASSERT(!IsOpen()); - mFd = PR_Open(aFilename, PR_RDWR | PR_CREATE_FILE, PR_IRUSR | PR_IWUSR); + mFd = aFd; mGood = true; mBuffer.reset(new uint8_t[kBufferSize]); mBufferPos = 0; } void Close() { // We need to be API compatible with std::ostream, and so we silently handle // closes on a closed FD. @@ -113,32 +114,30 @@ private: size_t mBufferPos; bool mGood; }; class DrawEventRecorderPRFileDesc : public gfx::DrawEventRecorderPrivate { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawEventRecorderPRFileDesc, override) - explicit DrawEventRecorderPRFileDesc(const char* aFilename); + explicit DrawEventRecorderPRFileDesc(){}; ~DrawEventRecorderPRFileDesc(); void RecordEvent(const gfx::RecordedEvent& aEvent) override; /** * Returns whether a recording file is currently open. */ bool IsOpen(); /** - * Opens new file with the provided name. The recorder does NOT forget which - * objects it has recorded. This can be used with Close, so that a recording - * can be processed in chunks. The file must not already be open. + * Opens the recorder with the provided PRFileDesc *. */ - void OpenNew(const char* aFilename); + void OpenFD(PRFileDesc* aFd); /** * Closes the file so that it can be processed. The recorder does NOT forget * which objects it has recorded. This can be used with OpenNew, so that a * recording can be processed in chunks. The file must be open. */ void Close();
--- a/layout/printing/ipc/PRemotePrintJob.ipdl +++ b/layout/printing/ipc/PRemotePrintJob.ipdl @@ -17,19 +17,19 @@ both: // Tell either side to abort printing and clean up. async AbortPrint(nsresult aRv); parent: // Initialize the real print device with the given information. async InitializePrint(nsString aDocumentTitle, nsString aPrintToFile, int32_t aStartPage, int32_t aEndPage); - // Translate the stored page recording and play back the events to the real - // print device. - async ProcessPage(nsCString aPageFileName); + // Translate the page recording writen into |fd| and play back the events to + // the real print device. + async ProcessPage(); // This informs the real print device that we've finished, so it can trigger // the actual print. async FinalizePrint(); // Report a state change to listeners in the parent process. async StateChange(long aStateFlags, nsresult aStatus); @@ -40,19 +40,21 @@ parent: long aCurTotalProgress, long aMaxTotalProgress); // Report a status change to listeners in the parent process. async StatusChange(nsresult aStatus); child: // Inform the child that the print has been initialized in the parent or has - // failed with result aRv. - async PrintInitializationResult(nsresult aRv); + // failed with result aRv. Includes a file descriptor which the first page + // can be written to. + async PrintInitializationResult(nsresult aRv, FileDescriptor aFd); - // Inform the child that the latest page has been processed remotely. - async PageProcessed(); + // Inform the child that the latest page has been processed remotely. Includes + // a file descriptor which the next page can be written to. + async PageProcessed(FileDescriptor aFd); async __delete__(); }; } // namespace layout } // namespace mozilla
--- a/layout/printing/ipc/RemotePrintJobChild.cpp +++ b/layout/printing/ipc/RemotePrintJobChild.cpp @@ -4,16 +4,17 @@ * 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 "RemotePrintJobChild.h" #include "mozilla/Unused.h" #include "nsPagePrintTimer.h" #include "nsPrintEngine.h" +#include "private/pprio.h" namespace mozilla { namespace layout { NS_IMPL_ISUPPORTS(RemotePrintJobChild, nsIWebProgressListener) RemotePrintJobChild::RemotePrintJobChild() @@ -31,36 +32,58 @@ RemotePrintJobChild::InitializePrint(con Unused << SendInitializePrint(aDocumentTitle, aPrintToFile, aStartPage, aEndPage); mozilla::SpinEventLoopUntil([&]() { return mPrintInitialized; }); return mInitializationResult; } mozilla::ipc::IPCResult -RemotePrintJobChild::RecvPrintInitializationResult(const nsresult& aRv) +RemotePrintJobChild::RecvPrintInitializationResult( + const nsresult& aRv, + const mozilla::ipc::FileDescriptor& aFd) { mPrintInitialized = true; mInitializationResult = aRv; + if (NS_SUCCEEDED(aRv)) { + SetNextPageFD(aFd); + } return IPC_OK(); } +PRFileDesc* +RemotePrintJobChild::GetNextPageFD() +{ + MOZ_ASSERT(mNextPageFD); + PRFileDesc* fd = mNextPageFD; + mNextPageFD = nullptr; + return fd; +} + void -RemotePrintJobChild::ProcessPage(const nsCString& aPageFileName) +RemotePrintJobChild::SetNextPageFD(const mozilla::ipc::FileDescriptor& aFd) +{ + auto handle = aFd.ClonePlatformHandle(); + mNextPageFD = PR_ImportFile(PROsfd(handle.release())); +} + +void +RemotePrintJobChild::ProcessPage() { MOZ_ASSERT(mPagePrintTimer); mPagePrintTimer->WaitForRemotePrint(); - Unused << SendProcessPage(aPageFileName); + Unused << SendProcessPage(); } mozilla::ipc::IPCResult -RemotePrintJobChild::RecvPageProcessed() +RemotePrintJobChild::RecvPageProcessed(const mozilla::ipc::FileDescriptor& aFd) { MOZ_ASSERT(mPagePrintTimer); + SetNextPageFD(aFd); mPagePrintTimer->RemotePrintFinished(); return IPC_OK(); } mozilla::ipc::IPCResult RemotePrintJobChild::RecvAbortPrint(const nsresult& aRv) {
--- a/layout/printing/ipc/RemotePrintJobChild.h +++ b/layout/printing/ipc/RemotePrintJobChild.h @@ -29,33 +29,39 @@ public: void ActorDestroy(ActorDestroyReason aWhy) final; nsresult InitializePrint(const nsString& aDocumentTitle, const nsString& aPrintToFile, const int32_t& aStartPage, const int32_t& aEndPage); - mozilla::ipc::IPCResult RecvPrintInitializationResult(const nsresult& aRv) final; + mozilla::ipc::IPCResult RecvPrintInitializationResult( + const nsresult& aRv, + const FileDescriptor& aFd) final; - void ProcessPage(const nsCString& aPageFileName); + void ProcessPage(); - mozilla::ipc::IPCResult RecvPageProcessed() final; + mozilla::ipc::IPCResult RecvPageProcessed(const FileDescriptor& aFd) final; mozilla::ipc::IPCResult RecvAbortPrint(const nsresult& aRv) final; void SetPagePrintTimer(nsPagePrintTimer* aPagePrintTimer); void SetPrintEngine(nsPrintEngine* aPrintEngine); + PRFileDesc* GetNextPageFD(); + private: ~RemotePrintJobChild() final; + void SetNextPageFD(const mozilla::ipc::FileDescriptor& aFd); bool mPrintInitialized = false; nsresult mInitializationResult = NS_OK; RefPtr<nsPagePrintTimer> mPagePrintTimer; RefPtr<nsPrintEngine> mPrintEngine; + PRFileDesc* mNextPageFD = nullptr; }; } // namespace layout } // namespace mozilla #endif // mozilla_layout_RemotePrintJobChild_h
--- a/layout/printing/ipc/RemotePrintJobParent.cpp +++ b/layout/printing/ipc/RemotePrintJobParent.cpp @@ -14,16 +14,18 @@ #include "nsAppDirectoryServiceDefs.h" #include "nsComponentManagerUtils.h" #include "nsDirectoryServiceUtils.h" #include "nsDeviceContext.h" #include "nsIDeviceContextSpec.h" #include "nsIPrintSettings.h" #include "nsIWebProgressListener.h" #include "PrintTranslator.h" +#include "private/pprio.h" +#include "nsAnonymousTemporaryFile.h" namespace mozilla { namespace layout { RemotePrintJobParent::RemotePrintJobParent(nsIPrintSettings* aPrintSettings) : mPrintSettings(aPrintSettings) { MOZ_COUNT_CTOR(RemotePrintJobParent); @@ -33,24 +35,31 @@ mozilla::ipc::IPCResult RemotePrintJobParent::RecvInitializePrint(const nsString& aDocumentTitle, const nsString& aPrintToFile, const int32_t& aStartPage, const int32_t& aEndPage) { nsresult rv = InitializePrintDevice(aDocumentTitle, aPrintToFile, aStartPage, aEndPage); if (NS_FAILED(rv)) { - Unused << SendPrintInitializationResult(rv); + Unused << SendPrintInitializationResult(rv, FileDescriptor()); Unused << Send__delete__(this); return IPC_OK(); } mPrintTranslator.reset(new PrintTranslator(mPrintDeviceContext)); - Unused << SendPrintInitializationResult(NS_OK); + FileDescriptor fd; + rv = PrepareNextPageFD(&fd); + if (NS_FAILED(rv)) { + Unused << SendPrintInitializationResult(rv, FileDescriptor()); + Unused << Send__delete__(this); + return IPC_OK(); + } + Unused << SendPrintInitializationResult(NS_OK, fd); return IPC_OK(); } nsresult RemotePrintJobParent::InitializePrintDevice(const nsString& aDocumentTitle, const nsString& aPrintToFile, const int32_t& aStartPage, const int32_t& aEndPage) @@ -77,76 +86,75 @@ RemotePrintJobParent::InitializePrintDev aStartPage, aEndPage); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } return NS_OK; } +nsresult +RemotePrintJobParent::PrepareNextPageFD(FileDescriptor* aFd) +{ + PRFileDesc* prFd = nullptr; + nsresult rv = NS_OpenAnonymousTemporaryFile(&prFd); + if (NS_FAILED(rv)) { + return rv; + } + *aFd = FileDescriptor( + FileDescriptor::PlatformHandleType(PR_FileDesc2NativeHandle(prFd))); + mCurrentPageStream.OpenFD(prFd); + return NS_OK; +} + mozilla::ipc::IPCResult -RemotePrintJobParent::RecvProcessPage(const nsCString& aPageFileName) +RemotePrintJobParent::RecvProcessPage() { - nsresult rv = PrintPage(aPageFileName); + if (!mCurrentPageStream.IsOpen()) { + Unused << SendAbortPrint(NS_ERROR_FAILURE); + return IPC_OK(); + } + mCurrentPageStream.Seek(0, PR_SEEK_SET); + nsresult rv = PrintPage(mCurrentPageStream); + mCurrentPageStream.Close(); if (NS_FAILED(rv)) { Unused << SendAbortPrint(rv); - } else { - Unused << SendPageProcessed(); + return IPC_OK(); } + FileDescriptor fd; + rv = PrepareNextPageFD(&fd); + if (NS_FAILED(rv)) { + Unused << SendAbortPrint(rv); + return IPC_OK(); + } + + Unused << SendPageProcessed(fd); return IPC_OK(); } nsresult -RemotePrintJobParent::PrintPage(const nsCString& aPageFileName) +RemotePrintJobParent::PrintPage(PRFileDescStream& aRecording) { MOZ_ASSERT(mPrintDeviceContext); nsresult rv = mPrintDeviceContext->BeginPage(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - - nsCOMPtr<nsIFile> recordingFile; - rv = NS_GetSpecialDirectory(NS_APP_CONTENT_PROCESS_TEMP_DIR, - getter_AddRefs(recordingFile)); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - rv = recordingFile->AppendNative(aPageFileName); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - nsAutoCString recordingPath; - rv = recordingFile->GetNativePath(recordingPath); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - - PRFileDescStream recording; - recording.Open(recordingPath.get()); - MOZ_ASSERT(recording.IsOpen()); - if (!mPrintTranslator->TranslateRecording(recording)) { + if (!mPrintTranslator->TranslateRecording(aRecording)) { return NS_ERROR_FAILURE; } rv = mPrintDeviceContext->EndPage(); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - recording.Close(); - rv = recordingFile->Remove(/* recursive= */ false); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - return NS_OK; } mozilla::ipc::IPCResult RemotePrintJobParent::RecvFinalizePrint() { // EndDocument is sometimes called in the child even when BeginDocument has // not been called. See bug 1223332.
--- a/layout/printing/ipc/RemotePrintJobParent.h +++ b/layout/printing/ipc/RemotePrintJobParent.h @@ -3,21 +3,23 @@ /* 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 mozilla_layout_RemotePrintJobParent_h #define mozilla_layout_RemotePrintJobParent_h #include "mozilla/layout/PRemotePrintJobParent.h" +#include "mozilla/layout/printing/DrawEventRecorder.h" #include "nsCOMArray.h" #include "nsCOMPtr.h" #include "mozilla/RefPtr.h" #include "mozilla/UniquePtr.h" +#include "mozilla/gfx/RecordedEvent.h" class nsDeviceContext; class nsIPrintSettings; class nsIWebProgressListener; class PrintTranslator; namespace mozilla { namespace layout { @@ -29,17 +31,17 @@ public: void ActorDestroy(ActorDestroyReason aWhy) final; mozilla::ipc::IPCResult RecvInitializePrint(const nsString& aDocumentTitle, const nsString& aPrintToFile, const int32_t& aStartPage, const int32_t& aEndPage) final; - mozilla::ipc::IPCResult RecvProcessPage(const nsCString& aPageFileName) final; + mozilla::ipc::IPCResult RecvProcessPage() final; mozilla::ipc::IPCResult RecvFinalizePrint() final; mozilla::ipc::IPCResult RecvAbortPrint(const nsresult& aRv) final; mozilla::ipc::IPCResult RecvStateChange(const long& aStateFlags, const nsresult& aStatus) final; @@ -65,20 +67,23 @@ public: private: ~RemotePrintJobParent() final; nsresult InitializePrintDevice(const nsString& aDocumentTitle, const nsString& aPrintToFile, const int32_t& aStartPage, const int32_t& aEndPage); - nsresult PrintPage(const nsCString& aPageFileName); + nsresult PrepareNextPageFD(FileDescriptor* aFd); + + nsresult PrintPage(PRFileDescStream& aRecording); nsCOMPtr<nsIPrintSettings> mPrintSettings; RefPtr<nsDeviceContext> mPrintDeviceContext; UniquePtr<PrintTranslator> mPrintTranslator; nsCOMArray<nsIWebProgressListener> mPrintProgressListeners; + PRFileDescStream mCurrentPageStream; }; } // namespace layout } // namespace mozilla #endif // mozilla_layout_RemotePrintJobParent_h
--- a/layout/printing/nsPagePrintTimer.cpp +++ b/layout/printing/nsPagePrintTimer.cpp @@ -140,17 +140,18 @@ nsPagePrintTimer::Notify(nsITimer *timer if (mWatchDogCount > WATCH_DOG_MAX_COUNT) { Fail(); return NS_OK; } } if (mDocViewerPrint) { bool donePrePrint = true; - if (mPrintEngine) { + // Don't start to pre-print if we're waiting on the parent still. + if (mPrintEngine && !mWaitingForRemotePrint) { donePrePrint = mPrintEngine->PrePrintPage(); } if (donePrePrint && !mWaitingForRemotePrint) { StopWatchDogTimer(); // Pass nullptr here since name already was set in constructor. mDocument->Dispatch(TaskCategory::Other, do_AddRef(this)); } else {
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp +++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp @@ -45,23 +45,16 @@ namespace mozilla { using namespace dom; static const char* pcmLogTag = "PeerConnectionMedia"; #ifdef LOGTAG #undef LOGTAG #endif #define LOGTAG pcmLogTag -//XXX(pkerr) What about bitrate settings? Going with the defaults for now. -RefPtr<WebRtcCallWrapper> -CreateCall() -{ - return WebRtcCallWrapper::Create(); -} - NS_IMETHODIMP PeerConnectionMedia::ProtocolProxyQueryHandler:: OnProxyAvailable(nsICancelable *request, nsIChannel *aChannel, nsIProxyInfo *proxyinfo, nsresult result) { if (!pcm_->mProxyRequest) { // PeerConnectionMedia is no longer waiting @@ -289,19 +282,16 @@ nsresult PeerConnectionMedia::Init(const } if (NS_FAILED(rv = mIceCtxHdlr->ctx()->SetResolver(mDNSResolver->AllocateResolver()))) { CSFLogError(LOGTAG, "%s: Failed to get dns resolver", __FUNCTION__); return rv; } ConnectSignals(mIceCtxHdlr->ctx().get()); - // This webrtc:Call instance will be shared by audio and video media conduits. - mCall = CreateCall(); - return NS_OK; } void PeerConnectionMedia::EnsureTransports(const JsepSession& aSession) { for (const auto& transceiver : aSession.GetTransceivers()) { if (!transceiver->HasLevel()) { @@ -1140,16 +1130,20 @@ PeerConnectionMedia::ShutdownMediaTransp nsresult PeerConnectionMedia::AddTransceiver( JsepTransceiver* aJsepTransceiver, DOMMediaStream& aReceiveStream, dom::MediaStreamTrack* aSendTrack, RefPtr<TransceiverImpl>* aTransceiverImpl) { + if (!mCall) { + mCall = WebRtcCallWrapper::Create(); + } + RefPtr<TransceiverImpl> transceiver = new TransceiverImpl( mParent->GetHandle(), aJsepTransceiver, mMainThread.get(), mSTSThread.get(), aReceiveStream, aSendTrack, mCall.get());
new file mode 100644 --- /dev/null +++ b/mobile/android/app/src/main/res/values-v21/integers.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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/. --> + +<resources> + + <integer name="assist_launch_icon_res">@drawable/icon</integer> + +</resources>
--- a/mobile/android/app/src/main/res/values/integers.xml +++ b/mobile/android/app/src/main/res/values/integers.xml @@ -8,10 +8,11 @@ <integer name="number_of_top_sites">6</integer> <integer name="number_of_top_sites_cols">2</integer> <integer name="max_icon_grid_columns">4</integer> <integer name="panel_icon_grid_view_columns">3</integer> <integer name="number_of_inline_share_devices">2</integer> <integer name="max_search_suggestions">2</integer> <integer name="max_saved_suggestions">2</integer> <integer name="shift_duration_suggestion">500</integer> + <integer name="assist_launch_icon_res">0</integer> </resources>
--- a/mobile/android/base/AndroidManifest.xml.in +++ b/mobile/android/base/AndroidManifest.xml.in @@ -137,16 +137,32 @@ <action android:name="android.intent.action.WEB_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="" /> <data android:scheme="http" /> <data android:scheme="https" /> </intent-filter> + <intent-filter> + <action android:name="android.intent.action.ASSIST"/> + <category android:name="android.intent.category.DEFAULT"/> + </intent-filter> + + <!-- Pre Lollipop devices display a generic search icon, if none is + provided here. To use this we need to set the resource to 0. + For Lollipop and later the search launcher icon ist used. + To retrieve the resource value the Bundle.getInt() method is + used, so we use integer resources instead of drawables, because + setting a drawable referenced to 0 results in errors when used + as a real drawable resource somewhere else. --> + <meta-data + android:name="com.android.systemui.action_assist_icon" + android:resource="@integer/assist_launch_icon_res"/> + <!-- For XPI installs from websites and the download manager. --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:mimeType="application/x-xpinstall" />
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java @@ -430,25 +430,27 @@ public class BrowserApp extends GeckoApp case MENU_UPDATED: if (Tabs.getInstance().isSelectedTab(tab)) { invalidateOptionsMenu(); } break; case PAGE_SHOW: tab.loadFavicon(); break; - case UNSELECTED: // We receive UNSELECTED immediately after the SELECTED listeners run // so we are ensured that the unselectedTabEditingText has not changed. if (tab.isEditing()) { // Copy to avoid constructing new objects. tab.getEditingState().copyFrom(mLastTabEditingState); } break; + case START_EDITING: + enterEditingMode(); + break; } if (HardwareUtils.isTablet() && msg == TabEvents.SELECTED) { updateEditingModeForTab(tab); } super.onTabChanged(tab, msg, data); }
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java +++ b/mobile/android/base/java/org/mozilla/gecko/GeckoApp.java @@ -1406,18 +1406,20 @@ public abstract class GeckoApp extends G mWasFirstTabShownAfterActivityUnhidden = true; // Reset since we'll be loading a tab. final SafeIntent intent = new SafeIntent(getIntent()); final String action = intent.getAction(); final String passedUri = getIntentURI(intent); - final boolean isExternalURL = passedUri != null; - final boolean isAboutHomeURL = isExternalURL && AboutPages.isAboutHome(passedUri); + final boolean intentHasURL = passedUri != null; + final boolean isAboutHomeURL = intentHasURL && AboutPages.isAboutHome(passedUri); + final boolean isAssistIntent = Intent.ACTION_ASSIST.equals(action); + final boolean needsNewForegroundTab = intentHasURL || isAssistIntent; // Start migrating as early as possible, can do this in // parallel with Gecko load. checkMigrateProfile(); initializeChrome(); // We need to wait here because mShouldRestore can revert back to @@ -1433,24 +1435,26 @@ public abstract class GeckoApp extends G } } if (mIsRestoringActivity && hasGeckoTab(intent)) { Tabs.getInstance().notifyListeners(null, Tabs.TabEvents.RESTORED); handleSelectTabIntent(intent); // External URLs and new tab from widget should always be loaded regardless of whether Gecko is // already running. - } else if (isExternalURL) { + } else if (needsNewForegroundTab) { // Restore tabs before opening an external URL so that the new tab // is animated properly. Tabs.getInstance().notifyListeners(null, Tabs.TabEvents.RESTORED); processActionViewIntent(new Runnable() { @Override public void run() { - if (isAboutHomeURL) { + if (isAssistIntent) { + Tabs.getInstance().addTab(Tabs.LOADURL_START_EDITING | Tabs.LOADURL_EXTERNAL); + } else if (isAboutHomeURL) { // respect the user preferences for about:home from external intent calls loadStartupTab(Tabs.LOADURL_NEW_TAB, action); } else { final int flags = getNewTabFlags(); loadStartupTab(passedUri, intent, flags); } } }); @@ -1775,16 +1779,18 @@ public abstract class GeckoApp extends G final String url = intent.getDataString(); int flags = Tabs.LOADURL_NEW_TAB | Tabs.LOADURL_USER_ENTERED | Tabs.LOADURL_EXTERNAL; if (isFirstTab) { flags |= Tabs.LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN; } Tabs.getInstance().loadUrlWithIntentExtras(url, intent, flags); } }); + } else if (Intent.ACTION_ASSIST.equals(action)) { + Tabs.getInstance().addTab(Tabs.LOADURL_START_EDITING | Tabs.LOADURL_EXTERNAL); } else if (ACTION_HOMESCREEN_SHORTCUT.equals(action)) { final GeckoBundle data = new GeckoBundle(2); data.putString("uri", uri); data.putString("flags", "OPEN_SWITCHTAB"); getAppEventDispatcher().dispatch("Tab:OpenUri", data); } else if (Intent.ACTION_SEARCH.equals(action)) { final GeckoBundle data = new GeckoBundle(2); data.putString("uri", uri);
--- a/mobile/android/base/java/org/mozilla/gecko/Tabs.java +++ b/mobile/android/base/java/org/mozilla/gecko/Tabs.java @@ -79,16 +79,18 @@ public class Tabs implements BundleEvent public static final int LOADURL_PINNED = 1 << 3; public static final int LOADURL_DELAY_LOAD = 1 << 4; public static final int LOADURL_DESKTOP = 1 << 5; public static final int LOADURL_BACKGROUND = 1 << 6; /** Indicates the url has been specified by a source external to the app. */ public static final int LOADURL_EXTERNAL = 1 << 7; /** Indicates the tab is the first shown after Firefox is hidden and restored. */ public static final int LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN = 1 << 8; + /** Indicates that we should enter editing mode after opening the tab. */ + public static final int LOADURL_START_EDITING = 1 << 9; private static final long PERSIST_TABS_AFTER_MILLISECONDS = 1000 * 2; public static final int INVALID_TAB_ID = -1; // Used to indicate a new tab should be appended to the current tabs. public static final int NEW_LAST_INDEX = -1; private static final AtomicInteger sTabId = new AtomicInteger(0); @@ -753,17 +755,18 @@ public class Tabs implements BundleEvent SECURITY_CHANGE, DESKTOP_MODE_CHANGE, RECORDING_CHANGE, BOOKMARK_ADDED, BOOKMARK_REMOVED, AUDIO_PLAYING_CHANGE, OPENED_FROM_TABS_TRAY, MEDIA_PLAYING_CHANGE, - MEDIA_PLAYING_RESUME + MEDIA_PLAYING_RESUME, + START_EDITING, } public void notifyListeners(Tab tab, TabEvents msg) { notifyListeners(tab, msg, ""); } public void notifyListeners(final Tab tab, final TabEvents msg, final String data) { if (tab == null && @@ -982,16 +985,17 @@ public class Tabs implements BundleEvent // delayLoad implies background tab boolean background = delayLoad || (flags & LOADURL_BACKGROUND) != 0; boolean isPrivate = (flags & LOADURL_PRIVATE) != 0 || (intent != null && intent.getBooleanExtra(PRIVATE_TAB_INTENT_EXTRA, false)); boolean userEntered = (flags & LOADURL_USER_ENTERED) != 0; boolean desktopMode = (flags & LOADURL_DESKTOP) != 0; boolean external = (flags & LOADURL_EXTERNAL) != 0; final boolean isFirstShownAfterActivityUnhidden = (flags & LOADURL_FIRST_AFTER_ACTIVITY_UNHIDDEN) != 0; + final boolean startEditing = (flags & LOADURL_START_EDITING) != 0; data.putString("url", url); data.putString("engine", searchEngine); data.putInt("parentId", parentId); data.putBoolean("userEntered", userEntered); data.putBoolean("isPrivate", isPrivate); data.putBoolean("pinned", (flags & LOADURL_PINNED) != 0); data.putBoolean("desktopMode", desktopMode); @@ -1060,36 +1064,50 @@ public class Tabs implements BundleEvent if (tabToSelect == null) { return null; } if (!delayLoad && !background) { selectTab(tabToSelect.getId()); } + if (startEditing) { + notifyListeners(tabToSelect, TabEvents.START_EDITING); + } + // Load favicon instantly for about:home page because it's already cached if (AboutPages.isBuiltinIconPage(url)) { tabToSelect.loadFavicon(); } - return tabToSelect; } /** - * Opens a new tab and loads either about:home or, if PREFS_HOMEPAGE_FOR_EVERY_NEW_TAB is set, - * the user's homepage. + * Opens a new tab and loads a page according to the user's preferences (by default about:home). */ @RobocopTarget public Tab addTab() { - return loadUrl(getHomepageForNewTab(mAppContext), Tabs.LOADURL_NEW_TAB); + return addTab(Tabs.LOADURL_NONE); } + /** + * Opens a new tab and loads a page according to the user's preferences (by default about:home). + */ public Tab addPrivateTab() { - return loadUrl(getHomepageForNewTab(mAppContext), Tabs.LOADURL_NEW_TAB | Tabs.LOADURL_PRIVATE); + return addTab(Tabs.LOADURL_PRIVATE); + } + + /** + * Opens a new tab and loads a page according to the user's preferences (by default about:home). + * + * @param flags additional flags used when opening the tab + */ + public Tab addTab(int flags) { + return loadUrl(getHomepageForNewTab(mAppContext), flags | Tabs.LOADURL_NEW_TAB); } /** * Open the url as a new tab, and mark the selected tab as its "parent". * * If the url is already open in a tab, the existing tab is selected. * Use this for tabs opened by the browser chrome, so users can press the * "Back" button to return to the previous tab.
--- a/mobile/android/base/java/org/mozilla/gecko/restrictions/RestrictionProvider.java +++ b/mobile/android/base/java/org/mozilla/gecko/restrictions/RestrictionProvider.java @@ -33,22 +33,22 @@ public class RestrictionProvider extends } final PendingResult result = goAsync(); new Thread() { @Override public void run() { final Bundle oldRestrictions = intent.getBundleExtra(Intent.EXTRA_RESTRICTIONS_BUNDLE); - RestrictionCache.migrateRestrictionsIfNeeded(oldRestrictions); - final Bundle extras = new Bundle(); - - ArrayList<RestrictionEntry> entries = initRestrictions(context, oldRestrictions); - extras.putParcelableArrayList(Intent.EXTRA_RESTRICTIONS_LIST, entries); + if (oldRestrictions != null) { + RestrictionCache.migrateRestrictionsIfNeeded(oldRestrictions); + ArrayList<RestrictionEntry> entries = initRestrictions(context, oldRestrictions); + extras.putParcelableArrayList(Intent.EXTRA_RESTRICTIONS_LIST, entries); + } result.setResult(Activity.RESULT_OK, null, extras); result.finish(); } }.start(); } private ArrayList<RestrictionEntry> initRestrictions(Context context, Bundle oldRestrictions) {
--- a/mobile/android/components/NSSDialogService.js +++ b/mobile/android/components/NSSDialogService.js @@ -87,32 +87,30 @@ NSSDialogs.prototype = { let prompt = this.getPrompt(this.getString("downloadCert.title"), this.getString("downloadCert.message1"), [ this.getString("nssdialogs.ok.label"), this.getString("downloadCert.viewCert.label"), this.getString("nssdialogs.cancel.label") ], aCtx); prompt.addCheckbox({ id: "trustSSL", label: this.getString("downloadCert.trustSSL"), checked: false }) - .addCheckbox({ id: "trustEmail", label: this.getString("downloadCert.trustEmail"), checked: false }) - .addCheckbox({ id: "trustSign", label: this.getString("downloadCert.trustObjSign"), checked: false }); + .addCheckbox({ id: "trustEmail", label: this.getString("downloadCert.trustEmail"), checked: false }); let response = this.showPrompt(prompt); // they hit the "view cert" button, so show the cert and try again if (response.button == 1) { this.viewCert(aCtx, aCert); continue; } else if (response.button != 0) { return false; } aTrust.value = Ci.nsIX509CertDB.UNTRUSTED; if (response.trustSSL) aTrust.value |= Ci.nsIX509CertDB.TRUSTED_SSL; if (response.trustEmail) aTrust.value |= Ci.nsIX509CertDB.TRUSTED_EMAIL; - if (response.trustSign) aTrust.value |= Ci.nsIX509CertDB.TRUSTED_OBJSIGN; return true; } }, setPKCS12FilePassword: function(aCtx, aPassword) { // this dialog is never shown in Fennec; in Desktop it is shown while backing up a personal // certificate to a file via Preferences->Advanced->Encryption->View Certificates->Your Certificates throw "Unimplemented";
--- a/mobile/android/locales/en-US/chrome/pippki.properties +++ b/mobile/android/locales/en-US/chrome/pippki.properties @@ -6,17 +6,16 @@ nssdialogs.ok.label=OK nssdialogs.cancel.label=Cancel # These strings are stolen from security/manager/locales/en-US/chrome/pippki/pippki.dtd downloadCert.title=Downloading Certificate downloadCert.message1=You have been asked to trust a new Certificate Authority (CA). downloadCert.viewCert.label=View downloadCert.trustSSL=Trust to identify websites. downloadCert.trustEmail=Trust to identify email users. -downloadCert.trustObjSign=Trust to identify software developers. pkcs12.getpassword.title=Password Entry Dialog pkcs12.getpassword.message=Please enter the password that was used to encrypt this certificate backup. clientAuthAsk.title=User Identification Request clientAuthAsk.message1=This site has requested that you identify yourself with a certificate: clientAuthAsk.message2=Choose a certificate to present as identification: clientAuthAsk.message3=Details of selected certificate: clientAuthAsk.remember.label=Remember this decision # LOCALIZATION NOTE(clientAuthAsk.nickAndSerial): Represents a single cert when
--- a/mobile/android/tests/browser/robocop/robocop.ini +++ b/mobile/android/tests/browser/robocop/robocop.ini @@ -6,16 +6,18 @@ subsuite = robocop [src/org/mozilla/gecko/tests/testActivityStreamContextMenu.java] [src/org/mozilla/gecko/tests/testAddonManager.java] # disabled on 4.3, bug 1144918 skip-if = android_version == "18" [src/org/mozilla/gecko/tests/testAddSearchEngine.java] # disabled on 4.3, bug 1120759 skip-if = android_version == "18" [src/org/mozilla/gecko/tests/testANRReporter.java] +[src/org/mozilla/gecko/tests/testAssistIntentNewIntent.java] +[src/org/mozilla/gecko/tests/testAssistIntentStartup.java] [src/org/mozilla/gecko/tests/testAudioFocus.java] [src/org/mozilla/gecko/tests/testMediaControl.java] skip-if = android_version < "23" [src/org/mozilla/gecko/tests/testAxisLocking.java] skip-if = true # Bug 1390059 [src/org/mozilla/gecko/tests/testBookmark.java] disabled=see bug 915350 [src/org/mozilla/gecko/tests/testBookmarksPanel.java]
new file mode 100644 --- /dev/null +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/AssistIntentTest.java @@ -0,0 +1,29 @@ +package org.mozilla.gecko.tests; + +import android.content.Intent; + +import org.mozilla.gecko.tests.helpers.GeckoHelper; + +public class AssistIntentTest extends SessionTest { + @Override + public void setActivityIntent(Intent intent) { + // We want to make sure that we have opened a new tab, so we're creating a session + // where the default selected tab will *not* be about:home. + Session session = createTestSession(/*selected tab*/ 1); + injectSessionToRestore(intent, session); + + super.setActivityIntent(intent); + } + + protected void verifyAssistIntentHandling() { + // After an ACTION_ASSIST intent, we should be in editing mode... + mToolbar.assertIsEditing(); + + // ... the input field should be empty in readiness for the user to type... + mToolbar.assertUrl(""); + + // ... and we should have opened a new tab in addition to those from the "restored" session. + mToolbar.dismissEditingMode(); + mToolbar.assertTitle(mStringHelper.ABOUT_HOME_URL); + } +}
--- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/components/ToolbarComponent.java @@ -70,17 +70,17 @@ public class ToolbarComponent extends Ba // Since we only display a shortened "base domain" (See bug 1236431) we use the content // description to obtain the full URL. fAssertEquals("The Toolbar title is " + expected, expected, getUrlFromContentDescription()); return this; } public ToolbarComponent assertUrl(final String expected) { assertIsEditing(); - fAssertEquals("The Toolbar url is " + expected, expected, getUrlEditText().getText()); + fAssertEquals("The Toolbar url is " + expected, expected, getUrlEditText().getText().toString()); return this; } public ToolbarComponent assertIsUrlEditTextSelected() { fAssertTrue("The edit text is selected", isUrlEditTextSelected()); return this; }
new file mode 100644 --- /dev/null +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAssistIntentNewIntent.java @@ -0,0 +1,28 @@ +package org.mozilla.gecko.tests; + +import android.content.Context; +import android.content.Intent; + +import org.mozilla.gecko.AppConstants; +import org.mozilla.gecko.tests.helpers.GeckoHelper; +import org.mozilla.gecko.tests.helpers.WaitHelper; + +public class testAssistIntentNewIntent extends AssistIntentTest { + public void testAssistIntentNewIntent() { + GeckoHelper.blockForReady(); + + final Context testContext = getInstrumentation().getContext(); + final Intent assistIntent = new Intent(Intent.ACTION_ASSIST); + assistIntent.setPackage(AppConstants.ANDROID_PACKAGE_NAME); + assistIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + WaitHelper.waitForPageLoad(new Runnable() { + @Override + public void run() { + testContext.startActivity(assistIntent); + } + }); + + verifyAssistIntentHandling(); + } +}
new file mode 100644 --- /dev/null +++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAssistIntentStartup.java @@ -0,0 +1,20 @@ +package org.mozilla.gecko.tests; + +import android.content.Intent; + +import org.mozilla.gecko.tests.helpers.GeckoHelper; + +public class testAssistIntentStartup extends AssistIntentTest { + @Override + public void setActivityIntent(Intent intent) { + intent.setAction(Intent.ACTION_ASSIST); + + super.setActivityIntent(intent); + } + + public void testAssistIntentStartup() { + GeckoHelper.blockForReady(); + + verifyAssistIntentHandling(); + } +}
--- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -2286,16 +2286,17 @@ pref("converter.html2txt.header_strategy pref("converter.html2txt.always_include_ruby", false); pref("intl.accept_languages", "chrome://global/locale/intl.properties"); pref("intl.menuitems.alwaysappendaccesskeys","chrome://global/locale/intl.properties"); pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/intl.properties"); pref("intl.charset.detector", "chrome://global/locale/intl.properties"); pref("intl.charset.fallback.override", ""); pref("intl.charset.fallback.tld", true); +pref("intl.charset.fallback.utf8_for_file", false); pref("intl.ellipsis", "chrome://global-platform/locale/intl.properties"); pref("intl.locale.matchOS", false); // this pref allows user to request that all internationalization formatters // like date/time formatting, unit formatting, calendars etc. should use // OS locale set instead of the app locale set. pref("intl.regional_prefs.use_os_locales", false); // fallback charset list for Unicode conversion (converting from Unicode) // currently used for mail send only to handle symbol characters (e.g Euro, trademark, smartquotes)
--- a/security/manager/locales/en-US/chrome/pippki/certManager.dtd +++ b/security/manager/locales/en-US/chrome/pippki/certManager.dtd @@ -33,17 +33,16 @@ <!ENTITY certmgr.certdetail.serialnumber "Serial Number"> <!ENTITY certmgr.certdetail.sha256fingerprint "SHA-256 Fingerprint"> <!ENTITY certmgr.certdetail.sha1fingerprint "SHA1 Fingerprint"> <!ENTITY certmgr.editcacert.title "Edit CA certificate trust settings"> <!ENTITY certmgr.editcert.edittrust "Edit trust settings:"> <!ENTITY certmgr.editcert.trustssl "This certificate can identify websites."> <!ENTITY certmgr.editcert.trustemail "This certificate can identify mail users."> -<!ENTITY certmgr.editcert.trustobjsign "This certificate can identify software makers."> <!ENTITY certmgr.deletecert.title "Delete Certificate"> <!ENTITY certmgr.certname "Certificate Name"> <!ENTITY certmgr.certserver "Server"> <!ENTITY certmgr.override_lifetime "Lifetime"> <!ENTITY certmgr.tokenname "Security Device"> <!ENTITY certmgr.begins "Begins On">
--- a/security/manager/locales/en-US/chrome/pippki/pippki.dtd +++ b/security/manager/locales/en-US/chrome/pippki/pippki.dtd @@ -15,17 +15,16 @@ <!ENTITY resetPassword.title "Reset Master Password"> <!ENTITY resetPassword.text "If you reset your master password, all your stored web and e-mail passwords, form data, personal certificates, and private keys will be forgotten. Are you sure you want to reset your master password?"> <!-- Downloading a cert --> <!ENTITY downloadCert.title "Downloading Certificate"> <!ENTITY downloadCert.message1 "You have been asked to trust a new Certificate Authority (CA)."> <!ENTITY downloadCert.trustSSL "Trust this CA to identify websites."> <!ENTITY downloadCert.trustEmail "Trust this CA to identify email users."> -<!ENTITY downloadCert.trustObjSign "Trust this CA to identify software developers."> <!ENTITY downloadCert.message3 "Before trusting this CA for any purpose, you should examine its certificate and its policy and procedures (if available)."> <!ENTITY downloadCert.viewCert.label "View"> <!ENTITY downloadCert.viewCert.text "Examine CA certificate"> <!-- Strings for the SSL client auth ask dialog --> <!ENTITY clientAuthAsk.title "User Identification Request"> <!ENTITY clientAuthAsk.message1 "This site has requested that you identify yourself with a certificate:"> <!ENTITY clientAuthAsk.message2 "Choose a certificate to present as identification:">
--- a/security/manager/pki/nsNSSDialogs.cpp +++ b/security/manager/pki/nsNSSDialogs.cpp @@ -148,26 +148,19 @@ nsNSSDialogs::ConfirmDownloadCACert(nsII return rv; } bool trustForEmail = false; rv = retVals->GetPropertyAsBool(NS_LITERAL_STRING("trustForEmail"), &trustForEmail); if (NS_FAILED(rv)) { return rv; } - bool trustForObjSign = false; - rv = retVals->GetPropertyAsBool(NS_LITERAL_STRING("trustForObjSign"), - &trustForObjSign); - if (NS_FAILED(rv)) { - return rv; - } *trust |= trustForSSL ? nsIX509CertDB::TRUSTED_SSL : 0; *trust |= trustForEmail ? nsIX509CertDB::TRUSTED_EMAIL : 0; - *trust |= trustForObjSign ? nsIX509CertDB::TRUSTED_OBJSIGN : 0; return NS_OK; } NS_IMETHODIMP nsNSSDialogs::ChooseCertificate(nsIInterfaceRequestor* ctx, const nsACString& hostname, int32_t port,
--- a/security/manager/pki/resources/content/downloadcert.js +++ b/security/manager/pki/resources/content/downloadcert.js @@ -22,19 +22,16 @@ * Set to true if the user confirmed import of the cert and accepted * the dialog, false otherwise. * @property {Boolean} trustForSSL * Set to true if the cert should be trusted for SSL, false otherwise. * Undefined value if |importConfirmed| is not true. * @property {Boolean} trustForEmail * Set to true if the cert should be trusted for e-mail, false * otherwise. Undefined value if |importConfirmed| is not true. - * @property {Boolean} trustForObjSign - * Set to true if the cert should be trusted for object signing, false - * otherwise. Undefined value if |importConfirmed| is not true. */ const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; /** * The cert to potentially import. * @type nsIX509Cert */ @@ -65,23 +62,21 @@ function viewCert() { /** * ondialogaccept() handler. * * @returns {Boolean} true to make the dialog close, false otherwise. */ function onDialogAccept() { let checkSSL = document.getElementById("trustSSL"); let checkEmail = document.getElementById("trustEmail"); - let checkObjSign = document.getElementById("trustObjSign"); let retVals = window.arguments[1].QueryInterface(Ci.nsIWritablePropertyBag2); retVals.setPropertyAsBool("importConfirmed", true); retVals.setPropertyAsBool("trustForSSL", checkSSL.checked); retVals.setPropertyAsBool("trustForEmail", checkEmail.checked); - retVals.setPropertyAsBool("trustForObjSign", checkObjSign.checked); return true; } /** * ondialogcancel() handler. * * @returns {Boolean} true to make the dialog close, false otherwise. */
--- a/security/manager/pki/resources/content/downloadcert.xul +++ b/security/manager/pki/resources/content/downloadcert.xul @@ -28,26 +28,23 @@ </vbox> <separator/> <!-- checkboxes for trust bits - "do you want to?" - * trust for SSL - * trust for email - - * trust for object signing --> <vbox> <description id="trustHeader"/> <checkbox label="&downloadCert.trustSSL;" id="trustSSL"/> <checkbox label="&downloadCert.trustEmail;" id="trustEmail"/> - <checkbox label="&downloadCert.trustObjSign;" - id="trustObjSign"/> </vbox> <separator/> <vbox> <description>&downloadCert.message3;</description> <separator/> <grid>
--- a/security/manager/pki/resources/content/editcacert.js +++ b/security/manager/pki/resources/content/editcacert.js @@ -26,33 +26,24 @@ function onLoad() { let sslCheckbox = document.getElementById("trustSSL"); sslCheckbox.checked = gCertDB.isCertTrusted(gCert, Ci.nsIX509Cert.CA_CERT, Ci.nsIX509CertDB.TRUSTED_SSL); let emailCheckbox = document.getElementById("trustEmail"); emailCheckbox.checked = gCertDB.isCertTrusted(gCert, Ci.nsIX509Cert.CA_CERT, Ci.nsIX509CertDB.TRUSTED_EMAIL); - - let objSignCheckbox = document.getElementById("trustObjSign"); - objSignCheckbox.checked = - gCertDB.isCertTrusted(gCert, Ci.nsIX509Cert.CA_CERT, - Ci.nsIX509CertDB.TRUSTED_OBJSIGN); } /** * ondialogaccept() handler. * * @returns {Boolean} true to make the dialog close, false otherwise. */ function onDialogAccept() { let sslCheckbox = document.getElementById("trustSSL"); let emailCheckbox = document.getElementById("trustEmail"); - let objSignCheckbox = document.getElementById("trustObjSign"); let trustSSL = sslCheckbox.checked ? Ci.nsIX509CertDB.TRUSTED_SSL : 0; let trustEmail = emailCheckbox.checked ? Ci.nsIX509CertDB.TRUSTED_EMAIL : 0; - let trustObjSign = objSignCheckbox.checked ? Ci.nsIX509CertDB.TRUSTED_OBJSIGN - : 0; - gCertDB.setCertTrust(gCert, Ci.nsIX509Cert.CA_CERT, - trustSSL | trustEmail | trustObjSign); + gCertDB.setCertTrust(gCert, Ci.nsIX509Cert.CA_CERT, trustSSL | trustEmail); return true; }
--- a/security/manager/pki/resources/content/editcacert.xul +++ b/security/manager/pki/resources/content/editcacert.xul @@ -24,13 +24,11 @@ <description id="certmsg"/> <separator/> <description>&certmgr.editcert.edittrust;</description> <vbox align="start"> <checkbox label="&certmgr.editcert.trustssl;" id="trustSSL"/> <checkbox label="&certmgr.editcert.trustemail;" id="trustEmail"/> - <checkbox label="&certmgr.editcert.trustobjsign;" - id="trustObjSign"/> </vbox> </dialog>
--- a/security/manager/ssl/nsIX509CertDB.idl +++ b/security/manager/ssl/nsIX509CertDB.idl @@ -62,17 +62,16 @@ interface nsIX509CertDB : nsISupports { /** * Constants that define which usages a certificate * is trusted for. */ const unsigned long UNTRUSTED = 0; const unsigned long TRUSTED_SSL = 1 << 0; const unsigned long TRUSTED_EMAIL = 1 << 1; - const unsigned long TRUSTED_OBJSIGN = 1 << 2; /** * Will find a certificate based on its dbkey * retrieved by getting the dbKey attribute of * the certificate. * * @param aDBkey Database internal key, as obtained using * attribute dbkey in nsIX509Cert. @@ -150,18 +149,21 @@ interface nsIX509CertDB : nsISupports { [must_use] void setCertTrust(in nsIX509Cert cert, in unsigned long type, in unsigned long trust); /** * @param cert The certificate for which to modify trust. * @param trustString decoded by CERT_DecodeTrustString. 3 comma separated - * characters, indicating SSL, Email, and Obj signing - * trust. + * characters, indicating SSL, Email, and Object signing + * trust. The object signing trust flags are effectively + * ignored by gecko, but they still must be specified (at + * least by a final trailing comma) because this argument + * is passed to CERT_DecodeTrustString. */ [must_use] void setCertTrustFromString(in nsIX509Cert cert, in ACString trustString); /** * Query whether a certificate is trusted for a particular use. * * @param cert Obtain the stored trust of this certificate. @@ -279,17 +281,20 @@ interface nsIX509CertDB : nsISupports { /* * Add a cert to a cert DB from a binary string. * * @param certDER The raw DER encoding of a certificate. * @param trust String describing the trust settings to assign the * certificate. Decoded by CERT_DecodeTrustString. Consists of 3 * comma separated sets of characters, indicating SSL, Email, and - * Object signing trust. + * Object signing trust. The object signing trust flags are + * effectively ignored by gecko, but they still must be specified + * (at least by a final trailing comma) because this argument is + * passed to CERT_DecodeTrustString. * @return nsIX509Cert the resulting certificate */ [must_use] nsIX509Cert addCert(in ACString certDER, in ACString trust); // Flags for verifyCertNow (these must match the values in CertVerifier.cpp): // Prevent network traffic. Doesn't work with classic verification. const uint32_t FLAG_LOCAL_ONLY = 1 << 0; @@ -354,17 +359,20 @@ interface nsIX509CertDB : nsISupports { /* * Add a cert to a cert DB from a base64 encoded string. * * @param base64 The raw representation of a certificate, encoded as Base 64. * @param trust String describing the trust settings to assign the * certificate. Decoded by CERT_DecodeTrustString. Consists of 3 * comma separated sets of characters, indicating SSL, Email, and - * Object signing trust. + * Object signing trust. The object signing trust flags are + * effectively ignored by gecko, but they still must be specified + * (at least by a final trailing comma) because this argument is + * passed to CERT_DecodeTrustString. * @return nsIX509Cert the resulting certificate */ [must_use] nsIX509Cert addCertFromBase64(in ACString base64, in ACString trust); /* * Get all the known certs in the database */
--- a/security/manager/ssl/nsNSSCertHelper.cpp +++ b/security/manager/ssl/nsNSSCertHelper.cpp @@ -2034,19 +2034,19 @@ nsNSSCertificate::CreateASN1Struct(nsIAS uint32_t getCertType(CERTCertificate* cert) { nsNSSCertTrust trust(cert->trust); if (cert->nickname && trust.HasAnyUser()) return nsIX509Cert::USER_CERT; if (trust.HasAnyCA()) return nsIX509Cert::CA_CERT; - if (trust.HasPeer(true, false, false)) + if (trust.HasPeer(true, false)) return nsIX509Cert::SERVER_CERT; - if (trust.HasPeer(false, true, false) && cert->emailAddr) + if (trust.HasPeer(false, true) && cert->emailAddr) return nsIX509Cert::EMAIL_CERT; if (CERT_IsCACert(cert, nullptr)) return nsIX509Cert::CA_CERT; if (cert->emailAddr) return nsIX509Cert::EMAIL_CERT; return nsIX509Cert::UNKNOWN_CERT; }
--- a/security/manager/ssl/nsNSSCertTrust.cpp +++ b/security/manager/ssl/nsNSSCertTrust.cpp @@ -1,55 +1,46 @@ /* 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 "nsNSSCertTrust.h" void -nsNSSCertTrust::AddCATrust(bool ssl, bool email, bool objSign) +nsNSSCertTrust::AddCATrust(bool ssl, bool email) { if (ssl) { addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CA); addTrust(&mTrust.sslFlags, CERTDB_TRUSTED_CLIENT_CA); } if (email) { addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CA); addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CLIENT_CA); } - if (objSign) { - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CA); - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA); - } } void -nsNSSCertTrust::AddPeerTrust(bool ssl, bool email, bool objSign) +nsNSSCertTrust::AddPeerTrust(bool ssl, bool email) { if (ssl) addTrust(&mTrust.sslFlags, CERTDB_TRUSTED); if (email) addTrust(&mTrust.emailFlags, CERTDB_TRUSTED); - if (objSign) - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED); } nsNSSCertTrust::nsNSSCertTrust() { memset(&mTrust, 0, sizeof(CERTCertTrust)); } -nsNSSCertTrust::nsNSSCertTrust(unsigned int ssl, - unsigned int email, - unsigned int objsign) +nsNSSCertTrust::nsNSSCertTrust(unsigned int ssl, unsigned int email) { memset(&mTrust, 0, sizeof(CERTCertTrust)); addTrust(&mTrust.sslFlags, ssl); addTrust(&mTrust.emailFlags, email); - addTrust(&mTrust.objectSigningFlags, objsign); } nsNSSCertTrust::nsNSSCertTrust(CERTCertTrust *t) { if (t) memcpy(&mTrust, t, sizeof(CERTCertTrust)); else memset(&mTrust, 0, sizeof(CERTCertTrust)); @@ -99,129 +90,86 @@ nsNSSCertTrust::SetEmailTrust(bool peer, addTrust(&mTrust.emailFlags, CERTDB_TRUSTED_CA); if (user) addTrust(&mTrust.emailFlags, CERTDB_USER); if (warn) addTrust(&mTrust.emailFlags, CERTDB_SEND_WARN); } void -nsNSSCertTrust::SetObjSignTrust(bool peer, bool tPeer, - bool ca, bool tCA, bool tClientCA, - bool user, bool warn) -{ - mTrust.objectSigningFlags = 0; - if (peer || tPeer) - addTrust(&mTrust.objectSigningFlags, CERTDB_TERMINAL_RECORD); - if (tPeer) - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED); - if (ca || tCA) - addTrust(&mTrust.objectSigningFlags, CERTDB_VALID_CA); - if (tClientCA) - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA); - if (tCA) - addTrust(&mTrust.objectSigningFlags, CERTDB_TRUSTED_CA); - if (user) - addTrust(&mTrust.objectSigningFlags, CERTDB_USER); - if (warn) - addTrust(&mTrust.objectSigningFlags, CERTDB_SEND_WARN); -} - -void nsNSSCertTrust::SetValidCA() { SetSSLTrust(false, false, true, false, false, false, false); SetEmailTrust(false, false, true, false, false, false, false); - SetObjSignTrust(false, false, - true, false, false, - false, false); } void nsNSSCertTrust::SetValidPeer() { SetSSLTrust(true, false, false, false, false, false, false); SetEmailTrust(true, false, false, false, false, false, false); - SetObjSignTrust(true, false, - false, false, false, - false, false); } bool nsNSSCertTrust::HasAnyCA() { if (hasTrust(mTrust.sslFlags, CERTDB_VALID_CA) || hasTrust(mTrust.emailFlags, CERTDB_VALID_CA) || hasTrust(mTrust.objectSigningFlags, CERTDB_VALID_CA)) return true; return false; } bool -nsNSSCertTrust::HasPeer(bool checkSSL, - bool checkEmail, - bool checkObjSign) +nsNSSCertTrust::HasPeer(bool checkSSL, bool checkEmail) { if (checkSSL && !hasTrust(mTrust.sslFlags, CERTDB_TERMINAL_RECORD)) return false; if (checkEmail && !hasTrust(mTrust.emailFlags, CERTDB_TERMINAL_RECORD)) return false; - if (checkObjSign && !hasTrust(mTrust.objectSigningFlags, CERTDB_TERMINAL_RECORD)) - return false; return true; } bool nsNSSCertTrust::HasAnyUser() { if (hasTrust(mTrust.sslFlags, CERTDB_USER) || hasTrust(mTrust.emailFlags, CERTDB_USER) || hasTrust(mTrust.objectSigningFlags, CERTDB_USER)) return true; return false; } bool -nsNSSCertTrust::HasTrustedCA(bool checkSSL, - bool checkEmail, - bool checkObjSign) +nsNSSCertTrust::HasTrustedCA(bool checkSSL, bool checkEmail) { if (checkSSL && !(hasTrust(mTrust.sslFlags, CERTDB_TRUSTED_CA) || hasTrust(mTrust.sslFlags, CERTDB_TRUSTED_CLIENT_CA))) return false; if (checkEmail && !(hasTrust(mTrust.emailFlags, CERTDB_TRUSTED_CA) || hasTrust(mTrust.emailFlags, CERTDB_TRUSTED_CLIENT_CA))) return false; - if (checkObjSign && - !(hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED_CA) || - hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED_CLIENT_CA))) - return false; return true; } bool -nsNSSCertTrust::HasTrustedPeer(bool checkSSL, - bool checkEmail, - bool checkObjSign) +nsNSSCertTrust::HasTrustedPeer(bool checkSSL, bool checkEmail) { if (checkSSL && !(hasTrust(mTrust.sslFlags, CERTDB_TRUSTED))) return false; if (checkEmail && !(hasTrust(mTrust.emailFlags, CERTDB_TRUSTED))) return false; - if (checkObjSign && - !(hasTrust(mTrust.objectSigningFlags, CERTDB_TRUSTED))) - return false; return true; } void nsNSSCertTrust::addTrust(unsigned int *t, unsigned int v) { *t |= v; }
--- a/security/manager/ssl/nsNSSCertTrust.h +++ b/security/manager/ssl/nsNSSCertTrust.h @@ -10,32 +10,26 @@ /* * Class for maintaining trust flags for an NSS certificate. */ class nsNSSCertTrust { public: nsNSSCertTrust(); - nsNSSCertTrust(unsigned int ssl, unsigned int email, unsigned int objsign); + nsNSSCertTrust(unsigned int ssl, unsigned int email); explicit nsNSSCertTrust(CERTCertTrust *t); virtual ~nsNSSCertTrust(); /* query */ bool HasAnyCA(); bool HasAnyUser(); - bool HasPeer(bool checkSSL = true, - bool checkEmail = true, - bool checkObjSign = true); - bool HasTrustedCA(bool checkSSL = true, - bool checkEmail = true, - bool checkObjSign = true); - bool HasTrustedPeer(bool checkSSL = true, - bool checkEmail = true, - bool checkObjSign = true); + bool HasPeer(bool checkSSL = true, bool checkEmail = true); + bool HasTrustedCA(bool checkSSL = true, bool checkEmail = true); + bool HasTrustedPeer(bool checkSSL = true, bool checkEmail = true); /* common defaults */ /* equivalent to "c,c,c" */ void SetValidCA(); /* equivalent to "p,p,p" */ void SetValidPeer(); /* general setters */ @@ -43,24 +37,20 @@ public: void SetSSLTrust(bool peer, bool tPeer, bool ca, bool tCA, bool tClientCA, bool user, bool warn); void SetEmailTrust(bool peer, bool tPeer, bool ca, bool tCA, bool tClientCA, bool user, bool warn); - void SetObjSignTrust(bool peer, bool tPeer, - bool ca, bool tCA, bool tClientCA, - bool user, bool warn); - /* set c <--> CT */ - void AddCATrust(bool ssl, bool email, bool objSign); + void AddCATrust(bool ssl, bool email); /* set p <--> P */ - void AddPeerTrust(bool ssl, bool email, bool objSign); + void AddPeerTrust(bool ssl, bool email); CERTCertTrust& GetTrust() { return mTrust; } private: void addTrust(unsigned int *t, unsigned int v); void removeTrust(unsigned int *t, unsigned int v); bool hasTrust(unsigned int t, unsigned int v); CERTCertTrust mTrust;
--- a/security/manager/ssl/nsNSSCertificateDB.cpp +++ b/security/manager/ssl/nsNSSCertificateDB.cpp @@ -377,18 +377,17 @@ nsNSSCertificateDB::handleCACertDownload MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("trust is %d\n", trustBits)); UniquePORTString nickname(CERT_MakeCANickname(tmpCert.get())); MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("Created nick \"%s\"\n", nickname.get())); nsNSSCertTrust trust; trust.SetValidCA(); trust.AddCATrust(!!(trustBits & nsIX509CertDB::TRUSTED_SSL), - !!(trustBits & nsIX509CertDB::TRUSTED_EMAIL), - !!(trustBits & nsIX509CertDB::TRUSTED_OBJSIGN)); + !!(trustBits & nsIX509CertDB::TRUSTED_EMAIL)); UniquePK11SlotInfo slot(PK11_GetInternalKeySlot()); SECStatus srv = PK11_ImportCert(slot.get(), tmpCert.get(), CK_INVALID_HANDLE, nickname.get(), false); // this parameter is ignored by NSS if (srv != SECSuccess) { return MapSECStatus(srv); } @@ -732,17 +731,17 @@ nsNSSCertificateDB::DeleteCertificate(ns if (cert->slot && certType != nsIX509Cert::USER_CERT) { // To delete a cert of a slot (builtin, most likely), mark it as // completely untrusted. This way we keep a copy cached in the // local database, and next time we try to load it off of the // external token/slot, we'll know not to trust it. We don't // want to do that with user certs, because a user may re-store // the cert onto the card again at which point we *will* want to // trust that cert if it chains up properly. - nsNSSCertTrust trust(0, 0, 0); + nsNSSCertTrust trust(0, 0); srv = ChangeCertTrustWithPossibleAuthentication(cert, trust.GetTrust(), nullptr); } MOZ_LOG(gPIPNSSLog, LogLevel::Debug, ("cert deleted: %d", srv)); nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (observerServ