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

Unified Diff: chrome/browser/resources/new_new_tab.js

Issue 149163: A couple of NNTP bug fixes (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 6 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
« no previous file with comments | « chrome/browser/resources/new_new_tab.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/new_new_tab.js
===================================================================
--- chrome/browser/resources/new_new_tab.js (revision 19877)
+++ chrome/browser/resources/new_new_tab.js (working copy)
@@ -179,7 +179,6 @@
continue;
}
- t.title = d.title;
t.href = d.url;
t.querySelector('.pin').title = localStrings.getString(d.pinned ?
'unpinthumbnailtooltip' : 'pinthumbnailtooltip');
@@ -190,10 +189,10 @@
// attack but setting style.backgroundImage = 'url(javascript:...)' does
// not execute the JavaScript in WebKit.
t.querySelector('.thumbnail-wrapper').style.backgroundImage =
- 'url(chrome://thumb/' + d.url + ')';
+ 'url("chrome://thumb/' + d.url + '")';
var titleDiv = t.querySelector('.title > div');
- titleDiv.textContent = d.title;
- titleDiv.style.backgroundImage = 'url(chrome://favicon/' + d.url + ')';
+ titleDiv.title = titleDiv.textContent = d.title;
+ titleDiv.style.backgroundImage = 'url("chrome://favicon/' + d.url + '")';
titleDiv.dir = d.direction;
}
}
@@ -734,7 +733,7 @@
this.menu = menu;
this.button.onmousedown = bind(this.handleMouseDown, this);
this.button.onkeydown = bind(this.handleKeyDown, this);
- this.boundHideMenu_ = bind(this.hideMenu, this);
+ this.boundHideMenu_ = bind(this.hide, this);
this.boundMaybeHide_ = bind(this.maybeHide_, this);
this.menu.onmouseover = bind(this.handleMouseOver, this);
this.menu.onmouseout = bind(this.handleMouseOut, this);
@@ -742,7 +741,9 @@
}
OptionMenu.prototype = {
- showMenu: function() {
+ show: function() {
+ windowMenu.hide();
+
this.menu.style.display = 'block';
this.button.focus();
@@ -750,19 +751,17 @@
// user clicks outside the menu or tabs away or the whole window is blurred.
document.addEventListener('focus', this.boundMaybeHide_, true);
document.addEventListener('mousedown', this.boundMaybeHide_, true);
- window.addEventListener('blur', this.boundHideMenu_);
},
- hideMenu: function() {
+ hide: function() {
this.menu.style.display = 'none';
this.setSelectedIndex(-1);
document.removeEventListener('focus', this.boundMaybeHide_, true);
document.removeEventListener('mousedown', this.boundMaybeHide_, true);
- window.removeEventListener('blur', this.boundHide_);
},
- isMenuShown: function() {
+ isShown: function() {
return this.menu.style.display == 'block';
},
@@ -774,15 +773,15 @@
*/
maybeHide_: function(e) {
if (!this.menu.contains(e.target) && !this.button.contains(e.target)) {
- this.hideMenu();
+ this.hide();
}
},
handleMouseDown: function(e) {
- if (this.isMenuShown()) {
- this.hideMenu();
+ if (this.isShown()) {
+ this.hide();
} else {
- this.showMenu();
+ this.show();
}
},
@@ -829,29 +828,35 @@
switch (e.keyIdentifier) {
case 'Down':
- if (!this.isMenuShown()) {
- this.showMenu();
+ if (!this.isShown()) {
+ this.show();
}
selectNextVisible(1);
+ e.preventDefault();
break;
case 'Up':
- if (!this.isMenuShown()) {
- this.showMenu();
+ if (!this.isShown()) {
+ this.show();
}
selectNextVisible(-1);
+ e.preventDefault();
break;
case 'Esc':
case 'U+001B': // Maybe this is remote desktop playing a prank?
- this.hideMenu();
+ this.hide();
break;
case 'Enter':
- if (this.isMenuShown()) {
+ case 'U+0020': // Space
+ if (this.isShown()) {
if (item) {
this.executeItem(item);
+ } else {
+ this.hide();
}
} else {
- this.showMenu();
+ this.show();
}
+ e.preventDefault();
break;
}
},
@@ -885,12 +890,12 @@
hideSection(section);
}
- this.hideMenu();
+ this.hide();
saveShownSections();
}
};
-new OptionMenu($('option-button'), $('option-menu'));
+var optionMenu = new OptionMenu($('option-button'), $('option-menu'));
$('most-visited').addEventListener('click', function(e) {
var target = e.target;
@@ -940,66 +945,113 @@
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);
+ windowMenu.show(e, el, el.tabItems);
}
}
-function maybeHideWindowMenu(e) {
- var el = findAncestor(e.target, function(el) {
- return el.tabItems !== undefined;
- });
- if (el) {
- $('window-menu').style.display = 'none';
- }
+/**
+ * This object represents a window/tooltip representing a closed window. It is
+ * shown when hovering over a closed window item or when the item is focused. It
+ * gets hidden when blurred or when mousing out of the menu or the item.
+ * @param {Element} menuEl The element to use as the menu.
+ * @constructor
+ */
+function WindowMenu(menuEl) {
+ this.menuEl = menuEl;
+ var self = this;
+ this.boundHide_ = bind(this.hide, this);
+ menuEl.onmouseover = function() {
+ clearTimeout(self.timer);
+ };
+ menuEl.onmouseout = this.boundHide_;
}
-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';
+WindowMenu.prototype = {
+ timer: 0,
+ show: function(e, linkEl, tabs) {
+ optionMenu.hide();
- 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';
+ clearTimeout(this.timer);
+ processData('#window-menu', tabs);
+ var rect = linkEl.getBoundingClientRect();
+ var bodyRect = document.body.getBoundingClientRect()
+ var rtl = document.documentElement.dir == 'rtl';
-}
+ this.menuEl.style.display = 'block';
+ this.menuEl.style.left = (rtl ?
+ rect.left + bodyRect.left + rect.width - this.menuEl.offsetWidth :
+ rect.left + bodyRect.left) + 'px';
+ this.menuEl.style.top = rect.top + bodyRect.top + rect.height + 'px';
-$('thumb-checkbox').addEventListener('change', function(e) {
- if (e.target.checked) {
- showSection(Section.THUMB);
- } else {
- hideSection(Section.THUMB);
+ if (e.type == 'focus') {
+ linkEl.onblur = this.boundHide_;
+ } else { // mouseover
+ linkEl.onmouseout = this.boundHide_;
+ }
+ },
+ hide: function() {
+ // Delay before hiding.
+ var self = this;
+ this.timer = setTimeout(function() {
+ self.menuEl.style.display = 'none';
+ }, 100);
}
- saveShownSections();
-});
+};
-$('list-checkbox').addEventListener('change', function(e) {
- if (e.target.checked) {
- showSection(Section.LIST);
- } else {
- hideSection(Section.LIST);
+var windowMenu = new WindowMenu($('window-menu'));
+
+function getCheckboxHandler(section) {
+ return function(e) {
+ if (e.type == 'keydown') {
+ if (e.keyIdentifier == 'Enter') {
+ e.target.checked = !e.target.checked;
+ } else {
+ return;
+ }
+ }
+ if (e.target.checked) {
+ showSection(section);
+ } else {
+ hideSection(section);
+ }
+ saveShownSections();
}
- saveShownSections();
-});
+}
+$('thumb-checkbox').addEventListener('change',
+ getCheckboxHandler(Section.THUMB));
+$('thumb-checkbox').addEventListener('keydown',
+ getCheckboxHandler(Section.THUMB));
+$('list-checkbox').addEventListener('change',
+ getCheckboxHandler(Section.LIST));
+$('list-checkbox').addEventListener('keydown',
+ getCheckboxHandler(Section.LIST));
+
window.addEventListener('load', bind(logEvent, global, 'onload fired'));
window.addEventListener('load', onDataLoaded);
window.addEventListener('resize', handleWindowResize);
document.addEventListener('DOMContentLoaded', bind(logEvent, global,
'domcontentloaded fired'));
+function hideAllMenus() {
+ windowMenu.hide();
+ optionMenu.hide();
+}
+
+window.addEventListener('blur', hideAllMenus);
+window.addEventListener('keydown', function(e) {
+ if (e.keyIdentifier == 'Alt' || e.keyIdentifier == 'Meta') {
+ hideAllMenus();
+ }
+}, true);
+
// DnD
var dnd = {
« no previous file with comments | « chrome/browser/resources/new_new_tab.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698