Backed out 11 changesets (bug 1878554, bug 1878553, bug 1878556) for causing node failures in aboutwelcome CLOSED TREE

Backed out changeset 425f70fa7e5a (bug 1878556)
Backed out changeset 2ab3a28f5c04 (bug 1878556)
Backed out changeset fb2e02682c8c (bug 1878556)
Backed out changeset 2fc5e630568e (bug 1878554)
Backed out changeset 78839d5841b4 (bug 1878554)
Backed out changeset e0ab31d2de1b (bug 1878554)
Backed out changeset 4eb59e4ebafa (bug 1878554)
Backed out changeset ab1e077d3f84 (bug 1878554)
Backed out changeset ef999f293e3e (bug 1878553)
Backed out changeset cf49920cb1ad (bug 1878553)
Backed out changeset 95f0fce63726 (bug 1878553)
This commit is contained in:
Cristian Tuns 2024-02-07 01:26:39 -05:00
Родитель 2d66624de2
Коммит 77f2a39423
35 изменённых файлов: 270 добавлений и 142 удалений

Просмотреть файл

@ -68,15 +68,10 @@ module.exports = {
plugins: ["mozilla", "import", "json"],
overrides: [
{
files: [
// All .eslintrc.js files are in the node environment, so turn that
// on here.
// https://github.com/eslint/eslint/issues/13008
".eslintrc.js",
// *.config.js files are generally assumed to be configuration files
// based for node.
"*.config.?(m)js",
],
// All .eslintrc.js files are in the node environment, so turn that
// on here.
// https://github.com/eslint/eslint/issues/13008
files: [".eslintrc.js"],
env: {
node: true,
browser: false,

Просмотреть файл

@ -4,6 +4,11 @@
module.exports = {
// When adding items to this file please check for effects on sub-directories.
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
plugins: ["import", "react", "jsx-a11y"],
settings: {
react: {
@ -13,9 +18,8 @@ module.exports = {
extends: ["plugin:jsx-a11y/recommended"],
overrides: [
{
// TODO: Bug 1773467 - Move these to .mjs or figure out a generic way
// to identify these as modules.
files: ["tests/unit/**/*.js"],
// Only mark the files as modules which are actually modules.
files: ["content-src/**", "tests/unit/**"],
parserOptions: {
sourceType: "module",
},
@ -38,7 +42,7 @@ module.exports = {
},
},
{
files: ["content-src/**", "tests/unit/**"],
files: ["./*.js", "content-src/**", "tests/unit/**"],
env: {
node: true,
},
@ -56,6 +60,8 @@ module.exports = {
rules: {
// Disallow commonjs in these directories.
"import/no-commonjs": 2,
// Allow JSX with arrow functions.
"react/jsx-no-bind": 0,
},
},
{
@ -76,6 +82,7 @@ module.exports = {
rules: {
"func-name-matching": 0,
"lines-between-class-members": 0,
"require-await": 0,
},
},
],
@ -84,10 +91,7 @@ module.exports = {
"react/jsx-boolean-value": ["error", "always"],
"react/jsx-key": "error",
"react/jsx-no-bind": [
"error",
{ allowArrowFunctions: true, allowFunctions: true },
],
"react/jsx-no-bind": "error",
"react/jsx-no-comment-textnodes": "error",
"react/jsx-no-duplicate-props": "error",
"react/jsx-no-target-blank": "error",
@ -123,15 +127,20 @@ module.exports = {
"block-scoped-var": "error",
"consistent-this": ["error", "use-bind"],
eqeqeq: "error",
"for-direction": "error",
"func-name-matching": "error",
"getter-return": "error",
"guard-for-in": "error",
"handle-callback-err": "error",
"lines-between-class-members": "error",
"max-depth": ["error", 4],
"max-nested-callbacks": ["error", 4],
"max-params": ["error", 6],
"max-statements": ["error", 50],
"max-statements-per-line": ["error", { max: 2 }],
"new-cap": ["error", { newIsCap: true, capIsNew: false }],
"no-alert": "error",
"no-buffer-constructor": "error",
"no-console": ["error", { allow: ["error"] }],
"no-div-regex": "error",
"no-duplicate-imports": "error",
@ -141,12 +150,16 @@ module.exports = {
"no-implicit-coercion": ["error", { allow: ["!!"] }],
"no-implicit-globals": "error",
"no-loop-func": "error",
"no-mixed-requires": "error",
"no-multi-assign": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-require": "error",
"no-octal-escape": "error",
"no-param-reassign": "error",
"no-path-concat": "error",
"no-process-exit": "error",
"no-proto": "error",
"no-prototype-builtins": "error",
"no-return-assign": ["error", "except-parens"],
@ -177,6 +190,7 @@ module.exports = {
"prefer-spread": "error",
"prefer-template": "error",
radix: ["error", "always"],
"require-await": "error",
"sort-vars": "error",
"symbol-description": "error",
"vars-on-top": "error",

Просмотреть файл

@ -4,7 +4,7 @@
import React from "react";
import ReactDOM from "react-dom";
import { AboutWelcomeUtils } from "./lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "./lib/aboutwelcome-utils";
import { MultiStageAboutWelcome } from "./components/MultiStageAboutWelcome";
import { ReturnToAMO } from "./components/ReturnToAMO";

Просмотреть файл

@ -3,7 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
import React from "react";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
import { Localized } from "./MSLocalized";
export const AddonsPicker = props => {

Просмотреть файл

@ -4,7 +4,7 @@
import React from "react";
import { Localized } from "./MSLocalized";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
const MS_STRING_PROP = "string_id";
export const HelpText = props => {

Просмотреть файл

@ -3,7 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
import React from "react";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
export const HeroImage = props => {
const { height, url, alt } = props;

Просмотреть файл

@ -4,7 +4,7 @@
import React, { useState, useEffect } from "react";
import { Localized } from "./MSLocalized";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
/**
* The language switcher implements a hook that should be placed at a higher level

Просмотреть файл

@ -4,7 +4,7 @@
import React from "react";
import { Localized } from "./MSLocalized";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
export const MarketplaceButtons = props => {
return (

Просмотреть файл

@ -4,11 +4,14 @@
import React, { useState, useEffect, useRef } from "react";
import { Localized } from "./MSLocalized";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
import { MultiStageProtonScreen } from "./MultiStageProtonScreen";
import { useLanguageSwitcher } from "./LanguageSwitcher";
import { SubmenuButton } from "./SubmenuButton";
import { BASE_PARAMS, addUtmParams } from "../lib/addUtmParams.mjs";
import {
BASE_PARAMS,
addUtmParams,
} from "asrouter/content-src/templates/FirstRun/addUtmParams";
// Amount of milliseconds for all transitions to complete (including delays).
const TRANSITION_OUT_TIME = 1000;

Просмотреть файл

@ -4,7 +4,7 @@
import React, { useEffect, useState } from "react";
import { Localized } from "./MSLocalized";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils";
import { MobileDownloads } from "./MobileDownloads";
import { MultiSelect } from "./MultiSelect";
import { Themes } from "./Themes";

Просмотреть файл

@ -6,9 +6,9 @@ import React from "react";
import {
AboutWelcomeUtils,
DEFAULT_RTAMO_CONTENT,
} from "../lib/aboutwelcome-utils.mjs";
} from "../lib/aboutwelcome-utils";
import { MultiStageProtonScreen } from "./MultiStageProtonScreen";
import { BASE_PARAMS } from "../lib/addUtmParams.mjs";
import { BASE_PARAMS } from "asrouter/content-src/templates/FirstRun/addUtmParams";
export class ReturnToAMO extends React.PureComponent {
constructor(props) {

Просмотреть файл

@ -21,7 +21,7 @@ module.exports = ReactDOM;
/***/ }),
/* 3 */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
@ -35,11 +35,7 @@ __webpack_require__.r(__webpack_exports__);
// If the container has a "page" data attribute, then this is
// a Spotlight modal or Feature Callout. Otherwise, this is
// about:welcome and we should return the current page.
const page =
document.querySelector(
"#multi-stage-message-root.onboardingContainer[data-page]"
)?.dataset.page || document.location.href;
const page = document.querySelector("#multi-stage-message-root.onboardingContainer[data-page]")?.dataset.page || document.location.href;
const AboutWelcomeUtils = {
handleUserAction(action) {
return window.AWSendToParent("SPECIAL_ACTION", action);
@ -49,9 +45,9 @@ const AboutWelcomeUtils = {
event: "IMPRESSION",
event_context: {
...context,
page,
page
},
message_id: messageId,
message_id: messageId
});
},
sendActionTelemetry(messageId, elementId, eventName = "CLICK_BUTTON") {
@ -59,9 +55,9 @@ const AboutWelcomeUtils = {
event: eventName,
event_context: {
source: elementId,
page,
page
},
message_id: messageId,
message_id: messageId
};
window.AWSendEventTelemetry?.(ping);
},
@ -76,11 +72,19 @@ const AboutWelcomeUtils = {
let flowParams;
try {
const response = await fetch(metricsFlowUri, {
credentials: "omit",
credentials: "omit"
});
if (response.status === 200) {
const { deviceId, flowId, flowBeginTime } = await response.json();
flowParams = { deviceId, flowId, flowBeginTime };
const {
deviceId,
flowId,
flowBeginTime
} = await response.json();
flowParams = {
deviceId,
flowId,
flowBeginTime
};
} else {
console.error("Non-200 response", response);
}
@ -90,68 +94,69 @@ const AboutWelcomeUtils = {
return flowParams;
},
sendEvent(type, detail) {
document.dispatchEvent(
new CustomEvent(`AWPage:${type}`, {
bubbles: true,
detail,
})
);
document.dispatchEvent(new CustomEvent(`AWPage:${type}`, {
bubbles: true,
detail
}));
},
getLoadingStrategyFor(url) {
return url?.startsWith("http") ? "lazy" : "eager";
},
}
};
const DEFAULT_RTAMO_CONTENT = {
template: "return_to_amo",
utm_term: "rtamo",
content: {
position: "split",
title: { string_id: "mr1-return-to-amo-subtitle" },
title: {
string_id: "mr1-return-to-amo-subtitle"
},
has_noodles: false,
subtitle: {
string_id: "mr1-return-to-amo-addon-title",
string_id: "mr1-return-to-amo-addon-title"
},
backdrop:
"var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)",
background:
"url('chrome://activity-stream/content/data/content/assets/mr-rtamo-background-image.svg') no-repeat center",
backdrop: "var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)",
background: "url('chrome://activity-stream/content/data/content/assets/mr-rtamo-background-image.svg') no-repeat center",
progress_bar: true,
primary_button: {
label: { string_id: "mr1-return-to-amo-add-extension-label" },
label: {
string_id: "mr1-return-to-amo-add-extension-label"
},
source_id: "ADD_EXTENSION_BUTTON",
action: {
type: "INSTALL_ADDON_FROM_URL",
data: { url: null, telemetrySource: "rtamo" },
},
data: {
url: null,
telemetrySource: "rtamo"
}
}
},
secondary_button: {
label: {
string_id: "onboarding-not-now-button-label",
string_id: "onboarding-not-now-button-label"
},
source_id: "RTAMO_START_BROWSING_BUTTON",
action: {
type: "OPEN_AWESOME_BAR",
},
type: "OPEN_AWESOME_BAR"
}
},
secondary_button_top: {
label: {
string_id: "mr1-onboarding-sign-in-button-label",
string_id: "mr1-onboarding-sign-in-button-label"
},
source_id: "RTAMO_FXA_SIGNIN_BUTTON",
action: {
data: {
entrypoint: "activity-stream-firstrun",
where: "tab",
where: "tab"
},
type: "SHOW_FIREFOX_ACCOUNTS",
addFlowParams: true,
},
},
},
addFlowParams: true
}
}
}
};
/***/ }),
/* 4 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
@ -167,11 +172,11 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);
/* harmony import */ var _LanguageSwitcher__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
/* harmony import */ var _SubmenuButton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(15);
/* harmony import */ var _lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(19);
/* harmony import */ var asrouter_content_src_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(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/. */
@ -222,7 +227,7 @@ const MultiStageAboutWelcome = props => {
filteredScreens.forEach((screen, order) => {
if (index === order) {
const messageId = `${props.message_id}_${order}_${screen.id}_${screenInitials}`;
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(messageId, {
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(messageId, {
screen_family: props.message_id,
screen_index: order,
screen_id: screen.id,
@ -249,7 +254,7 @@ const MultiStageAboutWelcome = props => {
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
(async () => {
if (metricsFlowUri) {
setFlowParams(await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.fetchFlowParams(metricsFlowUri));
setFlowParams(await _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.fetchFlowParams(metricsFlowUri));
}
})();
}, [metricsFlowUri]);
@ -468,7 +473,7 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
} = action;
if (type === "SHOW_FIREFOX_ACCOUNTS") {
let params = {
..._lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__.BASE_PARAMS,
...asrouter_content_src_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_6__.BASE_PARAMS,
utm_term: `${UTMTerm}-screen`
};
if (action.addFlowParams && flowParams) {
@ -483,7 +488,7 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
};
} else if (type === "OPEN_URL") {
let url = new URL(data.args);
(0,_lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__.addUtmParams)(url, `${UTMTerm}-screen`);
(0,asrouter_content_src_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_6__.addUtmParams)(url, `${UTMTerm}-screen`);
if (action.addFlowParams && flowParams) {
url.searchParams.append("device_id", flowParams.deviceId);
url.searchParams.append("flow_id", flowParams.flowId);
@ -494,7 +499,7 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
args: url.toString()
};
}
return _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction({
return _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction({
type,
data
});
@ -515,13 +520,13 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
return;
}
// Send telemetry before waiting on actions
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, source, event.name);
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, source, event.name);
// Send additional telemetry if a messaging surface like feature callout is
// dismissed via the dismiss button. Other causes of dismissal will be
// handled separately by the messaging surface's own code.
if (value === "dismiss_button" && !event.name) {
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendDismissTelemetry(props.messageId, source);
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendDismissTelemetry(props.messageId, source);
}
let {
action
@ -534,15 +539,15 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
if (["OPEN_URL", "SHOW_FIREFOX_ACCOUNTS"].includes(action.type)) {
actionResult = await this.handleOpenURL(action, props.flowParams, props.UTMTerm);
} else if (action.type) {
actionResult = await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction(action);
actionResult = await _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction(action);
if (action.type === "FXA_SIGNIN_FLOW") {
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, actionResult ? "sign_in" : "sign_in_cancel", "FXA_SIGNIN_FLOW");
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, actionResult ? "sign_in" : "sign_in_cancel", "FXA_SIGNIN_FLOW");
}
// Wait until migration closes to complete the action
const hasMigrate = a => a.type === "SHOW_MIGRATION_WIZARD" || a.type === "MULTI_ACTION" && a.data?.actions?.some(hasMigrate);
if (hasMigrate(action)) {
await window.AWWaitForMigrationClose();
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, "migrate_close");
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, "migrate_close");
}
}
@ -609,7 +614,7 @@ class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
action.data.actions.unshift(...multiSelectActions);
// Send telemetry with selected checkbox ids
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, props.activeMultiSelect, "SELECT_CHECKBOX");
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, props.activeMultiSelect, "SELECT_CHECKBOX");
}
render() {
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_3__.MultiStageProtonScreen, {
@ -763,7 +768,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _MobileDownloads__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
/* harmony import */ var _MultiSelect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8);
/* harmony import */ var _Themes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
@ -958,7 +963,7 @@ class ProtonScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCom
}) {
function getLoadingStrategy() {
for (let url of [imageURL, darkModeImageURL, reducedMotionImageURL, darkModeReducedMotionImageURL]) {
if (_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(url) === "lazy") {
if (_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(url) === "lazy") {
return "lazy";
}
}
@ -1189,7 +1194,7 @@ class ProtonScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCom
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
className: `${isTheme ? "rtamo-theme-icon" : "brand-logo"}`,
src: this.props.iconURL,
loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(this.props.iconURL),
loading: _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(this.props.iconURL),
alt: "",
role: "presentation"
})) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@ -1235,7 +1240,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* 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/. */
@ -1272,7 +1277,7 @@ const MobileDownloads = props => {
className: "qr-code-image",
alt: typeof QRCode.alt_text === "string" ? QRCode.alt_text : "",
src: QRCode.image_url,
loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(QRCode.image_url)
loading: _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(QRCode.image_url)
}) : null, showEmailLink ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
text: props.data.email.link_text
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
@ -1448,7 +1453,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* 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/. */
@ -1672,7 +1677,7 @@ function LanguageSwitcher(props) {
className: "primary",
value: "primary_button",
onClick: () => {
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(messageId, "download_langpack");
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(messageId, "download_langpack");
setIsAwaitingLangpack(true);
}
}, content.languageSwitcher.switch ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
@ -1747,7 +1752,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* 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/. */
@ -1770,7 +1775,7 @@ const HeroImage = props => {
height
} : null,
src: url,
loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.getLoadingStrategyFor(url),
loading: _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.getLoadingStrategyFor(url),
alt: alt || "",
role: alt ? null : "presentation"
}));
@ -2083,7 +2088,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
/* 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,
@ -2116,11 +2121,11 @@ const AddonsPicker = props => {
return;
}
}
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
type,
data
});
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
}
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "addons-picker-container"
@ -2217,7 +2222,7 @@ const LinkParagraph = props => {
/***/ }),
/* 19 */
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
@ -2234,7 +2239,7 @@ __webpack_require__.r(__webpack_exports__);
const BASE_PARAMS = {
utm_source: "activity-stream",
utm_campaign: "firstrun",
utm_medium: "referral",
utm_medium: "referral"
};
/**
@ -2257,7 +2262,6 @@ function addUtmParams(url, utmTerm) {
return returnUrl;
}
/***/ }),
/* 20 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
@ -2268,9 +2272,9 @@ __webpack_require__.r(__webpack_exports__);
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
/* harmony import */ var _MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
/* harmony import */ var _lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);
/* harmony import */ var asrouter_content_src_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(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/. */
@ -2288,7 +2292,7 @@ class ReturnToAMO extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp
async fetchFlowParams() {
if (this.props.metricsFlowUri) {
this.setState({
flowParams: await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.fetchFlowParams(this.props.metricsFlowUri)
flowParams: await _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.fetchFlowParams(this.props.metricsFlowUri)
});
}
}
@ -2321,7 +2325,7 @@ class ReturnToAMO extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp
};
} else if (type === "SHOW_FIREFOX_ACCOUNTS") {
let params = {
..._lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_3__.BASE_PARAMS,
...asrouter_content_src_templates_FirstRun_addUtmParams__WEBPACK_IMPORTED_MODULE_3__.BASE_PARAMS,
utm_term: `aboutwelcome-${utm_term}-screen`
};
if (action.addFlowParams && this.state.flowParams) {
@ -2335,11 +2339,11 @@ class ReturnToAMO extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp
extraParams: params
};
}
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
type,
data
});
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
}
render() {
const {
@ -2375,7 +2379,7 @@ class ReturnToAMO extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComp
}));
}
}
ReturnToAMO.defaultProps = _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_RTAMO_CONTENT;
ReturnToAMO.defaultProps = _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_RTAMO_CONTENT;
/***/ })
/******/ ]);
@ -2454,7 +2458,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
/* harmony import */ var _components_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);
/* harmony import */ var _components_ReturnToAMO__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20);
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@ -2491,7 +2495,7 @@ class AboutWelcome extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCom
domComplete,
domInteractive
} = performance.getEntriesByType("navigation").pop();
_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(this.props.messageId, {
_lib_aboutwelcome_utils__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(this.props.messageId, {
domComplete,
domInteractive,
mountStart: performance.getEntriesByName("mount").pop().startTime,

Просмотреть файл

@ -83,7 +83,7 @@ module.exports = function (config) {
functions: 0,
branches: 0,
},
"content-src/lib/aboutwelcome-utils.mjs": {
"content-src/lib/aboutwelcome-utils.js": {
statements: 50,
lines: 50,
functions: 50,
@ -252,7 +252,7 @@ module.exports = function (config) {
},
{
enforce: "post",
test: /\.m?js[mx]?$/,
test: /\.js[mx]?$/,
loader: "@jsdevtools/coverage-istanbul-loader",
options: { esModules: true },
include: [path.resolve("content-src"), path.resolve("modules")],

Просмотреть файл

@ -10,7 +10,7 @@ import { Themes } from "content-src/components/Themes";
import React from "react";
import { shallow, mount } from "enzyme";
import { AboutWelcomeDefaults } from "modules/AboutWelcomeDefaults.sys.mjs";
import { AboutWelcomeUtils } from "content-src/lib/aboutwelcome-utils.mjs";
import { AboutWelcomeUtils } from "content-src/lib/aboutwelcome-utils";
describe("MultiStageAboutWelcome module", () => {
let globals;

Просмотреть файл

@ -4,6 +4,11 @@
module.exports = {
// When adding items to this file please check for effects on sub-directories.
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
plugins: ["import", "react", "jsx-a11y"],
settings: {
react: {
@ -13,15 +18,14 @@ module.exports = {
extends: ["plugin:jsx-a11y/recommended"],
overrides: [
{
// TODO: Bug 1773467 - Move these to .mjs or figure out a generic way
// to identify these as modules.
files: ["content-src/**/*.js", "tests/unit/**/*.js"],
// Only mark the files as modules which are actually modules.
files: ["content-src/**", "tests/unit/**"],
parserOptions: {
sourceType: "module",
},
},
{
files: ["bin/**", "content-src/**", "tests/unit/**"],
files: ["bin/**", "./*.js", "content-src/**", "tests/unit/**"],
env: {
node: true,
},
@ -39,6 +43,8 @@ module.exports = {
rules: {
// Disallow commonjs in these directories.
"import/no-commonjs": 2,
// Allow JSX with arrow functions.
"react/jsx-no-bind": 0,
},
},
{
@ -59,6 +65,7 @@ module.exports = {
rules: {
"func-name-matching": 0,
"lines-between-class-members": 0,
"require-await": 0,
},
},
],
@ -67,10 +74,7 @@ module.exports = {
"react/jsx-boolean-value": ["error", "always"],
"react/jsx-key": "error",
"react/jsx-no-bind": [
"error",
{ allowArrowFunctions: true, allowFunctions: true },
],
"react/jsx-no-bind": "error",
"react/jsx-no-comment-textnodes": "error",
"react/jsx-no-duplicate-props": "error",
"react/jsx-no-target-blank": "error",
@ -93,15 +97,20 @@ module.exports = {
"block-scoped-var": "error",
"consistent-this": ["error", "use-bind"],
eqeqeq: "error",
"for-direction": "error",
"func-name-matching": "error",
"getter-return": "error",
"guard-for-in": "error",
"handle-callback-err": "error",
"lines-between-class-members": "error",
"max-depth": ["error", 4],
"max-nested-callbacks": ["error", 4],
"max-params": ["error", 6],
"max-statements": ["error", 50],
"max-statements-per-line": ["error", { max: 2 }],
"new-cap": ["error", { newIsCap: true, capIsNew: false }],
"no-alert": "error",
"no-buffer-constructor": "error",
"no-console": ["error", { allow: ["error"] }],
"no-div-regex": "error",
"no-duplicate-imports": "error",
@ -111,12 +120,16 @@ module.exports = {
"no-implicit-coercion": ["error", { allow: ["!!"] }],
"no-implicit-globals": "error",
"no-loop-func": "error",
"no-mixed-requires": "error",
"no-multi-assign": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-require": "error",
"no-octal-escape": "error",
"no-param-reassign": "error",
"no-path-concat": "error",
"no-process-exit": "error",
"no-proto": "error",
"no-prototype-builtins": "error",
"no-return-assign": ["error", "except-parens"],
@ -147,6 +160,7 @@ module.exports = {
"prefer-spread": "error",
"prefer-template": "error",
radix: ["error", "always"],
"require-await": "error",
"sort-vars": "error",
"symbol-description": "error",
"vars-on-top": "error",

Просмотреть файл

@ -507,6 +507,7 @@ export class ASRouterAdminInner extends React.PureComponent {
isBlocked ? null : isModified ? (
<button
className="button restore"
// eslint-disable-next-line react/jsx-no-bind
onClick={e => this.resetJSON(msg)}
>
Reset
@ -523,6 +524,7 @@ export class ASRouterAdminInner extends React.PureComponent {
{isBlocked ? null : (
<button
className="button modify"
// eslint-disable-next-line react/jsx-no-bind
onClick={e => this.modifyJson(msg)}
>
Modify
@ -557,6 +559,7 @@ export class ASRouterAdminInner extends React.PureComponent {
name={msg.id}
className="general-textarea"
disabled={isBlocked}
// eslint-disable-next-line react/jsx-no-bind
onChange={e => this.handleChange(msg.id)}
>
{JSON.stringify(msg, null, 2)}
@ -698,6 +701,7 @@ export class ASRouterAdminInner extends React.PureComponent {
<div>
<button
className="ASRouterButton slim"
// eslint-disable-next-line react/jsx-no-bind
onClick={e => this.toggleAllMessages(messagesToShow)}
>
Collapse/Expand All
@ -1307,6 +1311,7 @@ export class ASRouterAdminInner extends React.PureComponent {
<h2>Messages</h2>
<button
className="ASRouterButton slim button"
// eslint-disable-next-line react/jsx-no-bind
onClick={e => this.toggleAllMessages(messagesToShow)}
>
Collapse/Expand All

Просмотреть файл

@ -0,0 +1,22 @@
/* 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/. */
export function safeURI(url) {
if (!url) {
return "";
}
const { protocol } = new URL(url);
const isAllowed = [
"http:",
"https:",
"data:",
"resource:",
"chrome:",
].includes(protocol);
if (!isAllowed) {
// eslint-disable-next-line no-console
console.warn(`The protocol ${protocol} is not allowed for template URLs.`);
}
return isAllowed ? url : "";
}

Просмотреть файл

@ -1429,13 +1429,17 @@ class ASRouterAdminInner extends (react__WEBPACK_IMPORTED_MODULE_1___default().P
}, isBlocked ? "Unblock" : "Block"),
// eslint-disable-next-line no-nested-ternary
isBlocked ? null : isModified ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", {
className: "button restore",
className: "button restore"
// eslint-disable-next-line react/jsx-no-bind
,
onClick: e => this.resetJSON(msg)
}, "Reset") : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", {
className: "button show",
onClick: this.handleOverride(msg.id)
}, "Show"), isBlocked ? null : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", {
className: "button modify",
className: "button modify"
// eslint-disable-next-line react/jsx-no-bind
,
onClick: e => this.modifyJson(msg)
}, "Modify"), aboutMessagePreviewSupported ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement(_CopyButton__WEBPACK_IMPORTED_MODULE_4__.CopyButton, {
transformer: text => `about:messagepreview?json=${encodeURIComponent(btoa(text))}`,
@ -1451,7 +1455,9 @@ class ASRouterAdminInner extends (react__WEBPACK_IMPORTED_MODULE_1___default().P
id: `${msg.id}-textarea`,
name: msg.id,
className: "general-textarea",
disabled: isBlocked,
disabled: isBlocked
// eslint-disable-next-line react/jsx-no-bind
,
onChange: e => this.handleChange(msg.id)
}, JSON.stringify(msg, null, 2))))));
}
@ -1541,7 +1547,9 @@ class ASRouterAdminInner extends (react__WEBPACK_IMPORTED_MODULE_1___default().P
}
const messagesToShow = this.state.messageFilter === "all" ? this.state.messages : this.state.messages.filter(message => message.provider === this.state.messageFilter && message.template !== "pb_newtab");
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", {
className: "ASRouterButton slim",
className: "ASRouterButton slim"
// eslint-disable-next-line react/jsx-no-bind
,
onClick: e => this.toggleAllMessages(messagesToShow)
}, "Collapse/Expand All"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("p", {
className: "helpLink"
@ -1843,7 +1851,9 @@ class ASRouterAdminInner extends (react__WEBPACK_IMPORTED_MODULE_1___default().P
display: "none"
}
}), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("h2", null, "Messages"), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default().createElement("button", {
className: "ASRouterButton slim button",
className: "ASRouterButton slim button"
// eslint-disable-next-line react/jsx-no-bind
,
onClick: e => this.toggleAllMessages(messagesToShow)
}, "Collapse/Expand All"), this.renderPBMessages()));
}

Просмотреть файл

@ -1,4 +1,7 @@
import { addUtmParams, BASE_PARAMS } from "content-src/lib/addUtmParams.mjs";
import {
addUtmParams,
BASE_PARAMS,
} from "content-src/templates/FirstRun/addUtmParams";
describe("addUtmParams", () => {
it("should convert a string URL", () => {

Просмотреть файл

@ -0,0 +1,31 @@
import { safeURI } from "content-src/template-utils";
describe("safeURI", () => {
let warnStub;
beforeEach(() => {
warnStub = sinon.stub(console, "warn");
});
afterEach(() => {
warnStub.restore();
});
it("should allow http: URIs", () => {
assert.equal(safeURI("http://foo.com"), "http://foo.com");
});
it("should allow https: URIs", () => {
assert.equal(safeURI("https://foo.com"), "https://foo.com");
});
it("should allow data URIs", () => {
assert.equal(
safeURI("data:image/png;base64,iVBO"),
"data:image/png;base64,iVBO"
);
});
it("should not allow javascript: URIs", () => {
assert.equal(safeURI("javascript:foo()"), ""); // eslint-disable-line no-script-url
assert.calledOnce(warnStub);
});
it("should not warn if the URL is falsey ", () => {
assert.equal(safeURI(), "");
assert.notCalled(warnStub);
});
});

Просмотреть файл

@ -4,6 +4,11 @@
module.exports = {
// When adding items to this file please check for effects on sub-directories.
parserOptions: {
ecmaFeatures: {
jsx: true,
},
},
plugins: ["import", "react", "jsx-a11y"],
settings: {
react: {
@ -13,13 +18,8 @@ module.exports = {
extends: ["plugin:jsx-a11y/recommended"],
overrides: [
{
// TODO: Bug 1773467 - Move these to .mjs or figure out a generic way
// to identify these as modules.
files: [
"content-src/**/*.js",
"test/schemas/**/*.js",
"test/unit/**/*.js",
],
// Only mark the files as modules which are actually modules.
files: ["content-src/**", "test/schemas/**", "test/unit/**"],
parserOptions: {
sourceType: "module",
},
@ -47,6 +47,7 @@ module.exports = {
files: [
"bin/**",
"content-src/**",
"./*.js",
"loaders/**",
"tools/**",
"test/unit/**",
@ -68,6 +69,8 @@ module.exports = {
rules: {
// Disallow commonjs in these directories.
"import/no-commonjs": 2,
// Allow JSX with arrow functions.
"react/jsx-no-bind": 0,
},
},
{
@ -88,6 +91,7 @@ module.exports = {
rules: {
"func-name-matching": 0,
"lines-between-class-members": 0,
"require-await": 0,
},
},
],
@ -96,10 +100,7 @@ module.exports = {
"react/jsx-boolean-value": ["error", "always"],
"react/jsx-key": "error",
"react/jsx-no-bind": [
"error",
{ allowArrowFunctions: true, allowFunctions: true },
],
"react/jsx-no-bind": "error",
"react/jsx-no-comment-textnodes": "error",
"react/jsx-no-duplicate-props": "error",
"react/jsx-no-target-blank": "error",
@ -122,15 +123,20 @@ module.exports = {
"block-scoped-var": "error",
"consistent-this": ["error", "use-bind"],
eqeqeq: "error",
"for-direction": "error",
"func-name-matching": "error",
"getter-return": "error",
"guard-for-in": "error",
"handle-callback-err": "error",
"lines-between-class-members": "error",
"max-depth": ["error", 4],
"max-nested-callbacks": ["error", 4],
"max-params": ["error", 6],
"max-statements": ["error", 50],
"max-statements-per-line": ["error", { max: 2 }],
"new-cap": ["error", { newIsCap: true, capIsNew: false }],
"no-alert": "error",
"no-buffer-constructor": "error",
"no-console": ["error", { allow: ["error"] }],
"no-div-regex": "error",
"no-duplicate-imports": "error",
@ -140,12 +146,16 @@ module.exports = {
"no-implicit-coercion": ["error", { allow: ["!!"] }],
"no-implicit-globals": "error",
"no-loop-func": "error",
"no-mixed-requires": "error",
"no-multi-assign": "error",
"no-multi-str": "error",
"no-new": "error",
"no-new-func": "error",
"no-new-require": "error",
"no-octal-escape": "error",
"no-param-reassign": "error",
"no-path-concat": "error",
"no-process-exit": "error",
"no-proto": "error",
"no-prototype-builtins": "error",
"no-return-assign": ["error", "except-parens"],
@ -176,6 +186,7 @@ module.exports = {
"prefer-spread": "error",
"prefer-template": "error",
radix: ["error", "always"],
"require-await": "error",
"sort-vars": "error",
"symbol-description": "error",
"vars-on-top": "error",

Просмотреть файл

@ -3,6 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
/* globals ContentSearchUIController, ContentSearchHandoffUIController */
"use strict";
import {
actionCreators as ac,

Просмотреть файл

@ -8883,6 +8883,7 @@ const NEWTAB_DARK_THEME = {
class _Search extends (external_React_default()).PureComponent {
constructor(props) {
super(props);

Просмотреть файл

@ -1,3 +1,5 @@
"use strict";
import {
ImpressionStats,
INTERSECTION_RATIO,

Просмотреть файл

@ -1,3 +1,5 @@
"use strict";
import {
TopSiteImpressionWrapper,
INTERSECTION_RATIO,

Просмотреть файл

@ -1,6 +1,7 @@
/* 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/. */
/* eslint-env node */
module.exports = {
mode: "production",

Просмотреть файл

@ -10,8 +10,8 @@
function removePrivateAndStaticFields() {
return {
packageLinkPhase({ customElementsManifest }) {
customElementsManifest?.modules?.forEach(m => {
m?.declarations?.forEach(declaration => {
customElementsManifest?.modules?.forEach(module => {
module?.declarations?.forEach(declaration => {
if (declaration.members != null) {
declaration.members = declaration.members.filter(member => {
return (

Просмотреть файл

@ -4,6 +4,8 @@
"use strict";
/* global __dirname */
/**
* NOTE: This file does not apply to builds in MC. This config is used for
* our Jest tests and for webpack bundle builds.

Просмотреть файл

@ -4,6 +4,8 @@
"use strict";
/* global __dirname */
const sharedJestConfig = require(`${__dirname}/../shared/test-helpers/shared-jest.config`);
module.exports = {

Просмотреть файл

@ -4,6 +4,8 @@
"use strict";
/* global __dirname */
const { resolve } = require("path");
const rootDir = resolve(__dirname);
module.exports = {

Просмотреть файл

@ -4,6 +4,7 @@
"use strict";
/* global __dirname */
const path = require("path");
module.exports = (env, argv) => {

Просмотреть файл

@ -4,6 +4,7 @@
"use strict";
/* global __dirname */
const fixturesDir = `${__dirname}/jest-fixtures`;
module.exports = {

Просмотреть файл

@ -10,11 +10,6 @@
* be found here:
*
* https://eslint.org/docs/rules/
*
* Rules that we've explicitly decided not to enable:
*
* require-await - bug 1381030.
* no-prototype-builtins - bug 1551829.
*/
module.exports = {
env: {
@ -58,7 +53,7 @@ module.exports = {
},
},
{
files: ["**/*.mjs", "**/*.jsx", "**/*.jsm", "**/?(*.)worker.?(m)js"],
files: ["**/*.mjs", "**/*.jsm", "**/?(*.)worker.?(m)js"],
rules: {
// Modules and workers are far easier to check for no-unused-vars on a
// global scope, than our content files. Hence we turn that on here.
@ -71,6 +66,12 @@ module.exports = {
],
},
},
{
files: ["**/*.sys.mjs"],
rules: {
"mozilla/use-static-import": "error",
},
},
{
excludedFiles: ["**/*.sys.mjs"],
files: ["**/*.mjs"],
@ -81,7 +82,7 @@ module.exports = {
},
},
{
files: ["**/*.mjs", "**/*.jsx"],
files: ["**/*.mjs"],
parserOptions: {
sourceType: "module",
},