зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
b644b1615f
Коммит
be46de6464
|
@ -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>
|
Загрузка…
Ссылка в новой задаче