| OLD | NEW |
| 1 // Copyright (c) 2014 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2014 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 #include "content/browser/frame_host/render_frame_host_impl.h" | 9 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 10 #include "content/browser/web_contents/web_contents_impl.h" | 10 #include "content/browser/web_contents/web_contents_impl.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 NavigateToURL(shell(), url); | 53 NavigateToURL(shell(), url); |
| 54 | 54 |
| 55 // Simulate a condition where the RFH can't create a | 55 // Simulate a condition where the RFH can't create a |
| 56 // BrowserAccessibilityManager - like if there's no view. | 56 // BrowserAccessibilityManager - like if there's no view. |
| 57 RenderFrameHostImpl* frame = static_cast<RenderFrameHostImpl*>( | 57 RenderFrameHostImpl* frame = static_cast<RenderFrameHostImpl*>( |
| 58 shell()->web_contents()->GetMainFrame()); | 58 shell()->web_contents()->GetMainFrame()); |
| 59 frame->set_no_create_browser_accessibility_manager_for_testing(true); | 59 frame->set_no_create_browser_accessibility_manager_for_testing(true); |
| 60 ASSERT_EQ(nullptr, frame->GetOrCreateBrowserAccessibilityManager()); | 60 ASSERT_EQ(nullptr, frame->GetOrCreateBrowserAccessibilityManager()); |
| 61 | 61 |
| 62 { | 62 { |
| 63 // Enable accessibility (passing ACCESSIBILITY_MODE_COMPLETE to | 63 // Enable accessibility (passing AccessibilityMode::kComplete to |
| 64 // AccessibilityNotificationWaiter does this automatically) and wait for | 64 // AccessibilityNotificationWaiter does this automatically) and wait for |
| 65 // the first event. | 65 // the first event. |
| 66 AccessibilityNotificationWaiter waiter( | 66 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 67 shell()->web_contents(), | 67 AccessibilityMode::kComplete, |
| 68 ACCESSIBILITY_MODE_COMPLETE, | 68 ui::AX_EVENT_LAYOUT_COMPLETE); |
| 69 ui::AX_EVENT_LAYOUT_COMPLETE); | |
| 70 waiter.WaitForNotification(); | 69 waiter.WaitForNotification(); |
| 71 } | 70 } |
| 72 | 71 |
| 73 // Make sure we still didn't create a BrowserAccessibilityManager. | 72 // Make sure we still didn't create a BrowserAccessibilityManager. |
| 74 // This means that at least one accessibility IPC was lost. | 73 // This means that at least one accessibility IPC was lost. |
| 75 ASSERT_EQ(nullptr, frame->GetOrCreateBrowserAccessibilityManager()); | 74 ASSERT_EQ(nullptr, frame->GetOrCreateBrowserAccessibilityManager()); |
| 76 | 75 |
| 77 // Now create a BrowserAccessibilityManager, simulating what would happen | 76 // Now create a BrowserAccessibilityManager, simulating what would happen |
| 78 // if the RFH's view is created now - but then disallow recreating the | 77 // if the RFH's view is created now - but then disallow recreating the |
| 79 // BrowserAccessibilityManager so that we can test that this one gets | 78 // BrowserAccessibilityManager so that we can test that this one gets |
| 80 // destroyed. | 79 // destroyed. |
| 81 frame->set_no_create_browser_accessibility_manager_for_testing(false); | 80 frame->set_no_create_browser_accessibility_manager_for_testing(false); |
| 82 ASSERT_TRUE(frame->GetOrCreateBrowserAccessibilityManager() != nullptr); | 81 ASSERT_TRUE(frame->GetOrCreateBrowserAccessibilityManager() != nullptr); |
| 83 frame->set_no_create_browser_accessibility_manager_for_testing(true); | 82 frame->set_no_create_browser_accessibility_manager_for_testing(true); |
| 84 | 83 |
| 85 { | 84 { |
| 86 // Hide one of the elements on the page, and wait for an accessibility | 85 // Hide one of the elements on the page, and wait for an accessibility |
| 87 // notification triggered by the hide. | 86 // notification triggered by the hide. |
| 88 AccessibilityNotificationWaiter waiter( | 87 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 89 shell()->web_contents(), | 88 AccessibilityMode::kComplete, |
| 90 ACCESSIBILITY_MODE_COMPLETE, | 89 ui::AX_EVENT_LIVE_REGION_CHANGED); |
| 91 ui::AX_EVENT_LIVE_REGION_CHANGED); | |
| 92 ASSERT_TRUE(ExecuteScript( | 90 ASSERT_TRUE(ExecuteScript( |
| 93 shell(), "document.getElementById('p1').style.display = 'none';")); | 91 shell(), "document.getElementById('p1').style.display = 'none';")); |
| 94 waiter.WaitForNotification(); | 92 waiter.WaitForNotification(); |
| 95 } | 93 } |
| 96 | 94 |
| 97 // Show that accessibility was reset because the frame doesn't have a | 95 // Show that accessibility was reset because the frame doesn't have a |
| 98 // BrowserAccessibilityManager anymore. | 96 // BrowserAccessibilityManager anymore. |
| 99 ASSERT_EQ(nullptr, frame->browser_accessibility_manager()); | 97 ASSERT_EQ(nullptr, frame->browser_accessibility_manager()); |
| 100 | 98 |
| 101 // Finally, allow creating a new accessibility manager and | 99 // Finally, allow creating a new accessibility manager and |
| 102 // ensure that we didn't kill the renderer; we can still send it messages. | 100 // ensure that we didn't kill the renderer; we can still send it messages. |
| 103 frame->set_no_create_browser_accessibility_manager_for_testing(false); | 101 frame->set_no_create_browser_accessibility_manager_for_testing(false); |
| 104 const ui::AXTree* tree = nullptr; | 102 const ui::AXTree* tree = nullptr; |
| 105 { | 103 { |
| 106 AccessibilityNotificationWaiter waiter( | 104 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 107 shell()->web_contents(), ACCESSIBILITY_MODE_COMPLETE, | 105 AccessibilityMode::kComplete, |
| 108 ui::AX_EVENT_FOCUS); | 106 ui::AX_EVENT_FOCUS); |
| 109 ASSERT_TRUE( | 107 ASSERT_TRUE( |
| 110 ExecuteScript(shell(), "document.getElementById('button').focus();")); | 108 ExecuteScript(shell(), "document.getElementById('button').focus();")); |
| 111 waiter.WaitForNotification(); | 109 waiter.WaitForNotification(); |
| 112 tree = &waiter.GetAXTree(); | 110 tree = &waiter.GetAXTree(); |
| 113 } | 111 } |
| 114 | 112 |
| 115 // Get the accessibility tree, ensure it reflects the final state of the | 113 // Get the accessibility tree, ensure it reflects the final state of the |
| 116 // document. | 114 // document. |
| 117 const ui::AXNode* root = tree->root(); | 115 const ui::AXNode* root = tree->root(); |
| 118 | 116 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 144 // Create a data url and load it. | 142 // Create a data url and load it. |
| 145 const char url_str[] = | 143 const char url_str[] = |
| 146 "data:text/html," | 144 "data:text/html," |
| 147 "<button id='button'>Button</button>"; | 145 "<button id='button'>Button</button>"; |
| 148 GURL url(url_str); | 146 GURL url(url_str); |
| 149 NavigateToURL(shell(), url); | 147 NavigateToURL(shell(), url); |
| 150 RenderFrameHostImpl* frame = static_cast<RenderFrameHostImpl*>( | 148 RenderFrameHostImpl* frame = static_cast<RenderFrameHostImpl*>( |
| 151 shell()->web_contents()->GetMainFrame()); | 149 shell()->web_contents()->GetMainFrame()); |
| 152 | 150 |
| 153 { | 151 { |
| 154 // Enable accessibility (passing ACCESSIBILITY_MODE_COMPLETE to | 152 // Enable accessibility (passing AccessibilityMode::kComplete to |
| 155 // AccessibilityNotificationWaiter does this automatically) and wait for | 153 // AccessibilityNotificationWaiter does this automatically) and wait for |
| 156 // the first event. | 154 // the first event. |
| 157 AccessibilityNotificationWaiter waiter( | 155 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 158 shell()->web_contents(), | 156 AccessibilityMode::kComplete, |
| 159 ACCESSIBILITY_MODE_COMPLETE, | 157 ui::AX_EVENT_LAYOUT_COMPLETE); |
| 160 ui::AX_EVENT_LAYOUT_COMPLETE); | |
| 161 waiter.WaitForNotification(); | 158 waiter.WaitForNotification(); |
| 162 } | 159 } |
| 163 | 160 |
| 164 // Construct a bad accessibility message that BrowserAccessibilityManager | 161 // Construct a bad accessibility message that BrowserAccessibilityManager |
| 165 // will reject. | 162 // will reject. |
| 166 std::vector<AXEventNotificationDetails> bad_accessibility_event_list; | 163 std::vector<AXEventNotificationDetails> bad_accessibility_event_list; |
| 167 bad_accessibility_event_list.push_back(AXEventNotificationDetails()); | 164 bad_accessibility_event_list.push_back(AXEventNotificationDetails()); |
| 168 bad_accessibility_event_list[0].update.node_id_to_clear = -2; | 165 bad_accessibility_event_list[0].update.node_id_to_clear = -2; |
| 169 | 166 |
| 170 // We should be able to reset accessibility |max_iterations-1| times | 167 // We should be able to reset accessibility |max_iterations-1| times |
| 171 // (see render_frame_host_impl.cc - kMaxAccessibilityResets), | 168 // (see render_frame_host_impl.cc - kMaxAccessibilityResets), |
| 172 // but the subsequent time the renderer should be killed. | 169 // but the subsequent time the renderer should be killed. |
| 173 int max_iterations = RenderFrameHostImpl::kMaxAccessibilityResets; | 170 int max_iterations = RenderFrameHostImpl::kMaxAccessibilityResets; |
| 174 | 171 |
| 175 for (int iteration = 0; iteration < max_iterations; iteration++) { | 172 for (int iteration = 0; iteration < max_iterations; iteration++) { |
| 176 // Send the browser accessibility the bad message. | 173 // Send the browser accessibility the bad message. |
| 177 BrowserAccessibilityManager* manager = | 174 BrowserAccessibilityManager* manager = |
| 178 frame->GetOrCreateBrowserAccessibilityManager(); | 175 frame->GetOrCreateBrowserAccessibilityManager(); |
| 179 manager->OnAccessibilityEvents(bad_accessibility_event_list); | 176 manager->OnAccessibilityEvents(bad_accessibility_event_list); |
| 180 | 177 |
| 181 // Now the frame should have deleted the BrowserAccessibilityManager. | 178 // Now the frame should have deleted the BrowserAccessibilityManager. |
| 182 ASSERT_EQ(nullptr, frame->browser_accessibility_manager()); | 179 ASSERT_EQ(nullptr, frame->browser_accessibility_manager()); |
| 183 | 180 |
| 184 if (iteration == max_iterations - 1) | 181 if (iteration == max_iterations - 1) |
| 185 break; | 182 break; |
| 186 | 183 |
| 187 AccessibilityNotificationWaiter waiter( | 184 AccessibilityNotificationWaiter waiter(shell()->web_contents(), |
| 188 shell()->web_contents(), | 185 AccessibilityMode::kComplete, |
| 189 ACCESSIBILITY_MODE_COMPLETE, | 186 ui::AX_EVENT_LOAD_COMPLETE); |
| 190 ui::AX_EVENT_LOAD_COMPLETE); | |
| 191 waiter.WaitForNotification(); | 187 waiter.WaitForNotification(); |
| 192 } | 188 } |
| 193 | 189 |
| 194 // Wait for the renderer to be killed. | 190 // Wait for the renderer to be killed. |
| 195 if (frame->IsRenderFrameLive()) { | 191 if (frame->IsRenderFrameLive()) { |
| 196 RenderProcessHostWatcher render_process_watcher( | 192 RenderProcessHostWatcher render_process_watcher( |
| 197 frame->GetProcess(), RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); | 193 frame->GetProcess(), RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); |
| 198 render_process_watcher.Wait(); | 194 render_process_watcher.Wait(); |
| 199 } | 195 } |
| 200 ASSERT_FALSE(frame->IsRenderFrameLive()); | 196 ASSERT_FALSE(frame->IsRenderFrameLive()); |
| 201 } | 197 } |
| 202 | 198 |
| 203 } // namespace content | 199 } // namespace content |
| OLD | NEW |