    /*

    Siesta 5.3.0
    Copyright(c) 2009-2019 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
            }
        }
    });