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

Unified Diff: chrome/browser/resources/shared/js/cr/ui/focus_manager.js

Issue 11962043: Move webui resources from chrome\browser\resources\shared to ui\webui\resources. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 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
Index: chrome/browser/resources/shared/js/cr/ui/focus_manager.js
===================================================================
--- chrome/browser/resources/shared/js/cr/ui/focus_manager.js (revision 177292)
+++ chrome/browser/resources/shared/js/cr/ui/focus_manager.js (working copy)
@@ -1,186 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-cr.define('cr.ui', function() {
- /**
- * Constructor for FocusManager singleton. Checks focus of elements to ensure
- * that elements in "background" pages (i.e., those in a dialog that is not
- * the topmost overlay) do not receive focus.
- * @constructor
- */
- function FocusManager() {
- }
-
- FocusManager.prototype = {
- /**
- * Whether focus is being transferred backward or forward through the DOM.
- * @type {boolean}
- * @private
- */
- focusDirBackwards_: false,
-
- /**
- * Determines whether the |child| is a descendant of |parent| in the page's
- * DOM.
- * @param {Element} parent The parent element to test.
- * @param {Element} child The child element to test.
- * @return {boolean} True if |child| is a descendant of |parent|.
- * @private
- */
- isDescendantOf_: function(parent, child) {
- var current = child;
-
- while (current) {
- current = current.parentNode;
- if (typeof(current) == 'undefined' ||
- typeof(current) == 'null' ||
- current === document.body) {
- return false;
- } else if (current === parent) {
- return true;
- }
- }
-
- return false;
- },
-
- /**
- * Returns the parent element containing all elements which should be
- * allowed to receive focus.
- * @return {Element} The element containing focusable elements.
- */
- getFocusParent: function() {
- return document.body;
- },
-
- /**
- * Returns the elements on the page capable of receiving focus.
- * @return {Array.Element} The focusable elements.
- */
- getFocusableElements_: function() {
- var focusableDiv = this.getFocusParent();
-
- // Create a TreeWalker object to traverse the DOM from |focusableDiv|.
- var treeWalker = document.createTreeWalker(
- focusableDiv,
- NodeFilter.SHOW_ELEMENT,
- { acceptNode: function(node) {
- var style = window.getComputedStyle(node);
- // Reject all hidden nodes. FILTER_REJECT also rejects these
- // nodes' children, so non-hidden elements that are descendants of
- // hidden <div>s will correctly be rejected.
- if (node.hidden || style.display == 'none' ||
- style.visibility == 'hidden') {
- return NodeFilter.FILTER_REJECT;
- }
-
- // Skip nodes that cannot receive focus. FILTER_SKIP does not
- // cause this node's children also to be skipped.
- if (node.disabled || node.tabIndex < 0)
- return NodeFilter.FILTER_SKIP;
-
- // Accept nodes that are non-hidden and focusable.
- return NodeFilter.FILTER_ACCEPT;
- }
- },
- false);
-
- var focusable = [];
- while (treeWalker.nextNode())
- focusable.push(treeWalker.currentNode);
-
- return focusable;
- },
-
- /**
- * Dispatches an 'elementFocused' event to notify an element that it has
- * received focus. When focus wraps around within the a page, only the
- * element that has focus after the wrapping receives an 'elementFocused'
- * event. This differs from the native 'focus' event which is received by
- * an element outside the page first, followed by a 'focus' on an element
- * within the page after the FocusManager has intervened.
- * @param {Element} element The element that has received focus.
- * @private
- */
- dispatchFocusEvent_: function(element) {
- cr.dispatchSimpleEvent(element, 'elementFocused', true, false);
- },
-
- /**
- * Attempts to focus the appropriate element in the current dialog.
- * @private
- */
- setFocus_: function() {
- // If |this.focusDirBackwards_| is true, the user has pressed "Shift+Tab"
- // and has caused the focus to be transferred backward, outside of the
- // current dialog. In this case, loop around and try to focus the last
- // element of the dialog; otherwise, try to focus the first element of the
- // dialog.
- var focusableElements = this.getFocusableElements_();
- var element = this.focusDirBackwards_ ? focusableElements.pop() :
- focusableElements.shift();
- if (element) {
- element.focus();
- this.dispatchFocusEvent_(element);
- }
- },
-
- /**
- * Attempts to focus the first element in the current dialog.
- */
- focusFirstElement: function() {
- this.focusFirstElement_();
- },
-
- /**
- * Handler for focus events on the page.
- * @param {Event} event The focus event.
- * @private
- */
- onDocumentFocus_: function(event) {
- // If the element being focused is a descendant of the currently visible
- // page, focus is valid.
- if (this.isDescendantOf_(this.getFocusParent(), event.target)) {
- this.dispatchFocusEvent_(event.target);
- return;
- }
-
- // The target of the focus event is not in the topmost visible page and
- // should not be focused.
- event.target.blur();
-
- // Attempt to wrap around focus within the current page.
- this.setFocus_();
- },
-
- /**
- * Handler for keydown events on the page.
- * @param {Event} event The keydown event.
- * @private
- */
- onDocumentKeyDown_: function(event) {
- /** @const */ var tabKeyCode = 9;
-
- if (event.keyCode == tabKeyCode) {
- // If the "Shift" key is held, focus is being transferred backward in
- // the page.
- this.focusDirBackwards_ = event.shiftKey ? true : false;
- }
- },
-
- /**
- * Initializes the FocusManager by listening for events in the document.
- */
- initialize: function() {
- document.addEventListener('focus', this.onDocumentFocus_.bind(this),
- true);
- document.addEventListener('keydown', this.onDocumentKeyDown_.bind(this),
- true);
- },
- };
-
- return {
- FocusManager: FocusManager,
- };
-});

Powered by Google App Engine
This is Rietveld 408576698