Skip to content

Commit

Permalink
Added Support to WebView for Zoom Keyboard Shortcuts
Browse files Browse the repository at this point in the history
Bug: 1412052
Change-Id: Ibe449946a7e5db53d38a5b92726f079fbe2f7e18
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4208795
Reviewed-by: Robert Flack <flackr@chromium.org>
Reviewed-by: James Maclean <wjmaclean@chromium.org>
Commit-Queue: Wayne Jackson Jr. <wbjacksonjr@chromium.org>
Reviewed-by: Peter Beverloo <peter@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1104485}
  • Loading branch information
Wayne Jackson Jr authored and Chromium LUCI CQ committed Feb 13, 2023
1 parent 1dee500 commit b06498c
Show file tree
Hide file tree
Showing 17 changed files with 360 additions and 12 deletions.
2 changes: 2 additions & 0 deletions android_webview/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,7 @@ android_library("browser_java") {
"java/src/org/chromium/android_webview/AwGeolocationPermissions.java",
"java/src/org/chromium/android_webview/AwHistogramRecorder.java",
"java/src/org/chromium/android_webview/AwHttpAuthHandler.java",
"java/src/org/chromium/android_webview/AwKeyboardShortcuts.java",
"java/src/org/chromium/android_webview/AwLayoutSizer.java",
"java/src/org/chromium/android_webview/AwNetworkChangeNotifierRegistrationPolicy.java",
"java/src/org/chromium/android_webview/AwOriginVerificationScheduler.java",
Expand Down Expand Up @@ -676,6 +677,7 @@ android_library("browser_java") {
"//components/variations/android:variations_java",
"//components/version_info/android:version_constants_java",
"//components/viz/service:service_java",
"//components/zoom/android:java",
"//content/public/android:content_java",
"//device/gamepad:java",
"//mojo/public/java:system_java",
Expand Down
1 change: 1 addition & 0 deletions android_webview/browser/aw_feature_list.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ const base::Feature* const kFeaturesExposedToJava[] = {
&features::kWebViewRestrictSensitiveContent,
&features::kWebViewUmaUploadQualityOfServiceSetToDefault,
&metrics::kAndroidMetricsAsyncMetricLogging,
&features::kWebViewZoomKeyboardShortcuts,
};

const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
Expand Down
5 changes: 5 additions & 0 deletions android_webview/common/aw_features.cc
Original file line number Diff line number Diff line change
Expand Up @@ -166,5 +166,10 @@ BASE_FEATURE(kWebViewUmaUploadQualityOfServiceSetToDefault,
"WebViewUmaUploadQualityOfServiceSetToDefault",
base::FEATURE_DISABLED_BY_DEFAULT);

// This enables zoom keyboard shortcuts for zoom-in, zoom-out and zoom reset.
BASE_FEATURE(kWebViewZoomKeyboardShortcuts,
"WebViewZoomKeyboardShortcuts",
base::FEATURE_DISABLED_BY_DEFAULT);

} // namespace features
} // namespace android_webview
1 change: 1 addition & 0 deletions android_webview/common/aw_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ BASE_DECLARE_FEATURE(kWebViewXRequestedWithHeaderControl);
extern const base::FeatureParam<int> kWebViewXRequestedWithHeaderMode;
BASE_DECLARE_FEATURE(kWebViewXRequestedWithHeaderManifestAllowList);
BASE_DECLARE_FEATURE(kWebViewUmaUploadQualityOfServiceSetToDefault);
BASE_DECLARE_FEATURE(kWebViewZoomKeyboardShortcuts);

} // namespace features
} // namespace android_webview
Expand Down
1 change: 1 addition & 0 deletions android_webview/java/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ include_rules = [
"+components/safe_browsing/android/java",
"+components/stylus_handwriting/android/java",
"+components/component_updater/android/java",
"+components/zoom/android/java",

"-content/public/android/java",
"+content/public/android/java/src/org/chromium/content_public",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
import org.chromium.components.stylus_handwriting.StylusWritingController;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.components.zoom.ZoomConstants;
import org.chromium.content_public.browser.ChildProcessImportance;
import org.chromium.content_public.browser.ContentViewStatics;
import org.chromium.content_public.browser.GestureListenerManager;
Expand Down Expand Up @@ -2953,7 +2954,7 @@ public boolean zoomIn() {
if (!canZoomIn()) {
return false;
}
zoomBy(1.25f);
zoomBy(ZoomConstants.ZOOM_IN_DELTA);
return true;
}

Expand All @@ -2966,7 +2967,17 @@ public boolean zoomOut() {
if (!canZoomOut()) {
return false;
}
zoomBy(0.8f);
zoomBy(ZoomConstants.ZOOM_OUT_DELTA);
return true;
}

/**
* Resets the zoom to default
*/
// This method uses the term 'zoom' for legacy reasons, but relates
// to what chrome calls the 'page scale factor'.
public boolean zoomReset() {
zoomByInternal(ZoomConstants.ZOOM_RESET_DELTA);
return true;
}

Expand All @@ -2976,11 +2987,15 @@ public boolean zoomOut() {
// This method uses the term 'zoom' for legacy reasons, but relates
// to what chrome calls the 'page scale factor'.
public void zoomBy(float delta) {
if (TRACE) Log.i(TAG, "%s zoomBy=%f", this, delta);
if (isDestroyed(WARN)) return;
if (delta < 0.01f || delta > 100.0f) {
throw new IllegalStateException("zoom delta value outside [0.01, 100] range.");
}
zoomByInternal(delta);
}

private void zoomByInternal(float delta) {
if (TRACE) Log.i(TAG, "%s zoomBy=%f", this, delta);
if (isDestroyed(WARN)) return;
AwContentsJni.get().zoomBy(mNativeAwContents, delta);
}

Expand Down Expand Up @@ -4076,10 +4091,10 @@ public void setLayerType(int layerType, Paint paint) {
}

private void updateHardwareAcceleratedFeaturesToggle() {
mSettings.setEnableSupportedHardwareAcceleratedFeatures(
mIsAttachedToWindow && mContainerView.isHardwareAccelerated()
&& (mLayerType == View.LAYER_TYPE_NONE
|| mLayerType == View.LAYER_TYPE_HARDWARE));
mSettings.setEnableSupportedHardwareAcceleratedFeatures(mIsAttachedToWindow
&& mContainerView.isHardwareAccelerated()
&& (mLayerType == View.LAYER_TYPE_NONE
|| mLayerType == View.LAYER_TYPE_HARDWARE));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.android_webview;

import android.view.KeyEvent;

import org.chromium.android_webview.common.AwFeatures;

/**
* Handles WebView keyboard shortcut events that weren't handled in
* {@link AwWebContentsDelegateAdapter#handleKeyboardEvent(KeyEvent)}.
*/
/**
* TODO(wbjacksonjr) Possibly merge this class with {@link
* org.chromium.chrome.browser.KeyboardShortcuts}
*/
public class AwKeyboardShortcuts {
private static final int CTRL = 1 << 31;
private static final int ALT = 1 << 30;
private static final int SHIFT = 1 << 29;

private AwKeyboardShortcuts() {}

private static int getMetaState(KeyEvent event) {
return (event.isCtrlPressed() ? CTRL : 0) | (event.isAltPressed() ? ALT : 0)
| (event.isShiftPressed() ? SHIFT : 0);
}

public static boolean onKeyDown(KeyEvent event, AwContents awContents) {
int keyCode = event.getKeyCode();
if (event.getRepeatCount() != 0 || event.getAction() != KeyEvent.ACTION_DOWN
|| KeyEvent.isModifierKey(keyCode)) {
return false;
}

int metaState = getMetaState(event);
int keyCodeAndMeta = keyCode | metaState;

if (AwFeatureList.isEnabled(AwFeatures.WEBVIEW_ZOOM_KEYBOARD_SHORTCUTS)) {
return handleZoomShortcut(awContents, keyCodeAndMeta);
}
return false;
}

private static boolean handleZoomShortcut(AwContents awContents, int keyCodeAndMeta) {
// We want to return true even if zoom is not supported as technically the keyboard shortcut
// was handled
boolean supportsZoom = awContents.getSettings().supportZoom();
switch (keyCodeAndMeta) {
case CTRL | KeyEvent.KEYCODE_PLUS:
case CTRL | KeyEvent.KEYCODE_EQUALS:
case CTRL | SHIFT | KeyEvent.KEYCODE_PLUS:
case CTRL | SHIFT | KeyEvent.KEYCODE_EQUALS:
case KeyEvent.KEYCODE_ZOOM_IN:
if (supportsZoom) {
awContents.zoomIn();
}
return true;
case CTRL | KeyEvent.KEYCODE_MINUS:
case KeyEvent.KEYCODE_ZOOM_OUT:
if (supportsZoom) {
awContents.zoomOut();
}
return true;
case CTRL | KeyEvent.KEYCODE_0:
if (supportsZoom) {
awContents.zoomReset();
}
return true;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public void handleKeyboardEvent(KeyEvent event) {
break;
}
if (direction != 0 && tryToMoveFocus(direction)) return;
if (AwKeyboardShortcuts.onKeyDown(event, mAwContents)) return;
}
handleMediaKey(event);
mContentsClient.onUnhandledKeyEvent(event);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,8 @@ private ProductionSupportedFlagList() {}
Flag.baseFeature(BlinkFeatures.STYLUS_RICH_GESTURES,
"When enabled, stylus input can be used to draw rich gestures which "
+ "affect text in editable web content."),
Flag.baseFeature(AwFeatures.WEBVIEW_ZOOM_KEYBOARD_SHORTCUTS,
"Enables WebView to use zoom keyboard shortcuts on hardware keyboards."),
// Add new commandline switches and features above. The final entry should have a
// trailing comma for cleaner diffs.
};
Expand Down

0 comments on commit b06498c

Please sign in to comment.