| Index: chrome/browser/resources/enhanced_bookmark_manager/js/dnd.js
|
| diff --git a/chrome/browser/resources/enhanced_bookmark_manager/js/dnd.js b/chrome/browser/resources/enhanced_bookmark_manager/js/dnd.js
|
| deleted file mode 100644
|
| index b4859a6310aaaa38723c993580a05ebc6a181fca..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/resources/enhanced_bookmark_manager/js/dnd.js
|
| +++ /dev/null
|
| @@ -1,502 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -cr.define('dnd', function() {
|
| - 'use strict';
|
| -
|
| - /** @const */ var BookmarkList = bmm.BookmarkList;
|
| - /** @const */ var ListItem = cr.ui.ListItem;
|
| - /** @const */ var TreeItem = cr.ui.TreeItem;
|
| -
|
| - /**
|
| - * Enumeration of valid drop locations relative to an element. These are
|
| - * bit masks to allow combining multiple locations in a single value.
|
| - * @enum {number}
|
| - * @const
|
| - */
|
| - var DropPosition = {
|
| - NONE: 0,
|
| - ABOVE: 1,
|
| - ON: 2,
|
| - BELOW: 4
|
| - };
|
| -
|
| - /**
|
| - * @type {Object} Drop information calculated in |handleDragOver|.
|
| - */
|
| - var dropDestination = null;
|
| -
|
| - /**
|
| - * @type {number} Timer id used to help minimize flicker.
|
| - */
|
| - var removeDropIndicatorTimer;
|
| -
|
| - /**
|
| - * The element that had a style applied it to indicate the drop location.
|
| - * This is used to easily remove the style when necessary.
|
| - * @type {Element}
|
| - */
|
| - var lastIndicatorElement;
|
| -
|
| - /**
|
| - * The style that was applied to indicate the drop location.
|
| - * @type {string}
|
| - */
|
| - var lastIndicatorClassName;
|
| -
|
| - var dropIndicator = {
|
| - /**
|
| - * Applies the drop indicator style on the target element and stores that
|
| - * information to easily remove the style in the future.
|
| - */
|
| - addDropIndicatorStyle: function(indicatorElement, position) {
|
| - var indicatorStyleName = position == DropPosition.ABOVE ? 'drag-above' :
|
| - position == DropPosition.BELOW ? 'drag-below' :
|
| - 'drag-on';
|
| -
|
| - lastIndicatorElement = indicatorElement;
|
| - lastIndicatorClassName = indicatorStyleName;
|
| -
|
| - indicatorElement.classList.add(indicatorStyleName);
|
| - },
|
| -
|
| - /**
|
| - * Clears the drop indicator style from the last element was the drop target
|
| - * so the drop indicator is no longer for that element.
|
| - */
|
| - removeDropIndicatorStyle: function() {
|
| - if (!lastIndicatorElement || !lastIndicatorClassName)
|
| - return;
|
| - lastIndicatorElement.classList.remove(lastIndicatorClassName);
|
| - lastIndicatorElement = null;
|
| - lastIndicatorClassName = null;
|
| - },
|
| -
|
| - /**
|
| - * Displays the drop indicator on the current drop target to give the
|
| - * user feedback on where the drop will occur.
|
| - */
|
| - update: function(dropDest) {
|
| - window.clearTimeout(removeDropIndicatorTimer);
|
| -
|
| - var indicatorElement = dropDest.element;
|
| - var position = dropDest.position;
|
| - if (dropDest.element instanceof BookmarkList) {
|
| - // For an empty bookmark list use 'drop-above' style.
|
| - position = DropPosition.ABOVE;
|
| - } else if (dropDest.element instanceof TreeItem) {
|
| - indicatorElement = indicatorElement.querySelector('.tree-row');
|
| - }
|
| - dropIndicator.removeDropIndicatorStyle();
|
| - dropIndicator.addDropIndicatorStyle(indicatorElement, position);
|
| - },
|
| -
|
| - /**
|
| - * Stop displaying the drop indicator.
|
| - */
|
| - finish: function() {
|
| - // The use of a timeout is in order to reduce flickering as we move
|
| - // between valid drop targets.
|
| - window.clearTimeout(removeDropIndicatorTimer);
|
| - removeDropIndicatorTimer = window.setTimeout(function() {
|
| - dropIndicator.removeDropIndicatorStyle();
|
| - }, 100);
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * Delay for expanding folder when pointer hovers on folder in tree view in
|
| - * milliseconds.
|
| - * @type {number}
|
| - * @const
|
| - */
|
| - // TODO(yosin): EXPAND_FOLDER_DELAY should follow system settings. 400ms is
|
| - // taken from Windows default settings.
|
| - var EXPAND_FOLDER_DELAY = 400;
|
| -
|
| - /**
|
| - * The timestamp when the mouse was over a folder during a drag operation.
|
| - * Used to open the hovered folder after a certain time.
|
| - * @type {number}
|
| - */
|
| - var lastHoverOnFolderTimeStamp = 0;
|
| -
|
| - /**
|
| - * Expand a folder if the user has hovered for longer than the specified
|
| - * time during a drag action.
|
| - */
|
| - function updateAutoExpander(eventTimeStamp, overElement) {
|
| - // Expands a folder in tree view when pointer hovers on it longer than
|
| - // EXPAND_FOLDER_DELAY.
|
| - var hoverOnFolderTimeStamp = lastHoverOnFolderTimeStamp;
|
| - lastHoverOnFolderTimeStamp = 0;
|
| - if (hoverOnFolderTimeStamp) {
|
| - if (eventTimeStamp - hoverOnFolderTimeStamp >= EXPAND_FOLDER_DELAY)
|
| - overElement.expanded = true;
|
| - else
|
| - lastHoverOnFolderTimeStamp = hoverOnFolderTimeStamp;
|
| - } else if (overElement instanceof TreeItem &&
|
| - bmm.isFolder(overElement.bookmarkNode) &&
|
| - overElement.hasChildren &&
|
| - !overElement.expanded) {
|
| - lastHoverOnFolderTimeStamp = eventTimeStamp;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Stores the information abou the bookmark and folders being dragged.
|
| - * @type {Object}
|
| - */
|
| - var dragData = null;
|
| - var dragInfo = {
|
| - handleChromeDragEnter: function(newDragData) {
|
| - dragData = newDragData;
|
| - },
|
| - clearDragData: function() {
|
| - dragData = null;
|
| - },
|
| - isDragValid: function() {
|
| - return !!dragData;
|
| - },
|
| - isSameProfile: function() {
|
| - return dragData && dragData.sameProfile;
|
| - },
|
| - isDraggingFolders: function() {
|
| - return dragData && dragData.elements.some(function(node) {
|
| - return !node.url;
|
| - });
|
| - },
|
| - isDraggingBookmark: function(bookmarkId) {
|
| - return dragData && dragData.elements.some(function(node) {
|
| - return node.id == bookmarkId;
|
| - });
|
| - },
|
| - isDraggingChildBookmark: function(folderId) {
|
| - return dragData && dragData.elements.some(function(node) {
|
| - return node.parentId == folderId;
|
| - });
|
| - },
|
| - isDraggingFolderToDescendant: function(bookmarkNode) {
|
| - return dragData && dragData.elements.some(function(node) {
|
| - var dragFolder = bmm.treeLookup[node.id];
|
| - var dragFolderNode = dragFolder && dragFolder.bookmarkNode;
|
| - return dragFolderNode && bmm.contains(dragFolderNode, bookmarkNode);
|
| - });
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * External function to select folders or bookmarks after a drop action.
|
| - * @type {function}
|
| - */
|
| - var selectItemsAfterUserAction = null;
|
| -
|
| - function getBookmarkElement(el) {
|
| - while (el && !el.bookmarkNode) {
|
| - el = el.parentNode;
|
| - }
|
| - return el;
|
| - }
|
| -
|
| - // If we are over the list and the list is showing search result, we cannot
|
| - // drop.
|
| - function isOverSearch(overElement) {
|
| - return list.isSearch() && list.contains(overElement);
|
| - }
|
| -
|
| - /**
|
| - * Determines the valid drop positions for the given target element.
|
| - * @param {!HTMLElement} overElement The element that we are currently
|
| - * dragging over.
|
| - * @return {DropPosition} An bit field enumeration of valid drop locations.
|
| - */
|
| - function calculateValidDropTargets(overElement) {
|
| - if (!dragInfo.isDragValid() || isOverSearch(overElement))
|
| - return DropPosition.NONE;
|
| -
|
| - if (dragInfo.isSameProfile() &&
|
| - (dragInfo.isDraggingBookmark(overElement.bookmarkNode.id) ||
|
| - dragInfo.isDraggingFolderToDescendant(overElement.bookmarkNode))) {
|
| - return DropPosition.NONE;
|
| - }
|
| -
|
| - var canDropInfo = calculateDropAboveBelow(overElement);
|
| - if (canDropOn(overElement))
|
| - canDropInfo |= DropPosition.ON;
|
| -
|
| - return canDropInfo;
|
| - }
|
| -
|
| - function calculateDropAboveBelow(overElement) {
|
| - if (overElement instanceof BookmarkList)
|
| - return DropPosition.NONE;
|
| -
|
| - // We cannot drop between Bookmarks bar and Other bookmarks.
|
| - if (overElement.bookmarkNode.parentId == bmm.ROOT_ID)
|
| - return DropPosition.NONE;
|
| -
|
| - var isOverTreeItem = overElement instanceof TreeItem;
|
| - var isOverExpandedTree = isOverTreeItem && overElement.expanded;
|
| - var isDraggingFolders = dragInfo.isDraggingFolders();
|
| -
|
| - // We can only drop between items in the tree if we have any folders.
|
| - if (isOverTreeItem && !isDraggingFolders)
|
| - return DropPosition.NONE;
|
| -
|
| - // When dragging from a different profile we do not need to consider
|
| - // conflicts between the dragged items and the drop target.
|
| - if (!dragInfo.isSameProfile()) {
|
| - // Don't allow dropping below an expanded tree item since it is confusing
|
| - // to the user anyway.
|
| - return isOverExpandedTree ? DropPosition.ABOVE :
|
| - (DropPosition.ABOVE | DropPosition.BELOW);
|
| - }
|
| -
|
| - var resultPositions = DropPosition.NONE;
|
| -
|
| - // Cannot drop above if the item above is already in the drag source.
|
| - var previousElem = overElement.previousElementSibling;
|
| - if (!previousElem || !dragInfo.isDraggingBookmark(previousElem.bookmarkId))
|
| - resultPositions |= DropPosition.ABOVE;
|
| -
|
| - // Don't allow dropping below an expanded tree item since it is confusing
|
| - // to the user anyway.
|
| - if (isOverExpandedTree)
|
| - return resultPositions;
|
| -
|
| - // Cannot drop below if the item below is already in the drag source.
|
| - var nextElement = overElement.nextElementSibling;
|
| - if (!nextElement || !dragInfo.isDraggingBookmark(nextElement.bookmarkId))
|
| - resultPositions |= DropPosition.BELOW;
|
| -
|
| - return resultPositions;
|
| - }
|
| -
|
| - /**
|
| - * Determine whether we can drop the dragged items on the drop target.
|
| - * @param {!HTMLElement} overElement The element that we are currently
|
| - * dragging over.
|
| - * @return {boolean} Whether we can drop the dragged items on the drop
|
| - * target.
|
| - */
|
| - function canDropOn(overElement) {
|
| - // We can only drop on a folder.
|
| - if (!bmm.isFolder(overElement.bookmarkNode))
|
| - return false;
|
| -
|
| - if (!dragInfo.isSameProfile())
|
| - return true;
|
| -
|
| - if (overElement instanceof BookmarkList) {
|
| - // We are trying to drop an item past the last item. This is
|
| - // only allowed if dragged item is different from the last item
|
| - // in the list.
|
| - var listItems = list.items;
|
| - var len = listItems.length;
|
| - if (!len || !dragInfo.isDraggingBookmark(listItems[len - 1].bookmarkId))
|
| - return true;
|
| - }
|
| -
|
| - return !dragInfo.isDraggingChildBookmark(overElement.bookmarkNode.id);
|
| - }
|
| -
|
| - /**
|
| - * Callback for the dragstart event.
|
| - * @param {Event} e The dragstart event.
|
| - */
|
| - function handleDragStart(e) {
|
| - // Determine the selected bookmarks.
|
| - var target = e.target;
|
| - var draggedNodes = [];
|
| - if (target instanceof ListItem) {
|
| - // Use selected items.
|
| - draggedNodes = target.parentNode.selectedItems;
|
| - } else if (target instanceof TreeItem) {
|
| - draggedNodes.push(target.bookmarkNode);
|
| - }
|
| -
|
| - // We manage starting the drag by using the extension API.
|
| - e.preventDefault();
|
| -
|
| - if (draggedNodes.length) {
|
| - // If we are dragging a single link, we can do the *Link* effect.
|
| - // Otherwise, we only allow copy and move.
|
| - e.dataTransfer.effectAllowed = draggedNodes.length == 1 &&
|
| - !bmm.isFolder(draggedNodes[0]) ? 'copyMoveLink' : 'copyMove';
|
| -
|
| - chrome.bookmarkManagerPrivate.startDrag(draggedNodes.map(function(node) {
|
| - return node.id;
|
| - }));
|
| - }
|
| - }
|
| -
|
| - function handleDragEnter(e) {
|
| - e.preventDefault();
|
| - }
|
| -
|
| - /**
|
| - * Calback for the dragover event.
|
| - * @param {Event} e The dragover event.
|
| - */
|
| - function handleDragOver(e) {
|
| - // Allow DND on text inputs.
|
| - if (e.target.tagName != 'INPUT') {
|
| - // The default operation is to allow dropping links etc to do navigation.
|
| - // We never want to do that for the bookmark manager.
|
| - e.preventDefault();
|
| -
|
| - // Set to none. This will get set to something if we can do the drop.
|
| - e.dataTransfer.dropEffect = 'none';
|
| - }
|
| -
|
| - if (!dragInfo.isDragValid())
|
| - return;
|
| -
|
| - var overElement = getBookmarkElement(e.target) ||
|
| - (e.target == list ? list : null);
|
| - if (!overElement)
|
| - return;
|
| -
|
| - updateAutoExpander(e.timeStamp, overElement);
|
| -
|
| - var canDropInfo = calculateValidDropTargets(overElement);
|
| - if (canDropInfo == DropPosition.NONE)
|
| - return;
|
| -
|
| - // Now we know that we can drop. Determine if we will drop above, on or
|
| - // below based on mouse position etc.
|
| -
|
| - dropDestination = calcDropPosition(e.clientY, overElement, canDropInfo);
|
| - if (!dropDestination) {
|
| - e.dataTransfer.dropEffect = 'none';
|
| - return;
|
| - }
|
| -
|
| - e.dataTransfer.dropEffect = dragInfo.isSameProfile() ? 'move' : 'copy';
|
| - dropIndicator.update(dropDestination);
|
| - }
|
| -
|
| - /**
|
| - * This function determines where the drop will occur relative to the element.
|
| - * @return {?Object} If no valid drop position is found, null, otherwise
|
| - * an object containing the following parameters:
|
| - * element - The target element that will receive the drop.
|
| - * position - A |DropPosition| relative to the |element|.
|
| - */
|
| - function calcDropPosition(elementClientY, overElement, canDropInfo) {
|
| - if (overElement instanceof BookmarkList) {
|
| - // Dropping on the BookmarkList either means dropping below the last
|
| - // bookmark element or on the list itself if it is empty.
|
| - var length = overElement.items.length;
|
| - if (length)
|
| - return {
|
| - element: overElement.getListItemByIndex(length - 1),
|
| - position: DropPosition.BELOW
|
| - };
|
| - return {element: overElement, position: DropPosition.ON};
|
| - }
|
| -
|
| - var above = canDropInfo & DropPosition.ABOVE;
|
| - var below = canDropInfo & DropPosition.BELOW;
|
| - var on = canDropInfo & DropPosition.ON;
|
| - var rect = overElement.getBoundingClientRect();
|
| - var yRatio = (elementClientY - rect.top) / rect.height;
|
| -
|
| - if (above && (yRatio <= .25 || yRatio <= .5 && (!below || !on)))
|
| - return {element: overElement, position: DropPosition.ABOVE};
|
| - if (below && (yRatio > .75 || yRatio > .5 && (!above || !on)))
|
| - return {element: overElement, position: DropPosition.BELOW};
|
| - if (on)
|
| - return {element: overElement, position: DropPosition.ON};
|
| - return null;
|
| - }
|
| -
|
| - function calculateDropInfo(eventTarget, dropDestination) {
|
| - if (!dropDestination || !dragInfo.isDragValid())
|
| - return null;
|
| -
|
| - var dropPos = dropDestination.position;
|
| - var relatedNode = dropDestination.element.bookmarkNode;
|
| - var dropInfoResult = {
|
| - selectTarget: null,
|
| - selectedTreeId: -1,
|
| - parentId: dropPos == DropPosition.ON ? relatedNode.id :
|
| - relatedNode.parentId,
|
| - index: -1,
|
| - relatedIndex: -1
|
| - };
|
| -
|
| - // Try to find the index in the dataModel so we don't have to always keep
|
| - // the index for the list items up to date.
|
| - var overElement = getBookmarkElement(eventTarget);
|
| - if (overElement instanceof ListItem) {
|
| - dropInfoResult.relatedIndex =
|
| - overElement.parentNode.dataModel.indexOf(relatedNode);
|
| - dropInfoResult.selectTarget = list;
|
| - } else if (overElement instanceof BookmarkList) {
|
| - dropInfoResult.relatedIndex = overElement.dataModel.length - 1;
|
| - dropInfoResult.selectTarget = list;
|
| - } else {
|
| - // Tree
|
| - dropInfoResult.relatedIndex = relatedNode.index;
|
| - dropInfoResult.selectTarget = tree;
|
| - dropInfoResult.selectedTreeId =
|
| - tree.selectedItem ? tree.selectedItem.bookmarkId : null;
|
| - }
|
| -
|
| - if (dropPos == DropPosition.ABOVE)
|
| - dropInfoResult.index = dropInfoResult.relatedIndex;
|
| - else if (dropPos == DropPosition.BELOW)
|
| - dropInfoResult.index = dropInfoResult.relatedIndex + 1;
|
| -
|
| - return dropInfoResult;
|
| - }
|
| -
|
| - function handleDragLeave(e) {
|
| - dropIndicator.finish();
|
| - }
|
| -
|
| - function handleDrop(e) {
|
| - var dropInfo = calculateDropInfo(e.target, dropDestination);
|
| - if (dropInfo) {
|
| - selectItemsAfterUserAction(dropInfo.selectTarget,
|
| - dropInfo.selectedTreeId);
|
| - if (dropInfo.index != -1)
|
| - chrome.bookmarkManagerPrivate.drop(dropInfo.parentId, dropInfo.index);
|
| - else
|
| - chrome.bookmarkManagerPrivate.drop(dropInfo.parentId);
|
| -
|
| - e.preventDefault();
|
| - }
|
| - dropDestination = null;
|
| - dropIndicator.finish();
|
| - }
|
| -
|
| - function clearDragData() {
|
| - dragInfo.clearDragData();
|
| - dropDestination = null;
|
| - }
|
| -
|
| - function init(selectItemsAfterUserActionFunction) {
|
| - function deferredClearData() {
|
| - setTimeout(clearDragData);
|
| - }
|
| -
|
| - selectItemsAfterUserAction = selectItemsAfterUserActionFunction;
|
| -
|
| - document.addEventListener('dragstart', handleDragStart);
|
| - document.addEventListener('dragenter', handleDragEnter);
|
| - document.addEventListener('dragover', handleDragOver);
|
| - document.addEventListener('dragleave', handleDragLeave);
|
| - document.addEventListener('drop', handleDrop);
|
| - document.addEventListener('dragend', deferredClearData);
|
| - document.addEventListener('mouseup', deferredClearData);
|
| -
|
| - chrome.bookmarkManagerPrivate.onDragEnter.addListener(
|
| - dragInfo.handleChromeDragEnter);
|
| - chrome.bookmarkManagerPrivate.onDragLeave.addListener(deferredClearData);
|
| - chrome.bookmarkManagerPrivate.onDrop.addListener(deferredClearData);
|
| - }
|
| - return {init: init};
|
| -});
|
|
|