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

Side by Side Diff: chrome/browser/resources/extensions/extensions.js

Issue 862403006: extensions: fix focus management for all dialogs (not just options). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@classList-fix
Patch Set: toggle Created 5 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 <include src="../uber/uber_utils.js"> 5 <include src="../uber/uber_utils.js">
6 <include src="extension_code.js"> 6 <include src="extension_code.js">
7 <include src="extension_commands_overlay.js"> 7 <include src="extension_commands_overlay.js">
8 <include src="extension_error_overlay.js"> 8 <include src="extension_error_overlay.js">
9 <include src="extension_focus_manager.js"> 9 <include src="extension_focus_manager.js">
10 <include src="extension_list.js"> 10 <include src="extension_list.js">
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 * Returns the current overlay or null if one does not exist. 367 * Returns the current overlay or null if one does not exist.
368 * @return {Element} The overlay element. 368 * @return {Element} The overlay element.
369 */ 369 */
370 ExtensionSettings.getCurrentOverlay = function() { 370 ExtensionSettings.getCurrentOverlay = function() {
371 return document.querySelector('#overlay .page.showing'); 371 return document.querySelector('#overlay .page.showing');
372 }; 372 };
373 373
374 /** 374 /**
375 * Sets the given overlay to show. This hides whatever overlay is currently 375 * Sets the given overlay to show. This hides whatever overlay is currently
376 * showing, if any. 376 * showing, if any.
377 * @param {HTMLElement} node The overlay page to show. If falsey, all overlays 377 * @param {HTMLElement} node The overlay page to show. If falsey, all overlays
not at google - send to devlin 2015/02/06 21:31:38 You might as well fix this comment - |node| certai
Dan Beam 2015/02/06 21:50:02 Done.
378 * are hidden. 378 * are hidden.
379 */ 379 */
380 ExtensionSettings.showOverlay = function(node) { 380 ExtensionSettings.showOverlay = function(node) {
381 var pageDiv = $('extension-settings'); 381 var pageDiv = $('extension-settings');
382 if (node) { 382 pageDiv.style.width = node ? window.getComputedStyle(pageDiv).width : '';
383 pageDiv.style.width = window.getComputedStyle(pageDiv).width; 383 document.body.classList.toggle('no-scroll', node);
384 document.body.classList.add('no-scroll');
385 } else {
386 document.body.classList.remove('no-scroll');
387 pageDiv.style.width = '';
388 }
389 384
390 var currentlyShowingOverlay = ExtensionSettings.getCurrentOverlay(); 385 var currentlyShowingOverlay = ExtensionSettings.getCurrentOverlay();
391 if (currentlyShowingOverlay) { 386 if (currentlyShowingOverlay) {
392 currentlyShowingOverlay.classList.remove('showing'); 387 currentlyShowingOverlay.classList.remove('showing');
393 cr.dispatchSimpleEvent($('overlay'), 'cancelOverlay'); 388 cr.dispatchSimpleEvent($('overlay'), 'cancelOverlay');
394 } 389 }
395 390
396 if (node) { 391 if (node) {
397 if (document.activeElement != document.body) 392 var lastFocused = document.activeElement;
398 document.activeElement.blur(); 393 $('overlay').addEventListener('cancelOverlay', function f() {
394 lastFocused.focus();
not at google - send to devlin 2015/02/06 21:31:38 Correct me if I'm wrong (in which case I'm trying
Dan Beam 2015/02/06 21:50:02 i know
395 $('overlay').removeEventListener('cancelOverlay', f);
396 });
399 node.classList.add('showing'); 397 node.classList.add('showing');
400 } 398 }
401 399
402 var pages = document.querySelectorAll('.page'); 400 var pages = document.querySelectorAll('.page');
403 for (var i = 0; i < pages.length; i++) { 401 for (var i = 0; i < pages.length; i++) {
404 pages[i].setAttribute('aria-hidden', node ? 'true' : 'false'); 402 pages[i].setAttribute('aria-hidden', node ? 'true' : 'false');
405 } 403 }
406 404
407 $('overlay').hidden = !node; 405 $('overlay').hidden = !node;
406
407 if (node)
408 ExtensionSettings.focusOverlay();
409
408 uber.invokeMethodOnParent(node ? 'beginInterceptingEvents' : 410 uber.invokeMethodOnParent(node ? 'beginInterceptingEvents' :
409 'stopInterceptingEvents'); 411 'stopInterceptingEvents');
410 }; 412 };
411 413
414 ExtensionSettings.focusOverlay = function() {
415 var currentlyShowingOverlay = ExtensionSettings.getCurrentOverlay();
416 assert(currentlyShowingOverlay);
417
418 if (cr.ui.FocusOutlineManager.forDocument(document).visible) {
419 var extraToFocus = '#extension-options-overlay-guest extensionoptions';
420 cr.ui.setInitialFocus(currentlyShowingOverlay, extraToFocus);
421 }
422
423 if (!currentlyShowingOverlay.contains(document.activeElement)) {
424 // Make sure focus isn't stuck behind the overlay.
425 document.activeElement.blur();
426 }
427 };
428
412 /** 429 /**
413 * Utility function to find the width of various UI strings and synchronize 430 * Utility function to find the width of various UI strings and synchronize
414 * the width of relevant spans. This is crucial for making sure the 431 * the width of relevant spans. This is crucial for making sure the
415 * Enable/Enabled checkboxes align, as well as the Developer Mode checkbox. 432 * Enable/Enabled checkboxes align, as well as the Developer Mode checkbox.
416 */ 433 */
417 function measureCheckboxStrings() { 434 function measureCheckboxStrings() {
418 var trashWidth = 30; 435 var trashWidth = 30;
419 var measuringDiv = $('font-measuring-div'); 436 var measuringDiv = $('font-measuring-div');
420 measuringDiv.textContent = 437 measuringDiv.textContent =
421 loadTimeData.getString('extensionSettingsEnabled'); 438 loadTimeData.getString('extensionSettingsEnabled');
(...skipping 22 matching lines...) Expand all
444 461
445 // Export 462 // Export
446 return { 463 return {
447 ExtensionSettings: ExtensionSettings 464 ExtensionSettings: ExtensionSettings
448 }; 465 };
449 }); 466 });
450 467
451 window.addEventListener('load', function(e) { 468 window.addEventListener('load', function(e) {
452 extensions.ExtensionSettings.getInstance().initialize(); 469 extensions.ExtensionSettings.getInstance().initialize();
453 }); 470 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698