From cde5e00876b4a31c75bedb0fcdd4cb4c155e2bc5 Mon Sep 17 00:00:00 2001 From: Emerick Rogul Date: Wed, 20 Nov 2024 14:00:29 -0500 Subject: [PATCH] Disable screen_ai component download/installation (#26167) * Disable screen_ai component download/installation * Disable upstream OCR integration --------- Co-authored-by: Anthony Tseng --- browser/ai_chat/ai_chat_ui_browsertest.cc | 127 +----------------- .../screen_ai/screen_ai_install_state.cc | 16 +++ .../screen_ai/screen_ai_install_state.h | 17 +++ chromium_src/pdf/pdfium/DEPS | 3 - chromium_src/pdf/pdfium/pdfium_page.cc | 17 --- .../content/browser/ai_chat_tab_helper.cc | 18 +-- .../content/browser/ai_chat_tab_helper.h | 2 - .../ai_chat/content/browser/pdf_utils.cc | 68 +--------- .../leo/hello-world-in-image-has-blank.pdf | Bin 12638 -> 0 bytes ...ccessible-text-in-three-page-has-blank.pdf | Bin 53521 -> 0 bytes 10 files changed, 41 insertions(+), 227 deletions(-) create mode 100644 chromium_src/chrome/browser/screen_ai/screen_ai_install_state.cc create mode 100644 chromium_src/chrome/browser/screen_ai/screen_ai_install_state.h delete mode 100644 chromium_src/pdf/pdfium/DEPS delete mode 100644 chromium_src/pdf/pdfium/pdfium_page.cc delete mode 100644 test/data/leo/hello-world-in-image-has-blank.pdf delete mode 100644 test/data/leo/inaccessible-text-in-three-page-has-blank.pdf diff --git a/browser/ai_chat/ai_chat_ui_browsertest.cc b/browser/ai_chat/ai_chat_ui_browsertest.cc index 5bf3da579571..b29ecfe2499c 100644 --- a/browser/ai_chat/ai_chat_ui_browsertest.cc +++ b/browser/ai_chat/ai_chat_ui_browsertest.cc @@ -42,7 +42,6 @@ #include "net/test/embedded_test_server/http_response.h" #include "printing/buildflags/buildflags.h" #include "services/network/public/cpp/network_switches.h" -#include "services/screen_ai/buildflags/buildflags.h" #include "ui/compositor/compositor_switches.h" #include "url/gurl.h" @@ -50,18 +49,6 @@ #include "chrome/browser/printing/test_print_preview_observer.h" #endif -#if BUILDFLAG(ENABLE_SCREEN_AI_BROWSERTESTS) && !BUILDFLAG(USE_FAKE_SCREEN_AI) -#define PDF_OCR_INTEGRATION_TEST_ENABLED -#endif - -#if defined(PDF_OCR_INTEGRATION_TEST_ENABLED) -#include "chrome/browser/screen_ai/screen_ai_install_state.h" -#include "components/strings/grit/components_strings.h" -#include "services/screen_ai/public/cpp/utilities.h" -#include "ui/accessibility/accessibility_features.h" -#include "ui/accessibility/ax_features.mojom-features.h" -#endif // defined(PDF_OCR_INTEGRATION_TEST_ENABLED) - namespace { constexpr char kEmbeddedTestServerDirectory[] = "leo"; @@ -311,9 +298,10 @@ IN_PROC_BROWSER_TEST_F(AIChatUIBrowserTest, ExtractionPrintDialog) { #endif // BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER) && // defined(ARCH_CPU_64_BITS) IN_PROC_BROWSER_TEST_F(AIChatUIBrowserTest, MAYBE_PrintPreviewFallback) { - // Falls back when there is no regular DOM content - // pdf test will be in UpstreamPDFIntegratoinTest since we enable upstream pdf - // ocr for all pdf files + NavigateURL(https_server_.GetURL("a.com", "/text_in_image.pdf"), false); + FetchPageContent( + FROM_HERE, "This is the way.\n\nI have spoken.\nWherever I Go, He Goes."); + NavigateURL(https_server_.GetURL("a.com", "/canvas.html"), false); FetchPageContent(FROM_HERE, "this is the way"); @@ -396,110 +384,3 @@ IN_PROC_BROWSER_TEST_F(AIChatUIBrowserTest, {{"test query", "test summary"}, {"test query 2", "test summary 2"}})); } - -#if defined(PDF_OCR_INTEGRATION_TEST_ENABLED) -// Test ai chat integration with upstream kPdfOcr -class UpstreamPDFIntegratoinTest : public AIChatUIBrowserTest { - public: - UpstreamPDFIntegratoinTest() - : embedded_test_server_(net::EmbeddedTestServer::TYPE_HTTPS) { - feature_list_.InitWithFeatures( - {::features::kPdfOcr, ::features::kScreenAITestMode, - ax::mojom::features::kScreenAIOCREnabled}, - {}); - } - - void SetUpOnMainThread() override { - AIChatUIBrowserTest::SetUpOnMainThread(); - - content::SetupCrossSiteRedirector(&embedded_test_server_); - - base::FilePath test_data_dir; - test_data_dir = base::PathService::CheckedGet(chrome::DIR_TEST_DATA); - test_data_dir = - test_data_dir.AppendASCII("pdf").AppendASCII("accessibility"); - embedded_test_server_.ServeFilesFromDirectory(test_data_dir); - ASSERT_TRUE(embedded_test_server_.Start()); - - screen_ai::ScreenAIInstallState::GetInstance()->SetComponentFolder( - screen_ai::GetComponentBinaryPathForTests().DirName()); - } - - void SetUpCommandLine(base::CommandLine* command_line) override { - AIChatUIBrowserTest::SetUpCommandLine(command_line); - command_line->RemoveSwitch(network::switches::kHostResolverRules); - } - - void FetchPageContentAndWaitForOCR( - const base::Location& location, - std::string_view expected_text, - int ocr_status_message_id = IDS_PDF_OCR_COMPLETED) { - SCOPED_TRACE(testing::Message() << location.ToString()); - base::RunLoop run_loop; - chat_tab_helper_->GetPageContent( - base::BindLambdaForTesting( - [&run_loop, expected_text](std::string text, bool is_video, - std::string invalidation_token) { - EXPECT_FALSE(is_video); - EXPECT_EQ(text, expected_text); - run_loop.Quit(); - }), - ""); - auto inner_web_contents = GetActiveWebContents()->GetInnerWebContents(); - ASSERT_TRUE(inner_web_contents.size() == 1); - WaitForAccessibilityTreeToContainNodeWithName( - inner_web_contents[0], l10n_util::GetStringUTF8(ocr_status_message_id)); - run_loop.Run(); - } - - protected: - net::test_server::EmbeddedTestServer embedded_test_server_; - base::test::ScopedFeatureList feature_list_; -}; - -IN_PROC_BROWSER_TEST_F(UpstreamPDFIntegratoinTest, PDFOcr) { - // Single paragraph - NavigateURL( - embedded_test_server_.GetURL("a.com", "/hello-world-in-image.pdf")); - FetchPageContentAndWaitForOCR(FROM_HERE, "Hello, world!"); - - // Multiple paragraphs - NavigateURL(embedded_test_server_.GetURL( - "a.com", "/inaccessible-text-in-three-page.pdf")); - FetchPageContentAndWaitForOCR(FROM_HERE, - "Hello, world!\n" - "Paragraph 1 on Page 2\n" - "Paragraph 2 on Page 2\n" - "Paragraph 1 on Page 3\n" - "Paragraph 2 on Page 3"); -} - -#if BUILDFLAG(ENABLE_TEXT_RECOGNITION) && BUILDFLAG(ENABLE_PRINT_PREVIEW) -IN_PROC_BROWSER_TEST_F(UpstreamPDFIntegratoinTest, - PDFOcrFailed_PrintPreviewFallback) { - // Fallback to print preview extraction when upstream pdf ocr has empty - // results. - NavigateURL(https_server_.GetURL("b.com", "/text_in_image.pdf"), false); - FetchPageContentAndWaitForOCR( - FROM_HERE, "This is the way.\n\nI have spoken.\nWherever I Go, He Goes.", - IDS_PDF_OCR_NO_RESULT); -} -#endif // BUILDFLAG(ENABLE_TEXT_RECOGNITION) && BUILDFLAG(ENABLE_PRINT_PREVIEW) - -IN_PROC_BROWSER_TEST_F(UpstreamPDFIntegratoinTest, PDFOcrWithBlankPage) { - // Single paragraph - NavigateURL( - https_server_.GetURL("a.com", "/hello-world-in-image-has-blank.pdf")); - FetchPageContentAndWaitForOCR(FROM_HERE, "Hello, world!"); - - // Multiple paragraphs - NavigateURL(https_server_.GetURL( - "a.com", "/inaccessible-text-in-three-page-has-blank.pdf")); - FetchPageContentAndWaitForOCR(FROM_HERE, - "Hello, world!\n\n" - "Paragraph 1 on Page 2\n" - "Paragraph 2 on Page 2\n\n" - "Paragraph 1 on Page 3\n" - "Paragraph 2 on Page 3"); -} -#endif // defined(PDF_OCR_INTEGRATION_TEST_ENABLED) diff --git a/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.cc b/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.cc new file mode 100644 index 000000000000..5d1490e2d4dd --- /dev/null +++ b/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.cc @@ -0,0 +1,16 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "chrome/browser/screen_ai/screen_ai_install_state.h" + +#define ShouldInstall ShouldInstall_ChromiumImpl +#include "src/chrome/browser/screen_ai/screen_ai_install_state.cc" +#undef ShouldInstall + +namespace screen_ai { +bool ScreenAIInstallState::ShouldInstall(PrefService* local_state) { + return false; +} +} // namespace screen_ai diff --git a/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.h b/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.h new file mode 100644 index 000000000000..22d61067b929 --- /dev/null +++ b/chromium_src/chrome/browser/screen_ai/screen_ai_install_state.h @@ -0,0 +1,17 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_CHROMIUM_SRC_CHROME_BROWSER_SCREEN_AI_SCREEN_AI_INSTALL_STATE_H_ +#define BRAVE_CHROMIUM_SRC_CHROME_BROWSER_SCREEN_AI_SCREEN_AI_INSTALL_STATE_H_ + +#define ShouldInstall \ + ShouldInstall_ChromiumImpl(PrefService* local_state); \ + static bool ShouldInstall + +#include "src/chrome/browser/screen_ai/screen_ai_install_state.h" // IWYU pragma: export + +#undef ShouldInstall + +#endif // BRAVE_CHROMIUM_SRC_CHROME_BROWSER_SCREEN_AI_SCREEN_AI_INSTALL_STATE_H_ diff --git a/chromium_src/pdf/pdfium/DEPS b/chromium_src/pdf/pdfium/DEPS deleted file mode 100644 index e59caad0df40..000000000000 --- a/chromium_src/pdf/pdfium/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - "+third_party/pdfium/public", -] diff --git a/chromium_src/pdf/pdfium/pdfium_page.cc b/chromium_src/pdf/pdfium/pdfium_page.cc deleted file mode 100644 index c7d5f5ed0bc2..000000000000 --- a/chromium_src/pdf/pdfium/pdfium_page.cc +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (c) 2024 The Brave Authors. All rights reserved. - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at https://mozilla.org/MPL/2.0/. */ - -#include "third_party/pdfium/public/fpdf_catalog.h" - -#define FPDFCatalog_IsTagged \ - false; \ - if (!page_object_count) { \ - images_.push_back(Image()); \ - return; \ - } \ - is_tagged = FPDFCatalog_IsTagged - -#include "src/pdf/pdfium/pdfium_page.cc" -#undef FPDFCatalog_IsTagged diff --git a/components/ai_chat/content/browser/ai_chat_tab_helper.cc b/components/ai_chat/content/browser/ai_chat_tab_helper.cc index c2da31bdb21f..12a143243567 100644 --- a/components/ai_chat/content/browser/ai_chat_tab_helper.cc +++ b/components/ai_chat/content/browser/ai_chat_tab_helper.cc @@ -52,9 +52,7 @@ void AIChatTabHelper::PDFA11yInfoLoadObserver::AccessibilityEventReceived( for (const auto& node : update.nodes) { const auto& node_name = node.GetStringAttribute(ax::mojom::StringAttribute::kName); - if (node_name == l10n_util::GetStringUTF8(IDS_PDF_LOADED_TO_A11Y_TREE) || - node_name == l10n_util::GetStringUTF8(IDS_PDF_OCR_COMPLETED) || - node_name == l10n_util::GetStringUTF8(IDS_PDF_OCR_NO_RESULT)) { + if (node_name == l10n_util::GetStringUTF8(IDS_PDF_LOADED_TO_A11Y_TREE)) { // features::kUseMoveNotCopyInMergeTreeUpdate updates a11y tree after // `AccessibilityEventReceived` so we cannot assume changes are // reflected upon receiving updates. @@ -251,20 +249,6 @@ void AIChatTabHelper::GetPageContent(GetPageContentCallback callback, bool is_pdf = IsPdf(web_contents()); if (is_pdf && !is_pdf_a11y_info_loaded_) { SetPendingGetContentCallback(std::move(callback)); - // PdfAccessibilityTree::AccessibilityModeChanged handles kPDFOcr changes - // with |always_load_or_reload_accessibility| is true - if (inner_web_contents_) { - auto current_mode = inner_web_contents_->GetAccessibilityMode(); - if (!current_mode.has_mode(ui::AXMode::kPDFOcr)) { - current_mode |= ui::AXMode::kPDFOcr; - scoped_accessibility_mode_ = - content::BrowserAccessibilityState::GetInstance() - ->CreateScopedModeForWebContents(inner_web_contents_, - current_mode); - } - pdf_load_observer_ = - std::make_unique(inner_web_contents_, this); - } // Manually check when pdf extraction requested so we don't always rely on // a11y events to prevent stale callback. It can happens during background // pdf tab loading or bug in upstream kPdfOCR that an empty page in pdf will diff --git a/components/ai_chat/content/browser/ai_chat_tab_helper.h b/components/ai_chat/content/browser/ai_chat_tab_helper.h index 1c6d9d532a5f..46a6147421e4 100644 --- a/components/ai_chat/content/browser/ai_chat_tab_helper.h +++ b/components/ai_chat/content/browser/ai_chat_tab_helper.h @@ -29,7 +29,6 @@ class ScopedAccessibilityMode; } class AIChatUIBrowserTest; -class UpstreamPDFIntegratoinTest; namespace ai_chat { class AIChatMetrics; @@ -110,7 +109,6 @@ class AIChatTabHelper : public content::WebContentsObserver, friend class content::WebContentsUserData; friend class ::AIChatUIBrowserTest; friend class AIChatTabHelperUnitTest; - friend class ::UpstreamPDFIntegratoinTest; // To observe PDF InnerWebContents for "Finished loading PDF" event which // means PDF content has been loaded to an accessibility tree. diff --git a/components/ai_chat/content/browser/pdf_utils.cc b/components/ai_chat/content/browser/pdf_utils.cc index b2439d5f16a3..94c28018416e 100644 --- a/components/ai_chat/content/browser/pdf_utils.cc +++ b/components/ai_chat/content/browser/pdf_utils.cc @@ -35,64 +35,6 @@ ui::AXNode* FindPdfRoot(const ui::AXNode* start_node) { return nullptr; } -#if BUILDFLAG(ENABLE_PDF) -ui::AXNode* FindOcrResultBeginBanner(const ui::AXNode* start_node) { - if (!start_node) { - return nullptr; - } - for (const auto& node : start_node->GetAllChildren()) { - if (node->GetStringAttribute(ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF8(IDS_PDF_OCR_RESULT_BEGIN) && - node->GetParent()->GetRole() == ax::mojom::Role::kBanner) { - return node->GetParent(); - } - ui::AXNode* result = FindOcrResultBeginBanner(node); - if (result) { - return result; - } - } - return nullptr; -} - -bool IsOcrResultEndContentInfo(const ui::AXNode* node) { - if (!node) { - return false; - } - if (node->GetRole() == ax::mojom::Role::kContentInfo && - node->GetChildCount() == 1u && - node->GetFirstChild()->GetStringAttribute( - ax::mojom::StringAttribute::kName) == - l10n_util::GetStringUTF8(IDS_PDF_OCR_RESULT_END)) { - return true; - } - return false; -} -#endif - -std::optional GetOcrResult(const ui::AXNode* start_node) { -#if BUILDFLAG(ENABLE_PDF) - if (!start_node) { - return std::nullopt; - } - const auto* ocr_result_begin_banner = FindOcrResultBeginBanner(start_node); - if (!ocr_result_begin_banner) { - return std::nullopt; - } - std::string result; - ui::AXNode* node = ocr_result_begin_banner->GetNextSibling(); - while (node && !IsOcrResultEndContentInfo(node)) { - base::StrAppend( - &result, - {node->GetTextContentUTF8(), - IsOcrResultEndContentInfo(node->GetNextSibling()) ? "" : "\n"}); - node = node->GetNextSibling(); - } - return result; -#else - return std::nullopt; -#endif -} - } // namespace bool IsPdf(content::WebContents* web_contents) { @@ -132,9 +74,7 @@ bool IsPdfLoaded(const ui::AXNode* pdf_root) { const auto& name = pdf_root->GetChildAtIndex(0)->GetChildAtIndex(0)->GetStringAttribute( ax::mojom::StringAttribute::kName); - if (name == l10n_util::GetStringUTF8(IDS_PDF_OCR_IN_PROGRESS) || - name == l10n_util::GetStringUTF8(IDS_PDF_LOADING_TO_A11Y_TREE) || - name == l10n_util::GetStringUTF8(IDS_PDF_OCR_FEATURE_ALERT)) { + if (name == l10n_util::GetStringUTF8(IDS_PDF_LOADING_TO_A11Y_TREE)) { return false; } #endif @@ -153,10 +93,8 @@ std::string ExtractPdfContent(const ui::AXNode* pdf_root) { for (auto it = children.cbegin() + 1; it != children.cend(); ++it) { const ui::AXNode* node = *it; if (node->GetRole() == ax::mojom::Role::kRegion) { - auto ocr_result = GetOcrResult(node); - base::StrAppend(&pdf_content, - {ocr_result ? *ocr_result : node->GetTextContentUTF8(), - it == children.cend() - 1 ? "" : "\n"}); + base::StrAppend(&pdf_content, {node->GetTextContentUTF8(), + it == children.cend() - 1 ? "" : "\n"}); } } return pdf_content; diff --git a/test/data/leo/hello-world-in-image-has-blank.pdf b/test/data/leo/hello-world-in-image-has-blank.pdf deleted file mode 100644 index 53d1ddbf7c5c0fffb7a58db10cb99147786b11f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12638 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 diff --git a/test/data/leo/inaccessible-text-in-three-page-has-blank.pdf b/test/data/leo/inaccessible-text-in-three-page-has-blank.pdf deleted file mode 100644 index 471d9f259638136135eb795ae932e59712dcddf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53521 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