diff --git a/demos/draggable/constrain-movement.html b/demos/draggable/constrain-movement.html
index cca74be210e..ec7fa3ad205 100644
--- a/demos/draggable/constrain-movement.html
+++ b/demos/draggable/constrain-movement.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Constrain movement
+
diff --git a/demos/draggable/cursor-style.html b/demos/draggable/cursor-style.html
index 7f3b0fda447..56e09867dba 100644
--- a/demos/draggable/cursor-style.html
+++ b/demos/draggable/cursor-style.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Cursor style
+
diff --git a/demos/draggable/default.html b/demos/draggable/default.html
index df6bf9da9d9..17400fc5694 100644
--- a/demos/draggable/default.html
+++ b/demos/draggable/default.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Default functionality
+
diff --git a/demos/draggable/events.html b/demos/draggable/events.html
index ad8a98aafa8..38058ec95b0 100644
--- a/demos/draggable/events.html
+++ b/demos/draggable/events.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Events
+
diff --git a/demos/draggable/handle.html b/demos/draggable/handle.html
index 2e7fd229534..4d6e57ce4ee 100644
--- a/demos/draggable/handle.html
+++ b/demos/draggable/handle.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Handles
+
diff --git a/demos/draggable/revert.html b/demos/draggable/revert.html
index 4371b7f2be2..1f50c5e0560 100644
--- a/demos/draggable/revert.html
+++ b/demos/draggable/revert.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Revert position
+
diff --git a/demos/draggable/scroll.html b/demos/draggable/scroll.html
index d3e97f3267d..6fbe1a099e0 100644
--- a/demos/draggable/scroll.html
+++ b/demos/draggable/scroll.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Auto-scroll
+
diff --git a/demos/draggable/snap-to.html b/demos/draggable/snap-to.html
index 726a513843e..5c09c32c364 100644
--- a/demos/draggable/snap-to.html
+++ b/demos/draggable/snap-to.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Snap to element or grid
+
diff --git a/demos/draggable/sortable.html b/demos/draggable/sortable.html
index 1251f0e29e0..fc15e4c11cc 100644
--- a/demos/draggable/sortable.html
+++ b/demos/draggable/sortable.html
@@ -4,6 +4,7 @@
jQuery UI Draggable + Sortable
+
diff --git a/demos/draggable/visual-feedback.html b/demos/draggable/visual-feedback.html
index 135d86c2aaa..4d2e9130ef7 100644
--- a/demos/draggable/visual-feedback.html
+++ b/demos/draggable/visual-feedback.html
@@ -4,6 +4,7 @@
jQuery UI Draggable - Visual feedback
+
diff --git a/demos/droppable/accepted-elements.html b/demos/droppable/accepted-elements.html
index 2a50295260d..419aa2f6c06 100644
--- a/demos/droppable/accepted-elements.html
+++ b/demos/droppable/accepted-elements.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Accept
+
diff --git a/demos/droppable/default.html b/demos/droppable/default.html
index a097e718374..912d3ccf735 100644
--- a/demos/droppable/default.html
+++ b/demos/droppable/default.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Default functionality
+
diff --git a/demos/droppable/photo-manager.html b/demos/droppable/photo-manager.html
index 6a8cf33d18b..4bfaf767591 100644
--- a/demos/droppable/photo-manager.html
+++ b/demos/droppable/photo-manager.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Simple photo manager
+
diff --git a/demos/droppable/propagation.html b/demos/droppable/propagation.html
index 99fb2171187..47948a59ecb 100644
--- a/demos/droppable/propagation.html
+++ b/demos/droppable/propagation.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Prevent propagation
+
diff --git a/demos/droppable/revert.html b/demos/droppable/revert.html
index f34801e90a6..91bd61cbb9c 100644
--- a/demos/droppable/revert.html
+++ b/demos/droppable/revert.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Revert draggable position
+
diff --git a/demos/droppable/visual-feedback.html b/demos/droppable/visual-feedback.html
index 9852f371b05..cb294569cf9 100644
--- a/demos/droppable/visual-feedback.html
+++ b/demos/droppable/visual-feedback.html
@@ -4,6 +4,7 @@
jQuery UI Droppable - Visual feedback
+
diff --git a/demos/slider/colorpicker.html b/demos/slider/colorpicker.html
index 6f438a2e5f9..f98f02db8fb 100644
--- a/demos/slider/colorpicker.html
+++ b/demos/slider/colorpicker.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Colorpicker
+
diff --git a/demos/slider/default.html b/demos/slider/default.html
index 141fec23dfb..eff398b054f 100644
--- a/demos/slider/default.html
+++ b/demos/slider/default.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Default functionality
+
diff --git a/demos/slider/hotelrooms.html b/demos/slider/hotelrooms.html
index e5ee79c55a0..b0181e9a8d5 100644
--- a/demos/slider/hotelrooms.html
+++ b/demos/slider/hotelrooms.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Slider bound to select
+
diff --git a/demos/slider/multiple-vertical.html b/demos/slider/multiple-vertical.html
index 5f23a2dd241..b6651808037 100644
--- a/demos/slider/multiple-vertical.html
+++ b/demos/slider/multiple-vertical.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Multiple sliders
+
diff --git a/demos/slider/range-vertical.html b/demos/slider/range-vertical.html
index a29737b9003..d5f0eb61855 100644
--- a/demos/slider/range-vertical.html
+++ b/demos/slider/range-vertical.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Vertical range slider
+
diff --git a/demos/slider/range.html b/demos/slider/range.html
index a923a6d1593..238366a2e8d 100644
--- a/demos/slider/range.html
+++ b/demos/slider/range.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Range slider
+
diff --git a/demos/slider/rangemax.html b/demos/slider/rangemax.html
index b96346b6fc7..83d39ca406b 100644
--- a/demos/slider/rangemax.html
+++ b/demos/slider/rangemax.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Range with fixed maximum
+
diff --git a/demos/slider/rangemin.html b/demos/slider/rangemin.html
index a3d1b0628e7..6c1677cb7a7 100644
--- a/demos/slider/rangemin.html
+++ b/demos/slider/rangemin.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Range with fixed minimum
+
diff --git a/demos/slider/side-scroll.html b/demos/slider/side-scroll.html
index 1e6df620de1..0047addd7b2 100644
--- a/demos/slider/side-scroll.html
+++ b/demos/slider/side-scroll.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Slider scrollbar
+
diff --git a/demos/slider/slider-vertical.html b/demos/slider/slider-vertical.html
index 0a5ecd97d6e..b9119ae5b4d 100644
--- a/demos/slider/slider-vertical.html
+++ b/demos/slider/slider-vertical.html
@@ -4,6 +4,7 @@
jQuery UI Slider - Vertical slider
+
diff --git a/external/pep/PEP.js b/external/pep/PEP.js
new file mode 100644
index 00000000000..1cf2e21ad00
--- /dev/null
+++ b/external/pep/PEP.js
@@ -0,0 +1,1347 @@
+/**
+ * Monkey patched Function.prototype.bind polyfill for phantomjs.
+ * Source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
+ */
+if (!Function.prototype.bind) {
+ Function.prototype.bind = function(oThis) {
+ if (typeof this !== 'function') {
+ // closest thing possible to the ECMAScript 5
+ // internal IsCallable function
+ throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
+ }
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function() {},
+ fBound = function() {
+ return fToBind.apply(this instanceof fNOP
+ ? this
+ : oThis,
+ aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ fNOP.prototype = this.prototype;
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+}
+
+/*!
+ * PEP v0.0.0 | https://github.com/jquery/PEP
+ * Copyright jQuery Foundation and other contributors | http://jquery.org/license
+ */
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ global.PointerEventsPolyfill = factory()
+}(this, function () { 'use strict';
+
+ /**
+ * This module implements an map of pointer states
+ */
+ var USE_MAP = window.Map && window.Map.prototype.forEach;
+ var POINTERS_FN = function(){ return this.size; };
+ function PointerMap() {
+ if (USE_MAP) {
+ var m = new Map();
+ m.pointers = POINTERS_FN;
+ return m;
+ } else {
+ this.keys = [];
+ this.values = [];
+ }
+ }
+
+ PointerMap.prototype = {
+ set: function(inId, inEvent) {
+ var i = this.keys.indexOf(inId);
+ if (i > -1) {
+ this.values[i] = inEvent;
+ } else {
+ this.keys.push(inId);
+ this.values.push(inEvent);
+ }
+ },
+ has: function(inId) {
+ return this.keys.indexOf(inId) > -1;
+ },
+ 'delete': function(inId) {
+ var i = this.keys.indexOf(inId);
+ if (i > -1) {
+ this.keys.splice(i, 1);
+ this.values.splice(i, 1);
+ }
+ },
+ get: function(inId) {
+ var i = this.keys.indexOf(inId);
+ return this.values[i];
+ },
+ clear: function() {
+ this.keys.length = 0;
+ this.values.length = 0;
+ },
+ // return value, key, map
+ forEach: function(callback, thisArg) {
+ this.values.forEach(function(v, i) {
+ callback.call(thisArg, v, this.keys[i], this);
+ }, this);
+ },
+ pointers: function() {
+ return this.keys.length;
+ }
+ };
+
+ var CLONE_PROPS = [
+ // MouseEvent
+ 'bubbles',
+ 'cancelable',
+ 'view',
+ 'detail',
+ 'screenX',
+ 'screenY',
+ 'clientX',
+ 'clientY',
+ 'ctrlKey',
+ 'altKey',
+ 'shiftKey',
+ 'metaKey',
+ 'button',
+ 'relatedTarget',
+ // DOM Level 3
+ 'buttons',
+ // PointerEvent
+ 'pointerId',
+ 'width',
+ 'height',
+ 'pressure',
+ 'tiltX',
+ 'tiltY',
+ 'pointerType',
+ 'hwTimestamp',
+ 'isPrimary',
+ // event instance
+ 'type',
+ 'target',
+ 'currentTarget',
+ 'which',
+ 'pageX',
+ 'pageY',
+ 'timeStamp'
+ ];
+
+ var CLONE_DEFAULTS = [
+ // MouseEvent
+ false,
+ false,
+ null,
+ null,
+ 0,
+ 0,
+ 0,
+ 0,
+ false,
+ false,
+ false,
+ false,
+ 0,
+ null,
+ // DOM Level 3
+ 0,
+ // PointerEvent
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ '',
+ 0,
+ false,
+ // event instance
+ '',
+ null,
+ null,
+ 0,
+ 0,
+ 0,
+ 0
+ ];
+
+ var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
+
+ /**
+ * This module is for normalizing events. Mouse and Touch events will be
+ * collected here, and fire PointerEvents that have the same semantics, no
+ * matter the source.
+ * Events fired:
+ * - pointerdown: a pointing is added
+ * - pointerup: a pointer is removed
+ * - pointermove: a pointer is moved
+ * - pointerover: a pointer crosses into an element
+ * - pointerout: a pointer leaves an element
+ * - pointercancel: a pointer will no longer generate events
+ */
+ var dispatcher = {
+ pointermap: new PointerMap(),
+ eventMap: Object.create(null),
+ captureInfo: Object.create(null),
+ // Scope objects for native events.
+ // This exists for ease of testing.
+ eventSources: Object.create(null),
+ eventSourceList: [],
+ /**
+ * Add a new event source that will generate pointer events.
+ *
+ * `inSource` must contain an array of event names named `events`, and
+ * functions with the names specified in the `events` array.
+ * @param {string} name A name for the event source
+ * @param {Object} source A new source of platform events.
+ */
+ registerSource: function(name, source) {
+ var s = source;
+ var newEvents = s.events;
+ if (newEvents) {
+ newEvents.forEach(function(e) {
+ if (s[e]) {
+ this.eventMap[e] = s[e].bind(s);
+ }
+ }, this);
+ this.eventSources[name] = s;
+ this.eventSourceList.push(s);
+ }
+ },
+ register: function(element) {
+ var l = this.eventSourceList.length;
+ for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+ // call eventsource register
+ es.register.call(es, element);
+ }
+ },
+ unregister: function(element) {
+ var l = this.eventSourceList.length;
+ for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+ // call eventsource register
+ es.unregister.call(es, element);
+ }
+ },
+ contains: /*scope.external.contains || */function(container, contained) {
+ return container.contains(contained);
+ },
+ // EVENTS
+ down: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointerdown', inEvent);
+ },
+ move: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointermove', inEvent);
+ },
+ up: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointerup', inEvent);
+ },
+ enter: function(inEvent) {
+ inEvent.bubbles = false;
+ this.fireEvent('pointerenter', inEvent);
+ },
+ leave: function(inEvent) {
+ inEvent.bubbles = false;
+ this.fireEvent('pointerleave', inEvent);
+ },
+ over: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointerover', inEvent);
+ },
+ out: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointerout', inEvent);
+ },
+ cancel: function(inEvent) {
+ inEvent.bubbles = true;
+ this.fireEvent('pointercancel', inEvent);
+ },
+ leaveOut: function(event) {
+ this.out(event);
+ if (!this.contains(event.target, event.relatedTarget)) {
+ this.leave(event);
+ }
+ },
+ enterOver: function(event) {
+ this.over(event);
+ if (!this.contains(event.target, event.relatedTarget)) {
+ this.enter(event);
+ }
+ },
+ // LISTENER LOGIC
+ eventHandler: function(inEvent) {
+ // This is used to prevent multiple dispatch of pointerevents from
+ // platform events. This can happen when two elements in different scopes
+ // are set up to create pointer events, which is relevant to Shadow DOM.
+ if (inEvent._handledByPE) {
+ return;
+ }
+ var type = inEvent.type;
+ var fn = this.eventMap && this.eventMap[type];
+ if (fn) {
+ fn(inEvent);
+ }
+ inEvent._handledByPE = true;
+ },
+ // set up event listeners
+ listen: function(target, events) {
+ events.forEach(function(e) {
+ this.addEvent(target, e);
+ }, this);
+ },
+ // remove event listeners
+ unlisten: function(target, events) {
+ events.forEach(function(e) {
+ this.removeEvent(target, e);
+ }, this);
+ },
+ addEvent: /*scope.external.addEvent || */function(target, eventName) {
+ target.addEventListener(eventName, this.boundHandler);
+ },
+ removeEvent: /*scope.external.removeEvent || */function(target, eventName) {
+ target.removeEventListener(eventName, this.boundHandler);
+ },
+ // EVENT CREATION AND TRACKING
+ /**
+ * Creates a new Event of type `inType`, based on the information in
+ * `inEvent`.
+ *
+ * @param {string} inType A string representing the type of event to create
+ * @param {Event} inEvent A platform event with a target
+ * @return {Event} A PointerEvent of type `inType`
+ */
+ makeEvent: function(inType, inEvent) {
+ // relatedTarget must be null if pointer is captured
+ if (this.captureInfo[inEvent.pointerId]) {
+ inEvent.relatedTarget = null;
+ }
+ var e = new PointerEvent(inType, inEvent);
+ if (inEvent.preventDefault) {
+ e.preventDefault = inEvent.preventDefault;
+ }
+ e._target = e._target || inEvent.target;
+ return e;
+ },
+ // make and dispatch an event in one call
+ fireEvent: function(inType, inEvent) {
+ var e = this.makeEvent(inType, inEvent);
+ return this.dispatchEvent(e);
+ },
+ /**
+ * Returns a snapshot of inEvent, with writable properties.
+ *
+ * @param {Event} inEvent An event that contains properties to copy.
+ * @return {Object} An object containing shallow copies of `inEvent`'s
+ * properties.
+ */
+ cloneEvent: function(inEvent) {
+ var eventCopy = Object.create(null), p;
+ for (var i = 0; i < CLONE_PROPS.length; i++) {
+ p = CLONE_PROPS[i];
+ eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
+ // Work around SVGInstanceElement shadow tree
+ // Return the