forked from mirrors/gecko-dev
MozReview-Commit-ID: Eo3KSBoaotr --HG-- extra : rebase_source : 7ef03e929e5e2320dd5ef692326c4fb31decd719
102 lines
2.9 KiB
JavaScript
102 lines
2.9 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/. */
|
|
|
|
/*
|
|
* Form Autofill frame script.
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
/* eslint-env mozilla/frame-script */
|
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
|
|
|
Cu.import("resource://formautofill/FormAutofillContent.jsm");
|
|
Cu.import("resource://formautofill/FormAutofillUtils.jsm");
|
|
|
|
/**
|
|
* Handles content's interactions for the frame.
|
|
*
|
|
* NOTE: Declares it by "var" to make it accessible in unit tests.
|
|
*/
|
|
var FormAutofillFrameScript = {
|
|
_nextHandleElement: null,
|
|
_alreadyDOMContentLoaded: false,
|
|
_hasDOMContentLoadedHandler: false,
|
|
_hasPendingTask: false,
|
|
|
|
_doIdentifyAutofillFields() {
|
|
if (this._hasPendingTask) {
|
|
return;
|
|
}
|
|
this._hasPendingTask = true;
|
|
|
|
setTimeout(() => {
|
|
FormAutofillContent.identifyAutofillFields(this._nextHandleElement);
|
|
this._hasPendingTask = false;
|
|
this._nextHandleElement = null;
|
|
});
|
|
},
|
|
|
|
init() {
|
|
addEventListener("focusin", this);
|
|
addMessageListener("FormAutofill:PreviewProfile", this);
|
|
addMessageListener("FormAutoComplete:PopupClosed", this);
|
|
addMessageListener("FormAutoComplete:PopupOpened", this);
|
|
},
|
|
|
|
handleEvent(evt) {
|
|
if (!evt.isTrusted || !FormAutofillUtils.isAutofillEnabled) {
|
|
return;
|
|
}
|
|
|
|
let element = evt.target;
|
|
if (!FormAutofillUtils.isFieldEligibleForAutofill(element)) {
|
|
return;
|
|
}
|
|
this._nextHandleElement = element;
|
|
|
|
if (!this._alreadyDOMContentLoaded) {
|
|
let doc = element.ownerDocument;
|
|
if (doc.readyState === "loading") {
|
|
if (!this._hasDOMContentLoadedHandler) {
|
|
this._hasDOMContentLoadedHandler = true;
|
|
doc.addEventListener("DOMContentLoaded", () => this._doIdentifyAutofillFields(), {once: true});
|
|
}
|
|
return;
|
|
}
|
|
this._alreadyDOMContentLoaded = true;
|
|
}
|
|
|
|
this._doIdentifyAutofillFields();
|
|
},
|
|
|
|
receiveMessage(message) {
|
|
if (!FormAutofillUtils.isAutofillEnabled) {
|
|
return;
|
|
}
|
|
|
|
const doc = content.document;
|
|
const {chromeEventHandler} = doc.ownerGlobal.getInterface(Ci.nsIDocShell);
|
|
|
|
switch (message.name) {
|
|
case "FormAutofill:PreviewProfile": {
|
|
FormAutofillContent.previewProfile(doc);
|
|
break;
|
|
}
|
|
case "FormAutoComplete:PopupClosed": {
|
|
FormAutofillContent.previewProfile(doc);
|
|
chromeEventHandler.removeEventListener("keydown", FormAutofillContent._onKeyDown,
|
|
{capturing: true});
|
|
break;
|
|
}
|
|
case "FormAutoComplete:PopupOpened": {
|
|
chromeEventHandler.addEventListener("keydown", FormAutofillContent._onKeyDown,
|
|
{capturing: true});
|
|
}
|
|
}
|
|
},
|
|
};
|
|
|
|
FormAutofillFrameScript.init();
|