This is an upstream Chromium test. Brave's cosmetic filters inject
MutationObserver and setInterval(500ms) polling on all pages, preventing
Blink's IdlenessDetector from reaching its 500ms quiet window needed for
NetworkBecameIdle. The Paint test triggers this by resolving the network
request after paint stability is reached, then waiting for the
network/main-thread idle histogram that never fires.
Same root cause as already-disabled PageStabilityMetricsTest.
NetworkAndMainThreadIdle (Linux, #54205) and PageStabilityMetricsTest.
Paint (Windows, #54186). Upstream flake rate is 2.5% over 30 days per
LUCI Analysis.
Resolves https://github.com/brave/brave-browser/issues/54503
The Chromium test DialogDoesNotShowWithExtensionEnabledThatOverridesDSE
fails on Linux because ApplyDefaultSearchChangeForTesting(FROM_EXTENSION)
leaves default_search_provider_ null (extension DSEs are unsupported on
Linux) while default_search_provider_source_ stays FROM_EXTENSION.
Brave's DefaultSearchManager override causes MaybeShowDialog() to record
the Search.ChoiceScreenNavigationConditions histogram twice with
differing conditions (kControlledByPolicy and kExtensionControlled),
failing the ExpectUniqueSample assertion.
Already disabled on Windows in upstream source. Upstream TODO
crbug.com/429600559 acknowledges the broken extension DSE test setup.
Stable upstream (0.3% flake rate over 30 days per LUCI Analysis).
Resolves https://github.com/brave/brave-browser/issues/54542
Chromium test with 1.1% upstream flake rate (83k+ verdicts, LUCI
Analysis 30-day lookback). The PartitionedCookiePresentV3 UKM is
recorded per cookie access event without per-page deduplication, so
the test's delta occasionally gets 2 instead of 1 when a prior
navigation's UKM recording arrives after the baseline snapshot.
Fixed upstream (crrev.com/c/7746704) by adding a per-page tracking
flag to PageImpl, but that fix has not landed in Chromium 148.
No Brave chromium_src overrides for content/browser/renderer_host/
cookie_utils.cc. Chromium also disabled this test temporarily
upstream before the fix landed.
Resolves https://github.com/brave/brave-browser/issues/55020
`UpdateMatchDestinationURLWithInvocationSource` now appends source=chrome.ob to
all omnibox search URLs via `AppendOrReplaceQueryParameter`. This is
Chrome-specific attribution telemetry intended for Google's servers, but it also
overwrites any existing source parameter - including the `source=desktop` /
`source=android` value we bake into the Brave Search URL template in
brave_prepopulated_engines.cc.
This fix suppresses the injection by overriding the upstream injection function
to do nothing.
Chromium changes:
https://source.chromium.org/chromium/chromium/src/+/170478de25798c69727e9e3fa31be2dc8ac8ca1d
commit 170478de25798c69727e9e3fa31be2dc8ac8ca1d
Author: Nihar Majmudar <niharm@google.com>
Date: Thu Apr 9 09:45:19 2026 -0700
[omnibox] Add source param for omnibox and realbox navigations.
Adds chrome.ob and chrome.rb source params to search queries from the
realbox and omnibox.
Change-Id: I3c833294ef6f0be891265d615815f46e1bd530fc
Bug: 497828304
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7710442
Reviewed-by: Emilia Paz <emiliapaz@chromium.org>
Commit-Queue: Nihar Majmudar <niharm@google.com>
Reviewed-by: Moe Ahmadi <mahmadi@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1612307}
Resolves - simple cleanup issue.
We can set disable kIPHSideBySidePinnableFeature/kIPHSideBySideTabSwitchFeature as default state.
Don't need to suppress them in rumtime. All deleted and add state overriding to
chromium_src/components/feature_engagement/public/feature_constants.cc
It was added by #32937
* [NTP] Fix NTP favicon override not being applied
The previous chromium_src override of TabData::FromTabInterface was
broken: the #define FromTabInterface FromTabInterface_ChromiumImpl
pattern also renamed the internal call inside
TabDataObserver::OnTabUIChange, so that function always called
FromTabInterface_ChromiumImpl directly, bypassing the Brave override
entirely.
Fix by injecting two macro hooks into the upstream FromTabInterface
body instead of overriding the whole function:
* BRAVE_TAB_DATA_FROM_TAB_INTERFACE_SHARED_PINNED_EARLY_RETURN
- early return for shared pinned tab dummy contents
* BRAVE_TAB_DATA_FROM_TAB_INTERFACE_APPLY_OVERRIDES
- favicon theming override for NTP/Welcome/Rewards pages and
unloaded-tab discard status
This change also includes reverting https://github.com/brave/brave-core/pull/22852.
After applying FromTabInterface overriding, we found that
WebUIEmbeddingContextTest.InitEmbeddingContext_MovingTabsAcrossWindowsUpdatesContext
is failed. It was failed due to our should_show_discard_status flag overriding.
In this test, "browser" pointer is null at TabIcon::SetDisarded()
when this flag is on by our overriding.
That overriding is for showing unload ring when tab is gone by urgent discard.
But it doesn't work now. So just reverted.
See https://github.com/brave/brave-core/pull/22852 for more details.
[plaster] `PermissionContextBase` migration
The introduction of plasters for `PermissionContextBase` gets rid of a
lot of replacement cruft that was really difficult to make sense of.
This change also tweaks the interface for
`BraveCanBypassEmbeddingOriginCheck`, so it can make the plaster simpler
for this substitution too.
The core of this change is to move `PermissionContextBase` in upstream
into `chromium_impl::`, and derive our own implementatiom from that,
which simplifies a lot of the issues with naming replacement everywhere.
Resolves https://github.com/brave/brave-browser/issues/54952
* Gate Playlist UI on BravePlaylistEnabled policy
Complements #35732, which hides Playlist via the enable_playlist buildflag
in is_brave_origin_branded=true builds, by also hiding the Playlist UI in
is_brave_origin_branded=false builds when an administrator disables it
via the BravePlaylistEnabled policy (kPlaylistEnabledPref managed=false).
Adds playlist::IsPlaylistEnabled(prefs) / IsDisabledByPolicy(prefs)
helpers alongside existing features.h / pref_names.h, mirroring the iOS
PrefService.isPlaylistAvailable check and the ai_chat::IsAIChatEnabled
pattern. The helper is used to gate the sidebar item, side panel
coordinator and entry, browser action, playlist command, tab helper,
page action icon, and the chrome-untrusted://playlist WebUI.
The SidebarService now observes kPlaylistEnabledPref so the item appears
and disappears when policy changes at runtime.
User-driven pref toggles from settings keep their existing behaviour
(UI stays reachable so the user can flip the pref back); only a managed
pref forced off hides the UI.
Fixesbrave/brave-browser#50156
* Address review: move IsPlaylistAllowed out of common, simplify settings bools
- Relocate playlist::IsPlaylistEnabled from components/playlist/core/common
(which is reachable from any process) to a new components/playlist/core/browser
target, since the helper depends on PrefService (browser-only). Rename the
function to IsPlaylistAllowed to match its semantics (feature flag is enabled
and the pref is not policy-disabled), matching bridiver's suggestion that
"allowed" = managed+feature, "enabled" = user toggle.
- Update all callers and BUILD/DEPS wiring for the new location.
- In brave_settings_ui.cc, stop combining the feature flag and the user pref
into a single isPlaylistAllowed loadTimeData bool. Instead expose
isPlaylistFeatureEnabled and isPlaylistDisabledByPolicy (the Tor pattern),
and let settings page code consult the pref directly via the prefs mixin
when it needs the managed state. page_visibility.ts now computes playlist
visibility from the two building blocks.
Error message:
ERROR at //brave/test/BUILD.gn:518:7: Undefined identifier
if (enable_commander) {
^---------------
See //brave/BUILD.gn:79:34: which caused the file to be included.
brave_all_unit_tests_deps += [ "//brave/test:brave_unit_tests" ]
^------------------------------
Now it is NullableObservableSupplier, missed old change
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/416a61c418c152a7a7ae568d89302e5ecb6e4a3d
commit 416a61c418c152a7a7ae568d89302e5ecb6e4a3d
Author: Andrew Grieve <agrieve@chromium.org>
Date: Tue Dec 2 14:13:59 2025 -0800
Android: Split ObservableSupplier into Nullable / Monotonic / NonNull variants
The goal is to use proper @Nullable annotations with
ObservableSuppliers.
To achieve this, we use interfaces that define nullness:
* (Settable)NullableObservableSupplier
* (Settable)ObservableSupplier <-- monotonic
* (Settable)NonNullObservableSupplier
And we have ObservableSupplierImpl implement all of them.
In order to make this migration manageable, I've marked the interfaces
as @NullUnmarked, and will fix annotations in batches until they
can be marked @NullMarked.
This CL includes a batch in order to test out the new interfaces (and
because many were necessary to make the change).
Monotonic suppliers are by far the most common afaict, so that's why
the non-prefixed ObservableSupplier is the monotonic one (that, and
because "Monotonic" is a mouthful).
One implication of this approach is that we'll never have:
ObservableSupplier<@Nullable Foo>
We'd have instead:
NullableObservableSupplier<Foo>
Having the nullness in the interface rather than in the generic
allows for defining toNonNull() only on monotonic suppliers, and
simplifies the implementation.
Bug: 455874046
Change-Id: Id48e235b9ff16a5b21a9c1199863150d17c22736
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7206746
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1553094}
This affects how targets are added now, and a shadow file had to be
corrected.
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/bd7255bd8bf88581d34c38be1b16b05f7d5703b6
commit bd7255bd8bf88581d34c38be1b16b05f7d5703b6
Author: Vasilii Sukhanov <vasilii@chromium.org>
Date: Tue Mar 31 05:13:51 2026 -0700
Refactor: Move PasswordManagerSettingsServiceFactory to factories/
Moves password_manager_settings_service_factory.{h,cc} from
//chrome/browser/password_manager/ to
//chrome/browser/password_manager/factories/.
Eliminates the `password_factory_headers` source_set in
factories/BUILD.gn and wires everything cleanly to the unified
//chrome/browser/password_manager/factories target. All internal include
directives and BUILD.gn usages across webauthn, webid, autofill,
ui/passwords, and actor_login were adjusted properly.
Bug: 353332589
Change-Id: I318230d1df39b0b849a026977f00f2d3d0047831
Bypass-Check-License: moving the files
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7710837
Reviewed-by: Friedrich Hauser <friedrichh@chromium.org>
Commit-Queue: Vasilii Sukhanov <vasilii@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1607791}
Removed PREF_LOYALTY_CARDS from preferences.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/9d45f2f1f7f2f4e07a9ebf93be1873fd2bc34109
commit 9d45f2f1f7f2f4e07a9ebf93be1873fd2bc34109
Author: Norge Vizcay <vizcay@google.com>
Date: Fri Mar 13 07:52:52 2026 -0700
Remove kAutofillEnableLoyaltyCardsFilling feature flag
The AutofillEnableLoyaltyCardsFilling feature has been launched.
This CL removes the feature flag and all related code/tests that
were conditionally enabled by it. All loyalty card filling
functionality is now enabled by default.
Bug: 395831853
Test: CQ passes
Change-Id: I1a686fcdf1724138ade660229b54760d563f4d66
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7661784
Reviewed-by: Christoph Schwering <schwering@google.com>
Reviewed-by: Florian Leimgruber <fleimgruber@google.com>
Commit-Queue: Norge Vizcay <vizcay@google.com>
Cr-Commit-Position: refs/heads/main@{#1599049}
Seven new parameters added to TopToolbarCoordinator constructor after
MonotonicObservableSupplier<Profile>:
- SigninAndHistorySyncActivityLauncher
- WindowAndroid
- ActivityResultTracker
- DeviceLockActivityLauncher
- BottomSheetController
- ModalDialogManager
- SnackbarManager
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/c0e37322747db4f16956a53ff936c85905593c3b
commit c0e37322747db4f16956a53ff936c85905593c3b
Author: Sophie Crowley <crowleso@google.com>
Date: Wed Mar 11 10:30:11 2026 -0700
[Signin][Android] Add piping for Signin button onclick functionality
This will be immediately followed by its child CL
https://crrev.com/c/7604273 which uses all of these dependencies in
adding Seamless Signin + settings onclick functionality for this Signin
button. Split CL for ease of review. Adapted from
IdentityDiscController.java
Bug: 478828569
Change-Id: I600617b391ac061000998b1820ba573a57079e86
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7600378
Commit-Queue: Sophie Crowley <crowleso@google.com>
Reviewed-by: Liza Bipin <mlbipin@google.com>
Cr-Commit-Position: refs/heads/main@{#1597857}
Upstream removed `TabSearchContainer`, so we need to move our override of
`BraveTabSearchButton` to the class where `TabSearchButton` is constructed
now (`HorizontalTabvStripRegionView`)
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/d43a49df6f998a2e3828a410402cc46d41fae43a
commit d43a49df6f998a2e3828a410402cc46d41fae43a
Author: Emily Shack <emshack@chromium.org>
Date: Wed Mar 11 16:17:46 2026 -0700
[TabOrganization] Remove TabSearchContainer
Removes the auto tab groups nudge button, which in turn makes
TabSearchContainer obsolete. Replaces TabSearchContainer with a direct
reference to the tab search button itself.
Bug: 488463961
Change-Id: Ib1941ceabe6bccf6835c47561f9bff2a9d810bac
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7651705
Reviewed-by: Darryl James <dljames@chromium.org>
Commit-Queue: Emily Shack <emshack@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1598058}
Brave's canvas farbling (PerturbPixels) modifies getImageData() results,
breaking this test's canvas-based video playback detection. The test uses
canvas fingerprinting to detect video playback, which is incompatible
with Brave's privacy protections. The test only compiles on Linux
non-sanitizer builds per #if BUILDFLAG(IS_LINUX).
These filter entries were previously added (PRs #34531, #35267) but were
inadvertently removed by the automated filter pruning script in #35339.
Upstream stable: 640x480 0.6%, 3840x2160 0.3% flake rate (30-day LUCI).
Resolves https://github.com/brave/brave-browser/issues/54521
The test All/BrowsingDataRemoverBrowserTestP.
BrowserContextDestructionVsCookieRemoval/* has a known upstream race
condition (crbug.com/413259587) between document.cookie and the
backend SiteDataCountingHelper query via GetAllCookies(). The test
expects GetSiteDataCount() == 1 immediately after SetDataForType, but
the mojo IPC from the renderer to the network service cookie store
may not have completed. Already disabled on Windows upstream. Upstream
LUCI Analysis shows 0.5% flake rate over 30 days; amplified in
Brave's MSAN builds. Brave has no modifications to the affected code
path (first-party cookie set and count).
Resolves https://github.com/brave/brave-browser/issues/54638
This is an upstream Chromium test with a 3.7% flake rate (114k+ verdicts
over 30 days per Chromium LUCI Analysis). The /0 parameter variant
(OOPIF disabled) times out during QuitBrowsers in PostRunTestOnMainThread
teardown. The /1 variant (OOPIF enabled) is stable at 0.3%.
No Brave modifications exist in chrome/browser/save_to_drive/ — no
chromium_src overrides for this code area.
Resolves https://github.com/brave/brave-browser/issues/54240
Introduces enable_playlist (defaults to !is_brave_origin_branded),
following the same pattern as enable_brave_wallet and enable_ai_chat,
to gate all Playlist code from compilation on origin-branded desktop
builds. enable_playlist_webui now chains through enable_playlist.
Changes are scoped to desktop: iOS and Android don't support
is_brave_origin_branded=true (enforced by asserts in
//brave/components/brave_origin/buildflags/buildflags.gni), so they
have no guards.
Resolvesbrave/brave-browser#54736
Chromium renders a solid rounded-rect background when a page action chip expands
to show its label. Brave doesn't use this background, so override
GetBackgroundColor() in the chromium_src layer to return SK_ColorTRANSPARENT
instead of falling through to the Chromium color token.
Per-action overrides via PageActionController::OverrideChipColors() are still
respected — the override path is checked first and takes precedence over the
transparent default.
Also, don't use tonal color for PageActionView's bg/fg colors when expanded.
* Enable chromium semantic history search with our own embedder
* Replace history_embeddings patch with template override
Replace the trivial patch that commented out scored_url_rows.clear()
with a BraveHistoryEmbeddingsService template subclass (per
docs/gni_sources.md) that overrides OnPassageVisibilityCalculated to
always synthesize passing visibility scores (1.0), bypassing upstream's
PageContentAnnotationsService-based filtering which Brave doesn't use.
The template pattern avoids circular deps between
//brave/browser/history_embeddings and //chrome/browser:browser —
the template is instantiated at the factory site which already has
the required dep.
* Add unit tests for BraveHistoryEmbeddingsService
Run all upstream HistoryEmbeddingsService unit tests with the Brave
template subclass via chromium_src override, ensuring our visibility
bypass doesn't break any existing behavior. Add a Brave-specific test
verifying search results are preserved when the visibility model is
unavailable (upstream clears them).
* Add BraveEmbedder::Observer to notify when idle
Replace the JS-side connection tracking (boundCount /
notifyPassageEmbedderIdle) with a C++ observer pattern.
BravePassageEmbeddingsServiceController observes the embedder
and calls NotifyPassageEmbedderIdle via mojom when all jobs
complete, avoiding the renderer round-trip.
* Run LocalAIService BackgroundWebContents on guest OTR profile
The WASM embedding model doesn't need user profile data, so run
BackgroundWebContents on the guest OTR profile to isolate it from
user data.
- Make BackgroundWebContentsFactory async so it can call
CreateProfileAsync to obtain the guest OTR profile, then
construct BackgroundWebContentsImpl in the callback
- Inject the factory via SetBackgroundWebContentsFactory from
browser_context_keyed_service_factories.cc (which has
ProfileManager access) to avoid adding sources to sources.gni
- Add a static WebContents bind callback registry on
LocalAIServiceFactory so UntrustedLocalAIUI::BindInterface can
route mojo requests from the guest OTR WebContents back to the
owning LocalAIService without profile-based lookup
- Simplify BravePassageEmbeddingsServiceController to use a single
shared BraveEmbedder instead of per-profile map
* Add BravePassageEmbeddingsService in-process mojo impl
New BravePassageEmbeddingsService implements upstream
passage_embeddings::mojom::PassageEmbeddingsService in the browser
process. It hosts the guest-OTR BackgroundWebContents that runs the
WASM EmbeddingGemma renderer and owns the PassageEmbedderFactory
registration path (via local_ai::mojom::LocalAIService, which it also
implements so UntrustedLocalAIUI can route the renderer binding).
An internal BraveBatchPassageEmbedder translates upstream's batch
mojom (array<string> + priority) to the renderer's one-passage-at-a-
time interface, processing passages sequentially so callbacks resolve
with results in order.
Not yet wired to any caller — the follow-up commit switches
BravePassageEmbeddingsServiceController over to using this service
instead of the per-profile LocalAIService keyed service.
* Wire controller to launch in-process BravePassageEmbeddingsService
BravePassageEmbeddingsServiceController now mirrors
ChromePassageEmbeddingsServiceController: MaybeLaunchService()
constructs a BravePassageEmbeddingsService and binds the base class's
service_remote_ to it via an in-process mojo pipe; ResetServiceRemote()
tears it down. The constructor fires EmbedderMetadataUpdated once,
since our metadata is static (EmbeddingGemma version 1, 768-dim, 0.45)
and doesn't arrive through optimization_guide.
GetEmbeddings() override replaces the base class's file-loading flow —
we have no tflite/sentencepiece files to open — and calls
service_remote_->LoadModels() with default-constructed params
(BravePassageEmbeddingsService ignores them) before routing
GenerateEmbeddings to the bound embedder_remote_. Upstream's
SchedulingEmbedder drives the job queue end-to-end: priority re-sort
between passages, partial-progress resumption, and performance-scenario
awareness all come along for free.
The chromium_src include shim virtualizes EmbedderReady,
GetEmbedderMetadata, and GetEmbeddings via `#define X virtual X` so
the subclass can override them, and injects
`friend class BravePassageEmbeddingsServiceController` via an
EmbedderRunning macro anchor so the override can reach private
members (observer_list_ to fire the initial metadata notification,
embedder_remote_ to drive LoadModels without the upstream
model-info path).
PageEmbeddingsServiceFactory and HistoryEmbeddingsServiceFactory
overrides drop the GetBraveEmbedder(profile) hook; both now use the
base class's GetEmbedder() which returns the SchedulingEmbedder.
* Delete BraveEmbedder, LocalAIService keyed service, and orphan code
BravePassageEmbeddingsService now owns everything the old setup needed:
the background WebContents, the PassageEmbedderFactory registration,
and the static WebContents→bind-callback registry used by
UntrustedLocalAIUI::BindInterface. That removes the last reason to
keep the LocalAIService keyed service and its factory around.
Removed:
- brave_embedder.{h,cc,_unittest.cc} — replaced by upstream's
SchedulingEmbedder + BravePassageEmbeddingsService.
- local_ai_service.{h,cc,_unittest.cc} — merged into the new service.
- brave/browser/local_ai/ entirely — factory and bind registry
relocated to BravePassageEmbeddingsService static methods.
- LocalAIService keyed service registration from
browser_context_keyed_service_factories.cc.
- GetPassageEmbedder / NotifyPassageEmbedderIdle from local_ai.mojom;
those flows are now handled via the upstream PassageEmbeddingsService
mojom and the controller's service_remote_ idle handler.
UntrustedLocalAIUI now routes binds through
BravePassageEmbeddingsService::BindForWebContents. BUILD.gn and
sources.gni are adjusted accordingly.
* Use direct BindPassageEmbedder instead of mojo LoadModels
Upstream's mojom::PassageEmbeddingsService::LoadModels requires
non-null ReadOnlyFile fields for the tflite model and sentencepiece
tokenizer; mojo's serializer DCHECKs that they are physical files
(IsPhysicalFile), which rules out /dev/null or NUL as placeholders.
Since we don't have upstream's model files at all — our renderer
loads its own EmbeddingGemma — there's no way to satisfy that
contract on the caller side.
Keep BravePassageEmbeddingsService's mojom interface for completeness
but expose a direct C++ BindPassageEmbedder(receiver, callback) entry
point and have the controller call it directly. The service_remote_
inherited from the base class is left unbound, and the embedder_remote_
idle handler now fires ResetServiceRemote so the WASM renderer is torn
down on idle.
* Add unit tests for BravePassageEmbeddingsService
Covers the core flows: BindPassageEmbedder creating the background
contents, the barrier-closure that waits for both component-installed
model files and the renderer factory registration, the batch embedder
fanning out passages to the renderer one at a time, Init failure
tearing things down, renderer crash triggering close, and the static
WebContents→bind-callback registry used by UntrustedLocalAIUI.
Resolves https://github.com/brave/brave-browser/issues/54558
- Adds a brave_interactive_ui_tests test executable to brave/test/BUILD.gn mirroring Chromium's
interactive_ui_tests target. It reuses chrome/test/base/interactive_ui_tests_main.cc directly
to avoid divergence with upstream
- Converts MANUAL_HideClearsText and MANUAL_CanHideCommanderViaText from
commander_service_browsertest.cc into proper interactive UI tests in a new
brave/browser/ui/commander:interactive_ui_tests source set as a real example
Tests rewritten with InteractiveBrowserTest.
The new tests use RunTestSequence with PollState/WaitForState instead of timer-based polling,
which is the upstream-recommended pattern for async conditions in interactive UI tests
TEST=`npm run test brave_interactive_ui_tests -- --filter=CommanderServiceInteractiveUITest.*`
* [Android] Register Brave as Android AutofillService for address autofill
Re-enables the Android AutofillService that was removed in
https://github.com/brave/brave-core/pull/25759 due to crashes on
split-APK installs. Uses the SplitCompat pattern
(SplitCompatAutofillService base class) so the service works correctly
when installed from the Play Store.
When the user selects Brave as their autofill provider in Android Settings,
Brave can fill saved address profiles into third-party apps and save new
addresses from manually filled forms.
Resolves: https://github.com/brave/brave-browser/issues/41334
The kPdfInfoBar feature (enabled by default in Chromium) prompts users
to set Chrome as the default PDF viewer. Brave should not show this
Chrome-specific upsell.
* [AI Chat] Add kText file type and ProcessTextFile mojom interface
Add kText to UploadedFileType enum and ProcessTextFile method to
AIChatUIHandler for upcoming text file upload support. Include iOS
no-op implementation.
* [AI Chat] Add TextFileExtractor for text file upload
Add TextFileExtractor subclass of FileTextExtractorBase that extracts
text via document.body.innerText after loading the file in a hidden
WebContents. The renderer handles MIME sniffing and encoding detection.
* [AI Chat] Add text file type detection and unfiltered file picker
Treat all non-image/non-PDF files as text (kText), letting the
renderer handle MIME sniffing — matching how Chromium's
Browser::OpenFile works. Remove extension-based file picker filtering.
* [AI Chat] Integrate TextFileExtractor into page handler
Add ProcessTextFile mojo endpoint implementation and text extraction
in the file picker upload flow. Text files from the file picker are
extracted via TextFileExtractor after PDF extraction completes.
* [AI Chat] Add text file content blocks for LLM engine
Handle kText uploaded files in BuildOAIMessages by sending extracted
text as TextContentBlock with "[File: filename]" prefix, following
the same pattern as PDF text extraction.
* [AI Chat] Add frontend support for text file uploads
Accept all files in drag-and-drop and paste. Handle non-image/non-PDF
files as text via processTextFile mojo call. Treat kText as document
type for upload limits. Display text files with file icon.
* [AI Chat] Add unit tests for text file type detection
Update AcceptedFileExtensions test for unfiltered file picker.
Add tests for text file handling: known extension (.txt),
extensionless files, and unknown extensions (.diff).
* [AI Chat] Show alert when files cannot be read as text
Show an error alert via Leo AlertCenter when uploaded files are
dropped because the renderer could not extract text from them
(e.g. binary files, unsupported formats).
* [AI Chat] Move ExtractText overloads to FileTextExtractorBase
Both PdfTextExtractor and TextFileExtractor had identical
ExtractText implementations. Move both the file-path and
file-bytes overloads to the base class. PdfTextExtractor
keeps a convenience overload that passes "pdf" as extension.
* [AI Chat] Unify PDF and text file extraction into a single flow
Use one barrier callback and one extractors_ vector instead of
separate pdf_extractors_/text_extractors_ and chained extraction
passes. This removes duplicated scanning, barrier setup, and
per-file callback logic.
Disable UpdateMetricsProviderBrowserTest.RunInBackground in cross-platform filter
Move the test from browser_tests-windows.filter to browser_tests.filter so it
is disabled on all platforms (Linux, macOS, Windows). The upstream flake affects
any platform where a previous test subprocess exits uncleanly.
Resolvesbrave/brave-browser#54247
This upstream Chromium browser test intermittently fails in Brave
builds due to the same root cause as the already-disabled
PageStabilityMetricsMinWaitTest.NetworkAndMainThreadIdleDelayed:
Brave's cosmetic filters inject a MutationObserver and setInterval
(500ms) polling on all pages, generating continuous renderer tasks
that prevent the IdlenessDetector's 500ms quiet window from completing
before the 4-second page stability timeout fires.
The test expects kNetworkAndMainThread outcome (bucket 1) but gets
kTimeout (bucket 5) because NetworkBecameIdle is never signaled.
Upstream flake rate is 1% over 30 days per LUCI Analysis. Not
disabled upstream. Brave modifications exist in the actor directory
via chromium_src but do not affect page stability monitoring.
Resolves https://github.com/brave/brave-browser/issues/54205