File: content.js

package info (click to toggle)
firefox-esr 68.10.0esr-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,143,932 kB
  • sloc: cpp: 5,227,879; javascript: 4,315,531; ansic: 2,467,042; python: 794,975; java: 349,993; asm: 232,034; xml: 228,320; sh: 82,008; lisp: 41,202; makefile: 22,347; perl: 15,555; objc: 5,277; cs: 4,725; yacc: 1,778; ada: 1,681; pascal: 1,673; lex: 1,417; exp: 527; php: 436; ruby: 225; awk: 162; sed: 53; csh: 44
file content (90 lines) | stat: -rw-r--r-- 3,028 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* 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/. */

/* This content script should work in any browser or iframe and should not
 * depend on the frame being contained in tabbrowser. */

/* eslint-env mozilla/frame-script */
/* eslint no-unused-vars: ["error", {args: "none"}] */

var { XPCOMUtils } = ChromeUtils.import(
  "resource://gre/modules/XPCOMUtils.jsm"
);

// BrowserChildGlobal
var global = this;

XPCOMUtils.defineLazyModuleGetters(this, {
  ContentMetaHandler: "resource:///modules/ContentMetaHandler.jsm",
  LoginFormFactory: "resource://gre/modules/LoginFormFactory.jsm",
  InsecurePasswordUtils: "resource://gre/modules/InsecurePasswordUtils.jsm",
  ContextMenuChild: "resource:///actors/ContextMenuChild.jsm",
});

XPCOMUtils.defineLazyGetter(this, "LoginManagerContent", () => {
  let tmp = {};
  ChromeUtils.import("resource://gre/modules/LoginManagerContent.jsm", tmp);
  tmp.LoginManagerContent.setupEventListeners(global);
  return tmp.LoginManagerContent;
});

// NOTE: Much of this logic is duplicated in BrowserCLH.js for Android.
addMessageListener("PasswordManager:fillForm", function(message) {
  // intercept if ContextMenu.jsm had sent a plain object for remote targets
  message.objects.inputElement = ContextMenuChild.getTarget(
    global,
    message,
    "inputElement"
  );
  LoginManagerContent.receiveMessage(message, content);
});

function shouldIgnoreLoginManagerEvent(event) {
  // If we have a null principal then prevent any more password manager code from running and
  // incorrectly using the document `location`.
  return event.target.nodePrincipal.isNullPrincipal;
}

addEventListener("DOMFormBeforeSubmit", function(event) {
  if (shouldIgnoreLoginManagerEvent(event)) {
    return;
  }
  LoginManagerContent.onDOMFormBeforeSubmit(event);
});
addEventListener("DOMFormHasPassword", function(event) {
  if (shouldIgnoreLoginManagerEvent(event)) {
    return;
  }
  LoginManagerContent.onDOMFormHasPassword(event);
  let formLike = LoginFormFactory.createFromForm(event.originalTarget);
  InsecurePasswordUtils.reportInsecurePasswords(formLike);
});
addEventListener("DOMInputPasswordAdded", function(event) {
  if (shouldIgnoreLoginManagerEvent(event)) {
    return;
  }
  LoginManagerContent.onDOMInputPasswordAdded(event, content);
  let formLike = LoginFormFactory.createFromField(event.originalTarget);
  InsecurePasswordUtils.reportInsecurePasswords(formLike);
});
addEventListener("DOMAutoComplete", function(event) {
  if (shouldIgnoreLoginManagerEvent(event)) {
    return;
  }
  LoginManagerContent.onDOMAutoComplete(event);
});

ContentMetaHandler.init(this);

// This is a temporary hack to prevent regressions (bug 1471327).
void content;

addEventListener(
  "DOMWindowFocus",
  function(event) {
    sendAsyncMessage("DOMWindowFocus", {});
  },
  false
);