Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MPP-3063] Reduce panel load time #498

Merged
merged 6 commits into from
Apr 20, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
190 changes: 103 additions & 87 deletions src/js/popup/popup.js
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,12 @@
}, false);

// Get masks and determine what to display
const masks = await popup.utilities.getMasks(getMasksOptions);
const { relayAddresses } = await browser.storage.local.get(
"relayAddresses"
);
maxxcrawford marked this conversation as resolved.
Show resolved Hide resolved

// If no masks are created, show onboarding prompt
if (masks.length === 0) {
if (relayAddresses.length === 0) {
maxxcrawford marked this conversation as resolved.
Show resolved Hide resolved
const noMasksCreatedPanel = document.querySelector(".fx-relay-no-masks-created");
noMasksCreatedPanel.classList.remove("is-hidden");
}
Expand All @@ -356,8 +358,7 @@
popup.panel.masks.utilities.buildMasksList();


// Remove loading state
document.body.classList.remove("is-loading");


},
search: {
Expand Down Expand Up @@ -475,85 +476,14 @@
const masks = await popup.utilities.getMasks(getMasksOptions);

const maskList = document.querySelector(".fx-relay-mask-list");

// Reset mask list
maskList.textContent = "";

masks.forEach(mask => {
const maskListItem = document.createElement("li");

// Attributes used to power search filtering
maskListItem.setAttribute("data-mask-address", mask.full_address);
maskListItem.setAttribute("data-mask-description", mask.description ?? "");
maskListItem.setAttribute("data-mask-used-on", mask.used_on ?? "");
maskListItem.setAttribute("data-mask-generated", mask.generated_for ?? "");

maskListItem.classList.add("fx-relay-mask-item");

const maskListItemNewMaskCreatedLabel = document.createElement("span");
maskListItemNewMaskCreatedLabel.textContent = browser.i18n.getMessage("labelMaskCreated");
maskListItemNewMaskCreatedLabel.classList.add("fx-relay-mask-item-new-mask-created");
maskListItem.appendChild(maskListItemNewMaskCreatedLabel);

const maskListItemAddressBar = document.createElement("div");
maskListItemAddressBar.classList.add("fx-relay-mask-item-address-bar");

const maskListItemAddressWrapper = document.createElement("div");
maskListItemAddressWrapper.classList.add("fx-relay-mask-item-address-wrapper");

const maskListItemLabel = document.createElement("span");
maskListItemLabel.classList.add("fx-relay-mask-item-label");
maskListItemLabel.textContent = mask.description;

// Append Label if it exists
if (mask.description !== "") {
maskListItemAddressWrapper.appendChild(maskListItemLabel);
}

const maskListItemAddress = document.createElement("div");
maskListItemAddress.classList.add("fx-relay-mask-item-address");
maskListItemAddress.textContent = mask.full_address;
maskListItemAddressWrapper.appendChild(maskListItemAddress);

// Add Mask Address Bar Contents
maskListItemAddressBar.appendChild(maskListItemAddressWrapper);

const maskListItemAddressActions = document.createElement("div");
maskListItemAddressActions.classList.add("fx-relay-mask-item-address-actions");

const maskListItemCopyButton = document.createElement("button");
maskListItemCopyButton.classList.add("fx-relay-mask-item-address-copy");
maskListItemCopyButton.setAttribute("data-mask-address", mask.full_address);

const maskListItemCopyButtonSuccessMessage = document.createElement("span");
maskListItemCopyButtonSuccessMessage.textContent = browser.i18n.getMessage("popupCopyMaskButtonCopied");
maskListItemCopyButtonSuccessMessage.classList.add("fx-relay-mask-item-address-copy-success");
maskListItemAddressActions.appendChild(maskListItemCopyButtonSuccessMessage);

maskListItemCopyButton.addEventListener("click", (e)=> {
e.preventDefault();
navigator.clipboard.writeText(e.target.dataset.maskAddress);
maskListItemCopyButtonSuccessMessage.classList.add("is-shown");
setTimeout(() => {
maskListItemCopyButtonSuccessMessage.classList.remove("is-shown")
}, 1000);
}, false);
maskListItemAddressActions.appendChild(maskListItemCopyButton);

const maskListItemToggleButton = document.createElement("button");
maskListItemToggleButton.classList.add("fx-relay-mask-item-address-toggle");
maskListItemToggleButton.addEventListener("click", ()=> {
// TODO: Add Toggle Function
}, false);
maskListItemToggleButton.setAttribute("data-mask-id", mask.id);
maskListItemToggleButton.setAttribute("data-mask-type", mask.mask_type);
maskListItemToggleButton.setAttribute("data-mask-address", mask.full_address);

// TODO: Add toggle button back
// maskListItemAddressActions.appendChild(maskListItemToggleButton);

maskListItemAddressBar.appendChild(maskListItemAddressActions);
maskListItem.appendChild(maskListItemAddressBar);
maskList.appendChild(maskListItem);

// Generate and append each mask item to the mask list
masks.forEach( mask => {
maxxcrawford marked this conversation as resolved.
Show resolved Hide resolved
const maskListItem = popup.panel.masks.utilities.buildMaskListItem(mask);
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Context: This function was getting really big. Broke out the buildMaskListItem iteration to make it easier to read.

maskList.append(maskListItem);
});

// Display "Mask created" temporary label when a new mask is created in the panel
Expand All @@ -577,6 +507,86 @@
popup.panel.masks.search.init();
}

// Remove loading state
document.body.classList.remove("is-loading");
Comment on lines +502 to +503
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Context: Moved this to the end of the buildMasksList() function. Previously, we were removing the loading state too early.


},
buildMaskListItem: (mask) => {
const maskListItem = document.createElement("li");

// Attributes used to power search filtering
maskListItem.setAttribute("data-mask-address", mask.full_address);
maskListItem.setAttribute("data-mask-description", mask.description ?? "");
maskListItem.setAttribute("data-mask-used-on", mask.used_on ?? "");
maskListItem.setAttribute("data-mask-generated", mask.generated_for ?? "");

maskListItem.classList.add("fx-relay-mask-item");

const maskListItemNewMaskCreatedLabel = document.createElement("span");
maskListItemNewMaskCreatedLabel.textContent = browser.i18n.getMessage("labelMaskCreated");
maskListItemNewMaskCreatedLabel.classList.add("fx-relay-mask-item-new-mask-created");
maskListItem.append(maskListItemNewMaskCreatedLabel);

const maskListItemAddressBar = document.createElement("div");
maskListItemAddressBar.classList.add("fx-relay-mask-item-address-bar");

const maskListItemAddressWrapper = document.createElement("div");
maskListItemAddressWrapper.classList.add("fx-relay-mask-item-address-wrapper");

const maskListItemLabel = document.createElement("span");
maskListItemLabel.classList.add("fx-relay-mask-item-label");
maskListItemLabel.textContent = mask.description;

// Append Label if it exists
if (mask.description !== "") {
maskListItemAddressWrapper.append(maskListItemLabel);
}

const maskListItemAddress = document.createElement("div");
maskListItemAddress.classList.add("fx-relay-mask-item-address");
maskListItemAddress.textContent = mask.full_address;
maskListItemAddressWrapper.append(maskListItemAddress);

// Add Mask Address Bar Contents
maskListItemAddressBar.append(maskListItemAddressWrapper);

const maskListItemAddressActions = document.createElement("div");
maskListItemAddressActions.classList.add("fx-relay-mask-item-address-actions");

const maskListItemCopyButton = document.createElement("button");
maskListItemCopyButton.classList.add("fx-relay-mask-item-address-copy");
maskListItemCopyButton.setAttribute("data-mask-address", mask.full_address);

const maskListItemCopyButtonSuccessMessage = document.createElement("span");
maskListItemCopyButtonSuccessMessage.textContent = browser.i18n.getMessage("popupCopyMaskButtonCopied");
maskListItemCopyButtonSuccessMessage.classList.add("fx-relay-mask-item-address-copy-success");
maskListItemAddressActions.append(maskListItemCopyButtonSuccessMessage);

maskListItemCopyButton.addEventListener("click", (e)=> {
e.preventDefault();
navigator.clipboard.writeText(e.target.dataset.maskAddress);
maskListItemCopyButtonSuccessMessage.classList.add("is-shown");
setTimeout(() => {
maskListItemCopyButtonSuccessMessage.classList.remove("is-shown")
}, 1000);
}, false);
maskListItemAddressActions.append(maskListItemCopyButton);

const maskListItemToggleButton = document.createElement("button");
maskListItemToggleButton.classList.add("fx-relay-mask-item-address-toggle");
maskListItemToggleButton.addEventListener("click", ()=> {
// TODO: Add Toggle Function
maxxcrawford marked this conversation as resolved.
Show resolved Hide resolved
}, false);
maskListItemToggleButton.setAttribute("data-mask-id", mask.id);
maskListItemToggleButton.setAttribute("data-mask-type", mask.mask_type);
maskListItemToggleButton.setAttribute("data-mask-address", mask.full_address);

// TODO: Add toggle button back
// maskListItemAddressActions.append(maskListItemToggleButton);
Comment on lines +576 to +577
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Disregard this TODO. It is part of #473


maskListItemAddressBar.append(maskListItemAddressActions);
maskListItem.append(maskListItemAddressBar);
return maskListItem;
},
getRemainingAliases: async () => {
const masks = await popup.utilities.getMasks();
Expand Down Expand Up @@ -869,15 +879,16 @@
getMasksOptions.fetchCustomMasks = isPremiumSubdomainSet;
}

const masks = await popup.utilities.getMasks(getMasksOptions);
// Use localStorage of Masks
const { relayAddresses } = await browser.storage.local.get("relayAddresses");

// Get Global Mask Stats data
const totalAliasesUsedVal = masks.length;
const totalAliasesUsedVal = relayAddresses.length;
let totalEmailsForwardedVal = 0;
let totalEmailsBlockedVal = 0;

// Loop through all masks to calculate totals
masks.forEach((mask) => {
relayAddresses.forEach((mask) => {
totalEmailsForwardedVal += mask.num_forwarded;
totalEmailsBlockedVal += mask.num_blocked;
});
Expand All @@ -898,10 +909,10 @@
});

// Check if any data applies to the current site
if ( popup.utilities.checkIfAnyMasksWereGeneratedOnCurrentWebsite(masks,currentPageHostName) ) {
if ( popup.utilities.checkIfAnyMasksWereGeneratedOnCurrentWebsite(relayAddresses,currentPageHostName) ) {

// Some masks are used on the current site. Time to calculate!
const filteredMasks = masks.filter(
const filteredMasks = relayAddresses.filter(
(mask) =>
mask.generated_for === currentPageHostName ||
popup.utilities.hasMaskBeenUsedOnCurrentSite(
Expand Down Expand Up @@ -1240,10 +1251,15 @@

if (serverStoragePref) {
try {
return await browser.runtime.sendMessage({
const masks = await browser.runtime.sendMessage({
method: "getAliasesFromServer",
options,
});

await browser.storage.local.set({"relayAddresses": masks});

return masks;

maxxcrawford marked this conversation as resolved.
Show resolved Hide resolved
} catch (error) {
console.warn(`getAliasesFromServer Error: ${error}`);

Expand Down
30 changes: 14 additions & 16 deletions src/js/relay.firefox.com/get_profile_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,29 +257,27 @@
if (siteStorageEnabled) {
// Sync alias data from server page.
// If local storage items exist AND have label metadata stored, sync it to the server.
const serverRelayAddresses = await apiRequest(relayApiUrlRelayAddresses);
const serverDomainAddresses = isPremiumUser
? await apiRequest(relayApiUrlDomainAddresses)
: [];
const remoteCopyOfServerMasks = await browser.runtime.sendMessage({
method: "getAliasesFromServer",
options: { fetchCustomMasks: isPremiumUser },
});

// let usage: This data may be overwritten when merging the local storage dataset with the server set.
let localCopyOfServerMasks = serverRelayAddresses.concat(serverDomainAddresses);
let localCopyOfServerMasks = remoteCopyOfServerMasks;

// Check/cache local storage
const localMasks = (await browser.storage.local.get(
"relayAddresses"
)).relayAddresses;
const { relayAddresses } = await browser.storage.local.get("relayAddresses");

if (
localMasks &&
localMasks.length > 0 &&
aliasesHaveStoredMetadata(localMasks) && // Make sure there is meta data in the local dataset
relayAddresses &&
relayAddresses.length > 0 &&
aliasesHaveStoredMetadata(relayAddresses) && // Make sure there is meta data in the local dataset
!aliasesHaveStoredMetadata(localCopyOfServerMasks) // Make sure there is no meta data in the server dataset
) {
await sendMetaDataToServer(localMasks);
await sendMetaDataToServer(relayAddresses);
localCopyOfServerMasks = getAliasesWithUpdatedMetadata(
localCopyOfServerMasks,
localMasks
relayAddresses
);
}

Expand All @@ -297,14 +295,14 @@
"firefox-private-relay-addon"
).addEventListener("website", async (event) => {
if (event.detail.type === "labelUpdate") {
const existingAddresses = (await browser.storage.local.get("relayAddresses")).relayAddresses;
const { relayAddresses } = await browser.storage.local.get("relayAddresses");
const update = event.detail;
const oldAddress = existingAddresses.find(existingAddress =>
const oldAddress = relayAddresses.find(existingAddress =>
existingAddress.id === update.alias.id &&
existingAddress.address === update.alias.address &&
existingAddress.domain === update.alias.domain
);
const newAddresses = existingAddresses.filter(existingAddress => existingAddress !== oldAddress);
const newAddresses = relayAddresses.filter(existingAddress => existingAddress !== oldAddress);
newAddresses.push({
...oldAddress,
description: update.newLabel,
Expand Down
Loading