Merge pull request #19486 from brave/26013_copy_clean_link

copy clean link
This commit is contained in:
Sujit Acharya
2023-08-02 23:50:41 +05:30
committed by GitHub
24 changed files with 344 additions and 2 deletions
+2
View File
@@ -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",
+11
View File
@@ -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>(...);
@@ -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);
}
}
+1
View File
@@ -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
+9
View File
@@ -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:
+1
View File
@@ -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",
+1
View File
@@ -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",
@@ -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);
+1
View File
@@ -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);
};
@@ -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
};
/**
@@ -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));
}
+3
View File
@@ -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",