From e306188732d8596f28ccd5d15af8d16cf95defbe Mon Sep 17 00:00:00 2001 From: John Beedell Date: Mon, 14 May 2018 12:37:23 +0100 Subject: [PATCH] MDL-62239 QTYPE: iOS 11.3 broke Moodle drag-drop question types --- .../moodle-qtype_ddimageortext-dd-debug.js | 52 +++++++++++-------- .../moodle-qtype_ddimageortext-dd-min.js | 4 +- .../moodle-qtype_ddimageortext-dd.js | 52 +++++++++++-------- .../yui/src/ddimageortext/js/ddimageortext.js | 52 +++++++++++-------- .../moodle-qtype_ddmarker-dd-debug.js | 47 ++++++++++------- .../moodle-qtype_ddmarker-dd-min.js | 4 +- .../moodle-qtype_ddmarker-dd.js | 47 ++++++++++------- .../ddmarker/yui/src/ddmarker/js/ddmarker.js | 47 ++++++++++------- .../moodle-qtype_ddwtos-dd-debug.js | 48 ++++++++++------- .../moodle-qtype_ddwtos-dd-min.js | 4 +- .../moodle-qtype_ddwtos-dd.js | 48 ++++++++++------- .../type/ddwtos/yui/src/ddwtos/js/ddwtos.js | 49 +++++++++-------- 12 files changed, 261 insertions(+), 193 deletions(-) diff --git a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-debug.js b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-debug.js index 1048e63a829..022e28e35ca 100644 --- a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-debug.js +++ b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-debug.js @@ -249,7 +249,7 @@ var DDIMAGEORTEXT_QUESTION = function() { * This is the code for question rendering. */ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { - touchscrolldisable: null, + passiveSupported: false, pendingid: '', initializer: function() { this.pendingid = 'qtype_ddimageortext-' + Math.random().toString(36).slice(2); // Random string. @@ -267,6 +267,7 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { this.reposition_drags_for_question(); }, this); } + this.checkPassiveSupported(); }, /** @@ -277,29 +278,36 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; - - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); - }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); }, + + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } + }, + create_all_drag_and_drops: function() { this.init_drops(); this.update_padding_sizes_all(); diff --git a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-min.js b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-min.js index 7ebee06fc2c..f8ab7a6a59a 100644 --- a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-min.js +++ b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd-min.js @@ -1,2 +1,2 @@ -YUI.add("moodle-qtype_ddimageortext-dd",function(e,t){var n="ddimageortext_dd",r=function(){r.superclass.constructor.apply(this,arguments)};e.extend(r,e.Base,{doc:null,polltimer:null,afterimageloaddone:!1,poll_for_image_load:function(t,n,r,i){if(this.afterimageloaddone)return;var s=this.doc.bg_img().get("complete");n&&(s=s&&this.doc.bg_img().hasClass("constrained"));var o=!this.doc.drag_item_homes().some(function(e){if(e.get("tagName")!=="IMG")return!1;var t=e.get("complete");return n&&(t=t&&e.hasClass("constrained")),!t});if(s&&o)this.polltimer!==null&&(this.polltimer.cancel(),this.polltimer=null),this.doc.drag_item_homes().detach("load",this.poll_for_image_load),this.doc.bg_img().detach("load",this.poll_for_image_load),r!==0?e.later(r,this,i):i.call(this),this.afterimageloaddone=!0;else if(this.polltimer===null){var u=[null,n,r,i];this.polltimer=e.later(1e3,this,this.poll_for_image_load,u,!0)}},doc_structure:function(t){var n=e.one(this.get("topnode")),r=n.one("div.dragitems"),i=n.one("div.droparea");return{top_node:function(){return n},drag_items:function(){return r.all(".drag")},drop_zones:function(){return n.all("div.dropzones div.dropzone")},drop_zone_group:function(e){return n.all("div.dropzones div.group"+e)},drag_items_cloned_from:function(e){return r.all(".dragitems"+e)},drag_item:function(e){return r.one(".draginstance"+e)},drag_items_in_group:function(e){return r.all(".drag.group"+e)},drag_item_homes:function(){return r.all(".draghome")},bg_img:function(){return n.one(".dropbackground")},load_bg_img:function(e){i.setContent(''),this.bg_img().on("load",this.on_image_load,this,"bg_image")},add_or_update_drag_item_home:function(e,t,n,i){var s=this.drag_item_home(e),o="draghome dragitemhomes"+e+" group"+i,u=''+n+'',a='
'+n+"
";s===null?t?r.append(u):n!==""&&r.append(a):(t?r.insert(u,s):n!==""&&r.insert(a,s),s.remove(!0));var f=r.one(".dragitemhomes"+e);f!==null&&(f.setData("groupno",i),f.setData("dragitemno",e))},drag_item_home:function(e){return r.one(".dragitemhomes"+e)},get_classname_numeric_suffix:function(e,t){var n=e.getAttribute("class");if(n!==""){var r=n.split(" ");for(var i=0;i0)o=this.doc.clone_new_drag_item -(e,n),e++,this.get("readonly")||(this.doc.draggable_for_question(o,i,r),this.prevent_touchmove_from_scrolling(o)),u--}},this),this.reposition_drags_for_question(),this.get("readonly")||(this.doc.drop_zones().set("tabIndex",0),this.doc.drop_zones().each(function(e){e.on("dragchange",this.drop_zone_key_press,this)},this)),M.util.js_complete(this.pendingid)},drop_zone_key_press:function(e){switch(e.direction){case"next":this.place_next_drag_in(e.target);break;case"previous":this.place_previous_drag_in(e.target);break;case"remove":this.remove_drag_from_drop(e.target)}e.preventDefault(),this.reposition_drags_for_question()},place_next_drag_in:function(e){this.search_for_unplaced_drop_choice(e,1)},place_previous_drag_in:function(e){this.search_for_unplaced_drop_choice(e,-1)},search_for_unplaced_drop_choice:function(e,t){var n,r=this.current_drag_in_drop(e);if(""===r)if(t===1)n=1;else{n=1;var i=e.getData("group");this.doc.drag_items_in_group(i).each(function(e){n=Math.max(n,e.getData("choice"))},this)}else n=+r+t;var s;do{if(this.get_choices_for_drop(n,e).size()===0){this.remove_drag_from_drop(e);return}s=this.get_unplaced_choice_for_drop(n,e),n+=t}while(s===null);this.place_drag_in_drop(s,e)},current_drag_in_drop:function(t){var n=t.getData("inputid"),r=e.one("input#"+n);return r.get("value")},remove_drag_from_drop:function(e){this.place_drag_in_drop(null,e)},place_drag_in_drop:function(t,n){var r=n.getData("inputid"),i=e.one("input#"+r);t!==null?i.set("value",t.getData("choice")):i.set("value","")},reposition_drags_for_question:function(t){this.doc.drag_items().removeClass("placed"),this.doc.drag_items().each(function(e){e.dd!==undefined&&e.dd.detachAll("drag:start")},this),this.doc.drop_zones().each(function(e){var t=e.getData("xy");e.setXY(this.convert_to_window_xy(t));var n="input#"+e.getData("inputid"),r=this.doc.top_node().one(n),i=r.get("value");if(i!==""){var s=this.get_unplaced_choice_for_drop(i,e);s!==null&&(s.setXY(e.getXY()),s.addClass("placed"),s.dd!==undefined&&s.dd.once("drag:start",function(e,t){t.set("value",""),e.target.get("node").removeClass("placed")},this,r))}},this),this.doc.drag_items().each(function(e){if(!e.hasClass("placed")&&!e.hasClass("yui3-dd-dragging")){var t=this.doc.drag_item_home(e.getData("dragitemno"));e.setXY(t.getXY())}},this),t&&e.later(500,this,this.reposition_drags_for_question,!0)},get_choices_for_drop:function(e,t){var n=t.getData("group");return this.doc.top_node().all("div.dragitemgroup"+n+" .choice"+e+".drag")},get_unplaced_choice_for_drop:function(e,t){var n=this.get_choices_for_drop(e,t),r=null;return n.some(function(e){return this.get("readonly")||!e.hasClass("placed")&&!e.hasClass("yui3-dd-dragging")?(r=e,!0):!1}),r},init_drops:function(){var t=this.doc.top_node().one("div.dropzones"),n={};for(var r=1;r<=8;r++){var i=e.Node.create('
');t.append(i),n[r]=i}var s=function(e){var t=e.drag.get("node"),n=e.drop.get("node");Number(n.getData("group"))===t.getData("group")&&this.place_drag_in_drop(t,n)};for(var o in this.get("drops")){var u=this.get("drops")[o],a="dropzone group"+u.group+" place"+o,f=u.text.replace('"','"');f||(f=M.util.get_string("blank","qtype_ddimageortext"));var l='
'+''+f+" 
",c=e.Node.create(l);n[u.group].append(c),c.setStyles({opacity:.5}),c.setData("xy",u.xy),c.setData("place",o),c.setData("inputid",u.fieldname.replace(":","_")),c.setData("group",u.group);var h=new e.DD.Drop({node:c,groups:[u.group]});h.on("drop:hit",s,this)}}},{NAME:i,ATTRS:{}}),e.Event.define("dragchange",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{32:"next",37:"previous",38:"previous",39:"next",40:"next",27:"remove"},_keyHandler:function(e,t){this._keys[e.keyCode]&&(e.direction=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t._detacher=e.on(this._event,this._keyHandler,this,n)}}),M.qtype_ddimageortext.init_question=function(e){return new s(e)}},"@VERSION@",{requires:["node","dd","dd-drop","dd-constrain"]}); +YUI.add("moodle-qtype_ddimageortext-dd",function(e,t){var n="ddimageortext_dd",r=function(){r.superclass.constructor.apply(this,arguments)};e.extend(r,e.Base,{doc:null,polltimer:null,afterimageloaddone:!1,poll_for_image_load:function(t,n,r,i){if(this.afterimageloaddone)return;var s=this.doc.bg_img().get("complete");n&&(s=s&&this.doc.bg_img().hasClass("constrained"));var o=!this.doc.drag_item_homes().some(function(e){if(e.get("tagName")!=="IMG")return!1;var t=e.get("complete");return n&&(t=t&&e.hasClass("constrained")),!t});if(s&&o)this.polltimer!==null&&(this.polltimer.cancel(),this.polltimer=null),this.doc.drag_item_homes().detach("load",this.poll_for_image_load),this.doc.bg_img().detach("load",this.poll_for_image_load),r!==0?e.later(r,this,i):i.call(this),this.afterimageloaddone=!0;else if(this.polltimer===null){var u=[null,n,r,i];this.polltimer=e.later(1e3,this,this.poll_for_image_load,u,!0)}},doc_structure:function(t){var n=e.one(this.get("topnode")),r=n.one("div.dragitems"),i=n.one("div.droparea");return{top_node:function(){return n},drag_items:function(){return r.all(".drag")},drop_zones:function(){return n.all("div.dropzones div.dropzone")},drop_zone_group:function(e){return n.all("div.dropzones div.group"+e)},drag_items_cloned_from:function(e){return r.all(".dragitems"+e)},drag_item:function(e){return r.one(".draginstance"+e)},drag_items_in_group:function(e){return r.all(".drag.group"+e)},drag_item_homes:function(){return r.all(".draghome")},bg_img:function(){return n.one(".dropbackground")},load_bg_img:function(e){i.setContent(''),this.bg_img().on("load",this.on_image_load,this,"bg_image")},add_or_update_drag_item_home:function(e,t,n,i){var s=this.drag_item_home(e),o="draghome dragitemhomes"+e+" group"+i,u=''+n+'',a='
'+n+"
";s===null?t?r.append(u):n!==""&&r.append(a):(t?r.insert(u,s):n!==""&&r.insert(a,s),s.remove(!0));var f=r.one(".dragitemhomes"+e);f!==null&&(f.setData("groupno",i),f.setData("dragitemno",e))},drag_item_home:function(e){return r.one(".dragitemhomes"+e)},get_classname_numeric_suffix:function(e,t){var n=e.getAttribute("class");if(n!==""){var r=n.split(" ");for(var i=0;i0)o=this.doc.clone_new_drag_item(e,n),e++,this.get("readonly")||(this.doc.draggable_for_question(o,i,r),this.prevent_touchmove_from_scrolling(o)),u--}},this),this.reposition_drags_for_question(),this.get("readonly")||(this.doc.drop_zones().set("tabIndex",0),this.doc.drop_zones().each(function(e){e.on("dragchange",this.drop_zone_key_press,this)},this)),M.util.js_complete(this.pendingid)},drop_zone_key_press:function(e){switch(e.direction){case"next":this.place_next_drag_in(e.target);break;case"previous":this.place_previous_drag_in(e.target);break;case"remove":this.remove_drag_from_drop(e.target)}e.preventDefault(),this.reposition_drags_for_question()},place_next_drag_in:function(e){this.search_for_unplaced_drop_choice(e,1)},place_previous_drag_in:function(e){this.search_for_unplaced_drop_choice(e,-1)},search_for_unplaced_drop_choice:function(e,t){var n,r=this.current_drag_in_drop(e);if(""===r)if(t===1)n=1;else{n=1;var i=e.getData("group");this.doc.drag_items_in_group(i).each(function(e){n=Math.max(n,e.getData("choice"))},this)}else n=+r+t;var s;do{if(this.get_choices_for_drop(n,e).size()===0){this.remove_drag_from_drop(e);return}s=this.get_unplaced_choice_for_drop(n,e),n+=t}while(s===null);this.place_drag_in_drop(s,e)},current_drag_in_drop:function(t){var n=t.getData("inputid"),r=e.one("input#"+n);return r.get("value")},remove_drag_from_drop:function(e){this.place_drag_in_drop(null,e)},place_drag_in_drop:function(t,n){var r=n.getData("inputid"),i=e.one("input#"+r);t!==null?i.set("value",t.getData("choice")):i.set("value","")},reposition_drags_for_question:function(t){this.doc.drag_items().removeClass("placed"),this.doc.drag_items().each(function(e){e.dd!==undefined&&e.dd.detachAll("drag:start")},this),this.doc.drop_zones().each(function(e){var t=e.getData("xy");e.setXY(this.convert_to_window_xy(t));var n="input#"+e.getData("inputid"),r=this.doc.top_node().one(n),i=r.get("value");if(i!==""){var s=this.get_unplaced_choice_for_drop(i,e);s!==null&&(s.setXY(e.getXY()),s.addClass("placed"),s.dd!==undefined&&s.dd.once("drag:start",function(e,t){t.set("value",""),e.target.get("node").removeClass("placed")},this,r))}},this),this.doc.drag_items().each(function(e){if(!e.hasClass("placed")&&!e.hasClass("yui3-dd-dragging")){var t=this.doc.drag_item_home(e.getData("dragitemno"));e.setXY(t.getXY())}},this),t&&e.later(500,this,this.reposition_drags_for_question,!0)},get_choices_for_drop:function(e,t){var n=t.getData("group");return this.doc.top_node().all("div.dragitemgroup"+n+" .choice"+e+".drag")},get_unplaced_choice_for_drop:function(e,t){var n=this.get_choices_for_drop(e,t),r=null;return n.some(function(e){return this.get("readonly")||!e.hasClass("placed")&&!e.hasClass("yui3-dd-dragging")?(r=e,!0):!1}),r},init_drops:function(){var t=this.doc.top_node().one("div.dropzones"),n={};for(var r=1;r<=8;r++){var i=e.Node.create('
');t.append(i),n[r]=i}var s=function(e){var t=e.drag.get("node"),n=e.drop.get("node");Number(n.getData("group"))===t.getData("group")&&this.place_drag_in_drop(t,n)};for(var o in this.get("drops")){var u=this.get("drops")[o],a="dropzone group"+u.group+" place"+o,f=u.text.replace('"','"');f||(f=M.util.get_string("blank","qtype_ddimageortext"));var l='
'+''+f+" 
",c=e.Node.create(l);n[u.group].append(c),c.setStyles({opacity:.5}),c.setData("xy",u.xy),c.setData("place",o),c.setData("inputid",u.fieldname.replace(":","_")),c.setData("group",u.group);var h=new e.DD.Drop({node:c,groups:[u.group]});h.on("drop:hit",s,this)}}},{NAME:i,ATTRS:{}}),e.Event.define("dragchange",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{32:"next",37:"previous",38:"previous",39:"next",40:"next",27:"remove"},_keyHandler:function(e,t){this._keys[e.keyCode]&&(e.direction=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t._detacher=e.on(this._event,this._keyHandler,this,n)}}),M.qtype_ddimageortext.init_question=function(e){return new s(e)}},"@VERSION@",{requires:["node","dd","dd-drop","dd-constrain"]}); diff --git a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd.js b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd.js index 1048e63a829..022e28e35ca 100644 --- a/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd.js +++ b/question/type/ddimageortext/yui/build/moodle-qtype_ddimageortext-dd/moodle-qtype_ddimageortext-dd.js @@ -249,7 +249,7 @@ var DDIMAGEORTEXT_QUESTION = function() { * This is the code for question rendering. */ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { - touchscrolldisable: null, + passiveSupported: false, pendingid: '', initializer: function() { this.pendingid = 'qtype_ddimageortext-' + Math.random().toString(36).slice(2); // Random string. @@ -267,6 +267,7 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { this.reposition_drags_for_question(); }, this); } + this.checkPassiveSupported(); }, /** @@ -277,29 +278,36 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; - - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); - }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); }, + + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } + }, + create_all_drag_and_drops: function() { this.init_drops(); this.update_padding_sizes_all(); diff --git a/question/type/ddimageortext/yui/src/ddimageortext/js/ddimageortext.js b/question/type/ddimageortext/yui/src/ddimageortext/js/ddimageortext.js index a1658292671..979efc6af19 100644 --- a/question/type/ddimageortext/yui/src/ddimageortext/js/ddimageortext.js +++ b/question/type/ddimageortext/yui/src/ddimageortext/js/ddimageortext.js @@ -247,7 +247,7 @@ var DDIMAGEORTEXT_QUESTION = function() { * This is the code for question rendering. */ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { - touchscrolldisable: null, + passiveSupported: false, pendingid: '', initializer: function() { this.pendingid = 'qtype_ddimageortext-' + Math.random().toString(36).slice(2); // Random string. @@ -265,6 +265,7 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { this.reposition_drags_for_question(); }, this); } + this.checkPassiveSupported(); }, /** @@ -275,29 +276,36 @@ Y.extend(DDIMAGEORTEXT_QUESTION, M.qtype_ddimageortext.dd_base_class, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; - - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); - }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); }, + + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } + }, + create_all_drag_and_drops: function() { this.init_drops(); this.update_padding_sizes_all(); diff --git a/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-debug.js b/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-debug.js index cd19469b453..c58108dd7b3 100644 --- a/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-debug.js +++ b/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-debug.js @@ -310,7 +310,7 @@ var DDMARKER_QUESTION = function() { * This is the code for question rendering. */ Y.extend(DDMARKER_QUESTION, M.qtype_ddmarker.dd_base_class, { - touchscrolldisable: null, + passiveSupported: false, pendingid: '', initializer: function() { this.pendingid = 'qtype_ddmarker-' + Math.random().toString(36).slice(2); // Random string. @@ -319,6 +319,7 @@ Y.extend(DDMARKER_QUESTION, M.qtype_ddmarker.dd_base_class, { this.poll_for_image_load(null, false, 0, this.after_image_load); this.doc.bg_img().after('load', this.poll_for_image_load, this, false, 0, this.after_image_load); + this.checkPassiveSupported(); }, after_image_load: function() { this.redraw_drags_and_drops(); @@ -346,28 +347,34 @@ Y.extend(DDMARKER_QUESTION, M.qtype_ddmarker.dd_base_class, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); + }, - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } }, draggable: function(drag) { diff --git a/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-min.js b/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-min.js index c15de87a201..ca407f1d17a 100644 --- a/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-min.js +++ b/question/type/ddmarker/yui/build/moodle-qtype_ddmarker-dd/moodle-qtype_ddmarker-dd-min.js @@ -1,2 +1,2 @@ -YUI.add("moodle-qtype_ddmarker-dd",function(e,t){var n="moodle-qtype_ddmarker-dd",r=function(){r.superclass.constructor.apply(this,arguments)};e.extend(r,e.Base,{doc:null,polltimer:null,afterimageloaddone:!1,graphics:null,poll_for_image_load:function(t,n,r,i){if(this.afterimageloaddone)return;var s=this.doc.bg_img().get("complete");n&&(s=s&&this.doc.bg_img().hasClass("constrained"));if(s)this.polltimer!==null&&(this.polltimer.cancel(),this.polltimer=null),this.doc.bg_img().detach("load",this.poll_for_image_load),r!==0?e.later(r,this,i):i.call(this),this.afterimageloaddone=!0;else if(this.polltimer===null){var o=[null,n,r,i];this.polltimer=e.later(1e3,this,this.poll_for_image_load,o,!0)}},doc_structure:function(){var t=e.one(this.get("topnode")),n=t.one("div.dragitems"),r=t.one("div.droparea");return{top_node:function(){return t},bg_img:function(){return t.one(".dropbackground")},load_bg_img:function(e){r.setContent(''),this.bg_img().on("load",this.on_image_load,this,"bg_image")},drag_items:function(){return n.all(".dragitem")},drag_items_for_choice:function(e){return n.all("span.dragitem.choice"+e)},drag_item_for_choice:function(e,t){return n.one("span.dragitem.choice"+e+".item"+t)},drag_item_being_dragged:function(e){return n.one("span.dragitem.beingdragged.choice"+e)},drag_item_home:function(e){return n.one("span.draghome.choice"+e)},drag_item_homes:function(){return n.all("span.draghome")},get_classname_numeric_suffix:function(e,t){var n=e.getAttribute("class");if(n!==""){var r=n.split(" ");for(var i=0;i'+t+""):this.doc.marker_texts().append(''+t+"")}var a="draw_shape_"+n;if(this[a]instanceof Function){var f=this[a](e,r,i);if(f!==null){var l=this.doc.top_node().one("div.ddarea div.markertexts span.markertext"+e);if(l!==null){l.setStyle("opacity","0.6"),f[0]-=l.get("offsetWidth")/2,f[1]-=l.get("offsetHeight")/2,l.setXY(this.convert_to_window_xy(f));var c=l.one("a");c!==null&&(c.once("click",function(e,t){var n=this.shapes[t].get("fill");n.opacity=1,this.shapes[t].set("fill",n)},this,e),c.set("tabIndex",0))}}}},draw_shape_circle:function(e,t,n){var r=t.match(/(\d+),(\d+);(\d+)/);if(r&&r.length===4){var i=[Number(r[1])-r[3],Number(r[2])-r[3]];if(this.coords_in_img(i)){var s=[Number(r[3])*2,Number(r[3])*2],o=this.graphics.addShape({type:"circle",width:s[0],height:s[1],fill:{color:n,opacity:"0.5"},stroke:{weight:1,color:"black"}});return o.setXY(this.convert_to_window_xy(i)),this.shapes[e]=o,[Number(r[1]),Number(r[2])]}}return null},draw_shape_rectangle:function(e,t,n){var r=t.match(/(\d+),(\d+);(\d+),(\d+)/);if(r&&r.length===5){var i=[Number(r[1]),Number(r[2])],s=[Number(r[3]),Number(r[4])];if(this.coords_in_img([i[0]+s[0],i[1]+s[1]])){var o=this.graphics.addShape({type:"rect",width:s[0],height:s[1],fill:{color:n,opacity:"0.5"},stroke:{weight:1,color:"black"}});return o.setXY(this.convert_to_window_xy(i)),this.shapes[e]=o,[Number(i[0])+s[0]/2,Number(i[1])+s[1]/2]}}return null},draw_shape_polygon:function(e,t,n){var r=t.split(";"),i=[];for(var s in r){var o=r[s].match(/^(\d+),(\d+)$/);o!==null&&this.coords_in_img([o[1],o[2]])&&(i[i.length]=[o[1],o[2]])}if(i.length>2){var u=this.graphics.addShape({type:"path",stroke:{weight:1,color:"black"},fill:{color:n,opacity:"0.5"}}),a=[0,0],f=[this.doc.bg_img().get("width"),this.doc.bg_img().get("height")];for(s=0;sthis.doc.bg_img().get("width")||e[1]>this.doc.bg_img().get("height")?!1:!0},constrain_to_bgimg:function(e){var t=this.convert_to_bg_img_xy(e);return t[0]=Math.max(0,t[0]),t[1]=Math.max(0,t[1]),t[0]=Math.min(this.doc.bg_img().get("width"),t[0]),t[1]=Math.min(this.doc.bg_img().get("height"),t[1]),this.convert_to_window_xy(t)},convert_to_bg_img_xy:function(e){return[Number(e[0])-this.doc.bg_img().getX()-1,Number(e[1])-this.doc.bg_img().getY()-1]},redraw_drags_and_drops:function(){this.doc.drag_items().each(function(e){e.addClass("unneeded")},this),this.doc.inputs_for_choices().each(function(e){var t=this.get_choiceno_for_node(e),n=this.get_coords(e),r=this.doc.drag_item_home(t);for(var i=0;i'),this.bg_img().on("load",this.on_image_load,this,"bg_image")},drag_items:function(){return n.all(".dragitem")},drag_items_for_choice:function(e){return n.all("span.dragitem.choice"+e)},drag_item_for_choice:function(e,t){return n.one("span.dragitem.choice"+e+".item"+t)},drag_item_being_dragged:function(e){return n.one("span.dragitem.beingdragged.choice"+e)},drag_item_home:function(e){return n.one("span.draghome.choice"+e)},drag_item_homes:function(){return n.all("span.draghome")},get_classname_numeric_suffix:function(e,t){var n=e.getAttribute("class");if(n!==""){var r=n.split(" ");for(var i=0;i'+t+""):this.doc.marker_texts().append(''+t+"")}var a="draw_shape_"+n;if(this[a]instanceof Function){var f=this[a](e,r,i);if(f!==null){var l=this.doc.top_node().one("div.ddarea div.markertexts span.markertext"+e);if(l!==null){l.setStyle("opacity","0.6"),f[0]-=l.get("offsetWidth")/2,f[1]-=l.get("offsetHeight")/2,l.setXY(this.convert_to_window_xy(f));var c=l.one("a");c!==null&&(c.once("click",function(e,t){var n=this.shapes[t].get("fill");n.opacity=1,this.shapes[t].set("fill",n)},this,e),c.set("tabIndex",0))}}}},draw_shape_circle:function(e,t,n){var r=t.match(/(\d+),(\d+);(\d+)/);if(r&&r.length===4){var i=[Number(r[1])-r[3],Number(r[2])-r[3]];if(this.coords_in_img(i)){var s=[Number(r[3])*2,Number(r[3])*2],o=this.graphics.addShape({type:"circle",width:s[0],height:s[1],fill:{color:n,opacity:"0.5"},stroke:{weight:1,color:"black"}});return o.setXY(this.convert_to_window_xy(i)),this.shapes[e]=o,[Number(r[1]),Number(r[2])]}}return null},draw_shape_rectangle:function(e,t,n){var r=t.match(/(\d+),(\d+);(\d+),(\d+)/);if(r&&r.length===5){var i=[Number(r[1]),Number(r[2])],s=[Number(r[3]),Number(r[4])];if(this.coords_in_img([i[0]+s[0],i[1]+s[1]])){var o=this.graphics.addShape({type:"rect",width:s[0],height:s[1],fill:{color:n,opacity:"0.5"},stroke:{weight:1,color:"black"}});return o.setXY(this.convert_to_window_xy(i)),this.shapes[e]=o,[Number(i[0])+s[0]/2,Number(i[1])+s[1]/2]}}return null},draw_shape_polygon:function(e,t,n){var r=t.split(";"),i=[];for(var s in r){var o=r[s].match(/^(\d+),(\d+)$/);o!==null&&this.coords_in_img([o[1],o[2]])&&(i[i.length]=[o[1],o[2]])}if(i.length>2){var u=this.graphics.addShape({type:"path",stroke:{weight:1,color:"black"},fill:{color:n,opacity:"0.5"}}),a=[0,0],f=[this.doc.bg_img().get("width"),this.doc.bg_img().get("height")];for(s=0;sthis.doc.bg_img().get("width")||e[1]>this.doc.bg_img().get("height")?!1:!0},constrain_to_bgimg:function(e){var t=this.convert_to_bg_img_xy(e);return t[0]=Math.max(0,t[0]),t[1]=Math.max(0,t[1]),t[0]=Math.min(this.doc.bg_img().get("width"),t[0]),t[1]=Math.min(this.doc.bg_img().get("height"),t[1]),this.convert_to_window_xy(t)},convert_to_bg_img_xy:function(e){return[Number(e[0])-this.doc.bg_img().getX()-1,Number(e[1])-this.doc.bg_img().getY()-1]},redraw_drags_and_drops:function(){this.doc.drag_items().each(function(e){e.addClass("unneeded")},this),this.doc.inputs_for_choices().each(function(e){var t=this.get_choiceno_for_node(e),n=this.get_coords(e),r=this.doc.drag_item_home(t);for(var i=0;i0)n!==!0&&(n-=1),e.later(500,this,this.position_drag_items,[t,n])},position_drag_item:function(t){if(!t.hasClass("yui3-dd-dragging"))if(!this.placed[this.get_no(t)]){var n=this.get_group(t),r=this.get_choice(t),i=e.one(this.selectors.drag_home(n,r));t.setXY(i.getXY()),t.addClass("unplaced")}else{var s=this.placed[this.get_no(t)],o=e.one(this.selectors.drop_for_place(s));t.setXY([ -o.getX()+2,o.getY()+2]),t.removeClass("unplaced")}},drop_zone_key_press:function(e){switch(e.direction){case"next":this.place_next_drag_in(e.target);break;case"previous":this.place_previous_drag_in(e.target);break;case"remove":this.remove_drag_from_drop(e.target)}e.preventDefault()},place_next_drag_in:function(e){this.choose_next_choice_for_drop(e,1)},place_previous_drag_in:function(e){this.choose_next_choice_for_drop(e,-1)},choose_next_choice_for_drop:function(t,n){var r,i=this.get_group(t),s=this.current_choice_in_drop(t),o=e.all(this.selectors.unplaced_drags_in_group(i));if(0===s)if(n===1)r=1;else{var u=o.pop();r=this.get_choice(u)}else r=s+n;var a;do{a=e.one(this.selectors.unplaced_drags_for_choice_in_group(r,i));if(e.one(this.selectors.drags_for_choice_in_group(r,i))===null){this.remove_drag_from_drop(t);return}r+=n}while(a===null);this.place_drag_in_drop(a,t)},current_choice_in_drop:function(t){var n=this.get("inputids")[this.get_place(t)],r=e.one("input#"+n);return Number(r.get("value"))}},{NAME:n,ATTRS:{readonly:{value:!1},topnode:{value:null},inputids:{value:null}}}),e.Event.define("dragchange",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{32:"next",37:"previous",38:"previous",39:"next",40:"next",27:"remove"},_keyHandler:function(e,t){this._keys[e.keyCode]&&(e.direction=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t._detacher=e.on(this._event,this._keyHandler,this,n)}}),M.qtype_ddwtos=M.qtype_ddwtos||{},M.qtype_ddwtos.init_question=function(e){return new r(e)}},"@VERSION@",{requires:["node","dd","dd-drop","dd-constrain"]}); +YUI.add("moodle-qtype_ddwtos-dd",function(e,t){var n="ddwtos_dd",r=function(){r.superclass.constructor.apply(this,arguments)};e.extend(r,e.Base,{selectors:null,passiveSupported:!1,initializer:function(){var t="qtype_ddwtos-"+Math.random().toString(36).slice(2);M.util.js_pending(t),this.selectors=this.css_selectors(this.get("topnode")),this.set_padding_sizes_all(),this.clone_drag_items(),this.initial_place_of_drag_items(),this.make_drop_zones(),this.get("readonly")?(e.later(500,this,this.position_drag_items,[t,3]),e.one("window").on("resize",function(){this.position_drag_items(t)},this)):e.later(500,this,this.position_drag_items,[t,!0]),this.checkPassiveSupported()},css_selectors:function(e){return{top_node:function(){return e},drag_container:function(){return e+" div.drags"},drags:function(){return this.drag_container()+" span.drag"},drag:function(e){return this.drags()+".no"+e},drags_in_group:function(e){return this.drags()+".group"+e},unplaced_drags_in_group:function(e){return this.drags_in_group(e)+".unplaced"},drags_for_choice_in_group:function(e,t){return this.drags_in_group(t)+".choice"+e},unplaced_drags_for_choice_in_group:function(e,t){return this.unplaced_drags_in_group(t)+".choice"+e},drops:function(){return e+" span.drop"},drop_for_place:function(e){return this.drops()+".place"+e},drops_in_group:function(e){return this.drops()+".group"+e},drag_homes:function(){return e+" span.draghome"},drag_homes_group:function(t){return e+" .draggrouphomes"+t+" span.draghome"},drag_home:function(t,n){return e+" .draggrouphomes"+t+" span.draghome.choice"+n},drops_group:function(t){return e+" span.drop.group"+t}}},set_padding_sizes_all:function(){for(var e=1;e<=8;e++)this.set_padding_size_for_group(e)},set_padding_size_for_group:function(t){var n=e.all(this.selectors.drag_homes_group(t));if(n.size()!==0){var r=0,i=0;n.each(function(e){r=Math.max(r,Math.ceil(e.get("offsetWidth"))),i=Math.max(i,Math.ceil(e.get("offsetHeight")))},this),r+=8,i+=2,n.each(function(e){this.pad_to_width_height(e,r,i)},this),e.all(this.selectors.drops_group(t)).each(function(e){this.pad_to_width_height(e,r+2,i+2)},this)}},pad_to_width_height:function(e,t,n){e.setStyle("width",t+"px").setStyle("height",n+"px").setStyle("lineHeight",n+"px")},clone_drag_items:function(){e.all(this.selectors.drag_homes()).each(this.clone_drag_items_for_one_choice,this)},clone_drag_items_for_one_choice:function(t){if(t.hasClass("infinite")){var n=this.get_group(t),r=e.all(this.selectors.drops_in_group(n)).size();for(var i=0;i0)n!==!0&&(n-=1),e.later(500,this,this.position_drag_items,[t,n])},position_drag_item:function(t){if(!t.hasClass("yui3-dd-dragging"))if(!this.placed[this.get_no(t)]){var n=this.get_group(t),r=this.get_choice(t),i=e.one(this.selectors.drag_home(n,r));t.setXY(i.getXY()),t.addClass("unplaced")}else{var s=this +.placed[this.get_no(t)],o=e.one(this.selectors.drop_for_place(s));t.setXY([o.getX()+2,o.getY()+2]),t.removeClass("unplaced")}},drop_zone_key_press:function(e){switch(e.direction){case"next":this.place_next_drag_in(e.target);break;case"previous":this.place_previous_drag_in(e.target);break;case"remove":this.remove_drag_from_drop(e.target)}e.preventDefault()},place_next_drag_in:function(e){this.choose_next_choice_for_drop(e,1)},place_previous_drag_in:function(e){this.choose_next_choice_for_drop(e,-1)},choose_next_choice_for_drop:function(t,n){var r,i=this.get_group(t),s=this.current_choice_in_drop(t),o=e.all(this.selectors.unplaced_drags_in_group(i));if(0===s)if(n===1)r=1;else{var u=o.pop();r=this.get_choice(u)}else r=s+n;var a;do{a=e.one(this.selectors.unplaced_drags_for_choice_in_group(r,i));if(e.one(this.selectors.drags_for_choice_in_group(r,i))===null){this.remove_drag_from_drop(t);return}r+=n}while(a===null);this.place_drag_in_drop(a,t)},current_choice_in_drop:function(t){var n=this.get("inputids")[this.get_place(t)],r=e.one("input#"+n);return Number(r.get("value"))}},{NAME:n,ATTRS:{readonly:{value:!1},topnode:{value:null},inputids:{value:null}}}),e.Event.define("dragchange",{_event:e.UA.webkit||e.UA.ie?"keydown":"keypress",_keys:{32:"next",37:"previous",38:"previous",39:"next",40:"next",27:"remove"},_keyHandler:function(e,t){this._keys[e.keyCode]&&(e.direction=this._keys[e.keyCode],t.fire(e))},on:function(e,t,n){t._detacher=e.on(this._event,this._keyHandler,this,n)}}),M.qtype_ddwtos=M.qtype_ddwtos||{},M.qtype_ddwtos.init_question=function(e){return new r(e)}},"@VERSION@",{requires:["node","dd","dd-drop","dd-constrain"]}); diff --git a/question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd.js b/question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd.js index 88f3cb6d2d8..eaad12d19a3 100644 --- a/question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd.js +++ b/question/type/ddwtos/yui/build/moodle-qtype_ddwtos-dd/moodle-qtype_ddwtos-dd.js @@ -34,7 +34,7 @@ var DDWTOS_DD = function() { */ Y.extend(DDWTOS_DD, Y.Base, { selectors: null, - touchscrolldisable: null, + passiveSupported: false, initializer: function() { var pendingid = 'qtype_ddwtos-' + Math.random().toString(36).slice(2); // Random string. M.util.js_pending(pendingid); @@ -51,6 +51,7 @@ Y.extend(DDWTOS_DD, Y.Base, { this.position_drag_items(pendingid); }, this); } + this.checkPassiveSupported(); }, /** * put all our selectors in the same place so we can quickly find and change them later @@ -231,28 +232,34 @@ Y.extend(DDWTOS_DD, Y.Base, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); + }, - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } }, make_drop_zones: function() { @@ -434,4 +441,5 @@ M.qtype_ddwtos.init_question = function(config) { return new DDWTOS_DD(config); }; + }, '@VERSION@', {"requires": ["node", "dd", "dd-drop", "dd-constrain"]}); diff --git a/question/type/ddwtos/yui/src/ddwtos/js/ddwtos.js b/question/type/ddwtos/yui/src/ddwtos/js/ddwtos.js index b02168e3fb6..79fd922e000 100644 --- a/question/type/ddwtos/yui/src/ddwtos/js/ddwtos.js +++ b/question/type/ddwtos/yui/src/ddwtos/js/ddwtos.js @@ -32,7 +32,7 @@ var DDWTOS_DD = function() { */ Y.extend(DDWTOS_DD, Y.Base, { selectors: null, - touchscrolldisable: null, + passiveSupported: false, initializer: function() { var pendingid = 'qtype_ddwtos-' + Math.random().toString(36).slice(2); // Random string. M.util.js_pending(pendingid); @@ -49,6 +49,7 @@ Y.extend(DDWTOS_DD, Y.Base, { this.position_drag_items(pendingid); }, this); } + this.checkPassiveSupported(); }, /** * put all our selectors in the same place so we can quickly find and change them later @@ -229,28 +230,34 @@ Y.extend(DDWTOS_DD, Y.Base, { * draggable items. */ prevent_touchmove_from_scrolling: function(drag) { - var touchstart = (Y.UA.ie) ? 'MSPointerStart' : 'touchstart'; - var touchend = (Y.UA.ie) ? 'MSPointerEnd' : 'touchend'; var touchmove = (Y.UA.ie) ? 'MSPointerMove' : 'touchmove'; + var eventHandler = function(event) { + event.preventDefault(); + }; + var dragId = drag.get('id'); + var el = document.getElementById(dragId); + // Note do not dynamically add events within another event, as this causes issues on iOS11.3. + // See https://github.com/atlassian/react-beautiful-dnd/issues/413 and + // https://bugs.webkit.org/show_bug.cgi?id=184250 for fuller explanation. + el.addEventListener(touchmove, eventHandler, this.passiveSupported ? {passive: false, capture: true} : false); + }, - // Disable scrolling when touching the draggable items. - drag.on(touchstart, function() { - if (this.touchscrolldisable) { - return; // Already disabled. - } - this.touchscrolldisable = Y.one('body').on(touchmove, function(e) { - e = e || window.event; - e.preventDefault(); + /** + * Some older browsers do not support passing an options object to addEventListener. + * This is a check from https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener. + */ + checkPassiveSupported: function() { + try { + var options = Object.defineProperty({}, 'passive', { + get: function() { + this.passiveSupported = true; + }.bind(this) }); - }, this); - - // Allow scrolling after releasing the draggable items. - drag.on(touchend, function() { - if (this.touchscrolldisable) { - this.touchscrolldisable.detach(); - this.touchscrolldisable = null; - } - }, this); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (err) { + this.passiveSupported = false; + } }, make_drop_zones: function() { @@ -430,4 +437,4 @@ Y.Event.define('dragchange', { M.qtype_ddwtos = M.qtype_ddwtos || {}; M.qtype_ddwtos.init_question = function(config) { return new DDWTOS_DD(config); -}; \ No newline at end of file +};