gecko-dev/browser/components/protections/content/monitor-card.js

175 lines
5.6 KiB
JavaScript

/* 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 mozilla/frame-script */
const MONITOR_URL = RPMGetStringPref(
"browser.contentblocking.report.monitor.url",
""
);
const MONITOR_SIGN_IN_URL = RPMGetStringPref(
"browser.contentblocking.report.monitor.sign_in_url",
""
);
const HOW_IT_WORKS_URL_PREF = RPMGetFormatURLPref(
"browser.contentblocking.report.monitor.how_it_works.url"
);
const MONITOR_PREFERENCES_URL = RPMGetFormatURLPref(
"browser.contentblocking.report.monitor.preferences_url"
);
const MONITOR_HOME_PAGE_URL = RPMGetFormatURLPref(
"browser.contentblocking.report.monitor.home_page_url"
);
export default class MonitorClass {
constructor(document) {
this.doc = document;
}
init() {
// Wait for monitor data and display the card.
this.getMonitorData();
let monitorReportLink = this.doc.getElementById("full-report-link");
monitorReportLink.addEventListener("click", () => {
this.doc.sendTelemetryEvent("click", "mtr_report_link");
RPMSendAsyncMessage("ClearMonitorCache");
});
let monitorAboutLink = this.doc.getElementById("monitor-link");
monitorAboutLink.addEventListener("click", () => {
this.doc.sendTelemetryEvent("click", "mtr_about_link");
});
const storedEmailLink = this.doc.querySelector(".monitor-block.email a");
storedEmailLink.href = MONITOR_PREFERENCES_URL;
const knownBreachesLink = this.doc.querySelector(
".monitor-block.breaches a"
);
knownBreachesLink.href = MONITOR_HOME_PAGE_URL;
const exposedPasswordsLink = this.doc.querySelector(
".monitor-block.passwords a"
);
exposedPasswordsLink.href = MONITOR_HOME_PAGE_URL;
}
/**
* Retrieves the monitor data and displays this data in the card.
**/
getMonitorData() {
RPMSendQuery("FetchMonitorData", {}).then(monitorData => {
// Once data for the user is retrieved, display the monitor card.
this.buildContent(monitorData);
// Show the Monitor card.
const monitorUI = this.doc.querySelector(".card.monitor-card.loading");
monitorUI.classList.remove("loading");
});
}
buildContent(monitorData) {
const headerContent = this.doc.querySelector(
"#monitor-header-content span"
);
const monitorCard = this.doc.querySelector(".card.monitor-card");
if (!monitorData.error) {
monitorCard.classList.add("has-logins");
headerContent.setAttribute(
"data-l10n-id",
"monitor-header-content-signed-in"
);
this.renderContentForUserWithAccount(monitorData);
} else {
monitorCard.classList.add("no-logins");
const signUpForMonitorLink = this.doc.getElementById(
"sign-up-for-monitor-link"
);
signUpForMonitorLink.href = this.buildMonitorUrl(monitorData.userEmail);
signUpForMonitorLink.setAttribute("data-l10n-id", "monitor-sign-up");
headerContent.setAttribute(
"data-l10n-id",
"monitor-header-content-no-account"
);
signUpForMonitorLink.addEventListener("click", () => {
this.doc.sendTelemetryEvent("click", "mtr_signup_button");
});
}
}
/**
* Builds the appropriate URL that takes the user to the Monitor website's
* sign-up/sign-in page.
*
* @param {String|null} email
* Optional. The email used to direct the user to the Monitor website's OAuth
* sign-in flow. If null, then direct user to just the Monitor website.
*
* @return URL to Monitor website.
*/
buildMonitorUrl(email = null) {
return email
? `${MONITOR_SIGN_IN_URL}${encodeURIComponent(email)}`
: MONITOR_URL;
}
renderContentForUserWithAccount(monitorData) {
const monitorCardBody = this.doc.querySelector(
".card.monitor-card .card-body"
);
monitorCardBody.classList.remove("hidden");
const monitorLinkTag = this.doc.getElementById("monitor-inline-link");
monitorLinkTag.href = this.buildMonitorUrl(monitorData.userEmail);
const howItWorksLink = this.doc.getElementById("monitor-link");
howItWorksLink.href = HOW_IT_WORKS_URL_PREF;
const storedEmail = this.doc.querySelector(
"span[data-type='stored-emails']"
);
const knownBreaches = this.doc.querySelector(
"span[data-type='known-breaches']"
);
const exposedPasswords = this.doc.querySelector(
"span[data-type='exposed-passwords']"
);
storedEmail.textContent = monitorData.monitoredEmails;
knownBreaches.textContent = monitorData.numBreaches;
exposedPasswords.textContent = monitorData.passwords;
const infoMonitoredAddresses = this.doc.getElementById(
"info-monitored-addresses"
);
infoMonitoredAddresses.setAttribute(
"data-l10n-args",
JSON.stringify({ count: monitorData.monitoredEmails })
);
infoMonitoredAddresses.setAttribute(
"data-l10n-id",
"info-monitored-emails"
);
const infoKnownBreaches = this.doc.getElementById("info-known-breaches");
infoKnownBreaches.setAttribute(
"data-l10n-args",
JSON.stringify({ count: monitorData.numBreaches })
);
infoKnownBreaches.setAttribute("data-l10n-id", "info-known-breaches-found");
const infoExposedPasswords = this.doc.getElementById(
"info-exposed-passwords"
);
infoExposedPasswords.setAttribute(
"data-l10n-args",
JSON.stringify({ count: monitorData.passwords })
);
infoExposedPasswords.setAttribute(
"data-l10n-id",
"info-exposed-passwords-found"
);
}
}