summaryrefslogtreecommitdiffstats
path: root/chrome/browser/resources/new_new_tab.js
diff options
context:
space:
mode:
authorarv@google.com <arv@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-24 02:30:04 +0000
committerarv@google.com <arv@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-24 02:30:04 +0000
commit20b89a1a9040b58769175c20bb35d641b2b102cc (patch)
tree8b1955da88944fd6a26011725f971cdc4cf177f1 /chrome/browser/resources/new_new_tab.js
parent3d9f72d6faaae107ab843acfe87806ab966e12be (diff)
downloadchromium_src-20b89a1a9040b58769175c20bb35d641b2b102cc.zip
chromium_src-20b89a1a9040b58769175c20bb35d641b2b102cc.tar.gz
chromium_src-20b89a1a9040b58769175c20bb35d641b2b102cc.tar.bz2
Fix issue where the closed window menu got cut off.
Also, fix issue where the recent items could not be executed using the keyboard. BUG=15104, 15111 TEST=Open a new window with 5+ tabs and close it. Then go to the new new tab page and mouseover the item "5" tabs". It should show the whole menu and you should also be able to tab to it and pressing enter when focused should reopen the window. Review URL: http://codereview.chromium.org/147054 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@19093 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/resources/new_new_tab.js')
-rw-r--r--chrome/browser/resources/new_new_tab.js83
1 files changed, 72 insertions, 11 deletions
diff --git a/chrome/browser/resources/new_new_tab.js b/chrome/browser/resources/new_new_tab.js
index 33c06af..9c04e09 100644
--- a/chrome/browser/resources/new_new_tab.js
+++ b/chrome/browser/resources/new_new_tab.js
@@ -28,11 +28,19 @@ function findAncestorByClass(el, className) {
});
}
-function findAncestor(el, predicate) {
- while (el != null && !predicate(el)) {
- el = el.parentNode;
+/**
+ * Return the first ancestor for which the {@code predicate} returns true.
+ * @param {Node} node The node to check.
+ * @param {function(Node) : boolean} predicate The function that tests the
+ * nodes.
+ * @return {Node} The found ancestor or null if not found.
+ */
+function findAncestor(node, predicate) {
+ var last = false;
+ while (node != null && !(last = predicate(node))) {
+ node = node.parentNode;
}
- return el;
+ return last ? node : null;
}
// WebKit does not have Node.prototype.swapNode
@@ -714,25 +722,78 @@ $('most-visited').addEventListener('click', function(e) {
}
});
-$('downloads').addEventListener('click', function(e) {
- var el = findAncestor(e.target, function(el) {
+function handleIfEnterKey(f) {
+ return function(e) {
+ if (e.keyIdentifier == 'Enter') {
+ f(e);
+ }
+ };
+}
+
+$('downloads').addEventListener('click', maybeOpenFile);
+$('downloads').addEventListener('keydown', handleIfEnterKey(maybeOpenFile));
+
+function maybeOpenFile(e) {
+ var el = findAncestor(e.target, function(el) {
return el.fileId !== undefined;
});
- if (el && el.fileId) {
+ if (el) {
chrome.send('openFile', [String(el.fileId)]);
e.preventDefault();
}
-});
+}
-$('recent-tabs').addEventListener('click', function(e) {
+var recentTabs = $('recent-tabs');
+recentTabs.addEventListener('click', maybeReopenTab);
+recentTabs.addEventListener('keydown', handleIfEnterKey(maybeReopenTab));
+
+function maybeReopenTab(e) {
var el = findAncestor(e.target, function(el) {
return el.sessionId !== undefined;
});
- if (el && el.sessionId !== undefined) {
+ if (el) {
chrome.send('reopenTab', [String(el.sessionId)]);
e.preventDefault();
}
-});
+}
+
+recentTabs.addEventListener('mouseover', maybeShowWindowMenu);
+recentTabs.addEventListener('focus', maybeShowWindowMenu, true);
+recentTabs.addEventListener('mouseout', maybeHideWindowMenu);
+recentTabs.addEventListener('blur', maybeHideWindowMenu, true);
+
+function maybeShowWindowMenu(e) {
+ var el = findAncestor(e.target, function(el) {
+ return el.tabItems !== undefined;
+ });
+ if (el) {
+ showWindowMenu(el, el.tabItems);
+ }
+}
+
+function maybeHideWindowMenu(e) {
+ var el = findAncestor(e.target, function(el) {
+ return el.tabItems !== undefined;
+ });
+ if (el) {
+ $('window-menu').style.display = 'none';
+ }
+}
+
+function showWindowMenu(el, tabs) {
+ var menuEl = $('window-menu');
+ processData('#window-menu', tabs);
+ var rect = el.getBoundingClientRect();
+ var bodyRect = document.body.getBoundingClientRect()
+ var rtl = document.documentElement.dir == 'rtl';
+
+ menuEl.style.display = 'block';
+ menuEl.style.left = (rtl ?
+ rect.left + bodyRect.left + rect.width - menuEl.offsetWidth :
+ rect.left + bodyRect.left) + 'px';
+ menuEl.style.top = rect.top + bodyRect.top + rect.height + 'px';
+
+}
$('thumb-checkbox').addEventListener('change', function(e) {
if (e.target.checked) {