611 lines
33 KiB
Diff
611 lines
33 KiB
Diff
From: uazo <uazo@users.noreply.github.com>
|
|
Date: Wed, 12 Apr 2023 08:22:00 +0000
|
|
Subject: Add setting to invert tap and long tap
|
|
|
|
Reverses single tap to long tap in android for accessibility reasons.
|
|
The feature can be activated from the accessibility settings.
|
|
|
|
Need: bromite-build-utils.patch
|
|
License: GPL-2.0-or-later - https://spdx.org/licenses/GPL-2.0-or-later.html
|
|
---
|
|
.../AwContextMenuItemDelegate.java | 4 +++
|
|
chrome/android/java/res/values/ids.xml | 1 +
|
|
.../ChromeAccessibilitySettingsDelegate.java | 18 ++++++++++
|
|
.../contextmenu/ChromeContextMenuItem.java | 5 ++-
|
|
.../ChromeContextMenuPopulator.java | 5 +++
|
|
.../tab/TabContextMenuItemDelegate.java | 8 +++++
|
|
.../flags/android/chrome_feature_list.cc | 1 +
|
|
.../browser/flags/ChromeFeatureList.java | 5 +++
|
|
.../strings/android_chrome_strings.grd | 9 +++++
|
|
.../res/xml/accessibility_preferences.xml | 5 +++
|
|
.../accessibility/AccessibilitySettings.java | 12 +++++++
|
|
.../AccessibilitySettingsDelegate.java | 2 ++
|
|
.../contextmenu/ContextMenuItemDelegate.java | 3 ++
|
|
.../ThinWebViewContextMenuItemDelegate.java | 6 ++++
|
|
...Add-setting-to-invert-tap-and-long-tap.inc | 8 +++++
|
|
...Add-setting-to-invert-tap-and-long-tap.inc | 3 ++
|
|
...Add-setting-to-invert-tap-and-long-tap.inc | 1 +
|
|
.../renderer/core/html/html_anchor_element.cc | 36 +++++++++++++++----
|
|
.../renderer/core/html/html_anchor_element.h | 7 +++-
|
|
.../renderer/core/html/html_image_element.cc | 17 +++++++++
|
|
.../renderer/core/html/html_image_element.h | 2 ++
|
|
.../core/page/context_menu_controller.cc | 23 +++++++++---
|
|
.../core/page/context_menu_controller.h | 5 +--
|
|
23 files changed, 170 insertions(+), 16 deletions(-)
|
|
create mode 100644 cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
create mode 100644 cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
create mode 100644 cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
|
|
|
|
diff --git a/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java b/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
|
|
--- a/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
|
|
+++ b/android_webview/java/src/org/chromium/android_webview/contextmenu/AwContextMenuItemDelegate.java
|
|
@@ -11,6 +11,7 @@ import android.net.Uri;
|
|
import org.chromium.base.IntentUtils;
|
|
import org.chromium.build.annotations.NullMarked;
|
|
import org.chromium.components.embedder_support.contextmenu.ContextMenuItemDelegate;
|
|
+import org.chromium.content_public.common.Referrer;
|
|
import org.chromium.content_public.browser.WebContents;
|
|
import org.chromium.ui.base.Clipboard;
|
|
import org.chromium.url.GURL;
|
|
@@ -52,6 +53,9 @@ public class AwContextMenuItemDelegate implements ContextMenuItemDelegate {
|
|
IntentUtils.safeStartActivity(mActivity, intent);
|
|
}
|
|
|
|
+ @Override
|
|
+ public void onOpenUrl(GURL url, Referrer referrer) { }
|
|
+
|
|
@Override
|
|
public GURL getPageUrl() {
|
|
return mWebContents.getVisibleUrl();
|
|
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
|
|
--- a/chrome/android/java/res/values/ids.xml
|
|
+++ b/chrome/android/java/res/values/ids.xml
|
|
@@ -112,6 +112,7 @@ found in the LICENSE file.
|
|
|
|
<!-- Menu item IDs for FullscreenActivities -->
|
|
<item type="id" name="contextmenu_open_in_chrome" />
|
|
+ <item type="id" name="contextmenu_open_in_tab" />
|
|
|
|
<!-- Tags -->
|
|
<item type="id" name="highlight_color" />
|
|
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
|
|
--- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
|
|
+++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility/settings/ChromeAccessibilitySettingsDelegate.java
|
|
@@ -167,6 +167,24 @@ public class ChromeAccessibilitySettingsDelegate implements AccessibilitySetting
|
|
mSnackbarManagerSupplier.get().showSnackbar(mSnackbar);
|
|
}
|
|
|
|
+ private static class ShowAlwaysContextMenuOnLinksDelegate implements BooleanPreferenceDelegate {
|
|
+ @Override
|
|
+ public boolean getValue() {
|
|
+ return ChromeFeatureList.sShowAlwaysContextMenuOnLinks.isEnabled();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setValue(boolean value) {
|
|
+ CromiteNativeUtils.setFlagEnabled(ChromeFeatureList.SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS,
|
|
+ "show-always-context-menu-on-links", value);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public BooleanPreferenceDelegate getShowAlwaysContextMenuOnLinksDelegate() {
|
|
+ return new ShowAlwaysContextMenuOnLinksDelegate();
|
|
+ }
|
|
+
|
|
@Override
|
|
public BrowserContextHandle getBrowserContextHandle() {
|
|
return mProfile;
|
|
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
|
|
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
|
|
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuItem.java
|
|
@@ -135,8 +135,9 @@ class ChromeContextMenuItem {
|
|
// Developer Group
|
|
int VIEW_PAGE_SOURCE = 41;
|
|
int INSPECT_ELEMENT = 42;
|
|
+ int FOLLOW_LINK = 43;
|
|
// ALWAYS UPDATE!
|
|
- int NUM_ENTRIES = 43;
|
|
+ int NUM_ENTRIES = 44;
|
|
}
|
|
|
|
/** Mapping from {@link Item} to the ID found in the ids.xml. */
|
|
@@ -184,6 +185,7 @@ class ChromeContextMenuItem {
|
|
R.id.contextmenu_print_page, // Item.PRINT_PAGE
|
|
R.id.contextmenu_view_page_source, // Item.VIEW_PAGE_SOURCE
|
|
R.id.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
|
|
+ R.id.contextmenu_open_in_tab, // Item.OPEN_IN_NEW_CHROME_TAB
|
|
};
|
|
|
|
/** Mapping from {@link Item} to the ID of the string that describes the action of the item. */
|
|
@@ -231,6 +233,7 @@ class ChromeContextMenuItem {
|
|
R.string.contextmenu_print_page, // Item.PRINT_PAGE
|
|
R.string.contextmenu_view_page_source, // Item.VIEW_PAGE_SOURCE
|
|
R.string.contextmenu_inspect_element, // Item.INSPECT_ELEMENT
|
|
+ R.string.contextmenu_open_in_tab, // Item.OPEN_IN_NEW_CHROME_TAB
|
|
};
|
|
|
|
/**
|
|
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
|
|
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
|
|
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
|
|
@@ -495,6 +495,9 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
|
|
}
|
|
if (mParams.isAnchor()) {
|
|
ModelList linkGroup = new ModelList();
|
|
+ if (ChromeFeatureList.sShowAlwaysContextMenuOnLinks.isEnabled()) {
|
|
+ linkGroup.add(createListItem(Item.FOLLOW_LINK));
|
|
+ }
|
|
if (areMandatoryFlowsCompleted(getProfile())
|
|
&& !isEmptyUrl(mParams.getUrl())
|
|
&& UrlUtilities.isAcceptedScheme(mParams.getUrl())) {
|
|
@@ -1141,6 +1144,8 @@ public class ChromeContextMenuPopulator implements ContextMenuPopulator {
|
|
title = mParams.getLinkText();
|
|
}
|
|
tabItemDelegate.onReadLater(mParams.getUrl(), title);
|
|
+ } else if (itemId == R.id.contextmenu_open_in_tab) {
|
|
+ mItemDelegate.onOpenUrl(mParams.getUrl(), mParams.getReferrer());
|
|
} else if (itemId == R.id.contextmenu_open_in_chrome) {
|
|
recordContextMenuSelection(ContextMenuUma.Action.OPEN_IN_CHROME);
|
|
tabItemDelegate.onOpenInChrome(mParams.getUrl(), mParams.getPageUrl());
|
|
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
|
|
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
|
|
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
|
|
@@ -388,6 +388,14 @@ public class TabContextMenuItemDelegate implements ContextMenuItemDelegate {
|
|
mTab.loadUrl(loadUrlParams);
|
|
}
|
|
|
|
+ @Override
|
|
+ public void onOpenUrl(GURL url, Referrer referrer) {
|
|
+ LoadUrlParams loadUrlParams = new LoadUrlParams(url.getSpec());
|
|
+ loadUrlParams.setTransitionType(PageTransition.LINK);
|
|
+ loadUrlParams.setReferrer(referrer);
|
|
+ mTab.loadUrl(loadUrlParams);
|
|
+ }
|
|
+
|
|
/**
|
|
* Called when the {@code url} is of an image and should be opened in a new page.
|
|
*
|
|
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
|
|
--- a/chrome/browser/flags/android/chrome_feature_list.cc
|
|
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
|
|
@@ -463,6 +463,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
|
|
&kTabClosureMethodRefactor,
|
|
&kTabModelInitFixes,
|
|
&kTabStorageSqlitePrototype,
|
|
+ &blink::features::kShowAlwaysContextMenuOnLinks,
|
|
&kTabStripAutoSelectOnCloseChange,
|
|
&kTabStripCloseRefactorAndroid,
|
|
&kTabStripDensityChangeAndroid,
|
|
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
|
|
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
|
|
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
|
|
@@ -546,6 +546,8 @@ public abstract class ChromeFeatureList {
|
|
"DisableToolbarSwipeUp";
|
|
public static final String MOVE_TOP_TOOLBAR_TO_BOTTOM =
|
|
"MoveTopToolbarToBottom";
|
|
+ public static final String SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS =
|
|
+ "ShowAlwaysContextMenuOnLinks";
|
|
public static final String NEW_TAB_PAGE_CUSTOMIZATION_THEME_SYNC =
|
|
"NewTabPageCustomizationThemeSync";
|
|
public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2";
|
|
@@ -1107,6 +1109,8 @@ public abstract class ChromeFeatureList {
|
|
newCachedFlag(DISABLE_TOOLBAR_SWIPE_UP, false);
|
|
public static final CachedFlag sMoveTopToolbarToBottom =
|
|
newCachedFlag(MOVE_TOP_TOOLBAR_TO_BOTTOM, false);
|
|
+ public static final CachedFlag sShowAlwaysContextMenuOnLinks =
|
|
+ newCachedFlag(SHOW_ALWAYS_CONTEXT_MENU_ON_LINKS, false);
|
|
public static final CachedFlag sPaintPreviewDemo = newCachedFlag(PAINT_PREVIEW_DEMO, false);
|
|
public static final CachedFlag sPersistAcrossReboots =
|
|
newCachedFlag(PERSIST_ACROSS_REBOOTS, true);
|
|
@@ -1399,6 +1403,7 @@ public abstract class ChromeFeatureList {
|
|
sTopControlsRefactorV2,
|
|
sTouchToSearchCallout,
|
|
sUnparcelIntentFileDescriptors,
|
|
+ sShowAlwaysContextMenuOnLinks,
|
|
sUseActivityManagerForTabActivation,
|
|
sUseChimeAndroidSdk,
|
|
sUseInitialNetworkStateAtStartup,
|
|
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
|
|
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
|
|
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
|
|
@@ -1700,6 +1700,12 @@ Your Google account may have other forms of browsing history like searches and a
|
|
<message name="IDS_DISABLE_TOOLBAR_SWIPE_UP" desc="Summary of the preference that allows the user to disable toolbar swipeup.">
|
|
Disable toolbar swipe up
|
|
</message>
|
|
+ <message name="IDS_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS_TITLE" desc="Title of the preference that open the context menu in links.">
|
|
+ Always open the context menu in the links
|
|
+ </message>
|
|
+ <message name="IDS_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS_SUMMARY" desc="Summary of the preference that open the context menu in links.">
|
|
+ Allows the context menu to be opened with a tap and follow the link with long press
|
|
+ </message>
|
|
|
|
<!-- Safety check -->
|
|
<message name="IDS_PREFS_SAFETY_CHECK" desc="Title of the Safety check element in settings, allowing the user to check multiple areas of browser safety. [CHAR_LIMIT=32]">
|
|
@@ -3369,6 +3375,9 @@ To change this setting, <ph name="BEGIN_LINK">BEGIN_LINK</ph>delete the Chrome d
|
|
<message name="IDS_CONTEXTMENU_OPEN_IN_NEW_CHROME_TAB" desc="Context sensitive menu item to open the selected link in a new Chrome tab from Chrome Custom Tab. [CHAR_LIMIT=30]">
|
|
Open in new Chrome tab
|
|
</message>
|
|
+ <message name="IDS_CONTEXTMENU_OPEN_IN_TAB" desc="Context sensitive menu item to open the selected link in tab. [CHAR_LIMIT=30]">
|
|
+ Open in current tab
|
|
+ </message>
|
|
<message name="IDS_CONTEXTMENU_OPEN_IN_CHROME_WINDOW" desc="Context sensitive menu item to open the selected link in a Chrome window from Chrome Custom Tab. Used when there is a dedicated window for Incognito tabs. [CHAR_LIMIT=30]">
|
|
Open in Chrome window
|
|
</message>
|
|
diff --git a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
|
|
--- a/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
|
|
+++ b/components/browser_ui/accessibility/android/java/res/xml/accessibility_preferences.xml
|
|
@@ -26,6 +26,11 @@ found in the LICENSE file.
|
|
android:summary="@string/page_zoom_always_show_preference_summary"
|
|
android:title="@string/page_zoom_always_show_preference_title" />
|
|
|
|
+ <org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
|
+ android:key="always_show_contextmenu_on_links"
|
|
+ android:summary="@string/always_show_contextmenu_on_links_summary"
|
|
+ android:title="@string/always_show_contextmenu_on_links_title" />
|
|
+
|
|
<org.chromium.components.browser_ui.settings.ChromeSwitchPreference
|
|
android:key="force_enable_zoom"
|
|
android:summary="@string/force_enable_zoom_summary"
|
|
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
|
|
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
|
|
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
|
|
@@ -89,6 +89,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
|
|
private BooleanPreferenceDelegate mMoveTopToolbarToBottomDelegate;
|
|
private BooleanPreferenceDelegate mDisableToolbarSwipeUpDelegate;
|
|
|
|
+ static final String PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS = "always_show_contextmenu_on_links";
|
|
+ private BooleanPreferenceDelegate mShowAlwaysContextMenuOnLinksDelegate;
|
|
+
|
|
private PageZoomPreference mPageZoomDefaultZoomPref;
|
|
private ChromeSwitchPreference mPageZoomIncludeOSAdjustment;
|
|
private ChromeSwitchPreference mPageZoomAlwaysShowPref;
|
|
@@ -198,6 +201,12 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
|
|
mDisableToolbarSwipeUpPref.setChecked(mDisableToolbarSwipeUpDelegate.getValue());
|
|
mDisableToolbarSwipeUpPref.setOnPreferenceChangeListener(this);
|
|
|
|
+ ChromeSwitchPreference mShowAlwaysContextMenuOnLinksPref =
|
|
+ (ChromeSwitchPreference) findPreference(PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS);
|
|
+ mShowAlwaysContextMenuOnLinksDelegate = mDelegate.getShowAlwaysContextMenuOnLinksDelegate();
|
|
+ mShowAlwaysContextMenuOnLinksPref.setChecked(mShowAlwaysContextMenuOnLinksDelegate.getValue());
|
|
+ mShowAlwaysContextMenuOnLinksPref.setOnPreferenceChangeListener(this);
|
|
+
|
|
Preference captions = findPreference(PREF_CAPTIONS);
|
|
captions.setOnPreferenceClickListener(
|
|
preference -> {
|
|
@@ -323,6 +332,9 @@ public class AccessibilitySettings extends ChromeBaseSettingsFragment
|
|
} else if (PREF_DISABLE_TOOLBAR_SWIPE_UP.equals(preference.getKey())) {
|
|
mDisableToolbarSwipeUpDelegate.setValue((Boolean) newValue);
|
|
mDelegate.requestRestart(getActivity());
|
|
+ } else if (PREF_ALWAYS_SHOW_CONTEXTMENU_ON_LINKS.equals(preference.getKey())) {
|
|
+ mShowAlwaysContextMenuOnLinksDelegate.setValue((Boolean) newValue);
|
|
+ mDelegate.requestRestart(getActivity());
|
|
} else if (PREF_PAGE_ZOOM_INCLUDE_OS_ADJUSTMENT.equals(preference.getKey())) {
|
|
// TODO(mschillaci): Implement the override behavior for OS level.
|
|
} else if (OmniboxFeatures.KEY_JUMP_START_OMNIBOX.equals(preference.getKey())) {
|
|
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
|
|
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
|
|
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettingsDelegate.java
|
|
@@ -45,6 +45,8 @@ public interface AccessibilitySettingsDelegate {
|
|
BooleanPreferenceDelegate getMoveTopToolbarToBottomDelegate();
|
|
BooleanPreferenceDelegate getDisableToolbarSwipeUpDelegate();
|
|
|
|
+ BooleanPreferenceDelegate getShowAlwaysContextMenuOnLinksDelegate();
|
|
+
|
|
/**
|
|
* @return The BrowserContextHandle that should be used to read and update settings.
|
|
*/
|
|
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
|
|
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
|
|
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/contextmenu/ContextMenuItemDelegate.java
|
|
@@ -11,6 +11,7 @@ import androidx.annotation.IntDef;
|
|
|
|
import org.chromium.build.annotations.NullMarked;
|
|
import org.chromium.content_public.browser.WebContents;
|
|
+import org.chromium.content_public.common.Referrer;
|
|
import org.chromium.url.GURL;
|
|
|
|
import java.lang.annotation.Retention;
|
|
@@ -148,6 +149,8 @@ public interface ContextMenuItemDelegate {
|
|
/** Returns the page url. */
|
|
GURL getPageUrl();
|
|
|
|
+ void onOpenUrl(GURL url, Referrer referrer);
|
|
+
|
|
/**
|
|
* Called when the current embedder app is not the default to handle a View Intent.
|
|
*
|
|
diff --git a/components/thin_webview/internal/java/src/org/chromium/components/thinwebview/internal/ThinWebViewContextMenuItemDelegate.java b/components/thin_webview/internal/java/src/org/chromium/components/thinwebview/internal/ThinWebViewContextMenuItemDelegate.java
|
|
--- a/components/thin_webview/internal/java/src/org/chromium/components/thinwebview/internal/ThinWebViewContextMenuItemDelegate.java
|
|
+++ b/components/thin_webview/internal/java/src/org/chromium/components/thinwebview/internal/ThinWebViewContextMenuItemDelegate.java
|
|
@@ -6,6 +6,7 @@ package org.chromium.components.thinwebview.internal;
|
|
|
|
import org.chromium.build.annotations.NullMarked;
|
|
import org.chromium.components.embedder_support.contextmenu.ContextMenuItemDelegate;
|
|
+import org.chromium.content_public.common.Referrer;
|
|
import org.chromium.content_public.browser.WebContents;
|
|
import org.chromium.ui.base.Clipboard;
|
|
import org.chromium.url.GURL;
|
|
@@ -43,6 +44,11 @@ public class ThinWebViewContextMenuItemDelegate implements ContextMenuItemDelega
|
|
// Intentionally empty.
|
|
}
|
|
|
|
+ @Override
|
|
+ public void onOpenUrl(GURL url, Referrer referrer) {
|
|
+ // Intentionally empty. (Add setting to invert tap and long tap)
|
|
+ }
|
|
+
|
|
@Override
|
|
public GURL getPageUrl() {
|
|
return mWebContents.getVisibleUrl();
|
|
diff --git a/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/cromite_flags/chrome/browser/about_flags_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
@@ -0,0 +1,8 @@
|
|
+#ifdef FLAG_SECTION
|
|
+
|
|
+ {"show-always-context-menu-on-links",
|
|
+ "Always show contextmenu on links",
|
|
+ "Use accessibility settings to set it.", kOsAndroid,
|
|
+ FEATURE_VALUE_TYPE(blink::features::kShowAlwaysContextMenuOnLinks)},
|
|
+
|
|
+#endif
|
|
diff --git a/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/cromite_flags/third_party/blink/common/features_cc/Add-setting-to-invert-tap-and-long-tap.inc
|
|
@@ -0,0 +1,3 @@
|
|
+CROMITE_FEATURE(kShowAlwaysContextMenuOnLinks,
|
|
+ "ShowAlwaysContextMenuOnLinks",
|
|
+ base::FEATURE_DISABLED_BY_DEFAULT);
|
|
diff --git a/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc b/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/cromite_flags/third_party/blink/common/features_h/Add-setting-to-invert-tap-and-long-tap.inc
|
|
@@ -0,0 +1 @@
|
|
+BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kShowAlwaysContextMenuOnLinks);
|
|
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
|
|
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
|
|
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
|
|
@@ -69,6 +69,7 @@
|
|
#include "third_party/blink/renderer/core/loader/render_blocking_resource_manager.h"
|
|
#include "third_party/blink/renderer/core/navigation_api/navigation_api.h"
|
|
#include "third_party/blink/renderer/core/page/chrome_client.h"
|
|
+#include "third_party/blink/renderer/core/page/context_menu_controller.h"
|
|
#include "third_party/blink/renderer/core/page/page.h"
|
|
#include "third_party/blink/renderer/core/scroll/scroll_into_view_util.h"
|
|
#include "third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h"
|
|
@@ -429,6 +430,17 @@ void HTMLAnchorElementBase::NavigateToHyperlink(
|
|
bool is_trusted,
|
|
base::TimeTicks platform_time_stamp,
|
|
KURL completed_url) {
|
|
+ UIEvent& event = *UIEvent::Create();
|
|
+ NavigateToHyperlink2(std::move(request), navigation_policy, is_trusted, platform_time_stamp,
|
|
+ std::move(completed_url), event, true);
|
|
+}
|
|
+
|
|
+void HTMLAnchorElementBase::NavigateToHyperlink2(ResourceRequest request,
|
|
+ NavigationPolicy navigation_policy,
|
|
+ bool is_trusted,
|
|
+ base::TimeTicks platform_time_stamp,
|
|
+ KURL completed_url,
|
|
+ Event& event, bool do_not_show_context_menu) {
|
|
LocalDOMWindow* window = GetDocument().domWindow();
|
|
if (!window) {
|
|
return;
|
|
@@ -511,6 +523,15 @@ void HTMLAnchorElementBase::NavigateToHyperlink(
|
|
frame_request.SetImpression(impression);
|
|
}
|
|
|
|
+ if (!do_not_show_context_menu &&
|
|
+ base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
|
|
+ if (Page* page = GetDocument().GetPage()) {
|
|
+ page->GetContextMenuController().HandleContextMenuEvent(
|
|
+ To<MouseEvent>(&event), /*do_not_show_context_menu*/true);
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+
|
|
Frame* target_frame =
|
|
frame->Tree().FindOrCreateFrameForNavigation(frame_request, target).frame;
|
|
|
|
@@ -547,7 +568,7 @@ bool HTMLAnchorElementBase::IsValidInterestInvoker(Element& target) const {
|
|
return IsLink();
|
|
}
|
|
|
|
-void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
|
|
+void HTMLAnchorElementBase::HandleClick(MouseEvent& event, bool do_not_show_context_menu) {
|
|
event.SetDefaultHandled();
|
|
|
|
// It's unclear whether synthesized middle-button "click" events should be
|
|
@@ -621,13 +642,12 @@ void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
|
|
return;
|
|
}
|
|
|
|
- base::OnceClosure navigate_closure = blink::BindOnce(
|
|
- &HTMLAnchorElementBase::NavigateToHyperlink, WrapWeakPersistent(this),
|
|
- std::move(request), navigation_policy, event.isTrusted(),
|
|
- event.PlatformTimeStamp(), std::move(completed_url));
|
|
-
|
|
if (navigation_policy == kNavigationPolicyDownload ||
|
|
navigation_policy == kNavigationPolicyLinkPreview) {
|
|
+ base::OnceClosure navigate_closure = blink::BindOnce(
|
|
+ &HTMLAnchorElementBase::NavigateToHyperlink, WrapWeakPersistent(this),
|
|
+ std::move(request), navigation_policy, event.isTrusted(),
|
|
+ event.PlatformTimeStamp(), std::move(completed_url));
|
|
// We distinguish single/double click with some modifiers.
|
|
// See the comment of `EventHandler.delayed_navigation_task_handle_`.
|
|
auto task_handle = PostDelayedCancellableTask(
|
|
@@ -637,7 +657,9 @@ void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
|
|
frame->GetEventHandler().SetDelayedNavigationTaskHandle(
|
|
std::move(task_handle));
|
|
} else {
|
|
- std::move(navigate_closure).Run();
|
|
+ HTMLAnchorElementBase::NavigateToHyperlink2(std::move(request), navigation_policy,
|
|
+ event.isTrusted(), event.PlatformTimeStamp(), std::move(completed_url),
|
|
+ event, do_not_show_context_menu);
|
|
}
|
|
}
|
|
|
|
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h
|
|
--- a/third_party/blink/renderer/core/html/html_anchor_element.h
|
|
+++ b/third_party/blink/renderer/core/html/html_anchor_element.h
|
|
@@ -90,6 +90,7 @@ class CORE_EXPORT HTMLAnchorElementBase : public HTMLElement,
|
|
bool IsValidInterestInvoker(Element& target) const override;
|
|
|
|
void Trace(Visitor*) const override;
|
|
+ void HandleClick(MouseEvent&, bool do_not_show_context_menu = false);
|
|
|
|
protected:
|
|
HTMLAnchorElementBase(const QualifiedName& tag_name, Document&);
|
|
@@ -121,7 +122,11 @@ class CORE_EXPORT HTMLAnchorElementBase : public HTMLElement,
|
|
bool is_trusted,
|
|
base::TimeTicks platform_time_stamp,
|
|
KURL);
|
|
- void HandleClick(MouseEvent&);
|
|
+ void NavigateToHyperlink2(ResourceRequest,
|
|
+ NavigationPolicy,
|
|
+ bool is_trusted,
|
|
+ base::TimeTicks platform_time_stamp,
|
|
+ KURL, Event&, bool do_not_show_context_menu);
|
|
|
|
unsigned link_relations_ : 31;
|
|
mutable LinkHash cached_visited_link_hash_;
|
|
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc
|
|
--- a/third_party/blink/renderer/core/html/html_image_element.cc
|
|
+++ b/third_party/blink/renderer/core/html/html_image_element.cc
|
|
@@ -37,6 +37,7 @@
|
|
#include "third_party/blink/renderer/core/dom/events/event_dispatch_forbidden_scope.h"
|
|
#include "third_party/blink/renderer/core/dom/node_traversal.h"
|
|
#include "third_party/blink/renderer/core/dom/shadow_root.h"
|
|
+#include "third_party/blink/renderer/core/events/mouse_event.h"
|
|
#include "third_party/blink/renderer/core/frame/attribution_src_loader.h"
|
|
#include "third_party/blink/renderer/core/frame/deprecation/deprecation.h"
|
|
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
|
|
@@ -68,6 +69,7 @@
|
|
#include "third_party/blink/renderer/core/media_type_names.h"
|
|
#include "third_party/blink/renderer/core/page/chrome_client.h"
|
|
#include "third_party/blink/renderer/core/page/page.h"
|
|
+#include "third_party/blink/renderer/core/page/context_menu_controller.h"
|
|
#include "third_party/blink/renderer/core/paint/timing/paint_timing.h"
|
|
#include "third_party/blink/renderer/core/probe/core_probes.h"
|
|
#include "third_party/blink/renderer/core/resize_observer/resize_observer_entry.h"
|
|
@@ -796,6 +798,21 @@ void HTMLImageElement::DidFinishLayout() {
|
|
}
|
|
}
|
|
|
|
+void HTMLImageElement::DefaultEventHandler(Event& event) {
|
|
+ if (base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
|
|
+ auto* mouse_event = DynamicTo<MouseEvent>(&event);
|
|
+ if (mouse_event && mouse_event->type() == event_type_names::kClick) {
|
|
+ if (Page* page = GetDocument().GetPage()) {
|
|
+ page->GetContextMenuController().HandleContextMenuEvent(
|
|
+ mouse_event, /*do_not_show_context_menu*/true);
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ HTMLElement::DefaultEventHandler(event);
|
|
+}
|
|
+
|
|
bool HTMLImageElement::draggable() const {
|
|
// Image elements are draggable by default.
|
|
return !EqualIgnoringAsciiCase(FastGetAttribute(html_names::kDraggableAttr),
|
|
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h
|
|
--- a/third_party/blink/renderer/core/html/html_image_element.h
|
|
+++ b/third_party/blink/renderer/core/html/html_image_element.h
|
|
@@ -226,6 +226,8 @@ class CORE_EXPORT HTMLImageElement
|
|
|
|
void AdjustStyle(ComputedStyleBuilder&) override;
|
|
|
|
+ void DefaultEventHandler(Event&) override;
|
|
+
|
|
private:
|
|
void ParseAttribute(const AttributeModificationParams&) override;
|
|
bool IsPresentationAttribute(const QualifiedName&) const override;
|
|
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc
|
|
--- a/third_party/blink/renderer/core/page/context_menu_controller.cc
|
|
+++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
|
|
@@ -201,15 +201,17 @@ void ContextMenuController::DocumentDetached(Document* document) {
|
|
}
|
|
}
|
|
|
|
-void ContextMenuController::HandleContextMenuEvent(MouseEvent* mouse_event) {
|
|
- DCHECK(mouse_event->type() == event_type_names::kContextmenu);
|
|
+void ContextMenuController::HandleContextMenuEvent(MouseEvent* mouse_event, bool do_not_show_context_menu) {
|
|
+ if (!base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
|
|
+ DCHECK(mouse_event->type() == event_type_names::kContextmenu);
|
|
+ }
|
|
LocalFrame* frame =
|
|
mouse_event->RawTarget()->ToNode()->GetDocument().GetFrame();
|
|
PhysicalOffset location =
|
|
PhysicalOffset::FromPointFRound(mouse_event->AbsoluteLocation());
|
|
|
|
if (ShowContextMenu(frame, location, mouse_event->GetMenuSourceType(),
|
|
- mouse_event))
|
|
+ mouse_event, do_not_show_context_menu))
|
|
mouse_event->SetDefaultHandled();
|
|
}
|
|
|
|
@@ -443,7 +445,8 @@ bool ContextMenuController::ShowContextMenu(
|
|
LocalFrame* frame,
|
|
const PhysicalOffset& point,
|
|
ui::mojom::blink::MenuSourceType source_type,
|
|
- const MouseEvent* mouse_event) {
|
|
+ const MouseEvent* mouse_event,
|
|
+ bool do_not_show_context_menu) {
|
|
// Displaying the context menu in this function is a big hack as we don't
|
|
// have context, i.e. whether this is being invoked via a script or in
|
|
// response to user input (Mouse event WM_RBUTTONDOWN,
|
|
@@ -466,6 +469,16 @@ bool ContextMenuController::ShowContextMenu(
|
|
if (!result.InnerNodeOrImageMapImage())
|
|
return false;
|
|
|
|
+ if (!do_not_show_context_menu &&
|
|
+ base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks)) {
|
|
+ if (auto* anchor_element = DynamicTo<HTMLAnchorElement>(result.URLElement())) {
|
|
+ MouseEvent& event = *MouseEvent::Create();
|
|
+ event.SetTarget(mouse_event->target());
|
|
+ anchor_element->HandleClick(event, /*do_not_show_context_menu*/true);
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
// Clear any previously set cached results if we are resetting the hit test
|
|
// result.
|
|
image_selection_cached_result_ = nullptr;
|
|
@@ -848,7 +861,7 @@ bool ContextMenuController::ShowContextMenu(
|
|
|
|
SetAutofillData(result.InnerNode(), data);
|
|
|
|
- if (from_touch && !ShouldShowContextMenuFromTouch(data))
|
|
+ if (!base::FeatureList::IsEnabled(features::kShowAlwaysContextMenuOnLinks) && from_touch && !ShouldShowContextMenuFromTouch(data))
|
|
return false;
|
|
|
|
WebLocalFrameImpl* selected_web_frame =
|
|
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.h b/third_party/blink/renderer/core/page/context_menu_controller.h
|
|
--- a/third_party/blink/renderer/core/page/context_menu_controller.h
|
|
+++ b/third_party/blink/renderer/core/page/context_menu_controller.h
|
|
@@ -58,7 +58,7 @@ class CORE_EXPORT ContextMenuController
|
|
|
|
void DocumentDetached(Document*);
|
|
|
|
- void HandleContextMenuEvent(MouseEvent*);
|
|
+ void HandleContextMenuEvent(MouseEvent*, bool do_not_show_context_menu = false);
|
|
void ShowContextMenuAtPoint(LocalFrame*,
|
|
float x,
|
|
float y,
|
|
@@ -129,7 +129,8 @@ class CORE_EXPORT ContextMenuController
|
|
virtual bool ShowContextMenu(LocalFrame*,
|
|
const PhysicalOffset&,
|
|
ui::mojom::blink::MenuSourceType,
|
|
- const MouseEvent* mouse_event);
|
|
+ const MouseEvent* mouse_event,
|
|
+ bool do_not_show_context_menu = false);
|
|
|
|
bool ShouldShowContextMenuFromTouch(const ContextMenuData&);
|
|
|
|
--
|