From f10a212b8dfa843b72f627c4edba6773a56a1862 Mon Sep 17 00:00:00 2001 From: dmazzoni Date: Wed, 19 Nov 2014 10:31:55 -0800 Subject: [PATCH] Add method to hide BrowserAccessibilityManager. If you call BrowserAccessibilityManager.setVisible(false), it will return false from isVisibleToUser and no nodes will be accessibility focusable. That should prevent TalkBack from traversing into the whole web hierarchy. BUG=417838 Review URL: https://codereview.chromium.org/723393004 Cr-Commit-Position: refs/heads/master@{#304842} --- .../accessibility/BrowserAccessibilityManager.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java index 14af7e59ead8..0888376fc816 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/BrowserAccessibilityManager.java @@ -63,6 +63,7 @@ public class BrowserAccessibilityManager { private int mSelectionGranularity; private int mSelectionStartIndex; private int mSelectionEndIndex; + private boolean mVisible = true; /** * Create a BrowserAccessibilityManager object, which is owned by the C++ @@ -121,6 +122,21 @@ public class BrowserAccessibilityManager { } /** + * Set whether the web content made accessible by this class is currently visible. + * Set it to false if the web view is still on the screen but it's obscured by a + * dialog or overlay. This will make every virtual view in the web hierarchy report + * that it's not visible, and not accessibility focusable. + * + * @param visible Whether the web content is currently visible and not obscured. + */ + public void setVisible(boolean visible) { + if (visible == mVisible) return; + + mVisible = visible; + mView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); + } + + /** * @see AccessibilityNodeProvider#createAccessibilityNodeInfo(int) */ protected AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { @@ -520,7 +536,7 @@ public class BrowserAccessibilityManager { } // Populate the minimum required fields. - result.setVisibleToUser(source.isVisibleToUser()); + result.setVisibleToUser(source.isVisibleToUser() && mVisible); result.setEnabled(source.isEnabled()); result.setPackageName(source.getPackageName()); result.setClassName(source.getClassName()); @@ -645,7 +661,7 @@ public class BrowserAccessibilityManager { node.setPassword(password); node.setScrollable(scrollable); node.setSelected(selected); - node.setVisibleToUser(visibleToUser); + node.setVisibleToUser(visibleToUser && mVisible); node.addAction(AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT); node.addAction(AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT); @@ -672,7 +688,7 @@ public class BrowserAccessibilityManager { if (mAccessibilityFocusId == virtualViewId) { node.setAccessibilityFocused(true); node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS); - } else { + } else if (mVisible) { node.setAccessibilityFocused(false); node.addAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS); } -- 2.11.4.GIT