Recent changes in upstream have changed the tabulation. Although this
has not caused any conflict when applying patches, this change updates
the plaster to better reflect the current desired patching.
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/39f1fc11de89a81d446d6ee520973294a4023254
commit 39f1fc11de89a81d446d6ee520973294a4023254
Author: Ian Wells <iwells@chromium.org>
Date: Tue Apr 7 09:48:58 2026 -0700
Add contextual cueing v2 page action
Contextual cueing v2 will show cues for a few different features, so
while the page action is registered with the other browser actions, its
icon, anchored message details and click handler aren't set until it's
time to show a cue for a specific feature.
Bug: 497231692
Change-Id: I641e13d43661806a64759018a837f6fe316bfaac
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7732046
Reviewed-by: Charlie Harrison <csharrison@chromium.org>
Reviewed-by: Sophie Chang <sophiechang@chromium.org>
Commit-Queue: Ian Wells <iwells@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1610829}
[cr150][plaster][android] Migrate `AUTOPLAY` patches
This PR migrates several java patches for `AUTOPLAY` to plaster. It uses
the same previous techniques, where we match the enum block and add at
the end.
The only innovation in this PR as an approach for plaster is the
replacement of the value `NUM_ENTRIES` with `+1` for whatever keys we
are inserting, while at the same time using the previous value of
`NUM_ENTRIES` as the starting value for the first key.
Resolved https://github.com/brave/brave-browser/issues/55385
This PR moves to `chromium_src` code that can live in there, and does
with no need for `#define` macro uses. This keeps plaster files shorter,
which reduces the noise in them, and it also permits C++ code to live
in C++ sources, that can benefit from code formatting, and DEPS
validation.
The use of `bool` for `DeviceInfo` fields has led to bugs in the past.
This has been correct with plaster, however we should also convert the
field to an enum to make sure we follow the upstream practice of using
enums in this type.
Resolves https://github.com/brave/brave-browser/issues/55018
This PR changes the way we are patching `RequestType` to not have to
rely on any particular key, but just introduce our keys at the end of
the enum value. This technique allows for the replacemnt of `kMaxValue
to use the new value we provide.
Removing these lines so we can introduce `count` value checks to steer
users towards fixed counts only when needed, and away from `count=0`. At
the moment removing these as they are redundant.
Minimize plaster related to PageActionController/Model
In order to make patching strategy more robust agains upstream chagnes,
we should prefer `chromium_src override without #define macro' to
'complex plaster'.
Co-authored-by: Claudio DeSouza <cdesouza@brave.com>
The window title format and captive portal title strings in
brave_origin_strings.grd were still showing "Brave" instead of
"Brave Origin", and the chrome.dll icon resources (used for the
per-window HICON via WM_SETICON) were hardcoded to the brave/
theme path with no IS_BRAVE_ORIGIN_BRANDED gating. The chrome.exe
icons (brave_exe.rc) were already correctly gated, which is why
shortcut/taskbar icons were correct but alt+tab was not.
- Add IDS_BROWSER_WINDOW_TITLE_FORMAT and
IDS_CAPTIVE_PORTAL_BROWSER_WINDOW_TITLE_FORMAT to
ORIGIN_BRANDED_MESSAGES in chromium-rebase-l10n.py so the
branding rewrite picks them up on every rebase.
- Update the currently-checked-in brave_origin_strings.grd to
apply the same branding now.
- Gate chrome/app/chrome_dll.rc icon resources on
IS_BRAVE_ORIGIN_BRANDED, mirroring brave/app/brave_exe.rc.
- Define IS_BRAVE_ORIGIN_BRANDED for the chrome_dll_resources
source_set when is_brave_origin_branded=true.
Follow-up to #35813 / brave-browser#54798. The previous PR removed the
WebUI feedback buttons on chrome://history and the side panel, but the
native Views omnibox still surfaced thumbs up/down on HISTORY_EMBEDDINGS
matches when the user typed `@history`
(brave-browser#55178).
- Plaster `OmniboxPopupSelection::IsControlPresentOnMatch` to inject a
short-circuit `if ((true)) return false;` immediately after the
FOCUSED_BUTTON_THUMBS_UP / FOCUSED_BUTTON_THUMBS_DOWN case labels.
Matching only the case labels (not the existing return expression)
keeps the plaster resilient if Chromium tweaks the body. With these
selections never available, OmniboxResultView::
UpdateFeedbackButtonsVisibility keeps the buttons hidden, keyboard
traversal skips them, and the feedback page is unreachable from the
omnibox.
- Combine the existing featured_search_provider.cc IDS swap with a
drop of the upstream `+ u" "` separator in a single substitution.
With the link text already swapped to IDS_BRAVE_EMPTY_STRING in
#35813, that separator left match.contents with a trailing space
that tripped the AutocompleteMatch::SanitizeString DCHECK in
AutocompleteResult::AppendMatches.
This PR rewrites our overrides relating to `DeviceInfo` specifically
into plaster. This involves dropping `BraveDeviceInfo` and implementing
the functionality in terms of extending `DeviceInfo`
Resolves https://github.com/brave/brave-browser/issues/55018
This PR migrates `CookieMonster` from macro replacements to be handled
by `plaster`. This is going to be specially useful in `cr149` where a
recent landed changed (https://crrev.com/c/7727488) would force the
introduction of patch files, and become very disruptive for how these
replacement macros work right now in general.
This PR attemps a novel approach to replicate the common pattern where
in Brave we want to replace a Chromium class with a derived Brave class:
the Chromium class is moved into a nested namespace called
`chromium_impl`, and the brave implementation is declared in its place
in a shadow file.
This has required additional plaster for types that absolutely have to
refer to the chromium implementation, but the outcome is much simpler
than the previous invisible replacements.
This change leaves no `#define` uses for replacement in the shadow
files.
Resolve https://github.com/brave/brave-browser/issues/54496
[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
This PR migrates all macros in `components/permissions/request_type.cc`
to plaster. The use of macros here particularly hid the fact that we
failed to override the correct functions, in particular the way we were
treating brave keys for `RequestTypeToContentSettingsType` and
`IsRequestablePermissionType` was incorrect as both these functions are
callers of `ContentSettingsTypeToRequestTypeIfExists`, and this fucntion
has been slipping through all this time.
Resolves https://github.com/brave/brave-browser/issues/54949
Used MultiInstanceOrchestratorImpl override.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
commit 1eff3e2dfcb821e6a6fbccae543632bb5ebbce98
Author: Aishwarya Rajesh <aishwaryarj@google.com>
Date: Wed Mar 18 15:32:23 2026 -0700
[MIR] Create MultiInstanceOrchestrator as a singleton to hold business
logic that is not scoped to a specific ChromeTabbedActivity
This CL attempts to simplify accessing multi-instance business logic
from callers that do not have access to a MultiInstanceManager instance
(for example, CCT context based feature implementations), by introducing
a MultiInstanceOrchestrator singleton implementation.
The CL only moves method moveTabsToWindowByIdChecked() as an initial
example for usage of this class. Other MultiInstanceManager API methods
that can be extracted into the singleton will be moved in followup CLs.
Bug: 491893859
Change-Id: I459a5ed79b058b548f42fd3c85f0b9382e756803
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7659642
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Commit-Queue: Aishwarya Rajesh <aishwaryarj@google.com>
Cr-Commit-Position: refs/heads/main@{#1601584}
Chromium changes:
https://chromium.googlesource.com/chromium/src/+/ba1bc87f5b13d8446edbd4d30013806bd4ce2d41
commit ba1bc87f5b13d8446edbd4d30013806bd4ce2d41
Author: Norge Vizcay <vizcay@google.com>
Date: Wed Mar 11 00:42:18 2026 -0700
Remove kSyncAutofillLoyaltyCard feature flag
The kSyncAutofillLoyaltyCard feature has been launched. This CL removes
the feature flag and its associated conditional logic, making the
syncing of loyalty cards from Google Wallet enabled by default.
Bug: b:393119606
Test: components_unittests --gtest_filter=ValuablesDataManagerTest.*
Test: sync_integration_tests --gtest_filter=SingleClientValuablesSyncTest.*
Test: unit_tests --gtest_filter=SyncServiceFactoryTest.*
Change-Id: I63f09797a9cab0c28edb0f0439c7d1ef130e4fbb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7654135
Commit-Queue: Norge Vizcay <vizcay@google.com>
Reviewed-by: Marc Treib <treib@chromium.org>
Reviewed-by: Etienne Bergeron <etienneb@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1597558}
* [Android] Fixed containment at settings
Resolves https://github.com/brave/brave-browser/issues/54164
* Fixed containment for the Homepage settings screen
* Fixed containment for WebRTC policy screen
* Fixed containment at Languages settings; modified SettingsUtils.getVisiblePreferences
* Fixed privacy item
* Fixed containment for NFT discovery learn more preference
Replaced TextMessagePreference (BackgroundStyle.NONE, transparent) with
ChromeBasePreference so the NFT description groups with the Enable NFT
discovery toggle in one card. Follows the same camera OS-warning pattern:
ForegroundColorSpan for the link color, setOnPreferenceClickListener for
the tap action, matching Chromium upstream conventions.
* Moved NFT discovery block before Reset wallet preference
Enable NFT discovery toggle and its description now appear above
"Reset and clear wallet data", matching the intended UX order.
* Fixed containment for Brave Firewall + VPN settings
Set initial visibility of server_change_location in onCreatePreferences
to avoid animated removal artifact. Call notifyPreferencesUpdated() after
dynamic visibility changes in updateSummaries so containment styles stay
in sync with adapter positions.
* Fixed containment for New Tab Page settings learn more
Replaced ClickableSpansTextMessagePreference with ChromeBasePreference
for the sponsored images learn more link so it groups into the
Background Images card with the toggles above it.
* Removed On/Off captions from New Tab Page switch prefs
* [History Embeddings] Hide UI entry points that imply a cloud round-trip
Strip the pieces that either ask the user for feedback we don't send
anywhere or link to a settings page we don't expose:
- cr-feedback-buttons (thumbs up/down) in the history embeddings
results card — no telemetry for an on-device feature.
- "Learn more" link in the chrome://history disclaimer and in the
history side panel — both pointed at historyEmbeddingsSettingsUrl.
- "Manage your history search setting" link in the IPH promo.
- "Learn more" link in the omnibox history embeddings disclaimer
IPH row — pass empty link_text/GURL() so the disclaimer still
renders without a link.
Part of https://github.com/brave/brave-browser/issues/54798
* [History Embeddings] Reword disclaimer and hide chrome://settings/ai
Brave's history semantic search runs entirely on-device (see
brave/browser/history_embeddings/README.md), so:
- IDS_HISTORY_EMBEDDINGS_DISCLAIMER{,_LOGGING_OFF} and
IDS_OMNIBOX_HISTORY_EMBEDDINGS_DISCLAIMER_IPH text about data being
sent to Brave and seen by human reviewers is inaccurate. Add
IDS_BRAVE_HISTORY_EMBEDDINGS_DISCLAIMER (in brave_generated_resources)
and IDS_BRAVE_OMNIBOX_HISTORY_EMBEDDINGS_DISCLAIMER_IPH (in
brave_components_strings) and swap the IDS in the chromium_src
overrides for history_embeddings_utils.cc and
featured_search_provider.cc. Owning the strings outright is resilient
to upstream wording tweaks. Neither override requires a new GN dep:
brave/grit/brave_generated_resources.h is reachable via the existing
//chrome/app:generated_resources transitive dep, and
components/grit/brave_components_strings.h via the existing
brave_components_omnibox_browser_deps injection.
- Force IsHistoryEmbeddingsSettingVisible() to false so the
chrome://settings/ai/historySearch entry — and, transitively, the
whole AI settings page and menu entry — drops out. Brave has no
user-facing toggle for this feature.
Part of https://github.com/brave/brave-browser/issues/54798
This class has a few customisations that were awkward with macro
replacements and therefore the derived function. With plaster though, we
can just add a `ChromiumImpl` variant of a function, and then only
replace the declartion in the translation unit, which makes a lot of the
complexity present go away.
This change drops the derived class for `DownloadToolbarUIController`,
and just adds a call to our custom function at the end of the relevant
function updating the icon appearance.
This particular class was running into problems in M149
(https://crrev.com/c/7766617).
Resolves https://github.com/brave/brave-browser/issues/54814
Activate PageActionIconView for Partitioned Storage on right click
As requested by the design team, we activate the PageActionIconView for the
Partitioned Storage on right click.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/c9b45eb2b1609b62a2146b618f57aee136c7745e
commit c9b45eb2b1609b62a2146b618f57aee136c7745e
Author: Baran Erfani <baranerf@google.com>
Date: Wed Feb 18 13:55:51 2026 -0800
Add a new page action for Indigo
This change introduces a UI entry point for Indigo by adding a new page
action and its corresponding controller. The main changes are:
- Introduce `kActionIndigo` chrome action along with the necessary set-up to add it as a page action following the instruction in chrome/browser/ui/views/page_action/README.md.
- Add `IndigoPageActionController` to handle and encapsulate all the logic related to showing/hiding the entry points.
- Add `kIndigo` feature flag disabled by default.
http://screencast/cast/NTkxMTQ2NTkwNjE0MzIzMnw2MWUwZDVlNy1kNA
Bug: b:483103108
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/2b7ab5aadfb26be57df25485c776474b16f16fce
commit 2b7ab5aadfb26be57df25485c776474b16f16fce
Author: Helmut Januschka <helmut@januschka.com>
Date: Wed Feb 25 12:46:26 2026 -0800
[PageActions] Defer reentrant model notifications in PageActionModel
Replace the CHECK in NotifyChange with a deferred-notification loop so
that reentrant calls are coalesced instead of crashing.
Bug: 486080128
* Customize page action view for Partitioned storage
* Set fixed height for partitioned storage page action view.
* Center the view in the container when the height is set.
* Ensure the label is always shown when the height is set.
* Use gfx::TruncateString to truncate the name of the partitioned storage page action
Resolves https://github.com/brave/brave-browser/issues/53813
This is cr146 regression
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/aa3361c165e11f04d6cfbbadb6986d502a7f0e28
commit aa3361c165e11f04d6cfbbadb6986d502a7f0e28
Author: Samuel Huang <huangs@chromium.org>
Date: Wed Jan 21 11:41:57 2026 -0800
[Android NTP] Limit the number of MVT tiles to 8.
Previously, the Android MVT could show up to 12 tiles in total. Custom
Tiles (CT) had priority (up to 8), and Top Sites Tiles (TST) would fill
the remaining slots up to the total limit of 12.
Per UI guideline, this CL reduces the total limit from 12 to 8. Note
that CTs continue to have priority, so if a user has 8 CTs then they
don't see TSTs any more.
This is an opportunity for backend optimization:
* If 8 CTs exist then we can simply skip TST computation -- but this
would be an abrupt transition
* If 1-7 CTs exist then we can partially skip TST computation -- but
this requires more refactoring.
However, for simplicity, we skip these for now.
Bug: 477017208
Change-Id: Ie2251764b36d76c453985fbf22d101cb1354d637
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7495331
Commit-Queue: Samuel Huang <huangs@chromium.org>
Reviewed-by: Calder Kitagawa <ckitagawa@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1572479}
brave:// should be converted to chrome:// as early as possible so all internal checks for chrome:// are valid. You can still open brave:// urls and they should display as brave:// urls, but internally both the actual url and virtual url should be chrome://
* Support contained tabs session restore and sync.
* Review fixes.
* Use struct as a return value instead of optional with out args.
* Add a unit test for view-source: scheme.
* Move TabRestore helper to components.
* Add containers-specific SerializedNavigationBuilder* tests.
* Guard PageState.top.url_string use.
* Add plaster files for few patches.
* Replace browser_tabrestore.cc #define patch with plaster rewrite.
* Replace content_serialized_navigation_builder.cc change with rewrite.
* Fix gn check.
* Add prefix_length check.
* Improve rewrite rules.
* Guard PageState changes with buildflag.
* Rename StoragePartitionKeyToUrlPrefix.
* Add buildflag check into SerializedNavigationEntry.
* Fix build issues with containers buildflag disabled.
* Fix iOS build.
* Show PageActionView for partitioned storage tab in location bar
When the current tab uses a Brave container (partitioned storage), show the
page action in the location bar with the container's icon, name, and
background color from ContainerModel.
- Register kPartitionedStorageActionIconType and enable it in the location
bar only when ENABLE_CONTAINERS and the Containers feature are on.
- Add PartitionedStoragePageActionController that resolves the tab's
container via GetContainerIdForWebContents and ContainerModel, and drives
the generic PageActionView (Show/Hide, OverrideImage/Text, etc.); the
action is hidden when the tab has no container.
* Extend PageAction framework to support partitioned storage tab in location bar
This commit extends the PageAction framework to support:
* Override chip colors
* Always show label
Had to use direct patch because there are two `isInSingleUrlBarMode`
methods at `NewTabPage` class. Bytecode patch caused java.lang.VerifyError
crash.
This change is intended to make `ToolbarPhone` always use
`mLocationBarBackground` instead of `mNtpFakeboxBackground.
Otherwise url bar on NTP has orange color and too rounded corners.
Chromium change:
https://source.chromium.org/chromium/chromium/src/+/d23864706c014549e1f1333face1ece0046c52bd
[ParityV2] Clean up OmniboxMobileParityUpdateV2 on Android (Part 1).
Clean up feature flag OMNIBOX_MOBILE_PARITY_UPDATE_V2 and feature
param "retrieve_builtin_favicon" on Android.
Bug: 426594110
Change-Id: I705823eb0dbd34b0e1187dfde3b20f12c4b78fa7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7523327
We don't need to push the toolbar aside when Brave vertical tabs are
enabled. This is because Brave shows the window captions atop of the
toolbar or, overlays the caption on the toolbar. In order to do this,
mark needs_exclusion as false when Brave vertical tabs are enabled.
And then exclude tab strip height when calculating the non client
frame height.
This commit also includes a patch to correctly calculate the client area
on Mac when Brave vertical tabs are enabled and should show window title
* Add level and height calculation for TreeTabNode
TreeTabNode now maintains level and height for the tree-tabs hierarchy,
so UI and layout can use depth and subtree size without traversing.
- Level: depth in the tree. Root is 0; each child has parent level + 1.
- Height: depth of the subtree rooted at this node. A leaf has height 0.
Non–tree-node children (e.g. TabGroup, SplitTabCollection) count as 1;
tree-node children contribute (child height + 1). Node height is the
max over all children.
- GetTreeHeight(): returns the root’s height (total tree depth), by
walking up to the top-level ancestor.
Recalculation is done:
- On reparent: the moved node (and its subtree) recalculates level and
height via CalculateLevelAndHeightRecursively in OnReparented.
- When a tree-node child’s height changes: the parent’s height is
updated via OnChildHeightChanged (only tree-node children trigger
this; adding/removing non–tree-node children does not).
* Always set dragged tabs as visible in vertical tabs mode
We don't have to hide them
* Fix vertical tab strip drag-and-drop by using BraveTabDragController
TabStrip was instantiating Chromium's TabDragController instead of
Brave's BraveTabDragController. That bypassed Brave-specific drag logic
and broke vertical tab strip drag-and-drop (insertion index, bounds,
detach/attach, etc.).
In tabstrip.cc, std::make_unique<TabDragController>() was replaced with
std::make_unique<TabDragControllerChromium>(), so Brave-sepcific logic
was bypassed.
This change restores the intended controller hierarchy and makes
overriding straightforward:
- TabStripController (Chromium) remains the base; Brave extends it as
BraveTabStripController.
- TabStrip's drag context now creates BraveTabDragController instead of
TabDragController explicitly
Implementation approach:
- Prefer patching over complex overrides: TabDragController::Init()
was not virtualized, why we chose to renaming TabDragController to
TabDragControllerChromium and name ours TabDragController. But this
made it difficult to find which implementation is actually used.
- In tab_strip.cc patch: use BraveTabDragController for drag_controller_
to instantiate BraveTabDragController instead of TabDragController.
We should not create a new instance of BraveTabStyle every time
TabStyle::Get() is called.
In order to fix this, we use plaster patch to replace new TabStyle()
with new BraveTabStyle().
This commit adds a new user preference that allows users to disable the
middle-click-to-close tab functionality, addressing user feedback that
accidental middle-clicks can cause unwanted tab closures.
Changes include:
**Browser Preferences:**
- Add kTabsCloseOnMiddleClick pref (default: true) in brave_tab_prefs.h
- Register preference in brave_prefs_util.cc for settings UI exposure
**UI Implementation:**
- Extend TabSlotController interface with CanCloseTabViaMiddleButtonClick()
- Implement pref checking in BraveTabStrip via base class override
- Override TabSlotController methods in tab_strip.h/cc to respect preference
- Add chromium_src overrides for FakeTabSlotController and FakeBaseTabStripController
to support testing infrastructure
**Tab Click Handling:**
- Patch tab.cc to check controller preference before handling middle clicks
- Use plaster.toml rewrite for cleaner code transformation
- Maintain existing behavior when preference is enabled (default)
**Settings UI:**
- Add "Close tabs on middle click" toggle to Appearance > Tabs settings
- Include localized strings in brave_settings_strings.grdp
The core infrastructure for vertical tabs has been removed from upstream
* Split tab - CompoundTabContainer which contains pinned contrainer and
unpinned container separately is removed.
* Scrollable tab strip support was removed - TabStripScrollContainer was
removed.
This PR temporarily make Brave buildable and disables vertical tab strip
support
As CompoundTabContainer is gone, rework BraveTabContainer to handle both
pinned and unpinned tabs.
Previously, we had CompoundTabContainer which contains two TabContainers
, one for pinned tabs and the other for unpinned tabs. And TabContainer
for unpinned tabs had a ScrollView to allow scrolling when there are
many unpinned tabs.
But now, as CompoundTabContainer is removed, we need to handle both pinned
and unpinned tabs in BraveTabContainer. Plus, we should support scrolling
feature for unpinned tabs.
But adding scroll view to BraveTabContainer causes various issues as
it manipulates view hierarachy, which upstream code is not aware of.
As a result, it'd require many changes from our side to make it work.
So instead of adding scroll view, we directly handle scrolling logic
inside BraveTabContainer. BraveTabContainer calculates visable area
for unpinned tabs and sets clip rect accordingly. It also handles scroll
events and update unpinned tabs position based on the offset.
* Force context menu on Shift + Right Click on elements in pages
This PR introduces a feature that allows users to open the context menu
even if `event.preventDefault()` is called on the `contextmenu` event
when the Shift key is pressed.
This is particularly useful for users who want to access the context
menu on web pages that disable it through JavaScript.
This is achieved by bypassing the `preventDefault` check for
`contextmenu` events when the Shift key is detected as being pressed in
the "EventDispatcher" so that Node's `DefaultEventHandler` is called.
* Exclude rewrite from license checks
* Don't expand collapsed group when dragging it
Expanding a group full of tabs at the beginning of a drag operation
is disruptive. This change prevents that behavior.
* Add pref to always hide tab close button
Some users prefer a cleaner tab appearance without close buttons, as
they close tabs using other methods (e.g., middle-click, shortcuts).
So close button could be no more than a visual distraction or accidental
click.
This commit introduces a new preference that allows users to always hide
the tab close button.
* Introduce ControllableCloseButtonState
This is a sort of decorator class that wraps bool showing_close_button_
so that we can consider additional factors when determining whether to show
the close button, such as whether the mouse is hovering over the tab,
or whether the controller wants to always hide the close button.
This change adds a 🩹 for the patching we do in `chrome/app/BUILD.gn`.
The output is the same as the patch we already have in place, so nothing
changes there. This particular plaster is meant to be flexible, so to
not break by the lines around changing. It is designed to add the line
just at the end of the block, regardless of what may have changed around
it.
```
grit_strings("generated_resources") {
...
...
...
deps = [ "//brave/app:brave_generated_resources_grit" ]
}
```
Resolves https://github.com/brave/brave-browser/issues/47088