From d1e7e648e6bb8b4e4efef8bb7c29f75d3111d89a Mon Sep 17 00:00:00 2001 From: Arthur Lutkevichus Date: Fri, 20 May 2016 10:45:59 +0300 Subject: [PATCH 1/4] Fixes bug with backdrop close event Fixes bug with text selection and mouse up event on modal backdrop. --- src/modal/modal.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/modal/modal.js b/src/modal/modal.js index 356299da8b..3047a94bc0 100644 --- a/src/modal/modal.js +++ b/src/modal/modal.js @@ -145,12 +145,14 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.p element.addClass(attrs.windowClass || ''); element.addClass(attrs.windowTopClass || ''); scope.size = attrs.size; + scope.mouseDownEvt = scope.mouseUpEvt = null; scope.close = function(evt) { var modal = $modalStack.getTop(); if (modal && modal.value.backdrop && modal.value.backdrop !== 'static' && - evt.target === evt.currentTarget) { + scope.mouseDownEvt && scope.mouseUpEvt && + scope.mouseDownEvt.target === scope.mouseUpEvt.target) { evt.preventDefault(); evt.stopPropagation(); $modalStack.dismiss(modal.key, 'backdrop click'); @@ -159,6 +161,12 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.p // moved from template to fix issue #2280 element.on('click', scope.close); + element.on('mousedown', function(evt) { + scope.mouseDownEvt = evt; + }); + element.on('mouseup', function(evt) { + scope.mouseUpEvt = evt; + }); // This property is only added to the scope for the purpose of detecting when this directive is rendered. // We can detect that by using this property in the template associated with this directive and then use From a5c6f74bbfcdec105ad77aab22c3c056cae63190 Mon Sep 17 00:00:00 2001 From: Arthur Lutkevichus Date: Fri, 20 May 2016 11:02:15 +0300 Subject: [PATCH 2/4] Fix --- src/modal/modal.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modal/modal.js b/src/modal/modal.js index 3047a94bc0..42f2a7b82d 100644 --- a/src/modal/modal.js +++ b/src/modal/modal.js @@ -151,6 +151,7 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.p var modal = $modalStack.getTop(); if (modal && modal.value.backdrop && modal.value.backdrop !== 'static' && + evt.target === evt.currentTarget && scope.mouseDownEvt && scope.mouseUpEvt && scope.mouseDownEvt.target === scope.mouseUpEvt.target) { evt.preventDefault(); From cee666fca1cf0dd0f5a3822e4b945e6835a0bbcb Mon Sep 17 00:00:00 2001 From: Arthur Lutkevichus Date: Sat, 21 May 2016 00:21:06 +0300 Subject: [PATCH 3/4] fix(modal): Tests fixes --- src/modal/test/modal.spec.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modal/test/modal.spec.js b/src/modal/test/modal.spec.js index 1e43b037d2..6d0cebb656 100644 --- a/src/modal/test/modal.spec.js +++ b/src/modal/test/modal.spec.js @@ -427,7 +427,10 @@ describe('$uibModal', function() { var modal = open({template: '
Content
'}); expect($document).toHaveModalsOpen(1); - $document.find('body > div.modal').click(); + var selector = 'body > div.modal'; + $document.find(selector).mousedown(); + $document.find(selector).mouseup(); + $document.find(selector).click(); $animate.flush(); $rootScope.$digest(); $animate.flush(); From 21ab5987f17e36a7b2f7257a2d12e2ec1e4ec7e9 Mon Sep 17 00:00:00 2001 From: Arthur Lutkevichus Date: Mon, 23 May 2016 12:26:39 +0300 Subject: [PATCH 4/4] Optimizations --- src/modal/modal.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/modal/modal.js b/src/modal/modal.js index 42f2a7b82d..ac4bb3b272 100644 --- a/src/modal/modal.js +++ b/src/modal/modal.js @@ -145,15 +145,12 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.p element.addClass(attrs.windowClass || ''); element.addClass(attrs.windowTopClass || ''); scope.size = attrs.size; - scope.mouseDownEvt = scope.mouseUpEvt = null; scope.close = function(evt) { var modal = $modalStack.getTop(); if (modal && modal.value.backdrop && modal.value.backdrop !== 'static' && - evt.target === evt.currentTarget && - scope.mouseDownEvt && scope.mouseUpEvt && - scope.mouseDownEvt.target === scope.mouseUpEvt.target) { + evt.target === evt.currentTarget) { evt.preventDefault(); evt.stopPropagation(); $modalStack.dismiss(modal.key, 'backdrop click'); @@ -161,12 +158,13 @@ angular.module('ui.bootstrap.modal', ['ui.bootstrap.stackedMap', 'ui.bootstrap.p }; // moved from template to fix issue #2280 - element.on('click', scope.close); - element.on('mousedown', function(evt) { - scope.mouseDownEvt = evt; - }); - element.on('mouseup', function(evt) { - scope.mouseUpEvt = evt; + + element.on('mousedown', function(evt1) { + element.one('mouseup', function(evt2) { + if (evt1.target === evt2.target) { + scope.close.apply(this, arguments); + } + }); }); // This property is only added to the scope for the purpose of detecting when this directive is rendered.