/*

Siesta 5.3.1
Copyright(c) 2009-2020 Bryntum AB
https://bryntum.com/contact
https://bryntum.com/products/siesta/license

*/
Class('Siesta.Test.Simulator', {

    does        : [
        Siesta.Util.Role.CanGetType,
        Siesta.Test.Browser.Role.CanRebindJQueryContext,

        Siesta.Test.Simulate.Event,
        Siesta.Test.Simulate.Mouse,
        Siesta.Test.Simulate.Keyboard,
        Siesta.Test.Simulate.Touch
    ],

    has : {
        type            : 'synthetic',

        test            : null,
        global          : null
    },


    methods : {

        initialize : function () {
            this.SUPER();

            this.onBlur = this.onBlur.bind(this);
        },

        onTestLaunch : function (test) {
            var me = this;

            me.test       = test
            me.global     = test.global

            // Synthetic events unfortunately doesn't trigger change events on blur of an INPUT
            if (me.type === 'synthetic') {
                var inputFiresChangeAfterLosingFocus  = Siesta.Project.Browser.FeatureSupport().supports.inputFiresChangeAfterLosingFocus;

                if (!inputFiresChangeAfterLosingFocus) {
                    me.global.document.documentElement.addEventListener('blur', me.onBlur, true);
                }
            }
        },

        onBlur : function (e) {
            if (e.target && this.test.isTextInput(e.target)) {
                this.maybeMimicChangeEvent(e.target);
            }
        },

        cleanup : function () {
            // Added check that global exists, made tests crash without
            this.global && this.global.document.documentElement.removeEventListener('blur', this.onBlur, true);

            this.test       = null
            this.global     = null
        },

        setSpeed : function (name) {
            Joose.O.extend(this, Siesta.Test.Simulator.speedPresets[name]);
        }
    }
});

Siesta.Test.Simulator.speedPresets = {
    slow : {
        actionDelay        : 100,
            afterActionDelay   : 100,
            dragDelay          : 25,
            pathBatchSize      : 5,
            mouseMovePrecision : 1,
            mouseDragPrecision : 1
    },

    speedRun : {
        actionDelay      : 1,
            afterActionDelay : 100,
            dragDelay        : 10,
            pathBatchSize    : 30,
            mouseMovePrecision : 1,
            mouseDragPrecision : 1
    },

    turboMode : {
        actionDelay        : 1,
            afterActionDelay   : 1,
            dragDelay          : 0,
            pathBatchSize      : 100,
            mouseMovePrecision : Infinity,
            mouseDragPrecision : Infinity
    }
};