blob: 106aec19eddd720cc3a31a9d077f9a5223918fea [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/renderer_context_menu/pdf_ocr_menu_observer.h"
#include "build/chromeos_buildflags.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/renderer_context_menu/mock_render_view_context_menu.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/prefs/pref_service.h"
#include "content/public/browser/context_menu_params.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/accessibility_features.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
#else
#include "content/public/browser/browser_accessibility_state.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace {
// A test class for the PDF OCR item in the Context Menu. This test should be
// a browser test as it accesses resources.
class PdfOcrMenuObserverTest : public InProcessBrowserTest {
public:
PdfOcrMenuObserverTest() {
scoped_feature_list_.InitAndEnableFeature(features::kPdfOcr);
}
void SetUpOnMainThread() override { Reset(false); }
void TearDownOnMainThread() override {
// TODO(crbug.com/1401757): Clear an observer from menu before resetting.
// That way, we can prevent from having a dangling pointer to the reset
// observer.
observer_.reset();
menu_.reset();
}
void Reset(bool incognito) {
// TODO(crbug.com/1401757): Clear an observer from menu before resetting.
// That way, we can prevent from having a dangling pointer to observer.
observer_.reset();
menu_ = std::make_unique<MockRenderViewContextMenu>(incognito);
observer_ = std::make_unique<PdfOcrMenuObserver>(menu_.get());
menu_->SetObserver(observer_.get());
}
void InitMenu() {
content::ContextMenuParams params;
observer_->InitMenu(params);
}
PdfOcrMenuObserverTest(const PdfOcrMenuObserverTest&) = delete;
PdfOcrMenuObserverTest& operator=(const PdfOcrMenuObserverTest&) = delete;
~PdfOcrMenuObserverTest() override;
MockRenderViewContextMenu* menu() { return menu_.get(); }
PdfOcrMenuObserver* observer() { return observer_.get(); }
private:
std::unique_ptr<PdfOcrMenuObserver> observer_;
std::unique_ptr<MockRenderViewContextMenu> menu_;
base::test::ScopedFeatureList scoped_feature_list_;
};
PdfOcrMenuObserverTest::~PdfOcrMenuObserverTest() = default;
} // namespace
// Tests that opening a context menu does not show the menu option if a
// screen reader is not enabled, regardless of the PDF OCR setting.
IN_PROC_BROWSER_TEST_F(PdfOcrMenuObserverTest,
PdfOcrItemNotShownWithoutScreenReader) {
menu()->GetPrefs()->SetBoolean(prefs::kAccessibilityPdfOcrAlwaysActive,
false);
InitMenu();
EXPECT_EQ(0u, menu()->GetMenuSize());
menu()->GetPrefs()->SetBoolean(prefs::kAccessibilityPdfOcrAlwaysActive, true);
InitMenu();
EXPECT_EQ(0u, menu()->GetMenuSize());
}
IN_PROC_BROWSER_TEST_F(PdfOcrMenuObserverTest,
PdfOcrItemShownWithScreenReaderEnabled) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Enable Chromevox.
ash::AccessibilityManager::Get()->EnableSpokenFeedback(true);
#else
// Spoof a screen reader.
content::testing::ScopedContentAXModeSetter scoped_accessibility_mode(
ui::AXMode::kScreenReader);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
menu()->GetPrefs()->SetBoolean(prefs::kAccessibilityPdfOcrAlwaysActive,
false);
InitMenu();
// Shows but is not checked.
ASSERT_EQ(3u, menu()->GetMenuSize());
MockRenderViewContextMenu::MockMenuItem item;
menu()->GetMenuItem(0, &item);
EXPECT_EQ(IDC_CONTENT_CONTEXT_PDF_OCR, item.command_id);
EXPECT_TRUE(item.enabled);
EXPECT_FALSE(item.checked);
EXPECT_FALSE(item.hidden);
// The submenu items exist.
menu()->GetMenuItem(1, &item);
EXPECT_EQ(IDC_CONTENT_CONTEXT_PDF_OCR_ALWAYS, item.command_id);
EXPECT_TRUE(item.enabled);
EXPECT_FALSE(item.checked);
EXPECT_FALSE(item.hidden);
menu()->GetMenuItem(2, &item);
EXPECT_EQ(IDC_CONTENT_CONTEXT_PDF_OCR_ONCE, item.command_id);
EXPECT_TRUE(item.enabled);
EXPECT_FALSE(item.checked);
EXPECT_FALSE(item.hidden);
Reset(false);
// Shows and is checked when a screen reader and the setting are both on.
menu()->GetPrefs()->SetBoolean(prefs::kAccessibilityPdfOcrAlwaysActive, true);
InitMenu();
ASSERT_EQ(1u, menu()->GetMenuSize());
menu()->GetMenuItem(0, &item);
EXPECT_EQ(IDC_CONTENT_CONTEXT_PDF_OCR, item.command_id);
EXPECT_TRUE(item.enabled);
EXPECT_TRUE(item.checked);
EXPECT_FALSE(item.hidden);
}