Skip to content

Commit

Permalink
Bug 1599752 - Partial back out of changeset c72321ba48b8 to remove su…
Browse files Browse the repository at this point in the history
…bdomain suggestions in the context menu.

Differential Revision: https://phabricator.services.mozilla.com/D54937

--HG--
extra : moz-landing-system : lando
  • Loading branch information
mnoorenberghe committed Nov 27, 2019
1 parent 8ea82ea commit 7dca7da
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 260 deletions.
6 changes: 1 addition & 5 deletions browser/base/content/nsContextMenu.js
Expand Up @@ -954,14 +954,10 @@ class nsContextMenu {
}

let formOrigin = LoginHelper.getLoginOrigin(documentURI.spec);
let formActionOrigin = LoginHelper.getLoginOrigin(
loginFillInfo.formActionOrigin
);
let fragment = nsContextMenu.LoginManagerContextMenu.addLoginsToMenu(
this.targetIdentifier,
this.browser,
formOrigin,
formActionOrigin
formOrigin
);
let isGeneratedPasswordEnabled =
LoginHelper.generationAvailable && LoginHelper.generationEnabled;
Expand Down
9 changes: 0 additions & 9 deletions browser/themes/linux/browser.css
Expand Up @@ -458,15 +458,6 @@ notification[value="translation"] menulist > .menulist-dropmarker {
margin-inline-end: 0 !important;
}

#fill-login-popup > menucaption {
color: GrayText;
font-weight: normal;
}

#fill-login-popup > menucaption > .menu-iconic-left {
display: none;
}

.webextension-popup-browser,
.webextension-popup-stack {
border-radius: inherit;
Expand Down
6 changes: 0 additions & 6 deletions browser/themes/osx/browser.css
Expand Up @@ -801,12 +801,6 @@ menulist.translate-infobar-element > .menulist-dropmarker {
padding-right: 0;
}

#fill-login-popup > menucaption {
color: -moz-mac-menushadow;
font-weight: normal;
padding-inline-start: 11px;
}

.cui-widget-panelview[id^=PanelUI-webext-] {
border-radius: 3.5px;
}
Expand Down
13 changes: 0 additions & 13 deletions browser/themes/windows/browser.css
Expand Up @@ -832,19 +832,6 @@ panel[touchmode] .PanelUI-subView #appMenu-zoom-controls > .subviewbutton-iconic
margin-top: -4px;
}

#fill-login-popup > menucaption {
color: GrayText;
}

/* Match the treatment of menucaption used for <optgroup> */
#fill-login-popup > menucaption > .menu-iconic-left {
display: none
}

#fill-login-popup > menucaption > .menu-iconic-text {
-moz-appearance: menuitemtext
}

%include browser-aero.css

