Home | History | Annotate | Download | only in test
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/test/accessibility_browser_test_utils.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/logging.h"
      9 #include "base/strings/string_util.h"
     10 #include "base/strings/utf_string_conversions.h"
     11 #include "content/browser/renderer_host/render_view_host_impl.h"
     12 #include "content/port/browser/render_widget_host_view_port.h"
     13 #include "content/public/browser/web_contents.h"
     14 #include "content/public/common/url_constants.h"
     15 #include "content/public/test/test_utils.h"
     16 #include "content/shell/browser/shell.h"
     17 
     18 namespace content {
     19 
     20 AccessibilityNotificationWaiter::AccessibilityNotificationWaiter(
     21     Shell* shell,
     22     AccessibilityMode accessibility_mode,
     23     blink::WebAXEvent event_type)
     24     : shell_(shell),
     25       event_to_wait_for_(event_type),
     26       loop_runner_(new MessageLoopRunner()),
     27       weak_factory_(this) {
     28   WebContents* web_contents = shell_->web_contents();
     29   view_host_ = static_cast<RenderViewHostImpl*>(
     30       web_contents->GetRenderViewHost());
     31   view_host_->SetAccessibilityCallbackForTesting(
     32       base::Bind(&AccessibilityNotificationWaiter::OnAccessibilityEvent,
     33                  weak_factory_.GetWeakPtr()));
     34   view_host_->SetAccessibilityMode(accessibility_mode);
     35 }
     36 
     37 AccessibilityNotificationWaiter::~AccessibilityNotificationWaiter() {
     38 }
     39 
     40 void AccessibilityNotificationWaiter::WaitForNotification() {
     41   loop_runner_->Run();
     42 }
     43 
     44 const AccessibilityNodeDataTreeNode&
     45 AccessibilityNotificationWaiter::GetAccessibilityNodeDataTree() const {
     46   return view_host_->accessibility_tree_for_testing();
     47 }
     48 
     49 void AccessibilityNotificationWaiter::OnAccessibilityEvent(
     50     blink::WebAXEvent event_type) {
     51   if (!IsAboutBlank() && event_to_wait_for_ == event_type)
     52     loop_runner_->Quit();
     53 }
     54 
     55 bool AccessibilityNotificationWaiter::IsAboutBlank() {
     56   // Skip any accessibility notifications related to "about:blank",
     57   // to avoid a possible race condition between the test beginning
     58   // listening for accessibility events and "about:blank" loading.
     59   const AccessibilityNodeDataTreeNode& root = GetAccessibilityNodeDataTree();
     60   for (size_t i = 0; i < root.string_attributes.size(); ++i) {
     61     if (root.string_attributes[i].first != AccessibilityNodeData::ATTR_DOC_URL)
     62       continue;
     63     const std::string& doc_url = root.string_attributes[i].second;
     64     return doc_url == kAboutBlankURL;
     65   }
     66   return false;
     67 }
     68 
     69 }  // namespace content
     70