Index: chrome/browser/resources/bookmark_manager/js/main.js |
diff --git a/chrome/browser/resources/bookmark_manager/js/main.js b/chrome/browser/resources/bookmark_manager/js/main.js |
index cf3c7fca2b0edb94105530bb9c73f982da5c516c..86210bb030cedc6d055107d58b87cd4b58e18cc9 100644 |
--- a/chrome/browser/resources/bookmark_manager/js/main.js |
+++ b/chrome/browser/resources/bookmark_manager/js/main.js |
@@ -116,6 +116,20 @@ tree.addEventListener('change', function() { |
}); |
/** |
+ * Add an event listener to a node that will remove itself after firing once. |
+ * @param {!Element} node The DOM node to add the listener to. |
+ * @param {string} name The name of the event listener to add to. |
+ * @param {function(Event)} handler Function called when the event fires. |
+ */ |
+function addOneShotEventListener(node, name, handler) { |
+ var f = function(e) { |
+ handler(e); |
+ node.removeEventListener(name, f); |
+ }; |
+ node.addEventListener(name, f); |
+} |
+ |
+/** |
* Navigates to a bookmark ID. |
* @param {string} id The ID to navigate to. |
* @param {boolean=} opt_updateHashNow Whether to immediately update the |
@@ -150,22 +164,61 @@ function updateParentId(id) { |
tree.selectedItem = bmm.treeLookup[id]; |
} |
-// We listen to hashchange so that we can update the currently shown folder when |
-// the user goes back and forward in the history. |
-window.onhashchange = function(e) { |
+// Process the location hash. This is called onhashchange and when the page is |
+// first loaded. |
+function processHash() { |
var id = window.location.hash.slice(1); |
+ if (!id) { |
+ // If we do not have a hash select first item in the tree. |
+ id = tree.items[0].bookmarkId; |
+ } |
var valid = false; |
+ if (/^[ae]=/.test(id)) { |
+ var command = id[0]; |
+ id = id.slice(2); |
+ if (command == 'e') { |
+ // If hash contains e= edit the item specified. |
+ chrome.bookmarks.get(id, function(bookmarkNodes) { |
+ // Verify the node to edit is a valid node. |
+ if (!bookmarkNodes || bookmarkNodes.length != 1) |
+ return; |
+ var bookmarkNode = bookmarkNodes[0]; |
+ // After the list reloads edit the desired bookmark. |
+ var editBookmark = function(e) { |
+ var index = list.dataModel.findIndexById(bookmarkNode.id); |
+ if (index != -1) { |
+ var sm = list.selectionModel; |
+ sm.anchorIndex = sm.leadIndex = sm.selectedIndex = index; |
+ scrollIntoViewAndMakeEditable(index); |
+ } |
+ } |
- // In case we got a search hash update the text input and the bmm.treeLookup |
- // to use the new id. |
- if (/^q=/.test(id)) { |
+ if (list.parentId == bookmarkNode.parentId) |
+ editBookmark(); |
+ else { |
+ // Navigate to the parent folder, once it's loaded edit the bookmark. |
+ addOneShotEventListener(list, 'load', editBookmark); |
+ updateParentId(bookmarkNode.parentId); |
+ } |
+ }); |
+ // We handle the two cases of navigating to the bookmark to be edited |
+ // above, don't run the standard navigation code below. |
+ return; |
+ } else if (command == 'a') { |
+ // Once the parent folder is loaded add a page bookmark. |
+ addOneShotEventListener(list, 'load', addPage); |
+ } |
+ } else if (/^q=/.test(id)) { |
+ // In case we got a search hash update the text input and the |
+ // bmm.treeLookup to use the new id. |
setSearch(id.slice(2)); |
valid = true; |
} else if (id == 'recent') { |
valid = true; |
} |
+ // Navigate to bookmark 'id' (which may be a query of the form q=query). |
if (valid) { |
updateParentId(id); |
} else { |
@@ -177,6 +230,12 @@ window.onhashchange = function(e) { |
} |
}; |
+// We listen to hashchange so that we can update the currently shown folder when |
+// the user goes back and forward in the history. |
+window.onhashchange = function(e) { |
+ processHash(); |
+}; |
+ |
// Activate is handled by the open-in-same-window-command. |
list.addEventListener('dblclick', function(e) { |
if (e.button == 0) |
@@ -347,21 +406,7 @@ function getFolder(parentId) { |
tree.addEventListener('load', function(e) { |
// Add hard coded tree items |
tree.add(recentTreeItem); |
- |
- // Now we can select a tree item. |
- var hash = window.location.hash.slice(1); |
- if (!hash) { |
- // If we do not have a hash select first item in the tree. |
- hash = tree.items[0].bookmarkId; |
- } |
- |
- if (/^q=/.test(hash)) { |
- var searchTerm = hash.slice(2); |
- $('term').value = searchTerm; |
- setSearch(searchTerm); |
- } else { |
- navigateTo(hash); |
- } |
+ processHash(); |
}); |
tree.reload(); |