Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1030)

Unified Diff: chrome/browser/resources/enhanced_bookmark_manager/js/dnd.js

Issue 200063003: Remove enhanced bookmarks extension (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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};
-});

Powered by Google App Engine
This is Rietveld 408576698