Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js | 
| diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js | 
| index 6320c16a6666fcf251bd90051cff2fe2176bba7d..f52714f6c8e90cd2da5c711a1d177663e873d159 100644 | 
| --- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js | 
| +++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js | 
| @@ -48,7 +48,8 @@ WebInspector.installDragHandle = function(element, elementDragStart, elementDrag | 
| */ | 
| function onMouseDown(event) | 
| { | 
| - var dragStart = WebInspector.elementDragStart.bind(null, element, elementDragStart, elementDrag, elementDragEnd, cursor, event); | 
| + var dragHandler = new WebInspector.DragHandler(); | 
| + var dragStart = dragHandler.elementDragStart.bind(dragHandler, element, elementDragStart, elementDrag, elementDragEnd, cursor, event); | 
| if (startDelay) | 
| startTimer = setTimeout(dragStart, startDelay); | 
| else | 
| @@ -80,118 +81,159 @@ WebInspector.installDragHandle = function(element, elementDragStart, elementDrag | 
| */ | 
| WebInspector.elementDragStart = function(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event) | 
| { | 
| + var dragHandler = new WebInspector.DragHandler(); | 
| + dragHandler.elementDragStart(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event); | 
| +}; | 
| + | 
| +/** | 
| + * @constructor | 
| + */ | 
| +WebInspector.DragHandler = function() | 
| +{ | 
| + this._elementDragMove = this._elementDragMove.bind(this); | 
| + this._elementDragEnd = this._elementDragEnd.bind(this); | 
| + this._mouseOutWhileDragging = this._mouseOutWhileDragging.bind(this); | 
| +} | 
| + | 
| +WebInspector.DragHandler._glassPaneUsageCount = 0; | 
| + | 
| +WebInspector.DragHandler.prototype = { | 
| + _createGlassPane: function() | 
| + { | 
| + this._glassPaneInUse = true; | 
| + if (!WebInspector.DragHandler._glassPaneUsageCount++) | 
| + WebInspector.DragHandler._glassPane = new WebInspector.GlassPane(this._mouseOutWhileDraggingTargetDocument); | 
| 
 
pfeldman
2016/10/26 19:30:07
_documentForMouseOut, also this will break on simu
 
 | 
| + }, | 
| + | 
| + _disposeGlassPane: function() | 
| + { | 
| + if (!this._glassPaneInUse) | 
| + return; | 
| + this._glassPaneInUse = false; | 
| + if (--WebInspector.DragHandler._glassPaneUsageCount) | 
| + return; | 
| + WebInspector.DragHandler._glassPane.dispose(); | 
| + delete WebInspector.DragHandler._glassPane; | 
| + } | 
| +}; | 
| + | 
| +/** | 
| + * @param {!Element} targetElement | 
| + * @param {?function(!MouseEvent):boolean} elementDragStart | 
| + * @param {function(!MouseEvent)} elementDrag | 
| + * @param {?function(!MouseEvent)} elementDragEnd | 
| + * @param {string} cursor | 
| + * @param {!Event} event | 
| + */ | 
| +WebInspector.DragHandler.prototype.elementDragStart = function(targetElement, elementDragStart, elementDrag, elementDragEnd, cursor, event) | 
| +{ | 
| // Only drag upon left button. Right will likely cause a context menu. So will ctrl-click on mac. | 
| if (event.button || (WebInspector.isMac() && event.ctrlKey)) | 
| return; | 
| - if (WebInspector._elementDraggingEventListener) | 
| + if (this._elementDraggingEventListener) | 
| return; | 
| if (elementDragStart && !elementDragStart(/** @type {!MouseEvent} */ (event))) | 
| return; | 
| - if (WebInspector._elementDraggingGlassPane) { | 
| - WebInspector._elementDraggingGlassPane.dispose(); | 
| - delete WebInspector._elementDraggingGlassPane; | 
| - } | 
| + this._disposeGlassPane(); | 
| var targetDocument = event.target.ownerDocument; | 
| - WebInspector._elementDraggingEventListener = elementDrag; | 
| - WebInspector._elementEndDraggingEventListener = elementDragEnd; | 
| - WebInspector._mouseOutWhileDraggingTargetDocument = targetDocument; | 
| - WebInspector._dragEventsTargetDocument = targetDocument; | 
| - WebInspector._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document; | 
| + this._elementDraggingEventListener = elementDrag; | 
| + this._elementEndDraggingEventListener = elementDragEnd; | 
| + this._mouseOutWhileDraggingTargetDocument = targetDocument; | 
| + this._dragEventsTargetDocument = targetDocument; | 
| + this._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document; | 
| - targetDocument.addEventListener("mousemove", WebInspector._elementDragMove, true); | 
| - targetDocument.addEventListener("mouseup", WebInspector._elementDragEnd, true); | 
| - targetDocument.addEventListener("mouseout", WebInspector._mouseOutWhileDragging, true); | 
| - if (targetDocument !== WebInspector._dragEventsTargetDocumentTop) | 
| - WebInspector._dragEventsTargetDocumentTop.addEventListener("mouseup", WebInspector._elementDragEnd, true); | 
| + targetDocument.addEventListener("mousemove", this._elementDragMove, true); | 
| + targetDocument.addEventListener("mouseup", this._elementDragEnd, true); | 
| + targetDocument.addEventListener("mouseout", this._mouseOutWhileDragging, true); | 
| + if (targetDocument !== this._dragEventsTargetDocumentTop) | 
| + this._dragEventsTargetDocumentTop.addEventListener("mouseup", this._elementDragEnd, true); | 
| if (typeof cursor === "string") { | 
| - WebInspector._restoreCursorAfterDrag = restoreCursor.bind(null, targetElement.style.cursor); | 
| + this._restoreCursorAfterDrag = restoreCursor.bind(this, targetElement.style.cursor); | 
| targetElement.style.cursor = cursor; | 
| targetDocument.body.style.cursor = cursor; | 
| } | 
| + /** | 
| + * @param {string} oldCursor | 
| + * @this {WebInspector.DragHandler} | 
| + */ | 
| function restoreCursor(oldCursor) | 
| { | 
| targetDocument.body.style.removeProperty("cursor"); | 
| targetElement.style.cursor = oldCursor; | 
| - WebInspector._restoreCursorAfterDrag = null; | 
| + this._restoreCursorAfterDrag = null; | 
| } | 
| event.preventDefault(); | 
| }; | 
| -WebInspector._mouseOutWhileDragging = function() | 
| +WebInspector.DragHandler.prototype._mouseOutWhileDragging = function() | 
| { | 
| - var document = WebInspector._mouseOutWhileDraggingTargetDocument; | 
| - WebInspector._unregisterMouseOutWhileDragging(); | 
| - WebInspector._elementDraggingGlassPane = new WebInspector.GlassPane(document); | 
| + this._unregisterMouseOutWhileDragging(); | 
| + this._createGlassPane(); | 
| }; | 
| -WebInspector._unregisterMouseOutWhileDragging = function() | 
| +WebInspector.DragHandler.prototype._unregisterMouseOutWhileDragging = function() | 
| { | 
| - if (!WebInspector._mouseOutWhileDraggingTargetDocument) | 
| + if (!this._mouseOutWhileDraggingTargetDocument) | 
| return; | 
| - WebInspector._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout", WebInspector._mouseOutWhileDragging, true); | 
| - delete WebInspector._mouseOutWhileDraggingTargetDocument; | 
| + this._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout", this._mouseOutWhileDragging, true); | 
| + delete this._mouseOutWhileDraggingTargetDocument; | 
| }; | 
| -WebInspector._unregisterDragEvents = function() | 
| +WebInspector.DragHandler.prototype._unregisterDragEvents = function() | 
| { | 
| - if (!WebInspector._dragEventsTargetDocument) | 
| + if (!this._dragEventsTargetDocument) | 
| return; | 
| - WebInspector._dragEventsTargetDocument.removeEventListener("mousemove", WebInspector._elementDragMove, true); | 
| - WebInspector._dragEventsTargetDocument.removeEventListener("mouseup", WebInspector._elementDragEnd, true); | 
| - if (WebInspector._dragEventsTargetDocument !== WebInspector._dragEventsTargetDocumentTop) | 
| - WebInspector._dragEventsTargetDocumentTop.removeEventListener("mouseup", WebInspector._elementDragEnd, true); | 
| - delete WebInspector._dragEventsTargetDocument; | 
| - delete WebInspector._dragEventsTargetDocumentTop; | 
| + this._dragEventsTargetDocument.removeEventListener("mousemove", this._elementDragMove, true); | 
| + this._dragEventsTargetDocument.removeEventListener("mouseup", this._elementDragEnd, true); | 
| + if (this._dragEventsTargetDocument !== this._dragEventsTargetDocumentTop) | 
| + this._dragEventsTargetDocumentTop.removeEventListener("mouseup", this._elementDragEnd, true); | 
| + delete this._dragEventsTargetDocument; | 
| + delete this._dragEventsTargetDocumentTop; | 
| }; | 
| /** | 
| * @param {!Event} event | 
| */ | 
| -WebInspector._elementDragMove = function(event) | 
| +WebInspector.DragHandler.prototype._elementDragMove = function(event) | 
| { | 
| if (event.buttons !== 1) { | 
| - WebInspector._elementDragEnd(event); | 
| + this._elementDragEnd(event); | 
| return; | 
| } | 
| - | 
| - if (WebInspector._elementDraggingEventListener(/** @type {!MouseEvent} */ (event))) | 
| - WebInspector._cancelDragEvents(event); | 
| + if (this._elementDraggingEventListener(/** @type {!MouseEvent} */ (event))) | 
| + this._cancelDragEvents(event); | 
| }; | 
| /** | 
| * @param {!Event} event | 
| */ | 
| -WebInspector._cancelDragEvents = function(event) | 
| +WebInspector.DragHandler.prototype._cancelDragEvents = function(event) | 
| { | 
| - WebInspector._unregisterDragEvents(); | 
| - WebInspector._unregisterMouseOutWhileDragging(); | 
| + this._unregisterDragEvents(); | 
| + this._unregisterMouseOutWhileDragging(); | 
| - if (WebInspector._restoreCursorAfterDrag) | 
| - WebInspector._restoreCursorAfterDrag(); | 
| + if (this._restoreCursorAfterDrag) | 
| + this._restoreCursorAfterDrag(); | 
| - if (WebInspector._elementDraggingGlassPane) | 
| - WebInspector._elementDraggingGlassPane.dispose(); | 
| + this._disposeGlassPane(); | 
| - delete WebInspector._elementDraggingGlassPane; | 
| - delete WebInspector._elementDraggingEventListener; | 
| - delete WebInspector._elementEndDraggingEventListener; | 
| + delete this._elementDraggingEventListener; | 
| + delete this._elementEndDraggingEventListener; | 
| }; | 
| /** | 
| * @param {!Event} event | 
| */ | 
| -WebInspector._elementDragEnd = function(event) | 
| +WebInspector.DragHandler.prototype._elementDragEnd = function(event) | 
| { | 
| - var elementDragEnd = WebInspector._elementEndDraggingEventListener; | 
| - | 
| - WebInspector._cancelDragEvents(/** @type {!MouseEvent} */ (event)); | 
| - | 
| + var elementDragEnd = this._elementEndDraggingEventListener; | 
| + this._cancelDragEvents(/** @type {!MouseEvent} */ (event)); | 
| event.preventDefault(); | 
| if (elementDragEnd) | 
| elementDragEnd(/** @type {!MouseEvent} */ (event)); |