зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
2d66624de2
Коммит
77f2a39423
13
.eslintrc.js
13
.eslintrc.js
|
@ -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",
|
||||
},
|
||||
|
|
Загрузка…
Ссылка в новой задаче