Commit 1bfc40f9 authored by Patrick Noland's avatar Patrick Noland Committed by Commit Bot

[Chromeshine] Prevent crash when eagerly suspending null tab

This crash can occur if, e.g. there are no new tabs open and DWB
informs us that a site is suspended. This CL also adds a unit
test for this case and two instrumentation tests; one for this case
and one for a related one.

Bug: 1148363
Change-Id: I7fad393bd0369c4650fb7b8c2d8bd3c3cde40bed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2535912Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Cr-Commit-Position: refs/heads/master@{#827018}
parent 57ea7389
...@@ -127,7 +127,7 @@ public class PageViewObserver { ...@@ -127,7 +127,7 @@ public class PageViewObserver {
/** Notify PageViewObserver that {@code fqdn} was just suspended or un-suspended. */ /** Notify PageViewObserver that {@code fqdn} was just suspended or un-suspended. */
public void notifySiteSuspensionChanged(String fqdn, boolean isSuspended) { public void notifySiteSuspensionChanged(String fqdn, boolean isSuspended) {
if (mCurrentTab != null && !mCurrentTab.isInitialized()) return; if (mCurrentTab == null || !mCurrentTab.isInitialized()) return;
SuspendedTab suspendedTab = SuspendedTab.from(mCurrentTab); SuspendedTab suspendedTab = SuspendedTab.from(mCurrentTab);
if (fqdn.equals(mLastFqdn) || fqdn.equals(suspendedTab.getFqdn())) { if (fqdn.equals(mLastFqdn) || fqdn.equals(suspendedTab.getFqdn())) {
if (checkSuspendedTabState(isSuspended, fqdn)) { if (checkSuspendedTabState(isSuspended, fqdn)) {
......
...@@ -334,6 +334,35 @@ public class TabSuspensionTest { ...@@ -334,6 +334,35 @@ public class TabSuspensionTest {
}); });
} }
@Test
@MediumTest
public void testSuspendNullCurrentTab() {
mActivityTestRule.loadUrl(mStartingUrl);
ChromeTabUtils.closeAllTabs(InstrumentationRegistry.getInstrumentation(), mActivity);
doReturn(true).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN);
suspendDomain(STARTING_FQDN);
// We can't use loadUrlInNewTab because the site being suspended will prevent loading from
// completing, and loadUrlInNewTab expects loading to succeed.
ChromeTabUtils.newTabFromMenu(
InstrumentationRegistry.getInstrumentation(), mActivityTestRule.getActivity());
Tab tab2 = mActivity.getActivityTab();
startLoadingUrl(tab2, mStartingUrl);
waitForSuspendedTabToShow(tab2, STARTING_FQDN);
}
@Test
@MediumTest
public void testSuspendUninitializedCurrentTab() {
mActivityTestRule.loadUrl(mStartingUrl);
TestThreadUtils.runOnUiThreadBlocking(() -> mTab.destroy());
doReturn(true).when(mSuspensionTracker).isWebsiteSuspended(STARTING_FQDN);
suspendDomain(STARTING_FQDN);
}
private void startLoadingUrl(Tab tab, String url) { private void startLoadingUrl(Tab tab, String url) {
TestThreadUtils.runOnUiThreadBlocking( TestThreadUtils.runOnUiThreadBlocking(
() -> { tab.loadUrl(new LoadUrlParams(url, PageTransition.TYPED)); }); () -> { tab.loadUrl(new LoadUrlParams(url, PageTransition.TYPED)); });
......
...@@ -494,6 +494,15 @@ public final class PageViewObserverTest { ...@@ -494,6 +494,15 @@ public final class PageViewObserverTest {
observer.notifySiteSuspensionChanged(STARTING_FQDN, true); observer.notifySiteSuspensionChanged(STARTING_FQDN, true);
} }
@Test
public void eagerSuspension_nullTab() {
PageViewObserver observer = createPageViewObserver();
updateUrl(mTab, STARTING_URL);
didSelectTab(null, TabSelectionType.FROM_USER);
observer.notifySiteSuspensionChanged(STARTING_FQDN, true);
}
private PageViewObserver createPageViewObserver() { private PageViewObserver createPageViewObserver() {
PageViewObserver observer = new PageViewObserver( PageViewObserver observer = new PageViewObserver(
mActivity, mTabModelSelector, mEventTracker, mTokenTracker, mSuspensionTracker); mActivity, mTabModelSelector, mEventTracker, mTokenTracker, mSuspensionTracker);
......
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