Backed out 2 changesets (bug 1557096, bug 1565410) for multiple regressions linked to Bug 1557096. a=backout CLOSED TREE
authorGurzau Raul <rgurzau@mozilla.com>
Wed, 17 Jul 2019 00:07:39 +0300
changeset 482927 0fb761cd8fa448eb511e8b2520ede5a3230853ed
parent 482877 b4b26439b03d956dda7402d32a6d9745c37d4fcf
child 482928 1610ccfc9e984a9bf994a869465b7cca87643825
push id113699
push userrgurzau@mozilla.com
push dateWed, 17 Jul 2019 03:57:10 +0000
treeherdermozilla-inbound@8fd4efa75b55 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbackout
bugs1557096, 1565410
milestone70.0a1
backs outd35d90d0322baf6a93d2b8688bf1cdd5b9603474
4629e855ea33d85f8adcc6e76264ac779b799bd1
first release with
nightly linux32
0fb761cd8fa4 / 70.0a1 / 20190716211651 / files
nightly linux64
0fb761cd8fa4 / 70.0a1 / 20190716211651 / files
nightly mac
0fb761cd8fa4 / 70.0a1 / 20190716211651 / files
nightly win32
0fb761cd8fa4 / 70.0a1 / 20190716211651 / files
nightly win64
0fb761cd8fa4 / 70.0a1 / 20190716211651 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Backed out 2 changesets (bug 1557096, bug 1565410) for multiple regressions linked to Bug 1557096. a=backout CLOSED TREE Backed out changeset d35d90d0322b (bug 1565410) Backed out changeset 4629e855ea33 (bug 1557096)
build.gradle
mobile/android/geckoview/api.txt
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md
mobile/android/modules/geckoview/ContentCrashHandler.jsm
mobile/android/modules/geckoview/GeckoViewContent.jsm
--- a/build.gradle
+++ b/build.gradle
@@ -78,17 +78,17 @@ buildscript {
 
     if (gradle.mozconfig.substs.MOZ_ANDROID_GOOGLE_PLAY_SERVICES) {
         ext.google_play_services_version = '15.0.1'
         ext.google_play_services_cast_version = '16.0.0'
         ext.google_play_services_fido_version = '17.0.0'
     }
 
     dependencies {
-        classpath 'org.mozilla.apilint:apilint:0.2.2'
+        classpath 'org.mozilla.apilint:apilint:0.2.1'
         classpath 'com.android.tools.build:gradle:3.1.4'
         classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.2'
         classpath 'org.apache.commons:commons-exec:1.3'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
     }
 }
 
 // A stream that processes bytes line by line, prepending a tag before sending
--- a/mobile/android/geckoview/api.txt
+++ b/mobile/android/geckoview/api.txt
@@ -51,16 +51,19 @@ import java.lang.String;
 import java.lang.Throwable;
 import java.lang.Void;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.AbstractSequentialList;
 import java.util.List;
 import java.util.Map;
 import org.json.JSONObject;
+import org.mozilla.gecko.util.BundleEventListener;
+import org.mozilla.gecko.util.EventCallback;
+import org.mozilla.gecko.util.GeckoBundle;
 import org.mozilla.geckoview.AllowOrDeny;
 import org.mozilla.geckoview.CompositorController;
 import org.mozilla.geckoview.ContentBlocking;
 import org.mozilla.geckoview.DynamicToolbarAnimator;
 import org.mozilla.geckoview.GeckoDisplay;
 import org.mozilla.geckoview.GeckoResponse;
 import org.mozilla.geckoview.GeckoResult;
 import org.mozilla.geckoview.GeckoRuntime;
