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

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

Issue 23665004: sync (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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/options/options_page.js
diff --git a/chrome/browser/resources/options/options_page.js b/chrome/browser/resources/options/options_page.js
index 0e827fdc4addfcd5ae7e2911c1a7a74bf6680568..2b1b1b207c58fb4729febaa26a795140cee953b4 100644
--- a/chrome/browser/resources/options/options_page.js
+++ b/chrome/browser/resources/options/options_page.js
@@ -356,9 +356,13 @@ cr.define('options', function() {
* Cancels (closes) the overlay, due to the user pressing <Esc>.
*/
OptionsPage.cancelOverlay = function() {
+ var overlay = this.getVisibleOverlay_();
+ if (!overlay)
+ return;
+
// Blur the active element to ensure any changed pref value is saved.
document.activeElement.blur();
- var overlay = this.getVisibleOverlay_();
+
// Let the overlay handle the <Esc> if it wants to.
if (overlay.handleCancel) {
overlay.handleCancel();
@@ -655,19 +659,39 @@ cr.define('options', function() {
// Trigger the scroll handler manually to set the initial state.
this.handleScroll_();
- // Shake the dialog if the user clicks outside the dialog bounds.
- var containers = [$('overlay-container-1'), $('overlay-container-2')];
- for (var i = 0; i < containers.length; i++) {
- var overlay = containers[i];
- cr.ui.overlay.setupOverlay(overlay);
- overlay.addEventListener('cancelOverlay',
- OptionsPage.cancelOverlay.bind(OptionsPage));
+ var dialogs = document.querySelectorAll('.overlay-container .page');
+ for (var i = 0; i < dialogs.length; i++) {
+ var dialog = dialogs[i];
+ cr.ui.overlay.setupOverlay(dialog);
+ dialog.addEventListener('cancelOverlay',
+ OptionsPage.cancelOverlay.bind(OptionsPage));
+ dialog.addEventListener('webkitAnimationEnd',
+ OptionsPage.handleDialogAnimationEnd_);
}
cr.ui.overlay.globalInitialization();
};
/**
+ * Called when a webkitAnimationEnd event occurs on a dialog. If it was a
+ * fading away animation that completed, closes the dialog.
+ */
+ OptionsPage.handleDialogAnimationEnd_ = function(e) {
+ if (e.target != e.currentTarget)
+ return;
+ var dialog = e.target;
+ dialog.classList.remove('opening');
+ dialog.classList.remove('pulse');
+ if (dialog.classList.contains('closing')) {
+ dialog.close();
+ // TODO(falken): It's probably better move these to a close event handler,
+ // once <dialog> implements it.
+ dialog.classList.remove('closing');
+ dialog.page.fadeCompleted_();
+ }
+ }
+
+ /**
* Does a bounds check for the element on the given x, y client coordinates.
* @param {Element} e The DOM element.
* @param {number} x The client X to check.
@@ -812,11 +836,9 @@ cr.define('options', function() {
* @type {boolean}
*/
get visible() {
- // If this is an overlay dialog it is no longer considered visible while
- // the overlay is fading out. See http://crbug.com/118629.
- if (this.isOverlay &&
- this.container.classList.contains('transparent')) {
- return false;
+ if (this.isOverlay) {
+ if (!this.pageDiv.open || this.pageDiv.classList.contains('closing'))
+ return false;
}
if (this.pageDiv.hidden)
return false;
@@ -853,7 +875,6 @@ cr.define('options', function() {
setOverlayVisible_: function(visible) {
assert(this.isOverlay);
var pageDiv = this.pageDiv;
- var container = this.container;
if (visible) {
uber.invokeMethodOnParent('beginInterceptingEvents');
@@ -865,63 +886,42 @@ cr.define('options', function() {
this.parentPage.pageDiv.removeAttribute('aria-hidden');
}
- if (container.hidden != visible) {
- if (visible) {
- // If the container is set hidden and then immediately set visible
- // again, the fadeCompleted_ callback would cause it to be erroneously
- // hidden again. Removing the transparent tag avoids that.
- container.classList.remove('transparent');
-
- // Hide all dialogs in this container since a different one may have
- // been previously visible before fading out.
- var pages = container.querySelectorAll('.page');
- for (var i = 0; i < pages.length; i++)
- pages[i].hidden = true;
- // Show the new dialog.
- pageDiv.hidden = false;
- pageDiv.page = this;
+ if (visible) {
+ // If the dialog is set invisible and then immediately set visible
+ // again, the webkitAnimationEnd callback would cause it to be
+ // erroneously closed again. Removing the closing tag avoids that.
+ pageDiv.classList.remove('closing');
+
+ // Hide all dialogs in this container since a different one may have
+ // been previously visible before fading out.
+ var pages = this.container.querySelectorAll('.page');
+ for (var i = 0; i < pages.length; i++) {
+ if (pages[i].open)
+ pages[i].close();
}
- return;
- }
- if (visible) {
- container.hidden = false;
- pageDiv.hidden = false;
+ pageDiv.showModal();
pageDiv.page = this;
- // NOTE: This is a hacky way to force the container to layout which
- // will allow us to trigger the webkit transition.
- container.scrollTop;
- container.classList.remove('transparent');
this.onVisibilityChanged_();
+ cr.ui.overlay.center(pageDiv);
+ pageDiv.classList.add('opening');
} else {
// Kick change events for text fields.
if (pageDiv.contains(document.activeElement))
document.activeElement.blur();
- var self = this;
- // TODO: Use an event delegate to avoid having to subscribe and
- // unsubscribe for webkitTransitionEnd events.
- container.addEventListener('webkitTransitionEnd', function f(e) {
- if (e.target != e.currentTarget || e.propertyName != 'opacity')
- return;
- container.removeEventListener('webkitTransitionEnd', f);
- self.fadeCompleted_();
- });
- container.classList.add('transparent');
+
+ pageDiv.classList.add('closing');
}
},
/**
- * Called when a container opacity transition finishes.
+ * Called when a dialog closing animation finishes.
* @private
*/
fadeCompleted_: function() {
- if (this.container.classList.contains('transparent')) {
- this.pageDiv.hidden = true;
- this.container.hidden = true;
- this.onVisibilityChanged_();
- if (this.nestingLevel == 1)
- uber.invokeMethodOnParent('stopInterceptingEvents');
- }
+ this.onVisibilityChanged_();
+ if (this.nestingLevel == 1)
+ uber.invokeMethodOnParent('stopInterceptingEvents');
},
/**
« no previous file with comments | « chrome/browser/resources/options/options_page.css ('k') | chrome/browser/resources/options/password_manager.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698