Bug 1566870 - Fix FormAutoFill leak when focusing input in HTML frame r=kmag,MattN

Cleaning the FormAutofillContent on blur seems to fix the leak.

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Julian Descottes 2019-07-30 06:08:01 +00:00
Родитель b644b1615f
Коммит be46de6464
6 изменённых файлов: 90 добавлений и 0 удалений

Просмотреть файл

@ -60,6 +60,7 @@ var FormAutofillFrameScript = {
init() {
addEventListener("focusin", this);
addEventListener("focusout", this);
addEventListener("DOMFormBeforeSubmit", this);
addMessageListener("FormAutofill:PreviewProfile", this);
addMessageListener("FormAutofill:ClearForm", this);
@ -77,6 +78,10 @@ var FormAutofillFrameScript = {
this.onFocusIn(evt);
break;
}
case "focusout": {
this.onFocusOut();
break;
}
case "DOMFormBeforeSubmit": {
this.onDOMFormBeforeSubmit(evt);
break;
@ -115,6 +120,12 @@ var FormAutofillFrameScript = {
this._doIdentifyAutofillFields();
},
onFocusOut() {
// Update active input on blur to release references on the previously
// focused element in FormAutofillContent.
FormAutofillContent.updateActiveInput();
},
/**
* Handle the DOMFormBeforeSubmit event.
* @param {Event} evt

Просмотреть файл

@ -37,6 +37,7 @@ TESTING_JS_MODULES += ['test/fixtures/OSKeyStoreTestUtils.jsm']
BROWSER_CHROME_MANIFESTS += [
'test/browser/browser.ini',
'test/browser/creditCard/browser.ini',
'test/browser/focus-leak/browser.ini',
]
XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']

Просмотреть файл

@ -0,0 +1,10 @@
[DEFAULT]
support-files =
doc_iframe_typecontent_input_focus.xul
doc_iframe_typecontent_input_focus_frame.html
../head.js
# This test is used to detect a leak.
# Keep it isolated in a dedicated test folder to make sure the leak is cleaned
# up as a sideeffect of another test.
[browser_iframe_typecontent_input_focus.js]

Просмотреть файл

@ -0,0 +1,55 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const URL_ROOT =
"chrome://mochitests/content/browser/browser/extensions/formautofill/test/browser/focus-leak/";
const XUL_FRAME_URI = URL_ROOT + "doc_iframe_typecontent_input_focus.xul";
const INNER_HTML_FRAME_URI =
URL_ROOT + "doc_iframe_typecontent_input_focus_frame.html";
/**
* Check that focusing an input in a frame with type=content embedded in a xul
* document does not leak.
*/
add_task(async function() {
const doc = gBrowser.ownerDocument;
const linkedBrowser = gBrowser.selectedTab.linkedBrowser;
const browserContainer = gBrowser.getBrowserContainer(linkedBrowser);
info("Load the test page in a frame with type content");
const frame = doc.createXULElement("iframe");
frame.setAttribute("type", "content");
browserContainer.appendChild(frame);
info("Wait for the xul iframe to be loaded");
const onXulFrameLoad = BrowserTestUtils.waitForEvent(frame, "load", true);
frame.setAttribute("src", XUL_FRAME_URI);
await onXulFrameLoad;
const panelFrame = frame.contentDocument.querySelector("#html-iframe");
info("Wait for the html iframe to be loaded");
const onFrameLoad = BrowserTestUtils.waitForEvent(panelFrame, "load", true);
panelFrame.setAttribute("src", INNER_HTML_FRAME_URI);
await onFrameLoad;
info("Focus an input inside the iframe");
const focusMeInput = panelFrame.contentDocument.querySelector(".focusme");
const onFocus = BrowserTestUtils.waitForEvent(focusMeInput, "focus");
focusMeInput.focus();
await onFocus;
// This assert is not really meaningful, the main purpose of the test is
// to check against leaks.
is(
focusMeInput,
panelFrame.contentDocument.activeElement,
"The .focusme input is the active element"
);
// Stop the test without blurring the input, the cleanup should still prevent
// leaks in the test.
});

Просмотреть файл

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml">
<box>
<html:iframe id="html-iframe"/>
</box>
</window>

Просмотреть файл

@ -0,0 +1,6 @@
<!DOCTYPE html>
<html>
<body>
<input type="text" name="test" class="focusme">
</body>
</html>