/*

Siesta 5.6.1
Copyright(c) 2009-2022 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 : {

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

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

            // Synthetic events unfortunately don't trigger `change` events on blur of an INPUT
            if (me.type === 'synthetic') {
                me.makeSureBlurWorkaroundApplied(test.global.document)
            }
        },


        cleanup : function () {
            // Added check that global exists, made tests crash without
            this.global && this.global.document.__SIESTA_ONBLUR_WORKAROUND_APPLIED__ && this.global.document.__SIESTA_ONBLUR_WORKAROUND_APPLIED__.dispose()

            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
    }
};

Class('Siesta.Test.SimulatorOnBlurWorkaround', {
    does        : [
        Siesta.Test.Browser.Role.CanWorkWithKeyboard
    ],

    has : {
        document            : null,
        simulator           : null,
    },

    methods : {
        initialize : function () {
            this.SUPERARG(arguments)

            this.onBlur     = this.onBlur.bind(this)

            this.document.documentElement.addEventListener('blur', this.onBlur, true)
        },


        onBlur : function (event) {
            if (event.target && this.isTextInput(event.target)) {
                var inputFiresChangeAfterLosingFocus = Siesta.Project.Browser.FeatureSupport().supports.inputFiresChangeAfterLosingFocus &&
                    (!bowser.safari || !event.target.valueWasModifiedByBackspace)

                if (!inputFiresChangeAfterLosingFocus) {
                    this.simulator.maybeMimicChangeEvent(event.target)
                }
            }
        },


        dispose : function () {
            this.document.documentElement.removeEventListener('blur', this.onBlur, true)

            this.document.__SIESTA_ONBLUR_WORKAROUND_APPLIED__  = undefined
        }
    }
})