@@ -470,17 +473,16 @@ package org.mozilla.geckoview {
   public static interface GeckoSession.ContentDelegate {
     method @UiThread default public void onCloseRequest(@NonNull GeckoSession);
     method @UiThread default public void onContextMenu(@NonNull GeckoSession, int, int, @NonNull GeckoSession.ContentDelegate.ContextElement);
     method @UiThread default public void onCrash(@NonNull GeckoSession);
     method @UiThread default public void onExternalResponse(@NonNull GeckoSession, @NonNull GeckoSession.WebResponseInfo);
     method @UiThread default public void onFirstComposite(@NonNull GeckoSession);
     method @UiThread default public void onFocusRequest(@NonNull GeckoSession);
     method @UiThread default public void onFullScreen(@NonNull GeckoSession, boolean);
-    method @UiThread default public void onKill(@NonNull GeckoSession);
     method @UiThread default public void onTitleChange(@NonNull GeckoSession, @Nullable String);
     method @UiThread default public void onWebAppManifest(@NonNull GeckoSession, @NonNull JSONObject);
   }
 
   public static class GeckoSession.ContentDelegate.ContextElement {
     ctor protected ContextElement(@Nullable String, @Nullable String, @Nullable String, @Nullable String, @NonNull String, @Nullable String);
     field public static final int TYPE_AUDIO = 3;
     field public static final int TYPE_IMAGE = 1;
@@ -1101,17 +1103,17 @@ package org.mozilla.geckoview {
     field @NonNull public final WebExtension.MessageSender sender;
   }
 
   @UiThread public static interface WebExtension.PortDelegate {
     method @NonNull default public void onDisconnect(@NonNull WebExtension.Port);
     method default public void onPortMessage(@NonNull Object, @NonNull WebExtension.Port);
   }
 
-  public class WebExtensionController {
+  public class WebExtensionController implements BundleEventListener {
     ctor protected WebExtensionController(GeckoRuntime, WebExtensionEventDispatcher);
     method @UiThread @Nullable public WebExtensionController.TabDelegate getTabDelegate();
     method @UiThread public void setTabDelegate(@Nullable WebExtensionController.TabDelegate);
   }
 
   public static interface WebExtensionController.TabDelegate {
     method @UiThread @Nullable default public GeckoResult<GeckoSession> onNewTab(@Nullable WebExtension, @Nullable String);
   }
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt
@@ -1,33 +1,29 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
  * Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 package org.mozilla.geckoview.test
 
-import android.app.ActivityManager
-import android.content.Context
 import android.graphics.Matrix
 import android.graphics.SurfaceTexture
 import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.os.LocaleList
-import android.os.Process
 import org.mozilla.geckoview.AllowOrDeny
 import org.mozilla.geckoview.GeckoResult
 import org.mozilla.geckoview.GeckoSession
 import org.mozilla.geckoview.GeckoSession.NavigationDelegate.LoadRequest
 import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.AssertCalled
 import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.IgnoreCrash
 import org.mozilla.geckoview.test.rule.GeckoSessionTestRule.WithDisplay
 import org.mozilla.geckoview.test.util.Callbacks
 
-import android.support.annotation.AnyThread
 import android.support.test.filters.MediumTest
 import android.support.test.filters.SdkSuppress
 import android.support.test.runner.AndroidJUnit4
 import android.text.InputType
 import android.util.Pair
 import android.util.SparseArray
 import android.view.Surface
 import android.view.View
@@ -36,17 +32,16 @@ import android.view.autofill.AutofillId
 import android.view.autofill.AutofillValue
 import android.widget.EditText
 import org.hamcrest.Matchers.*
 import org.json.JSONArray
 import org.json.JSONObject
 import org.junit.Assume.assumeThat
 import org.junit.Test
 import org.junit.runner.RunWith
-import org.mozilla.gecko.GeckoAppShell
 import org.mozilla.geckoview.test.rule.GeckoSessionTestRule
 
 @RunWith(AndroidJUnit4::class)
 @MediumTest
 class ContentDelegateTest : BaseSessionTest() {
     @Test fun titleChange() {
         sessionRule.session.loadTestPath(TITLE_CHANGE_HTML_PATH)
 
@@ -99,17 +94,17 @@ class ContentDelegateTest : BaseSessionT
 
         mainSession.loadUri(CONTENT_CRASH_URL)
         mainSession.waitUntilCalled(object : Callbacks.ContentDelegate {
             @AssertCalled(count = 1)
             override fun onCrash(session: GeckoSession) {
                 assertThat("Session should be closed after a crash",
                            session.isOpen, equalTo(false))
             }
-        })
+        });
 
         // Recover immediately
         mainSession.open()
         mainSession.loadTestPath(HELLO_HTML_PATH)
         mainSession.waitUntilCalled(object: Callbacks.ProgressDelegate {
             @AssertCalled(count = 1)
             override fun onPageStop(session: GeckoSession, success: Boolean) {
                 assertThat("Page should load successfully", success, equalTo(true))
@@ -170,72 +165,16 @@ class ContentDelegateTest : BaseSessionT
                 @AssertCalled(count = 1)
                 override fun onCrash(session: GeckoSession) {
                     remainingSessions.remove(session)
                 }
             })
         }
     }
 
-    @AnyThread
-    fun killContentProcess() {
-        val context = GeckoAppShell.getApplicationContext()
-        val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
-        for (info in manager.runningAppProcesses) {
-            if (info.processName.endsWith(":tab")) {
-                Process.killProcess(info.pid)
-            }
-        }
-    }
-
-    @IgnoreCrash
-    @Test fun killContent() {
-        assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
-        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.isX86,
-                equalTo(false))
-
-        killContentProcess()
-        mainSession.waitUntilCalled(object : Callbacks.ContentDelegate {
-            @AssertCalled(count = 1)
-            override fun onKill(session: GeckoSession) {
-                assertThat("Session should be closed after being killed",
-                        session.isOpen, equalTo(false))
-            }
-        })
-
-        mainSession.open()
-        mainSession.loadTestPath(HELLO_HTML_PATH)
-        mainSession.waitUntilCalled(object : Callbacks.ProgressDelegate {
-            @AssertCalled(count = 1)
-            override fun onPageStop(session: GeckoSession, success: Boolean) {
-                assertThat("Page should load successfully", success, equalTo(true))
-            }
-        })
-    }
-
-    @IgnoreCrash
-    @Test fun killContentMultipleSessions() {
-        assumeThat(sessionRule.env.isMultiprocess, equalTo(true))
-        assumeThat(sessionRule.env.isDebugBuild && sessionRule.env.isX86,
-                equalTo(false))
-
-        val newSession = sessionRule.createOpenSession()
-        killContentProcess()
-
-        val remainingSessions = mutableListOf(newSession, mainSession)
-        while (remainingSessions.isNotEmpty()) {
-            sessionRule.waitUntilCalled(object : Callbacks.ContentDelegate {
-                @AssertCalled(count = 1)
-                override fun onKill(session: GeckoSession) {
-                    remainingSessions.remove(session)
-                }
-            })
-        }
-    }
-
     // TextInputDelegateTest is parameterized, so we put this test under ContentDelegateTest.
     @SdkSuppress(minSdkVersion = 23)
     @Test fun autofill() {
         // Test parts of the Oreo auto-fill API; there is another autofill test in
         // SessionAccessibility for a11y auto-fill support.
         mainSession.loadTestPath(FORMS_HTML_PATH)
         // Wait for the auto-fill nodes to populate.
         sessionRule.waitUntilCalled(object : Callbacks.TextInputDelegate {
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java
@@ -98,17 +98,17 @@ public class GeckoSessionTestRule implem
         try {
             sOnPageStart = GeckoSession.ProgressDelegate.class.getMethod(
                     "onPageStart", GeckoSession.class, String.class);
             sOnPageStop = GeckoSession.ProgressDelegate.class.getMethod(
                     "onPageStop", GeckoSession.class, boolean.class);
             sOnNewSession = GeckoSession.NavigationDelegate.class.getMethod(
                     "onNewSession", GeckoSession.class, String.class);
             sOnCrash = GeckoSession.ContentDelegate.class.getMethod(
-                    "onKill", GeckoSession.class);
+                    "onCrash", GeckoSession.class);
         } catch (final NoSuchMethodException e) {
             throw new RuntimeException(e);
         }
     }
 
     /**
      * Specify the timeout for any of the wait methods, in milliseconds, relative to
      * {@link Environment#DEFAULT_TIMEOUT_MILLIS}. When the default timeout scales to account
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/util/RuntimeCreator.java
@@ -76,18 +76,21 @@ public class RuntimeCreator {
             return sRuntime;
         }
 
         final GeckoRuntimeSettings.Builder runtimeSettingsBuilder =
                 new GeckoRuntimeSettings.Builder();
         runtimeSettingsBuilder.arguments(new String[]{"-purgecaches"})
                 .extras(InstrumentationRegistry.getArguments())
                 .remoteDebuggingEnabled(true)
-                .consoleOutput(true)
-                .crashHandler(TestCrashHandler.class);
+                .consoleOutput(true);
+
+        if (new Environment().isAutomation()) {
+            runtimeSettingsBuilder.crashHandler(TestCrashHandler.class);
+        }
 
         TEST_SUPPORT_WEB_EXTENSION.setMessageDelegate(sMessageDelegate, "browser");
 
         sRuntime = GeckoRuntime.create(
                 InstrumentationRegistry.getTargetContext(),
                 runtimeSettingsBuilder.build());
 
         registerTestSupport();
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
@@ -189,17 +189,17 @@ public final class GeckoRuntime implemen
         @Override
         public void handleMessage(final String event, final GeckoBundle message,
                                   final EventCallback callback) {
             final Class<?> crashHandler = GeckoRuntime.this.getSettings().mCrashHandler;
 
             if ("Gecko:Exited".equals(event) && mDelegate != null) {
                 mDelegate.onShutdown();
                 EventDispatcher.getInstance().unregisterUiThreadListener(mEventListener, "Gecko:Exited");
-            } else if ("GeckoView:ContentCrashReport".equals(event) && crashHandler != null) {
+            } else if ("GeckoView:ContentCrash".equals(event) && crashHandler != null) {
                 final Context context = GeckoAppShell.getApplicationContext();
                 Intent i = new Intent(ACTION_CRASHED, null,
                         context, crashHandler);
                 i.putExtra(EXTRA_MINIDUMP_PATH, message.getString(EXTRA_MINIDUMP_PATH));
                 i.putExtra(EXTRA_EXTRAS_PATH, message.getString(EXTRA_EXTRAS_PATH));
                 i.putExtra(EXTRA_MINIDUMP_SUCCESS, true);
                 i.putExtra(EXTRA_CRASH_FATAL, message.getBoolean(EXTRA_CRASH_FATAL, true));
 
@@ -239,17 +239,17 @@ public final class GeckoRuntime implemen
         final Class<?> crashHandler = settings.getCrashHandler();
         if (crashHandler != null) {
             try {
                 final ServiceInfo info = context.getPackageManager().getServiceInfo(new ComponentName(context, crashHandler), 0);
                 if (info.processName.equals(getProcessName(context))) {
                     throw new IllegalArgumentException("Crash handler service must run in a separate process");
                 }
 
-                EventDispatcher.getInstance().registerUiThreadListener(mEventListener, "GeckoView:ContentCrashReport");
+                EventDispatcher.getInstance().registerUiThreadListener(mEventListener, "GeckoView:ContentCrash");
 
                 flags |= GeckoThread.FLAG_ENABLE_NATIVE_CRASHREPORTER;
             } catch (PackageManager.NameNotFoundException e) {
                 throw new IllegalArgumentException("Crash handler must be registered as a service");
             }
         }
 
         GeckoAppShell.useMaxScreenDepth(settings.getUseMaxScreenDepth());
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -435,38 +435,35 @@ public class GeckoSession implements Par
         mWebExtensionListener.setDelegate(webExtension, delegate, nativeApp);
     }
 
     private final GeckoSessionHandler<ContentDelegate> mContentHandler =
         new GeckoSessionHandler<ContentDelegate>(
             "GeckoViewContent", this,
             new String[]{
                 "GeckoView:ContentCrash",
-                "GeckoView:ContentKill",
                 "GeckoView:ContextMenu",
                 "GeckoView:DOMTitleChanged",
                 "GeckoView:DOMWindowClose",
                 "GeckoView:ExternalResponse",
                 "GeckoView:FocusRequest",
                 "GeckoView:FullScreenEnter",
                 "GeckoView:FullScreenExit",
                 "GeckoView:WebAppManifest",
             }
         ) {
             @Override
             public void handleMessage(final ContentDelegate delegate,
                                       final String event,
                                       final GeckoBundle message,
                                       final EventCallback callback) {
+
                 if ("GeckoView:ContentCrash".equals(event)) {
                     close();
                     delegate.onCrash(GeckoSession.this);
-                } else if ("GeckoView:ContentKill".equals(event)) {
-                    close();
-                    delegate.onKill(GeckoSession.this);
                 } else if ("GeckoView:ContextMenu".equals(event)) {
                     final ContentDelegate.ContextElement elem =
                         new ContentDelegate.ContextElement(
                             message.getString("baseUri"),
                             message.getString("uri"),
                             message.getString("title"),
                             message.getString("alt"),
                             message.getString("elementType"),
@@ -3121,35 +3118,22 @@ public class GeckoSession implements Par
 
         /**
          * The content process hosting this GeckoSession has crashed. The
          * GeckoSession is now closed and unusable. You may call
          * {@link #open(GeckoRuntime)} to recover the session, but no state
          * is preserved. Most applications will want to call
          * {@link #loadUri(Uri)} or {@link #restoreState(SessionState)} at this point.
          *
-         * @param session The GeckoSession for which the content process has crashed.
+         * @param session The GeckoSession that crashed.
          */
         @UiThread
         default void onCrash(@NonNull GeckoSession session) {}
 
         /**
-         * The content process hosting this GeckoSession has been killed. The
-         * GeckoSession is now closed and unusable. You may call
-         * {@link #open(GeckoRuntime)} to recover the session, but no state
-         * is preserved. Most applications will want to call
-         * {@link #loadUri(Uri)} or {@link #restoreState(SessionState)} at this point.
-         *
-         * @param session The GeckoSession for which the content process has been killed.
-         */
-        @UiThread
-        default void onKill(@NonNull GeckoSession session) {}
-
-
-        /**
          * Notification that the first content composition has occurred.
          * This callback is invoked for the first content composite after either
          * a start or a restart of the compositor.
          * @param session The GeckoSession that had a first paint event.
          */
         @UiThread
         default void onFirstComposite(@NonNull GeckoSession session) {}
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebExtensionController.java
@@ -3,17 +3,17 @@ package org.mozilla.geckoview;
 import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
 
 import org.mozilla.gecko.EventDispatcher;
 import org.mozilla.gecko.util.BundleEventListener;
 import org.mozilla.gecko.util.EventCallback;
 import org.mozilla.gecko.util.GeckoBundle;
 
-public class WebExtensionController {
+public class WebExtensionController implements BundleEventListener {
     public interface TabDelegate {
         /**
          * Called when tabs.create is invoked, this method returns a *newly-created* session
          * that GeckoView will use to load the requested page on. If the returned value
          * is null the page will not be opened.
          *
          * @param source An instance of {@link WebExtension} or null if extension was not registered
          *               with GeckoRuntime.registerWebextension
@@ -23,48 +23,35 @@ public class WebExtensionController {
         default GeckoResult<GeckoSession> onNewTab(@Nullable WebExtension source, @Nullable String uri) {
             return null;
         }
     }
 
     private GeckoRuntime mRuntime;
     private WebExtensionEventDispatcher mDispatcher;
     private TabDelegate mTabDelegate;
-    private final EventListener mEventListener;
 
     protected WebExtensionController(final GeckoRuntime runtime, final WebExtensionEventDispatcher dispatcher) {
         mRuntime = runtime;
         mDispatcher = dispatcher;
-        mEventListener = new EventListener();
-    }
-
-    private class EventListener implements BundleEventListener {
-        @Override
-        public void handleMessage(final String event, final GeckoBundle message,
-                                  final EventCallback callback) {
-            if ("GeckoView:WebExtension:NewTab".equals(event)) {
-                newTab(message, callback);
-                return;
-            }
-        }
     }
 
     @UiThread
     public void setTabDelegate(final @Nullable TabDelegate delegate) {
         if (delegate == null) {
             if (mTabDelegate != null) {
                 EventDispatcher.getInstance().unregisterUiThreadListener(
-                        mEventListener,
+                        this,
                         "GeckoView:WebExtension:NewTab"
                 );
             }
         } else {
             if (mTabDelegate == null) {
                 EventDispatcher.getInstance().registerUiThreadListener(
-                        mEventListener,
+                        this,
                         "GeckoView:WebExtension:NewTab"
                 );
             }
         }
         mTabDelegate = delegate;
     }
 
     @UiThread
@@ -97,9 +84,18 @@ public class WebExtensionController {
                 throw new IllegalArgumentException("Must use an unopened GeckoSession instance");
             }
 
             session.open(mRuntime);
 
             callback.sendSuccess(session.getId());
         });
     }
+
+    @Override
+    public void handleMessage(final String event, final GeckoBundle message,
+                              final EventCallback callback) {
+        if ("GeckoView:WebExtension:NewTab".equals(event)) {
+            newTab(message, callback);
+            return;
+        }
+    }
 }
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/doc-files/CHANGELOG.md
@@ -29,19 +29,16 @@ exclude: true
 [69.2]: ../GeckoSession.html#setMessageDelegate-org.mozilla.geckoview.WebExtension-org.mozilla.geckoview.WebExtension.MessageDelegate-java.lang.String-
 [69.3]: ../WebExtension.html
 [69.4]: ../WebExtension.MessageDelegate.html
 
 - Added `WebExtensionController` and `TabDelegate` to handle
   [`browser.tabs.create`][69.6] calls by WebExtensions.
 
 [69.6]: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create
-[69.7]: ../GeckoSession.ContentDelegate.html#onKill
-
-- Created `onKill` to `ContentDelegate` to differentiate from crashes.
 
 ## v68
 - Added [`GeckoRuntime#configurationChanged`][68.1] to notify the device
   configuration has changed.
 
 [68.1]: ../GeckoRuntime.html#configurationChanged
 
 - Added `onSessionStateChange` to [`ProgressDelegate`][68.2] and removed `saveState`.
@@ -345,9 +342,9 @@ exclude: true
 [65.23]: ../GeckoSession.FinderResult.html
 
 - Update [`CrashReporter#sendCrashReport`][65.24] to return the crash ID as a
   [`GeckoResult<String>`][65.25].
 
 [65.24]: ../CrashReporter.html#sendCrashReport-android.content.Context-android.os.Bundle-java.lang.String-
 [65.25]: ../GeckoResult.html
 
-[api-version]: a48d987bbc9301577c072823070ff5541e0fa211
+[api-version]: 3d726407275d906a54c1fc86eb92f2c3bfaaa3d0
--- a/mobile/android/modules/geckoview/ContentCrashHandler.jsm
+++ b/mobile/android/modules/geckoview/ContentCrashHandler.jsm
@@ -60,16 +60,16 @@ var ContentCrashHandler = {
         .add(1);
       return;
     }
 
     debug`Notifying content process crash, dump ID ${dumpID}`;
     const [minidumpPath, extrasPath] = getPendingMinidump(dumpID);
 
     EventDispatcher.instance.sendRequest({
-      type: "GeckoView:ContentCrashReport",
+      type: "GeckoView:ContentCrash",
       minidumpPath,
       extrasPath,
       success: true,
       fatal: false,
     });
   },
 };
--- a/mobile/android/modules/geckoview/GeckoViewContent.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewContent.jsm
@@ -55,17 +55,16 @@ class GeckoViewContent extends GeckoView
 
     this.messageManager.addMessageListener("GeckoView:DOMFullscreenExit", this);
     this.messageManager.addMessageListener(
       "GeckoView:DOMFullscreenRequest",
       this
     );
 
     Services.obs.addObserver(this, "oop-frameloader-crashed");
-    Services.obs.addObserver(this, "ipc:content-shutdown");
   }
 
   onDisable() {
     this.window.removeEventListener(
       "MozDOMFullscreen:Entered",
       this,
       /* capture */ true
     );
@@ -85,17 +84,16 @@ class GeckoViewContent extends GeckoView
       this
     );
     this.messageManager.removeMessageListener(
       "GeckoView:DOMFullscreenRequest",
       this
     );
 
     Services.obs.removeObserver(this, "oop-frameloader-crashed");
-    Services.obs.removeObserver(this, "ipc:content-shutdown");
   }
 
   // Bundle event handler.
   onEvent(aEvent, aData, aCallback) {
     debug`onEvent: event=${aEvent}, data=${aData}`;
 
     switch (aEvent) {
       case "GeckoViewContent:ExitFullScreen":
@@ -192,48 +190,27 @@ class GeckoViewContent extends GeckoView
         this.window.windowUtils.remoteFrameFullscreenChanged(aMsg.target);
         break;
     }
   }
 
   // nsIObserver event handler
   observe(aSubject, aTopic, aData) {
     debug`observe: ${aTopic}`;
-    this._contentCrashed = false;
-    const browser = aSubject.ownerElement;
 
     switch (aTopic) {
       case "oop-frameloader-crashed": {
+        const browser = aSubject.ownerElement;
         if (!browser || browser != this.browser) {
           return;
         }
-        this.window.setTimeout(() => {
-          if (this._contentCrashed) {
-            this.eventDispatcher.sendRequest({
-              type: "GeckoView:ContentCrash",
-            });
-          } else {
-            this.eventDispatcher.sendRequest({
-              type: "GeckoView:ContentKill",
-            });
-          }
-        }, 250);
-        break;
-      }
-      case "ipc:content-shutdown": {
-        aSubject.QueryInterface(Ci.nsIPropertyBag2);
-        if (aSubject.get("dumpID")) {
-          if (
-            browser &&
-            aSubject.get("childID") != browser.frameLoader.childID
-          ) {
-            return;
-          }
-          this._contentCrashed = true;
-        }
+
+        this.eventDispatcher.sendRequest({
+          type: "GeckoView:ContentCrash",
+        });
         break;
       }
     }
   }
 
   _findInPage(aData, aCallback) {
     debug`findInPage: data=${aData} callback=${aCallback && "non-null"}`;