@media (-moz-os-version: windows-win7) {
Expand Down
16 changes: 12 additions & 4 deletions toolkit/components/passwordmgr/LoginAutoCompleteResult.jsm
Expand Up @@ -65,8 +65,6 @@ XPCOMUtils.defineLazyGetter(this, "passwordMgrBundle", () => {
function loginSort(formHostPort, a, b) {
let maybeHostPortA = LoginHelper.maybeGetHostPortForURL(a.origin);
let maybeHostPortB = LoginHelper.maybeGetHostPortForURL(b.origin);

// Exact hostPort matches should appear first.
if (formHostPort == maybeHostPortA && formHostPort != maybeHostPortB) {
return -1;
}
Expand All @@ -84,8 +82,18 @@ function loginSort(formHostPort, a, b) {
}
}

// Finally sort by username.
return a.username.localeCompare(b.username);
let userA = a.username.toLowerCase();
let userB = b.username.toLowerCase();

if (userA < userB) {
return -1;
}

if (userA > userB) {
return 1;
}

return 0;
}

function findDuplicates(loginList) {
Expand Down
3 changes: 0 additions & 3 deletions toolkit/components/passwordmgr/LoginManagerChild.jsm
Expand Up @@ -2256,10 +2256,7 @@ this.LoginManagerChild = class LoginManagerChild extends JSWindowActorChild {
usernameField = aField;
}

let form = LoginFormFactory.createFromField(aField);

return {
formActionOrigin: LoginHelper.getFormActionOrigin(form),
usernameField: {
found: !!usernameField,
disabled:
Expand Down
110 changes: 34 additions & 76 deletions toolkit/components/passwordmgr/LoginManagerContextMenu.jsm
Expand Up @@ -40,50 +40,18 @@ this.LoginManagerContextMenu = {
* The origin of the document that the context menu was activated from.
* This isn't the same as the browser's top-level document origin
* when subframes are involved.
* @param {string} formActionOrigin
* The origin of the LoginForm's action.
* @returns {DocumentFragment} a document fragment with all the login items.
*/
addLoginsToMenu(
inputElementIdentifier,
browser,
formOrigin,
formActionOrigin
) {
let foundLogins = this._findLogins(formOrigin, formActionOrigin);
addLoginsToMenu(inputElementIdentifier, browser, formOrigin) {
let foundLogins = this._findLogins(formOrigin);

if (!foundLogins.length) {
return null;
}

let fragment = browser.ownerDocument.createDocumentFragment();
let duplicateUsernames = this._findDuplicates(foundLogins);
// Default `lastDisplayOrigin` to the hostPort of the form so that we don't
// show a menucaption above logins that are direct matches for this document.
let lastDisplayOrigin = LoginHelper.maybeGetHostPortForURL(formOrigin);
let lastMenuCaption = null;
for (let login of foundLogins) {
// Add a section header containing the displayOrigin above logins that
// aren't matches for the form's origin.
if (lastDisplayOrigin != login.displayOrigin) {
if (fragment.children.length) {
let menuSeparator = fragment.ownerDocument.createXULElement(
"menuseparator"
);
menuSeparator.className = "context-login-item";
fragment.appendChild(menuSeparator);
}

lastMenuCaption = fragment.ownerDocument.createXULElement(
"menucaption"
);
lastMenuCaption.setAttribute("role", "group");
lastMenuCaption.label = login.displayOrigin;
lastMenuCaption.className = "context-login-item";

fragment.appendChild(lastMenuCaption);
}

let item = fragment.ownerDocument.createXULElement("menuitem");

let username = login.username;
Expand All @@ -98,16 +66,8 @@ this.LoginManagerContextMenu = {
);
username = this._getLocalizedString("loginHostAge", [username, time]);
}
item.id = "login-" + login.guid;
item.setAttribute("label", username);
item.setAttribute("class", "context-login-item");
if (lastMenuCaption) {
item.setAttribute("aria-level", "2");
lastMenuCaption.setAttribute(
"aria-owns",
lastMenuCaption.getAttribute("aria-owns") + item.id + " "
);
}

// login is bound so we can keep the reference to each object.
item.addEventListener(
Expand All @@ -123,7 +83,6 @@ this.LoginManagerContextMenu = {
);

fragment.appendChild(item);
lastDisplayOrigin = login.displayOrigin;
}

return fragment;
Expand Down Expand Up @@ -155,52 +114,51 @@ this.LoginManagerContextMenu = {
});
},

loginSort(formHostPort, a, b) {
let maybeHostPortA = LoginHelper.maybeGetHostPortForURL(a.origin);
let maybeHostPortB = LoginHelper.maybeGetHostPortForURL(b.origin);

// Exact hostPort matches should appear first.
if (formHostPort == maybeHostPortA && formHostPort != maybeHostPortB) {
return -1;
}
if (formHostPort != maybeHostPortA && formHostPort == maybeHostPortB) {
return 1;
}

// Next sort by displayOrigin (which contains the httpRealm)
if (a.displayOrigin !== b.displayOrigin) {
return a.displayOrigin.localeCompare(b.displayOrigin);
}

// Finally sort by username within the displayOrigin.
return a.username.localeCompare(b.username);
},

/**
* Find logins for the specified origin.
* Find logins for the specified origin..
*
* @param {string} formOrigin
* Origin of the logins we want to find that has be sanitized by `getLoginOrigin`.
* This isn't the same as the browser's top-level document URI
* when subframes are involved.
* @param {string} formActionOrigin
*
* @returns {nsILoginInfo[]} a login list
*/
_findLogins(formOrigin, formActionOrigin) {
_findLogins(formOrigin) {
let searchParams = {
acceptDifferentSubdomains: LoginHelper.includeOtherSubdomainsInLookup,
formActionOrigin,
ignoreActionAndRealm: true,
origin: formOrigin,
schemeUpgrades: LoginHelper.schemeUpgrades,
};

let logins = LoginManagerParent.searchAndDedupeLogins(
formOrigin,
searchParams
let logins = LoginHelper.searchLoginsWithObject(searchParams);
let resolveBy = ["scheme", "timePasswordChanged"];
logins = LoginHelper.dedupeLogins(
logins,
["username", "password"],
resolveBy,
formOrigin
);

let formHostPort = LoginHelper.maybeGetHostPortForURL(formOrigin);
logins.sort(this.loginSort.bind(null, formHostPort));
// Sort logins in alphabetical order and by date.
logins.sort((loginA, loginB) => {
// Sort alphabetically
let result = loginA.username.localeCompare(loginB.username);
if (result) {
// Forces empty logins to be at the end
if (!loginA.username) {
return 1;
}
if (!loginB.username) {
return -1;
}
return result;
}

// Same username logins are sorted by last change date
let metaA = loginA.QueryInterface(Ci.nsILoginMetaInfo);
let metaB = loginB.QueryInterface(Ci.nsILoginMetaInfo);
return metaB.timePasswordChanged - metaA.timePasswordChanged;
});

return logins;
},

Expand Down
Expand Up @@ -315,7 +315,7 @@ add_task(async function fill_generated_password_with_matching_logins() {
let popupMenu = document.getElementById("fill-login-popup");
let firstLoginItem = popupMenu.getElementsByClassName(
"context-login-item"
)[1];
)[0];
firstLoginItem.doCommand();

await passwordChangedPromise;
Expand Down

0 comments on commit 7dca7da

Please sign in to comment.