Commit 528b3372 authored by Sky Malice's avatar Sky Malice Committed by Commit Bot

[Feed] After destroy() still call consumers, fix scheduler bridge.

Follow up to https://chromium-review.googlesource.com/c/chromium/src/+/1345422,
doing a couple of things.

1. Removing the destroy warning comment, as all bridges will need to follow
this pattern indefinitely. It is not a temporary comment, and adds significant
bulk to any bridge that may become out of sync over time.
2. Call consumers/callbacks immediately with error, null, or default responses.
This allows the Feed to take reasonable responses and not hang during shutdown.
3. Fix mistake in scheduler check that was backwards, causing the scheduler to
think it perpetually had an outstanding request.

Bug: 901414
Change-Id: Ied653541755d5fb1b204c4968e755364cdcece81
Reviewed-on: https://chromium-review.googlesource.com/c/1355614Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Commit-Queue: Sky Malice <skym@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612463}
parent 610ae98b
...@@ -51,48 +51,49 @@ public class FeedContentStorage implements ContentStorage { ...@@ -51,48 +51,49 @@ public class FeedContentStorage implements ContentStorage {
@Override @Override
public void get(List<String> keys, Consumer < Result < Map<String, byte[]>>> consumer) { public void get(List<String> keys, Consumer < Result < Map<String, byte[]>>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedContentBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedContentBridge == null) return; } else {
mFeedContentBridge.loadContent(keys,
mFeedContentBridge.loadContent(keys, (Map<String, byte[]> data)
(Map<String, byte[]> data) -> consumer.accept(Result.success(data)),
-> consumer.accept(Result.success(data)), (Void ignored) -> consumer.accept(Result.failure()));
(Void ignored) -> consumer.accept(Result.failure())); }
} }
@Override @Override
public void getAll(String prefix, Consumer < Result < Map<String, byte[]>>> consumer) { public void getAll(String prefix, Consumer < Result < Map<String, byte[]>>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedContentBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedContentBridge == null) return; } else {
mFeedContentBridge.loadContentByPrefix(prefix,
mFeedContentBridge.loadContentByPrefix(prefix, (Map<String, byte[]> data)
(Map<String, byte[]> data) -> consumer.accept(Result.success(data)),
-> consumer.accept(Result.success(data)), (Void ignored) -> consumer.accept(Result.failure()));
(Void ignored) -> consumer.accept(Result.failure())); }
} }
@Override @Override
public void commit(ContentMutation mutation, Consumer<CommitResult> consumer) { public void commit(ContentMutation mutation, Consumer<CommitResult> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedContentBridge == null) {
// See https://crbug.com/901414. consumer.accept(CommitResult.FAILURE);
if (mFeedContentBridge == null) return; } else {
mFeedContentBridge.commitContentMutation(mutation,
mFeedContentBridge.commitContentMutation(mutation, (Boolean result)
(Boolean result) -> consumer.accept(
-> consumer.accept(result ? CommitResult.SUCCESS : CommitResult.FAILURE)); result ? CommitResult.SUCCESS : CommitResult.FAILURE));
}
} }
@Override @Override
public void getAllKeys(Consumer < Result < List<String>>> consumer) { public void getAllKeys(Consumer < Result < List<String>>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedContentBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedContentBridge == null) return; } else {
mFeedContentBridge.loadAllContentKeys(
mFeedContentBridge.loadAllContentKeys( (String[] keys)
(String[] keys) -> consumer.accept(Result.success(Arrays.asList(keys))),
-> consumer.accept(Result.success(Arrays.asList(keys))), (Void ignored) -> consumer.accept(Result.failure()));
(Void ignored) -> consumer.accept(Result.failure())); }
} }
} }
...@@ -50,59 +50,61 @@ public class FeedJournalStorage implements JournalStorage { ...@@ -50,59 +50,61 @@ public class FeedJournalStorage implements JournalStorage {
@Override @Override
public void read(String journalName, Consumer < Result < List<byte[]>>> consumer) { public void read(String journalName, Consumer < Result < List<byte[]>>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedJournalBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedJournalBridge == null) return; } else {
mFeedJournalBridge.loadJournal(journalName, (byte[][] entries) -> {
mFeedJournalBridge.loadJournal(journalName, (byte[][] entries) -> { List<byte[]> journal = Arrays.asList(entries);
List<byte[]> journal = Arrays.asList(entries); consumer.accept(Result.success(journal));
consumer.accept(Result.success(journal)); }, (Void ignored) -> consumer.accept(Result.failure()));
}, (Void ignored) -> consumer.accept(Result.failure())); }
} }
@Override @Override
public void commit(JournalMutation mutation, Consumer<CommitResult> consumer) { public void commit(JournalMutation mutation, Consumer<CommitResult> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedJournalBridge == null) {
// See https://crbug.com/901414. consumer.accept(CommitResult.FAILURE);
if (mFeedJournalBridge == null) return; } else {
mFeedJournalBridge.commitJournalMutation(mutation,
mFeedJournalBridge.commitJournalMutation(mutation, (Boolean result)
(Boolean result) -> consumer.accept(
-> consumer.accept(result ? CommitResult.SUCCESS : CommitResult.FAILURE)); result ? CommitResult.SUCCESS : CommitResult.FAILURE));
}
} }
@Override @Override
public void exists(String journalName, Consumer<Result<Boolean>> consumer) { public void exists(String journalName, Consumer<Result<Boolean>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedJournalBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedJournalBridge == null) return; } else {
mFeedJournalBridge.doesJournalExist(journalName,
mFeedJournalBridge.doesJournalExist(journalName, (Boolean exist)
(Boolean exist) -> consumer.accept(Result.success(exist)),
-> consumer.accept(Result.success(exist)), (Void ignored) -> consumer.accept(Result.failure()));
(Void ignored) -> consumer.accept(Result.failure())); }
} }
@Override @Override
public void getAllJournals(Consumer < Result < List<String>>> consumer) { public void getAllJournals(Consumer < Result < List<String>>> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedJournalBridge == null) {
// See https://crbug.com/901414. consumer.accept(Result.failure());
if (mFeedJournalBridge == null) return; } else {
mFeedJournalBridge.loadAllJournalKeys(
mFeedJournalBridge.loadAllJournalKeys( (String[] data)
(String[] data) -> consumer.accept(Result.success(Arrays.asList(data))),
-> consumer.accept(Result.success(Arrays.asList(data))), (Void ignored) -> consumer.accept(Result.failure()));
(Void ignored) -> consumer.accept(Result.failure())); }
} }
@Override @Override
public void deleteAll(Consumer<CommitResult> consumer) { public void deleteAll(Consumer<CommitResult> consumer) {
// Bridge could have been destroyed for policy when this is called. if (mFeedJournalBridge == null) {
// See https://crbug.com/901414. consumer.accept(CommitResult.FAILURE);
if (mFeedJournalBridge == null) return; } else {
mFeedJournalBridge.deleteAllJournals(
mFeedJournalBridge.deleteAllJournals( (Boolean result)
(Boolean result) -> consumer.accept(
-> consumer.accept(result ? CommitResult.SUCCESS : CommitResult.FAILURE)); result ? CommitResult.SUCCESS : CommitResult.FAILURE));
}
} }
} }
...@@ -42,12 +42,13 @@ public class FeedNetworkBridge implements NetworkClient { ...@@ -42,12 +42,13 @@ public class FeedNetworkBridge implements NetworkClient {
@Override @Override
public void send(HttpRequest request, Consumer<HttpResponse> responseConsumer) { public void send(HttpRequest request, Consumer<HttpResponse> responseConsumer) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge == 0) {
// See https://crbug.com/901414. responseConsumer.accept(createHttpResponse(500, new byte[0]));
if (mNativeBridge == 0) return; } else {
nativeSendNetworkRequest(mNativeBridge, request.getUri().toString(),
nativeSendNetworkRequest(mNativeBridge, request.getUri().toString(), request.getMethod(), request.getMethod(), request.getBody(),
request.getBody(), result -> responseConsumer.accept(result)); result -> responseConsumer.accept(result));
}
} }
@Override @Override
......
...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.profiles.Profile; ...@@ -17,6 +17,7 @@ import org.chromium.chrome.browser.profiles.Profile;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
...@@ -57,66 +58,58 @@ public class FeedOfflineBridge ...@@ -57,66 +58,58 @@ public class FeedOfflineBridge
@Override @Override
public Long getOfflineIdIfPageIsOfflined(String url) { public Long getOfflineIdIfPageIsOfflined(String url) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge == 0) {
// See https://crbug.com/901414. return 0L;
if (mNativeBridge == 0) return 0L; } else {
return (Long) nativeGetOfflineId(mNativeBridge, url);
return (Long) nativeGetOfflineId(mNativeBridge, url); }
} }
@Override @Override
public void getOfflineStatus( public void getOfflineStatus(
List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer) { List<String> urlsToRetrieve, Consumer<List<String>> urlListConsumer) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge == 0) {
// See https://crbug.com/901414. urlListConsumer.accept(Collections.emptyList());
if (mNativeBridge == 0) return; } else {
String[] urlsArray = urlsToRetrieve.toArray(new String[urlsToRetrieve.size()]);
String[] urlsArray = urlsToRetrieve.toArray(new String[urlsToRetrieve.size()]); nativeGetOfflineStatus(mNativeBridge, urlsArray,
nativeGetOfflineStatus(mNativeBridge, urlsArray, (String[] urlsAsArray) -> urlListConsumer.accept(Arrays.asList(urlsAsArray)));
(String[] urlsAsArray) -> urlListConsumer.accept(Arrays.asList(urlsAsArray))); }
} }
@Override @Override
public void addOfflineStatusListener(OfflineStatusListener offlineStatusListener) { public void addOfflineStatusListener(OfflineStatusListener offlineStatusListener) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. mListeners.add(offlineStatusListener);
if (mNativeBridge == 0) return; }
mListeners.add(offlineStatusListener);
} }
@Override @Override
public void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener) { public void removeOfflineStatusListener(OfflineStatusListener offlineStatusListener) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. mListeners.remove(offlineStatusListener);
if (mNativeBridge == 0) return; if (mListeners.isEmpty()) {
nativeOnNoListeners(mNativeBridge);
mListeners.remove(offlineStatusListener); }
if (mListeners.isEmpty()) {
nativeOnNoListeners(mNativeBridge);
} }
} }
@Override @Override
public void onContentRemoved(List<ContentRemoval> contentRemoved) { public void onContentRemoved(List<ContentRemoval> contentRemoved) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. List<String> userDrivenRemovals = takeUserDriveRemovalsOnly(contentRemoved);
if (mNativeBridge == 0) return; if (!userDrivenRemovals.isEmpty()) {
nativeOnContentRemoved(mNativeBridge,
List<String> userDrivenRemovals = takeUserDriveRemovalsOnly(contentRemoved); userDrivenRemovals.toArray(new String[userDrivenRemovals.size()]));
if (!userDrivenRemovals.isEmpty()) { }
nativeOnContentRemoved(mNativeBridge,
userDrivenRemovals.toArray(new String[userDrivenRemovals.size()]));
} }
} }
@Override @Override
public void onNewContentReceived(boolean isNewRefresh, long contentCreationDateTimeMs) { public void onNewContentReceived(boolean isNewRefresh, long contentCreationDateTimeMs) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. nativeOnNewContentReceived(mNativeBridge);
if (mNativeBridge == 0) return; }
nativeOnNewContentReceived(mNativeBridge);
} }
/** /**
...@@ -145,8 +138,6 @@ public class FeedOfflineBridge ...@@ -145,8 +138,6 @@ public class FeedOfflineBridge
@CalledByNative @CalledByNative
private void getKnownContent() { private void getKnownContent() {
mKnownContentApi.getKnownContent((List<ContentMetadata> metadataList) -> { mKnownContentApi.getKnownContent((List<ContentMetadata> metadataList) -> {
// Bridge could have been destroyed for policy when this is called.
// See https://crbug.com/901414.
if (mNativeBridge == 0) return; if (mNativeBridge == 0) return;
for (ContentMetadata metadata : metadataList) { for (ContentMetadata metadata : metadataList) {
......
...@@ -62,8 +62,6 @@ public class FeedSchedulerBridge implements FeedScheduler { ...@@ -62,8 +62,6 @@ public class FeedSchedulerBridge implements FeedScheduler {
@Override @Override
public int shouldSessionRequestData(SessionManagerState sessionManagerState) { public int shouldSessionRequestData(SessionManagerState sessionManagerState) {
// Bridge could have been destroyed for policy when this is called.
// See https://crbug.com/901414.
if (mNativeBridge == 0) return SchedulerApi.RequestBehavior.UNKNOWN; if (mNativeBridge == 0) return SchedulerApi.RequestBehavior.UNKNOWN;
@NativeRequestBehavior @NativeRequestBehavior
...@@ -95,20 +93,16 @@ public class FeedSchedulerBridge implements FeedScheduler { ...@@ -95,20 +93,16 @@ public class FeedSchedulerBridge implements FeedScheduler {
@Override @Override
public void onReceiveNewContent(long contentCreationDateTimeMs) { public void onReceiveNewContent(long contentCreationDateTimeMs) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. nativeOnReceiveNewContent(mNativeBridge, contentCreationDateTimeMs);
if (mNativeBridge != 0) return; }
nativeOnReceiveNewContent(mNativeBridge, contentCreationDateTimeMs);
} }
@Override @Override
public void onRequestError(int networkResponseCode) { public void onRequestError(int networkResponseCode) {
// Bridge could have been destroyed for policy when this is called. if (mNativeBridge != 0) {
// See https://crbug.com/901414. nativeOnRequestError(mNativeBridge, networkResponseCode);
if (mNativeBridge != 0) return; }
nativeOnRequestError(mNativeBridge, networkResponseCode);
} }
@Override @Override
......
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