Merge autoland to mozilla-central r=merge a=merge

This commit is contained in:
shindli 2017-12-05 11:57:21 +02:00
commit 7c657fc158
147 changed files with 3858 additions and 1906 deletions

View File

@ -4,6 +4,9 @@
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.
@ -24,7 +27,8 @@ function createLinks(linkInfos) {
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);
@ -78,7 +82,7 @@ add_task(async function prefer_sized() {
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",
@ -88,8 +92,73 @@ add_task(async function prefer_ico() {
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.

View File

@ -617,6 +617,12 @@ this.tabs = class extends ExtensionAPI {
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) {

View File

@ -21,7 +21,7 @@ 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";

View File

@ -10,19 +10,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
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.

View File

@ -181,7 +181,7 @@ this.startup = function startup(data, reason) {
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

View File

@ -69,8 +69,10 @@ for (const type of [
"SETTINGS_OPEN",
"SET_PREF",
"SHOW_FIREFOX_ACCOUNTS",
"SNIPPETS_BLOCKLIST_UPDATED",
"SNIPPETS_DATA",
"SNIPPETS_RESET",
"SNIPPET_BLOCKED",
"SYSTEM_TICK",
"TELEMETRY_IMPRESSION_STATS",
"TELEMETRY_PERFORMANCE_EVENT",

View File

@ -23,15 +23,15 @@ input {
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 {
@ -44,9 +44,9 @@ input {
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 {
@ -71,8 +71,7 @@ input {
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 {
@ -125,24 +124,24 @@ a {
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 {
@ -155,25 +154,25 @@ a {
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;
margin: 0;
padding: 15px 25px 0 25px;
flex-wrap: wrap;
justify-content: flex-start;
flex-wrap: wrap; }
margin: 0;
padding: 15px 25px 0; }
.actions button {
background-color: #F9F9FA;
border: 1px solid #B1B1B3;
border-radius: 4px;
color: inherit;
cursor: pointer;
padding: 10px 30px;
margin-bottom: 15px;
padding: 10px 30px;
white-space: nowrap; }
.actions button:hover:not(.dismiss) {
box-shadow: 0 0 0 5px #D7D7DB;
@ -193,16 +192,16 @@ a {
.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; } }
@ -245,49 +244,50 @@ main {
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-start: auto;
margin-inline-end: auto;
offset-inline-start: -32px;
offset-inline-end: auto; }
margin-inline-start: 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-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: 544px) and (max-width: 768px) {
.top-sites-list :nth-child(4n+3) .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: 800px) and (max-width: 1248px) {
.top-sites-list :nth-child(6n) .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: 800px) and (max-width: 1024px) {
.top-sites-list :nth-child(6n+5) .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; } }
.top-sites-list li {
display: inline-block;
margin: 0 0 8px;
@ -295,53 +295,56 @@ main {
.top-sites-list .top-site-outer {
position: relative; }
.top-sites-list .top-site-outer > a {
display: block;
color: inherit;
display: block;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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);
color: #737373;
font-weight: 200;
font-size: 32px;
text-transform: uppercase;
display: flex;
height: 96px;
position: relative;
width: 96px;
align-items: center;
justify-content: center; }
color: #737373;
display: flex;
font-size: 32px;
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 {
@ -349,43 +352,43 @@ main {
.top-sites-list .top-site-outer.placeholder .screenshot {
display: none; }
.top-sites-list .top-site-outer .screenshot {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
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);
background-size: cover;
background-position: top left;
height: 100%;
left: 0;
opacity: 0;
position: absolute;
top: 0;
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;
offset-inline-start: 0;
background-size: 96px;
height: 100%;
width: 100%;
background-size: 96px; }
offset-inline-start: 0;
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;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px; }
display: flex;
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 {
@ -423,7 +426,7 @@ main {
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 {
@ -443,9 +446,6 @@ main {
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;
@ -460,7 +460,7 @@ main {
.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;
@ -499,7 +499,7 @@ main {
.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; }
@ -564,59 +564,59 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-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: 544px) and (max-width: 800px) {
.sections-list .section-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: 800px) and (max-width: 1248px) {
.sections-list .section-list :nth-child(3n) .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; } }
.sections-list .section-empty-state {
width: 100%;
height: 266px;
display: flex;
border: 1px solid #D7D7DB;
border-radius: 3px; }
border-radius: 3px;
display: flex;
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 50px 50px;
-moz-context-properties: fill;
display: block;
fill: rgba(12, 12, 13, 0.6);
height: 50px;
width: 50px;
margin: 0 auto;
display: block; }
width: 50px; }
.sections-list .section-empty-state .empty-state .empty-state-message {
margin-bottom: 0;
font-size: 13px;
color: #737373;
font-size: 13px;
margin-bottom: 0;
text-align: center; }
.topic {
font-size: 12px;
color: #737373;
margin-top: 12px;
line-height: 1.6; }
font-size: 12px;
line-height: 1.6;
margin-top: 12px; }
@media (min-width: 800px) {
.topic {
line-height: 16px; } }
@ -656,27 +656,27 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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,
@ -684,23 +684,23 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
box-shadow: 0 0 0 3px #0A84FF; }
.search-wrapper .search-label {
background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
position: absolute;
offset-inline-start: 0;
fill: rgba(12, 12, 13, 0.4);
height: 100%;
offset-inline-start: 0;
position: absolute;
width: 35px; }
.search-wrapper .search-button {
background: url("chrome://browser/skin/forward.svg") no-repeat center center;
border-radius: 0 3px 3px 0;
border: 0;
width: 36px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
background-size: 16px 16px;
border: 0;
border-radius: 0 3px 3px 0;
-moz-context-properties: fill;
fill: rgba(12, 12, 13, 0.4);
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; }
@ -713,43 +713,43 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
transform: translateY(2px); }
.context-menu {
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; }
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;
font-size: 14px;
margin-inline-start: 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;
line-height: 16px;
cursor: pointer;
display: flex;
align-items: center; }
.context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus {
line-height: 16px;
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 {
@ -859,14 +859,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -882,9 +882,9 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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 {
@ -893,35 +893,35 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }
@ -945,83 +945,83 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer {
background: #FFF;
display: inline-block;
margin-inline-end: 32px;
width: 224px;
border-radius: 3px;
display: inline-block;
height: 266px;
position: relative; }
margin-inline-end: 32px;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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 {
display: block;
color: inherit;
display: block;
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;
height: 122px;
border-radius: 3px 3px 0 0;
overflow: hidden; }
height: 122px;
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 {
@ -1029,8 +1029,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -1047,30 +1047,30 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer .card-host-name {
color: #737373;
font-size: 10px;
padding-bottom: 4px;
text-transform: uppercase;
overflow: hidden;
text-overflow: ellipsis; }
padding-bottom: 4px;
text-overflow: ellipsis;
text-transform: uppercase; }
.card-outer .card-title {
margin: 0 0 2px;
font-size: 14px;
word-wrap: break-word;
line-height: 19px; }
line-height: 19px;
margin: 0 0 2px;
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; }
@ -1103,13 +1103,13 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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) {
@ -1131,8 +1131,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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; }
@ -1142,30 +1142,36 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 12px 12px;
-moz-context-properties: fill;
height: 16px;
width: 16px;
display: inline-block;
fill: rgba(12, 12, 13, 0.6);
height: 16px;
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 {
@ -1182,27 +1188,21 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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;
top: 26px;
width: 320px;
padding: 24px;
box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-moz-user-select: none; }
position: absolute;
top: 26px;
-moz-user-select: none;
width: 320px;
z-index: 9999; }
.collapsible-section .section-top-bar .info-option-header {
font-size: 15px;
font-weight: 600; }
@ -1215,8 +1215,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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;
@ -1256,14 +1256,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }

View File

@ -23,15 +23,15 @@ input {
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 {
@ -44,9 +44,9 @@ input {
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 {
@ -71,8 +71,7 @@ input {
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 {
@ -125,24 +124,24 @@ a {
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 {
@ -155,25 +154,25 @@ a {
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;
margin: 0;
padding: 15px 25px 0 25px;
flex-wrap: wrap;
justify-content: flex-start;
flex-wrap: wrap; }
margin: 0;
padding: 15px 25px 0; }
.actions button {
background-color: #F9F9FA;
border: 1px solid #B1B1B3;
border-radius: 4px;
color: inherit;
cursor: pointer;
padding: 10px 30px;
margin-bottom: 15px;
padding: 10px 30px;
white-space: nowrap; }
.actions button:hover:not(.dismiss) {
box-shadow: 0 0 0 5px #D7D7DB;
@ -193,16 +192,16 @@ a {
.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; } }
@ -245,49 +244,50 @@ main {
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-start: auto;
margin-inline-end: auto;
offset-inline-start: -32px;
offset-inline-end: auto; }
margin-inline-start: 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-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: 544px) and (max-width: 768px) {
.top-sites-list :nth-child(4n+3) .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: 800px) and (max-width: 1248px) {
.top-sites-list :nth-child(6n) .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: 800px) and (max-width: 1024px) {
.top-sites-list :nth-child(6n+5) .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; } }
.top-sites-list li {
display: inline-block;
margin: 0 0 8px;
@ -295,53 +295,56 @@ main {
.top-sites-list .top-site-outer {
position: relative; }
.top-sites-list .top-site-outer > a {
display: block;
color: inherit;
display: block;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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);
color: #737373;
font-weight: 200;
font-size: 32px;
text-transform: uppercase;
display: flex;
height: 96px;
position: relative;
width: 96px;
align-items: center;
justify-content: center; }
color: #737373;
display: flex;
font-size: 32px;
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 {
@ -349,43 +352,43 @@ main {
.top-sites-list .top-site-outer.placeholder .screenshot {
display: none; }
.top-sites-list .top-site-outer .screenshot {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
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);
background-size: cover;
background-position: top left;
height: 100%;
left: 0;
opacity: 0;
position: absolute;
top: 0;
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;
offset-inline-start: 0;
background-size: 96px;
height: 100%;
width: 100%;
background-size: 96px; }
offset-inline-start: 0;
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;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px; }
display: flex;
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 {
@ -423,7 +426,7 @@ main {
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 {
@ -443,9 +446,6 @@ main {
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;
@ -460,7 +460,7 @@ main {
.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;
@ -499,7 +499,7 @@ main {
.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; }
@ -564,59 +564,59 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-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: 544px) and (max-width: 800px) {
.sections-list .section-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: 800px) and (max-width: 1248px) {
.sections-list .section-list :nth-child(3n) .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; } }
.sections-list .section-empty-state {
width: 100%;
height: 266px;
display: flex;
border: 1px solid #D7D7DB;
border-radius: 3px; }
border-radius: 3px;
display: flex;
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 50px 50px;
-moz-context-properties: fill;
display: block;
fill: rgba(12, 12, 13, 0.6);
height: 50px;
width: 50px;
margin: 0 auto;
display: block; }
width: 50px; }
.sections-list .section-empty-state .empty-state .empty-state-message {
margin-bottom: 0;
font-size: 13px;
color: #737373;
font-size: 13px;
margin-bottom: 0;
text-align: center; }
.topic {
font-size: 12px;
color: #737373;
margin-top: 12px;
line-height: 1.6; }
font-size: 12px;
line-height: 1.6;
margin-top: 12px; }
@media (min-width: 800px) {
.topic {
line-height: 16px; } }
@ -656,27 +656,27 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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,
@ -684,23 +684,23 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
box-shadow: 0 0 0 3px #0A84FF; }
.search-wrapper .search-label {
background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
position: absolute;
offset-inline-start: 0;
fill: rgba(12, 12, 13, 0.4);
height: 100%;
offset-inline-start: 0;
position: absolute;
width: 35px; }
.search-wrapper .search-button {
background: url("chrome://browser/skin/forward.svg") no-repeat center center;
border-radius: 0 3px 3px 0;
border: 0;
width: 36px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
background-size: 16px 16px;
border: 0;
border-radius: 0 3px 3px 0;
-moz-context-properties: fill;
fill: rgba(12, 12, 13, 0.4);
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; }
@ -713,43 +713,43 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
transform: translateY(2px); }
.context-menu {
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; }
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;
font-size: 14px;
margin-inline-start: 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;
line-height: 16px;
cursor: pointer;
display: flex;
align-items: center; }
.context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus {
line-height: 16px;
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 {
@ -859,14 +859,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -882,9 +882,9 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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 {
@ -893,35 +893,35 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }
@ -945,83 +945,83 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer {
background: #FFF;
display: inline-block;
margin-inline-end: 32px;
width: 224px;
border-radius: 3px;
display: inline-block;
height: 266px;
position: relative; }
margin-inline-end: 32px;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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 {
display: block;
color: inherit;
display: block;
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;
height: 122px;
border-radius: 3px 3px 0 0;
overflow: hidden; }
height: 122px;
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 {
@ -1029,8 +1029,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -1047,30 +1047,30 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer .card-host-name {
color: #737373;
font-size: 10px;
padding-bottom: 4px;
text-transform: uppercase;
overflow: hidden;
text-overflow: ellipsis; }
padding-bottom: 4px;
text-overflow: ellipsis;
text-transform: uppercase; }
.card-outer .card-title {
margin: 0 0 2px;
font-size: 14px;
word-wrap: break-word;
line-height: 19px; }
line-height: 19px;
margin: 0 0 2px;
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; }
@ -1103,13 +1103,13 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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) {
@ -1131,8 +1131,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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; }
@ -1142,30 +1142,36 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 12px 12px;
-moz-context-properties: fill;
height: 16px;
width: 16px;
display: inline-block;
fill: rgba(12, 12, 13, 0.6);
height: 16px;
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 {
@ -1182,27 +1188,21 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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;
top: 26px;
width: 320px;
padding: 24px;
box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-moz-user-select: none; }
position: absolute;
top: 26px;
-moz-user-select: none;
width: 320px;
z-index: 9999; }
.collapsible-section .section-top-bar .info-option-header {
font-size: 15px;
font-weight: 600; }
@ -1215,8 +1215,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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;
@ -1256,14 +1256,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }

View File

@ -23,15 +23,15 @@ input {
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 {
@ -44,9 +44,9 @@ input {
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 {
@ -71,8 +71,7 @@ input {
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 {
@ -125,24 +124,24 @@ a {
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 {
@ -155,25 +154,25 @@ a {
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;
margin: 0;
padding: 15px 25px 0 25px;
flex-wrap: wrap;
justify-content: flex-start;
flex-wrap: wrap; }
margin: 0;
padding: 15px 25px 0; }
.actions button {
background-color: #F9F9FA;
border: 1px solid #B1B1B3;
border-radius: 4px;
color: inherit;
cursor: pointer;
padding: 10px 30px;
margin-bottom: 15px;
padding: 10px 30px;
white-space: nowrap; }
.actions button:hover:not(.dismiss) {
box-shadow: 0 0 0 5px #D7D7DB;
@ -193,16 +192,16 @@ a {
.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; } }
@ -245,49 +244,50 @@ main {
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-start: auto;
margin-inline-end: auto;
offset-inline-start: -32px;
offset-inline-end: auto; }
margin-inline-start: 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-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: 544px) and (max-width: 768px) {
.top-sites-list :nth-child(4n+3) .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: 800px) and (max-width: 1248px) {
.top-sites-list :nth-child(6n) .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: 800px) and (max-width: 1024px) {
.top-sites-list :nth-child(6n+5) .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; } }
.top-sites-list li {
display: inline-block;
margin: 0 0 8px;
@ -295,53 +295,56 @@ main {
.top-sites-list .top-site-outer {
position: relative; }
.top-sites-list .top-site-outer > a {
display: block;
color: inherit;
display: block;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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);
color: #737373;
font-weight: 200;
font-size: 32px;
text-transform: uppercase;
display: flex;
height: 96px;
position: relative;
width: 96px;
align-items: center;
justify-content: center; }
color: #737373;
display: flex;
font-size: 32px;
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 {
@ -349,43 +352,43 @@ main {
.top-sites-list .top-site-outer.placeholder .screenshot {
display: none; }
.top-sites-list .top-site-outer .screenshot {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
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);
background-size: cover;
background-position: top left;
height: 100%;
left: 0;
opacity: 0;
position: absolute;
top: 0;
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;
offset-inline-start: 0;
background-size: 96px;
height: 100%;
width: 100%;
background-size: 96px; }
offset-inline-start: 0;
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;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px; }
display: flex;
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 {
@ -423,7 +426,7 @@ main {
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 {
@ -443,9 +446,6 @@ main {
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;
@ -460,7 +460,7 @@ main {
.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;
@ -499,7 +499,7 @@ main {
.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; }
@ -564,59 +564,59 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-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: 544px) and (max-width: 800px) {
.sections-list .section-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: 800px) and (max-width: 1248px) {
.sections-list .section-list :nth-child(3n) .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; } }
.sections-list .section-empty-state {
width: 100%;
height: 266px;
display: flex;
border: 1px solid #D7D7DB;
border-radius: 3px; }
border-radius: 3px;
display: flex;
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 50px 50px;
-moz-context-properties: fill;
display: block;
fill: rgba(12, 12, 13, 0.6);
height: 50px;
width: 50px;
margin: 0 auto;
display: block; }
width: 50px; }
.sections-list .section-empty-state .empty-state .empty-state-message {
margin-bottom: 0;
font-size: 13px;
color: #737373;
font-size: 13px;
margin-bottom: 0;
text-align: center; }
.topic {
font-size: 12px;
color: #737373;
margin-top: 12px;
line-height: 1.6; }
font-size: 12px;
line-height: 1.6;
margin-top: 12px; }
@media (min-width: 800px) {
.topic {
line-height: 16px; } }
@ -656,27 +656,27 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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,
@ -684,23 +684,23 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
box-shadow: 0 0 0 1px #0A84FF; }
.search-wrapper .search-label {
background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
position: absolute;
offset-inline-start: 0;
fill: rgba(12, 12, 13, 0.4);
height: 100%;
offset-inline-start: 0;
position: absolute;
width: 35px; }
.search-wrapper .search-button {
background: url("chrome://browser/skin/forward.svg") no-repeat center center;
border-radius: 0 3px 3px 0;
border: 0;
width: 36px;
fill: rgba(12, 12, 13, 0.4);
-moz-context-properties: fill;
background-size: 16px 16px;
border: 0;
border-radius: 0 3px 3px 0;
-moz-context-properties: fill;
fill: rgba(12, 12, 13, 0.4);
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; }
@ -713,43 +713,43 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
transform: translateY(2px); }
.context-menu {
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; }
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;
font-size: 14px;
margin-inline-start: 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;
line-height: 16px;
cursor: pointer;
display: flex;
align-items: center; }
.context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus {
line-height: 16px;
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 {
@ -859,14 +859,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -882,9 +882,9 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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 {
@ -893,35 +893,35 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }
@ -945,83 +945,83 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer {
background: #FFF;
display: inline-block;
margin-inline-end: 32px;
width: 224px;
border-radius: 3px;
display: inline-block;
height: 266px;
position: relative; }
margin-inline-end: 32px;
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);
transform: scale(0.25);
height: 27px;
offset-inline-end: -13.5px;
opacity: 0;
position: absolute;
top: -13.5px;
transform: scale(0.25);
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 {
display: block;
color: inherit;
display: block;
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;
height: 122px;
border-radius: 3px 3px 0 0;
overflow: hidden; }
height: 122px;
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 {
@ -1029,8 +1029,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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 {
@ -1047,30 +1047,30 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.card-outer .card-host-name {
color: #737373;
font-size: 10px;
padding-bottom: 4px;
text-transform: uppercase;
overflow: hidden;
text-overflow: ellipsis; }
padding-bottom: 4px;
text-overflow: ellipsis;
text-transform: uppercase; }
.card-outer .card-title {
margin: 0 0 2px;
font-size: 14px;
word-wrap: break-word;
line-height: 19px; }
line-height: 19px;
margin: 0 0 2px;
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; }
@ -1103,13 +1103,13 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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) {
@ -1131,8 +1131,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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; }
@ -1142,30 +1142,36 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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-repeat: no-repeat;
background-position: center;
fill: rgba(12, 12, 13, 0.6);
background-repeat: no-repeat;
background-size: 12px 12px;
-moz-context-properties: fill;
height: 16px;
width: 16px;
display: inline-block;
fill: rgba(12, 12, 13, 0.6);
height: 16px;
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 {
@ -1182,27 +1188,21 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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;
top: 26px;
width: 320px;
padding: 24px;
box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-moz-user-select: none; }
position: absolute;
top: 26px;
-moz-user-select: none;
width: 320px;
z-index: 9999; }
.collapsible-section .section-top-bar .info-option-header {
font-size: 15px;
font-weight: 600; }
@ -1215,8 +1215,8 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
.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;
@ -1256,14 +1256,14 @@ section.top-sites:not(.collapsed):hover .edit-topsites-button {
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; }

View File

@ -94,7 +94,7 @@ const globalImportContext = typeof Window === "undefined" ? BACKGROUND_PROCESS :
// 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;
}
@ -310,27 +310,27 @@ 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;
/***/ }),
@ -2473,11 +2473,6 @@ class Search extends React.PureComponent {
// 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);
@ -3769,8 +3764,9 @@ class SnippetsMap extends Map {
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() {
@ -3893,6 +3889,7 @@ class SnippetsProvider {
// 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() {
@ -3958,6 +3955,7 @@ class SnippetsProvider {
}
// 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
@ -3969,6 +3967,13 @@ class SnippetsProvider {
}
}
_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
*
@ -3985,6 +3990,11 @@ class SnippetsProvider {
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) {
@ -4019,6 +4029,9 @@ class SnippetsProvider {
uninit() {
window.dispatchEvent(new Event(SNIPPETS_DISABLED_EVENT));
this._forceOnboardingVisibility(false);
if (global.removeMessageListener) {
global.removeMessageListener("ActivityStream:MainToContent", this._onAction);
}
this.initialized = false;
}
}

View File

@ -8,7 +8,7 @@
<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>

View File

@ -41,10 +41,6 @@ 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 : "")

View File

@ -40,13 +40,6 @@ this.NewTabInit = class NewTabInit {
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)

View File

@ -143,6 +143,9 @@ this.SnippetsFeed = class SnippetsFeed {
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;
}
}
};

View File

@ -2,12 +2,12 @@
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",
@ -39,60 +39,60 @@ window.gActivityStreamStrings = {
"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 youve 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 well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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"
};

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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": "Вызначэнне вашага выбранага",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "Паказаць больш",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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": "আপনার হাইলাইট সমূহ চিহ্নিত করুন",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "আরও দেখান",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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": "আপনার হাইলাইট সমূহ চিহ্নিত করা হচ্ছে",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "আরও দেখান",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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",

View File

@ -39,8 +39,8 @@ window.gActivityStreamStrings = {
"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",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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",
@ -64,10 +64,10 @@ window.gActivityStreamStrings = {
"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",
@ -89,10 +89,10 @@ window.gActivityStreamStrings = {
"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 well show some of the great articles, videos, and other pages youve 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"
};

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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, fideos en siden dy't jo koartlyn besocht hawwe wer te jaan, sadat jo dizze ienfâldichwei weromfine kinne.",
"welcome_label": "Jo hichtepunten oantsjutte",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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": "તમારા હાઇલાઇટ્સ ઓળખવા",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "વધારે બતાવો",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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…",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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",

View File

@ -8,7 +8,7 @@ window.gActivityStreamStrings = {
"header_visit_again": "ხელახლა ნახვა",
"header_bookmarks": "ბოლოს ჩანიშნულები",
"header_recommended_by": "რეკომენდებულია {provider}-ის მიერ",
"header_bookmarks_placeholder": "სანიშნები ჯერ არაა დამატებული.",
"header_bookmarks_placeholder": "სანიშნები ჯერ არაა დამატებული.",
"header_stories_from": "-იდან",
"type_label_visited": "მონახულებული",
"type_label_bookmarked": "ჩანიშნული",
@ -18,12 +18,12 @@ window.gActivityStreamStrings = {
"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": "მოხსნა",
@ -42,7 +42,7 @@ window.gActivityStreamStrings = {
"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}წთ",
@ -57,12 +57,12 @@ window.gActivityStreamStrings = {
"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-ის, ინტერნეტ სამყაროს მიღწევებისა და სხვა დასამახსოვრებელი ფაქტების შესახებ.",
@ -92,7 +92,7 @@ window.gActivityStreamStrings = {
"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": "ახლავე გადმოტანა"
};

View File

@ -3,20 +3,20 @@ 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 dont 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": "ចម្លង​អាសយដ្ឋាន",
@ -25,22 +25,22 @@ window.gActivityStreamStrings = {
"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": "កំពុង​បញ្ជាក់​ការ​រំលេច​របស់​អ្នក",
@ -49,50 +49,50 @@ window.gActivityStreamStrings = {
"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 youve 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 well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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": "នាំចូលឥឡូវនេះ"
};

View File

@ -39,8 +39,8 @@ window.gActivityStreamStrings = {
"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": "하이라이트 확인",
@ -62,12 +62,12 @@ window.gActivityStreamStrings = {
"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 youve 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": "더보기",
@ -90,7 +90,7 @@ window.gActivityStreamStrings = {
"pocket_read_even_more": "더 많은 이야기 보기",
"pocket_feedback_header": "2천 5백만 명에 의해 추천되는 최고의 웹입니다.",
"pocket_description": "Mozilla와 하나가 된 Pocket의 도움으로 놓칠지도 모르는 고품질의 컨텐츠를 접해보세요.",
"highlights_empty_state": "Start browsing, and well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"highlights_empty_state": "브라우징을 시작하면 최근 방문하거나 북마크한 좋은 글이나 영상, 페이지를 여기에 보여줍니다.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.",
"manual_migration_explanation2": "다른 브라우저에 있는 북마크, 기록, 비밀번호를 사용해 Firefox를 이용해 보세요.",
"manual_migration_cancel_button": "괜찮습니다",

View File

@ -4,7 +4,7 @@ window.gActivityStreamStrings = {
"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}",
@ -29,7 +29,7 @@ window.gActivityStreamStrings = {
"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}",
@ -64,7 +64,7 @@ window.gActivityStreamStrings = {
"settings_pane_highlights_body2": "Find your way back to interesting things youve 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",
@ -80,13 +80,13 @@ window.gActivityStreamStrings = {
"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.",
@ -94,7 +94,5 @@ window.gActivityStreamStrings = {
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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": "ນຳເຂົ້າຕອນນີ້"
};

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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": "താങ്കളുടെ ഹൈലൈറ്റ്സ് തിരിച്ചറിയുന്നു",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "കൂടുതൽ കാണിക്കുക",

View File

@ -27,7 +27,7 @@ window.gActivityStreamStrings = {
"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:",
@ -36,7 +36,7 @@ window.gActivityStreamStrings = {
"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.",

View File

@ -41,7 +41,7 @@ window.gActivityStreamStrings = {
"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",
@ -52,7 +52,7 @@ window.gActivityStreamStrings = {
"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",
@ -93,6 +93,6 @@ window.gActivityStreamStrings = {
"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"
};

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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",
@ -61,13 +61,13 @@ window.gActivityStreamStrings = {
"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 youve 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",
@ -89,9 +89,9 @@ window.gActivityStreamStrings = {
"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 well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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"

File diff suppressed because one or more lines are too long

View File

@ -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 youve 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 well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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": "දැන් ආයාත කරන්න"
};

View File

@ -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>

View File

@ -4,7 +4,7 @@ window.gActivityStreamStrings = {
"default_label_loading": "ஏற்றுகிறது…",
"header_top_sites": "சிறந்த தளங்கள்",
"header_stories": "முக்கிய கதைகள்",
"header_highlights": "Highlights",
"header_highlights": "மிளிர்ப்புகள்",
"header_visit_again": "மீண்டும் வருக",
"header_bookmarks": "சமீபத்திய புத்தகக்குறிகள்",
"header_recommended_by": "{provider} என்பவரால் பரிந்துரைக்கப்பட்டது",
@ -36,8 +36,8 @@ window.gActivityStreamStrings = {
"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",
@ -60,10 +60,10 @@ window.gActivityStreamStrings = {
"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 youve 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": "முடிந்தது",
@ -94,10 +94,5 @@ window.gActivityStreamStrings = {
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant 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": "இப்போது இறக்கு"
};

View File

@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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": "แสดงเพิ่มเติม",

View File

@ -38,9 +38,9 @@ window.gActivityStreamStrings = {
"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",
@ -67,7 +67,7 @@ window.gActivityStreamStrings = {
"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",

View File

@ -19,50 +19,6 @@ describe("NewTabInit", () => {
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,

View File

@ -88,6 +88,15 @@ describe("SnippetsFeed", () => {
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()};

View File

@ -132,7 +132,7 @@ describe("TelemetryFeed", () => {
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", () => {

View File

@ -411,7 +411,7 @@ class FormAutofillSection {
this.changeFieldState(fieldDetail, FIELD_STATES.AUTO_FILLED);
}
if (fieldDetail.state == FIELD_STATES.AUTO_FILLED) {
element.addEventListener("input", this);
element.addEventListener("input", this, {mozSystemGroup: true});
}
}
}
@ -513,8 +513,8 @@ class FormAutofillSection {
element instanceof Ci.nsIDOMHTMLInputElement) {
element.setUserInput("");
}
this.changeFieldState(fieldDetail, FIELD_STATES.NORMAL);
}
this.resetFieldStates();
}
/**
@ -557,7 +557,7 @@ class FormAutofillSection {
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;
@ -750,7 +750,7 @@ class FormAutofillSection {
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;
}
}
@ -876,7 +876,7 @@ class FormAutofillHandler {
if (!input) {
continue;
}
input.addEventListener("input", this);
input.addEventListener("input", this, {mozSystemGroup: true});
}
this.fieldDetails = allValidDetails;
@ -954,16 +954,16 @@ class FormAutofillHandler {
}
// 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});
}
}
@ -979,7 +979,7 @@ class FormAutofillHandler {
if (!input) {
continue;
}
input.removeEventListener("input", this);
input.removeEventListener("input", this, {mozSystemGroup: true});
}
this.timeStartedFillingMS = Date.now();
break;

View File

@ -28,6 +28,9 @@ const SIZES_TELEMETRY_ENUM = {
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.
*
@ -120,10 +123,27 @@ function setIconForLink(aIconInfo, aChromeGlobal) {
}
/**
* 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 || "";
}
/*
@ -142,9 +162,7 @@ function faviconTimeoutCallback(aFaviconLoads, aPageUrl, aChromeGlobal) {
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;
@ -157,11 +175,11 @@ function faviconTimeoutCallback(aFaviconLoads, aPageUrl, aChromeGlobal) {
// 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;
}
}
@ -185,7 +203,7 @@ function faviconTimeoutCallback(aFaviconLoads, aPageUrl, aChromeGlobal) {
if (largestRichIcon) {
setIconForLink(largestRichIcon, aChromeGlobal);
}
if (preferredIcon.type) {
if (preferredIcon) {
setIconForLink(preferredIcon, aChromeGlobal);
} else if (defaultIcon) {
setIconForLink(defaultIcon, aChromeGlobal);

View File

@ -376,9 +376,8 @@ var gDevToolsBrowser = exports.gDevToolsBrowser = {
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);
});
}

View File

@ -26,7 +26,7 @@ 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 waitForFrame();
return waitForNextFrame();
}).then(function() {
div.style.animationDuration = '200s';
var animation = div.getAnimations()[0];

View File

@ -18,6 +18,57 @@
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()
{
@ -88,6 +139,7 @@ CustomElementConstructor::Construct(const char* aExecutionReason,
return element.forget();
}
//-----------------------------------------------------
// CustomElementData
@ -1120,24 +1172,5 @@ CustomElementDefinition::CustomElementDefinition(nsAtom* aType,
{
}
//-----------------------------------------------------
// 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

View File

@ -209,41 +209,6 @@ protected:
#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
{

View File

@ -200,9 +200,9 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
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();
@ -213,35 +213,64 @@ nsRange::IsNodeSelected(nsINode* aNode, uint32_t aStartOffset,
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;

View File

@ -34,6 +34,7 @@ NS_IMPL_ISUPPORTS(FallbackEncoding, nsIObserver)
FallbackEncoding* FallbackEncoding::sInstance = nullptr;
bool FallbackEncoding::sGuessFallbackFromTopLevelDomain = true;
bool FallbackEncoding::sFallbackToUTF8ForFile = false;
FallbackEncoding::FallbackEncoding()
: mFallback(nullptr)
@ -139,6 +140,8 @@ FallbackEncoding::Initialize()
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) {

View File

@ -26,6 +26,11 @@ public:
*/
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.

View File

@ -486,6 +486,12 @@ nsHTMLDocument::TryFallback(int32_t& 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();
}

View File

@ -362,8 +362,8 @@ protected:
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

View File

@ -1702,20 +1702,22 @@ MediaManager::EnumerateRawDevices(uint64_t aWindowId,
}
}
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);
@ -1758,9 +1760,7 @@ MediaManager::EnumerateRawDevices(uint64_t aWindowId,
}));
});
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.
@ -2511,9 +2511,15 @@ MediaManager::GetUserMedia(nsPIDOMWindowInner* aWindow,
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);

View File

@ -46,23 +46,28 @@ function checkFrequency(an) {
// 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;
}
@ -73,6 +78,10 @@ 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.

View File

@ -907,7 +907,12 @@ nsEventStatus AsyncPanZoomController::HandleDragEvent(const MouseInput& aEvent,
return nsEventStatus_eConsumeNoDefault;
}
if (aEvent.mType == MouseInput::MouseType::MOUSE_DOWN) {
SetState(SCROLLBAR_DRAG);
}
if (aEvent.mType == MouseInput::MouseType::MOUSE_UP) {
SetState(NOTHING);
ScrollSnap();
}
@ -1148,6 +1153,7 @@ nsEventStatus AsyncPanZoomController::OnTouchStart(const MultiTouchInput& aEvent
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);
@ -1222,6 +1228,7 @@ nsEventStatus AsyncPanZoomController::OnTouchMove(const MultiTouchInput& aEvent)
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.
@ -1304,6 +1311,7 @@ nsEventStatus AsyncPanZoomController::OnTouchEnd(const MultiTouchInput& aEvent)
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.

View File

@ -928,7 +928,8 @@ protected:
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.

View File

@ -1132,13 +1132,6 @@ 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 =

View File

@ -3650,8 +3650,8 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder,
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()) {

View File

@ -4944,7 +4944,8 @@ nsDisplayEventReceiver::CreateWebRenderCommands(mozilla::wr::DisplayListBuilder&
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)
@ -4962,12 +4963,29 @@ nsDisplayCompositorHitTestInfo::nsDisplayCompositorHitTestInfo(nsDisplayListBuil
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
@ -4977,31 +4995,13 @@ nsDisplayCompositorHitTestInfo::CreateWebRenderCommands(mozilla::wr::DisplayList
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));
if (mArea.IsEmpty()) {
return true;
}
MOZ_ASSERT(mArea.isSome());
wr::LayoutRect rect = aSc.ToRelativeLayoutRect(
LayoutDeviceRect::FromAppUnits(
*mArea,
mArea,
mFrame->PresContext()->AppUnitsPerDevPixel()));
// XXX: eventually this scrollId computation and the SetHitTestInfo

View File

@ -4358,7 +4358,8 @@ 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()
@ -4368,7 +4369,6 @@ public:
#endif
mozilla::gfx::CompositorHitTestInfo HitTestInfo() const { return mHitTestInfo; }
void SetArea(const nsRect& aArea);
bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
mozilla::wr::IpcResourceUpdateQueue& aResources,
@ -4385,7 +4385,7 @@ public:
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;
};

View File

@ -19,12 +19,6 @@ DrawEventRecorderPRFileDesc::RecordEvent(const gfx::RecordedEvent& aEvent)
Flush();
}
DrawEventRecorderPRFileDesc::DrawEventRecorderPRFileDesc(const char* aFilename)
{
mOutputStream.Open(aFilename);
WriteHeader(mOutputStream);
}
DrawEventRecorderPRFileDesc::~DrawEventRecorderPRFileDesc()
{
if (IsOpen()) {
@ -45,11 +39,11 @@ DrawEventRecorderPRFileDesc::IsOpen()
}
void
DrawEventRecorderPRFileDesc::OpenNew(const char* aFilename)
DrawEventRecorderPRFileDesc::OpenFD(PRFileDesc* aFd)
{
MOZ_ASSERT(!IsOpen());
mOutputStream.Open(aFilename);
mOutputStream.OpenFD(aFd);
WriteHeader(mOutputStream);
}

View File

@ -25,9 +25,10 @@ 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;
@ -118,7 +119,7 @@ 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;
@ -129,11 +130,9 @@ public:
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

View File

@ -22,9 +22,9 @@ parent:
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.
@ -45,11 +45,13 @@ parent:
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__();
};

View File

@ -9,6 +9,7 @@
#include "mozilla/Unused.h"
#include "nsPagePrintTimer.h"
#include "nsPrintEngine.h"
#include "private/pprio.h"
namespace mozilla {
namespace layout {
@ -36,26 +37,48 @@ RemotePrintJobChild::InitializePrint(const nsString& aDocumentTitle,
}
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();

View File

@ -34,11 +34,13 @@ public:
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;
@ -46,13 +48,17 @@ public:
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

View File

@ -19,6 +19,8 @@
#include "nsIPrintSettings.h"
#include "nsIWebProgressListener.h"
#include "PrintTranslator.h"
#include "private/pprio.h"
#include "nsAnonymousTemporaryFile.h"
namespace mozilla {
namespace layout {
@ -38,14 +40,21 @@ RemotePrintJobParent::RecvInitializePrint(const nsString& aDocumentTitle,
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();
}
@ -82,22 +91,49 @@ RemotePrintJobParent::InitializePrintDevice(const nsString& aDocumentTitle,
return NS_OK;
}
mozilla::ipc::IPCResult
RemotePrintJobParent::RecvProcessPage(const nsCString& aPageFileName)
nsresult
RemotePrintJobParent::PrepareNextPageFD(FileDescriptor* aFd)
{
nsresult rv = PrintPage(aPageFileName);
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()
{
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);
@ -105,29 +141,7 @@ RemotePrintJobParent::PrintPage(const nsCString& aPageFileName)
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;
}
@ -136,12 +150,6 @@ RemotePrintJobParent::PrintPage(const nsCString& aPageFileName)
return rv;
}
recording.Close();
rv = recordingFile->Remove(/* recursive= */ false);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}

View File

@ -8,11 +8,13 @@
#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;
@ -34,7 +36,7 @@ public:
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;
@ -70,12 +72,15 @@ private:
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

View File

@ -145,7 +145,8 @@ nsPagePrintTimer::Notify(nsITimer *timer)
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();
}

View File

@ -50,13 +50,6 @@ static const char* pcmLogTag = "PeerConnectionMedia";
#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,
@ -294,9 +287,6 @@ nsresult PeerConnectionMedia::Init(const std::vector<NrIceStunServer>& stun_serv
}
ConnectSignals(mIceCtxHdlr->ctx().get());
// This webrtc:Call instance will be shared by audio and video media conduits.
mCall = CreateCall();
return NS_OK;
}
@ -1145,6 +1135,10 @@ PeerConnectionMedia::AddTransceiver(
dom::MediaStreamTrack* aSendTrack,
RefPtr<TransceiverImpl>* aTransceiverImpl)
{
if (!mCall) {
mCall = WebRtcCallWrapper::Create();
}
RefPtr<TransceiverImpl> transceiver = new TransceiverImpl(
mParent->GetHandle(),
aJsepTransceiver,

View File

@ -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>

View File

@ -13,5 +13,6 @@
<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>

View File

@ -142,6 +142,22 @@
<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" />

View File

@ -435,7 +435,6 @@ public class BrowserApp extends GeckoApp
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.
@ -444,6 +443,9 @@ public class BrowserApp extends GeckoApp
tab.getEditingState().copyFrom(mLastTabEditingState);
}
break;
case START_EDITING:
enterEditingMode();
break;
}
if (HardwareUtils.isTablet() && msg == TabEvents.SELECTED) {

View File

@ -1411,8 +1411,10 @@ public abstract class GeckoApp extends GeckoActivity
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.
@ -1438,14 +1440,16 @@ public abstract class GeckoApp extends GeckoActivity
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 {
@ -1780,6 +1784,8 @@ public abstract class GeckoApp extends GeckoActivity
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);

View File

@ -84,6 +84,8 @@ public class Tabs implements BundleEventListener {
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;
@ -758,7 +760,8 @@ public class Tabs implements BundleEventListener {
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) {
@ -987,6 +990,7 @@ public class Tabs implements BundleEventListener {
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);
@ -1065,26 +1069,40 @@ public class Tabs implements BundleEventListener {
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);
}
/**

View File

@ -38,12 +38,12 @@ public class RestrictionProvider extends BroadcastReceiver {
@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();

View File

@ -92,8 +92,7 @@ NSSDialogs.prototype = {
], 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
@ -107,7 +106,6 @@ NSSDialogs.prototype = {
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;
}
},

View File

@ -11,7 +11,6 @@ downloadCert.message1=You have been asked to trust a new Certificate Authority (
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

View File

@ -11,6 +11,8 @@ skip-if = android_version == "18"
# 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"

View File

@ -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);
}
}

View File

@ -75,7 +75,7 @@ public class ToolbarComponent extends BaseComponent {
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;
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -2291,6 +2291,7 @@ pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/in
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

View File

@ -38,7 +38,6 @@
<!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">

View File

@ -20,7 +20,6 @@
<!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">

View File

@ -153,16 +153,9 @@ nsNSSDialogs::ConfirmDownloadCACert(nsIInterfaceRequestor* ctx,
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;
}

View File

@ -27,9 +27,6 @@
* @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;
@ -70,13 +67,11 @@ function viewCert() {
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;
}

View File

@ -33,7 +33,6 @@
- "do you want to?"
- * trust for SSL
- * trust for email
- * trust for object signing
-->
<vbox>
<description id="trustHeader"/>
@ -41,8 +40,6 @@
id="trustSSL"/>
<checkbox label="&downloadCert.trustEmail;"
id="trustEmail"/>
<checkbox label="&downloadCert.trustObjSign;"
id="trustObjSign"/>
</vbox>
<separator/>

View File

@ -31,11 +31,6 @@ function onLoad() {
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);
}
/**
@ -46,13 +41,9 @@ function onLoad() {
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;
}

View File

@ -29,8 +29,6 @@
id="trustSSL"/>
<checkbox label="&certmgr.editcert.trustemail;"
id="trustEmail"/>
<checkbox label="&certmgr.editcert.trustobjsign;"
id="trustObjSign"/>
</vbox>
</dialog>

View File

@ -67,7 +67,6 @@ interface nsIX509CertDB : nsISupports {
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
@ -155,8 +154,11 @@ interface nsIX509CertDB : nsISupports {
/**
* @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);
@ -284,7 +286,10 @@ interface nsIX509CertDB : nsISupports {
* @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]
@ -359,7 +364,10 @@ interface nsIX509CertDB : nsISupports {
* @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]

View File

@ -2039,9 +2039,9 @@ getCertType(CERTCertificate* cert)
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;

View File

@ -5,7 +5,7 @@
#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);
@ -15,21 +15,15 @@ nsNSSCertTrust::AddCATrust(bool ssl, bool email, bool objSign)
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()
@ -37,14 +31,11 @@ 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)
@ -103,28 +94,6 @@ nsNSSCertTrust::SetEmailTrust(bool peer, bool tPeer,
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()
{
@ -134,9 +103,6 @@ nsNSSCertTrust::SetValidCA()
SetEmailTrust(false, false,
true, false, false,
false, false);
SetObjSignTrust(false, false,
true, false, false,
false, false);
}
void
@ -148,9 +114,6 @@ nsNSSCertTrust::SetValidPeer()
SetEmailTrust(true, false,
false, false, false,
false, false);
SetObjSignTrust(true, false,
false, false, false,
false, false);
}
bool
@ -164,16 +127,12 @@ nsNSSCertTrust::HasAnyCA()
}
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;
}
@ -188,9 +147,7 @@ nsNSSCertTrust::HasAnyUser()
}
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)))
@ -198,25 +155,16 @@ nsNSSCertTrust::HasTrustedCA(bool checkSSL,
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;
}

View File

@ -15,22 +15,16 @@ 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" */
@ -48,14 +42,10 @@ public:
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; }

Some files were not shown because too many files have changed in this diff Show More