Update On Sun Jun 16 20:44:32 CEST 2024
This commit is contained in:
parent
35dd568836
commit
1783cf35d2
84 changed files with 1556 additions and 813 deletions
|
@ -1441,7 +1441,7 @@ pref("browser.bookmarks.editDialog.maxRecentFolders", 7);
|
|||
// See - security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
|
||||
// SetSecurityLevelForContentProcess() for what the different settings mean.
|
||||
#if defined(NIGHTLY_BUILD)
|
||||
pref("security.sandbox.content.level", 8);
|
||||
pref("security.sandbox.content.level", 7);
|
||||
#else
|
||||
pref("security.sandbox.content.level", 7);
|
||||
#endif
|
||||
|
@ -1902,6 +1902,7 @@ pref("pdfjs.handleOctetStream", true);
|
|||
pref("sidebar.position_start", true);
|
||||
pref("sidebar.revamp", false);
|
||||
pref("sidebar.main.tools", "history,syncedtabs");
|
||||
pref("sidebar.verticalTabs", false);
|
||||
|
||||
pref("browser.ml.chat.enabled", false);
|
||||
pref("browser.ml.chat.prompt.prefix", 'I’m on page "%currentTabTitle%" with "%selection|12000%" selected. ');
|
||||
|
@ -1909,6 +1910,7 @@ pref("browser.ml.chat.prompts.0", '{"label":"Summarize","value":"Please summariz
|
|||
pref("browser.ml.chat.prompts.1", '{"label":"Simplify language","value":"Please rewrite the selection in plain, clear language suitable for a general audience without specialized knowledge. Use all of the following tactics: simple vocabulary; short sentences; active voice; examples where applicable to make explanations clearer; explanations for jargon and technical terms; headers and bulleted lists for scannability. Maintain factual accuracy while simplifying."}');
|
||||
pref("browser.ml.chat.prompts.2", '{"label":"Quiz me","value":"Please create questions related to the selection. Ask the questions one by one. Wait for my response before moving on to the next question. Evaluate each response. Ask a variety of types of questions, like multiple choice, true or false and short answer."}');
|
||||
pref("browser.ml.chat.provider", "");
|
||||
pref("browser.ml.chat.sidebar", true);
|
||||
|
||||
pref("security.protectionspopup.recordEventTelemetry", true);
|
||||
pref("security.app_menu.recordEventTelemetry", true);
|
||||
|
|
|
@ -4,7 +4,10 @@
|
|||
|
||||
<hbox flex="1" id="browser">
|
||||
<box context="sidebar-context-menu" id="sidebar-main" hidden="true">
|
||||
<html:sidebar-main flex="1"></html:sidebar-main>
|
||||
<html:sidebar-main flex="1">
|
||||
<html:div id="vertical-tabs" slot="tabstrip">
|
||||
</html:div>
|
||||
</html:sidebar-main>
|
||||
</box>
|
||||
<vbox id="sidebar-box" hidden="true" class="chromeclass-extrachrome">
|
||||
<box id="sidebar-header" align="center">
|
||||
|
|
|
@ -22,8 +22,15 @@ XPCOMUtils.defineLazyPreferenceGetter(
|
|||
"chatProvider",
|
||||
"browser.ml.chat.provider"
|
||||
);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazy,
|
||||
"chatSidebar",
|
||||
"browser.ml.chat.sidebar"
|
||||
);
|
||||
|
||||
export const GenAI = {
|
||||
chatProviders: new Map(),
|
||||
|
||||
/**
|
||||
* Build prompts menu to ask chat for context menu or popup.
|
||||
*
|
||||
|
@ -45,7 +52,9 @@ export const GenAI = {
|
|||
try {
|
||||
prompt = JSON.parse(prompt);
|
||||
} catch (ex) {}
|
||||
menu.appendItem(prompt.label ?? prompt, prompt.value ?? "");
|
||||
menu
|
||||
.appendItem(prompt.label ?? prompt, prompt.value ?? "")
|
||||
.addEventListener("command", this.handleAskChat.bind(this));
|
||||
} catch (ex) {
|
||||
console.error("Failed to add menu item for " + pref, ex);
|
||||
}
|
||||
|
@ -78,7 +87,7 @@ export const GenAI = {
|
|||
*
|
||||
* @param {Event} event from menu command
|
||||
*/
|
||||
handleAskChat({ target }) {
|
||||
async handleAskChat({ target }) {
|
||||
const win = target.ownerGlobal;
|
||||
const { selectedTab } = win.gBrowser;
|
||||
const url = new URL(lazy.chatProvider);
|
||||
|
@ -90,7 +99,12 @@ export const GenAI = {
|
|||
selection: target.closest("menu").context.selectionInfo.fullText ?? "",
|
||||
})
|
||||
);
|
||||
win.openWebLinkIn(url + "", "tab", { relatedToCurrent: true });
|
||||
if (lazy.chatSidebar) {
|
||||
await win.SidebarController.show("viewGenaiChatSidebar");
|
||||
win.SidebarController.browser.contentWindow.request(url);
|
||||
} else {
|
||||
win.openWebLinkIn(url + "", "tab", { relatedToCurrent: true });
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
18
browser/components/genai/chat.css
Normal file
18
browser/components/genai/chat.css
Normal file
|
@ -0,0 +1,18 @@
|
|||
/* 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/. */
|
||||
|
||||
body {
|
||||
inset: 0;
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
browser {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
body, div {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
|
@ -15,7 +15,9 @@
|
|||
rel="stylesheet"
|
||||
href="chrome://browser/content/sidebar/sidebar.css"
|
||||
/>
|
||||
<link rel="stylesheet" href="chrome://browser/content/genai/chat.css" />
|
||||
<script src="chrome://browser/content/contentTheme.js"></script>
|
||||
<script src="chrome://browser/content/genai/chat.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
|
|
97
browser/components/genai/chat.js
Normal file
97
browser/components/genai/chat.js
Normal file
|
@ -0,0 +1,97 @@
|
|||
/* 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/. */
|
||||
|
||||
const lazy = {};
|
||||
ChromeUtils.defineESModuleGetters(lazy, {
|
||||
GenAI: "resource:///modules/GenAI.sys.mjs",
|
||||
});
|
||||
const { XPCOMUtils } = ChromeUtils.importESModule(
|
||||
"resource://gre/modules/XPCOMUtils.sys.mjs"
|
||||
);
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
lazy,
|
||||
"providerPref",
|
||||
"browser.ml.chat.provider",
|
||||
null,
|
||||
renderProviders
|
||||
);
|
||||
|
||||
const node = {};
|
||||
|
||||
function request(url = lazy.providerPref) {
|
||||
try {
|
||||
node.chat.fixupAndLoadURIString(url, {
|
||||
triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal(
|
||||
{}
|
||||
),
|
||||
});
|
||||
} catch (ex) {
|
||||
console.error("Failed to request chat provider", ex);
|
||||
}
|
||||
}
|
||||
|
||||
function renderChat() {
|
||||
const browser = document.createXULElement("browser");
|
||||
browser.setAttribute("type", "content");
|
||||
browser.setAttribute("remote", "true");
|
||||
return document.body.appendChild(browser);
|
||||
}
|
||||
|
||||
async function renderProviders() {
|
||||
// Skip potential pref change callback when unloading
|
||||
if ((await document.visibilityState) == "hidden") {
|
||||
return null;
|
||||
}
|
||||
|
||||
const select = document.getElementById("provider");
|
||||
select.innerHTML = "";
|
||||
let selected = false;
|
||||
|
||||
const addOption = (text, val) => {
|
||||
const option = select.appendChild(document.createElement("option"));
|
||||
option.textContent = text;
|
||||
option.value = val;
|
||||
return option;
|
||||
};
|
||||
|
||||
// Add the known providers in order while looking for current selection
|
||||
lazy.GenAI.chatProviders.forEach((data, url) => {
|
||||
const option = addOption(data.name, url);
|
||||
if (lazy.providerPref == url) {
|
||||
option.selected = true;
|
||||
selected = true;
|
||||
}
|
||||
});
|
||||
|
||||
// Must be a custom preference if provider wasn't found
|
||||
if (!selected) {
|
||||
const option = addOption(
|
||||
`Custom provider (${lazy.providerPref})`,
|
||||
lazy.providerPref
|
||||
);
|
||||
option.selected = true;
|
||||
}
|
||||
|
||||
// Load the requested provider
|
||||
request();
|
||||
return select;
|
||||
}
|
||||
|
||||
function handleChange({ target }) {
|
||||
const { value } = target;
|
||||
switch (target) {
|
||||
case node.provider:
|
||||
Services.prefs.setStringPref("browser.ml.chat.provider", value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
async function handleLoad() {
|
||||
node.chat = renderChat();
|
||||
node.provider = await renderProviders();
|
||||
}
|
||||
|
||||
addEventListener("change", handleChange);
|
||||
addEventListener("load", handleLoad);
|
|
@ -3,4 +3,6 @@
|
|||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
browser.jar:
|
||||
content/browser/genai/chat.css
|
||||
content/browser/genai/chat.html
|
||||
content/browser/genai/chat.js
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
["browser_chat_contextmenu.js"]
|
||||
["browser_chat_sidebar.js"]
|
||||
|
|
|
@ -55,3 +55,51 @@ add_task(async function test_menu_enabled() {
|
|||
await hideContextMenu();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Check tab behavior of chat menu items without sidebar pref
|
||||
*/
|
||||
add_task(async function test_open_tab() {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["browser.ml.chat.enabled", true],
|
||||
["browser.ml.chat.provider", "http://localhost:8080"],
|
||||
["browser.ml.chat.sidebar", false],
|
||||
],
|
||||
});
|
||||
await BrowserTestUtils.withNewTab("about:blank", async () => {
|
||||
const origTabs = gBrowser.tabs.length;
|
||||
await openContextMenu();
|
||||
await BrowserTestUtils.switchTab(gBrowser, () =>
|
||||
document.getElementById("context-ask-chat").getItemAtIndex(0).click()
|
||||
);
|
||||
await hideContextMenu();
|
||||
|
||||
Assert.equal(gBrowser.tabs.length, origTabs + 1, "Chat opened tabs");
|
||||
Assert.ok(!SidebarController.isOpen, "Chat did not open sidebar");
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Check sidebar behavior of chat menu items with sidebar pref
|
||||
*/
|
||||
add_task(async function test_open_sidebar() {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["browser.ml.chat.enabled", true],
|
||||
["browser.ml.chat.provider", "http://localhost:8080"],
|
||||
["browser.ml.chat.sidebar", true],
|
||||
],
|
||||
});
|
||||
await BrowserTestUtils.withNewTab("about:blank", async () => {
|
||||
const origTabs = gBrowser.tabs.length;
|
||||
await openContextMenu();
|
||||
document.getElementById("context-ask-chat").getItemAtIndex(0).click();
|
||||
await hideContextMenu();
|
||||
|
||||
Assert.equal(gBrowser.tabs.length, origTabs, "Chat did not open tab");
|
||||
Assert.ok(SidebarController.isOpen, "Chat opened sidebar");
|
||||
SidebarController.hide();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* Check that chat sidebar renders
|
||||
*/
|
||||
add_task(async function test_sidebar_render() {
|
||||
await SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["browser.ml.chat.enabled", true],
|
||||
["browser.ml.chat.provider", "http://mochi.test:8888"],
|
||||
],
|
||||
});
|
||||
|
||||
await SidebarController.show("viewGenaiChatSidebar");
|
||||
|
||||
const provider =
|
||||
SidebarController.browser.contentWindow.document.getElementById("provider");
|
||||
Assert.ok(provider, "Rendered provider select");
|
||||
|
||||
SidebarController.hide();
|
||||
});
|
|
@ -583,6 +583,10 @@ export class ScreenshotsOverlay {
|
|||
this.maybeLockFocus(event);
|
||||
return;
|
||||
case "Enter":
|
||||
if (this.handleKeyDownOnButton(event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.hoverElementRegion.isRegionValid) {
|
||||
this.draggingReadyStart();
|
||||
this.draggingReadyDragEnd();
|
||||
|
@ -590,7 +594,10 @@ export class ScreenshotsOverlay {
|
|||
}
|
||||
// eslint-disable-next-line no-fallthrough
|
||||
case " ": {
|
||||
this.handleKeyDownOnButton(event);
|
||||
if (this.handleKeyDownOnButton(event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Services.appinfo.isWayland) {
|
||||
return;
|
||||
}
|
||||
|
@ -1090,7 +1097,10 @@ export class ScreenshotsOverlay {
|
|||
case this.downloadButton:
|
||||
this.downloadSelectedRegion();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -12,10 +12,10 @@ const lazy = {};
|
|||
// MAX_PATH_LENGTH_WINDOWS - downloadDir length - null terminator character
|
||||
// in the function getMaxFilenameLength below.
|
||||
export const MAX_PATH_LENGTH_WINDOWS = 259;
|
||||
// Windows allows 255 character filenames in the filepicker
|
||||
// macOS has a max filename length of 255 characters
|
||||
// Linux has a max filename length of 255 bytes
|
||||
export const MAX_FILENAME_LENGTH = 255;
|
||||
export const FALLBACK_MAX_FILENAME_LENGTH = 64;
|
||||
|
||||
ChromeUtils.defineESModuleGetters(lazy, {
|
||||
Downloads: "resource://gre/modules/Downloads.sys.mjs",
|
||||
|
@ -28,22 +28,18 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
|||
/**
|
||||
* macOS and Linux have a max filename of 255.
|
||||
* Windows allows 259 as the total path length so we have to calculate the max
|
||||
* filename length if the download directory exists. Otherwise we just return a
|
||||
* fallback filename length.
|
||||
* filename length if the download directory exists. Otherwise, Windows allows
|
||||
* 255 character filenames in the filepicker.
|
||||
*
|
||||
* @param {string} downloadDir The current download directory or null
|
||||
* @returns {number} The max filename length
|
||||
*/
|
||||
export function getMaxFilenameLength(downloadDir = null) {
|
||||
if (AppConstants.platform !== "win") {
|
||||
if (!downloadDir || AppConstants.platform !== "win") {
|
||||
return MAX_FILENAME_LENGTH;
|
||||
}
|
||||
|
||||
if (downloadDir) {
|
||||
return MAX_PATH_LENGTH_WINDOWS - downloadDir.length - 1;
|
||||
}
|
||||
|
||||
return FALLBACK_MAX_FILENAME_LENGTH;
|
||||
return MAX_PATH_LENGTH_WINDOWS - downloadDir.length - 1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -537,6 +537,8 @@ add_task(async function test_clickingButtonsWithKeyDown() {
|
|||
helper.triggerUIFromToolbar();
|
||||
await helper.waitForOverlay();
|
||||
|
||||
await helper.hoverTestPageElement();
|
||||
|
||||
await SpecialPowers.spawn(browser, [], () => {
|
||||
let screenshotsChild = content.windowGlobalChild.getActor(
|
||||
"ScreenshotsComponent"
|
||||
|
|
|
@ -629,6 +629,17 @@ class ScreenshotsHelper {
|
|||
});
|
||||
}
|
||||
|
||||
async hoverTestPageElement(elementId = "testPageElement") {
|
||||
let rect = await this.getTestPageElementRect(elementId);
|
||||
let dims = await this.getContentDimensions();
|
||||
|
||||
let x = Math.floor(rect.x + dims.scrollX + rect.width / 2);
|
||||
let y = Math.floor(rect.y + dims.scrollY + rect.height / 2);
|
||||
|
||||
mouse.move(x, y);
|
||||
await this.waitForHoverElementRect(rect.width, rect.height);
|
||||
}
|
||||
|
||||
async clickTestPageElement(elementId = "testPageElement") {
|
||||
let rect = await this.getTestPageElementRect(elementId);
|
||||
let dims = await this.getContentDimensions();
|
||||
|
|
|
@ -244,6 +244,10 @@ var SidebarController = {
|
|||
document.getElementById("sidebar-header").hidden = true;
|
||||
this._sidebarMain = document.querySelector("sidebar-main");
|
||||
mainResizeObserver.observe(this._sidebarMain);
|
||||
|
||||
if (this.sidebarVerticalTabsEnabled) {
|
||||
this.toggleTabstrip();
|
||||
}
|
||||
} else {
|
||||
this._switcherTarget.addEventListener("command", () => {
|
||||
this.toggleSwitcherPanel();
|
||||
|
@ -1060,6 +1064,43 @@ var SidebarController = {
|
|||
}
|
||||
}
|
||||
},
|
||||
|
||||
toggleTabstrip() {
|
||||
let tabStrip = document.getElementById("tabbrowser-tabs");
|
||||
let arrowScrollbox = document.getElementById("tabbrowser-arrowscrollbox");
|
||||
let verticalTabs = document.getElementById("vertical-tabs");
|
||||
|
||||
let tabsToolbarWidgets = CustomizableUI.getWidgetIdsInArea("TabsToolbar");
|
||||
let tabstripPlacement = tabsToolbarWidgets.findIndex(
|
||||
item => item == "tabbrowser-tabs"
|
||||
);
|
||||
|
||||
if (this.sidebarVerticalTabsEnabled) {
|
||||
arrowScrollbox.setAttribute("orient", "vertical");
|
||||
tabStrip.setAttribute("orient", "vertical");
|
||||
tabStrip.removeAttribute("overflow");
|
||||
tabStrip._positionPinnedTabs();
|
||||
verticalTabs.append(tabStrip);
|
||||
} else {
|
||||
arrowScrollbox.setAttribute("orient", "horizontal");
|
||||
tabStrip.removeAttribute("orient");
|
||||
|
||||
// make sure we put the tabstrip back in its original position in the TabsToolbar
|
||||
if (tabstripPlacement < tabsToolbarWidgets.length) {
|
||||
document
|
||||
.getElementById("TabsToolbar-customization-target")
|
||||
.insertBefore(
|
||||
tabStrip,
|
||||
document.getElementById(tabsToolbarWidgets[tabstripPlacement + 1])
|
||||
);
|
||||
} else {
|
||||
document
|
||||
.getElementById("TabsToolbar-customization-target")
|
||||
.append(tabStrip);
|
||||
}
|
||||
}
|
||||
verticalTabs.toggleAttribute("activated", this.sidebarVerticalTabsEnabled);
|
||||
},
|
||||
};
|
||||
|
||||
// Add getters related to the position here, since we will want them
|
||||
|
@ -1083,3 +1124,10 @@ XPCOMUtils.defineLazyPreferenceGetter(
|
|||
"sidebar.main.tools",
|
||||
"history, syncedtabs"
|
||||
);
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
SidebarController,
|
||||
"sidebarVerticalTabsEnabled",
|
||||
"sidebar.verticalTabs",
|
||||
false,
|
||||
SidebarController.toggleTabstrip.bind(SidebarController)
|
||||
);
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
grid-template-rows: auto 1fr;
|
||||
box-sizing: border-box;
|
||||
height: 100%;
|
||||
padding: var(--space-medium);
|
||||
min-width: 50px;
|
||||
padding-inline-start: var(--space-medium);
|
||||
border-inline-end: 1px solid var(--chrome-content-separator-color);
|
||||
background-color: var(--sidebar-background-color);
|
||||
color: var(--sidebar-text-color);
|
||||
|
|
|
@ -20,7 +20,7 @@ import "chrome://global/content/elements/moz-button.mjs";
|
|||
export default class SidebarMain extends MozLitElement {
|
||||
static properties = {
|
||||
bottomActions: { type: Array },
|
||||
expanded: { type: Boolean },
|
||||
expanded: { type: Boolean, reflect: true },
|
||||
selectedView: { type: String },
|
||||
sidebarItems: { type: Array },
|
||||
open: { type: Boolean },
|
||||
|
@ -87,9 +87,13 @@ export default class SidebarMain extends MozLitElement {
|
|||
// Store the context menu target which holds the id required for managing sidebar items
|
||||
this.contextMenuTarget =
|
||||
event.explicitOriginalTarget.flattenedTreeParentNode;
|
||||
if (!this.contextMenuTarget.getAttribute("extensionId")) {
|
||||
event.preventDefault();
|
||||
if (
|
||||
this.contextMenuTarget.getAttribute("extensionId") ||
|
||||
this.contextMenuTarget.className.includes("tab")
|
||||
) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
async manageExtension() {
|
||||
|
@ -219,6 +223,7 @@ export default class SidebarMain extends MozLitElement {
|
|||
href="chrome://browser/content/sidebar/sidebar-main.css"
|
||||
/>
|
||||
<div class="wrapper">
|
||||
<slot name="tabstrip"></slot>
|
||||
<button-group
|
||||
class="tools-and-extensions actions-list"
|
||||
orientation="vertical"
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
[DEFAULT]
|
||||
support-files = ["head.js"]
|
||||
|
||||
["browser_adopt_sidebar_from_opener.js"]
|
||||
|
||||
["browser_a11y_sidebar.js"]
|
||||
|
||||
["browser_adopt_sidebar_from_opener.js"]
|
||||
|
||||
["browser_customize_sidebar.js"]
|
||||
|
||||
["browser_domfullscreen_sidebar.js"]
|
||||
|
@ -23,4 +23,6 @@ support-files = ["head.js"]
|
|||
|
||||
["browser_toolbar_sidebar_button.js"]
|
||||
|
||||
["browser_vertical_tabs.js"]
|
||||
|
||||
["browser_view_sidebar_menu.js"]
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
https://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
add_setup(() =>
|
||||
SpecialPowers.pushPrefEnv({
|
||||
set: [
|
||||
["sidebar.revamp", true],
|
||||
["sidebar.verticalTabs", false],
|
||||
],
|
||||
})
|
||||
);
|
||||
registerCleanupFunction(() => SpecialPowers.popPrefEnv());
|
||||
|
||||
add_task(async function test_toggle_vertical_tabs() {
|
||||
const win = await BrowserTestUtils.openNewBrowserWindow();
|
||||
await waitForBrowserWindowActive(win);
|
||||
const { document } = win;
|
||||
const sidebar = document.querySelector("sidebar-main");
|
||||
ok(sidebar, "Sidebar is shown.");
|
||||
|
||||
let tabStrip = document.getElementById("tabbrowser-tabs");
|
||||
let defaultTabstripParent = document.getElementById(
|
||||
"TabsToolbar-customization-target"
|
||||
);
|
||||
let verticalTabs = document.querySelector("#vertical-tabs");
|
||||
ok(
|
||||
!BrowserTestUtils.isVisible(verticalTabs),
|
||||
"Vertical tabs slot is not visible"
|
||||
);
|
||||
|
||||
is(
|
||||
tabStrip.parentNode,
|
||||
defaultTabstripParent,
|
||||
"Tabstrip is in default horizontal position"
|
||||
);
|
||||
is(
|
||||
tabStrip.nextElementSibling.id,
|
||||
"new-tab-button",
|
||||
"Tabstrip is before the new tab button"
|
||||
);
|
||||
|
||||
// flip the pref to move the tabstrip into the sidebar
|
||||
await SpecialPowers.pushPrefEnv({ set: [["sidebar.verticalTabs", true]] });
|
||||
ok(BrowserTestUtils.isVisible(verticalTabs), "Vertical tabs slot is visible");
|
||||
is(
|
||||
tabStrip.parentNode,
|
||||
verticalTabs,
|
||||
"Tabstrip is slotted into the sidebar vertical tabs container"
|
||||
);
|
||||
is(win.gBrowser.tabs.length, 1, "Tabstrip now has one tab");
|
||||
|
||||
// make sure the tab context menu still works
|
||||
const contextMenu = document.getElementById("tabContextMenu");
|
||||
win.gBrowser.selectedTab.focus();
|
||||
EventUtils.synthesizeMouseAtCenter(
|
||||
win.gBrowser.selectedTab,
|
||||
{
|
||||
type: "contextmenu",
|
||||
button: 2,
|
||||
},
|
||||
win
|
||||
);
|
||||
|
||||
await openAndWaitForContextMenu(contextMenu, win.gBrowser.selectedTab, () => {
|
||||
document.getElementById("context_openANewTab").click();
|
||||
});
|
||||
|
||||
is(win.gBrowser.tabs.length, 2, "Tabstrip now has two tabs");
|
||||
|
||||
// flip the pref to move the tabstrip horizontally
|
||||
await SpecialPowers.pushPrefEnv({ set: [["sidebar.verticalTabs", false]] });
|
||||
|
||||
ok(
|
||||
!BrowserTestUtils.isVisible(verticalTabs),
|
||||
"Vertical tabs slot is not visible"
|
||||
);
|
||||
is(
|
||||
tabStrip.parentNode,
|
||||
defaultTabstripParent,
|
||||
"Tabstrip is in default horizontal position"
|
||||
);
|
||||
is(
|
||||
tabStrip.nextElementSibling.id,
|
||||
"new-tab-button",
|
||||
"Tabstrip is before the new tab button"
|
||||
);
|
||||
|
||||
await BrowserTestUtils.closeWindow(win);
|
||||
});
|
|
@ -1182,7 +1182,8 @@
|
|||
// - for vertical orientation
|
||||
if (
|
||||
event.originalTarget != arrowScrollbox.scrollbox ||
|
||||
event.detail == 0
|
||||
event.detail == 0 ||
|
||||
event.originalTarget.getAttribute("orient") == "vertical"
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -29,15 +29,17 @@ add_task(
|
|||
"uk"
|
||||
);
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.translateButton,
|
||||
"KEY_Enter"
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
@ -79,15 +81,17 @@ add_task(
|
|||
"fr"
|
||||
);
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.translateButton,
|
||||
" "
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
|
|
@ -23,11 +23,18 @@ add_task(
|
|||
onOpenPanel: SelectTranslationsTestUtils.assertPanelViewTranslated,
|
||||
});
|
||||
|
||||
const fullPageTranslationCompletePromise =
|
||||
FullPageTranslationsTestUtils.assertTranslationsButton(
|
||||
{ button: true, circleArrows: false, locale: true, icon: true },
|
||||
"The icon presents the locale."
|
||||
);
|
||||
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.translateFullPageButton,
|
||||
"KEY_Enter"
|
||||
);
|
||||
|
||||
await fullPageTranslationCompletePromise;
|
||||
await FullPageTranslationsTestUtils.assertPageIsTranslated(
|
||||
"es",
|
||||
"en",
|
||||
|
@ -67,11 +74,18 @@ add_task(
|
|||
onOpenPanel: SelectTranslationsTestUtils.assertPanelViewTranslated,
|
||||
});
|
||||
|
||||
const fullPageTranslationCompletePromise =
|
||||
FullPageTranslationsTestUtils.assertTranslationsButton(
|
||||
{ button: true, circleArrows: false, locale: true, icon: true },
|
||||
"The icon presents the locale."
|
||||
);
|
||||
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.translateFullPageButton,
|
||||
" "
|
||||
);
|
||||
|
||||
await fullPageTranslationCompletePromise;
|
||||
await FullPageTranslationsTestUtils.assertPageIsTranslated(
|
||||
"fr",
|
||||
"en",
|
||||
|
|
|
@ -22,15 +22,17 @@ add_task(
|
|||
onOpenPanel: SelectTranslationsTestUtils.assertPanelViewInitFailure,
|
||||
});
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.tryAgainButton,
|
||||
"KEY_Enter"
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
@ -65,15 +67,17 @@ add_task(
|
|||
onOpenPanel: SelectTranslationsTestUtils.assertPanelViewInitFailure,
|
||||
});
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.tryAgainButton,
|
||||
" "
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
|
|
@ -26,15 +26,17 @@ add_task(
|
|||
SelectTranslationsTestUtils.assertPanelViewTranslationFailure,
|
||||
});
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.tryAgainButton,
|
||||
"KEY_Enter"
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
@ -73,15 +75,17 @@ add_task(
|
|||
SelectTranslationsTestUtils.assertPanelViewTranslationFailure,
|
||||
});
|
||||
|
||||
const translatablePhasePromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translatable");
|
||||
focusElementAndSynthesizeKey(
|
||||
SelectTranslationsPanel.elements.tryAgainButton,
|
||||
" "
|
||||
);
|
||||
await translatablePhasePromise;
|
||||
|
||||
const translatedPromise =
|
||||
SelectTranslationsTestUtils.waitForPanelState("translated");
|
||||
await resolveDownloads(1);
|
||||
await translatedPromise;
|
||||
await SelectTranslationsTestUtils.handleDownloads({
|
||||
downloadHandler: resolveDownloads,
|
||||
});
|
||||
await SelectTranslationsTestUtils.assertPanelViewTranslated();
|
||||
|
||||
await closeAllOpenPanelsAndMenus();
|
||||
|
|
|
@ -1620,6 +1620,7 @@ class SelectTranslationsTestUtils {
|
|||
await BrowserTestUtils.waitForEvent(
|
||||
document,
|
||||
"SelectTranslationsPanelStateChanged",
|
||||
false,
|
||||
event => event.detail.phase === phase
|
||||
);
|
||||
}
|
||||
|
@ -2195,8 +2196,8 @@ class SelectTranslationsTestUtils {
|
|||
assertVisibility({ visible: { translateFullPageButton } });
|
||||
click(translateFullPageButton);
|
||||
await FullPageTranslationsTestUtils.assertTranslationsButton(
|
||||
{ button: true, circleArrows: true, locale: false, icon: true },
|
||||
"The icon presents the loading indicator."
|
||||
{ button: true, circleArrows: false, locale: true, icon: true },
|
||||
"The icon presents the locale."
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -23,8 +23,6 @@ if test "$OS_ARCH" = "WINNT"; then
|
|||
fi
|
||||
fi
|
||||
|
||||
BROWSER_CHROME_URL=chrome://browser/content/browser.xhtml
|
||||
|
||||
# MOZ_APP_DISPLAYNAME will be set by branding/configure.sh
|
||||
# MOZ_BRANDING_DIRECTORY is the default branding directory used when none is
|
||||
# specified. It should never point to the "official" branding directory.
|
||||
|
@ -33,8 +31,3 @@ BROWSER_CHROME_URL=chrome://browser/content/browser.xhtml
|
|||
# For the mozilla-aurora repository, use "aurora".
|
||||
MOZ_BRANDING_DIRECTORY=browser/branding/unofficial
|
||||
MOZ_OFFICIAL_BRANDING_DIRECTORY=browser/branding/official
|
||||
|
||||
MOZ_PROFILE_MIGRATOR=1
|
||||
|
||||
# Include the DevTools client, not just the server (which is the default)
|
||||
MOZ_DEVTOOLS=all
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"af": {
|
||||
"pin": false,
|
||||
|
@ -35,7 +35,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"an": {
|
||||
"pin": false,
|
||||
|
@ -54,7 +54,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ar": {
|
||||
"pin": false,
|
||||
|
@ -73,7 +73,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ast": {
|
||||
"pin": false,
|
||||
|
@ -92,7 +92,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"az": {
|
||||
"pin": false,
|
||||
|
@ -111,7 +111,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"be": {
|
||||
"pin": false,
|
||||
|
@ -130,7 +130,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bg": {
|
||||
"pin": false,
|
||||
|
@ -149,7 +149,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bn": {
|
||||
"pin": false,
|
||||
|
@ -168,7 +168,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bo": {
|
||||
"pin": false,
|
||||
|
@ -187,7 +187,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"br": {
|
||||
"pin": false,
|
||||
|
@ -206,7 +206,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"brx": {
|
||||
"pin": false,
|
||||
|
@ -225,7 +225,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bs": {
|
||||
"pin": false,
|
||||
|
@ -244,7 +244,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ca": {
|
||||
"pin": false,
|
||||
|
@ -263,7 +263,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ca-valencia": {
|
||||
"pin": false,
|
||||
|
@ -282,7 +282,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cak": {
|
||||
"pin": false,
|
||||
|
@ -301,7 +301,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ckb": {
|
||||
"pin": false,
|
||||
|
@ -320,7 +320,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cs": {
|
||||
"pin": false,
|
||||
|
@ -339,7 +339,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cy": {
|
||||
"pin": false,
|
||||
|
@ -358,7 +358,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"da": {
|
||||
"pin": false,
|
||||
|
@ -377,7 +377,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"de": {
|
||||
"pin": false,
|
||||
|
@ -396,7 +396,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"dsb": {
|
||||
"pin": false,
|
||||
|
@ -415,7 +415,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"el": {
|
||||
"pin": false,
|
||||
|
@ -434,7 +434,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"en-CA": {
|
||||
"pin": false,
|
||||
|
@ -453,7 +453,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"en-GB": {
|
||||
"pin": false,
|
||||
|
@ -472,7 +472,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"eo": {
|
||||
"pin": false,
|
||||
|
@ -491,7 +491,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-AR": {
|
||||
"pin": false,
|
||||
|
@ -510,7 +510,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-CL": {
|
||||
"pin": false,
|
||||
|
@ -529,7 +529,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-ES": {
|
||||
"pin": false,
|
||||
|
@ -548,7 +548,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-MX": {
|
||||
"pin": false,
|
||||
|
@ -567,7 +567,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"et": {
|
||||
"pin": false,
|
||||
|
@ -586,7 +586,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"eu": {
|
||||
"pin": false,
|
||||
|
@ -605,7 +605,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fa": {
|
||||
"pin": false,
|
||||
|
@ -624,7 +624,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ff": {
|
||||
"pin": false,
|
||||
|
@ -643,7 +643,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fi": {
|
||||
"pin": false,
|
||||
|
@ -662,7 +662,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fr": {
|
||||
"pin": false,
|
||||
|
@ -681,7 +681,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fur": {
|
||||
"pin": false,
|
||||
|
@ -700,7 +700,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fy-NL": {
|
||||
"pin": false,
|
||||
|
@ -719,7 +719,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ga-IE": {
|
||||
"pin": false,
|
||||
|
@ -738,7 +738,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gd": {
|
||||
"pin": false,
|
||||
|
@ -757,7 +757,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gl": {
|
||||
"pin": false,
|
||||
|
@ -776,7 +776,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gn": {
|
||||
"pin": false,
|
||||
|
@ -795,7 +795,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gu-IN": {
|
||||
"pin": false,
|
||||
|
@ -814,7 +814,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"he": {
|
||||
"pin": false,
|
||||
|
@ -833,7 +833,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hi-IN": {
|
||||
"pin": false,
|
||||
|
@ -852,7 +852,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hr": {
|
||||
"pin": false,
|
||||
|
@ -871,7 +871,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hsb": {
|
||||
"pin": false,
|
||||
|
@ -890,7 +890,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hu": {
|
||||
"pin": false,
|
||||
|
@ -909,7 +909,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hy-AM": {
|
||||
"pin": false,
|
||||
|
@ -928,7 +928,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hye": {
|
||||
"pin": false,
|
||||
|
@ -947,7 +947,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ia": {
|
||||
"pin": false,
|
||||
|
@ -966,7 +966,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"id": {
|
||||
"pin": false,
|
||||
|
@ -985,7 +985,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"is": {
|
||||
"pin": false,
|
||||
|
@ -1004,7 +1004,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"it": {
|
||||
"pin": false,
|
||||
|
@ -1023,7 +1023,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ja": {
|
||||
"pin": false,
|
||||
|
@ -1040,7 +1040,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ja-JP-mac": {
|
||||
"pin": false,
|
||||
|
@ -1048,7 +1048,7 @@
|
|||
"macosx64",
|
||||
"macosx64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ka": {
|
||||
"pin": false,
|
||||
|
@ -1067,7 +1067,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kab": {
|
||||
"pin": false,
|
||||
|
@ -1086,7 +1086,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kk": {
|
||||
"pin": false,
|
||||
|
@ -1105,7 +1105,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"km": {
|
||||
"pin": false,
|
||||
|
@ -1124,7 +1124,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kn": {
|
||||
"pin": false,
|
||||
|
@ -1143,7 +1143,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ko": {
|
||||
"pin": false,
|
||||
|
@ -1162,7 +1162,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lij": {
|
||||
"pin": false,
|
||||
|
@ -1181,7 +1181,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lo": {
|
||||
"pin": false,
|
||||
|
@ -1200,7 +1200,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lt": {
|
||||
"pin": false,
|
||||
|
@ -1219,7 +1219,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ltg": {
|
||||
"pin": false,
|
||||
|
@ -1238,7 +1238,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lv": {
|
||||
"pin": false,
|
||||
|
@ -1257,7 +1257,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"meh": {
|
||||
"pin": false,
|
||||
|
@ -1276,7 +1276,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"mk": {
|
||||
"pin": false,
|
||||
|
@ -1295,7 +1295,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"mr": {
|
||||
"pin": false,
|
||||
|
@ -1314,7 +1314,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ms": {
|
||||
"pin": false,
|
||||
|
@ -1333,7 +1333,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"my": {
|
||||
"pin": false,
|
||||
|
@ -1352,7 +1352,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nb-NO": {
|
||||
"pin": false,
|
||||
|
@ -1371,7 +1371,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ne-NP": {
|
||||
"pin": false,
|
||||
|
@ -1390,7 +1390,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nl": {
|
||||
"pin": false,
|
||||
|
@ -1409,7 +1409,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nn-NO": {
|
||||
"pin": false,
|
||||
|
@ -1428,7 +1428,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"oc": {
|
||||
"pin": false,
|
||||
|
@ -1447,7 +1447,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pa-IN": {
|
||||
"pin": false,
|
||||
|
@ -1466,7 +1466,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pl": {
|
||||
"pin": false,
|
||||
|
@ -1485,7 +1485,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pt-BR": {
|
||||
"pin": false,
|
||||
|
@ -1504,7 +1504,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pt-PT": {
|
||||
"pin": false,
|
||||
|
@ -1523,7 +1523,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"rm": {
|
||||
"pin": false,
|
||||
|
@ -1542,7 +1542,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ro": {
|
||||
"pin": false,
|
||||
|
@ -1561,7 +1561,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ru": {
|
||||
"pin": false,
|
||||
|
@ -1580,7 +1580,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sat": {
|
||||
"pin": false,
|
||||
|
@ -1599,7 +1599,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sc": {
|
||||
"pin": false,
|
||||
|
@ -1618,7 +1618,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"scn": {
|
||||
"pin": false,
|
||||
|
@ -1637,7 +1637,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sco": {
|
||||
"pin": false,
|
||||
|
@ -1656,7 +1656,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"si": {
|
||||
"pin": false,
|
||||
|
@ -1675,7 +1675,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sk": {
|
||||
"pin": false,
|
||||
|
@ -1694,7 +1694,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"skr": {
|
||||
"pin": false,
|
||||
|
@ -1713,7 +1713,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sl": {
|
||||
"pin": false,
|
||||
|
@ -1732,7 +1732,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"son": {
|
||||
"pin": false,
|
||||
|
@ -1751,7 +1751,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sq": {
|
||||
"pin": false,
|
||||
|
@ -1770,7 +1770,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sr": {
|
||||
"pin": false,
|
||||
|
@ -1789,7 +1789,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sv-SE": {
|
||||
"pin": false,
|
||||
|
@ -1808,7 +1808,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"szl": {
|
||||
"pin": false,
|
||||
|
@ -1827,7 +1827,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ta": {
|
||||
"pin": false,
|
||||
|
@ -1846,7 +1846,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"te": {
|
||||
"pin": false,
|
||||
|
@ -1865,7 +1865,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"tg": {
|
||||
"pin": false,
|
||||
|
@ -1884,7 +1884,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"th": {
|
||||
"pin": false,
|
||||
|
@ -1903,7 +1903,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"tl": {
|
||||
"pin": false,
|
||||
|
@ -1922,7 +1922,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"tr": {
|
||||
"pin": false,
|
||||
|
@ -1941,7 +1941,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"trs": {
|
||||
"pin": false,
|
||||
|
@ -1960,7 +1960,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"uk": {
|
||||
"pin": false,
|
||||
|
@ -1979,7 +1979,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ur": {
|
||||
"pin": false,
|
||||
|
@ -1998,7 +1998,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"uz": {
|
||||
"pin": false,
|
||||
|
@ -2017,7 +2017,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"vi": {
|
||||
"pin": false,
|
||||
|
@ -2036,7 +2036,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"wo": {
|
||||
"pin": false,
|
||||
|
@ -2055,7 +2055,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"xh": {
|
||||
"pin": false,
|
||||
|
@ -2074,7 +2074,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"zh-CN": {
|
||||
"pin": false,
|
||||
|
@ -2093,7 +2093,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"zh-TW": {
|
||||
"pin": false,
|
||||
|
@ -2112,6 +2112,6 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
}
|
||||
}
|
|
@ -10,10 +10,14 @@ imply_option("MOZ_SERVICES_SYNC", True)
|
|||
imply_option("MOZ_DEDICATED_PROFILES", True)
|
||||
imply_option("MOZ_BLOCK_PROFILE_DOWNGRADE", True)
|
||||
imply_option("MOZ_NORMANDY", True)
|
||||
imply_option("MOZ_PROFILE_MIGRATOR", True)
|
||||
|
||||
|
||||
imply_option("MOZ_APP_VENDOR", "Mozilla")
|
||||
imply_option("MOZ_APP_ID", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}")
|
||||
# Include the DevTools client, not just the server (which is the default)
|
||||
imply_option("MOZ_DEVTOOLS", "all")
|
||||
imply_option("BROWSER_CHROME_URL", "chrome://browser/content/browser.xhtml")
|
||||
|
||||
with only_when(target_has_linux_kernel & compile_environment):
|
||||
option(env="MOZ_NO_PIE_COMPAT", help="Enable non-PIE wrapper")
|
||||
|
|
|
@ -500,7 +500,7 @@
|
|||
list-style-image: url(chrome://global/skin/icons/close-12.svg);
|
||||
|
||||
&[pinned],
|
||||
#tabbrowser-tabs[closebuttons="activetab"] > #tabbrowser-arrowscrollbox > .tabbrowser-tab > .tab-stack > .tab-content > &:not([selected]) {
|
||||
#tabbrowser-tabs[closebuttons="activetab"]:not([orient="vertical"]) > #tabbrowser-arrowscrollbox > .tabbrowser-tab > .tab-stack > .tab-content > &:not([selected]) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
@ -720,6 +720,41 @@
|
|||
}
|
||||
}
|
||||
|
||||
/* Vertical tabs styling */
|
||||
#tabbrowser-arrowscrollbox[orient="vertical"] {
|
||||
overflow-y: auto;
|
||||
|
||||
&::part(scrollbutton-up),
|
||||
&::part(scrollbutton-down) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&::part(scrollbox-clip) {
|
||||
min-height: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
#vertical-tabs {
|
||||
overflow-y: hidden;
|
||||
scrollbar-width: thin;
|
||||
display: none;
|
||||
|
||||
&[activated] {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
sidebar-main:not([expanded]) > #vertical-tabs > #tabbrowser-tabs[orient="vertical"] .tabbrowser-tab {
|
||||
/* TODO look into handlings this by setting --tab-min-width in tabs.js in bug 1899336. */
|
||||
min-width: inherit;
|
||||
width: inherit;
|
||||
}
|
||||
|
||||
sidebar-main:not([expanded]) > #vertical-tabs > #tabbrowser-tabs[orient="vertical"] .tab-close-button,
|
||||
sidebar-main[expanded] > #vertical-tabs > #tabbrowser-tabs[orient="vertical"] .tab-close-button:not([selected]) {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Tab drag and drop */
|
||||
|
||||
.tab-drop-indicator {
|
||||
|
|
|
@ -4,9 +4,6 @@
|
|||
# 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/.
|
||||
|
||||
if CONFIG["MOZ_DEVTOOLS"] and CONFIG["MOZ_DEVTOOLS"] not in ("all", "server"):
|
||||
error("Unsupported MOZ_DEVTOOLS value: %s" % (CONFIG["MOZ_DEVTOOLS"]))
|
||||
|
||||
if CONFIG["MOZ_DEVTOOLS"] == "all":
|
||||
DIRS += [
|
||||
"client",
|
||||
|
|
|
@ -419,6 +419,13 @@ NS_IMETHODIMP DecryptingInputStream<CipherStrategy>::Seek(const int32_t aWhence,
|
|||
// We positioned after the last block, we must read that to know its size.
|
||||
// XXX We could know earlier if we positioned us after the last block.
|
||||
if (!readBytes) {
|
||||
// XXX It seems that this check was added to prevent seeking before the
|
||||
// start of the base stream during the Seek call below. However, it also
|
||||
// looks like a check for not allowing seeking past the end of the stream
|
||||
// (by returning NS_ERROR_ILLEGAL_VALUE), but it does that only for one
|
||||
// special case when the stream is empty. In any case, proper checks for
|
||||
// not allowing seeking past the end of the stream should be added
|
||||
// somewhere after the aWhence switch instead of doing it partially here.
|
||||
if (baseBlocksOffset == 0) {
|
||||
// The stream is empty.
|
||||
return aOffset == 0 ? NS_OK : NS_ERROR_ILLEGAL_VALUE;
|
||||
|
@ -434,6 +441,16 @@ NS_IMETHODIMP DecryptingInputStream<CipherStrategy>::Seek(const int32_t aWhence,
|
|||
// XXX Do we need to do more here? Restore any previous state?
|
||||
return rv;
|
||||
}
|
||||
|
||||
// XXX Investigate if we can actually remove the extra Seek and
|
||||
// ParseNextChecck above given we don't use readBytes anymore. It seems
|
||||
// this code was added in
|
||||
// https://phabricator.services.mozilla.com/D74669?vs=276120&id=276956#toc
|
||||
// and then there was another revision
|
||||
// https://phabricator.services.mozilla.com/D74669?vs=293270&id=294180#toc
|
||||
// which properly fixed Tell implementation and the Seek and ParseNextCunk
|
||||
// were somehow forgotten to be removed here.
|
||||
readBytes = 0;
|
||||
}
|
||||
|
||||
mPlainBytes = readBytes;
|
||||
|
|
|
@ -461,6 +461,23 @@ TEST_P(ParametrizedCryptTest, NSSCipherStrategy) {
|
|||
keyOrErr.unwrap(), testParams.FlushMode());
|
||||
}
|
||||
|
||||
TEST_P(ParametrizedCryptTest, NSSCipherStrategy_Available) {
|
||||
using CipherStrategy = NSSCipherStrategy;
|
||||
const TestParams& testParams = GetParam();
|
||||
|
||||
DoRoundtripTest<CipherStrategy>(
|
||||
testParams.DataSize(), testParams.EffectiveWriteChunkSize(),
|
||||
testParams.EffectiveReadChunkSize(), testParams.BlockSize(),
|
||||
CipherStrategy::KeyType{}, testParams.FlushMode(),
|
||||
[](auto& inStream, Span<const uint8_t> expectedData,
|
||||
Span<const uint8_t> remainder) {
|
||||
// Check that Available tells the right remainder.
|
||||
uint64_t available;
|
||||
EXPECT_EQ(NS_OK, inStream.Available(&available));
|
||||
EXPECT_EQ(remainder.Length(), available);
|
||||
});
|
||||
}
|
||||
|
||||
TEST_P(ParametrizedCryptTest, DummyCipherStrategy_CheckOutput) {
|
||||
using CipherStrategy = DummyCipherStrategy;
|
||||
const TestParams& testParams = GetParam();
|
||||
|
@ -659,6 +676,8 @@ std::string SeekTestParamToString(
|
|||
case nsISeekableStream::NS_SEEK_END:
|
||||
ss << "End";
|
||||
break;
|
||||
default:
|
||||
MOZ_CRASH("Unknown whence");
|
||||
};
|
||||
switch (seekOp.second) {
|
||||
case SeekOffset::Zero:
|
||||
|
@ -683,84 +702,115 @@ std::string SeekTestParamToString(
|
|||
|
||||
class ParametrizedSeekCryptTest
|
||||
: public DOM_Quota_EncryptedStream,
|
||||
public testing::WithParamInterface<PackedSeekTestParams> {};
|
||||
public testing::WithParamInterface<PackedSeekTestParams> {
|
||||
public:
|
||||
template <typename CipherStrategy>
|
||||
void DoSeekTest() {
|
||||
const SeekTestParams& testParams = GetParam();
|
||||
|
||||
const auto baseOutputStream = WrapNotNull(
|
||||
RefPtr<FixedBufferOutputStream>{FixedBufferOutputStream::Create(2048)});
|
||||
|
||||
const auto data = MakeTestData(testParams.mDataSize);
|
||||
|
||||
WriteTestData<CipherStrategy>(
|
||||
nsCOMPtr<nsIOutputStream>{baseOutputStream.get()}, Span{data},
|
||||
testParams.mDataSize, testParams.mBlockSize,
|
||||
typename CipherStrategy::KeyType{}, FlushMode::Never);
|
||||
|
||||
const auto baseInputStream =
|
||||
MakeRefPtr<ArrayBufferInputStream>(baseOutputStream->WrittenData());
|
||||
|
||||
const auto inStream = MakeSafeRefPtr<DecryptingInputStream<CipherStrategy>>(
|
||||
WrapNotNull(nsCOMPtr<nsIInputStream>{baseInputStream}),
|
||||
testParams.mBlockSize, typename CipherStrategy::KeyType{});
|
||||
|
||||
uint32_t accumulatedOffset = 0;
|
||||
for (const auto& seekOp : testParams.mSeekOps) {
|
||||
const auto offset = [offsetKind = seekOp.second,
|
||||
dataSize = testParams.mDataSize]() -> int64_t {
|
||||
switch (offsetKind) {
|
||||
case SeekOffset::Zero:
|
||||
return 0;
|
||||
case SeekOffset::MinusHalfDataSize:
|
||||
return -static_cast<int64_t>(dataSize) / 2;
|
||||
case SeekOffset::PlusHalfDataSize:
|
||||
return static_cast<int64_t>(dataSize) / 2;
|
||||
case SeekOffset::MinusDataSize:
|
||||
return -static_cast<int64_t>(dataSize);
|
||||
case SeekOffset::PlusDataSize:
|
||||
return static_cast<int64_t>(dataSize);
|
||||
}
|
||||
MOZ_CRASH("Unknown SeekOffset");
|
||||
}();
|
||||
switch (seekOp.first) {
|
||||
case nsISeekableStream::NS_SEEK_SET:
|
||||
accumulatedOffset = offset;
|
||||
break;
|
||||
case nsISeekableStream::NS_SEEK_CUR:
|
||||
accumulatedOffset += offset;
|
||||
break;
|
||||
case nsISeekableStream::NS_SEEK_END:
|
||||
accumulatedOffset = testParams.mDataSize + offset;
|
||||
break;
|
||||
default:
|
||||
MOZ_CRASH("Unknown whence");
|
||||
}
|
||||
EXPECT_EQ(NS_OK, inStream->Seek(seekOp.first, offset));
|
||||
}
|
||||
|
||||
{
|
||||
int64_t actualOffset;
|
||||
EXPECT_EQ(NS_OK, inStream->Tell(&actualOffset));
|
||||
|
||||
EXPECT_EQ(actualOffset, accumulatedOffset);
|
||||
}
|
||||
|
||||
auto readData = nsTArray<uint8_t>();
|
||||
readData.SetLength(data.Length());
|
||||
uint32_t read;
|
||||
EXPECT_EQ(NS_OK,
|
||||
inStream->Read(reinterpret_cast<char*>(readData.Elements()),
|
||||
readData.Length(), &read));
|
||||
// XXX Or should 'read' indicate the actual number of bytes read,
|
||||
// including the encryption overhead?
|
||||
EXPECT_EQ(testParams.mDataSize - accumulatedOffset, read);
|
||||
EXPECT_EQ(Span{data}.SplitAt(accumulatedOffset).second,
|
||||
Span{readData}.First(read).AsConst());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ParametrizedSeekCryptTest, DummyCipherStrategy_Seek) {
|
||||
using CipherStrategy = DummyCipherStrategy;
|
||||
const SeekTestParams& testParams = GetParam();
|
||||
|
||||
const auto baseOutputStream = WrapNotNull(
|
||||
RefPtr<FixedBufferOutputStream>{FixedBufferOutputStream::Create(2048)});
|
||||
|
||||
const auto data = MakeTestData(testParams.mDataSize);
|
||||
|
||||
WriteTestData<CipherStrategy>(
|
||||
nsCOMPtr<nsIOutputStream>{baseOutputStream.get()}, Span{data},
|
||||
testParams.mDataSize, testParams.mBlockSize, CipherStrategy::KeyType{},
|
||||
FlushMode::Never);
|
||||
|
||||
const auto baseInputStream =
|
||||
MakeRefPtr<ArrayBufferInputStream>(baseOutputStream->WrittenData());
|
||||
|
||||
const auto inStream = MakeSafeRefPtr<DecryptingInputStream<CipherStrategy>>(
|
||||
WrapNotNull(nsCOMPtr<nsIInputStream>{baseInputStream}),
|
||||
testParams.mBlockSize, CipherStrategy::KeyType{});
|
||||
|
||||
uint32_t accumulatedOffset = 0;
|
||||
for (const auto& seekOp : testParams.mSeekOps) {
|
||||
const auto offset = [offsetKind = seekOp.second,
|
||||
dataSize = testParams.mDataSize]() -> int64_t {
|
||||
switch (offsetKind) {
|
||||
case SeekOffset::Zero:
|
||||
return 0;
|
||||
case SeekOffset::MinusHalfDataSize:
|
||||
return -static_cast<int64_t>(dataSize) / 2;
|
||||
case SeekOffset::PlusHalfDataSize:
|
||||
return dataSize / 2;
|
||||
case SeekOffset::MinusDataSize:
|
||||
return -static_cast<int64_t>(dataSize);
|
||||
case SeekOffset::PlusDataSize:
|
||||
return dataSize;
|
||||
}
|
||||
MOZ_CRASH("Unknown SeekOffset");
|
||||
}();
|
||||
switch (seekOp.first) {
|
||||
case nsISeekableStream::NS_SEEK_SET:
|
||||
accumulatedOffset = offset;
|
||||
break;
|
||||
case nsISeekableStream::NS_SEEK_CUR:
|
||||
accumulatedOffset += offset;
|
||||
break;
|
||||
case nsISeekableStream::NS_SEEK_END:
|
||||
accumulatedOffset = testParams.mDataSize + offset;
|
||||
break;
|
||||
}
|
||||
EXPECT_EQ(NS_OK, inStream->Seek(seekOp.first, offset));
|
||||
}
|
||||
|
||||
{
|
||||
int64_t actualOffset;
|
||||
EXPECT_EQ(NS_OK, inStream->Tell(&actualOffset));
|
||||
|
||||
EXPECT_EQ(actualOffset, accumulatedOffset);
|
||||
}
|
||||
|
||||
auto readData = nsTArray<uint8_t>();
|
||||
readData.SetLength(data.Length());
|
||||
uint32_t read;
|
||||
EXPECT_EQ(NS_OK, inStream->Read(reinterpret_cast<char*>(readData.Elements()),
|
||||
readData.Length(), &read));
|
||||
// XXX Or should 'read' indicate the actual number of bytes read,
|
||||
// including the encryption overhead?
|
||||
EXPECT_EQ(testParams.mDataSize - accumulatedOffset, read);
|
||||
EXPECT_EQ(Span{data}.SplitAt(accumulatedOffset).second,
|
||||
Span{readData}.First(read).AsConst());
|
||||
DoSeekTest<DummyCipherStrategy>();
|
||||
}
|
||||
|
||||
TEST_P(ParametrizedSeekCryptTest, NSSCipherStrategy_Seek) {
|
||||
DoSeekTest<NSSCipherStrategy>();
|
||||
}
|
||||
|
||||
// The data size 244 has been calculated as 256 (block size) minus 8
|
||||
// (DummyCipherStrategy::BlockPrefixLength) minus 4
|
||||
// (DummyCipherStrategy::BasicBlockSize).
|
||||
// The data size 1012 has been calculated as 1024 (block size) minus 8
|
||||
// (DummyCipherStrategy::BlockPrefixLength) minus 4
|
||||
// (DummyCipherStrategy::BasicBlockSize).
|
||||
static_assert(DummyCipherStrategy::BlockPrefixLength == 8);
|
||||
static_assert(DummyCipherStrategy::BasicBlockSize == 4);
|
||||
|
||||
// The data size 208 has been calculated as 256 (block size) minus 32
|
||||
// (NSSCipherStrategy::BlockPrefixLength) minus 16
|
||||
// (NSSCipherStrategy::BasicBlockSize).
|
||||
// The data size 976 has been calculated as 1024 (block size) minus 32
|
||||
// (NSSCipherStrategy::BlockPrefixLength) minus 16
|
||||
// (NSSCipherStrategy::BasicBlockSize).
|
||||
static_assert(NSSCipherStrategy::BlockPrefixLength == 32);
|
||||
static_assert(NSSCipherStrategy::BasicBlockSize == 16);
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(
|
||||
DOM_Quota_EncryptedStream_Parametrized, ParametrizedCryptTest,
|
||||
testing::Combine(
|
||||
/* dataSize */ testing::Values(0u, 16u, 256u, 512u, 513u),
|
||||
/* dataSize */ testing::Values(0u, 16u, 208u, 244u, 256u, 512u, 513u,
|
||||
976u, 1012u),
|
||||
/* writeChunkSize */
|
||||
testing::Values(ChunkSize::SingleByte, ChunkSize::Unaligned,
|
||||
ChunkSize::DataSize),
|
||||
|
@ -775,7 +825,8 @@ INSTANTIATE_TEST_SUITE_P(
|
|||
INSTANTIATE_TEST_SUITE_P(
|
||||
DOM_IndexedDB_EncryptedStream_ParametrizedSeek, ParametrizedSeekCryptTest,
|
||||
testing::Combine(
|
||||
/* dataSize */ testing::Values(0u, 16u, 256u, 512u, 513u),
|
||||
/* dataSize */ testing::Values(0u, 16u, 208u, 244u, 256u, 512u, 513u,
|
||||
976u, 1012u),
|
||||
/* blockSize */ testing::Values(256u, 1024u /*, 8192u*/),
|
||||
/* seekOperations */
|
||||
testing::Values(/* NS_SEEK_SET only, single ops */
|
||||
|
|
|
@ -14,7 +14,7 @@ const name_edit = "edit";
|
|||
const value_edit = "Edit"; // tests literal leading spaces are stripped
|
||||
|
||||
const name_view = "view";
|
||||
const value_view = "View"; // tests literal trailing spaces are stripped
|
||||
const value_view = "View "; // tests literal trailing spaces are not stripped
|
||||
|
||||
const name_go = "go";
|
||||
const value_go = " Go"; // tests escaped leading spaces are not stripped
|
||||
|
|
|
@ -27,6 +27,7 @@ import java.lang.ref.WeakReference
|
|||
*/
|
||||
open class TabCounterToolbarButton(
|
||||
private val lifecycleOwner: LifecycleOwner,
|
||||
override val visible: () -> Boolean = { true },
|
||||
private val countBasedOnSelectedTabType: Boolean = true,
|
||||
private val showTabs: () -> Unit,
|
||||
private val store: BrowserStore,
|
||||
|
|
|
@ -68,8 +68,8 @@ class TabCounterToolbarButtonTest {
|
|||
fun `WHEN tab counter is created THEN count is 0`() {
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = BrowserStore(),
|
||||
menu = tabCounterMenu,
|
||||
|
@ -85,8 +85,8 @@ class TabCounterToolbarButtonTest {
|
|||
fun `GIVEN showMaskInPrivateMode is false WHEN tab counter is created THEN badge is not visible`() {
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = BrowserStore(),
|
||||
menu = tabCounterMenu,
|
||||
|
@ -105,8 +105,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore(BrowserState(tabs = listOf(tab), selectedTabId = "test-id"))
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -124,8 +124,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore()
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -147,8 +147,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore()
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -179,8 +179,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore(BrowserState(tabs = listOf(tab)))
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -199,8 +199,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore()
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -225,8 +225,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore(BrowserState(tabs = listOf(tab)))
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
|
@ -248,8 +248,8 @@ class TabCounterToolbarButtonTest {
|
|||
val store = BrowserStore(BrowserState(tabs = listOf()))
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner,
|
||||
false,
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = {
|
||||
callbackInvoked = true
|
||||
},
|
||||
|
@ -265,4 +265,19 @@ class TabCounterToolbarButtonTest {
|
|||
view.performClick()
|
||||
assertTrue(callbackInvoked)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN tabs button is created THEN it is visible by default`() {
|
||||
val button = spy(
|
||||
TabCounterToolbarButton(
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
countBasedOnSelectedTabType = false,
|
||||
showTabs = showTabs,
|
||||
store = BrowserStore(),
|
||||
menu = tabCounterMenu,
|
||||
),
|
||||
)
|
||||
|
||||
assertEquals(true, button.visible())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
|
||||
MOZ_APP_UA_NAME=Firefox
|
||||
|
||||
BROWSER_CHROME_URL=chrome://geckoview/content/geckoview.xhtml
|
||||
|
||||
MOZ_BRANDING_DIRECTORY=mobile/android/branding/unofficial
|
||||
MOZ_OFFICIAL_BRANDING_DIRECTORY=mobile/android/branding/official
|
||||
# MOZ_APP_DISPLAYNAME is set by branding/configure.sh
|
||||
|
|
|
@ -117,7 +117,6 @@ import mozilla.components.support.ktx.android.view.hideKeyboard
|
|||
import mozilla.components.support.ktx.kotlin.getOrigin
|
||||
import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged
|
||||
import mozilla.components.support.locale.ActivityContextWrapper
|
||||
import mozilla.components.support.utils.ext.isLandscape
|
||||
import mozilla.components.ui.widgets.withCenterAlignedButtons
|
||||
import org.mozilla.fenix.BuildConfig
|
||||
import org.mozilla.fenix.FeatureFlags
|
||||
|
@ -157,6 +156,7 @@ import org.mozilla.fenix.components.toolbar.navbar.BottomToolbarContainerView
|
|||
import org.mozilla.fenix.components.toolbar.navbar.BrowserNavBar
|
||||
import org.mozilla.fenix.components.toolbar.navbar.EngineViewClippingBehavior
|
||||
import org.mozilla.fenix.components.toolbar.navbar.ToolbarContainerView
|
||||
import org.mozilla.fenix.components.toolbar.navbar.shouldAddNavigationBar
|
||||
import org.mozilla.fenix.compose.Divider
|
||||
import org.mozilla.fenix.crashes.CrashContentIntegration
|
||||
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
|
||||
|
@ -519,7 +519,7 @@ abstract class BaseBrowserFragment :
|
|||
},
|
||||
)
|
||||
|
||||
val shouldAddNavigationBar = shouldAddNavigationBar(context)
|
||||
val shouldAddNavigationBar = context.shouldAddNavigationBar()
|
||||
if (shouldAddNavigationBar) {
|
||||
initializeNavBar(
|
||||
browserToolbar = browserToolbarView.view,
|
||||
|
@ -1303,12 +1303,6 @@ abstract class BaseBrowserFragment :
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* We don't show the navigation bar for tablets and in landscape mode.
|
||||
*/
|
||||
private fun shouldAddNavigationBar(context: Context) =
|
||||
IncompleteRedesignToolbarFeature(context.settings()).isEnabled && !context.isLandscape() && !isTablet()
|
||||
|
||||
@Suppress("LongMethod")
|
||||
private fun initializeNavBar(
|
||||
browserToolbar: BrowserToolbar,
|
||||
|
@ -1510,7 +1504,7 @@ abstract class BaseBrowserFragment :
|
|||
if (message.id != currentlyDisplayedMessage?.id) {
|
||||
context.components.settings.shouldShowMicrosurveyPrompt = true
|
||||
currentlyDisplayedMessage = message
|
||||
if (shouldAddNavigationBar(context)) {
|
||||
if (context.shouldAddNavigationBar()) {
|
||||
_bottomToolbarContainerView?.toolbarContainerView.let {
|
||||
binding.browserLayout.removeView(it)
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ import org.mozilla.fenix.components.appstate.AppAction
|
|||
import org.mozilla.fenix.components.toolbar.BrowserToolbarView
|
||||
import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature
|
||||
import org.mozilla.fenix.components.toolbar.ToolbarMenu
|
||||
import org.mozilla.fenix.components.toolbar.navbar.shouldAddNavigationBar
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.ext.nav
|
||||
import org.mozilla.fenix.ext.requireComponents
|
||||
|
@ -119,6 +120,8 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
|
|||
feltPrivateBrowsingEnabled = context.settings().feltPrivateBrowsingEnabled,
|
||||
)
|
||||
|
||||
updateBrowserToolbarMenuVisibility()
|
||||
|
||||
val readerModeAction =
|
||||
BrowserToolbar.ToggleButton(
|
||||
image = AppCompatResources.getDrawable(
|
||||
|
@ -498,6 +501,12 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
|
|||
browserToolbarView.view.invalidateActions()
|
||||
}
|
||||
|
||||
private fun updateBrowserToolbarMenuVisibility() {
|
||||
browserToolbarView.updateMenuVisibility(
|
||||
isVisible = !requireContext().shouldAddNavigationBar(),
|
||||
)
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
internal fun updateAddressBarLeadingAction(
|
||||
redesignEnabled: Boolean,
|
||||
|
@ -542,6 +551,8 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
|
|||
isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate,
|
||||
feltPrivateBrowsingEnabled = requireContext().settings().feltPrivateBrowsingEnabled,
|
||||
)
|
||||
|
||||
updateBrowserToolbarMenuVisibility()
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
|
|
|
@ -210,7 +210,6 @@ class BrowserToolbarView(
|
|||
lifecycleOwner,
|
||||
sessionId = null,
|
||||
isPrivate = components.core.store.state.selectedTab?.content?.private ?: false,
|
||||
isNavBarEnabled = isNavBarEnabled,
|
||||
interactor = interactor,
|
||||
)
|
||||
}
|
||||
|
@ -251,6 +250,23 @@ class BrowserToolbarView(
|
|||
view.dismissMenu()
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the visibility of the menu in the toolbar.
|
||||
*/
|
||||
fun updateMenuVisibility(isVisible: Boolean) {
|
||||
with(view) {
|
||||
if (isVisible) {
|
||||
showMenuButton()
|
||||
setDisplayHorizontalPadding(
|
||||
context.resources.getDimensionPixelSize(R.dimen.browser_fragment_display_toolbar_padding),
|
||||
)
|
||||
} else {
|
||||
hideMenuButton()
|
||||
setDisplayHorizontalPadding(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the toolbar will have a dynamic behavior (to be scrolled) or not.
|
||||
*
|
||||
|
|
|
@ -21,6 +21,7 @@ import mozilla.components.support.base.feature.LifecycleAwareFeature
|
|||
import mozilla.components.support.ktx.android.view.hideKeyboard
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.components.toolbar.interactor.BrowserToolbarInteractor
|
||||
import org.mozilla.fenix.components.toolbar.navbar.shouldAddNavigationBar
|
||||
import org.mozilla.fenix.ext.components
|
||||
import org.mozilla.fenix.ext.settings
|
||||
import org.mozilla.fenix.theme.ThemeManager
|
||||
|
@ -88,7 +89,6 @@ class DefaultToolbarIntegration(
|
|||
lifecycleOwner: LifecycleOwner,
|
||||
sessionId: String? = null,
|
||||
isPrivate: Boolean,
|
||||
isNavBarEnabled: Boolean = false,
|
||||
interactor: BrowserToolbarInteractor,
|
||||
) : ToolbarIntegration(
|
||||
context = context,
|
||||
|
@ -122,49 +122,41 @@ class DefaultToolbarIntegration(
|
|||
DisplayToolbar.Indicators.HIGHLIGHT,
|
||||
)
|
||||
|
||||
if (isNavBarEnabled) {
|
||||
toolbar.hideMenuButton()
|
||||
toolbar.setDisplayHorizontalPadding(
|
||||
context.resources.getDimensionPixelSize(
|
||||
R.dimen.browser_fragment_display_toolbar_padding,
|
||||
),
|
||||
)
|
||||
} else {
|
||||
val tabCounterMenu = FenixTabCounterMenu(
|
||||
context = context,
|
||||
onItemTapped = {
|
||||
interactor.onTabCounterMenuItemTapped(it)
|
||||
},
|
||||
iconColor = if (isPrivate) {
|
||||
ContextCompat.getColor(context, R.color.fx_mobile_private_text_color_primary)
|
||||
} else {
|
||||
null
|
||||
},
|
||||
).also {
|
||||
it.updateMenu(context.settings().toolbarPosition)
|
||||
}
|
||||
|
||||
val tabsAction = TabCounterToolbarButton(
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
showTabs = {
|
||||
toolbar.hideKeyboard()
|
||||
interactor.onTabCounterClicked()
|
||||
},
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
showMaskInPrivateMode = context.settings().feltPrivateBrowsingEnabled,
|
||||
)
|
||||
|
||||
val tabCount = if (isPrivate) {
|
||||
store.state.privateTabs.size
|
||||
val tabCounterMenu = FenixTabCounterMenu(
|
||||
context = context,
|
||||
onItemTapped = {
|
||||
interactor.onTabCounterMenuItemTapped(it)
|
||||
},
|
||||
iconColor = if (isPrivate) {
|
||||
ContextCompat.getColor(context, R.color.fx_mobile_private_text_color_primary)
|
||||
} else {
|
||||
store.state.normalTabs.size
|
||||
}
|
||||
|
||||
tabsAction.updateCount(tabCount)
|
||||
|
||||
toolbar.addBrowserAction(tabsAction)
|
||||
null
|
||||
},
|
||||
).also {
|
||||
it.updateMenu(context.settings().toolbarPosition)
|
||||
}
|
||||
|
||||
val tabsAction = TabCounterToolbarButton(
|
||||
lifecycleOwner = lifecycleOwner,
|
||||
showTabs = {
|
||||
toolbar.hideKeyboard()
|
||||
interactor.onTabCounterClicked()
|
||||
},
|
||||
store = store,
|
||||
menu = tabCounterMenu,
|
||||
showMaskInPrivateMode = context.settings().feltPrivateBrowsingEnabled,
|
||||
visible = { !context.shouldAddNavigationBar() },
|
||||
)
|
||||
|
||||
val tabCount = if (isPrivate) {
|
||||
store.state.privateTabs.size
|
||||
} else {
|
||||
store.state.normalTabs.size
|
||||
}
|
||||
|
||||
tabsAction.updateCount(tabCount)
|
||||
|
||||
toolbar.addBrowserAction(tabsAction)
|
||||
}
|
||||
|
||||
override fun start() {
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/* 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/. */
|
||||
|
||||
package org.mozilla.fenix.components.toolbar.navbar
|
||||
|
||||
import android.content.Context
|
||||
import mozilla.components.support.utils.ext.isLandscape
|
||||
import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature
|
||||
import org.mozilla.fenix.ext.isTablet
|
||||
import org.mozilla.fenix.ext.settings
|
||||
|
||||
/**
|
||||
* Returns true if navigation bar should be displayed. The returned value depends on the feature state, as well as the
|
||||
* device type and orientation – we don't show the navigation bar for tablets and in landscape mode.
|
||||
* NB: don't use it with the app context – it doesn't get recreated when a foldable changes its modes.
|
||||
*/
|
||||
fun Context.shouldAddNavigationBar() =
|
||||
IncompleteRedesignToolbarFeature(settings()).isEnabled && !isLandscape() && !isTablet()
|
|
@ -84,7 +84,6 @@ import mozilla.components.lib.state.ext.consumeFrom
|
|||
import mozilla.components.service.glean.private.NoExtras
|
||||
import mozilla.components.service.nimbus.messaging.Message
|
||||
import mozilla.components.support.base.feature.ViewBoundFeatureWrapper
|
||||
import mozilla.components.support.utils.ext.isLandscape
|
||||
import mozilla.components.ui.colors.PhotonColors
|
||||
import org.mozilla.fenix.BrowserDirection
|
||||
import org.mozilla.fenix.FeatureFlags
|
||||
|
@ -111,6 +110,7 @@ import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
|||
import org.mozilla.fenix.components.toolbar.navbar.BottomToolbarContainerIntegration
|
||||
import org.mozilla.fenix.components.toolbar.navbar.BottomToolbarContainerView
|
||||
import org.mozilla.fenix.components.toolbar.navbar.HomeNavBar
|
||||
import org.mozilla.fenix.components.toolbar.navbar.shouldAddNavigationBar
|
||||
import org.mozilla.fenix.compose.Divider
|
||||
import org.mozilla.fenix.databinding.FragmentHomeBinding
|
||||
import org.mozilla.fenix.ext.components
|
||||
|
@ -481,7 +481,7 @@ class HomeFragment : Fragment() {
|
|||
interactor = sessionControlInteractor,
|
||||
)
|
||||
|
||||
val shouldAddNavigationBar = shouldAddNavigationBar(requireContext())
|
||||
val shouldAddNavigationBar = requireContext().shouldAddNavigationBar()
|
||||
if (shouldAddNavigationBar) {
|
||||
initializeNavBar(activity)
|
||||
}
|
||||
|
@ -559,12 +559,6 @@ class HomeFragment : Fragment() {
|
|||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* We don't show the navigation bar for tablets and in landscape mode.
|
||||
*/
|
||||
private fun shouldAddNavigationBar(context: Context) =
|
||||
IncompleteRedesignToolbarFeature(context.settings()).isEnabled && !context.isLandscape() && !isTablet()
|
||||
|
||||
@Suppress("LongMethod")
|
||||
private fun initializeNavBar(
|
||||
activity: HomeActivity,
|
||||
|
@ -735,7 +729,7 @@ class HomeFragment : Fragment() {
|
|||
if (message.id != currentlyDisplayedMessage?.id) {
|
||||
context.components.settings.shouldShowMicrosurveyPrompt = true
|
||||
currentlyDisplayedMessage = message
|
||||
if (shouldAddNavigationBar(context)) {
|
||||
if (context.shouldAddNavigationBar()) {
|
||||
_bottomToolbarContainerView?.toolbarContainerView.let {
|
||||
binding.homeLayout.removeView(it)
|
||||
}
|
||||
|
|
|
@ -17,8 +17,8 @@ import androidx.core.view.updateLayoutParams
|
|||
import mozilla.components.support.ktx.android.content.res.resolveAttribute
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.browser.tabstrip.isTabStripEnabled
|
||||
import org.mozilla.fenix.components.toolbar.IncompleteRedesignToolbarFeature
|
||||
import org.mozilla.fenix.components.toolbar.ToolbarPosition
|
||||
import org.mozilla.fenix.components.toolbar.navbar.shouldAddNavigationBar
|
||||
import org.mozilla.fenix.databinding.FragmentHomeBinding
|
||||
import org.mozilla.fenix.ext.settings
|
||||
import org.mozilla.fenix.home.toolbar.ToolbarInteractor
|
||||
|
@ -60,9 +60,9 @@ class ToolbarView(
|
|||
}
|
||||
|
||||
private fun updateLayout(view: View) {
|
||||
val redesignEnabled = IncompleteRedesignToolbarFeature(context.settings()).isEnabled
|
||||
binding.menuButton.isVisible = !redesignEnabled
|
||||
binding.tabButton.isVisible = !redesignEnabled
|
||||
val showBrowserActionButtonsAndMenu = !context.shouldAddNavigationBar()
|
||||
binding.menuButton.isVisible = showBrowserActionButtonsAndMenu
|
||||
binding.tabButton.isVisible = showBrowserActionButtonsAndMenu
|
||||
|
||||
when (context.settings().toolbarPosition) {
|
||||
ToolbarPosition.TOP -> {
|
||||
|
|
|
@ -159,8 +159,6 @@
|
|||
|
||||
<!-- Shortcut action to open Passwords screen -->
|
||||
<string name="home_screen_shortcut_passwords">Κωδικοί πρόσβασης</string>
|
||||
<!-- Shortcut action to open Passwords screen -->
|
||||
<string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Συντόμευση κωδικών πρόσβασης</string>
|
||||
|
||||
<!-- Recent Tabs -->
|
||||
<!-- Header text for jumping back into the recent tab in the home screen -->
|
||||
|
@ -201,8 +199,6 @@
|
|||
<string name="browser_menu_refresh">Ανανέωση</string>
|
||||
<!-- Content description (not visible, for screen readers etc.): Stop loading current website -->
|
||||
<string name="browser_menu_stop">Διακοπή</string>
|
||||
<!-- Browser menu button that opens the addon manager -->
|
||||
<string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Πρόσθετα</string>
|
||||
<!-- Browser menu button that opens the extensions manager -->
|
||||
<string name="browser_menu_extensions">Επεκτάσεις</string>
|
||||
<!-- Browser menu button that opens the extensions manager -->
|
||||
|
@ -211,8 +207,6 @@
|
|||
<string name="browser_menu_discover_more_extensions">Ανακαλύψτε περισσότερες επεκτάσεις</string>
|
||||
<!-- Browser menu button that opens account settings -->
|
||||
<string name="browser_menu_account_settings">Πληροφορίες λογαριασμού</string>
|
||||
<!-- Text displayed when there are no add-ons to be shown -->
|
||||
<string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Δεν βρέθηκαν πρόσθετα</string>
|
||||
<!-- Browser menu button that sends a user to help articles -->
|
||||
<string name="browser_menu_help">Βοήθεια</string>
|
||||
<!-- Browser menu button that sends a to a the what's new article -->
|
||||
|
@ -229,8 +223,6 @@
|
|||
<string name="browser_menu_add_to_homescreen">Προσθήκη στην αρχική οθόνη</string>
|
||||
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
|
||||
<string name="browser_menu_add_to_homescreen_2">Προσθήκη στην αρχική οθόνη…</string>
|
||||
<!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. -->
|
||||
<string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Εγκατάσταση</string>
|
||||
<!-- Content description (not visible, for screen readers etc.) for the Resync tabs button -->
|
||||
<string name="resync_button_content_description">Επανασυγχρονισμός</string>
|
||||
<!-- Browser menu button that opens the find in page menu -->
|
||||
|
@ -607,7 +599,7 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Λογαριασμός</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Γραμμή εργαλείων</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Γραμμή εργαλείων</string>
|
||||
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Θέμα</string>
|
||||
|
@ -678,13 +670,8 @@
|
|||
<!-- Message to indicate users that we are quitting the application to apply the changes -->
|
||||
<string name="quit_application">Κλείσιμο εφαρμογής για την εφαρμογή αλλαγών…</string>
|
||||
|
||||
<!-- Preference for add_ons -->
|
||||
<string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Πρόσθετα</string>
|
||||
|
||||
<!-- Preference for extensions -->
|
||||
<string name="preferences_extensions">Επεκτάσεις</string>
|
||||
<!-- Preference for installing a local add-on -->
|
||||
<string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Εγκατάσταση προσθέτου από αρχείο</string>
|
||||
<!-- Preference for installing a local extension -->
|
||||
<string name="preferences_install_local_extension">Εγκατάσταση επέκτασης από αρχείο</string>
|
||||
<!-- Preference for notifications -->
|
||||
|
@ -711,8 +698,6 @@
|
|||
|
||||
<!-- Add-on Preferences -->
|
||||
<!-- Preference to customize the configured AMO (addons.mozilla.org) collection -->
|
||||
<string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Προσαρμοσμένη συλλογή προσθέτων</string>
|
||||
<!-- Preference to customize the configured AMO (addons.mozilla.org) collection -->
|
||||
<string name="preferences_customize_extension_collection">Προσαρμοσμένη συλλογή επεκτάσεων</string>
|
||||
<!-- Button caption to confirm the add-on collection configuration -->
|
||||
<string name="customize_addon_collection_ok">OK</string>
|
||||
|
@ -723,8 +708,6 @@
|
|||
|
||||
<!-- Hint displayed on input field for custom collection user ID-->
|
||||
<string name="customize_addon_collection_user_hint">Κάτοχος συλλογής (ID χρήστη)</string>
|
||||
<!-- Toast shown after confirming the custom add-on collection configuration -->
|
||||
<string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Η συλλογή προσθέτων τροποποιήθηκε. Κλείσιμο εφαρμογής για εφαρμογή αλλαγών…</string>
|
||||
|
||||
<!-- Toast shown after confirming the custom extension collection configuration -->
|
||||
<string name="toast_customize_extension_collection_done">Η συλλογή επεκτάσεων τροποποιήθηκε. Κλείσιμο εφαρμογής για την εφαρμογή αλλαγών…</string>
|
||||
|
@ -785,35 +768,23 @@
|
|||
<string name="wallpapers_onboarding_dialog_explore_more_button_text">Εξερευνήστε περισσότερες ταπετσαρίες</string>
|
||||
|
||||
<!-- Add-ons general availability nimbus message-->
|
||||
<!-- Title of the Nimbus message for add-ons general availability-->
|
||||
<string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Διατίθενται τώρα νέα πρόσθετα</string>
|
||||
<!-- Title of the Nimbus message for extension general availability-->
|
||||
<string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Διατίθενται τώρα νέες επεκτάσεις</string>
|
||||
<!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here-->
|
||||
<string name="addon_ga_message_body" tools:ignore="UnusedResources">Δείτε 100+ νέες επεκτάσεις που σας επιτρέπουν να κάνετε το Firefox δικό σας.</string>
|
||||
<!-- Button text of the Nimbus message for add-ons general availability. -->
|
||||
<string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Εξερεύνηση προσθέτων</string>
|
||||
|
||||
<!-- Button text of the Nimbus message for extensions general availability. -->
|
||||
<string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Εξερεύνηση επεκτάσεων</string>
|
||||
|
||||
<!-- Extension process crash dialog to user -->
|
||||
<!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled -->
|
||||
<string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Τα πρόσθετα έχουν απενεργοποιηθεί προσωρινά</string>
|
||||
<!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled -->
|
||||
<string name="extension_process_crash_dialog_title">Οι επεκτάσεις έχουν απενεργοποιηθεί προσωρινά</string>
|
||||
<!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. -->
|
||||
<string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Ένα ή περισσότερα πρόσθετα σταμάτησαν να λειτουργούν, καθιστώντας το σύστημά σας ασταθές. Το %1$s προσπάθησε ανεπιτυχώς να επανεκκινήσει τα πρόσθετα.\n\nΤα πρόσθετα δεν θα επανεκκινηθούν κατά τη διάρκεια της τρέχουσας συνεδρίας σας.\n\nΗ αφαίρεση ή η απενεργοποίηση των προσθέτων ενδέχεται να διορθώσει αυτό το ζήτημα.</string>
|
||||
<!-- This is a message shown to the user when too many errors have occurred with the extensions process and they have been disabled.
|
||||
The user can decide if they would like to continue trying to start extensions or if they'd rather continue without them.
|
||||
The first parameter is the application name. -->
|
||||
<string name="extension_process_crash_dialog_message">Μία ή περισσότερες επεκτάσεις σταμάτησαν να λειτουργούν, καθιστώντας το σύστημά σας ασταθές. Το %1$s προσπάθησε ανεπιτυχώς να επανεκκινήσει τις επεκτάσεις.\n\nΟι επεκτάσεις δεν θα επανεκκινηθούν κατά τη διάρκεια της τρέχουσας συνεδρίας σας.\n\nΗ αφαίρεση ή η απενεργοποίηση των επεκτάσεων ενδέχεται να διορθώσει αυτό το ζήτημα.</string>
|
||||
<!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again -->
|
||||
<string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Δοκιμάστε να επανεκκινήσετε τα πρόσθετα</string>
|
||||
<!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again -->
|
||||
<string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Δοκιμάστε να επανεκκινήσετε τις επεκτάσεις</string>
|
||||
<!-- The user will continue with all add-ons disabled -->
|
||||
<string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Συνέχεια με ανενεργά πρόσθετα</string>
|
||||
|
||||
<!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. -->
|
||||
<string name="extension_process_crash_dialog_disable_extensions_button_text">Συνέχεια με ανενεργές επεκτάσεις</string>
|
||||
|
@ -937,7 +908,7 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Κύλιση για απόκρυψη γραμμής εργαλείων</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Ολίσθηση γραμμής εργαλείων προς τα πλάγια για εναλλαγή καρτελών</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Ολίσθηση γραμμής εργαλείων προς τα πλάγια για εναλλαγή καρτελών</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Ολίσθηση γραμμής εργαλείων προς τα πάνω για άνοιγμα καρτελών</string>
|
||||
|
||||
|
@ -2526,8 +2497,6 @@
|
|||
<string name="translation_error_could_not_load_languages_warning_text">Αδυναμία φόρτωσης γλωσσών. Ελέγξτε τη σύνδεσή σας στο διαδίκτυο και δοκιμάστε ξανά.</string>
|
||||
<!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. -->
|
||||
<string name="translation_error_language_not_supported_warning_text">Δυστυχώς, δεν υποστηρίζουμε ακόμα τα %1$s.</string>
|
||||
<!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. -->
|
||||
<string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Μάθετε περισσότερα</string>
|
||||
|
||||
<!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. -->
|
||||
<string name="translation_in_progress_snackbar">Μετάφραση…</string>
|
||||
|
@ -2541,8 +2510,6 @@
|
|||
|
||||
<!-- Translations options dialog -->
|
||||
<!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. -->
|
||||
<string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Επιλογές μετάφρασης</string>
|
||||
<!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. -->
|
||||
<string name="translation_option_bottom_sheet_title_heading">Επιλογές μετάφρασης</string>
|
||||
<!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. -->
|
||||
<string name="translation_option_bottom_sheet_always_translate">Να γίνεται πάντα πρόταση για μετάφραση</string>
|
||||
|
@ -2740,14 +2707,19 @@
|
|||
|
||||
<!-- The continue button label -->
|
||||
<string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Συνέχεια</string>
|
||||
<!-- Survey view -->
|
||||
<!-- The survey header -->
|
||||
<string name="micro_survey_survey_header">Συμπληρώστε αυτήν την έρευνα</string>
|
||||
<string name="micro_survey_survey_header" moz:removedIn="129" tools:ignore="UnusedResources">Συμπληρώστε αυτήν την έρευνα</string>
|
||||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice">Σημείωση απορρήτου</string>
|
||||
<string name="micro_survey_privacy_notice" moz:removedIn="129" tools:ignore="UnusedResources">Σημείωση απορρήτου</string>
|
||||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice_2">Πολιτική απορρήτου</string>
|
||||
<!-- The submit button label text -->
|
||||
<string name="micro_survey_submit_button_label">Υποβολή</string>
|
||||
<!-- The close button label text -->
|
||||
<string name="micro_survey_close_button_label" moz:removedIn="128" tools:ignore="UnusedResources">Κλείσιμο</string>
|
||||
<!-- The survey completion header -->
|
||||
<string name="micro_survey_survey_header_confirmation" tools:ignore="UnusedResources">Η έρευνα ολοκληρώθηκε</string>
|
||||
<!-- The survey completion confirmation text -->
|
||||
<string name="micro_survey_feedback_confirmation">Ευχαριστούμε για τα σχόλιά σας!</string>
|
||||
|
||||
|
@ -2762,7 +2734,11 @@
|
|||
<!-- Option for likert scale -->
|
||||
<string name="likert_scale_option_5" tools:ignore="UnusedResources">Πολύ δυσαρεστημένος/-η</string>
|
||||
|
||||
<!-- Microsurvey accessibility -->
|
||||
<!-- Option for likert scale -->
|
||||
<string name="likert_scale_option_6" tools:ignore="UnusedResources">Δεν το χρησιμοποιώ</string>
|
||||
<!-- Text shown in prompt for homepage microsurvey. 'Firefox' intentionally hardcoded here- -->
|
||||
<string name="microsurvey_prompt_homepage_title" tools:ignore="UnusedResources">Πόσο ικανοποιημένοι είστε με την αρχική σελίδα του Firefox;</string>
|
||||
<!-- Accessibility -->
|
||||
<!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. -->
|
||||
<string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Άνοιγμα έρευνας</string>
|
||||
<!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. -->
|
||||
|
|
|
@ -588,7 +588,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Account</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Toolbar</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Toolbar</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Address bar location</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Theme</string>
|
||||
|
||||
|
@ -894,10 +896,15 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Scroll to hide toolbar</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Swipe toolbar sideways to switch tabs</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Swipe toolbar sideways to switch tabs</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Swipe toolbar up to open tabs</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">Scroll to hide address bar and toolbar</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">Swipe address bar sideways to switch tabs</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">Downloads</string>
|
||||
|
|
|
@ -596,7 +596,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Cuenta</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Barra de herramientas</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Barra de herramientas</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Ubicación de la barra de direcciones</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Tema</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -910,10 +912,15 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Desplazar para ocultar la barra</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Deslizar la barra hacia los costados para cambiar de pestaña</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Deslizar la barra hacia los costados para cambiar de pestaña</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Deslizar la barra hacia arriba para abrir pestañas</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">Desplazar para ocultar la barra de direcciones y la barra de herramientas</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">Deslizar la barra de direcciones hacia los costados para cambiar de pestaña</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">Descargas</string>
|
||||
|
|
|
@ -594,7 +594,9 @@
|
|||
<string name="preferences_category_account">Konto</string>
|
||||
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Verktøylinje</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Verktøylinje</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Adresselinjeplassering</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Tema</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -907,10 +909,15 @@
|
|||
<string name="preference_gestures_dynamic_toolbar">Bla for å gøyme verktøylinja</string>
|
||||
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Sveip verktøylinja sidelengs for å byte fane</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Sveip verktøylinja sidelengs for å byte fane</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Sveip verktøylinja opp for å opne faner</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">Rull for å gøyme adresse- og verktøylinja</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">Sveip adresselinja sidelengs for å byte fane</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">Nedlastingar</string>
|
||||
|
|
|
@ -592,7 +592,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Conta</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Barra de ferramentas</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Barra de ferramentas</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Localização da barra de endereço</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Tema</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -685,6 +687,9 @@
|
|||
<!-- The subtitle for the allow for all sites preference toggle -->
|
||||
<string name="addons_permissions_allow_for_all_sites_subtitle" tools:ignore="UnusedResources">Se confia nesta extensão, pode dar-lhe permissões em todos os sites.</string>
|
||||
|
||||
<!-- The text shown when an extension does not require permissions -->
|
||||
<string name="addons_does_not_require_permissions">Esta extensão não requer quaisquer permissões.</string>
|
||||
|
||||
<!-- Add-on Preferences -->
|
||||
<!-- Preference to customize the configured AMO (addons.mozilla.org) collection -->
|
||||
<string name="preferences_customize_extension_collection">Coleção de extensões personalizadas</string>
|
||||
|
@ -897,10 +902,15 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Desloque para ocultar a barra de ferramentas</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Deslize a barra de ferramentas para o lado para alternar entre separadores</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Deslize a barra de ferramentas para o lado para alternar entre separadores</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Deslize a barra de ferramentas para cima para abrir separadores</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">Desloque para ocultar a barra de endereço e a barra de ferramentas</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">Deslize a barra de endereço para o lado para alternar entre separadores</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">Transferências</string>
|
||||
|
@ -1408,6 +1418,22 @@
|
|||
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active. -->
|
||||
<string name="notification_pbm_delete_text_2">Fechar separadores privados</string>
|
||||
|
||||
<!-- Microsuverys -->
|
||||
<!-- Text shown in prompt for printing microsurvey. "sec" It's an abrevation for "second". -->
|
||||
<string name="microsurvey_prompt_printing_title" tools:ignore="UnusedResources">Ajude a melhorar a impressão no Firefox. Isto demora apenas um segundo</string>
|
||||
<!-- Text shown in prompt for printing microsurvey. 'Firefox' intentionally hardcoded here--> -->
|
||||
<string name="microsurvey_survey_printing_title" tools:ignore="UnusedResources">Qual é o seu nível de satisfação com a impressão no Firefox?</string>
|
||||
<!-- Text for option one, shown in microsurvey.-->
|
||||
<string name="microsurvey_survey_5_point_option_0" tools:ignore="UnusedResources">Neutro</string>
|
||||
<!-- Text for option two, shown in microsurvey.-->
|
||||
<string name="microsurvey_survey_5_point_option_1" tools:ignore="UnusedResources">Muito insatisfeito(a)</string>
|
||||
<!-- Text for option three, shown in microsurvey.-->
|
||||
<string name="microsurvey_survey_5_point_option_2" tools:ignore="UnusedResources">Insatisfeito(a)</string>
|
||||
<!-- Text for option four, shown in microsurvey.-->
|
||||
<string name="microsurvey_survey_5_point_option_3" tools:ignore="UnusedResources">Satisfeito(a)</string>
|
||||
<!-- Text for option five, shown in microsurvey.-->
|
||||
<string name="microsurvey_survey_5_point_option_4" tools:ignore="UnusedResources">Muito satisfeito(a)</string>
|
||||
|
||||
<!-- Text shown in the notification that pops up to remind the user that a private browsing session is active for Android 14+ -->
|
||||
<string name="notification_erase_title_android_14">Fechar separadores privados?</string>
|
||||
|
||||
|
@ -1774,11 +1800,11 @@
|
|||
<!-- Preference option for never saving passwords in Fenix -->
|
||||
<string name="preferences_passwords_save_logins_never_save">Nunca guardar</string>
|
||||
<!-- Preference for autofilling saved logins in Firefox (in web content), %1$s will be replaced with the app name -->
|
||||
<string name="preferences_passwords_autofill2">Autopreenchimento do %1$s</string>
|
||||
<string name="preferences_passwords_autofill2">Preencher automaticamente no %1$s</string>
|
||||
<!-- Description for the preference for autofilling saved logins in Firefox (in web content), %1$s will be replaced with the app name -->
|
||||
<string name="preferences_passwords_autofill_description">Preencher e guardar nomes de utilizador e palavras-passe em site ao utilizar o %1$s.</string>
|
||||
<!-- Preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) -->
|
||||
<string name="preferences_android_autofill">Preenchimento automático noutras aplicações</string>
|
||||
<string name="preferences_android_autofill">Preencher automaticamente noutras aplicações</string>
|
||||
<!-- Description for the preference for autofilling logins from Fenix in other apps (e.g. autofilling the Twitter app) -->
|
||||
<string name="preferences_android_autofill_description">Preencher nomes de utilizador e palavras-passe noutras aplicações no seu dispositivo.</string>
|
||||
|
||||
|
@ -2573,6 +2599,8 @@
|
|||
<string name="download_language_header_preference">Transferir idiomas</string>
|
||||
<!-- All languages list item. When the user presses this item, they can download all languages. -->
|
||||
<string name="download_language_all_languages_item_preference">Todos os idiomas</string>
|
||||
<!-- All languages list item. When the user presses this item, they can delete all languages that were downloaded. -->
|
||||
<string name="download_language_all_languages_item_preference_to_delete">Eliminar todos os idiomas</string>
|
||||
<!-- Content description (not visible, for screen readers etc.): For a language list item that was downloaded, the user can now delete it. -->
|
||||
<string name="download_languages_item_content_description_downloaded_state">Eliminar</string>
|
||||
<!-- Content description (not visible, for screen readers etc.): For a language list item, downloading is in progress. -->
|
||||
|
@ -2667,7 +2695,7 @@
|
|||
<!-- Microsurvey -->
|
||||
<!-- Prompt view -->
|
||||
<!-- The microsurvey prompt title. Note: The word "Firefox" should NOT be translated -->
|
||||
<string name="micro_survey_prompt_title" tools:ignore="UnusedResources">Ajude-nos a fazer o Firefox melhor. Demora apenas um minuto.</string>
|
||||
<string name="micro_survey_prompt_title" tools:ignore="UnusedResources">Ajude-nos a tornar o Firefox melhor. Demora apenas um minuto.</string>
|
||||
<!-- The continue button label -->
|
||||
<string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Continuar</string>
|
||||
<!-- Survey view -->
|
||||
|
@ -2678,13 +2706,13 @@
|
|||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice" moz:removedIn="129" tools:ignore="UnusedResources">Informação de privacidade</string>
|
||||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice_2">Política de privacidade</string>
|
||||
<string name="micro_survey_privacy_notice_2">Informação de privacidade</string>
|
||||
<!-- The submit button label text -->
|
||||
<string name="micro_survey_submit_button_label">Submeter</string>
|
||||
<!-- The close button label text -->
|
||||
<string name="micro_survey_close_button_label" moz:removedIn="128" tools:ignore="UnusedResources">Fechar</string>
|
||||
<!-- The survey completion header -->
|
||||
<string name="micro_survey_survey_header_confirmation" tools:ignore="UnusedResources">Inquérito concluído</string>
|
||||
<string name="micro_survey_survey_header_confirmation" tools:ignore="UnusedResources">Questionário concluído</string>
|
||||
<!-- The survey completion confirmation text -->
|
||||
<string name="micro_survey_feedback_confirmation">Obrigado pela sua opinião!</string>
|
||||
<!-- Option for likert scale -->
|
||||
|
@ -2699,9 +2727,9 @@
|
|||
<string name="likert_scale_option_5" tools:ignore="UnusedResources">Muito insatisfeito(a)</string>
|
||||
|
||||
<!-- Option for likert scale -->
|
||||
<string name="likert_scale_option_6" tools:ignore="UnusedResources">Não a utilizo</string>
|
||||
<string name="likert_scale_option_6" tools:ignore="UnusedResources">Não utilizo</string>
|
||||
<!-- Text shown in prompt for homepage microsurvey. 'Firefox' intentionally hardcoded here- -->
|
||||
<string name="microsurvey_prompt_homepage_title" tools:ignore="UnusedResources">Quão satisfeito está com a sua página inicial do Firefox?</string>
|
||||
<string name="microsurvey_prompt_homepage_title" tools:ignore="UnusedResources">Qual o seu grau de satisfação com a sua página inicial do Firefox?</string>
|
||||
<!-- Accessibility -->
|
||||
<!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. -->
|
||||
<string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Abrir inquérito</string>
|
||||
|
|
|
@ -596,7 +596,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Konto</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Verktygsfält</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Verktygsfält</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Adressfältets placering</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Tema</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -906,10 +908,15 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Bläddra för att dölja verktygsfältet</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Svep verktygsfältet i sidled för att byta flik</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Svep verktygsfältet i sidled för att byta flik</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Svep verktygsfältet uppåt för att öppna flikar</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">Bläddra för att dölja adressfältet och verktygsfältet</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">Svep adressfältet i sidled för att växla flikar</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">Hämtningar</string>
|
||||
|
|
|
@ -154,8 +154,6 @@
|
|||
|
||||
<!-- Shortcut action to open Passwords screen -->
|
||||
<string name="home_screen_shortcut_passwords">Parolalar</string>
|
||||
<!-- Shortcut action to open Passwords screen -->
|
||||
<string name="home_screen_shortcut_open_password_screen" moz:removedIn="126" tools:ignore="UnusedResources">Parolalar kısayolu</string>
|
||||
|
||||
<!-- Recent Tabs -->
|
||||
<!-- Header text for jumping back into the recent tab in the home screen -->
|
||||
|
@ -196,8 +194,6 @@
|
|||
<string name="browser_menu_refresh">Tazele</string>
|
||||
<!-- Content description (not visible, for screen readers etc.): Stop loading current website -->
|
||||
<string name="browser_menu_stop">Durdur</string>
|
||||
<!-- Browser menu button that opens the addon manager -->
|
||||
<string name="browser_menu_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Eklentiler</string>
|
||||
<!-- Browser menu button that opens the extensions manager -->
|
||||
<string name="browser_menu_extensions">Uzantılar</string>
|
||||
<!-- Browser menu button that opens the extensions manager -->
|
||||
|
@ -206,8 +202,6 @@
|
|||
<string name="browser_menu_discover_more_extensions">Daha fazla uzantı keşfet</string>
|
||||
<!-- Browser menu button that opens account settings -->
|
||||
<string name="browser_menu_account_settings">Hesap bilgileri</string>
|
||||
<!-- Text displayed when there are no add-ons to be shown -->
|
||||
<string name="no_add_ons" moz:removedIn="126" tools:ignore="UnusedResources">Hiç eklenti yok</string>
|
||||
<!-- Browser menu button that sends a user to help articles -->
|
||||
<string name="browser_menu_help">Yardım</string>
|
||||
<!-- Browser menu button that sends a to a the what's new article -->
|
||||
|
@ -224,8 +218,6 @@
|
|||
<string name="browser_menu_add_to_homescreen">Ana ekrana ekle</string>
|
||||
<!-- Browser menu toggle that adds a shortcut to the site on the device home screen. -->
|
||||
<string name="browser_menu_add_to_homescreen_2">Ana ekrana ekle…</string>
|
||||
<!-- Browser menu toggle that installs a Progressive Web App shortcut to the site on the device home screen. -->
|
||||
<string name="browser_menu_install_on_homescreen" moz:removedIn="126" tools:ignore="UnusedResources">Yükle</string>
|
||||
<!-- Content description (not visible, for screen readers etc.) for the Resync tabs button -->
|
||||
<string name="resync_button_content_description">Yeniden eşitle</string>
|
||||
<!-- Browser menu button that opens the find in page menu -->
|
||||
|
@ -601,7 +593,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">Hesap</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">Araç çubuğu</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">Araç çubuğu</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">Adres çubuğu konumu</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">Tema</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -673,13 +667,8 @@
|
|||
<!-- Message to indicate users that we are quitting the application to apply the changes -->
|
||||
<string name="quit_application">Değişiklikleri uygulamak için uygulamadan çıkılıyor…</string>
|
||||
|
||||
<!-- Preference for add_ons -->
|
||||
<string name="preferences_addons" moz:removedIn="126" tools:ignore="UnusedResources">Eklentiler</string>
|
||||
|
||||
<!-- Preference for extensions -->
|
||||
<string name="preferences_extensions">Uzantılar</string>
|
||||
<!-- Preference for installing a local add-on -->
|
||||
<string name="preferences_install_local_addon" moz:removedIn="126" tools:ignore="UnusedResources">Dosyadan eklenti yükle</string>
|
||||
<!-- Preference for installing a local extension -->
|
||||
<string name="preferences_install_local_extension">Dosyadan uzantı yükle</string>
|
||||
<!-- Preference for notifications -->
|
||||
|
@ -705,8 +694,6 @@
|
|||
|
||||
<!-- Add-on Preferences -->
|
||||
<!-- Preference to customize the configured AMO (addons.mozilla.org) collection -->
|
||||
<string name="preferences_customize_amo_collection" moz:removedIn="126" tools:ignore="UnusedResources">Özel eklenti koleksiyonu</string>
|
||||
<!-- Preference to customize the configured AMO (addons.mozilla.org) collection -->
|
||||
<string name="preferences_customize_extension_collection">Özel uzantı koleksiyonu</string>
|
||||
<!-- Button caption to confirm the add-on collection configuration -->
|
||||
<string name="customize_addon_collection_ok">Tamam</string>
|
||||
|
@ -716,8 +703,6 @@
|
|||
<string name="customize_addon_collection_hint">Koleksiyon adı</string>
|
||||
<!-- Hint displayed on input field for custom collection user ID-->
|
||||
<string name="customize_addon_collection_user_hint">Koleksiyon sahibi (kullanıcı kimliği)</string>
|
||||
<!-- Toast shown after confirming the custom add-on collection configuration -->
|
||||
<string name="toast_customize_addon_collection_done" moz:removedIn="126" tools:ignore="UnusedResources">Eklenti koleksiyonu değiştirildi. Değişiklikleri uygulamak için uygulamadan çıkılıyor…</string>
|
||||
|
||||
<!-- Toast shown after confirming the custom extension collection configuration -->
|
||||
<string name="toast_customize_extension_collection_done">Uzantı koleksiyonu değiştirildi. Değişiklikleri uygulamak için uygulamadan çıkılıyor…</string>
|
||||
|
@ -776,35 +761,23 @@
|
|||
<string name="wallpapers_onboarding_dialog_explore_more_button_text">Daha fazla duvar kâğıdı keşfedin</string>
|
||||
|
||||
<!-- Add-ons general availability nimbus message-->
|
||||
<!-- Title of the Nimbus message for add-ons general availability-->
|
||||
<string name="addon_ga_message_title" moz:removedIn="126" tools:ignore="UnusedResources">Yeni eklentiler kullanıma sunuldu</string>
|
||||
<!-- Title of the Nimbus message for extension general availability-->
|
||||
<string name="addon_ga_message_title_2" tools:ignore="UnusedResources">Yeni uzantılar kullanıma sunuldu</string>
|
||||
<!-- Body of the Nimbus message for add-ons general availability. 'Firefox' intentionally hardcoded here-->
|
||||
<string name="addon_ga_message_body" tools:ignore="UnusedResources">Firefox’u kişiselleştirmenizi sağlayan 100’den fazla yeni uzantıya göz atın.</string>
|
||||
<!-- Button text of the Nimbus message for add-ons general availability. -->
|
||||
<string name="addon_ga_message_button" moz:removedIn="126" tools:ignore="UnusedResources">Eklentileri keşfet</string>
|
||||
|
||||
<!-- Button text of the Nimbus message for extensions general availability. -->
|
||||
<string name="addon_ga_message_button_2" tools:ignore="UnusedResources">Uzantıları keşfet</string>
|
||||
|
||||
<!-- Extension process crash dialog to user -->
|
||||
<!-- Title of a dialog shown to the user when enough errors have occurred with addons and they need to be temporarily disabled -->
|
||||
<string name="addon_process_crash_dialog_title" moz:removedIn="126" tools:ignore="UnusedResources">Eklentiler geçici olarak devre dışı bırakıldı</string>
|
||||
<!-- Title of the extension crash dialog shown to the user when enough errors have occurred with extensions and they need to be temporarily disabled -->
|
||||
<string name="extension_process_crash_dialog_title">Uzantılar geçici olarak devre dışı bırakıldı</string>
|
||||
<!-- The first parameter is the application name. This is a message shown to the user when too many errors have occurred with the addons process and they have been disabled. The user can decide if they would like to continue trying to start add-ons or if they'd rather continue without them. -->
|
||||
<string name="addon_process_crash_dialog_message" moz:removedIn="126" tools:ignore="UnusedResources">Bir veya daha fazla eklenti çalışmayı durdurdu ve sisteminizi kararsız duruma getirdi. %1$s eklentileri yeniden başlatmayı denedi fakat başarısız oldu.\n\nEklentiler mevcut oturumunuz sırasında yeniden başlatılmayacak.\n\nEklentileri kaldırmak veya devre dışı bırakmak bu sorunu çözebilir.</string>
|
||||
<!-- This is a message shown to the user when too many errors have occurred with the extensions process and they have been disabled.
|
||||
The user can decide if they would like to continue trying to start extensions or if they'd rather continue without them.
|
||||
The first parameter is the application name. -->
|
||||
<string name="extension_process_crash_dialog_message">Bir veya daha fazla uzantı çalışmayı durdurdu ve sisteminizi kararsız duruma getirdi. %1$s uzantıları yeniden başlatmayı denedi fakat başarısız oldu.\n\nUzantılar mevcut oturumunuz sırasında yeniden başlatılmayacak.\n\nUzantıları kaldırmak veya devre dışı bırakmak bu sorunu çözebilir.</string>
|
||||
<!-- This will cause the add-ons to try restarting but the dialog will reappear if it is unsuccessful again -->
|
||||
<string name="addon_process_crash_dialog_retry_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Eklentileri yeniden başlatmayı dene</string>
|
||||
<!-- Button text on the extension crash dialog to prompt the user to try restarting the extensions but the dialog will reappear if it is unsuccessful again -->
|
||||
<string name="extension_process_crash_dialog_retry_button_text" tools:ignore="UnusedResources">Uzantıları yeniden başlatmayı dene</string>
|
||||
<!-- The user will continue with all add-ons disabled -->
|
||||
<string name="addon_process_crash_dialog_disable_addons_button_text" moz:removedIn="126" tools:ignore="UnusedResources">Eklentileri devre dışı bırakarak devam et</string>
|
||||
|
||||
<!-- Button text on the extension crash dialog to prompt the user to continue with all extensions disabled. -->
|
||||
<string name="extension_process_crash_dialog_disable_extensions_button_text">Uzantıları devre dışı bırakarak devam et</string>
|
||||
|
@ -929,7 +902,7 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">Araç çubuğunu gizlemek için kaydır</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">Sekme değiştirmek için araç çubuğunu yana kaydır</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">Sekme değiştirmek için araç çubuğunu yana kaydır</string>
|
||||
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">Sekmeleri açmak için araç çubuğunu yukarı kaydır</string>
|
||||
|
@ -2509,8 +2482,6 @@
|
|||
<string name="translation_error_could_not_load_languages_warning_text">Diller yüklenemedi. İnternet bağlantınızı kontrol edip yeniden deneyin.</string>
|
||||
<!-- The title of the warning card informs the user that a language is not supported. The first parameter is the name of the language that is not supported. -->
|
||||
<string name="translation_error_language_not_supported_warning_text">Maalesef henüz %1$s dilini desteklemiyoruz.</string>
|
||||
<!-- Button text on the warning card when a language is not supported. The link will take the user to a page to a support page about translations. -->
|
||||
<string name="translation_error_language_not_supported_learn_more" moz:removedIn="126" tools:ignore="UnusedResources">Daha fazla bilgi al</string>
|
||||
|
||||
<!-- Snackbar title shown if the user closes the Translation Request dialogue and a translation is in progress. -->
|
||||
<string name="translation_in_progress_snackbar">Çevriliyor…</string>
|
||||
|
@ -2525,8 +2496,6 @@
|
|||
|
||||
<!-- Translations options dialog -->
|
||||
<!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. -->
|
||||
<string name="translation_option_bottom_sheet_title" moz:removedIn="126" tools:ignore="UnusedResources">Çeviri Seçenekleri</string>
|
||||
<!-- Title of the translation options dialog that allows a user to set their translation options for the site the user is currently on. -->
|
||||
<string name="translation_option_bottom_sheet_title_heading">Çeviri seçenekleri</string>
|
||||
<!-- Toggle switch label that allows a user to set the setting if they would like the browser to always offer or suggest translations when available. -->
|
||||
<string name="translation_option_bottom_sheet_always_translate">Her zaman çevirmeyi teklif et</string>
|
||||
|
@ -2726,14 +2695,21 @@
|
|||
|
||||
<!-- The continue button label -->
|
||||
<string name="micro_survey_continue_button_label" tools:ignore="UnusedResources">Devam et</string>
|
||||
<!-- Survey view -->
|
||||
<!-- The survey header -->
|
||||
<string name="micro_survey_survey_header">Bu anketi tamamlayın</string>
|
||||
<string name="micro_survey_survey_header" moz:removedIn="129" tools:ignore="UnusedResources">Bu anketi tamamlayın</string>
|
||||
<!-- The survey header -->
|
||||
<string name="micro_survey_survey_header_2">Lütfen anketi tamamlayın</string>
|
||||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice">Gizlilik Bildirimi</string>
|
||||
<string name="micro_survey_privacy_notice" moz:removedIn="129" tools:ignore="UnusedResources">Gizlilik Bildirimi</string>
|
||||
<!-- The privacy notice link -->
|
||||
<string name="micro_survey_privacy_notice_2">Gizlilik bildirimi</string>
|
||||
<!-- The submit button label text -->
|
||||
<string name="micro_survey_submit_button_label">Gönder</string>
|
||||
<!-- The close button label text -->
|
||||
<string name="micro_survey_close_button_label" moz:removedIn="128" tools:ignore="UnusedResources">Kapat</string>
|
||||
<!-- The survey completion header -->
|
||||
<string name="micro_survey_survey_header_confirmation" tools:ignore="UnusedResources">Anket tamamlandı</string>
|
||||
<!-- The survey completion confirmation text -->
|
||||
<string name="micro_survey_feedback_confirmation">Geri bildiriminiz için teşekkürler!</string>
|
||||
<!-- Option for likert scale -->
|
||||
|
@ -2747,7 +2723,11 @@
|
|||
<!-- Option for likert scale -->
|
||||
<string name="likert_scale_option_5" tools:ignore="UnusedResources">Hiç memnun değilim</string>
|
||||
|
||||
<!-- Microsurvey accessibility -->
|
||||
<!-- Option for likert scale -->
|
||||
<string name="likert_scale_option_6" tools:ignore="UnusedResources">Kullanmıyorum</string>
|
||||
<!-- Text shown in prompt for homepage microsurvey. 'Firefox' intentionally hardcoded here- -->
|
||||
<string name="microsurvey_prompt_homepage_title" tools:ignore="UnusedResources">Firefox giriş sayfanızdan ne kadar memnunsunuz?</string>
|
||||
<!-- Accessibility -->
|
||||
<!-- Content description (not visible, for screen readers etc.) for opening microsurvey bottom sheet. -->
|
||||
<string name="microsurvey_open_handle_content_description" tools:ignore="UnusedResources">Anketi aç</string>
|
||||
<!-- Content description (not visible, for screen readers etc.) for closing microsurvey bottom sheet. -->
|
||||
|
|
|
@ -583,7 +583,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">ھېسابات</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">قورال بالداق</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">قورال بالداق</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">ئادرېس بالداق ئورنى</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">ئۇسلۇب</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -892,10 +894,16 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">دومىلاتقاندا قورال بالداقنى يوشۇر</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">قورال بالداق يانغا سۈرۈلسە بەتكۈچ ئالماشتۇرىدۇ</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">قورال بالداق يانغا سۈرۈلسە بەتكۈچ ئالماشتۇرىدۇ</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">قورال بالداق ئۈستىگە سۈرۈلسە بەتكۈچ ئاچىدۇ</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">سىيرىلسا ئادرېس بالداق ۋە قورال بالداقنى يوشۇرىدۇ</string>
|
||||
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">ئادرېس بالداقتا يانغا سۈرۈلسە بەتكۈچ ئالماشتۇرىدۇ</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">چۈشۈرۈلمىلەر</string>
|
||||
|
|
|
@ -596,7 +596,9 @@
|
|||
<!-- Preference category for account information -->
|
||||
<string name="preferences_category_account">帳號</string>
|
||||
<!-- Preference for changing where the toolbar is positioned -->
|
||||
<string name="preferences_toolbar">工具列</string>
|
||||
<string name="preferences_toolbar" moz:removedIn="129" tools:ignore="UnusedResources">工具列</string>
|
||||
<!-- Preference for changing where the AddressBar is positioned -->
|
||||
<string name="preferences_toolbar_2">網址列位置</string>
|
||||
<!-- Preference for changing default theme to dark or light mode -->
|
||||
<string name="preferences_theme">佈景主題</string>
|
||||
<!-- Preference for customizing the home screen -->
|
||||
|
@ -907,10 +909,15 @@
|
|||
<!-- Preference for using the dynamic toolbar -->
|
||||
<string name="preference_gestures_dynamic_toolbar">滾動畫面即可隱藏工具列</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the toolbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs">橫向滑動工具列來切換分頁</string>
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs" moz:removedIn="129" tools:ignore="UnusedResources">橫向滑動工具列來切換分頁</string>
|
||||
<!-- Preference for showing the opened tabs by swiping up on the toolbar-->
|
||||
<string name="preference_gestures_swipe_toolbar_show_tabs">向上滑動工具列來開新分頁</string>
|
||||
|
||||
<!-- Preference for using the dynamic toolbars -->
|
||||
<string name="preference_gestures_dynamic_toolbar_2">滑動即可隱藏網址列與工具列</string>
|
||||
<!-- Preference for switching tabs by swiping horizontally on the addressbar -->
|
||||
<string name="preference_gestures_swipe_toolbar_switch_tabs_2">橫向滑動網址列來切換分頁</string>
|
||||
|
||||
<!-- Library -->
|
||||
<!-- Option in Library to open Downloads page -->
|
||||
<string name="library_downloads">下載項目</string>
|
||||
|
|
|
@ -11,7 +11,9 @@ import androidx.lifecycle.Lifecycle
|
|||
import androidx.lifecycle.LifecycleOwner
|
||||
import androidx.lifecycle.LifecycleRegistry
|
||||
import androidx.navigation.NavController
|
||||
import io.mockk.Runs
|
||||
import io.mockk.every
|
||||
import io.mockk.just
|
||||
import io.mockk.mockk
|
||||
import io.mockk.mockkObject
|
||||
import io.mockk.mockkStatic
|
||||
|
@ -377,6 +379,7 @@ class BrowserFragmentTest {
|
|||
browserFragment.leadingAction = leadingAction
|
||||
browserFragment._browserToolbarView = browserToolbarView
|
||||
every { browserFragment.browserToolbarView.view } returns browserToolbar
|
||||
every { browserFragment.browserToolbarView.updateMenuVisibility(any()) } just Runs
|
||||
|
||||
mockkObject(ThemeManager.Companion)
|
||||
every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true)
|
||||
|
@ -404,6 +407,7 @@ class BrowserFragmentTest {
|
|||
browserFragment.leadingAction = leadingAction
|
||||
browserFragment._browserToolbarView = browserToolbarView
|
||||
every { browserFragment.browserToolbarView.view } returns browserToolbar
|
||||
every { browserFragment.browserToolbarView.updateMenuVisibility(any()) } just Runs
|
||||
|
||||
mockkObject(ThemeManager.Companion)
|
||||
every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true)
|
||||
|
@ -430,6 +434,7 @@ class BrowserFragmentTest {
|
|||
browserFragment.leadingAction = leadingAction
|
||||
browserFragment._browserToolbarView = browserToolbarView
|
||||
every { browserFragment.browserToolbarView.view } returns browserToolbar
|
||||
every { browserFragment.browserToolbarView.updateMenuVisibility(any()) } just Runs
|
||||
|
||||
mockkObject(ThemeManager.Companion)
|
||||
every { ThemeManager.resolveAttribute(any(), context) } returns mockk(relaxed = true)
|
||||
|
|
|
@ -43,7 +43,6 @@ class DefaultToolbarIntegrationTest {
|
|||
sessionId = null,
|
||||
isPrivate = false,
|
||||
interactor = mockk(),
|
||||
isNavBarEnabled = false,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@ imply_option("MOZ_GECKOVIEW_HISTORY", True)
|
|||
|
||||
imply_option("MOZ_APP_VENDOR", "Mozilla")
|
||||
imply_option("MOZ_APP_ID", "{aa3c5121-dab2-40e2-81ca-7ea25febc110}")
|
||||
imply_option("BROWSER_CHROME_URL", "chrome://geckoview/content/geckoview.xhtml")
|
||||
|
||||
|
||||
@depends(target)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"an": {
|
||||
"pin": false,
|
||||
|
@ -15,7 +15,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ar": {
|
||||
"pin": false,
|
||||
|
@ -24,7 +24,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ast": {
|
||||
"pin": false,
|
||||
|
@ -33,7 +33,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"az": {
|
||||
"pin": false,
|
||||
|
@ -42,7 +42,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"be": {
|
||||
"pin": false,
|
||||
|
@ -51,7 +51,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bg": {
|
||||
"pin": false,
|
||||
|
@ -60,7 +60,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bn": {
|
||||
"pin": false,
|
||||
|
@ -69,7 +69,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"br": {
|
||||
"pin": false,
|
||||
|
@ -78,7 +78,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"bs": {
|
||||
"pin": false,
|
||||
|
@ -87,7 +87,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ca": {
|
||||
"pin": false,
|
||||
|
@ -96,7 +96,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cak": {
|
||||
"pin": false,
|
||||
|
@ -105,7 +105,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cs": {
|
||||
"pin": false,
|
||||
|
@ -114,7 +114,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"cy": {
|
||||
"pin": false,
|
||||
|
@ -123,7 +123,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"da": {
|
||||
"pin": false,
|
||||
|
@ -132,7 +132,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"de": {
|
||||
"pin": false,
|
||||
|
@ -141,7 +141,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"dsb": {
|
||||
"pin": false,
|
||||
|
@ -150,7 +150,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"el": {
|
||||
"pin": false,
|
||||
|
@ -159,7 +159,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"en-CA": {
|
||||
"pin": false,
|
||||
|
@ -168,7 +168,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"en-GB": {
|
||||
"pin": false,
|
||||
|
@ -177,7 +177,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"eo": {
|
||||
"pin": false,
|
||||
|
@ -186,7 +186,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-AR": {
|
||||
"pin": false,
|
||||
|
@ -195,7 +195,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-CL": {
|
||||
"pin": false,
|
||||
|
@ -204,7 +204,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-ES": {
|
||||
"pin": false,
|
||||
|
@ -213,7 +213,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"es-MX": {
|
||||
"pin": false,
|
||||
|
@ -222,7 +222,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"et": {
|
||||
"pin": false,
|
||||
|
@ -231,7 +231,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"eu": {
|
||||
"pin": false,
|
||||
|
@ -240,7 +240,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fa": {
|
||||
"pin": false,
|
||||
|
@ -249,7 +249,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ff": {
|
||||
"pin": false,
|
||||
|
@ -258,7 +258,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fi": {
|
||||
"pin": false,
|
||||
|
@ -267,7 +267,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fr": {
|
||||
"pin": false,
|
||||
|
@ -276,7 +276,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"fy-NL": {
|
||||
"pin": false,
|
||||
|
@ -285,7 +285,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ga-IE": {
|
||||
"pin": false,
|
||||
|
@ -294,7 +294,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gd": {
|
||||
"pin": false,
|
||||
|
@ -303,7 +303,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gl": {
|
||||
"pin": false,
|
||||
|
@ -312,7 +312,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gn": {
|
||||
"pin": false,
|
||||
|
@ -321,7 +321,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"gu-IN": {
|
||||
"pin": false,
|
||||
|
@ -330,7 +330,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"he": {
|
||||
"pin": false,
|
||||
|
@ -339,7 +339,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hi-IN": {
|
||||
"pin": false,
|
||||
|
@ -348,7 +348,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hr": {
|
||||
"pin": false,
|
||||
|
@ -357,7 +357,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hsb": {
|
||||
"pin": false,
|
||||
|
@ -366,7 +366,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hu": {
|
||||
"pin": false,
|
||||
|
@ -375,7 +375,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"hy-AM": {
|
||||
"pin": false,
|
||||
|
@ -384,7 +384,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ia": {
|
||||
"pin": false,
|
||||
|
@ -393,7 +393,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"id": {
|
||||
"pin": false,
|
||||
|
@ -402,7 +402,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"is": {
|
||||
"pin": false,
|
||||
|
@ -411,7 +411,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"it": {
|
||||
"pin": false,
|
||||
|
@ -420,7 +420,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ja": {
|
||||
"pin": false,
|
||||
|
@ -429,7 +429,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ka": {
|
||||
"pin": false,
|
||||
|
@ -438,7 +438,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kab": {
|
||||
"pin": false,
|
||||
|
@ -447,7 +447,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kk": {
|
||||
"pin": false,
|
||||
|
@ -456,7 +456,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"km": {
|
||||
"pin": false,
|
||||
|
@ -465,7 +465,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"kn": {
|
||||
"pin": false,
|
||||
|
@ -474,7 +474,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ko": {
|
||||
"pin": false,
|
||||
|
@ -483,7 +483,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lij": {
|
||||
"pin": false,
|
||||
|
@ -492,7 +492,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lo": {
|
||||
"pin": false,
|
||||
|
@ -501,7 +501,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lt": {
|
||||
"pin": false,
|
||||
|
@ -510,7 +510,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ltg": {
|
||||
"pin": false,
|
||||
|
@ -519,7 +519,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"lv": {
|
||||
"pin": false,
|
||||
|
@ -528,7 +528,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"meh": {
|
||||
"pin": false,
|
||||
|
@ -537,7 +537,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"mix": {
|
||||
"pin": false,
|
||||
|
@ -546,7 +546,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ml": {
|
||||
"pin": false,
|
||||
|
@ -555,7 +555,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"mr": {
|
||||
"pin": false,
|
||||
|
@ -564,7 +564,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ms": {
|
||||
"pin": false,
|
||||
|
@ -573,7 +573,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"my": {
|
||||
"pin": false,
|
||||
|
@ -582,7 +582,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nb-NO": {
|
||||
"pin": false,
|
||||
|
@ -591,7 +591,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ne-NP": {
|
||||
"pin": false,
|
||||
|
@ -600,7 +600,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nl": {
|
||||
"pin": false,
|
||||
|
@ -609,7 +609,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"nn-NO": {
|
||||
"pin": false,
|
||||
|
@ -618,7 +618,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"oc": {
|
||||
"pin": false,
|
||||
|
@ -627,7 +627,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pa-IN": {
|
||||
"pin": false,
|
||||
|
@ -636,7 +636,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pl": {
|
||||
"pin": false,
|
||||
|
@ -645,7 +645,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pt-BR": {
|
||||
"pin": false,
|
||||
|
@ -654,7 +654,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"pt-PT": {
|
||||
"pin": false,
|
||||
|
@ -663,7 +663,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"rm": {
|
||||
"pin": false,
|
||||
|
@ -672,7 +672,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ro": {
|
||||
"pin": false,
|
||||
|
@ -681,7 +681,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ru": {
|
||||
"pin": false,
|
||||
|
@ -690,7 +690,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sk": {
|
||||
"pin": false,
|
||||
|
@ -699,7 +699,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sl": {
|
||||
"pin": false,
|
||||
|
@ -708,7 +708,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"son": {
|
||||
"pin": false,
|
||||
|
@ -717,7 +717,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sq": {
|
||||
"pin": false,
|
||||
|
@ -726,7 +726,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sr": {
|
||||
"pin": false,
|
||||
|
@ -735,7 +735,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"sv-SE": {
|
||||
"pin": false,
|
||||
|
@ -744,7 +744,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ta": {
|
||||
"pin": false,
|
||||
|
@ -753,7 +753,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"te": {
|
||||
"pin": false,
|
||||
|
@ -762,7 +762,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"th": {
|
||||
"pin": false,
|
||||
|
@ -771,7 +771,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"tl": {
|
||||
"pin": false,
|
||||
|
@ -780,7 +780,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"tr": {
|
||||
"pin": false,
|
||||
|
@ -789,7 +789,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"trs": {
|
||||
"pin": false,
|
||||
|
@ -798,7 +798,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"uk": {
|
||||
"pin": false,
|
||||
|
@ -807,7 +807,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"ur": {
|
||||
"pin": false,
|
||||
|
@ -816,7 +816,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"uz": {
|
||||
"pin": false,
|
||||
|
@ -825,7 +825,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"vi": {
|
||||
"pin": false,
|
||||
|
@ -834,7 +834,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"wo": {
|
||||
"pin": false,
|
||||
|
@ -843,7 +843,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"xh": {
|
||||
"pin": false,
|
||||
|
@ -852,7 +852,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"zam": {
|
||||
"pin": false,
|
||||
|
@ -861,7 +861,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"zh-CN": {
|
||||
"pin": false,
|
||||
|
@ -870,7 +870,7 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
},
|
||||
"zh-TW": {
|
||||
"pin": false,
|
||||
|
@ -879,6 +879,6 @@
|
|||
"android-arm",
|
||||
"android-multilocale"
|
||||
],
|
||||
"revision": "99e5146ad1a9303fd11d04119f8512fac1e8e32f"
|
||||
"revision": "6196da8b122cbf67fac79486cbfd5b2ed9f7096b"
|
||||
}
|
||||
}
|
|
@ -504,7 +504,6 @@ dnl ========================================================
|
|||
|
||||
MOZ_BRANDING_DIRECTORY=
|
||||
MOZ_OFFICIAL_BRANDING=
|
||||
MOZ_DEVTOOLS=server
|
||||
|
||||
dnl ========================================================
|
||||
dnl = Trademarked Branding
|
||||
|
@ -723,7 +722,6 @@ AC_SUBST(MOZ_EME_PROCESS_BUNDLEID)
|
|||
# builds (e.g. Aurora for Firefox).
|
||||
# - MOZ_APP_PROFILE: When set, used for application.ini's
|
||||
# "Profile" field, which controls profile location.
|
||||
# - MOZ_PROFILE_MIGRATOR: When set, enables profile migrator.
|
||||
|
||||
# The following environment variables used to have an effect, but don't anymore:
|
||||
# - MOZ_APP_VERSION: Defines the application version number. This was replaced with
|
||||
|
@ -756,12 +754,9 @@ AC_SUBST(MOZ_APP_DISPLAYNAME)
|
|||
AC_SUBST(MOZ_APP_PROFILE)
|
||||
AC_SUBST(MAR_CHANNEL_ID)
|
||||
AC_SUBST(ACCEPTED_MAR_CHANNEL_IDS)
|
||||
AC_SUBST(MOZ_PROFILE_MIGRATOR)
|
||||
AC_DEFINE_UNQUOTED(MOZ_APP_UA_NAME, "$MOZ_APP_UA_NAME")
|
||||
AC_SUBST(MOZ_APP_UA_NAME)
|
||||
AC_DEFINE_UNQUOTED(MOZ_APP_UA_VERSION, "$MOZ_APP_VERSION")
|
||||
AC_DEFINE_UNQUOTED(BROWSER_CHROME_URL, $BROWSER_CHROME_URL)
|
||||
AC_DEFINE_UNQUOTED(BROWSER_CHROME_URL_QUOTED, "$BROWSER_CHROME_URL")
|
||||
|
||||
AC_SUBST(MOZ_APP_MAXVERSION)
|
||||
|
||||
|
@ -770,10 +765,6 @@ if test "$MOZILLA_OFFICIAL"; then
|
|||
MOZ_INCLUDE_SOURCE_INFO=1
|
||||
fi
|
||||
|
||||
# External builds (specifically Ubuntu) may drop the hg repo information, so we allow to
|
||||
# explicitly set the repository and changeset information in.
|
||||
AC_SUBST(MOZ_SOURCE_REPO)
|
||||
AC_SUBST(MOZ_SOURCE_CHANGESET)
|
||||
AC_SUBST(MOZ_INCLUDE_SOURCE_INFO)
|
||||
|
||||
dnl Echo the CFLAGS to remove extra whitespace.
|
||||
|
@ -857,8 +848,6 @@ AC_SUBST(BIN_SUFFIX)
|
|||
AC_SUBST(WIN32_CONSOLE_EXE_LDFLAGS)
|
||||
AC_SUBST(WIN32_GUI_EXE_LDFLAGS)
|
||||
|
||||
AC_SUBST(MOZ_DEVTOOLS)
|
||||
|
||||
dnl Used specifically by Thunderbird
|
||||
AC_SUBST(NSS_EXTRA_SYMBOLS_FILE)
|
||||
|
||||
|
|
|
@ -1273,7 +1273,7 @@ def target_tasks_release_simulation(full_task_graph, parameters, graph_config):
|
|||
if filter_release_tasks(t, parameters)
|
||||
and filter_out_cron(t, parameters)
|
||||
and filter_for_target_project(t)
|
||||
and filter_out_android_on_esr(t)
|
||||
and filter_out_android_on_esr(parameters, t)
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -1267,7 +1267,6 @@ Tester.prototype = {
|
|||
err
|
||||
? {
|
||||
name: err.message,
|
||||
ex: err.stack,
|
||||
stack: err.stack,
|
||||
allowFailure: currentTest.allowFailure,
|
||||
}
|
||||
|
|
|
@ -37,6 +37,10 @@ VideoType PipeWireRawFormatToVideoType(uint32_t id) {
|
|||
return VideoType::kUYVY;
|
||||
case SPA_VIDEO_FORMAT_RGB:
|
||||
return VideoType::kRGB24;
|
||||
case SPA_VIDEO_FORMAT_BGRA:
|
||||
return VideoType::kARGB;
|
||||
case SPA_VIDEO_FORMAT_RGBA:
|
||||
return VideoType::kABGR;
|
||||
default:
|
||||
return VideoType::kUnknown;
|
||||
}
|
||||
|
@ -354,6 +358,13 @@ void PipeWireSession::OnRegistryGlobal(void* data,
|
|||
const spa_dict* props) {
|
||||
PipeWireSession* that = static_cast<PipeWireSession*>(data);
|
||||
|
||||
// Skip already added nodes to avoid duplicate camera entries
|
||||
if (std::find_if(that->nodes_.begin(), that->nodes_.end(),
|
||||
[id](const PipeWireNode& node) {
|
||||
return node.id() == id;
|
||||
}) != that->nodes_.end())
|
||||
return;
|
||||
|
||||
if (type != absl::string_view(PW_TYPE_INTERFACE_Node))
|
||||
return;
|
||||
|
||||
|
@ -372,12 +383,10 @@ void PipeWireSession::OnRegistryGlobal(void* data,
|
|||
void PipeWireSession::OnRegistryGlobalRemove(void* data, uint32_t id) {
|
||||
PipeWireSession* that = static_cast<PipeWireSession*>(data);
|
||||
|
||||
for (auto it = that->nodes_.begin(); it != that->nodes().end(); ++it) {
|
||||
if ((*it).id() == id) {
|
||||
that->nodes_.erase(it);
|
||||
break;
|
||||
}
|
||||
}
|
||||
auto it = std::remove_if(
|
||||
that->nodes_.begin(), that->nodes_.end(),
|
||||
[id](const PipeWireNode& node) { return node.id() == id; });
|
||||
that->nodes_.erase(it, that->nodes_.end());
|
||||
}
|
||||
|
||||
void PipeWireSession::Finish(VideoCaptureOptions::Status status) {
|
||||
|
|
|
@ -33,6 +33,10 @@ struct {
|
|||
{SPA_VIDEO_FORMAT_NV12, VideoType::kNV12},
|
||||
{SPA_VIDEO_FORMAT_YUY2, VideoType::kYUY2},
|
||||
{SPA_VIDEO_FORMAT_UYVY, VideoType::kUYVY},
|
||||
// PipeWire is big-endian for the formats, while libyuv is little-endian
|
||||
// This means that BGRA == ARGB and RGBA == ABGR
|
||||
{SPA_VIDEO_FORMAT_BGRA, VideoType::kARGB},
|
||||
{SPA_VIDEO_FORMAT_RGBA, VideoType::kABGR},
|
||||
{SPA_VIDEO_FORMAT_RGB, VideoType::kRGB24},
|
||||
};
|
||||
|
||||
|
@ -303,6 +307,10 @@ void VideoCaptureModulePipeWire::OnFormatChanged(const struct spa_pod* format) {
|
|||
case VideoType::kRGB24:
|
||||
stride = configured_capability_.width * 3;
|
||||
break;
|
||||
case VideoType::kARGB:
|
||||
case VideoType::kABGR:
|
||||
stride = configured_capability_.width * 4;
|
||||
break;
|
||||
default:
|
||||
RTC_LOG(LS_ERROR) << "Unsupported video format.";
|
||||
return;
|
||||
|
@ -410,11 +418,10 @@ void VideoCaptureModulePipeWire::ProcessBuffers() {
|
|||
ScopedBuf frame;
|
||||
frame.initialize(
|
||||
static_cast<uint8_t*>(
|
||||
mmap(nullptr,
|
||||
spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||
PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0)),
|
||||
spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
|
||||
spaBuffer->datas[0].fd, spaBuffer->datas[0].type == SPA_DATA_DmaBuf);
|
||||
mmap(nullptr, spaBuffer->datas[0].maxsize, PROT_READ, MAP_SHARED,
|
||||
spaBuffer->datas[0].fd, spaBuffer->datas[0].mapoffset)),
|
||||
spaBuffer->datas[0].maxsize, spaBuffer->datas[0].fd,
|
||||
spaBuffer->datas[0].type == SPA_DATA_DmaBuf);
|
||||
|
||||
if (!frame) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to mmap the memory: "
|
||||
|
|
1
third_party/libwebrtc/moz-patch-stack/025d69b4d0.no-op-cherry-pick-msg
vendored
Normal file
1
third_party/libwebrtc/moz-patch-stack/025d69b4d0.no-op-cherry-pick-msg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
We cherry-picked this in bug 1902618.
|
1
third_party/libwebrtc/moz-patch-stack/3252f5d8e4.no-op-cherry-pick-msg
vendored
Normal file
1
third_party/libwebrtc/moz-patch-stack/3252f5d8e4.no-op-cherry-pick-msg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
We cherry-picked this in bug 1902618.
|
1
third_party/libwebrtc/moz-patch-stack/633a41ff8e.no-op-cherry-pick-msg
vendored
Normal file
1
third_party/libwebrtc/moz-patch-stack/633a41ff8e.no-op-cherry-pick-msg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
We cherry-picked this in bug 1902615.
|
1
third_party/libwebrtc/moz-patch-stack/c3aeffd776.no-op-cherry-pick-msg
vendored
Normal file
1
third_party/libwebrtc/moz-patch-stack/c3aeffd776.no-op-cherry-pick-msg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
We cherry-picked this in bug 1901767.
|
|
@ -48,5 +48,6 @@ export const PdfJsDefaultPreferences = Object.freeze({
|
|||
disableFontFace: false,
|
||||
disableRange: false,
|
||||
disableStream: false,
|
||||
enableHWA: false,
|
||||
enableXfa: true
|
||||
});
|
||||
|
|
|
@ -840,10 +840,14 @@ class BaseFilterFactory {
|
|||
destroy(keepHCM = false) {}
|
||||
}
|
||||
class BaseCanvasFactory {
|
||||
constructor() {
|
||||
#enableHWA = false;
|
||||
constructor({
|
||||
enableHWA = false
|
||||
} = {}) {
|
||||
if (this.constructor === BaseCanvasFactory) {
|
||||
unreachable("Cannot initialize BaseCanvasFactory.");
|
||||
}
|
||||
this.#enableHWA = enableHWA;
|
||||
}
|
||||
create(width, height) {
|
||||
if (width <= 0 || height <= 0) {
|
||||
|
@ -852,7 +856,9 @@ class BaseCanvasFactory {
|
|||
const canvas = this._createCanvas(width, height);
|
||||
return {
|
||||
canvas,
|
||||
context: canvas.getContext("2d")
|
||||
context: canvas.getContext("2d", {
|
||||
willReadFrequently: !this.#enableHWA
|
||||
})
|
||||
};
|
||||
}
|
||||
reset(canvasAndContext, width, height) {
|
||||
|
@ -1278,9 +1284,12 @@ class DOMFilterFactory extends BaseFilterFactory {
|
|||
}
|
||||
class DOMCanvasFactory extends BaseCanvasFactory {
|
||||
constructor({
|
||||
ownerDocument = globalThis.document
|
||||
ownerDocument = globalThis.document,
|
||||
enableHWA = false
|
||||
} = {}) {
|
||||
super();
|
||||
super({
|
||||
enableHWA
|
||||
});
|
||||
this._document = ownerDocument;
|
||||
}
|
||||
_createCanvas(width, height) {
|
||||
|
@ -1836,7 +1845,9 @@ class ImageManager {
|
|||
static get _isSVGFittingCanvas() {
|
||||
const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="http://www.w3.org/2000/svg"><rect width="1" height="1" style="fill:red;"/></svg>`;
|
||||
const canvas = new OffscreenCanvas(1, 3);
|
||||
const ctx = canvas.getContext("2d");
|
||||
const ctx = canvas.getContext("2d", {
|
||||
willReadFrequently: true
|
||||
});
|
||||
const image = new Image();
|
||||
image.src = svg;
|
||||
const promise = image.decode().then(() => {
|
||||
|
@ -2175,6 +2186,8 @@ class AnnotationEditorUIManager {
|
|||
#boundFocus = this.focus.bind(this);
|
||||
#boundCopy = this.copy.bind(this);
|
||||
#boundCut = this.cut.bind(this);
|
||||
#boundDragOver = this.dragOver.bind(this);
|
||||
#boundDrop = this.drop.bind(this);
|
||||
#boundPaste = this.paste.bind(this);
|
||||
#boundKeydown = this.keydown.bind(this);
|
||||
#boundKeyup = this.keyup.bind(this);
|
||||
|
@ -2265,6 +2278,7 @@ class AnnotationEditorUIManager {
|
|||
this._eventBus._on("scalechanging", this.#boundOnScaleChanging);
|
||||
this._eventBus._on("rotationchanging", this.#boundOnRotationChanging);
|
||||
this.#addSelectionListener();
|
||||
this.#addDragAndDropListeners();
|
||||
this.#addKeyboardManager();
|
||||
this.#annotationStorage = pdfDocument.annotationStorage;
|
||||
this.#filterFactory = pdfDocument.filterFactory;
|
||||
|
@ -2279,6 +2293,7 @@ class AnnotationEditorUIManager {
|
|||
this.isShiftKeyDown = false;
|
||||
}
|
||||
destroy() {
|
||||
this.#removeDragAndDropListeners();
|
||||
this.#removeKeyboardManager();
|
||||
this.#removeFocusManager();
|
||||
this._eventBus._off("editingaction", this.#boundOnEditingAction);
|
||||
|
@ -2574,6 +2589,14 @@ class AnnotationEditorUIManager {
|
|||
document.removeEventListener("cut", this.#boundCut);
|
||||
document.removeEventListener("paste", this.#boundPaste);
|
||||
}
|
||||
#addDragAndDropListeners() {
|
||||
document.addEventListener("dragover", this.#boundDragOver);
|
||||
document.addEventListener("drop", this.#boundDrop);
|
||||
}
|
||||
#removeDragAndDropListeners() {
|
||||
document.removeEventListener("dragover", this.#boundDragOver);
|
||||
document.removeEventListener("drop", this.#boundDrop);
|
||||
}
|
||||
addEditListeners() {
|
||||
this.#addKeyboardManager();
|
||||
this.#addCopyPasteListeners();
|
||||
|
@ -2582,6 +2605,30 @@ class AnnotationEditorUIManager {
|
|||
this.#removeKeyboardManager();
|
||||
this.#removeCopyPasteListeners();
|
||||
}
|
||||
dragOver(event) {
|
||||
for (const {
|
||||
type
|
||||
} of event.dataTransfer.items) {
|
||||
for (const editorType of this.#editorTypes) {
|
||||
if (editorType.isHandlingMimeForPasting(type)) {
|
||||
event.dataTransfer.dropEffect = "copy";
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
drop(event) {
|
||||
for (const item of event.dataTransfer.items) {
|
||||
for (const editorType of this.#editorTypes) {
|
||||
if (editorType.isHandlingMimeForPasting(item.type)) {
|
||||
editorType.paste(item, this.currentLayer);
|
||||
event.preventDefault();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
copy(event) {
|
||||
event.preventDefault();
|
||||
this.#activeEditor?.commitOrRemove();
|
||||
|
@ -9137,7 +9184,8 @@ class TextLayer {
|
|||
canvas.lang = lang;
|
||||
document.body.append(canvas);
|
||||
canvasContext = canvas.getContext("2d", {
|
||||
alpha: false
|
||||
alpha: false,
|
||||
willReadFrequently: true
|
||||
});
|
||||
this.#canvasContexts.set(lang, canvasContext);
|
||||
}
|
||||
|
@ -9299,11 +9347,13 @@ function getDocument(src) {
|
|||
const disableStream = src.disableStream === true;
|
||||
const disableAutoFetch = src.disableAutoFetch === true;
|
||||
const pdfBug = src.pdfBug === true;
|
||||
const enableHWA = src.enableHWA === true;
|
||||
const length = rangeTransport ? rangeTransport.length : src.length ?? NaN;
|
||||
const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace;
|
||||
const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : true;
|
||||
const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({
|
||||
ownerDocument
|
||||
ownerDocument,
|
||||
enableHWA
|
||||
});
|
||||
const filterFactory = src.filterFactory || new DefaultFilterFactory({
|
||||
docId,
|
||||
|
@ -9334,7 +9384,7 @@ function getDocument(src) {
|
|||
}
|
||||
const docParams = {
|
||||
docId,
|
||||
apiVersion: "4.4.16",
|
||||
apiVersion: "4.4.34",
|
||||
data,
|
||||
password,
|
||||
disableAutoFetch,
|
||||
|
@ -10989,8 +11039,8 @@ class InternalRenderTask {
|
|||
}
|
||||
}
|
||||
}
|
||||
const version = "4.4.16";
|
||||
const build = "593ce9683";
|
||||
const version = "4.4.34";
|
||||
const build = "e3caa3c6e";
|
||||
|
||||
;// CONCATENATED MODULE: ./src/shared/scripting_utils.js
|
||||
function makeColorComp(n) {
|
||||
|
@ -17872,8 +17922,8 @@ class DrawLayer {
|
|||
|
||||
|
||||
|
||||
const pdfjsVersion = "4.4.16";
|
||||
const pdfjsBuild = "593ce9683";
|
||||
const pdfjsVersion = "4.4.34";
|
||||
const pdfjsBuild = "e3caa3c6e";
|
||||
|
||||
var __webpack_exports__AbortException = __webpack_exports__.AbortException;
|
||||
var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer;
|
||||
|
|
|
@ -3956,8 +3956,8 @@ function initSandbox(params) {
|
|||
|
||||
;// CONCATENATED MODULE: ./src/pdf.scripting.js
|
||||
|
||||
const pdfjsVersion = "4.4.16";
|
||||
const pdfjsBuild = "593ce9683";
|
||||
const pdfjsVersion = "4.4.34";
|
||||
const pdfjsBuild = "e3caa3c6e";
|
||||
globalThis.pdfjsScripting = {
|
||||
initSandbox: initSandbox
|
||||
};
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -728,6 +728,10 @@ const defaultOptions = {
|
|||
value: "",
|
||||
kind: OptionKind.API
|
||||
},
|
||||
enableHWA: {
|
||||
value: false,
|
||||
kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE
|
||||
},
|
||||
enableXfa: {
|
||||
value: true,
|
||||
kind: OptionKind.API + OptionKind.PREFERENCE
|
||||
|
@ -1397,6 +1401,7 @@ class BasePreferences {
|
|||
disableFontFace: false,
|
||||
disableRange: false,
|
||||
disableStream: false,
|
||||
enableHWA: false,
|
||||
enableXfa: true
|
||||
});
|
||||
#prefs = Object.create(null);
|
||||
|
@ -1581,13 +1586,6 @@ class FirefoxCom {
|
|||
}
|
||||
class DownloadManager {
|
||||
#openBlobUrls = new WeakMap();
|
||||
downloadUrl(url, filename, options = {}) {
|
||||
FirefoxCom.request("download", {
|
||||
originalUrl: url,
|
||||
filename,
|
||||
options
|
||||
});
|
||||
}
|
||||
downloadData(data, filename, contentType) {
|
||||
const blobUrl = URL.createObjectURL(new Blob([data], {
|
||||
type: contentType
|
||||
|
@ -1627,9 +1625,9 @@ class DownloadManager {
|
|||
return false;
|
||||
}
|
||||
download(data, url, filename, options = {}) {
|
||||
const blobUrl = URL.createObjectURL(new Blob([data], {
|
||||
const blobUrl = data ? URL.createObjectURL(new Blob([data], {
|
||||
type: "application/pdf"
|
||||
}));
|
||||
})) : null;
|
||||
FirefoxCom.request("download", {
|
||||
blobUrl,
|
||||
originalUrl: url,
|
||||
|
@ -4910,13 +4908,6 @@ class TextLayerBuilder {
|
|||
this.div.tabIndex = 0;
|
||||
this.div.className = "textLayer";
|
||||
}
|
||||
#finishRendering() {
|
||||
this.#renderingDone = true;
|
||||
const endOfContent = document.createElement("div");
|
||||
endOfContent.className = "endOfContent";
|
||||
this.div.append(endOfContent);
|
||||
this.#bindMouse(endOfContent);
|
||||
}
|
||||
async render(viewport, textContentParams = null) {
|
||||
if (this.#renderingDone && this.#textLayer) {
|
||||
this.#textLayer.update({
|
||||
|
@ -4942,7 +4933,11 @@ class TextLayerBuilder {
|
|||
this.highlighter?.setTextMapping(textDivs, textContentItemsStr);
|
||||
this.accessibilityManager?.setTextMapping(textDivs);
|
||||
await this.#textLayer.render();
|
||||
this.#finishRendering();
|
||||
this.#renderingDone = true;
|
||||
const endOfContent = document.createElement("div");
|
||||
endOfContent.className = "endOfContent";
|
||||
this.div.append(endOfContent);
|
||||
this.#bindMouse(endOfContent);
|
||||
this.#onAppend?.(this.div);
|
||||
this.highlighter?.enable();
|
||||
this.accessibilityManager?.enable();
|
||||
|
@ -5053,6 +5048,7 @@ const DEFAULT_LAYER_PROPERTIES = null;
|
|||
const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]);
|
||||
class PDFPageView {
|
||||
#annotationMode = AnnotationMode.ENABLE_FORMS;
|
||||
#enableHWA = false;
|
||||
#hasRestrictedScaling = false;
|
||||
#layerProperties = null;
|
||||
#loadingId = null;
|
||||
|
@ -5085,6 +5081,7 @@ class PDFPageView {
|
|||
this.imageResourcesPath = options.imageResourcesPath || "";
|
||||
this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels");
|
||||
this.pageColors = options.pageColors || null;
|
||||
this.#enableHWA = options.enableHWA || false;
|
||||
this.eventBus = options.eventBus;
|
||||
this.renderingQueue = options.renderingQueue;
|
||||
this.l10n = options.l10n;
|
||||
|
@ -5666,7 +5663,8 @@ class PDFPageView {
|
|||
canvasWrapper.append(canvas);
|
||||
this.canvas = canvas;
|
||||
const ctx = canvas.getContext("2d", {
|
||||
alpha: false
|
||||
alpha: false,
|
||||
willReadFrequently: !this.#enableHWA
|
||||
});
|
||||
const outputScale = this.outputScale = new OutputScale();
|
||||
if (this.maxCanvasPixels > 0) {
|
||||
|
@ -5855,6 +5853,7 @@ class PDFViewer {
|
|||
#annotationEditorUIManager = null;
|
||||
#annotationMode = AnnotationMode.ENABLE_FORMS;
|
||||
#containerTopLeft = null;
|
||||
#enableHWA = false;
|
||||
#enableHighlightFloatingButton = false;
|
||||
#enablePermissions = false;
|
||||
#eventAbortController = null;
|
||||
|
@ -5868,7 +5867,7 @@ class PDFViewer {
|
|||
#scaleTimeoutId = null;
|
||||
#textLayerMode = TextLayerMode.ENABLE;
|
||||
constructor(options) {
|
||||
const viewerVersion = "4.4.16";
|
||||
const viewerVersion = "4.4.34";
|
||||
if (version !== viewerVersion) {
|
||||
throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`);
|
||||
}
|
||||
|
@ -5896,6 +5895,7 @@ class PDFViewer {
|
|||
this.#enablePermissions = options.enablePermissions || false;
|
||||
this.pageColors = options.pageColors || null;
|
||||
this.#mlManager = options.mlManager || null;
|
||||
this.#enableHWA = options.enableHWA || false;
|
||||
this.defaultRenderingQueue = !options.renderingQueue;
|
||||
this.renderingQueue = options.renderingQueue;
|
||||
const {
|
||||
|
@ -6313,7 +6313,8 @@ class PDFViewer {
|
|||
maxCanvasPixels: this.maxCanvasPixels,
|
||||
pageColors,
|
||||
l10n: this.l10n,
|
||||
layerProperties: this._layerProperties
|
||||
layerProperties: this._layerProperties,
|
||||
enableHWA: this.#enableHWA
|
||||
});
|
||||
this._pages.push(pageView);
|
||||
}
|
||||
|
@ -7626,6 +7627,7 @@ const PDFViewerApplication = {
|
|||
foreground: AppOptions.get("pageColorsForeground")
|
||||
} : null;
|
||||
const altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null;
|
||||
const enableHWA = AppOptions.get("enableHWA");
|
||||
const pdfViewer = new PDFViewer({
|
||||
container,
|
||||
viewer,
|
||||
|
@ -7648,7 +7650,8 @@ const PDFViewerApplication = {
|
|||
enablePermissions: AppOptions.get("enablePermissions"),
|
||||
pageColors,
|
||||
mlManager: this.mlManager,
|
||||
abortSignal: this._globalAbortController.signal
|
||||
abortSignal: this._globalAbortController.signal,
|
||||
enableHWA
|
||||
});
|
||||
this.pdfViewer = pdfViewer;
|
||||
pdfRenderingQueue.setViewer(pdfViewer);
|
||||
|
@ -7661,7 +7664,8 @@ const PDFViewerApplication = {
|
|||
renderingQueue: pdfRenderingQueue,
|
||||
linkService: pdfLinkService,
|
||||
pageColors,
|
||||
abortSignal: this._globalAbortController.signal
|
||||
abortSignal: this._globalAbortController.signal,
|
||||
enableHWA
|
||||
});
|
||||
pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
|
||||
}
|
||||
|
@ -8000,15 +8004,12 @@ const PDFViewerApplication = {
|
|||
throw new Error("PDF document not downloaded.");
|
||||
},
|
||||
async download(options = {}) {
|
||||
const url = this._downloadUrl,
|
||||
filename = this._docFilename;
|
||||
let data;
|
||||
try {
|
||||
this._ensureDownloadComplete();
|
||||
const data = await this.pdfDocument.getData();
|
||||
this.downloadManager.download(data, url, filename, options);
|
||||
} catch {
|
||||
this.downloadManager.downloadUrl(url, filename, options);
|
||||
}
|
||||
data = await this.pdfDocument.getData();
|
||||
} catch {}
|
||||
this.downloadManager.download(data, this._downloadUrl, this._docFilename, options);
|
||||
},
|
||||
async save(options = {}) {
|
||||
if (this._saveInProgress) {
|
||||
|
@ -8016,12 +8017,10 @@ const PDFViewerApplication = {
|
|||
}
|
||||
this._saveInProgress = true;
|
||||
await this.pdfScriptingManager.dispatchWillSave();
|
||||
const url = this._downloadUrl,
|
||||
filename = this._docFilename;
|
||||
try {
|
||||
this._ensureDownloadComplete();
|
||||
const data = await this.pdfDocument.saveDocument();
|
||||
this.downloadManager.download(data, url, filename, options);
|
||||
this.downloadManager.download(data, this._downloadUrl, this._docFilename, options);
|
||||
} catch (reason) {
|
||||
console.error(`Error when saving the document: ${reason.message}`);
|
||||
await this.download(options);
|
||||
|
@ -8039,12 +8038,13 @@ const PDFViewerApplication = {
|
|||
});
|
||||
}
|
||||
},
|
||||
downloadOrSave(options = {}) {
|
||||
if (this.pdfDocument?.annotationStorage.size > 0) {
|
||||
this.save(options);
|
||||
} else {
|
||||
this.download(options);
|
||||
}
|
||||
async downloadOrSave(options = {}) {
|
||||
const {
|
||||
classList
|
||||
} = this.appConfig.appContainer;
|
||||
classList.add("wait");
|
||||
await (this.pdfDocument?.annotationStorage.size > 0 ? this.save(options) : this.download(options));
|
||||
classList.remove("wait");
|
||||
},
|
||||
async _documentError(key, moreInfo = null) {
|
||||
this._unblockDocumentLoadEvent();
|
||||
|
@ -9509,8 +9509,8 @@ function webViewerReportTelemetry({
|
|||
|
||||
|
||||
|
||||
const pdfjsVersion = "4.4.16";
|
||||
const pdfjsBuild = "593ce9683";
|
||||
const pdfjsVersion = "4.4.34";
|
||||
const pdfjsBuild = "e3caa3c6e";
|
||||
const AppConstants = null;
|
||||
window.PDFViewerApplication = PDFViewerApplication;
|
||||
window.PDFViewerApplicationConstants = AppConstants;
|
||||
|
|
|
@ -2679,6 +2679,15 @@ body{
|
|||
body{
|
||||
background-color:var(--body-bg-color);
|
||||
scrollbar-color:var(--scrollbar-color) var(--scrollbar-bg-color);
|
||||
|
||||
&.wait::before{
|
||||
content:"";
|
||||
position:fixed;
|
||||
width:100%;
|
||||
height:100%;
|
||||
z-index:100000;
|
||||
cursor:wait;
|
||||
}
|
||||
}
|
||||
|
||||
.hidden,
|
||||
|
|
|
@ -728,6 +728,10 @@ const defaultOptions = {
|
|||
value: "",
|
||||
kind: OptionKind.API
|
||||
},
|
||||
enableHWA: {
|
||||
value: false,
|
||||
kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE
|
||||
},
|
||||
enableXfa: {
|
||||
value: true,
|
||||
kind: OptionKind.API + OptionKind.PREFERENCE
|
||||
|
@ -1397,6 +1401,7 @@ class BasePreferences {
|
|||
disableFontFace: false,
|
||||
disableRange: false,
|
||||
disableStream: false,
|
||||
enableHWA: false,
|
||||
enableXfa: true
|
||||
});
|
||||
#prefs = Object.create(null);
|
||||
|
@ -1581,13 +1586,6 @@ class FirefoxCom {
|
|||
}
|
||||
class DownloadManager {
|
||||
#openBlobUrls = new WeakMap();
|
||||
downloadUrl(url, filename, options = {}) {
|
||||
FirefoxCom.request("download", {
|
||||
originalUrl: url,
|
||||
filename,
|
||||
options
|
||||
});
|
||||
}
|
||||
downloadData(data, filename, contentType) {
|
||||
const blobUrl = URL.createObjectURL(new Blob([data], {
|
||||
type: contentType
|
||||
|
@ -1627,9 +1625,9 @@ class DownloadManager {
|
|||
return false;
|
||||
}
|
||||
download(data, url, filename, options = {}) {
|
||||
const blobUrl = URL.createObjectURL(new Blob([data], {
|
||||
const blobUrl = data ? URL.createObjectURL(new Blob([data], {
|
||||
type: "application/pdf"
|
||||
}));
|
||||
})) : null;
|
||||
FirefoxCom.request("download", {
|
||||
blobUrl,
|
||||
originalUrl: url,
|
||||
|
@ -6254,7 +6252,8 @@ class PDFThumbnailView {
|
|||
optionalContentConfigPromise,
|
||||
linkService,
|
||||
renderingQueue,
|
||||
pageColors
|
||||
pageColors,
|
||||
enableHWA
|
||||
}) {
|
||||
this.id = id;
|
||||
this.renderingId = "thumbnail" + id;
|
||||
|
@ -6265,6 +6264,7 @@ class PDFThumbnailView {
|
|||
this.pdfPageRotate = defaultViewport.rotation;
|
||||
this._optionalContentConfigPromise = optionalContentConfigPromise || null;
|
||||
this.pageColors = pageColors || null;
|
||||
this.enableHWA = enableHWA || false;
|
||||
this.eventBus = eventBus;
|
||||
this.linkService = linkService;
|
||||
this.renderingQueue = renderingQueue;
|
||||
|
@ -6348,10 +6348,11 @@ class PDFThumbnailView {
|
|||
}
|
||||
this.resume = null;
|
||||
}
|
||||
#getPageDrawContext(upscaleFactor = 1) {
|
||||
#getPageDrawContext(upscaleFactor = 1, enableHWA = this.enableHWA) {
|
||||
const canvas = document.createElement("canvas");
|
||||
const ctx = canvas.getContext("2d", {
|
||||
alpha: false
|
||||
alpha: false,
|
||||
willReadFrequently: !enableHWA
|
||||
});
|
||||
const outputScale = new OutputScale();
|
||||
canvas.width = upscaleFactor * this.canvasWidth * outputScale.sx | 0;
|
||||
|
@ -6470,7 +6471,7 @@ class PDFThumbnailView {
|
|||
const {
|
||||
ctx,
|
||||
canvas
|
||||
} = this.#getPageDrawContext();
|
||||
} = this.#getPageDrawContext(1, true);
|
||||
if (img.width <= 2 * canvas.width) {
|
||||
ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height);
|
||||
return canvas;
|
||||
|
@ -6518,13 +6519,15 @@ class PDFThumbnailViewer {
|
|||
linkService,
|
||||
renderingQueue,
|
||||
pageColors,
|
||||
abortSignal
|
||||
abortSignal,
|
||||
enableHWA
|
||||
}) {
|
||||
this.container = container;
|
||||
this.eventBus = eventBus;
|
||||
this.linkService = linkService;
|
||||
this.renderingQueue = renderingQueue;
|
||||
this.pageColors = pageColors || null;
|
||||
this.enableHWA = enableHWA || false;
|
||||
this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this), abortSignal);
|
||||
this.#resetView();
|
||||
}
|
||||
|
@ -6646,7 +6649,8 @@ class PDFThumbnailViewer {
|
|||
optionalContentConfigPromise,
|
||||
linkService: this.linkService,
|
||||
renderingQueue: this.renderingQueue,
|
||||
pageColors: this.pageColors
|
||||
pageColors: this.pageColors,
|
||||
enableHWA: this.enableHWA
|
||||
});
|
||||
this._thumbnails.push(thumbnail);
|
||||
}
|
||||
|
@ -7475,13 +7479,6 @@ class TextLayerBuilder {
|
|||
this.div.tabIndex = 0;
|
||||
this.div.className = "textLayer";
|
||||
}
|
||||
#finishRendering() {
|
||||
this.#renderingDone = true;
|
||||
const endOfContent = document.createElement("div");
|
||||
endOfContent.className = "endOfContent";
|
||||
this.div.append(endOfContent);
|
||||
this.#bindMouse(endOfContent);
|
||||
}
|
||||
async render(viewport, textContentParams = null) {
|
||||
if (this.#renderingDone && this.#textLayer) {
|
||||
this.#textLayer.update({
|
||||
|
@ -7507,7 +7504,11 @@ class TextLayerBuilder {
|
|||
this.highlighter?.setTextMapping(textDivs, textContentItemsStr);
|
||||
this.accessibilityManager?.setTextMapping(textDivs);
|
||||
await this.#textLayer.render();
|
||||
this.#finishRendering();
|
||||
this.#renderingDone = true;
|
||||
const endOfContent = document.createElement("div");
|
||||
endOfContent.className = "endOfContent";
|
||||
this.div.append(endOfContent);
|
||||
this.#bindMouse(endOfContent);
|
||||
this.#onAppend?.(this.div);
|
||||
this.highlighter?.enable();
|
||||
this.accessibilityManager?.enable();
|
||||
|
@ -7618,6 +7619,7 @@ const DEFAULT_LAYER_PROPERTIES = null;
|
|||
const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]);
|
||||
class PDFPageView {
|
||||
#annotationMode = AnnotationMode.ENABLE_FORMS;
|
||||
#enableHWA = false;
|
||||
#hasRestrictedScaling = false;
|
||||
#layerProperties = null;
|
||||
#loadingId = null;
|
||||
|
@ -7650,6 +7652,7 @@ class PDFPageView {
|
|||
this.imageResourcesPath = options.imageResourcesPath || "";
|
||||
this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels");
|
||||
this.pageColors = options.pageColors || null;
|
||||
this.#enableHWA = options.enableHWA || false;
|
||||
this.eventBus = options.eventBus;
|
||||
this.renderingQueue = options.renderingQueue;
|
||||
this.l10n = options.l10n;
|
||||
|
@ -8231,7 +8234,8 @@ class PDFPageView {
|
|||
canvasWrapper.append(canvas);
|
||||
this.canvas = canvas;
|
||||
const ctx = canvas.getContext("2d", {
|
||||
alpha: false
|
||||
alpha: false,
|
||||
willReadFrequently: !this.#enableHWA
|
||||
});
|
||||
const outputScale = this.outputScale = new OutputScale();
|
||||
if (this.maxCanvasPixels > 0) {
|
||||
|
@ -8420,6 +8424,7 @@ class PDFViewer {
|
|||
#annotationEditorUIManager = null;
|
||||
#annotationMode = AnnotationMode.ENABLE_FORMS;
|
||||
#containerTopLeft = null;
|
||||
#enableHWA = false;
|
||||
#enableHighlightFloatingButton = false;
|
||||
#enablePermissions = false;
|
||||
#eventAbortController = null;
|
||||
|
@ -8433,7 +8438,7 @@ class PDFViewer {
|
|||
#scaleTimeoutId = null;
|
||||
#textLayerMode = TextLayerMode.ENABLE;
|
||||
constructor(options) {
|
||||
const viewerVersion = "4.4.16";
|
||||
const viewerVersion = "4.4.34";
|
||||
if (version !== viewerVersion) {
|
||||
throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`);
|
||||
}
|
||||
|
@ -8461,6 +8466,7 @@ class PDFViewer {
|
|||
this.#enablePermissions = options.enablePermissions || false;
|
||||
this.pageColors = options.pageColors || null;
|
||||
this.#mlManager = options.mlManager || null;
|
||||
this.#enableHWA = options.enableHWA || false;
|
||||
this.defaultRenderingQueue = !options.renderingQueue;
|
||||
this.renderingQueue = options.renderingQueue;
|
||||
const {
|
||||
|
@ -8878,7 +8884,8 @@ class PDFViewer {
|
|||
maxCanvasPixels: this.maxCanvasPixels,
|
||||
pageColors,
|
||||
l10n: this.l10n,
|
||||
layerProperties: this._layerProperties
|
||||
layerProperties: this._layerProperties,
|
||||
enableHWA: this.#enableHWA
|
||||
});
|
||||
this._pages.push(pageView);
|
||||
}
|
||||
|
@ -10684,6 +10691,7 @@ const PDFViewerApplication = {
|
|||
foreground: AppOptions.get("pageColorsForeground")
|
||||
} : null;
|
||||
const altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, this.overlayManager, eventBus) : null;
|
||||
const enableHWA = AppOptions.get("enableHWA");
|
||||
const pdfViewer = new PDFViewer({
|
||||
container,
|
||||
viewer,
|
||||
|
@ -10706,7 +10714,8 @@ const PDFViewerApplication = {
|
|||
enablePermissions: AppOptions.get("enablePermissions"),
|
||||
pageColors,
|
||||
mlManager: this.mlManager,
|
||||
abortSignal: this._globalAbortController.signal
|
||||
abortSignal: this._globalAbortController.signal,
|
||||
enableHWA
|
||||
});
|
||||
this.pdfViewer = pdfViewer;
|
||||
pdfRenderingQueue.setViewer(pdfViewer);
|
||||
|
@ -10719,7 +10728,8 @@ const PDFViewerApplication = {
|
|||
renderingQueue: pdfRenderingQueue,
|
||||
linkService: pdfLinkService,
|
||||
pageColors,
|
||||
abortSignal: this._globalAbortController.signal
|
||||
abortSignal: this._globalAbortController.signal,
|
||||
enableHWA
|
||||
});
|
||||
pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
|
||||
}
|
||||
|
@ -11057,15 +11067,12 @@ const PDFViewerApplication = {
|
|||
throw new Error("PDF document not downloaded.");
|
||||
},
|
||||
async download(options = {}) {
|
||||
const url = this._downloadUrl,
|
||||
filename = this._docFilename;
|
||||
let data;
|
||||
try {
|
||||
this._ensureDownloadComplete();
|
||||
const data = await this.pdfDocument.getData();
|
||||
this.downloadManager.download(data, url, filename, options);
|
||||
} catch {
|
||||
this.downloadManager.downloadUrl(url, filename, options);
|
||||
}
|
||||
data = await this.pdfDocument.getData();
|
||||
} catch {}
|
||||
this.downloadManager.download(data, this._downloadUrl, this._docFilename, options);
|
||||
},
|
||||
async save(options = {}) {
|
||||
if (this._saveInProgress) {
|
||||
|
@ -11073,12 +11080,10 @@ const PDFViewerApplication = {
|
|||
}
|
||||
this._saveInProgress = true;
|
||||
await this.pdfScriptingManager.dispatchWillSave();
|
||||
const url = this._downloadUrl,
|
||||
filename = this._docFilename;
|
||||
try {
|
||||
this._ensureDownloadComplete();
|
||||
const data = await this.pdfDocument.saveDocument();
|
||||
this.downloadManager.download(data, url, filename, options);
|
||||
this.downloadManager.download(data, this._downloadUrl, this._docFilename, options);
|
||||
} catch (reason) {
|
||||
console.error(`Error when saving the document: ${reason.message}`);
|
||||
await this.download(options);
|
||||
|
@ -11096,12 +11101,13 @@ const PDFViewerApplication = {
|
|||
});
|
||||
}
|
||||
},
|
||||
downloadOrSave(options = {}) {
|
||||
if (this.pdfDocument?.annotationStorage.size > 0) {
|
||||
this.save(options);
|
||||
} else {
|
||||
this.download(options);
|
||||
}
|
||||
async downloadOrSave(options = {}) {
|
||||
const {
|
||||
classList
|
||||
} = this.appConfig.appContainer;
|
||||
classList.add("wait");
|
||||
await (this.pdfDocument?.annotationStorage.size > 0 ? this.save(options) : this.download(options));
|
||||
classList.remove("wait");
|
||||
},
|
||||
async _documentError(key, moreInfo = null) {
|
||||
this._unblockDocumentLoadEvent();
|
||||
|
@ -12599,8 +12605,8 @@ function webViewerReportTelemetry({
|
|||
|
||||
|
||||
|
||||
const pdfjsVersion = "4.4.16";
|
||||
const pdfjsBuild = "593ce9683";
|
||||
const pdfjsVersion = "4.4.34";
|
||||
const pdfjsBuild = "e3caa3c6e";
|
||||
const AppConstants = null;
|
||||
window.PDFViewerApplication = PDFViewerApplication;
|
||||
window.PDFViewerApplicationConstants = AppConstants;
|
||||
|
|
|
@ -20,8 +20,8 @@ origin:
|
|||
|
||||
# Human-readable identifier for this version/release
|
||||
# Generally "version NNN", "tag SSS", "bookmark SSS"
|
||||
release: 593ce96834af099cc5c3af0925c5ee6a5cb3b75c (2024-06-07T12:14:48Z).
|
||||
revision: 593ce96834af099cc5c3af0925c5ee6a5cb3b75c
|
||||
release: e3caa3c6eeda90099dd03b451b6b4788746455b3 (2024-06-14T08:48:18Z).
|
||||
revision: e3caa3c6eeda90099dd03b451b6b4788746455b3
|
||||
|
||||
# The package's license, where possible using the mnemonic from
|
||||
# https://spdx.org/licenses/
|
||||
|
|
|
@ -1248,6 +1248,16 @@ export class SearchEngine {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the order hint for this engine. This is determined from the search
|
||||
* configuration when the engine is initialized.
|
||||
*
|
||||
* @type {number}
|
||||
*/
|
||||
get orderHint() {
|
||||
return this._orderHint;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the user-defined alias.
|
||||
*
|
||||
|
|
|
@ -422,9 +422,11 @@ export class SearchService {
|
|||
async getAppProvidedEngines() {
|
||||
await this.init();
|
||||
|
||||
return this._sortEnginesByDefaults(
|
||||
this.#sortedEngines.filter(e => e.isAppProvided)
|
||||
);
|
||||
return lazy.SearchUtils.sortEnginesByDefaults({
|
||||
engines: this.#sortedEngines.filter(e => e.isAppProvided),
|
||||
appDefaultEngine: this.appDefaultEngine,
|
||||
appPrivateDefaultEngine: this.appPrivateDefaultEngine,
|
||||
});
|
||||
}
|
||||
|
||||
async getEnginesByExtensionID(extensionID) {
|
||||
|
@ -2742,70 +2744,11 @@ export class SearchService {
|
|||
}
|
||||
lazy.logConsole.debug("#buildSortedEngineList: using default orders");
|
||||
|
||||
return (this._cachedSortedEngines = this._sortEnginesByDefaults(
|
||||
Array.from(this._engines.values())
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts engines by the default settings (prefs, configuration values).
|
||||
*
|
||||
* @param {Array} engines
|
||||
* An array of engine objects to sort.
|
||||
* @returns {Array}
|
||||
* The sorted array of engine objects.
|
||||
*
|
||||
* This is a private method with _ rather than # because it is
|
||||
* called in a test.
|
||||
*/
|
||||
_sortEnginesByDefaults(engines) {
|
||||
const sortedEngines = [];
|
||||
const addedEngines = new Set();
|
||||
|
||||
function maybeAddEngineToSort(engine) {
|
||||
if (!engine || addedEngines.has(engine.name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
sortedEngines.push(engine);
|
||||
addedEngines.add(engine.name);
|
||||
}
|
||||
|
||||
// The app default engine should always be first in the list (except
|
||||
// for distros, that we should respect).
|
||||
const appDefault = this.appDefaultEngine;
|
||||
maybeAddEngineToSort(appDefault);
|
||||
|
||||
// If there's a private default, and it is different to the normal
|
||||
// default, then it should be second in the list.
|
||||
const appPrivateDefault = this.appPrivateDefaultEngine;
|
||||
if (appPrivateDefault && appPrivateDefault != appDefault) {
|
||||
maybeAddEngineToSort(appPrivateDefault);
|
||||
}
|
||||
|
||||
let remainingEngines;
|
||||
const collator = new Intl.Collator();
|
||||
|
||||
remainingEngines = engines.filter(e => !addedEngines.has(e.name));
|
||||
|
||||
// We sort by highest orderHint first, then alphabetically by name.
|
||||
remainingEngines.sort((a, b) => {
|
||||
if (a._orderHint && b._orderHint) {
|
||||
if (a._orderHint == b._orderHint) {
|
||||
return collator.compare(a.name, b.name);
|
||||
}
|
||||
return b._orderHint - a._orderHint;
|
||||
}
|
||||
if (a._orderHint) {
|
||||
return -1;
|
||||
}
|
||||
if (b._orderHint) {
|
||||
return 1;
|
||||
}
|
||||
return collator.compare(a.name, b.name);
|
||||
});
|
||||
|
||||
return [...sortedEngines, ...remainingEngines];
|
||||
return (this._cachedSortedEngines = lazy.SearchUtils.sortEnginesByDefaults({
|
||||
engines: Array.from(this._engines.values()),
|
||||
appDefaultEngine: this.appDefaultEngine,
|
||||
appPrivateDefaultEngine: this.appPrivateDefaultEngine,
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2813,7 +2756,6 @@ export class SearchService {
|
|||
*
|
||||
* @returns {Array<SearchEngine>}
|
||||
*/
|
||||
|
||||
get #sortedVisibleEngines() {
|
||||
return this.#sortedEngines.filter(engine => !engine.hidden);
|
||||
}
|
||||
|
|
|
@ -426,6 +426,86 @@ export var SearchUtils = {
|
|||
uri.host.toLowerCase().endsWith(".onion")
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Sorts engines by the default settings. The sort order is:
|
||||
*
|
||||
* Application Default Engine
|
||||
* Application Private Default Engine (if specified)
|
||||
* Engines sorted by orderHint (if specified)
|
||||
* Remaining engines in alphabetical order by locale.
|
||||
*
|
||||
* This is implemented here as it is used in searchengine-devtools as well as
|
||||
* the search service.
|
||||
*
|
||||
* @param {object} options
|
||||
* The options for this function.
|
||||
* @param {object[]} options.engines
|
||||
* An array of engine objects to sort. These should have the `name` and
|
||||
* `orderHint` fields as top-level properties.
|
||||
* @param {object} options.appDefaultEngine
|
||||
* The application default engine.
|
||||
* @param {object} [options.appPrivateDefaultEngine]
|
||||
* The application private default engine, if any.
|
||||
* @param {string} [options.locale]
|
||||
* The current application locale, or the locale to use for the sorting.
|
||||
* @returns {object[]}
|
||||
* The sorted array of engine objects.
|
||||
*/
|
||||
sortEnginesByDefaults({
|
||||
engines,
|
||||
appDefaultEngine,
|
||||
appPrivateDefaultEngine,
|
||||
locale = Services.locale.appLocaleAsBCP47,
|
||||
}) {
|
||||
const sortedEngines = [];
|
||||
const addedEngines = new Set();
|
||||
|
||||
function maybeAddEngineToSort(engine) {
|
||||
if (!engine || addedEngines.has(engine.name)) {
|
||||
return;
|
||||
}
|
||||
|
||||
sortedEngines.push(engine);
|
||||
addedEngines.add(engine.name);
|
||||
}
|
||||
|
||||
// The app default engine should always be first in the list (except
|
||||
// for distros, that we should respect).
|
||||
const appDefault = appDefaultEngine;
|
||||
maybeAddEngineToSort(appDefault);
|
||||
|
||||
// If there's a private default, and it is different to the normal
|
||||
// default, then it should be second in the list.
|
||||
const appPrivateDefault = appPrivateDefaultEngine;
|
||||
if (appPrivateDefault && appPrivateDefault != appDefault) {
|
||||
maybeAddEngineToSort(appPrivateDefault);
|
||||
}
|
||||
|
||||
let remainingEngines;
|
||||
const collator = new Intl.Collator(locale);
|
||||
|
||||
remainingEngines = engines.filter(e => !addedEngines.has(e.name));
|
||||
|
||||
// We sort by highest orderHint first, then alphabetically by name.
|
||||
remainingEngines.sort((a, b) => {
|
||||
if (a._orderHint && b.orderHint) {
|
||||
if (a._orderHint == b.orderHint) {
|
||||
return collator.compare(a.name, b.name);
|
||||
}
|
||||
return b.orderHint - a.orderHint;
|
||||
}
|
||||
if (a.orderHint) {
|
||||
return -1;
|
||||
}
|
||||
if (b.orderHint) {
|
||||
return 1;
|
||||
}
|
||||
return collator.compare(a.name, b.name);
|
||||
});
|
||||
|
||||
return [...sortedEngines, ...remainingEngines];
|
||||
},
|
||||
};
|
||||
|
||||
XPCOMUtils.defineLazyPreferenceGetter(
|
||||
|
|
|
@ -3,10 +3,6 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
ChromeUtils.defineESModuleGetters(this, {
|
||||
SearchService: "resource://gre/modules/SearchService.sys.mjs",
|
||||
});
|
||||
|
||||
const tests = [];
|
||||
|
||||
for (let canonicalId of ["canonical", "canonical-001"]) {
|
||||
|
@ -237,7 +233,7 @@ tests.push({
|
|||
});
|
||||
|
||||
function hasURLs(engines, engineName, url, suggestURL) {
|
||||
let engine = engines.find(e => e._name === engineName);
|
||||
let engine = engines.find(e => e.name === engineName);
|
||||
Assert.ok(engine, `Should be able to find ${engineName}`);
|
||||
|
||||
let submission = engine.getSubmission("test", "text/html");
|
||||
|
@ -256,7 +252,7 @@ function hasURLs(engines, engineName, url, suggestURL) {
|
|||
}
|
||||
|
||||
function hasParams(engines, engineName, purpose, param) {
|
||||
let engine = engines.find(e => e._name === engineName);
|
||||
let engine = engines.find(e => e.name === engineName);
|
||||
Assert.ok(engine, `Should be able to find ${engineName}`);
|
||||
|
||||
let submission = engine.getSubmission("test", "text/html", purpose);
|
||||
|
@ -278,7 +274,7 @@ function hasParams(engines, engineName, purpose, param) {
|
|||
}
|
||||
|
||||
function hasTelemetryId(engines, engineName, telemetryId) {
|
||||
let engine = engines.find(e => e._name === engineName);
|
||||
let engine = engines.find(e => e.name === engineName);
|
||||
Assert.ok(engine, `Should be able to find ${engineName}`);
|
||||
|
||||
Assert.equal(
|
||||
|
@ -328,21 +324,18 @@ add_setup(async function () {
|
|||
});
|
||||
|
||||
add_task(async function test_expected_distribution_engines() {
|
||||
let searchService = new SearchService();
|
||||
for (const { distribution, locale = "en-US", region = "US", test } of tests) {
|
||||
let config = await engineSelector.fetchEngineConfiguration({
|
||||
locale,
|
||||
region,
|
||||
distroID: distribution,
|
||||
});
|
||||
|
||||
let engines = await SearchTestUtils.searchConfigToEngines(config.engines);
|
||||
searchService._engines = engines;
|
||||
searchService._searchDefault = {
|
||||
id: config.engines[0].webExtension.id,
|
||||
locale:
|
||||
config.engines[0]?.webExtension?.locale ?? SearchUtils.DEFAULT_TAG,
|
||||
};
|
||||
engines = searchService._sortEnginesByDefaults(engines);
|
||||
engines = SearchUtils.sortEnginesByDefaults({
|
||||
engines,
|
||||
appDefaultEngine: engines[0],
|
||||
});
|
||||
test(engines);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -2414,9 +2414,12 @@ export class TranslationsParent extends JSWindowActorParent {
|
|||
* is supported when translating to that language.
|
||||
*/
|
||||
static async getTopPreferredSupportedToLang() {
|
||||
return TranslationsParent.getPreferredLanguages().find(
|
||||
async langTag => await TranslationsParent.isSupportedAsToLang(langTag)
|
||||
);
|
||||
for (const langTag of TranslationsParent.getPreferredLanguages()) {
|
||||
if (await TranslationsParent.isSupportedAsToLang(langTag)) {
|
||||
return langTag;
|
||||
}
|
||||
}
|
||||
return PIVOT_LANGUAGE;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -117,6 +117,59 @@ add_task(async function test_language_support_checks() {
|
|||
);
|
||||
}
|
||||
|
||||
await usingAppLocale("en", async () => {
|
||||
const expected = "en";
|
||||
const actual = await TranslationsParent.getTopPreferredSupportedToLang();
|
||||
is(
|
||||
actual,
|
||||
expected,
|
||||
"The top supported to-language should match the expected language tag"
|
||||
);
|
||||
});
|
||||
|
||||
await usingAppLocale("es", async () => {
|
||||
const expected = "es";
|
||||
const actual = await TranslationsParent.getTopPreferredSupportedToLang();
|
||||
is(
|
||||
actual,
|
||||
expected,
|
||||
"The top supported to-language should match the expected language tag"
|
||||
);
|
||||
});
|
||||
|
||||
// Only supported as a source language
|
||||
await usingAppLocale("fi", async () => {
|
||||
const expected = "en";
|
||||
const actual = await TranslationsParent.getTopPreferredSupportedToLang();
|
||||
is(
|
||||
actual,
|
||||
expected,
|
||||
"The top supported to-language should match the expected language tag"
|
||||
);
|
||||
});
|
||||
|
||||
// Only supported as a target language
|
||||
await usingAppLocale("sl", async () => {
|
||||
const expected = "sl";
|
||||
const actual = await TranslationsParent.getTopPreferredSupportedToLang();
|
||||
is(
|
||||
actual,
|
||||
expected,
|
||||
"The top supported to-language should match the expected language tag"
|
||||
);
|
||||
});
|
||||
|
||||
// Not supported as a source language or a target language.
|
||||
await usingAppLocale("ja", async () => {
|
||||
const expected = "en";
|
||||
const actual = await TranslationsParent.getTopPreferredSupportedToLang();
|
||||
is(
|
||||
actual,
|
||||
expected,
|
||||
"The top supported to-language should match the expected language tag"
|
||||
);
|
||||
});
|
||||
|
||||
await cleanup();
|
||||
});
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
</box>
|
||||
<spacer part="overflow-end-indicator"/>
|
||||
<toolbarbutton id="scrollbutton-down" part="scrollbutton-down" keyNav="false" data-l10n-id="overflow-scroll-button-forwards"/>
|
||||
`;
|
||||
`;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
|
@ -131,6 +131,8 @@
|
|||
}
|
||||
|
||||
connectedCallback() {
|
||||
this.removeAttribute("overflowing");
|
||||
|
||||
if (this.hasConnected) {
|
||||
return;
|
||||
}
|
||||
|
@ -145,7 +147,6 @@
|
|||
);
|
||||
}
|
||||
|
||||
this.removeAttribute("overflowing");
|
||||
this.initializeAttributeInheritance();
|
||||
this._updateScrollButtonsDisabledState();
|
||||
}
|
||||
|
|
|
@ -26,6 +26,38 @@ project_flag(
|
|||
help='used for application.ini\'s "Vendor" field, which also impacts profile location and user-visible fields',
|
||||
)
|
||||
|
||||
project_flag(
|
||||
env="MOZ_DEVTOOLS",
|
||||
default="server",
|
||||
choices=("all", "server"),
|
||||
nargs=1,
|
||||
help="which devtools version should be built",
|
||||
)
|
||||
|
||||
project_flag(
|
||||
env="MOZ_PROFILE_MIGRATOR",
|
||||
help="enable profile migrator",
|
||||
)
|
||||
|
||||
project_flag(
|
||||
env="BROWSER_CHROME_URL",
|
||||
default="",
|
||||
nargs=1,
|
||||
set_as_define=True,
|
||||
help="markup for a single browser window",
|
||||
)
|
||||
set_define(
|
||||
"BROWSER_CHROME_URL_QUOTED",
|
||||
depends("BROWSER_CHROME_URL")(lambda v: f'"{v[0]}"' if v else ""),
|
||||
)
|
||||
|
||||
# External builds (specifically Ubuntu) may drop the hg repo information, so we allow to
|
||||
# explicitly set the repository and changeset information in.
|
||||
option(env="MOZ_SOURCE_REPO", nargs=1, help="project source repository")
|
||||
set_config("MOZ_SOURCE_REPO", depends_if("MOZ_SOURCE_REPO")(lambda src: src[0]))
|
||||
option(env="MOZ_SOURCE_CHANGESET", nargs=1, help="source changeset")
|
||||
set_config("MOZ_SOURCE_CHANGESET", depends_if("MOZ_SOURCE_CHANGESET")(lambda v: v[0]))
|
||||
|
||||
|
||||
@depends("MOZ_APP_VENDOR", build_project)
|
||||
def check_moz_app_vendor(moz_app_vendor, build_project):
|
||||
|
|
|
@ -55,7 +55,6 @@ class MOZ_STACK_CLASS nsPropertiesParser {
|
|||
mUnicodeValue(u'\0'),
|
||||
mHaveMultiLine(false),
|
||||
mMultiLineCanSkipN(false),
|
||||
mMinLength(0),
|
||||
mState(eParserState_AwaitingKey),
|
||||
mSpecialState(eParserSpecial_None),
|
||||
mProps(aProps) {}
|
||||
|
@ -63,19 +62,6 @@ class MOZ_STACK_CLASS nsPropertiesParser {
|
|||
void FinishValueState(nsAString& aOldValue) {
|
||||
static const char trimThese[] = " \t";
|
||||
mKey.Trim(trimThese, false, true);
|
||||
|
||||
// This is really ugly hack but it should be fast
|
||||
char16_t backup_char;
|
||||
uint32_t minLength = mMinLength;
|
||||
if (minLength) {
|
||||
backup_char = mValue[minLength - 1];
|
||||
mValue.SetCharAt('x', minLength - 1);
|
||||
}
|
||||
mValue.Trim(trimThese, false, true);
|
||||
if (minLength) {
|
||||
mValue.SetCharAt(backup_char, minLength - 1);
|
||||
}
|
||||
|
||||
mProps->SetStringProperty(NS_ConvertUTF16toUTF8(mKey), mValue, aOldValue);
|
||||
mSpecialState = eParserSpecial_None;
|
||||
WaitForKey();
|
||||
|
@ -112,7 +98,6 @@ class MOZ_STACK_CLASS nsPropertiesParser {
|
|||
|
||||
void EnterValueState() {
|
||||
mValue.Truncate();
|
||||
mMinLength = 0;
|
||||
mState = eParserState_Value;
|
||||
mSpecialState = eParserSpecial_None;
|
||||
}
|
||||
|
@ -132,8 +117,6 @@ class MOZ_STACK_CLASS nsPropertiesParser {
|
|||
// - any sequence above followed by any
|
||||
// combination of ' ' and '\t'
|
||||
bool mMultiLineCanSkipN; // TRUE if "\\\r" was detected
|
||||
uint32_t mMinLength; // limit right trimming at the end to not trim
|
||||
// escaped whitespaces
|
||||
EParserState mState;
|
||||
// if we see a '\' then we enter this special state
|
||||
EParserSpecial mSpecialState;
|
||||
|
@ -222,15 +205,12 @@ bool nsPropertiesParser::ParseValueCharacter(char16_t aChar,
|
|||
// the easy characters - \t, \n, and so forth
|
||||
case 't':
|
||||
mValue += char16_t('\t');
|
||||
mMinLength = mValue.Length();
|
||||
break;
|
||||
case 'n':
|
||||
mValue += char16_t('\n');
|
||||
mMinLength = mValue.Length();
|
||||
break;
|
||||
case 'r':
|
||||
mValue += char16_t('\r');
|
||||
mMinLength = mValue.Length();
|
||||
break;
|
||||
case '\\':
|
||||
mValue += char16_t('\\');
|
||||
|
@ -271,7 +251,6 @@ bool nsPropertiesParser::ParseValueCharacter(char16_t aChar,
|
|||
} else {
|
||||
// non-hex character. Append what we have, and move on.
|
||||
mValue += mUnicodeValue;
|
||||
mMinLength = mValue.Length();
|
||||
mSpecialState = eParserSpecial_None;
|
||||
|
||||
// leave aTokenStart at this unknown character, so it gets appended
|
||||
|
@ -285,7 +264,6 @@ bool nsPropertiesParser::ParseValueCharacter(char16_t aChar,
|
|||
aTokenStart = aCur + 1;
|
||||
mSpecialState = eParserSpecial_None;
|
||||
mValue += mUnicodeValue;
|
||||
mMinLength = mValue.Length();
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -436,8 +414,7 @@ nsPersistentProperties::Load(nsIInputStream* aIn) {
|
|||
// the bug121341.properties test file accordingly.
|
||||
while (NS_SUCCEEDED(rv = mIn->ReadSegments(nsPropertiesParser::SegmentWriter,
|
||||
&parser, 4096, &nProcessed)) &&
|
||||
nProcessed != 0)
|
||||
;
|
||||
nProcessed != 0);
|
||||
mIn = nullptr;
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
|
|
|
@ -19,7 +19,7 @@ function run_test() {
|
|||
Assert.equal(value, "abc");
|
||||
|
||||
value = properties.getStringProperty("2");
|
||||
Assert.equal(value, "xy");
|
||||
Assert.equal(value, "xy\t");
|
||||
|
||||
value = properties.getStringProperty("3");
|
||||
Assert.equal(value, "\u1234\t\r\n\u00AB\u0001\n");
|
||||
|
@ -37,10 +37,10 @@ function run_test() {
|
|||
Assert.equal(value, "yet another multiline propery");
|
||||
|
||||
value = properties.getStringProperty("8");
|
||||
Assert.equal(value, "\ttest5\u0020");
|
||||
Assert.equal(value, "\ttest5 \t");
|
||||
|
||||
value = properties.getStringProperty("9");
|
||||
Assert.equal(value, " test6\t");
|
||||
Assert.equal(value, " test6\t\t ");
|
||||
|
||||
value = properties.getStringProperty("10a\u1234b");
|
||||
Assert.equal(value, "c\uCDEFd");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue