Commit a582e393 authored by siyua's avatar siyua Committed by Commit Bot

[AF][Status Chip] Adding logic to activate available inactive bubble

which has a related icon in ToolbarPageActionIconContainerView

1) Added logic to make sure an inactive bubble (if any) related to
icons in the ToolbarPageActionIconContainerView can be activated for
accessibility.

2) Added logic to update icons in ToolbarPageActionIconContainerView
whenever toolbar refreshes itself.

Bug: 932818
Change-Id: Ibbbeeb8446cf48c7a2de047f0a292051b79583ca
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1542566
Commit-Queue: Siyu An <siyua@chromium.org>
Reviewed-by: default avatarPeter Boström <pbos@chromium.org>
Reviewed-by: default avatarJared Saul <jsaul@google.com>
Cr-Commit-Position: refs/heads/master@{#646666}
parent 244a4c23
......@@ -15,6 +15,7 @@
#include "base/run_loop.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/autofill/autofill_uitest_util.h"
#include "chrome/browser/autofill/personal_data_manager_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h"
......@@ -35,8 +36,10 @@
#include "chrome/browser/ui/views/autofill/local_card_migration_icon_view.h"
#include "chrome/browser/ui/views/autofill/migratable_card_view.h"
#include "chrome/browser/ui/views/autofill/save_card_bubble_views.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/browser/web_data_service_factory.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
......@@ -980,8 +983,75 @@ IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForStatusChip,
Bucket(AutofillMetrics::LOCAL_CARD_MIGRATION_BUBBLE_SHOWN, 1)));
}
#if defined(OS_MACOSX)
// TODO(crbug.com/823543): Widget activation doesn't work on Mac.
#define MAYBE_ActivateFirstInactiveBubbleForAccessibility \
DISABLED_ActivateFirstInactiveBubbleForAccessibility
#else
#define MAYBE_ActivateFirstInactiveBubbleForAccessibility \
ActivateFirstInactiveBubbleForAccessibility
#endif
IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForStatusChip,
MAYBE_ActivateFirstInactiveBubbleForAccessibility) {
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
ToolbarView* toolbar_view = browser_view->toolbar();
EXPECT_FALSE(toolbar_view->toolbar_page_action_container()
->ActivateFirstInactiveBubbleForAccessibility());
SaveLocalCard(kFirstCardNumber);
SaveLocalCard(kSecondCardNumber);
UseCardAndWaitForMigrationOffer(kFirstCardNumber);
// Ensures the bubble's widget is visible, but inactive. Active widgets are
// focused by accessibility, so not of concern.
views::Widget* widget = GetLocalCardMigrationOfferBubbleViews()->GetWidget();
widget->Deactivate();
widget->ShowInactive();
EXPECT_TRUE(widget->IsVisible());
EXPECT_FALSE(widget->IsActive());
EXPECT_TRUE(toolbar_view->toolbar_page_action_container()
->ActivateFirstInactiveBubbleForAccessibility());
// Ensure the bubble's widget refreshed appropriately.
EXPECT_TRUE(
GetLocalCardMigrationIconView(/*icon_in_status_chip=*/true)->visible());
EXPECT_TRUE(widget->IsVisible());
EXPECT_TRUE(widget->IsActive());
}
// Ensures the credit card icon updates its visibility when switching between
// tabs.
IN_PROC_BROWSER_TEST_F(LocalCardMigrationBrowserTestForStatusChip,
IconAndBubbleVisibilityAfterTabSwitching) {
SaveLocalCard(kFirstCardNumber);
SaveLocalCard(kSecondCardNumber);
UseCardAndWaitForMigrationOffer(kFirstCardNumber);
// Ensures flow is triggered, and bubble and icon view are visible.
EXPECT_TRUE(
GetLocalCardMigrationIconView(/*icon_in_status_chip=*/true)->visible());
EXPECT_TRUE(GetLocalCardMigrationOfferBubbleViews()->visible());
AddTabAtIndex(1, GURL("http://example.com/"), ui::PAGE_TRANSITION_TYPED);
TabStripModel* tab_model = browser()->tab_strip_model();
tab_model->ActivateTabAt(1, {TabStripModel::GestureType::kOther});
// Ensures bubble and icon go away if user navigates to another tab.
EXPECT_FALSE(
GetLocalCardMigrationIconView(/*icon_in_status_chip=*/true)->visible());
EXPECT_FALSE(GetLocalCardMigrationOfferBubbleViews());
tab_model->ActivateTabAt(0, {TabStripModel::GestureType::kOther});
// If the user navigates back, shows only the icon not the bubble.
EXPECT_TRUE(
GetLocalCardMigrationIconView(/*icon_in_status_chip=*/true)->visible());
EXPECT_FALSE(GetLocalCardMigrationOfferBubbleViews());
}
// TODO(crbug.com/897998):
// - Update test set-up and add navagation tests.
// - Update test set-up and add navigation tests.
// - Add more tests for feedback dialog.
} // namespace autofill
......@@ -28,8 +28,10 @@
#include "chrome/browser/ui/views/autofill/dialog_view_ids.h"
#include "chrome/browser/ui/views/autofill/save_card_bubble_views.h"
#include "chrome/browser/ui/views/autofill/save_card_icon_view.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h"
#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/autofill/content/browser/content_autofill_driver.h"
......@@ -2779,4 +2781,69 @@ IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
EXPECT_TRUE(GetSaveCardBubbleViews()->visible());
}
#if defined(OS_MACOSX)
// TODO(crbug.com/823543): Widget activation doesn't work on Mac.
#define MAYBE_ActivateFirstInactiveBubbleForAccessibility \
DISABLED_ActivateFirstInactiveBubbleForAccessibility
#else
#define MAYBE_ActivateFirstInactiveBubbleForAccessibility \
ActivateFirstInactiveBubbleForAccessibility
#endif
IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
MAYBE_ActivateFirstInactiveBubbleForAccessibility) {
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
ToolbarView* toolbar_view = browser_view->toolbar();
EXPECT_FALSE(toolbar_view->toolbar_page_action_container()
->ActivateFirstInactiveBubbleForAccessibility());
ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE});
NavigateTo(kCreditCardUploadForm);
FillAndSubmitForm();
WaitForObservedEvent();
// Ensures the bubble's widget is visible, but inactive. Active widgets are
// focused by accessibility, so not of concern.
views::Widget* widget = GetSaveCardBubbleViews()->GetWidget();
widget->Deactivate();
widget->ShowInactive();
EXPECT_TRUE(widget->IsVisible());
EXPECT_FALSE(widget->IsActive());
EXPECT_TRUE(toolbar_view->toolbar_page_action_container()
->ActivateFirstInactiveBubbleForAccessibility());
// Ensure the bubble's widget refreshed appropriately.
EXPECT_TRUE(GetSaveCardIconView()->visible());
EXPECT_TRUE(widget->IsVisible());
EXPECT_TRUE(widget->IsActive());
}
// Ensures the credit card icon updates its visibility when switching between
// tabs.
IN_PROC_BROWSER_TEST_F(SaveCardBubbleViewsFullFormBrowserTestForStatusChip,
IconAndBubbleVisibilityAfterTabSwitching) {
ResetEventWaiterForSequence({DialogEvent::OFFERED_LOCAL_SAVE});
NavigateTo(kCreditCardUploadForm);
FillAndSubmitForm();
WaitForObservedEvent();
// Ensures flow is triggered, and bubble and icon view are visible.
EXPECT_TRUE(GetSaveCardIconView()->visible());
EXPECT_TRUE(GetSaveCardBubbleViews()->visible());
AddTabAtIndex(1, GURL("http://example.com/"), ui::PAGE_TRANSITION_TYPED);
TabStripModel* tab_model = browser()->tab_strip_model();
tab_model->ActivateTabAt(1, {TabStripModel::GestureType::kOther});
// Ensures bubble and icon go away if user navigates to another tab.
EXPECT_FALSE(GetSaveCardIconView()->visible());
EXPECT_FALSE(GetSaveCardBubbleViews());
tab_model->ActivateTabAt(0, {TabStripModel::GestureType::kOther});
// If the user navigates back, shows only the icon not the bubble.
EXPECT_TRUE(GetSaveCardIconView()->visible());
EXPECT_FALSE(GetSaveCardBubbleViews());
}
} // namespace autofill
......@@ -1205,6 +1205,12 @@ void BrowserView::FocusInactivePopupForAccessibility() {
if (GetLocationBarView()->ActivateFirstInactiveBubbleForAccessibility())
return;
if (toolbar_ && toolbar_->toolbar_page_action_container() &&
toolbar_->toolbar_page_action_container()
->ActivateFirstInactiveBubbleForAccessibility()) {
return;
}
if (infobar_container_->child_count() > 0)
infobar_container_->SetPaneFocusAndFocusDefault();
}
......
......@@ -9,6 +9,8 @@
#include "chrome/browser/ui/views/autofill/save_card_icon_view.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "ui/views/bubble/bubble_dialog_delegate_view.h"
#include "ui/views/widget/widget.h"
ToolbarPageActionIconContainerView::ToolbarPageActionIconContainerView(
CommandUpdater* command_updater,
......@@ -20,8 +22,7 @@ ToolbarPageActionIconContainerView::ToolbarPageActionIconContainerView(
// what we want here. Put placeholders for now.
views::style::GetFont(CONTEXT_TOOLBAR_BUTTON,
views::style::STYLE_PRIMARY));
local_card_migration_icon_view_->SetVisible(false);
AddChildView(local_card_migration_icon_view_);
page_action_icons_.push_back(local_card_migration_icon_view_);
save_card_icon_view_ = new autofill::SaveCardIconView(
command_updater, browser, this,
......@@ -29,19 +30,20 @@ ToolbarPageActionIconContainerView::ToolbarPageActionIconContainerView(
// what we want here. Put placeholders for now.
views::style::GetFont(CONTEXT_TOOLBAR_BUTTON,
views::style::STYLE_PRIMARY));
save_card_icon_view_->SetVisible(false);
AddChildView(save_card_icon_view_);
page_action_icons_.push_back(save_card_icon_view_);
for (PageActionIconView* icon_view : page_action_icons_) {
icon_view->SetVisible(false);
AddChildView(icon_view);
}
}
ToolbarPageActionIconContainerView::~ToolbarPageActionIconContainerView() =
default;
void ToolbarPageActionIconContainerView::UpdateAllIcons() {
if (local_card_migration_icon_view_)
local_card_migration_icon_view_->Update();
if (save_card_icon_view_)
save_card_icon_view_->Update();
for (PageActionIconView* icon_view : page_action_icons_)
icon_view->Update();
}
PageActionIconView* ToolbarPageActionIconContainerView::GetIconView(
......@@ -57,6 +59,15 @@ PageActionIconView* ToolbarPageActionIconContainerView::GetIconView(
}
}
bool ToolbarPageActionIconContainerView::
ActivateFirstInactiveBubbleForAccessibility() {
for (PageActionIconView* icon_view : page_action_icons_) {
if (FocusInactiveBubbleForIcon(icon_view))
return true;
}
return false;
}
void ToolbarPageActionIconContainerView::UpdatePageActionIcon(
PageActionIconType icon_type) {
PageActionIconView* icon = GetIconView(icon_type);
......@@ -73,3 +84,16 @@ content::WebContents*
ToolbarPageActionIconContainerView::GetWebContentsForPageActionIconView() {
return browser_->tab_strip_model()->GetActiveWebContents();
}
bool ToolbarPageActionIconContainerView::FocusInactiveBubbleForIcon(
PageActionIconView* icon_view) {
if (!icon_view->visible() || !icon_view->GetBubble())
return false;
views::Widget* widget = icon_view->GetBubble()->GetWidget();
if (widget && widget->IsVisible() && !widget->IsActive()) {
widget->Show();
return true;
}
return false;
}
......@@ -32,6 +32,10 @@ class ToolbarPageActionIconContainerView : public ToolbarIconContainerView,
PageActionIconView* GetIconView(PageActionIconType icon_type);
// Activate the first visible but inactive PageActionIconView for
// accessibility.
bool ActivateFirstInactiveBubbleForAccessibility();
// ToolbarIconContainerView:
void UpdateAllIcons() override;
......@@ -51,10 +55,14 @@ class ToolbarPageActionIconContainerView : public ToolbarIconContainerView,
}
private:
bool FocusInactiveBubbleForIcon(PageActionIconView* icon_view);
autofill::LocalCardMigrationIconView* local_card_migration_icon_view_ =
nullptr;
autofill::SaveCardIconView* save_card_icon_view_ = nullptr;
std::vector<PageActionIconView*> page_action_icons_;
Browser* const browser_;
DISALLOW_COPY_AND_ASSIGN(ToolbarPageActionIconContainerView);
......
......@@ -321,10 +321,15 @@ void ToolbarView::AnimationProgressed(const gfx::Animation* animation) {
void ToolbarView::Update(WebContents* tab) {
if (location_bar_)
location_bar_->Update(tab);
if (browser_actions_)
browser_actions_->RefreshToolbarActionViews();
if (reload_)
reload_->set_menu_enabled(chrome::IsDebuggerAttachedToCurrentTab(browser_));
if (toolbar_page_action_container_)
toolbar_page_action_container_->UpdateAllIcons();
}
void ToolbarView::SetToolbarVisibility(bool visible) {
......
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