Commit 1f177475 authored by dfalcantara's avatar dfalcantara Committed by Commit bot

Defer deferred startup if native isn't loaded

There's a race condition that's causing a tab to finish
loading before onStartWithNative has successfully run.
It's not entirely clear where the race condition lies
because the startup pathway is complicated, so prevent
deferred startup from running until native has loaded.

BUG=711708

Review-Url: https://codereview.chromium.org/2855043002
Cr-Commit-Position: refs/heads/master@{#469013}
parent 996f592a
...@@ -226,7 +226,12 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -226,7 +226,12 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
protected IntentHandler mIntentHandler; protected IntentHandler mIntentHandler;
/** Set if {@link #postDeferredStartupIfNeeded()} is called before native has loaded. */
private boolean mDeferredStartupQueued;
/** Whether or not {@link #postDeferredStartupIfNeeded()} has already successfully run. */
private boolean mDeferredStartupPosted; private boolean mDeferredStartupPosted;
private boolean mTabModelsInitialized; private boolean mTabModelsInitialized;
private boolean mNativeInitialized; private boolean mNativeInitialized;
private boolean mRemoveWindowBackgroundDone; private boolean mRemoveWindowBackgroundDone;
...@@ -764,6 +769,8 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -764,6 +769,8 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
@Override @Override
public void onStartWithNative() { public void onStartWithNative() {
assert mNativeInitialized : "onStartWithNative was called before native was initialized.";
super.onStartWithNative(); super.onStartWithNative();
UpdateMenuItemHelper.getInstance().onStart(); UpdateMenuItemHelper.getInstance().onStart();
ChromeActivitySessionTracker.getInstance().onStartWithNative(); ChromeActivitySessionTracker.getInstance().onStartWithNative();
...@@ -779,7 +786,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -779,7 +786,7 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
// #onPageLoadFinished() and #onCrash(). If we are not actively loading a tab (e.g. // #onPageLoadFinished() and #onCrash(). If we are not actively loading a tab (e.g.
// in Android N multi-instance, which is created by re-parenting an existing tab), // in Android N multi-instance, which is created by re-parenting an existing tab),
// ensure onDeferredStartup() gets called by calling postDeferredStartupIfNeeded() here. // ensure onDeferredStartup() gets called by calling postDeferredStartupIfNeeded() here.
if (getActivityTab() == null || !getActivityTab().isLoading()) { if (mDeferredStartupQueued || getActivityTab() == null || !getActivityTab().isLoading()) {
postDeferredStartupIfNeeded(); postDeferredStartupIfNeeded();
} }
} }
...@@ -2010,6 +2017,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity ...@@ -2010,6 +2017,13 @@ public abstract class ChromeActivity extends AsyncInitializationActivity
} }
protected final void postDeferredStartupIfNeeded() { protected final void postDeferredStartupIfNeeded() {
if (!mNativeInitialized) {
// Native hasn't loaded yet. Queue it up for later.
mDeferredStartupQueued = true;
return;
}
mDeferredStartupQueued = false;
if (!mDeferredStartupPosted) { if (!mDeferredStartupPosted) {
mDeferredStartupPosted = true; mDeferredStartupPosted = true;
RecordHistogram.recordLongTimesHistogram( RecordHistogram.recordLongTimesHistogram(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment