Commit 7fca17c1 authored by James Wallace-Lee's avatar James Wallace-Lee Committed by Commit Bot

Reland "Tab modal dialog title should be accessible window title"

This is a reland of a6f6697e

The test, GetAccessibleTabModalDialogTitle, failed on OSX because
tab-modal dialogs are treated as native windows in Voiceover.
This fix is unnecessary on OSX so the test is now disabled there.

Original change's description:
> Tab modal dialog title should be accessible window title
>
> Tab modal dialogs (ui::MODAL_TYPE_CHILD) should report their title
> to AT (insert+T on JAWS and NVDA) when active. To accomplish this,
> BrowserView::GetAccessibleWindowTitle should report the title of
> the dialog when one is active.
>
> Bug: 775680
> Test: browser_tests.exe --gtest_filter=BrowserViewTest.GetAccessibleTabModalDialogTitle
> Change-Id: Ie693e1627c87e4d97eede64381d80dab31635642
> Reviewed-on: https://chromium-review.googlesource.com/1184039
> Commit-Queue: James Wallace-Lee <jamwalla@chromium.org>
> Reviewed-by: Scott Violet <sky@chromium.org>
> Reviewed-by: Dominic Mazzoni <dmazzoni@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#587371}

Bug: 775680, 879074, 879253
Change-Id: I4351a6487a4cb582383fe18b97e825a986464f59
Reviewed-on: https://chromium-review.googlesource.com/1197333Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: James Wallace-Lee <jamwalla@chromium.org>
Cr-Commit-Position: refs/heads/master@{#587845}
parent 28a9722f
......@@ -1701,6 +1701,30 @@ base::string16 BrowserView::GetWindowTitle() const {
}
base::string16 BrowserView::GetAccessibleWindowTitle() const {
// If there is a focused and visible tab-modal dialog, report the dialog's
// title instead of the page title.
const views::FocusManager* focus_manager = GetFocusManager();
const views::View* focused_view =
focus_manager ? focus_manager->GetFocusedView() : nullptr;
if (focused_view) {
std::set<views::Widget*> child_widgets;
views::Widget::GetAllOwnedWidgets(GetWidget()->GetNativeView(),
&child_widgets);
for (auto iter = child_widgets.begin(); iter != child_widgets.end();
++iter) {
views::Widget* child_widget = *iter;
DCHECK_NE(GetWidget(), child_widget);
WidgetDelegate* child_delegate = child_widget->widget_delegate();
if (child_delegate->GetModalType() == ui::MODAL_TYPE_CHILD &&
child_widget->IsVisible() &&
child_widget->GetContentsView()->Contains(focused_view))
return child_delegate->GetAccessibleWindowTitle();
}
}
return GetAccessibleWindowTitleForChannelAndProfile(chrome::GetChannel(),
browser_->profile());
}
......
......@@ -6,15 +6,18 @@
#include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/devtools/devtools_window_testing.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tab_modal_confirm_dialog.h"
#include "chrome/browser/ui/tab_ui_helper.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
#include "chrome/browser/ui/views/bookmarks/bookmark_bar_view_observer.h"
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "chrome/test/views/scoped_macviews_browser_mode.h"
......@@ -25,6 +28,7 @@
#include "content/public/browser/web_contents_observer.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "ui/base/l10n/l10n_util.h"
class BrowserViewTest : public InProcessBrowserTest {
public:
......@@ -87,6 +91,17 @@ class TestWebContentsObserver : public content::WebContentsObserver {
DISALLOW_COPY_AND_ASSIGN(TestWebContentsObserver);
};
class TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate {
public:
explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents)
: TabModalConfirmDialogDelegate(contents) {}
base::string16 GetTitle() override {
return base::string16(base::ASCIIToUTF16("Dialog Title"));
}
base::string16 GetDialogMessage() override { return base::string16(); }
DISALLOW_COPY_AND_ASSIGN(TestTabModalConfirmDialogDelegate);
};
} // namespace
// Verifies don't crash when CloseNow() is invoked with two tabs in a browser.
......@@ -339,3 +354,31 @@ IN_PROC_BROWSER_TEST_F(BrowserViewTest, ShowFaviconInTab) {
auto favicon = helper->GetFavicon();
ASSERT_FALSE(favicon.IsEmpty());
}
#if defined(OS_MACOSX)
// Voiceover treats tab modal dialogs as native windows, so this approach is not
// necessary.
#define MAYBE_GetAccessibleTabModalDialogTitle \
DISABLED_GetAccessibleTabModalDialogTitle
#else
#define MAYBE_GetAccessibleTabModalDialogTitle GetAccessibleTabModalDialogTitle
#endif
// Open a tab-modal dialog and check that the accessible window title is the
// title of the dialog.
IN_PROC_BROWSER_TEST_F(BrowserViewTest,
MAYBE_GetAccessibleTabModalDialogTitle) {
base::string16 window_title = base::ASCIIToUTF16("about:blank - ") +
l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),
window_title, base::CompareCase::SENSITIVE));
content::WebContents* contents = browser_view()->GetActiveWebContents();
TestTabModalConfirmDialogDelegate* delegate =
new TestTabModalConfirmDialogDelegate(contents);
TabModalConfirmDialog::Create(delegate, contents);
EXPECT_EQ(browser_view()->GetAccessibleWindowTitle(), delegate->GetTitle());
delegate->Close();
EXPECT_TRUE(base::StartsWith(browser_view()->GetAccessibleWindowTitle(),
window_title, base::CompareCase::SENSITIVE));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment