Merge pull request #19486 from brave/26013_copy_clean_link
copy clean link
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -551,6 +551,17 @@
|
||||
public <init>(...);
|
||||
}
|
||||
|
||||
|
||||
-keep class org.chromium.chrome.browser.contextmenu.ChromeContextMenuPopulator {
|
||||
*** onItemSelected(...);
|
||||
public <init>(...);
|
||||
}
|
||||
|
||||
-keep class org.chromium.chrome.browser.contextmenu.BraveChromeContextMenuPopulator {
|
||||
public <init>(...);
|
||||
}
|
||||
|
||||
|
||||
-keep class org.chromium.chrome.browser.omnibox.LocationBarCoordinator {
|
||||
*** mLocationBarMediator;
|
||||
public <init>(...);
|
||||
|
||||
+53
@@ -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> 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) {}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -21,4 +21,5 @@
|
||||
<item type="id" name="menu_item_enter_anim_id" />
|
||||
<item type="id" name="menu_item_original_background" />
|
||||
<item type="id" name="menu_item_background_drawable_position" />
|
||||
<item type="id" name="contextmenu_copy_clean_link" />
|
||||
</resources>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -146,6 +146,9 @@ This file contains all "about" strings. It is set to NOT be translated, in tran
|
||||
<message name="IDS_MANAGE_ADS" desc="Text for manage ads">
|
||||
Manage ads
|
||||
</message>
|
||||
<message name="IDS_CONTEXTMENU_COPY_CLEAN_LINK" desc="Text for Copy clean link">
|
||||
Copy clean link
|
||||
</message>
|
||||
<message name="IDS_ESTIMATED_TOOLTIP_TEXT" desc="Text for This reflects your estimated earnings range for Brave Ads this month.">
|
||||
This reflects your estimated earnings range for Brave Ads this month.
|
||||
</message>
|
||||
|
||||
@@ -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<jobject>& profile_android) {
|
||||
auto* profile = ProfileAndroid::FromProfileAndroid(profile_android);
|
||||
if (profile == nullptr) {
|
||||
return static_cast<jlong>(-1);
|
||||
}
|
||||
|
||||
auto pending =
|
||||
brave::URLSanitizerServiceFactory::GetInstance()->GetForContext(profile);
|
||||
|
||||
return static_cast<jlong>(pending.PassPipe().release().value());
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
} // namespace chrome
|
||||
@@ -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",
|
||||
]
|
||||
}
|
||||
|
||||
@@ -31,6 +31,14 @@ URLSanitizerService* URLSanitizerServiceFactory::GetForBrowserContext(
|
||||
GetInstance()->GetServiceForBrowserContext(context, true));
|
||||
}
|
||||
|
||||
// static
|
||||
mojo::PendingRemote<url_sanitizer::mojom::UrlSanitizerService>
|
||||
URLSanitizerServiceFactory::GetForContext(content::BrowserContext* context) {
|
||||
return static_cast<URLSanitizerService*>(
|
||||
GetInstance()->GetServiceForBrowserContext(context, true))
|
||||
->MakeRemote();
|
||||
}
|
||||
|
||||
URLSanitizerServiceFactory::URLSanitizerServiceFactory()
|
||||
: BrowserContextKeyedServiceFactory(
|
||||
"URLSanitizerService",
|
||||
|
||||
@@ -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 <typename T>
|
||||
@@ -21,6 +23,8 @@ class URLSanitizerServiceFactory : public BrowserContextKeyedServiceFactory {
|
||||
public:
|
||||
static URLSanitizerService* GetForBrowserContext(
|
||||
content::BrowserContext* context);
|
||||
static mojo::PendingRemote<url_sanitizer::mojom::UrlSanitizerService>
|
||||
GetForContext(content::BrowserContext* context);
|
||||
static URLSanitizerServiceFactory* GetInstance();
|
||||
|
||||
private:
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
+19
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -100,6 +100,19 @@ URLSanitizerService::~URLSanitizerService() = default;
|
||||
URLSanitizerService::MatchItem::MatchItem() = default;
|
||||
URLSanitizerService::MatchItem::~MatchItem() = default;
|
||||
|
||||
mojo::PendingRemote<url_sanitizer::mojom::UrlSanitizerService>
|
||||
URLSanitizerService::MakeRemote() {
|
||||
mojo::PendingRemote<url_sanitizer::mojom::UrlSanitizerService> 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<std::string> 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))
|
||||
|
||||
@@ -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<url_sanitizer::mojom::UrlSanitizerService> 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<std::unique_ptr<URLSanitizerService::MatchItem>> matchers_;
|
||||
base::OnceClosure initialization_callback_for_testing_;
|
||||
mojo::ReceiverSet<url_sanitizer::mojom::UrlSanitizerService> receivers_;
|
||||
base::WeakPtrFactory<URLSanitizerService> weak_factory_{this};
|
||||
};
|
||||
|
||||
|
||||
@@ -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" ]
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
+38
@@ -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
|
||||
};
|
||||
|
||||
/**
|
||||
+30
@@ -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));
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user