Backed out 2 changesets (bug 1922594) for causing bc failures on browser_sync.js CLOSED TREE
Backed out changeset 32bbfcc1607a (bug 1922594) Backed out changeset 9372edf868fe (bug 1922594)
This commit is contained in:
@@ -495,7 +495,6 @@ var gSync = {
|
|||||||
"browser/appmenu.ftl",
|
"browser/appmenu.ftl",
|
||||||
"browser/sync.ftl",
|
"browser/sync.ftl",
|
||||||
"browser/syncedTabs.ftl",
|
"browser/syncedTabs.ftl",
|
||||||
"browser/newtab/asrouter.ftl",
|
|
||||||
],
|
],
|
||||||
true
|
true
|
||||||
));
|
));
|
||||||
@@ -586,7 +585,6 @@ var gSync = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MozXULElement.insertFTLIfNeeded("browser/sync.ftl");
|
MozXULElement.insertFTLIfNeeded("browser/sync.ftl");
|
||||||
MozXULElement.insertFTLIfNeeded("browser/newtab/asrouter.ftl");
|
|
||||||
|
|
||||||
// Label for the sync buttons.
|
// Label for the sync buttons.
|
||||||
const appMenuLabel = PanelMultiView.getViewNode(
|
const appMenuLabel = PanelMultiView.getViewNode(
|
||||||
@@ -659,8 +657,6 @@ var gSync = {
|
|||||||
"PanelUI-fxa-menu-sendtab-connect-device-button"
|
"PanelUI-fxa-menu-sendtab-connect-device-button"
|
||||||
).addEventListener("command", this);
|
).addEventListener("command", this);
|
||||||
|
|
||||||
PanelUI.mainView.addEventListener("ViewShowing", this);
|
|
||||||
|
|
||||||
// If the experiment is enabled, we'll need to update the panels
|
// If the experiment is enabled, we'll need to update the panels
|
||||||
// to show some different text to the user
|
// to show some different text to the user
|
||||||
if (this.FXA_CTA_MENU_ENABLED) {
|
if (this.FXA_CTA_MENU_ENABLED) {
|
||||||
@@ -693,11 +689,7 @@ var gSync = {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "ViewShowing": {
|
case "ViewShowing": {
|
||||||
if (event.target == PanelUI.mainView) {
|
this.onFxAPanelViewShowing(event.target);
|
||||||
this.onAppMenuShowing();
|
|
||||||
} else {
|
|
||||||
this.onFxAPanelViewShowing(event.target);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "ViewHiding": {
|
case "ViewHiding": {
|
||||||
@@ -706,25 +698,6 @@ var gSync = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onAppMenuShowing() {
|
|
||||||
const appMenuHeaderText = PanelMultiView.getViewNode(
|
|
||||||
document,
|
|
||||||
"appMenu-fxa-text"
|
|
||||||
);
|
|
||||||
|
|
||||||
const ctaDefaultStringID = "appmenu-fxa-sync-and-save-data2";
|
|
||||||
const ctaStringID = this.getMenuCtaCopy(NimbusFeatures.fxaAppMenuItem);
|
|
||||||
|
|
||||||
document.l10n.setAttributes(
|
|
||||||
appMenuHeaderText,
|
|
||||||
ctaStringID || ctaDefaultStringID
|
|
||||||
);
|
|
||||||
|
|
||||||
if (NimbusFeatures.fxaAppMenuItem.getVariable("ctaCopyVariant")) {
|
|
||||||
NimbusFeatures.fxaAppMenuItem.recordExposureEvent();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onFxAPanelViewShowing(panelview) {
|
onFxAPanelViewShowing(panelview) {
|
||||||
let messageId = panelview.getAttribute(
|
let messageId = panelview.getAttribute(
|
||||||
MenuMessage.SHOWING_FXA_MENU_MESSAGE_ATTR
|
MenuMessage.SHOWING_FXA_MENU_MESSAGE_ATTR
|
||||||
@@ -769,14 +742,6 @@ var gSync = {
|
|||||||
PanelMultiView.getViewNode(document, "PanelUI-fxa-remotetabs-tabslist"),
|
PanelMultiView.getViewNode(document, "PanelUI-fxa-remotetabs-tabslist"),
|
||||||
PanelMultiView.getViewNode(document, "PanelUI-remote-tabs-separator")
|
PanelMultiView.getViewNode(document, "PanelUI-remote-tabs-separator")
|
||||||
);
|
);
|
||||||
|
|
||||||
// Any variant on the CTA will have been applied inside of updateFxAPanel,
|
|
||||||
// but now that the panel is showing, we record exposure.
|
|
||||||
const ctaCopyVariant =
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.getVariable("ctaCopyVariant");
|
|
||||||
if (ctaCopyVariant) {
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.recordExposureEvent();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
onFxAPanelViewHiding(panelview) {
|
onFxAPanelViewHiding(panelview) {
|
||||||
@@ -1155,14 +1120,6 @@ var gSync = {
|
|||||||
? "fxa-menu-sync-description"
|
? "fxa-menu-sync-description"
|
||||||
: "appmenu-fxa-signed-in-label";
|
: "appmenu-fxa-signed-in-label";
|
||||||
headerDescription = this.fluentStrings.formatValueSync(headerDescString);
|
headerDescription = this.fluentStrings.formatValueSync(headerDescString);
|
||||||
|
|
||||||
if (this.FXA_CTA_MENU_ENABLED) {
|
|
||||||
const ctaCopy = this.getMenuCtaCopy(NimbusFeatures.fxaAvatarMenuItem);
|
|
||||||
if (ctaCopy) {
|
|
||||||
headerTitleL10nId = ctaCopy.headerTitleL10nId;
|
|
||||||
headerDescription = ctaCopy.headerDescription;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (state.status === UIState.STATUS_LOGIN_FAILED) {
|
} else if (state.status === UIState.STATUS_LOGIN_FAILED) {
|
||||||
stateValue = "login-failed";
|
stateValue = "login-failed";
|
||||||
headerTitleL10nId = "account-disconnected2";
|
headerTitleL10nId = "account-disconnected2";
|
||||||
@@ -2393,91 +2350,6 @@ var gSync = {
|
|||||||
PanelUI.hide();
|
PanelUI.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns any experimental copy that we want to try for FxA sign-in CTAs in
|
|
||||||
* the event that the user is enrolled in an experiment.
|
|
||||||
*
|
|
||||||
* The only ctaCopyVariant's that are expected are:
|
|
||||||
*
|
|
||||||
* - control
|
|
||||||
* - sync-devices
|
|
||||||
* - backup-data
|
|
||||||
* - backup-sync
|
|
||||||
* - mobile
|
|
||||||
*
|
|
||||||
* If "control" is set, `null` is returned to indicate default strings,
|
|
||||||
* but impressions will still be recorded.
|
|
||||||
*
|
|
||||||
* @param {NimbusFeature} feature
|
|
||||||
* One of either NimbusFeatures.fxaAppMenuItem or
|
|
||||||
* NimbusFeatures.fxaAvatarMenuItem.
|
|
||||||
* @returns {object|string|null}
|
|
||||||
* If feature is NimbusFeatures.fxaAppMenuItem, this will return the Fluent
|
|
||||||
* string ID for the App Menu CTA to appear for users to sign in.
|
|
||||||
*
|
|
||||||
* If feature is NimbusFeatures.fxaAvatarMenuItem, this will return an
|
|
||||||
* object with two properties:
|
|
||||||
*
|
|
||||||
* headerTitleL10nId (string):
|
|
||||||
* The Fluent ID for the header string for the avatar menu CTA.
|
|
||||||
* headerDescription (string):
|
|
||||||
* The raw string for the description for the avatar menu CTA.
|
|
||||||
*
|
|
||||||
* If there is no copy variant being tested, this will return null.
|
|
||||||
*/
|
|
||||||
getMenuCtaCopy(feature) {
|
|
||||||
const ctaCopyVariant = feature.getVariable("ctaCopyVariant");
|
|
||||||
let headerTitleL10nId;
|
|
||||||
let headerDescription;
|
|
||||||
switch (ctaCopyVariant) {
|
|
||||||
case "sync-devices": {
|
|
||||||
if (feature === NimbusFeatures.fxaAppMenuItem) {
|
|
||||||
return "fxa-menu-message-sync-devices-collapsed-text";
|
|
||||||
}
|
|
||||||
headerTitleL10nId = "fxa-menu-message-sync-devices-primary-text";
|
|
||||||
headerDescription = this.fluentStrings.formatValueSync(
|
|
||||||
"fxa-menu-message-sync-devices-secondary-text"
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "backup-data": {
|
|
||||||
if (feature === NimbusFeatures.fxaAppMenuItem) {
|
|
||||||
return "fxa-menu-message-backup-data-collapsed-text";
|
|
||||||
}
|
|
||||||
headerTitleL10nId = "fxa-menu-message-backup-data-primary-text";
|
|
||||||
headerDescription = this.fluentStrings.formatValueSync(
|
|
||||||
"fxa-menu-message-backup-data-secondary-text"
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "backup-sync": {
|
|
||||||
if (feature === NimbusFeatures.fxaAppMenuItem) {
|
|
||||||
return "fxa-menu-message-backup-sync-collapsed-text";
|
|
||||||
}
|
|
||||||
headerTitleL10nId = "fxa-menu-message-backup-sync-primary-text";
|
|
||||||
headerDescription = this.fluentStrings.formatValueSync(
|
|
||||||
"fxa-menu-message-backup-sync-secondary-text"
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "mobile": {
|
|
||||||
if (feature === NimbusFeatures.fxaAppMenuItem) {
|
|
||||||
return "fxa-menu-message-mobile-collapsed-text";
|
|
||||||
}
|
|
||||||
headerTitleL10nId = "fxa-menu-message-mobile-primary-text";
|
|
||||||
headerDescription = this.fluentStrings.formatValueSync(
|
|
||||||
"fxa-menu-message-mobile-secondary-text"
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return { headerTitleL10nId, headerDescription };
|
|
||||||
},
|
|
||||||
|
|
||||||
openLink(url) {
|
openLink(url) {
|
||||||
switchToTabHavingURI(url, true, { replaceQueryString: true });
|
switchToTabHavingURI(url, true, { replaceQueryString: true });
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -43,10 +43,6 @@ var gExceptionPaths = [
|
|||||||
"chrome://browser/content/assets/vpn-logo.svg",
|
"chrome://browser/content/assets/vpn-logo.svg",
|
||||||
"chrome://browser/content/assets/focus-promo.png",
|
"chrome://browser/content/assets/focus-promo.png",
|
||||||
"chrome://browser/content/assets/klar-qr-code.svg",
|
"chrome://browser/content/assets/klar-qr-code.svg",
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-box-on-cloud.svg",
|
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-devices.svg",
|
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-locked-box.svg",
|
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-mobile.svg",
|
|
||||||
|
|
||||||
// toolkit/components/pdfjs/content/build/pdf.js
|
// toolkit/components/pdfjs/content/build/pdf.js
|
||||||
"resource://pdf.js/web/images/",
|
"resource://pdf.js/web/images/",
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
[DEFAULT]
|
[DEFAULT]
|
||||||
support-files = ["head.js"]
|
support-files = ["head.js"]
|
||||||
|
|
||||||
["browser_appmenu_signin_cta_variants.js"]
|
|
||||||
|
|
||||||
["browser_avatar_menu_signin_cta_variants.js"]
|
|
||||||
|
|
||||||
["browser_contextmenu_sendpage.js"]
|
["browser_contextmenu_sendpage.js"]
|
||||||
|
|
||||||
["browser_contextmenu_sendtab.js"]
|
["browser_contextmenu_sendtab.js"]
|
||||||
|
|||||||
@@ -1,142 +0,0 @@
|
|||||||
/* Any copyright is dedicated to the Public Domain.
|
|
||||||
https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
const { ExperimentFakes } = ChromeUtils.importESModule(
|
|
||||||
"resource://testing-common/NimbusTestUtils.sys.mjs"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that we can change the CTA for the FxA sign-in button in the AppMenu
|
|
||||||
* using Nimbus.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Closes and re-opens the AppMenu for the current browser window, and returns a
|
|
||||||
* Promise once the main view fires the "ViewShown" event. The Promise resolves
|
|
||||||
* to the element in the AppMenu that holds the FxA sign-in CTA.
|
|
||||||
*
|
|
||||||
* If the panel is not already open, this just opens it.
|
|
||||||
*
|
|
||||||
* @returns {Promise<Element>}
|
|
||||||
*/
|
|
||||||
async function reopenAppMenu() {
|
|
||||||
PanelUI.hide();
|
|
||||||
let promiseViewShown = BrowserTestUtils.waitForEvent(
|
|
||||||
PanelUI.panel,
|
|
||||||
"ViewShown"
|
|
||||||
);
|
|
||||||
PanelUI.show();
|
|
||||||
await promiseViewShown;
|
|
||||||
return PanelMultiView.getViewNode(document, "appMenu-fxa-text");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that we use the default CTA when not enrolled in an experiment.
|
|
||||||
*/
|
|
||||||
add_task(async function test_default() {
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAppMenuItem, "recordExposureEvent");
|
|
||||||
Assert.equal(
|
|
||||||
NimbusFeatures.fxaAppMenuItem.getVariable("ctaCopyVariant"),
|
|
||||||
undefined,
|
|
||||||
"Should not start with a NimbusFeature set for the CTA copy."
|
|
||||||
);
|
|
||||||
let ctaEl = await reopenAppMenu();
|
|
||||||
Assert.equal(
|
|
||||||
ctaEl.dataset.l10nId,
|
|
||||||
"appmenu-fxa-sync-and-save-data2",
|
|
||||||
"Should have the default CTA text."
|
|
||||||
);
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAppMenuItem.recordExposureEvent.notCalled,
|
|
||||||
"Did not record any exposure."
|
|
||||||
);
|
|
||||||
sandbox.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that the control variant uses the default CTA, but also records an
|
|
||||||
* impression.
|
|
||||||
*/
|
|
||||||
add_task(async function test_control() {
|
|
||||||
let doCleanup = await ExperimentFakes.enrollWithFeatureConfig(
|
|
||||||
{
|
|
||||||
featureId: NimbusFeatures.fxaAppMenuItem.featureId,
|
|
||||||
value: {
|
|
||||||
ctaCopyVariant: "control",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ isRollout: true }
|
|
||||||
);
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAppMenuItem, "recordExposureEvent");
|
|
||||||
let ctaEl = await reopenAppMenu();
|
|
||||||
Assert.equal(
|
|
||||||
ctaEl.dataset.l10nId,
|
|
||||||
"appmenu-fxa-sync-and-save-data2",
|
|
||||||
"Should have the default CTA text."
|
|
||||||
);
|
|
||||||
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAppMenuItem.recordExposureEvent.calledOnce,
|
|
||||||
"Recorded exposure."
|
|
||||||
);
|
|
||||||
await doCleanup();
|
|
||||||
sandbox.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests all variants , and that when we stop experimenting with that variant,
|
|
||||||
* we revert back to the default CTA.
|
|
||||||
*/
|
|
||||||
add_task(async function test_variants() {
|
|
||||||
let variants = ["sync-devices", "backup-data", "backup-sync", "mobile"];
|
|
||||||
|
|
||||||
for (let variant of variants) {
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAppMenuItem, "recordExposureEvent");
|
|
||||||
|
|
||||||
let expectedL10nID = `fxa-menu-message-${variant}-collapsed-text`;
|
|
||||||
// Ensure that a string actually exists for that ID.
|
|
||||||
try {
|
|
||||||
Assert.ok(
|
|
||||||
await document.l10n.formatValue(expectedL10nID),
|
|
||||||
`Found a string for ${expectedL10nID}`
|
|
||||||
);
|
|
||||||
} catch (e) {
|
|
||||||
Assert.ok(false, `Missing string for ID: ${expectedL10nID}`);
|
|
||||||
}
|
|
||||||
let doCleanup = await ExperimentFakes.enrollWithFeatureConfig(
|
|
||||||
{
|
|
||||||
featureId: NimbusFeatures.fxaAppMenuItem.featureId,
|
|
||||||
value: {
|
|
||||||
ctaCopyVariant: variant,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ isRollout: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
let ctaEl = await reopenAppMenu();
|
|
||||||
Assert.equal(
|
|
||||||
ctaEl.dataset.l10nId,
|
|
||||||
expectedL10nID,
|
|
||||||
"Got the expected string for the variant."
|
|
||||||
);
|
|
||||||
|
|
||||||
await doCleanup();
|
|
||||||
|
|
||||||
ctaEl = await reopenAppMenu();
|
|
||||||
Assert.equal(
|
|
||||||
ctaEl.dataset.l10nId,
|
|
||||||
"appmenu-fxa-sync-and-save-data2",
|
|
||||||
"Should have the default CTA text."
|
|
||||||
);
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAppMenuItem.recordExposureEvent.calledOnce,
|
|
||||||
"Recorded exposure."
|
|
||||||
);
|
|
||||||
sandbox.restore();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
/* Any copyright is dedicated to the Public Domain.
|
|
||||||
https://creativecommons.org/publicdomain/zero/1.0/ */
|
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
const { ExperimentFakes } = ChromeUtils.importESModule(
|
|
||||||
"resource://testing-common/NimbusTestUtils.sys.mjs"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that we can change the CTA for the FxA sign-in button in the avatar
|
|
||||||
* menu using Nimbus.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const DEFAULT_HEADER = gSync.fluentStrings.formatValueSync(
|
|
||||||
"synced-tabs-fxa-sign-in"
|
|
||||||
);
|
|
||||||
const DEFAULT_DESCRIPTION = gSync.fluentStrings.formatValueSync(
|
|
||||||
"fxa-menu-sync-description"
|
|
||||||
);
|
|
||||||
|
|
||||||
add_setup(async () => {
|
|
||||||
gSync.init();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Closes and re-opens the avatar menu for the current browser window, and
|
|
||||||
* returns a Promise once the main view fires the "ViewShown" event. The Promise
|
|
||||||
* resolves to the object with properties pointing at the header and the
|
|
||||||
* description text of the sign-in button.
|
|
||||||
*
|
|
||||||
* If the panel is not already open, this just opens it.
|
|
||||||
*
|
|
||||||
* @returns {Promise<object>}
|
|
||||||
*/
|
|
||||||
async function reopenAvatarMenu() {
|
|
||||||
let widgetPanel = document.getElementById("customizationui-widget-panel");
|
|
||||||
// The customizationui-widget-panel is created lazily, and destroyed upon
|
|
||||||
// closing, meaning that if we didn't find it, it's not open.
|
|
||||||
if (widgetPanel) {
|
|
||||||
let panelHidden = BrowserTestUtils.waitForEvent(widgetPanel, "popuphidden");
|
|
||||||
widgetPanel.hidePopup();
|
|
||||||
await panelHidden;
|
|
||||||
}
|
|
||||||
let promiseViewShown = BrowserTestUtils.waitForEvent(
|
|
||||||
PanelMultiView.getViewNode(document, "PanelUI-fxa"),
|
|
||||||
"ViewShown"
|
|
||||||
);
|
|
||||||
await gSync.toggleAccountPanel(
|
|
||||||
document.getElementById("fxa-toolbar-menu-button"),
|
|
||||||
new MouseEvent("mousedown")
|
|
||||||
);
|
|
||||||
await promiseViewShown;
|
|
||||||
let headerEl = PanelMultiView.getViewNode(document, "fxa-menu-header-title");
|
|
||||||
let descriptionEl = PanelMultiView.getViewNode(
|
|
||||||
document,
|
|
||||||
"fxa-menu-header-description"
|
|
||||||
);
|
|
||||||
|
|
||||||
return {
|
|
||||||
header: headerEl.value,
|
|
||||||
description: descriptionEl.value,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that we use the default CTA when not enrolled in an experiment.
|
|
||||||
*/
|
|
||||||
add_task(async function test_default() {
|
|
||||||
Assert.equal(
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.getVariable("ctaCopyVariant"),
|
|
||||||
undefined,
|
|
||||||
"Should not start with a NimbusFeature set for the CTA copy."
|
|
||||||
);
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAvatarMenuItem, "recordExposureEvent");
|
|
||||||
let { header, description } = await reopenAvatarMenu();
|
|
||||||
Assert.equal(header, DEFAULT_HEADER, "Should have the default header.");
|
|
||||||
Assert.equal(
|
|
||||||
description,
|
|
||||||
DEFAULT_DESCRIPTION,
|
|
||||||
"Should have the default description."
|
|
||||||
);
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.recordExposureEvent.notCalled,
|
|
||||||
"Did not record any exposure."
|
|
||||||
);
|
|
||||||
sandbox.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests that the control variant uses the default CTA, but also records an
|
|
||||||
* impression.
|
|
||||||
*/
|
|
||||||
add_task(async function test_control() {
|
|
||||||
let doCleanup = await ExperimentFakes.enrollWithFeatureConfig(
|
|
||||||
{
|
|
||||||
featureId: NimbusFeatures.fxaAvatarMenuItem.featureId,
|
|
||||||
value: {
|
|
||||||
ctaCopyVariant: "control",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ isRollout: true }
|
|
||||||
);
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAvatarMenuItem, "recordExposureEvent");
|
|
||||||
let { header, description } = await reopenAvatarMenu();
|
|
||||||
Assert.equal(header, DEFAULT_HEADER, "Should have the default header.");
|
|
||||||
Assert.equal(
|
|
||||||
description,
|
|
||||||
DEFAULT_DESCRIPTION,
|
|
||||||
"Should have the default description."
|
|
||||||
);
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.recordExposureEvent.calledOnce,
|
|
||||||
"Recorded exposure."
|
|
||||||
);
|
|
||||||
await doCleanup();
|
|
||||||
sandbox.restore();
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests all variants , and that when we stop experimenting with that variant,
|
|
||||||
* we revert back to the default CTA.
|
|
||||||
*/
|
|
||||||
add_task(async function test_variants() {
|
|
||||||
let variants = ["sync-devices", "backup-data", "backup-sync", "mobile"];
|
|
||||||
|
|
||||||
for (let variant of variants) {
|
|
||||||
let sandbox = sinon.createSandbox();
|
|
||||||
sandbox.spy(NimbusFeatures.fxaAvatarMenuItem, "recordExposureEvent");
|
|
||||||
|
|
||||||
let expectedHeader = gSync.fluentStrings.formatValueSync(
|
|
||||||
`fxa-menu-message-${variant}-primary-text`
|
|
||||||
);
|
|
||||||
let expectedDescription = gSync.fluentStrings.formatValueSync(
|
|
||||||
`fxa-menu-message-${variant}-secondary-text`
|
|
||||||
);
|
|
||||||
let doCleanup = await ExperimentFakes.enrollWithFeatureConfig(
|
|
||||||
{
|
|
||||||
featureId: NimbusFeatures.fxaAvatarMenuItem.featureId,
|
|
||||||
value: {
|
|
||||||
ctaCopyVariant: variant,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{ isRollout: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
let { header, description } = await reopenAvatarMenu();
|
|
||||||
Assert.equal(header, expectedHeader, "Should have the expected header.");
|
|
||||||
Assert.equal(
|
|
||||||
description,
|
|
||||||
expectedDescription,
|
|
||||||
"Should have the expected description."
|
|
||||||
);
|
|
||||||
await doCleanup();
|
|
||||||
|
|
||||||
({ header, description } = await reopenAvatarMenu());
|
|
||||||
Assert.equal(header, DEFAULT_HEADER, "Should have the default header.");
|
|
||||||
Assert.equal(
|
|
||||||
description,
|
|
||||||
DEFAULT_DESCRIPTION,
|
|
||||||
"Should have the default description."
|
|
||||||
);
|
|
||||||
Assert.ok(
|
|
||||||
NimbusFeatures.fxaAvatarMenuItem.recordExposureEvent.calledOnce,
|
|
||||||
"Recorded exposure."
|
|
||||||
);
|
|
||||||
sandbox.restore();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 53 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 32 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 40 KiB |
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 17 KiB |
@@ -36,7 +36,6 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
margin-block-start: var(--illustration-margin-block-offset);
|
margin-block-start: var(--illustration-margin-block-offset);
|
||||||
margin-block-end: var(--space-xsmall);
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,8 +96,6 @@ export default class FxAMenuMessage extends MozLitElement {
|
|||||||
type="primary"
|
type="primary"
|
||||||
tabindex="1"
|
tabindex="1"
|
||||||
autofocus
|
autofocus
|
||||||
title="${this.buttonText}"
|
|
||||||
aria-label="${this.buttonText}"
|
|
||||||
>${this.buttonText}</moz-button
|
>${this.buttonText}</moz-button
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ export const Default = Template.bind({});
|
|||||||
Default.args = {
|
Default.args = {
|
||||||
buttonText: "Sign up",
|
buttonText: "Sign up",
|
||||||
imageURL:
|
imageURL:
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-box-on-cloud.svg",
|
"chrome://activity-stream/content/data/content/assets/fox-doodle-waving-static.png",
|
||||||
primaryText: "Bounce between devices",
|
primaryText: "Bounce between devices",
|
||||||
secondaryText:
|
secondaryText:
|
||||||
"Sync and encrypt your bookmarks, passwords, and more on all your devices.",
|
"Sync and encrypt your bookmarks, passwords, and more on all your devices.",
|
||||||
imageVerticalOffset: -20,
|
imageVerticalOffset: -24,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -12,7 +12,3 @@ browser.jar:
|
|||||||
content/browser/asrouter/render.js (content/render.js)
|
content/browser/asrouter/render.js (content/render.js)
|
||||||
content/browser/asrouter/schemas/BackgroundTaskMessagingExperiment.schema.json (content-src/schemas/BackgroundTaskMessagingExperiment.schema.json)
|
content/browser/asrouter/schemas/BackgroundTaskMessagingExperiment.schema.json (content-src/schemas/BackgroundTaskMessagingExperiment.schema.json)
|
||||||
content/browser/asrouter/schemas/MessagingExperiment.schema.json (content-src/schemas/MessagingExperiment.schema.json)
|
content/browser/asrouter/schemas/MessagingExperiment.schema.json (content-src/schemas/MessagingExperiment.schema.json)
|
||||||
content/browser/asrouter/assets/fox-with-box-on-cloud.svg (content/assets/fox-with-box-on-cloud.svg)
|
|
||||||
content/browser/asrouter/assets/fox-with-devices.svg (content/assets/fox-with-devices.svg)
|
|
||||||
content/browser/asrouter/assets/fox-with-locked-box.svg (content/assets/fox-with-locked-box.svg)
|
|
||||||
content/browser/asrouter/assets/fox-with-mobile.svg (content/assets/fox-with-mobile.svg)
|
|
||||||
|
|||||||
@@ -888,8 +888,8 @@ const MESSAGES = () => [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
imageURL:
|
imageURL:
|
||||||
"chrome://browser/content/asrouter/assets/fox-with-box-on-cloud.svg",
|
"chrome://activity-stream/content/data/content/assets/fox-doodle-waving-static.png",
|
||||||
imageVerticalOffset: -20,
|
imageVerticalOffset: -24,
|
||||||
},
|
},
|
||||||
skip_in_tests: "TODO",
|
skip_in_tests: "TODO",
|
||||||
trigger: {
|
trigger: {
|
||||||
|
|||||||
@@ -275,21 +275,3 @@ root-certificate-succession-infobar-secondary-button =
|
|||||||
fxa-menu-message-close-button =
|
fxa-menu-message-close-button =
|
||||||
.title = Close
|
.title = Close
|
||||||
.aria-label = Close
|
.aria-label = Close
|
||||||
|
|
||||||
fxa-menu-message-sign-up-button = Sign up
|
|
||||||
|
|
||||||
fxa-menu-message-sync-devices-primary-text = Sync all your devices
|
|
||||||
fxa-menu-message-sync-devices-secondary-text = Instantly get your info — like bookmarks and passwords — everywhere you use { -brand-short-name }.
|
|
||||||
fxa-menu-message-sync-devices-collapsed-text = Sync all your devices
|
|
||||||
|
|
||||||
fxa-menu-message-backup-data-primary-text = Back up your browser data
|
|
||||||
fxa-menu-message-backup-data-secondary-text = Automatically protect bookmarks, passwords, and other info on all your devices.
|
|
||||||
fxa-menu-message-backup-data-collapsed-text = Back up browser data
|
|
||||||
|
|
||||||
fxa-menu-message-backup-sync-primary-text = Keep your data safe and synced
|
|
||||||
fxa-menu-message-backup-sync-secondary-text = Sync backs up most of your data so you can access it everywhere you use { -brand-short-name }.
|
|
||||||
fxa-menu-message-backup-sync-collapsed-text = Sync and back up data
|
|
||||||
|
|
||||||
fxa-menu-message-mobile-primary-text = Send tabs to your phone
|
|
||||||
fxa-menu-message-mobile-secondary-text = Pick up where you left off instantly when you sync your tabs with a mobile device.
|
|
||||||
fxa-menu-message-mobile-collapsed-text = Sync with your phone
|
|
||||||
|
|||||||
@@ -802,13 +802,11 @@ toolbarbutton[constrain-size="true"][cui-areatype="panel"] > .toolbarbutton-badg
|
|||||||
|
|
||||||
#fxa-menu-header-title {
|
#fxa-menu-header-title {
|
||||||
color: var(--arrowpanel-color);
|
color: var(--arrowpanel-color);
|
||||||
text-wrap: wrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#fxa-menu-header-description {
|
#fxa-menu-header-description {
|
||||||
color: var(--text-color-deemphasized);
|
color: var(--text-color-deemphasized);
|
||||||
font-weight: var(--font-weight-bold);
|
font-weight: var(--font-weight-bold);
|
||||||
text-wrap: wrap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#cta-menu-header-description {
|
#cta-menu-header-description {
|
||||||
|
|||||||
@@ -2676,46 +2676,6 @@ fxaClientAssociation:
|
|||||||
branch: user
|
branch: user
|
||||||
pref: identity.fxaccounts.telemetry.clientAssociationPing.enabled
|
pref: identity.fxaccounts.telemetry.clientAssociationPing.enabled
|
||||||
|
|
||||||
fxaAppMenuItem:
|
|
||||||
description: >-
|
|
||||||
Prefs to control the appearance and copy of the FxA sign-in button in the
|
|
||||||
AppMenu when signed out.
|
|
||||||
owner: mconley@mozilla.com
|
|
||||||
hasExposure: true
|
|
||||||
exposureDescription: >-
|
|
||||||
Exposure is recorded when the user is enrolled in an experiment using this
|
|
||||||
feature and the AppMenu on Firefox Desktop is opened.
|
|
||||||
variables:
|
|
||||||
ctaCopyVariant:
|
|
||||||
description: >-
|
|
||||||
One of the following values:
|
|
||||||
- control
|
|
||||||
- sync-devices
|
|
||||||
- backup-data
|
|
||||||
- backup-sync
|
|
||||||
- mobile
|
|
||||||
type: string
|
|
||||||
|
|
||||||
fxaAvatarMenuItem:
|
|
||||||
description: >-
|
|
||||||
Prefs to control the appearance and copy of the FxA sign-in button in the
|
|
||||||
FxA avatar menu when signed out.
|
|
||||||
owner: mconley@mozilla.com
|
|
||||||
hasExposure: true
|
|
||||||
exposureDescription: >-
|
|
||||||
Exposure is recorded when the user is enrolled in an experiment using this
|
|
||||||
feature and the FxA avatar menu on Firefox Desktop is opened.
|
|
||||||
variables:
|
|
||||||
ctaCopyVariant:
|
|
||||||
description: >-
|
|
||||||
One of the following values:
|
|
||||||
- control
|
|
||||||
- sync-devices
|
|
||||||
- backup-data
|
|
||||||
- backup-sync
|
|
||||||
- mobile
|
|
||||||
type: string
|
|
||||||
|
|
||||||
legacyHeartbeat:
|
legacyHeartbeat:
|
||||||
description: Normandy Heartbeat exposed to Nimbus
|
description: Normandy Heartbeat exposed to Nimbus
|
||||||
owner: beth@mozilla.com
|
owner: beth@mozilla.com
|
||||||
|
|||||||
Reference in New Issue
Block a user