From aa425ab95d6be06337ccb435c1405f6ac38ba8b9 Mon Sep 17 00:00:00 2001 From: Mike Sherov Date: Fri, 22 Aug 2014 17:01:50 -0400 Subject: Build: Pull in jquery.simulate.js from Bower Fixes #10563 --- Gruntfile.js | 3 + bower.json | 1 + external/jquery-simulate/LICENSE.txt | 37 ++++ external/jquery-simulate/jquery.simulate.js | 330 ++++++++++++++++++++++++++++ tests/jquery.simulate.js | 328 --------------------------- tests/unit/accordion/accordion.html | 2 +- tests/unit/autocomplete/autocomplete.html | 2 +- tests/unit/button/button.html | 2 +- tests/unit/core/core.html | 2 +- tests/unit/core/core_deprecated.html | 2 +- tests/unit/datepicker/datepicker.html | 2 +- tests/unit/dialog/dialog.html | 2 +- tests/unit/draggable/draggable.html | 2 +- tests/unit/droppable/droppable.html | 2 +- tests/unit/effects/effects.html | 2 +- tests/unit/menu/menu.html | 2 +- tests/unit/position/position.html | 2 +- tests/unit/progressbar/progressbar.html | 2 +- tests/unit/resizable/resizable.html | 2 +- tests/unit/selectable/selectable.html | 2 +- tests/unit/selectmenu/selectmenu.html | 2 +- tests/unit/slider/slider.html | 2 +- tests/unit/sortable/sortable.html | 2 +- tests/unit/spinner/spinner.html | 2 +- tests/unit/tabs/tabs.html | 2 +- tests/unit/tooltip/tooltip.html | 2 +- tests/unit/widget/widget.html | 2 +- 27 files changed, 393 insertions(+), 350 deletions(-) create mode 100644 external/jquery-simulate/LICENSE.txt create mode 100644 external/jquery-simulate/jquery.simulate.js delete mode 100644 tests/jquery.simulate.js diff --git a/Gruntfile.js b/Gruntfile.js index a3d545ce3..72236561f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -232,6 +232,9 @@ grunt.initConfig({ "jquery-mousewheel/jquery.mousewheel.js": "jquery-mousewheel/jquery.mousewheel.js", "jquery-mousewheel/LICENSE.txt": "jquery-mousewheel/LICENSE.txt", + "jquery-simulate/jquery.simulate.js": "jquery-simulate/jquery.simulate.js", + "jquery-simulate/LICENSE.txt": "jquery-simulate/LICENSE.txt", + "jshint/jshint.js": "jshint/dist/jshint.js", "jshint/LICENSE": "jshint/LICENSE", diff --git a/bower.json b/bower.json index 6cff526ef..6067e9512 100644 --- a/bower.json +++ b/bower.json @@ -12,6 +12,7 @@ }, "devDependencies": { "jquery-mousewheel": "3.1.12", + "jquery-simulate": "1.0.0", "jshint": "2.4.4", "qunit": "1.14.0", diff --git a/external/jquery-simulate/LICENSE.txt b/external/jquery-simulate/LICENSE.txt new file mode 100644 index 000000000..24cad742e --- /dev/null +++ b/external/jquery-simulate/LICENSE.txt @@ -0,0 +1,37 @@ +Copyright 2007, 2014 jQuery Foundation and other contributors, +https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-simulate + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. diff --git a/external/jquery-simulate/jquery.simulate.js b/external/jquery-simulate/jquery.simulate.js new file mode 100644 index 000000000..4a96cc310 --- /dev/null +++ b/external/jquery-simulate/jquery.simulate.js @@ -0,0 +1,330 @@ + /*! + * jQuery Simulate v1.0.0 - simulate browser mouse and keyboard events + * https://github.com/jquery/jquery-simulate + * + * Copyright 2012 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * Date: 2014-08-22 + */ + +;(function( $, undefined ) { + +var rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/; + +$.fn.simulate = function( type, options ) { + return this.each(function() { + new $.simulate( this, type, options ); + }); +}; + +$.simulate = function( elem, type, options ) { + var method = $.camelCase( "simulate-" + type ); + + this.target = elem; + this.options = options; + + if ( this[ method ] ) { + this[ method ](); + } else { + this.simulateEvent( elem, type, options ); + } +}; + +$.extend( $.simulate, { + + keyCode: { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + }, + + buttonCode: { + LEFT: 0, + MIDDLE: 1, + RIGHT: 2 + } +}); + +$.extend( $.simulate.prototype, { + + simulateEvent: function( elem, type, options ) { + var event = this.createEvent( type, options ); + this.dispatchEvent( elem, type, event, options ); + }, + + createEvent: function( type, options ) { + if ( rkeyEvent.test( type ) ) { + return this.keyEvent( type, options ); + } + + if ( rmouseEvent.test( type ) ) { + return this.mouseEvent( type, options ); + } + }, + + mouseEvent: function( type, options ) { + var event, eventDoc, doc, body; + options = $.extend({ + bubbles: true, + cancelable: (type !== "mousemove"), + view: window, + detail: 0, + screenX: 0, + screenY: 0, + clientX: 1, + clientY: 1, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + button: 0, + relatedTarget: undefined + }, options ); + + if ( document.createEvent ) { + event = document.createEvent( "MouseEvents" ); + event.initMouseEvent( type, options.bubbles, options.cancelable, + options.view, options.detail, + options.screenX, options.screenY, options.clientX, options.clientY, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, + options.button, options.relatedTarget || document.body.parentNode ); + + // IE 9+ creates events with pageX and pageY set to 0. + // Trying to modify the properties throws an error, + // so we define getters to return the correct values. + if ( event.pageX === 0 && event.pageY === 0 && Object.defineProperty ) { + eventDoc = event.relatedTarget.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + Object.defineProperty( event, "pageX", { + get: function() { + return options.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + } + }); + Object.defineProperty( event, "pageY", { + get: function() { + return options.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + }); + } + } else if ( document.createEventObject ) { + event = document.createEventObject(); + $.extend( event, options ); + // standards event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ff974877(v=vs.85).aspx + // old IE event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ms533544(v=vs.85).aspx + // so we actually need to map the standard back to oldIE + event.button = { + 0: 1, + 1: 4, + 2: 2 + }[ event.button ] || ( event.button === -1 ? 0 : event.button ); + } + + return event; + }, + + keyEvent: function( type, options ) { + var event; + options = $.extend({ + bubbles: true, + cancelable: true, + view: window, + ctrlKey: false, + altKey: false, + shiftKey: false, + metaKey: false, + keyCode: 0, + charCode: undefined + }, options ); + + if ( document.createEvent ) { + try { + event = document.createEvent( "KeyEvents" ); + event.initKeyEvent( type, options.bubbles, options.cancelable, options.view, + options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, + options.keyCode, options.charCode ); + // initKeyEvent throws an exception in WebKit + // see: http://stackoverflow.com/questions/6406784/initkeyevent-keypress-only-works-in-firefox-need-a-cross-browser-solution + // and also https://bugs.webkit.org/show_bug.cgi?id=13368 + // fall back to a generic event until we decide to implement initKeyboardEvent + } catch( err ) { + event = document.createEvent( "Events" ); + event.initEvent( type, options.bubbles, options.cancelable ); + $.extend( event, { + view: options.view, + ctrlKey: options.ctrlKey, + altKey: options.altKey, + shiftKey: options.shiftKey, + metaKey: options.metaKey, + keyCode: options.keyCode, + charCode: options.charCode + }); + } + } else if ( document.createEventObject ) { + event = document.createEventObject(); + $.extend( event, options ); + } + + if ( !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ) || (({}).toString.call( window.opera ) === "[object Opera]") ) { + event.keyCode = (options.charCode > 0) ? options.charCode : options.keyCode; + event.charCode = undefined; + } + + return event; + }, + + dispatchEvent: function( elem, type, event ) { + if ( elem[ type ] ) { + elem[ type ](); + } else if ( elem.dispatchEvent ) { + elem.dispatchEvent( event ); + } else if ( elem.fireEvent ) { + elem.fireEvent( "on" + type, event ); + } + }, + + simulateFocus: function() { + var focusinEvent, + triggered = false, + element = $( this.target ); + + function trigger() { + triggered = true; + } + + element.bind( "focus", trigger ); + element[ 0 ].focus(); + + if ( !triggered ) { + focusinEvent = $.Event( "focusin" ); + focusinEvent.preventDefault(); + element.trigger( focusinEvent ); + element.triggerHandler( "focus" ); + } + element.unbind( "focus", trigger ); + }, + + simulateBlur: function() { + var focusoutEvent, + triggered = false, + element = $( this.target ); + + function trigger() { + triggered = true; + } + + element.bind( "blur", trigger ); + element[ 0 ].blur(); + + // blur events are async in IE + setTimeout(function() { + // IE won't let the blur occur if the window is inactive + if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { + element[ 0 ].ownerDocument.body.focus(); + } + + // Firefox won't trigger events if the window is inactive + // IE doesn't trigger events if we had to manually focus the body + if ( !triggered ) { + focusoutEvent = $.Event( "focusout" ); + focusoutEvent.preventDefault(); + element.trigger( focusoutEvent ); + element.triggerHandler( "blur" ); + } + element.unbind( "blur", trigger ); + }, 1 ); + } +}); + + + +/** complex events **/ + +function findCenter( elem ) { + var offset, + document = $( elem.ownerDocument ); + elem = $( elem ); + offset = elem.offset(); + + return { + x: offset.left + elem.outerWidth() / 2 - document.scrollLeft(), + y: offset.top + elem.outerHeight() / 2 - document.scrollTop() + }; +} + +function findCorner( elem ) { + var offset, + document = $( elem.ownerDocument ); + elem = $( elem ); + offset = elem.offset(); + + return { + x: offset.left - document.scrollLeft(), + y: offset.top - document.scrollTop() + }; +} + +$.extend( $.simulate.prototype, { + simulateDrag: function() { + var i = 0, + target = this.target, + options = this.options, + center = options.handle === "corner" ? findCorner( target ) : findCenter( target ), + x = Math.floor( center.x ), + y = Math.floor( center.y ), + coord = { clientX: x, clientY: y }, + dx = options.dx || ( options.x !== undefined ? options.x - x : 0 ), + dy = options.dy || ( options.y !== undefined ? options.y - y : 0 ), + moves = options.moves || 3; + + this.simulateEvent( target, "mousedown", coord ); + + for ( ; i < moves ; i++ ) { + x += dx / moves; + y += dy / moves; + + coord = { + clientX: Math.round( x ), + clientY: Math.round( y ) + }; + + this.simulateEvent( target.ownerDocument, "mousemove", coord ); + } + + if ( $.contains( document, target ) ) { + this.simulateEvent( target, "mouseup", coord ); + this.simulateEvent( target, "click", coord ); + } else { + this.simulateEvent( document, "mouseup", coord ); + } + } +}); + +})( jQuery ); diff --git a/tests/jquery.simulate.js b/tests/jquery.simulate.js deleted file mode 100644 index 28e8a103b..000000000 --- a/tests/jquery.simulate.js +++ /dev/null @@ -1,328 +0,0 @@ - /*! - * jQuery Simulate v0.0.1 - simulate browser mouse and keyboard events - * https://github.com/jquery/jquery-simulate - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * Date: Sun Dec 9 12:15:33 2012 -0500 - */ - -;(function( $, undefined ) { - -var rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/; - -$.fn.simulate = function( type, options ) { - return this.each(function() { - new $.simulate( this, type, options ); - }); -}; - -$.simulate = function( elem, type, options ) { - var method = $.camelCase( "simulate-" + type ); - - this.target = elem; - this.options = options; - - if ( this[ method ] ) { - this[ method ](); - } else { - this.simulateEvent( elem, type, options ); - } -}; - -$.extend( $.simulate, { - - keyCode: { - BACKSPACE: 8, - COMMA: 188, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - LEFT: 37, - NUMPAD_ADD: 107, - NUMPAD_DECIMAL: 110, - NUMPAD_DIVIDE: 111, - NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, - NUMPAD_SUBTRACT: 109, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SPACE: 32, - TAB: 9, - UP: 38 - }, - - buttonCode: { - LEFT: 0, - MIDDLE: 1, - RIGHT: 2 - } -}); - -$.extend( $.simulate.prototype, { - - simulateEvent: function( elem, type, options ) { - var event = this.createEvent( type, options ); - this.dispatchEvent( elem, type, event, options ); - }, - - createEvent: function( type, options ) { - if ( rkeyEvent.test( type ) ) { - return this.keyEvent( type, options ); - } - - if ( rmouseEvent.test( type ) ) { - return this.mouseEvent( type, options ); - } - }, - - mouseEvent: function( type, options ) { - var event, eventDoc, doc, body; - options = $.extend({ - bubbles: true, - cancelable: (type !== "mousemove"), - view: window, - detail: 0, - screenX: 0, - screenY: 0, - clientX: 1, - clientY: 1, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - button: 0, - relatedTarget: undefined - }, options ); - - if ( document.createEvent ) { - event = document.createEvent( "MouseEvents" ); - event.initMouseEvent( type, options.bubbles, options.cancelable, - options.view, options.detail, - options.screenX, options.screenY, options.clientX, options.clientY, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.button, options.relatedTarget || document.body.parentNode ); - - // IE 9+ creates events with pageX and pageY set to 0. - // Trying to modify the properties throws an error, - // so we define getters to return the correct values. - if ( event.pageX === 0 && event.pageY === 0 && Object.defineProperty ) { - eventDoc = event.relatedTarget.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - Object.defineProperty( event, "pageX", { - get: function() { - return options.clientX + - ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - } - }); - Object.defineProperty( event, "pageY", { - get: function() { - return options.clientY + - ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - }); - } - } else if ( document.createEventObject ) { - event = document.createEventObject(); - $.extend( event, options ); - // standards event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ff974877(v=vs.85).aspx - // old IE event.button uses constants defined here: http://msdn.microsoft.com/en-us/library/ie/ms533544(v=vs.85).aspx - // so we actually need to map the standard back to oldIE - event.button = { - 0: 1, - 1: 4, - 2: 2 - }[ event.button ] || ( event.button === -1 ? 0 : event.button ); - } - - return event; - }, - - keyEvent: function( type, options ) { - var event; - options = $.extend({ - bubbles: true, - cancelable: true, - view: window, - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: undefined - }, options ); - - if ( document.createEvent ) { - try { - event = document.createEvent( "KeyEvents" ); - event.initKeyEvent( type, options.bubbles, options.cancelable, options.view, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - // initKeyEvent throws an exception in WebKit - // see: http://stackoverflow.com/questions/6406784/initkeyevent-keypress-only-works-in-firefox-need-a-cross-browser-solution - // and also https://bugs.webkit.org/show_bug.cgi?id=13368 - // fall back to a generic event until we decide to implement initKeyboardEvent - } catch( err ) { - event = document.createEvent( "Events" ); - event.initEvent( type, options.bubbles, options.cancelable ); - $.extend( event, { - view: options.view, - ctrlKey: options.ctrlKey, - altKey: options.altKey, - shiftKey: options.shiftKey, - metaKey: options.metaKey, - keyCode: options.keyCode, - charCode: options.charCode - }); - } - } else if ( document.createEventObject ) { - event = document.createEventObject(); - $.extend( event, options ); - } - - if ( !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ) || (({}).toString.call( window.opera ) === "[object Opera]") ) { - event.keyCode = (options.charCode > 0) ? options.charCode : options.keyCode; - event.charCode = undefined; - } - - return event; - }, - - dispatchEvent: function( elem, type, event ) { - if ( elem.dispatchEvent ) { - elem.dispatchEvent( event ); - } else if ( elem.fireEvent ) { - elem.fireEvent( "on" + type, event ); - } - }, - - simulateFocus: function() { - var focusinEvent, - triggered = false, - element = $( this.target ); - - function trigger() { - triggered = true; - } - - element.bind( "focus", trigger ); - element[ 0 ].focus(); - - if ( !triggered ) { - focusinEvent = $.Event( "focusin" ); - focusinEvent.preventDefault(); - element.trigger( focusinEvent ); - element.triggerHandler( "focus" ); - } - element.unbind( "focus", trigger ); - }, - - simulateBlur: function() { - var focusoutEvent, - triggered = false, - element = $( this.target ); - - function trigger() { - triggered = true; - } - - element.bind( "blur", trigger ); - element[ 0 ].blur(); - - // blur events are async in IE - setTimeout(function() { - // IE won't let the blur occur if the window is inactive - if ( element[ 0 ].ownerDocument.activeElement === element[ 0 ] ) { - element[ 0 ].ownerDocument.body.focus(); - } - - // Firefox won't trigger events if the window is inactive - // IE doesn't trigger events if we had to manually focus the body - if ( !triggered ) { - focusoutEvent = $.Event( "focusout" ); - focusoutEvent.preventDefault(); - element.trigger( focusoutEvent ); - element.triggerHandler( "blur" ); - } - element.unbind( "blur", trigger ); - }, 1 ); - } -}); - - - -/** complex events **/ - -function findCenter( elem ) { - var offset, - document = $( elem.ownerDocument ); - elem = $( elem ); - offset = elem.offset(); - - return { - x: offset.left + elem.outerWidth() / 2 - document.scrollLeft(), - y: offset.top + elem.outerHeight() / 2 - document.scrollTop() - }; -} - -function findCorner( elem ) { - var offset, - document = $( elem.ownerDocument ); - elem = $( elem ); - offset = elem.offset(); - - return { - x: offset.left - document.scrollLeft(), - y: offset.top - document.scrollTop() - }; -} - -$.extend( $.simulate.prototype, { - simulateDrag: function() { - var i = 0, - target = this.target, - options = this.options, - center = options.handle === "corner" ? findCorner( target ) : findCenter( target ), - x = Math.floor( center.x ), - y = Math.floor( center.y ), - coord = { clientX: x, clientY: y }, - dx = options.dx || ( options.x !== undefined ? options.x - x : 0 ), - dy = options.dy || ( options.y !== undefined ? options.y - y : 0 ), - moves = options.moves || 3; - - this.simulateEvent( target, "mousedown", coord ); - - for ( ; i < moves ; i++ ) { - x += dx / moves; - y += dy / moves; - - coord = { - clientX: Math.round( x ), - clientY: Math.round( y ) - }; - - this.simulateEvent( target.ownerDocument, "mousemove", coord ); - } - - if ( $.contains( document, target ) ) { - this.simulateEvent( target, "mouseup", coord ); - this.simulateEvent( target, "click", coord ); - } else { - this.simulateEvent( document, "mouseup", coord ); - } - } -}); - -})( jQuery ); diff --git a/tests/unit/accordion/accordion.html b/tests/unit/accordion/accordion.html index c16b3e6ea..5a76ba566 100644 --- a/tests/unit/accordion/accordion.html +++ b/tests/unit/accordion/accordion.html @@ -7,7 +7,7 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +