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

Unified Diff: chrome/browser/resources/options/options_page.js

Issue 6277005: Fix subsheet RTL. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: smorgan fix Created 9 years, 11 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/options/options_page.css ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/resources/options/options_page.js
diff --git a/chrome/browser/resources/options/options_page.js b/chrome/browser/resources/options/options_page.js
index 057e86dd637e376a886a1c7022df619022727046..d187e01b94d9c295d93831bb2bd019bd98ce3cd3 100644
--- a/chrome/browser/resources/options/options_page.js
+++ b/chrome/browser/resources/options/options_page.js
@@ -319,14 +319,25 @@ cr.define('options', function() {
var containerId = 'subpage-sheet-container-' + level;
$(containerId).onclick = this.subPageClosingClickHandler_(level);
}
- // Hook up the close buttons.
+
var self = this;
+ // Close subpages if the user clicks on the html body. Listen in the
+ // capturing phase so that we can stop the click from doing anything.
+ document.body.addEventListener('click',
+ this.bodyMouseEventHandler_.bind(this),
+ true);
+ // We also need to cancel mousedowns on non-subpage content.
+ document.body.addEventListener('mousedown',
+ this.bodyMouseEventHandler_.bind(this),
+ true);
+
+ // Hook up the close buttons.
subpageCloseButtons = document.querySelectorAll('.close-subpage');
for (var i = 0; i < subpageCloseButtons.length; i++) {
subpageCloseButtons[i].onclick = function() {
self.closeTopSubPage();
};
- }
+ };
// Close the top overlay or sub-page on esc.
document.addEventListener('keydown', function(e) {
@@ -343,21 +354,53 @@ cr.define('options', function() {
* Returns a function to handle clicks behind a subpage at level |level| by
* closing all subpages down to |level| - 1.
* @param {number} level The level of the subpage being handled.
- * @return {function} a function to handle clicks outside the given subpage.
+ * @return {Function} a function to handle clicks outside the given subpage.
* @private
*/
OptionsPage.subPageClosingClickHandler_ = function(level) {
var self = this;
return function(event) {
- // Clicks on the visible part of the parent page should close the overlay,
+ // Clicks on the narrow strip between the left of the subpage sheet and
+ // that shows part of the parent page should close the overlay, but
// not fall through to the parent page.
if (!$('subpage-sheet-' + level).contains(event.target))
self.closeSubPagesToLevel(level - 1);
event.stopPropagation();
+ event.preventDefault();
};
};
/**
+ * A function to handle mouse events (mousedown or click) on the html body by
+ * closing subpages and/or stopping event propagation.
+ * @return {Event} a mousedown or click event.
+ * @private
+ */
+ OptionsPage.bodyMouseEventHandler_ = function(event) {
+ // Do nothing if a subpage isn't showing.
+ var topPage = this.getTopmostVisiblePage();
+ if (!(topPage && topPage.parentPage))
+ return;
+
+ // If the click was within a subpage, do nothing.
+ for (var level = 1; level <= 2; level++) {
+ if ($('subpage-sheet-container-' + level).contains(event.target))
+ return;
+ }
+
+ // Close all subpages on click.
+ if (event.type == 'click')
+ this.closeSubPagesToLevel(0);
+
+ // Events should not fall through to the main view,
+ // but they can fall through for the sidebar.
+ if ($('mainview-content').contains(event.target)) {
+ event.stopPropagation();
+ event.preventDefault();
+ }
+ };
+
+ /**
* Re-initializes the C++ handlers if necessary. This is called if the
* handlers are torn down and recreated but the DOM may not have been (in
* which case |initialize| won't be called again). If |initialize| hasn't been
« no previous file with comments | « chrome/browser/resources/options/options_page.css ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698