Commit 22bd6277 authored by Patrick Noland's avatar Patrick Noland Committed by Commit Bot

[Chromeshine] Prevent crash when accessing SuspendedTab for destroyed tab

Bug: b/148339489
Change-Id: I1714f3439c6d88d764b8e894add7fd93eeed2baf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2032422
Commit-Queue: Patrick Noland <pnoland@chromium.org>
Reviewed-by: default avatarNatalie Chouinard <chouinard@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737413}
parent 46b1cc8c
...@@ -125,6 +125,7 @@ public class PageViewObserver { ...@@ -125,6 +125,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;
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)) {
......
...@@ -48,7 +48,12 @@ public class SuspendedTab extends EmptyTabObserver implements UserData { ...@@ -48,7 +48,12 @@ public class SuspendedTab extends EmptyTabObserver implements UserData {
return suspendedTab != null && suspendedTab.isShowing(); return suspendedTab != null && suspendedTab.isShowing();
} }
/**
* @return The SuspendedTab instance for the given Tab object. This can never return null, but
* is not safe to call if the tab has been destroyed.
*/
public static SuspendedTab from(Tab tab) { public static SuspendedTab from(Tab tab) {
assert tab.isInitialized();
SuspendedTab suspendedTab = get(tab); SuspendedTab suspendedTab = get(tab);
if (suspendedTab == null) { if (suspendedTab == null) {
suspendedTab = tab.getUserDataHost().setUserData(USER_DATA_KEY, new SuspendedTab(tab)); suspendedTab = tab.getUserDataHost().setUserData(USER_DATA_KEY, new SuspendedTab(tab));
......
...@@ -80,6 +80,7 @@ public final class PageViewObserverTest { ...@@ -80,6 +80,7 @@ public final class PageViewObserverTest {
private TabObserver mTabObserver; private TabObserver mTabObserver;
private UserDataHost mUserDataHost; private UserDataHost mUserDataHost;
private UserDataHost mUserDataHostTab2; private UserDataHost mUserDataHostTab2;
private UserDataHost mDestroyedUserDataHost;
@Before @Before
public void setUp() { public void setUp() {
...@@ -87,10 +88,14 @@ public final class PageViewObserverTest { ...@@ -87,10 +88,14 @@ public final class PageViewObserverTest {
mUserDataHost = new UserDataHost(); mUserDataHost = new UserDataHost();
mUserDataHostTab2 = new UserDataHost(); mUserDataHostTab2 = new UserDataHost();
mDestroyedUserDataHost = new UserDataHost();
mDestroyedUserDataHost.destroy();
doReturn(false).when(mTab).isIncognito(); doReturn(false).when(mTab).isIncognito();
doReturn(null).when(mTab).getUrl(); doReturn(null).when(mTab).getUrl();
doReturn(mChromeActivity).when(mTab).getActivity(); doReturn(mChromeActivity).when(mTab).getActivity();
doReturn(true).when(mTab).isInitialized();
doReturn(true).when(mTab2).isInitialized();
doReturn(Arrays.asList(mTabModel)).when(mTabModelSelector).getModels(); doReturn(Arrays.asList(mTabModel)).when(mTabModelSelector).getModels();
doReturn(mTab).when(mTabModelSelector).getCurrentTab(); doReturn(mTab).when(mTabModelSelector).getCurrentTab();
doReturn(mUserDataHost).when(mTab).getUserDataHost(); doReturn(mUserDataHost).when(mTab).getUserDataHost();
...@@ -429,6 +434,16 @@ public final class PageViewObserverTest { ...@@ -429,6 +434,16 @@ public final class PageViewObserverTest {
verify(mEventTracker, times(1)).addWebsiteEvent(argThat(isStartEvent(STARTING_FQDN))); verify(mEventTracker, times(1)).addWebsiteEvent(argThat(isStartEvent(STARTING_FQDN)));
} }
@Test
public void eagerSuspension_destroyedTab() {
PageViewObserver observer = createPageViewObserver();
updateUrl(mTab, STARTING_URL);
doReturn(mDestroyedUserDataHost).when(mTab).getUserDataHost();
doReturn(false).when(mTab).isInitialized();
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