Welcome to mirror list, hosted at ThFree Co, Russian Federation.

FillPassword.js « Client « Controller « js « src - github.com/marius-wieschollek/passwords-webextension.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c227b64d8b9dba459c6560effdae3de89b84884c (plain)
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
91
92
93
94
95
96
97
98
99
100
101
102
import FormService from '@js/Services/FormService';
import AbstractController from '@js/Controller/AbstractController';
import ErrorManager from "@js/Manager/ErrorManager";

export default class FillPassword extends AbstractController {

    /**
     *
     * @param {Message} message
     * @param {Message} reply
     */
    async execute(message, reply) {
        try {
            let result = this._fillPassword(message.getPayload().user, message.getPayload().password, message.getPayload().submit);

            if(result) reply.setPayload(true);
        } catch(e) {
            ErrorManager.logError(e)
        }
    }

    /**
     *
     * @param {String} user
     * @param {String} password
     * @param {Boolean} trySubmit
     * @returns {Boolean}
     */
    _fillPassword(user, password, trySubmit) {
        let forms = new FormService().getLoginFields();
        if(forms.length === 0) return false;

        for(let i = 0; i < forms.length; i++) {
            let form = forms[i];
            if(form.user) this._insertTextIntoField(form.user, user);
            this._insertTextIntoField(form.pass, password);

            if(!trySubmit || forms.length !== 1) continue;
            if(form.submit) {
                this._simulateClick(form.submit);
            } else if(form.secure) {
                this._simulateEnter(form.pass);
            }
        }

        return true;
    }

    /**
     *
     * @param {Element} field
     * @param {String} value
     * @private
     */
    _insertTextIntoField(field, value) {
        let bubbleEvent   = {bubbles: true, cancelable: true},
            noBubbleEvent = {bubbles: false, cancelable: true},
            insertEvent   = {bubbles: true, cancelable: false, inputType: 'inserting', data: value};

        field.dispatchEvent(new FocusEvent('focus', noBubbleEvent));
        field.dispatchEvent(new FocusEvent('focusin', bubbleEvent));
        field.value = value;
        field.dispatchEvent(new InputEvent('input', insertEvent));
        field.dispatchEvent(new Event('change', insertEvent));
        field.dispatchEvent(new FocusEvent('focusout', bubbleEvent));
        field.dispatchEvent(new FocusEvent('blur', noBubbleEvent));
    }

    /**
     *
     * @param {HTMLElement} element
     * @private
     */
    _simulateClick(element) {
        let left          = element.offsetLeft + Math.round(element.offsetWidth / 2),
            top           = element.offsetTop + Math.round(element.offsetHeight / 2),
            bubbleEvent   = {screenX: left, screenY: top, clientX: left, clientY: top, bubbles: true, cancelable: true},
            noBubbleEvent = {screenX: left, screenY: top, clientX: left, clientY: top, bubbles: false, cancelable: false};

        element.dispatchEvent(new MouseEvent('mouseover', bubbleEvent));
        element.dispatchEvent(new MouseEvent('mouseenter', noBubbleEvent));
        element.dispatchEvent(new MouseEvent('mousemove', bubbleEvent));
        element.dispatchEvent(new MouseEvent('mousedown', bubbleEvent));
        element.dispatchEvent(new MouseEvent('click', bubbleEvent));
        element.dispatchEvent(new MouseEvent('mouseup', bubbleEvent));
        element.dispatchEvent(new MouseEvent('mousemove', bubbleEvent));
        element.dispatchEvent(new MouseEvent('mouseleave', noBubbleEvent));
        element.dispatchEvent(new MouseEvent('mouseout', bubbleEvent));
    }

    /**
     *
     * @param {HTMLElement} element
     * @private
     */
    _simulateEnter(element) {
        let data = {key: 'Enter', code: 'Enter', which: 13, keyCode: 13, bubbles: false, cancelable: true};
        element.dispatchEvent(new KeyboardEvent('keydown', data));
        element.dispatchEvent(new KeyboardEvent('keypress', data));
        element.dispatchEvent(new KeyboardEvent('keyup', data));
    }
}