#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/features.h"
#include "content/public/test/accessibility_notification_waiter.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/scoped_accessibility_mode_override.h"
#include "content/shell/browser/shell.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/platform/browser_accessibility.h"
#include "ui/accessibility/platform/browser_accessibility_manager.h"
namespace content {
class AccessibilityFullscreenBrowserTest : public ContentBrowserTest {
public:
AccessibilityFullscreenBrowserTest() = default;
~AccessibilityFullscreenBrowserTest() override = default;
protected:
ui::BrowserAccessibility* FindButton(ui::BrowserAccessibility* node) {
if (node->GetRole() == ax::mojom::Role::kButton) {
return node;
}
for (unsigned i = 0; i < node->PlatformChildCount(); i++) {
if (ui::BrowserAccessibility* button =
FindButton(node->PlatformGetChild(i))) {
return button;
}
}
return nullptr;
}
int CountLinks(ui::BrowserAccessibility* node) {
if (node->GetRole() == ax::mojom::Role::kLink) {
return 1;
}
int links_in_children = 0;
for (unsigned i = 0; i < node->PlatformChildCount(); i++) {
links_in_children += CountLinks(node->PlatformGetChild(i));
}
return links_in_children;
}
};
namespace {
class FakeFullscreenDelegate : public WebContentsDelegate {
public:
FakeFullscreenDelegate() = default;
FakeFullscreenDelegate(const FakeFullscreenDelegate&) = delete;
FakeFullscreenDelegate& operator=(const FakeFullscreenDelegate&) = delete;
~FakeFullscreenDelegate() override = default;
void EnterFullscreenModeForTab(
RenderFrameHost*,
const blink::mojom::FullscreenOptions&) override {
is_fullscreen_ = true;
}
void ExitFullscreenModeForTab(WebContents*) override {
is_fullscreen_ = false;
}
bool IsFullscreenForTabOrPending(const WebContents*) override {
return is_fullscreen_;
}
private:
bool is_fullscreen_ = false;
};
}
IN_PROC_BROWSER_TEST_F(AccessibilityFullscreenBrowserTest,
IgnoreElementsOutsideFullscreenElement) {
ASSERT_TRUE(embedded_test_server()->Start());
FakeFullscreenDelegate delegate;
shell()->web_contents()->SetDelegate(&delegate);
AccessibilityNotificationWaiter waiter(shell()->web_contents(),
ax::mojom::Event::kLoadComplete);
ScopedAccessibilityModeOverride complete_mode(ui::kAXModeComplete);
GURL url(
embedded_test_server()->GetURL("/accessibility/fullscreen/links.html"));
EXPECT_TRUE(NavigateToURL(shell(), url));
ASSERT_TRUE(waiter.WaitForNotification());
WebContentsImpl* web_contents =
static_cast<WebContentsImpl*>(shell()->web_contents());
ui::BrowserAccessibilityManager* manager =
web_contents->GetRootBrowserAccessibilityManager();
EXPECT_EQ(3, CountLinks(manager->GetBrowserAccessibilityRoot()));
ui::BrowserAccessibility* button =
FindButton(manager->GetBrowserAccessibilityRoot());
ASSERT_NE(nullptr, button);
manager->DoDefaultAction(*button);
WaitForAccessibilityTreeToContainNodeWithName(web_contents, "Done");
EXPECT_EQ(1, CountLinks(manager->GetBrowserAccessibilityRoot()));
}
IN_PROC_BROWSER_TEST_F(AccessibilityFullscreenBrowserTest,
DISABLED_InsideIFrame) {
ASSERT_TRUE(embedded_test_server()->Start());
FakeFullscreenDelegate delegate;
shell()->web_contents()->SetDelegate(&delegate);
AccessibilityNotificationWaiter waiter(shell()->web_contents(),
ax::mojom::Event::kLoadComplete);
ScopedAccessibilityModeOverride complete_mode(ui::kAXModeComplete);
GURL url(
embedded_test_server()->GetURL("/accessibility/fullscreen/iframe.html"));
EXPECT_TRUE(NavigateToURL(shell(), url));
ASSERT_TRUE(waiter.WaitForNotification());
WebContentsImpl* web_contents =
static_cast<WebContentsImpl*>(shell()->web_contents());
ui::BrowserAccessibilityManager* manager =
web_contents->GetRootBrowserAccessibilityManager();
EXPECT_EQ(1, CountLinks(manager->GetBrowserAccessibilityRoot()));
ui::BrowserAccessibility* button =
FindButton(manager->GetBrowserAccessibilityRoot());
ASSERT_NE(nullptr, button);
manager->DoDefaultAction(*button);
WaitForAccessibilityTreeToContainNodeWithName(web_contents, "Done");
EXPECT_EQ(2, CountLinks(manager->GetBrowserAccessibilityRoot()));
}
}