diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 7b87519afbc..0c74a19970c 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -90,6 +90,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsBottomSheetDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/brave_stats/BraveStatsUtil.java", "../../brave/android/java/org/chromium/chrome/browser/component_updater/BraveComponentUpdater.java", + "../../brave/android/java/org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator.java", "../../brave/android/java/org/chromium/chrome/browser/crash/BravePureJavaExceptionReporter.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/AssetRatioServiceFactory.java", "../../brave/android/java/org/chromium/chrome/browser/crypto_wallet/BlockchainRegistryFactory.java", @@ -384,6 +385,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/shields/BraveShieldsUtils.java", "../../brave/android/java/org/chromium/chrome/browser/shields/CookieListOptInServiceFactory.java", "../../brave/android/java/org/chromium/chrome/browser/shields/FilterListServiceFactory.java", + "../../brave/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java", "../../brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java", "../../brave/android/java/org/chromium/chrome/browser/site_settings/BraveSiteSettingsDelegate.java", "../../brave/android/java/org/chromium/chrome/browser/site_settings/BraveWalletEthereumConnectedSites.java", diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags index 34f4293635d..8ee63927551 100644 --- a/android/java/apk_for_test.flags +++ b/android/java/apk_for_test.flags @@ -551,6 +551,17 @@ public (...); } + +-keep class org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator { + *** onItemSelected(...); + public (...); +} + +-keep class org.chromium.chrome.browser.contextmenu.BraveChromeContextMenuPopulator { + public (...); +} + + -keep class org.chromium.chrome.browser.omnibox.LocationBarCoordinator { *** mLocationBarMediator; public (...); diff --git a/android/java/org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator.java b/android/java/org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator.java new file mode 100644 index 00000000000..eb71290ea63 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator.java @@ -0,0 +1,53 @@ +/* Copyright (c) 2023 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/. */ + +package org.chromium.chrome.browser.contextmenu; + +import android.content.Context; + +import org.chromium.base.supplier.Supplier; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.share.ShareDelegate; +import org.chromium.chrome.browser.shields.UrlSanitizerServiceFactory; +import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; +import org.chromium.components.externalauth.ExternalAuthUtils; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.system.MojoException; +import org.chromium.url_sanitizer.mojom.UrlSanitizerService; + +public class BraveChromeContextMenuPopulator + extends ChromeContextMenuPopulator implements ConnectionErrorHandler { + private final ContextMenuItemDelegate mItemDelegate; + private final ContextMenuParams mParams; + + public BraveChromeContextMenuPopulator(ContextMenuItemDelegate itemDelegate, + Supplier shareDelegate, @ContextMenuMode int mode, + ExternalAuthUtils externalAuthUtils, Context context, ContextMenuParams params, + ContextMenuNativeDelegate nativeDelegate) { + super(itemDelegate, shareDelegate, mode, externalAuthUtils, context, params, + nativeDelegate); + + mItemDelegate = itemDelegate; + mParams = params; + } + + @Override + public boolean onItemSelected(int itemId) { + if (itemId == R.id.contextmenu_copy_clean_link) { + UrlSanitizerService urlSanitizerService = + UrlSanitizerServiceFactory.getInstance().getUrlSanitizerAndroidService(this); + urlSanitizerService.sanitizeUrl(mParams.getUnfilteredLinkUrl().getSpec(), result -> { + mItemDelegate.onSaveToClipboard( + result, ContextMenuItemDelegate.ClipboardType.LINK_URL); + }); + + } else { + super.onItemSelected(itemId); + } + return true; + } + @Override + public void onConnectionError(MojoException e) {} +} diff --git a/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java b/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java new file mode 100644 index 00000000000..db8b1d6344c --- /dev/null +++ b/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java @@ -0,0 +1,63 @@ +/* Copyright (c) 2023 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/. */ + +package org.chromium.chrome.browser.shields; + +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.crypto_wallet.util.Utils; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.bindings.Interface; +import org.chromium.mojo.bindings.Interface.Proxy.Handler; +import org.chromium.mojo.system.MessagePipeHandle; +import org.chromium.mojo.system.impl.CoreImpl; +import org.chromium.url_sanitizer.mojom.UrlSanitizerService; + +@JNINamespace("chrome::android") +public class UrlSanitizerServiceFactory { + private static final Object lock = new Object(); + private static UrlSanitizerServiceFactory instance; + + public static UrlSanitizerServiceFactory getInstance() { + synchronized (lock) { + if (instance == null) { + instance = new UrlSanitizerServiceFactory(); + } + } + return instance; + } + + private UrlSanitizerServiceFactory() {} + + public UrlSanitizerService getUrlSanitizerAndroidService( + ConnectionErrorHandler connectionErrorHandler) { + Profile profile = Utils.getProfile(false); // Always use regular profile + if (profile == null) { + return null; + } + long nativeHandle = + UrlSanitizerServiceFactoryJni.get().getInterfaceToUrlSanitizerService(profile); + if (nativeHandle == -1) { + return null; + } + MessagePipeHandle handle = wrapNativeHandle(nativeHandle); + UrlSanitizerService urlSanitizerServiceAndroid = + UrlSanitizerService.MANAGER.attachProxy(handle, 0); + Handler handler = ((Interface.Proxy) urlSanitizerServiceAndroid).getProxyHandler(); + handler.setErrorHandler(connectionErrorHandler); + + return urlSanitizerServiceAndroid; + } + + private MessagePipeHandle wrapNativeHandle(long nativeHandle) { + return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle(); + } + + @NativeMethods + interface Natives { + long getInterfaceToUrlSanitizerService(Profile profile); + } +} diff --git a/android/java/res/values/brave_ids.xml b/android/java/res/values/brave_ids.xml index 8a61952a8b7..563680fcfbc 100644 --- a/android/java/res/values/brave_ids.xml +++ b/android/java/res/values/brave_ids.xml @@ -21,4 +21,5 @@ + diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index 51dc302ba35..1771df49eff 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -44,6 +44,8 @@ import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate; import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.contextmenu.ContextMenuItemDelegate; +import org.chromium.chrome.browser.contextmenu.ContextMenuNativeDelegate; import org.chromium.chrome.browser.feed.FeedActionDelegate; import org.chromium.chrome.browser.feed.FeedSurfaceCoordinator; import org.chromium.chrome.browser.feed.SnapScrollHelper; @@ -122,7 +124,9 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListL import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar.SearchDelegate; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.components.commerce.core.ShoppingService; +import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; import org.chromium.components.external_intents.ExternalNavigationDelegate; +import org.chromium.components.externalauth.ExternalAuthUtils; import org.chromium.components.favicon.LargeIconBridge; import org.chromium.components.omnibox.action.OmniboxActionDelegate; import org.chromium.components.permissions.PermissionDialogController; @@ -346,6 +350,10 @@ public class BytecodeTest { classExists("org/chromium/components/external_intents/ExternalNavigationHandler")); Assert.assertTrue(classExists( "org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler")); + Assert.assertTrue( + classExists("org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator")); + Assert.assertTrue(classExists( + "org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator")); } @Test @@ -507,6 +515,9 @@ public class BytecodeTest { Assert.assertTrue( methodExists("org/chromium/chrome/browser/preferences/ChromePreferenceKeyChecker", "getInstance", false, null)); + Assert.assertTrue( + methodExists("org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator", + "onItemSelected", true, boolean.class, int.class)); } @Test @@ -832,6 +843,11 @@ public class BytecodeTest { "org/chromium/components/external_intents/ExternalNavigationHandler", "org/chromium/chrome/browser/externalnav/BraveExternalNavigationHandler", ExternalNavigationDelegate.class)); + Assert.assertTrue(constructorsMatch( + "org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator", + "org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator", + ContextMenuItemDelegate.class, Supplier.class, int.class, ExternalAuthUtils.class, + Context.class, ContextMenuParams.class, ContextMenuNativeDelegate.class)); } @Test diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 5b7ccf760bb..bdd2e48853e 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -146,6 +146,9 @@ This file contains all "about" strings. It is set to NOT be translated, in tran Manage ads + + Copy clean link + This reflects your estimated earnings range for Brave Ads this month. diff --git a/browser/url_sanitizer/android/url_sanitizer_service_factory_android.cc b/browser/url_sanitizer/android/url_sanitizer_service_factory_android.cc new file mode 100644 index 00000000000..929b235d3b9 --- /dev/null +++ b/browser/url_sanitizer/android/url_sanitizer_service_factory_android.cc @@ -0,0 +1,30 @@ +/* Copyright (c) 2023 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 "base/android/jni_android.h" +#include "brave/browser/url_sanitizer/url_sanitizer_service_factory.h" +#include "brave/build/android/jni_headers/UrlSanitizerServiceFactory_jni.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_android.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +namespace chrome { +namespace android { +static jlong JNI_UrlSanitizerServiceFactory_GetInterfaceToUrlSanitizerService( + JNIEnv* env, + const base::android::JavaParamRef& profile_android) { + auto* profile = ProfileAndroid::FromProfileAndroid(profile_android); + if (profile == nullptr) { + return static_cast(-1); + } + + auto pending = + brave::URLSanitizerServiceFactory::GetInstance()->GetForContext(profile); + + return static_cast(pending.PassPipe().release().value()); +} + +} // namespace android +} // namespace chrome diff --git a/browser/url_sanitizer/sources.gni b/browser/url_sanitizer/sources.gni index 6b2c4084fc9..cb952d0d7bd 100644 --- a/browser/url_sanitizer/sources.gni +++ b/browser/url_sanitizer/sources.gni @@ -8,3 +8,12 @@ brave_browser_url_sanitizer_deps = [ "//brave/components/url_sanitizer/browser", "//components/keyed_service/content", ] + +if (is_android) { + brave_browser_url_sanitizer_sources += [ "//brave/browser/url_sanitizer/android/url_sanitizer_service_factory_android.cc" ] + + brave_browser_url_sanitizer_deps += [ + "//brave/build/android:jni_headers", + "//mojo/public/cpp/bindings", + ] +} diff --git a/browser/url_sanitizer/url_sanitizer_service_factory.cc b/browser/url_sanitizer/url_sanitizer_service_factory.cc index d4dfdb09e65..3c9610a27f8 100644 --- a/browser/url_sanitizer/url_sanitizer_service_factory.cc +++ b/browser/url_sanitizer/url_sanitizer_service_factory.cc @@ -31,6 +31,14 @@ URLSanitizerService* URLSanitizerServiceFactory::GetForBrowserContext( GetInstance()->GetServiceForBrowserContext(context, true)); } +// static +mojo::PendingRemote +URLSanitizerServiceFactory::GetForContext(content::BrowserContext* context) { + return static_cast( + GetInstance()->GetServiceForBrowserContext(context, true)) + ->MakeRemote(); +} + URLSanitizerServiceFactory::URLSanitizerServiceFactory() : BrowserContextKeyedServiceFactory( "URLSanitizerService", diff --git a/browser/url_sanitizer/url_sanitizer_service_factory.h b/browser/url_sanitizer/url_sanitizer_service_factory.h index e1e38f69177..ef6612e7709 100644 --- a/browser/url_sanitizer/url_sanitizer_service_factory.h +++ b/browser/url_sanitizer/url_sanitizer_service_factory.h @@ -6,7 +6,9 @@ #ifndef BRAVE_BROWSER_URL_SANITIZER_URL_SANITIZER_SERVICE_FACTORY_H_ #define BRAVE_BROWSER_URL_SANITIZER_URL_SANITIZER_SERVICE_FACTORY_H_ +#include "brave/components/url_sanitizer/common/mojom/url_sanitizer.mojom.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" +#include "mojo/public/cpp/bindings/pending_remote.h" namespace base { template @@ -21,6 +23,8 @@ class URLSanitizerServiceFactory : public BrowserContextKeyedServiceFactory { public: static URLSanitizerService* GetForBrowserContext( content::BrowserContext* context); + static mojo::PendingRemote + GetForContext(content::BrowserContext* context); static URLSanitizerServiceFactory* GetInstance(); private: diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index cc252dcbaef..c6931f58736 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn @@ -236,6 +236,7 @@ generate_jni("jni_headers") { "//brave/android/java/org/chromium/chrome/browser/settings/developer/BraveQAPreferences.java", "//brave/android/java/org/chromium/chrome/browser/shields/CookieListOptInServiceFactory.java", "//brave/android/java/org/chromium/chrome/browser/shields/FilterListServiceFactory.java", + "//brave/android/java/org/chromium/chrome/browser/shields/UrlSanitizerServiceFactory.java", "//brave/android/java/org/chromium/chrome/browser/signin/BraveSigninManager.java", "//brave/android/java/org/chromium/chrome/browser/speedreader/BraveSpeedReaderUtils.java", "//brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java", diff --git a/build/android/bytecode/BUILD.gn b/build/android/bytecode/BUILD.gn index 9f3859e87be..a835cc6b51e 100644 --- a/build/android/bytecode/BUILD.gn +++ b/build/android/bytecode/BUILD.gn @@ -29,6 +29,7 @@ java_binary("java_bytecode_rewriter") { "//brave/build/android/bytecode/java/org/brave/bytecode/BraveBottomControlsCoordinatorClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveBottomControlsMediatorClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveCachedFlagClassAdapter.java", + "//brave/build/android/bytecode/java/org/brave/bytecode/BraveChromeContextMenuPopulatorAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveCommandLineInitUtilClassAdapter.java", diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveChromeContextMenuPopulatorAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveChromeContextMenuPopulatorAdapter.java new file mode 100644 index 00000000000..0daebb4eaa2 --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveChromeContextMenuPopulatorAdapter.java @@ -0,0 +1,19 @@ +/* Copyright (c) 2023 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/. */ + +package org.brave.bytecode; + +import org.objectweb.asm.ClassVisitor; + +public class BraveChromeContextMenuPopulatorAdapter extends BraveClassVisitor { + static String sContoller = "org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator"; + static String sBraveContoller = + "org/chromium/chrome/browser/contextmenu/BraveChromeContextMenuPopulator"; + + public BraveChromeContextMenuPopulatorAdapter(ClassVisitor visitor) { + super(visitor); + redirectConstructor(sContoller, sBraveContoller); + } +} diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index 9cfeb91415a..99f7c9c3fa8 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -29,6 +29,7 @@ public class BraveClassAdapter { chain = new BraveBottomControlsCoordinatorClassAdapter(chain); chain = new BraveBottomControlsMediatorClassAdapter(chain); chain = new BraveCachedFlagClassAdapter(chain); + chain = new BraveChromeContextMenuPopulatorAdapter(chain); chain = new BraveCommandLineInitUtilClassAdapter(chain); chain = new BraveContentSettingsResourcesClassAdapter(chain); chain = new BraveCustomizationProviderDelegateImplClassAdapter(chain); diff --git a/build/android/config.gni b/build/android/config.gni index 2bc34fc9833..03dac8f1727 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -37,6 +37,7 @@ brave_chrome_java_deps = [ "//brave/components/misc_metrics/common:mojom_java", "//brave/components/playlist/common/mojom:mojom_java", "//brave/components/safe_browsing/android:brave_safe_browsing_java", + "//brave/components/url_sanitizer/common/mojom:mojom_java", "//brave/components/variations/android:java", "//brave/third_party/android_deps:com_airbnb_android_java", "//brave/third_party/android_deps:com_android_billingclient_java", diff --git a/components/url_sanitizer/browser/BUILD.gn b/components/url_sanitizer/browser/BUILD.gn index f5c3a7be56d..4472f6a53a1 100644 --- a/components/url_sanitizer/browser/BUILD.gn +++ b/components/url_sanitizer/browser/BUILD.gn @@ -10,6 +10,7 @@ source_set("browser") { "url_sanitizer_service.cc", "url_sanitizer_service.h", ] + public_deps = [ "//brave/components/url_sanitizer/common/mojom" ] deps = [ "//base", "//brave/components/brave_component_updater/browser", diff --git a/components/url_sanitizer/browser/url_sanitizer_service.cc b/components/url_sanitizer/browser/url_sanitizer_service.cc index f0d7eaff087..856192a05f7 100644 --- a/components/url_sanitizer/browser/url_sanitizer_service.cc +++ b/components/url_sanitizer/browser/url_sanitizer_service.cc @@ -100,6 +100,19 @@ URLSanitizerService::~URLSanitizerService() = default; URLSanitizerService::MatchItem::MatchItem() = default; URLSanitizerService::MatchItem::~MatchItem() = default; +mojo::PendingRemote +URLSanitizerService::MakeRemote() { + mojo::PendingRemote remote; + receivers_.Add(this, remote.InitWithNewPipeAndPassReceiver()); + return remote; +} + +void URLSanitizerService::SanitizeURL(const std::string& url, + SanitizeURLCallback callback) { + const auto& sanitized_url = SanitizeURL(GURL(url)); + std::move(callback).Run(sanitized_url.spec()); +} + URLSanitizerService::MatchItem::MatchItem(extensions::URLPatternSet in, extensions::URLPatternSet ex, base::flat_set prm) @@ -120,8 +133,9 @@ void URLSanitizerService::UpdateMatchers( } GURL URLSanitizerService::SanitizeURL(const GURL& initial_url) { - if (matchers_.empty() || !initial_url.SchemeIsHTTPOrHTTPS()) + if (matchers_.empty() || !initial_url.SchemeIsHTTPOrHTTPS()) { return initial_url; + } GURL url = initial_url; for (const auto& it : matchers_) { if (!it->include.MatchesURL(url) || it->exclude.MatchesURL(url)) diff --git a/components/url_sanitizer/browser/url_sanitizer_service.h b/components/url_sanitizer/browser/url_sanitizer_service.h index 8370e67c877..05125f406f3 100644 --- a/components/url_sanitizer/browser/url_sanitizer_service.h +++ b/components/url_sanitizer/browser/url_sanitizer_service.h @@ -17,18 +17,27 @@ #include "base/memory/weak_ptr.h" #include "base/strings/string_piece.h" #include "brave/components/url_sanitizer/browser/url_sanitizer_component_installer.h" +#include "brave/components/url_sanitizer/common/mojom/url_sanitizer.mojom.h" #include "components/keyed_service/core/keyed_service.h" #include "extensions/common/url_pattern_set.h" +#include "mojo/public/cpp/bindings/receiver_set.h" #include "url/gurl.h" namespace brave { class URLSanitizerService : public KeyedService, - public URLSanitizerComponentInstaller::Observer { + public URLSanitizerComponentInstaller::Observer, + public url_sanitizer::mojom::UrlSanitizerService { public: URLSanitizerService(); ~URLSanitizerService() override; +#if BUILDFLAG(IS_ANDROID) + mojo::PendingRemote MakeRemote(); + void SanitizeURL(const std::string& url, + SanitizeURLCallback callback) override; +#endif // # BUILDFLAG(IS_ANDROID) + struct MatchItem { MatchItem(); MatchItem(extensions::URLPatternSet include, @@ -61,6 +70,7 @@ class URLSanitizerService : public KeyedService, private: base::flat_set> matchers_; base::OnceClosure initialization_callback_for_testing_; + mojo::ReceiverSet receivers_; base::WeakPtrFactory weak_factory_{this}; }; diff --git a/components/url_sanitizer/common/mojom/BUILD.gn b/components/url_sanitizer/common/mojom/BUILD.gn new file mode 100644 index 00000000000..09c9e250fa7 --- /dev/null +++ b/components/url_sanitizer/common/mojom/BUILD.gn @@ -0,0 +1,12 @@ +# Copyright (c) 2023 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/. + +import("//mojo/public/tools/bindings/mojom.gni") + +mojom("mojom") { + generate_java = true + sources = [ "url_sanitizer.mojom" ] + public_deps = [ "//mojo/public/mojom/base" ] +} diff --git a/components/url_sanitizer/common/mojom/url_sanitizer.mojom b/components/url_sanitizer/common/mojom/url_sanitizer.mojom new file mode 100644 index 00000000000..d591e90ab89 --- /dev/null +++ b/components/url_sanitizer/common/mojom/url_sanitizer.mojom @@ -0,0 +1,11 @@ +// Copyright (c) 2023 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/. + +module url_sanitizer.mojom; + + +interface UrlSanitizerService { + SanitizeURL(string initial_url) => (string sanitized_url); +}; diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuItem.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuItem.java.patch new file mode 100644 index 00000000000..2983db48014 --- /dev/null +++ b/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuItem.java.patch @@ -0,0 +1,38 @@ +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java +index 7daa27cc9cfa48fb1cb4314d06c1f2de299fc38b..86567850d549132ceabe511470f765ba1aed2e87 100644 +--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java +@@ -42,7 +42,7 @@ class ChromeContextMenuItem { + Item.SHOP_IMAGE_WITH_GOOGLE_LENS, Item.SHARE_IMAGE, Item.DIRECT_SHARE_IMAGE, Item.CALL, + Item.SEND_MESSAGE, Item.ADD_TO_CONTACTS, Item.COPY, Item.SAVE_VIDEO, + Item.OPEN_IN_CHROME, Item.OPEN_IN_NEW_TAB_IN_GROUP, Item.SHARE_HIGHLIGHT, +- Item.REMOVE_HIGHLIGHT, Item.LEARN_MORE}) ++ Item.REMOVE_HIGHLIGHT, Item.LEARN_MORE, Item.COPY_CLEAN_LINK}) + @Retention(RetentionPolicy.SOURCE) + public @interface Item { + // Values are numerated from 0 and can't have gaps. +@@ -90,7 +90,7 @@ class ChromeContextMenuItem { + int REMOVE_HIGHLIGHT = 33; + int LEARN_MORE = 34; + // ALWAYS UPDATE! +- int NUM_ENTRIES = 35; ++ int COPY_CLEAN_LINK = 35;int NUM_ENTRIES = 36; + } + + /** +@@ -132,6 +132,7 @@ class ChromeContextMenuItem { + R.id.contextmenu_share_highlight, // Item.SHARE_HIGHLIGHT + R.id.contextmenu_remove_highlight, // Item.REMOVE_HIGHLIGHT + R.id.contextmenu_learn_more, // Item.LEARN_MORE ++ R.id.contextmenu_copy_clean_link, // Item.COPY_CLEAN_LINK + }; + + /** +@@ -173,6 +174,7 @@ class ChromeContextMenuItem { + R.string.contextmenu_share_highlight, // Item.SHARE_HIGHLIGHT + R.string.contextmenu_remove_highlight, // Item.REMOVE_HIGHLIGHT + R.string.contextmenu_learn_more, // Item.LEARN_MORE ++ R.string.contextmenu_copy_clean_link, // Item.COPY_CLEAN_LINK + }; + + /** diff --git a/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuPopulator.java.patch b/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuPopulator.java.patch new file mode 100644 index 00000000000..0912f90743b --- /dev/null +++ b/patches/chrome-android-java-src-org-chromium-chrome-browser-contextmenu-ChromeContextMenuPopulator.java.patch @@ -0,0 +1,30 @@ +diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +index 82360f40547faca5e3e0a820ccadbbbc8e26c04a..59fd1aad787a5fb0c2bffe6ead049465a82abc34 100644 +--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java ++++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +@@ -132,7 +132,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { + Action.COPY_IMAGE, Action.SHOP_IMAGE_WITH_GOOGLE_LENS, Action.READ_LATER, + Action.SHOP_WITH_GOOGLE_LENS_CHIP, Action.TRANSLATE_WITH_GOOGLE_LENS_CHIP, + Action.SHARE_HIGHLIGHT, Action.REMOVE_HIGHLIGHT, Action.LEARN_MORE, +- Action.OPEN_IN_NEW_TAB_IN_GROUP}) ++ Action.OPEN_IN_NEW_TAB_IN_GROUP, Action.COPY_CLEAN_LINK}) + @Retention(RetentionPolicy.SOURCE) + public @interface Action { + int OPEN_IN_NEW_TAB = 0; +@@ -176,7 +176,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { + int LEARN_MORE = 38; + int OPEN_IN_NEW_TAB_IN_GROUP = 39; + int OPEN_IN_NEW_WINDOW = 40; +- int NUM_ENTRIES = 41; ++ int COPY_CLEAN_LINK = 41;int NUM_ENTRIES = 42; + } + } + +@@ -269,6 +269,7 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator { + if (!MailTo.isMailTo(mParams.getLinkUrl().getSpec()) + && !UrlUtilities.isTelScheme(mParams.getLinkUrl())) { + linkGroup.add(createListItem(Item.COPY_LINK_ADDRESS)); ++ linkGroup.add(createListItem(Item.COPY_CLEAN_LINK)); + if (!mParams.getLinkText().trim().isEmpty() && !mParams.isImage()) { + linkGroup.add(createListItem(Item.COPY_LINK_TEXT)); + } diff --git a/test/BUILD.gn b/test/BUILD.gn index d37a7a2d07f..63e4b706219 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -1220,6 +1220,7 @@ if (is_android) { "//chrome/browser/android/lifecycle:java", "//chrome/browser/back_press/android:java", "//chrome/browser/browser_controls/android:java", + "//chrome/browser/contextmenu:java", "//chrome/browser/feed/android:java", "//chrome/browser/flags:java", "//chrome/browser/fullscreen/android:java", @@ -1251,7 +1252,9 @@ if (is_android) { "//components/browser_ui/widget/android:java", "//components/commerce/core/android:core_java", "//components/embedder_support/android:browser_context_java", + "//components/embedder_support/android:context_menu_java", "//components/external_intents/android:java", + "//components/externalauth/android:java", "//components/favicon/android:java", "//components/image_fetcher:java", "//components/omnibox/browser:browser_java",