diff --git a/android/java/apk_for_test.flags b/android/java/apk_for_test.flags index 15cca6c33dc..1491363deb0 100644 --- a/android/java/apk_for_test.flags +++ b/android/java/apk_for_test.flags @@ -869,3 +869,11 @@ -keep class org.chromium.chrome.browser.compositor.layouts.BraveToolbarSwipeLayout { public (...); } + +-keep class org.chromium.components.embedder_support.view.ContentView { + protected (...); +} + +-keep class org.chromium.components.embedder_support.view.BraveContentView { + protected (...); +} diff --git a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java index 2a942c408d4..c241e2b7750 100644 --- a/android/javatests/org/chromium/chrome/browser/BytecodeTest.java +++ b/android/javatests/org/chromium/chrome/browser/BytecodeTest.java @@ -141,8 +141,10 @@ import org.chromium.components.omnibox.action.OmniboxActionDelegate; import org.chromium.components.permissions.PermissionDialogController; import org.chromium.components.signin.base.AccountInfo; import org.chromium.content_public.browser.BrowserContextHandle; +import org.chromium.content_public.browser.WebContents; import org.chromium.ui.ViewProvider; import org.chromium.ui.base.ActivityWindowAndroid; +import org.chromium.ui.base.EventOffsetHandler; import org.chromium.ui.base.IntentRequestTracker; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowDelegate; @@ -1386,6 +1388,13 @@ public class BytecodeTest { BrowserControlsStateProvider.class, LayoutManager.class, TopUiThemeColorProvider.class)); + Assert.assertTrue( + constructorsMatch( + "org/chromium/components/embedder_support/view/ContentView", + "org/chromium/components/embedder_support/view/BraveContentView", + Context.class, + EventOffsetHandler.class, + WebContents.class)); } @Test diff --git a/build/android/bytecode/BUILD.gn b/build/android/bytecode/BUILD.gn index b84e289a01e..397246abab4 100644 --- a/build/android/bytecode/BUILD.gn +++ b/build/android/bytecode/BUILD.gn @@ -35,6 +35,7 @@ java_binary("java_bytecode_rewriter") { "//brave/build/android/bytecode/java/org/brave/bytecode/BraveClassVisitor.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveCommandLineInitUtilClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveContentSettingsResourcesClassAdapter.java", + "//brave/build/android/bytecode/java/org/brave/bytecode/BraveContentViewClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveCustomizationProviderDelegateImplClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveDefaultBrowserPromoUtilsClassAdapter.java", "//brave/build/android/bytecode/java/org/brave/bytecode/BraveDownloadMessageUiControllerImplClassAdapter.java", diff --git a/build/android/bytecode/bytecode_rewriter.gni b/build/android/bytecode/bytecode_rewriter.gni index 861786d1c99..fcfc62d960b 100644 --- a/build/android/bytecode/bytecode_rewriter.gni +++ b/build/android/bytecode/bytecode_rewriter.gni @@ -40,6 +40,7 @@ brave_bytecode_jars = [ "obj/chrome/browser/ui/android/toolbar/java.javac.jar", "obj/components/browser_ui/notifications/android/java.javac.jar", "obj/components/browser_ui/site_settings/android/java.javac.jar", + "obj/components/embedder_support/android/content_view_java.javac.jar", "obj/components/external_intents/android/java.javac.jar", "obj/components/permissions/android/java.javac.jar", "obj/components/sync/android/sync_java.javac.jar", diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java index c8380c462b1..a12cebb130e 100644 --- a/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java +++ b/build/android/bytecode/java/org/brave/bytecode/BraveClassAdapter.java @@ -34,6 +34,7 @@ public class BraveClassAdapter { chain = new BraveChromeContextMenuPopulatorAdapter(chain); chain = new BraveCommandLineInitUtilClassAdapter(chain); chain = new BraveContentSettingsResourcesClassAdapter(chain); + chain = new BraveContentViewClassAdapter(chain); chain = new BraveCustomizationProviderDelegateImplClassAdapter(chain); chain = new BraveDefaultBrowserPromoUtilsClassAdapter(chain); chain = new BraveDownloadMessageUiControllerImplClassAdapter(chain); diff --git a/build/android/bytecode/java/org/brave/bytecode/BraveContentViewClassAdapter.java b/build/android/bytecode/java/org/brave/bytecode/BraveContentViewClassAdapter.java new file mode 100644 index 00000000000..8111c597a43 --- /dev/null +++ b/build/android/bytecode/java/org/brave/bytecode/BraveContentViewClassAdapter.java @@ -0,0 +1,21 @@ +/* Copyright (c) 2024 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 BraveContentViewClassAdapter extends BraveClassVisitor { + static String sContentViewClassName = + "org/chromium/components/embedder_support/view/ContentView"; + static String sBraveContentViewClassName = + "org/chromium/components/embedder_support/view/BraveContentView"; + + public BraveContentViewClassAdapter(ClassVisitor visitor) { + super(visitor); + + redirectConstructor(sContentViewClassName, sBraveContentViewClassName); + } +} diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/BraveContentView.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/BraveContentView.java new file mode 100644 index 00000000000..779069fee98 --- /dev/null +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/BraveContentView.java @@ -0,0 +1,37 @@ +/* Copyright (c) 2024 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.components.embedder_support.view; + +import android.content.Context; +import android.view.ViewStructure; + +import org.chromium.base.JavaExceptionReporter; +import org.chromium.base.task.PostTask; +import org.chromium.base.task.TaskTraits; +import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.base.EventOffsetHandler; + +/** That class extends upstream's ContentView.java to prevent a browser process crash */ +public class BraveContentView extends ContentView { + protected BraveContentView( + Context context, EventOffsetHandler eventOffsetHandler, WebContents webContents) { + super(context, eventOffsetHandler, webContents); + } + + @Override + public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) { + try { + super.onProvideAutofillVirtualStructure(structure, flags); + } catch (NullPointerException exception) { + // We still want the stack to be reported with a hope to fix that issue + // one day. See https://github.com/brave/brave-browser/issues/37942 for + // details + PostTask.postTask( + TaskTraits.UI_BEST_EFFORT, + () -> JavaExceptionReporter.reportException(exception)); + } + } +} diff --git a/components/embedder_support/android/java_sources.gni b/components/embedder_support/android/java_sources.gni index cde2b8ffa83..8b5b6a85a27 100644 --- a/components/embedder_support/android/java_sources.gni +++ b/components/embedder_support/android/java_sources.gni @@ -3,4 +3,7 @@ # 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/. -brave_components_embedder_support_java_sources = [ "//brave/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/BraveUrlConstants.java" ] +brave_components_embedder_support_java_sources = [ + "//brave/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/BraveUrlConstants.java", + "//brave/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/BraveContentView.java", +]