| 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..43b32f0bb3736e2a1a877dbba63eee035e0bd579 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,158 @@ 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(WebInspector.DragHandler._documentForMouseOut);
|
| + },
|
| +
|
| + _disposeGlassPane: function()
|
| + {
|
| + if (!this._glassPaneInUse)
|
| + return;
|
| + this._glassPaneInUse = false;
|
| + if (--WebInspector.DragHandler._glassPaneUsageCount)
|
| + return;
|
| + WebInspector.DragHandler._glassPane.dispose();
|
| + delete WebInspector.DragHandler._glassPane;
|
| + delete WebInspector.DragHandler._documentForMouseOut;
|
| + }
|
| +};
|
| +
|
| +/**
|
| + * @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;
|
| - }
|
| -
|
| var targetDocument = event.target.ownerDocument;
|
| -
|
| - WebInspector._elementDraggingEventListener = elementDrag;
|
| - WebInspector._elementEndDraggingEventListener = elementDragEnd;
|
| - WebInspector._mouseOutWhileDraggingTargetDocument = targetDocument;
|
| - WebInspector._dragEventsTargetDocument = targetDocument;
|
| - WebInspector._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);
|
| + this._elementDraggingEventListener = elementDrag;
|
| + this._elementEndDraggingEventListener = elementDragEnd;
|
| + console.assert((WebInspector.DragHandler._documentForMouseOut || targetDocument) === targetDocument,
|
| + "Dragging on multiple documents.");
|
| + WebInspector.DragHandler._documentForMouseOut = targetDocument;
|
| + this._dragEventsTargetDocument = targetDocument;
|
| + this._dragEventsTargetDocumentTop = targetDocument.defaultView.top.document;
|
| +
|
| + 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 (!WebInspector.DragHandler._documentForMouseOut)
|
| return;
|
| - WebInspector._mouseOutWhileDraggingTargetDocument.removeEventListener("mouseout", WebInspector._mouseOutWhileDragging, true);
|
| - delete WebInspector._mouseOutWhileDraggingTargetDocument;
|
| + WebInspector.DragHandler._documentForMouseOut.removeEventListener("mouseout", this._mouseOutWhileDragging, true);
|
| };
|
|
|
| -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));
|
|
|