Commit 070b13aa authored by Sky Malice's avatar Sky Malice Committed by Commit Bot

[Feed] Guard all callbacks given to native with bridge weak ptrs.

Bug: 900416
Change-Id: I3fed64b4968a75a7bc2279fca1169dbc2c0b0244
Reviewed-on: https://chromium-review.googlesource.com/c/1330334
Commit-Queue: Sky Malice <skym@chromium.org>
Reviewed-by: default avatarFilip Gorski <fgorski@chromium.org>
Cr-Commit-Position: refs/heads/master@{#607838}
parent d62f312a
...@@ -48,7 +48,10 @@ public class FeedNetworkBridge implements NetworkClient { ...@@ -48,7 +48,10 @@ public class FeedNetworkBridge implements NetworkClient {
} }
@Override @Override
public void close() {} public void close() {
assert mNativeBridge != 0;
nativeCancelRequests(mNativeBridge);
}
@CalledByNative @CalledByNative
private static HttpResponse createHttpResponse(int code, byte[] body) { private static HttpResponse createHttpResponse(int code, byte[] body) {
...@@ -59,4 +62,5 @@ public class FeedNetworkBridge implements NetworkClient { ...@@ -59,4 +62,5 @@ public class FeedNetworkBridge implements NetworkClient {
private native void nativeDestroy(long nativeFeedNetworkBridge); private native void nativeDestroy(long nativeFeedNetworkBridge);
private native void nativeSendNetworkRequest(long nativeFeedNetworkBridge, String url, private native void nativeSendNetworkRequest(long nativeFeedNetworkBridge, String url,
String requestType, byte[] body, Callback<HttpResponse> resultCallback); String requestType, byte[] body, Callback<HttpResponse> resultCallback);
private native void nativeCancelRequests(long nativeFeedNetworkBridge);
} }
...@@ -30,6 +30,7 @@ import org.chromium.base.VisibleForTesting; ...@@ -30,6 +30,7 @@ import org.chromium.base.VisibleForTesting;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.concurrent.atomic.AtomicBoolean;
/** A network client that returns configurable responses /** A network client that returns configurable responses
* modified from com.google.android.libraries.feed.mocknetworkclient.MockServerNetworkClient * modified from com.google.android.libraries.feed.mocknetworkclient.MockServerNetworkClient
...@@ -39,6 +40,7 @@ public class TestNetworkClient implements NetworkClient { ...@@ -39,6 +40,7 @@ public class TestNetworkClient implements NetworkClient {
private final ExtensionRegistryLite mExtensionRegistry; private final ExtensionRegistryLite mExtensionRegistry;
private final long mResponseDelay; private final long mResponseDelay;
private final AtomicBoolean mAlreadyClosed = new AtomicBoolean(false);
private MockServer mMockServer; private MockServer mMockServer;
...@@ -46,7 +48,7 @@ public class TestNetworkClient implements NetworkClient { ...@@ -46,7 +48,7 @@ public class TestNetworkClient implements NetworkClient {
Configuration config = new Configuration.Builder().build(); Configuration config = new Configuration.Builder().build();
mExtensionRegistry = ExtensionRegistryLite.newInstance(); mExtensionRegistry = ExtensionRegistryLite.newInstance();
mExtensionRegistry.add(FeedRequest.feedRequest); mExtensionRegistry.add(FeedRequest.feedRequest);
// TODO(aluo): Add ability to delay responses // TODO(aluo): Add ability to delay responses.
mResponseDelay = config.getValueOrDefault(ConfigKey.MOCK_SERVER_DELAY_MS, 0L); mResponseDelay = config.getValueOrDefault(ConfigKey.MOCK_SERVER_DELAY_MS, 0L);
mMockServer = MockServer.getDefaultInstance(); mMockServer = MockServer.getDefaultInstance();
} }
...@@ -83,7 +85,7 @@ public class TestNetworkClient implements NetworkClient { ...@@ -83,7 +85,7 @@ public class TestNetworkClient implements NetworkClient {
@Override @Override
public void send(HttpRequest httpRequest, Consumer<HttpResponse> responseConsumer) { public void send(HttpRequest httpRequest, Consumer<HttpResponse> responseConsumer) {
// TODO(aluo): Add ability to respond with HTTP Errors // TODO(aluo): Add ability to respond with HTTP Errors.
try { try {
Request request = getRequest(httpRequest); Request request = getRequest(httpRequest);
ByteString requestToken = ByteString requestToken =
...@@ -114,12 +116,11 @@ public class TestNetworkClient implements NetworkClient { ...@@ -114,12 +116,11 @@ public class TestNetworkClient implements NetworkClient {
private void delayedAccept(HttpResponse httpResponse, Consumer<HttpResponse> responseConsumer) { private void delayedAccept(HttpResponse httpResponse, Consumer<HttpResponse> responseConsumer) {
if (mResponseDelay <= 0) { if (mResponseDelay <= 0) {
responseConsumer.accept(httpResponse); maybeAccept(httpResponse, responseConsumer);
return; } else {
}
ThreadUtils.postOnUiThreadDelayed( ThreadUtils.postOnUiThreadDelayed(
() -> responseConsumer.accept(httpResponse), mResponseDelay); () -> maybeAccept(httpResponse, responseConsumer), mResponseDelay);
}
} }
private Request getRequest(HttpRequest httpRequest) throws IOException { private Request getRequest(HttpRequest httpRequest) throws IOException {
...@@ -138,7 +139,9 @@ public class TestNetworkClient implements NetworkClient { ...@@ -138,7 +139,9 @@ public class TestNetworkClient implements NetworkClient {
} }
@Override @Override
public void close() {} public void close() {
mAlreadyClosed.set(true);
}
private HttpResponse createHttpResponse(Response response) { private HttpResponse createHttpResponse(Response response) {
try { try {
...@@ -153,4 +156,10 @@ public class TestNetworkClient implements NetworkClient { ...@@ -153,4 +156,10 @@ public class TestNetworkClient implements NetworkClient {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
private void maybeAccept(HttpResponse httpResponse, Consumer<HttpResponse> responseConsumer) {
if (!mAlreadyClosed.get()) {
responseConsumer.accept(httpResponse);
}
}
} }
...@@ -40,54 +40,6 @@ using base::android::ToJavaArrayOfByteArray; ...@@ -40,54 +40,6 @@ using base::android::ToJavaArrayOfByteArray;
using base::android::ToJavaArrayOfStrings; using base::android::ToJavaArrayOfStrings;
using base::android::JavaByteArrayToString; using base::android::JavaByteArrayToString;
namespace {
void OnLoadContentDone(ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<FeedContentDatabase::KeyAndData> pairs) {
std::vector<std::string> keys;
std::vector<std::string> data;
for (auto pair : pairs) {
keys.push_back(std::move(pair.first));
data.push_back(std::move(pair.second));
}
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_keys = ToJavaArrayOfStrings(env, keys);
ScopedJavaLocalRef<jobjectArray> j_data = ToJavaArrayOfByteArray(env, data);
// Create Java Map by JNI call.
ScopedJavaLocalRef<jobject> j_pairs =
Java_FeedContentBridge_createKeyAndDataMap(env, j_keys, j_data);
if (!success) {
RunObjectCallbackAndroid(failure_callback, nullptr);
return;
}
RunObjectCallbackAndroid(success_callback, j_pairs);
}
void OnLoadAllContentKeysDone(ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> keys) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_keys = ToJavaArrayOfStrings(env, keys);
if (!success) {
RunObjectCallbackAndroid(failure_callback, nullptr);
return;
}
RunObjectCallbackAndroid(success_callback, j_keys);
}
void OnStorageCommitDone(ScopedJavaGlobalRef<jobject> callback, bool success) {
RunBooleanCallbackAndroid(callback, success);
}
} // namespace
static jlong JNI_FeedContentBridge_Init( static jlong JNI_FeedContentBridge_Init(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& j_this, const JavaParamRef<jobject>& j_this,
...@@ -125,8 +77,9 @@ void FeedContentBridge::LoadContent( ...@@ -125,8 +77,9 @@ void FeedContentBridge::LoadContent(
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_content_database_->LoadContent( feed_content_database_->LoadContent(
keys, keys, base::BindOnce(&FeedContentBridge::OnLoadContentDone,
base::BindOnce(&OnLoadContentDone, success_callback, failure_callback)); weak_ptr_factory_.GetWeakPtr(), success_callback,
failure_callback));
} }
void FeedContentBridge::LoadContentByPrefix( void FeedContentBridge::LoadContentByPrefix(
...@@ -140,8 +93,9 @@ void FeedContentBridge::LoadContentByPrefix( ...@@ -140,8 +93,9 @@ void FeedContentBridge::LoadContentByPrefix(
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_content_database_->LoadContentByPrefix( feed_content_database_->LoadContentByPrefix(
prefix, prefix, base::BindOnce(&FeedContentBridge::OnLoadContentDone,
base::BindOnce(&OnLoadContentDone, success_callback, failure_callback)); weak_ptr_factory_.GetWeakPtr(), success_callback,
failure_callback));
} }
void FeedContentBridge::LoadAllContentKeys( void FeedContentBridge::LoadAllContentKeys(
...@@ -153,7 +107,8 @@ void FeedContentBridge::LoadAllContentKeys( ...@@ -153,7 +107,8 @@ void FeedContentBridge::LoadAllContentKeys(
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_content_database_->LoadAllContentKeys(base::BindOnce( feed_content_database_->LoadAllContentKeys(base::BindOnce(
&OnLoadAllContentKeysDone, success_callback, failure_callback)); &FeedContentBridge::OnLoadAllContentKeysDone,
weak_ptr_factory_.GetWeakPtr(), success_callback, failure_callback));
} }
void FeedContentBridge::CommitContentMutation( void FeedContentBridge::CommitContentMutation(
...@@ -165,7 +120,8 @@ void FeedContentBridge::CommitContentMutation( ...@@ -165,7 +120,8 @@ void FeedContentBridge::CommitContentMutation(
feed_content_database_->CommitContentMutation( feed_content_database_->CommitContentMutation(
std::move(content_mutation_), std::move(content_mutation_),
base::BindOnce(&OnStorageCommitDone, callback)); base::BindOnce(&FeedContentBridge::OnStorageCommitDone,
weak_ptr_factory_.GetWeakPtr(), callback));
} }
void FeedContentBridge::CreateContentMutation(JNIEnv* j_env, void FeedContentBridge::CreateContentMutation(JNIEnv* j_env,
...@@ -220,4 +176,52 @@ void FeedContentBridge::AppendDeleteAllOperation( ...@@ -220,4 +176,52 @@ void FeedContentBridge::AppendDeleteAllOperation(
content_mutation_->AppendDeleteAllOperation(); content_mutation_->AppendDeleteAllOperation();
} }
void FeedContentBridge::OnLoadContentDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<FeedContentDatabase::KeyAndData> pairs) {
std::vector<std::string> keys;
std::vector<std::string> data;
for (auto pair : pairs) {
keys.push_back(std::move(pair.first));
data.push_back(std::move(pair.second));
}
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_keys = ToJavaArrayOfStrings(env, keys);
ScopedJavaLocalRef<jobjectArray> j_data = ToJavaArrayOfByteArray(env, data);
// Create Java Map by JNI call.
ScopedJavaLocalRef<jobject> j_pairs =
Java_FeedContentBridge_createKeyAndDataMap(env, j_keys, j_data);
if (!success) {
RunObjectCallbackAndroid(failure_callback, nullptr);
return;
}
RunObjectCallbackAndroid(success_callback, j_pairs);
}
void FeedContentBridge::OnLoadAllContentKeysDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> keys) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_keys = ToJavaArrayOfStrings(env, keys);
if (!success) {
RunObjectCallbackAndroid(failure_callback, nullptr);
return;
}
RunObjectCallbackAndroid(success_callback, j_keys);
}
void FeedContentBridge::OnStorageCommitDone(
ScopedJavaGlobalRef<jobject> callback,
bool success) {
RunBooleanCallbackAndroid(callback, success);
}
} // namespace feed } // namespace feed
...@@ -69,6 +69,19 @@ class FeedContentBridge { ...@@ -69,6 +69,19 @@ class FeedContentBridge {
const base::android::JavaRef<jobject>& j_this); const base::android::JavaRef<jobject>& j_this);
private: private:
void OnLoadContentDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<FeedContentDatabase::KeyAndData> pairs);
void OnLoadAllContentKeysDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> keys);
void OnStorageCommitDone(base::android::ScopedJavaGlobalRef<jobject> callback,
bool success);
// This unique_ptr will hold a list of ContentOperations which are not // This unique_ptr will hold a list of ContentOperations which are not
// committed yet. After commit to database, this unique_ptr will be reset. // committed yet. After commit to database, this unique_ptr will be reset.
std::unique_ptr<ContentMutation> content_mutation_; std::unique_ptr<ContentMutation> content_mutation_;
......
...@@ -34,58 +34,6 @@ using base::android::ScopedJavaLocalRef; ...@@ -34,58 +34,6 @@ using base::android::ScopedJavaLocalRef;
using base::android::ToJavaArrayOfByteArray; using base::android::ToJavaArrayOfByteArray;
using base::android::ToJavaArrayOfStrings; using base::android::ToJavaArrayOfStrings;
namespace {
void OnLoadJournalDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries) {
JNIEnv* env = AttachCurrentThread();
if (success) {
RunObjectCallbackAndroid(success_callback,
ToJavaArrayOfByteArray(env, entries));
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void OnLoadJournalKeyDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_entries =
ToJavaArrayOfStrings(env, entries);
if (success) {
RunObjectCallbackAndroid(success_callback, j_entries);
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void OnStorageCheckExistingCallbackDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
bool exists) {
if (success) {
RunBooleanCallbackAndroid(success_callback, exists);
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void OnStorageBooleanCallbackDone(ScopedJavaGlobalRef<jobject> callback,
bool exists) {
RunBooleanCallbackAndroid(callback, exists);
}
} // namespace
static jlong JNI_FeedJournalBridge_Init( static jlong JNI_FeedJournalBridge_Init(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& j_this, const JavaParamRef<jobject>& j_this,
...@@ -115,89 +63,92 @@ void FeedJournalBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) { ...@@ -115,89 +63,92 @@ void FeedJournalBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) {
void FeedJournalBridge::LoadJournal( void FeedJournalBridge::LoadJournal(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jstring>& j_journal_name, const JavaRef<jstring>& j_journal_name,
const base::android::JavaRef<jobject>& j_success_callback, const JavaRef<jobject>& j_success_callback,
const base::android::JavaRef<jobject>& j_failure_callback) { const JavaRef<jobject>& j_failure_callback) {
std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name); std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name);
ScopedJavaGlobalRef<jobject> success_callback(j_success_callback); ScopedJavaGlobalRef<jobject> success_callback(j_success_callback);
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_journal_database_->LoadJournal( feed_journal_database_->LoadJournal(
journal_name, journal_name, base::BindOnce(&FeedJournalBridge::OnLoadJournalDone,
base::BindOnce(&OnLoadJournalDone, success_callback, failure_callback)); weak_ptr_factory_.GetWeakPtr(),
success_callback, failure_callback));
} }
void FeedJournalBridge::CommitJournalMutation( void FeedJournalBridge::CommitJournalMutation(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_callback) { const JavaRef<jobject>& j_callback) {
DCHECK(journal_mutation_); DCHECK(journal_mutation_);
ScopedJavaGlobalRef<jobject> callback(j_callback); ScopedJavaGlobalRef<jobject> callback(j_callback);
feed_journal_database_->CommitJournalMutation( feed_journal_database_->CommitJournalMutation(
std::move(journal_mutation_), std::move(journal_mutation_),
base::BindOnce(&OnStorageBooleanCallbackDone, callback)); base::BindOnce(&FeedJournalBridge::OnStorageBooleanCallbackDone,
weak_ptr_factory_.GetWeakPtr(), callback));
} }
void FeedJournalBridge::DoesJournalExist( void FeedJournalBridge::DoesJournalExist(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jstring>& j_journal_name, const JavaRef<jstring>& j_journal_name,
const base::android::JavaRef<jobject>& j_success_callback, const JavaRef<jobject>& j_success_callback,
const base::android::JavaRef<jobject>& j_failure_callback) { const JavaRef<jobject>& j_failure_callback) {
std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name); std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name);
ScopedJavaGlobalRef<jobject> success_callback(j_success_callback); ScopedJavaGlobalRef<jobject> success_callback(j_success_callback);
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_journal_database_->DoesJournalExist( feed_journal_database_->DoesJournalExist(
journal_name, base::BindOnce(&OnStorageCheckExistingCallbackDone, journal_name,
success_callback, failure_callback)); base::BindOnce(&FeedJournalBridge::OnStorageCheckExistingCallbackDone,
weak_ptr_factory_.GetWeakPtr(), success_callback,
failure_callback));
} }
void FeedJournalBridge::LoadAllJournalKeys( void FeedJournalBridge::LoadAllJournalKeys(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_success_callback, const JavaRef<jobject>& j_success_callback,
const base::android::JavaRef<jobject>& j_failure_callback) { const JavaRef<jobject>& j_failure_callback) {
ScopedJavaGlobalRef<jobject> success_callback(j_success_callback); ScopedJavaGlobalRef<jobject> success_callback(j_success_callback);
ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback); ScopedJavaGlobalRef<jobject> failure_callback(j_failure_callback);
feed_journal_database_->LoadAllJournalKeys(base::BindOnce( feed_journal_database_->LoadAllJournalKeys(base::BindOnce(
&OnLoadJournalKeyDone, success_callback, failure_callback)); &FeedJournalBridge::OnLoadJournalKeyDone, weak_ptr_factory_.GetWeakPtr(),
success_callback, failure_callback));
} }
void FeedJournalBridge::DeleteAllJournals( void FeedJournalBridge::DeleteAllJournals(JNIEnv* j_env,
JNIEnv* j_env, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_callback) {
const base::android::JavaRef<jobject>& j_callback) {
ScopedJavaGlobalRef<jobject> callback(j_callback); ScopedJavaGlobalRef<jobject> callback(j_callback);
feed_journal_database_->DeleteAllJournals( feed_journal_database_->DeleteAllJournals(
base::BindOnce(&OnStorageBooleanCallbackDone, callback)); base::BindOnce(&FeedJournalBridge::OnStorageBooleanCallbackDone,
weak_ptr_factory_.GetWeakPtr(), callback));
} }
void FeedJournalBridge::StartJournalMutation( void FeedJournalBridge::StartJournalMutation(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jstring>& j_journal_name) { const JavaRef<jstring>& j_journal_name) {
DCHECK(!journal_mutation_); DCHECK(!journal_mutation_);
std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name); std::string journal_name = ConvertJavaStringToUTF8(j_env, j_journal_name);
journal_mutation_ = journal_mutation_ =
std::make_unique<JournalMutation>(std::move(journal_name)); std::make_unique<JournalMutation>(std::move(journal_name));
} }
void FeedJournalBridge::DeleteJournalMutation( void FeedJournalBridge::DeleteJournalMutation(JNIEnv* j_env,
JNIEnv* j_env, const JavaRef<jobject>& j_this) {
const base::android::JavaRef<jobject>& j_this) {
DCHECK(journal_mutation_); DCHECK(journal_mutation_);
journal_mutation_.reset(); journal_mutation_.reset();
} }
void FeedJournalBridge::AddAppendOperation( void FeedJournalBridge::AddAppendOperation(JNIEnv* j_env,
JNIEnv* j_env, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jbyteArray>& j_value) {
const base::android::JavaRef<jbyteArray>& j_value) {
DCHECK(journal_mutation_); DCHECK(journal_mutation_);
std::vector<uint8_t> bytes_vector; std::vector<uint8_t> bytes_vector;
JavaByteArrayToByteVector(j_env, j_value, &bytes_vector); JavaByteArrayToByteVector(j_env, j_value, &bytes_vector);
...@@ -207,19 +158,67 @@ void FeedJournalBridge::AddAppendOperation( ...@@ -207,19 +158,67 @@ void FeedJournalBridge::AddAppendOperation(
void FeedJournalBridge::AddCopyOperation( void FeedJournalBridge::AddCopyOperation(
JNIEnv* j_env, JNIEnv* j_env,
const base::android::JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jstring>& j_to_journal_name) { const JavaRef<jstring>& j_to_journal_name) {
DCHECK(journal_mutation_); DCHECK(journal_mutation_);
std::string to_journal_name = std::string to_journal_name =
ConvertJavaStringToUTF8(j_env, j_to_journal_name); ConvertJavaStringToUTF8(j_env, j_to_journal_name);
journal_mutation_->AddCopyOperation(std::move(to_journal_name)); journal_mutation_->AddCopyOperation(std::move(to_journal_name));
} }
void FeedJournalBridge::AddDeleteOperation( void FeedJournalBridge::AddDeleteOperation(JNIEnv* j_env,
JNIEnv* j_env, const JavaRef<jobject>& j_this) {
const base::android::JavaRef<jobject>& j_this) {
DCHECK(journal_mutation_); DCHECK(journal_mutation_);
journal_mutation_->AddDeleteOperation(); journal_mutation_->AddDeleteOperation();
} }
void FeedJournalBridge::OnLoadJournalDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries) {
JNIEnv* env = AttachCurrentThread();
if (success) {
RunObjectCallbackAndroid(success_callback,
ToJavaArrayOfByteArray(env, entries));
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void FeedJournalBridge::OnLoadJournalKeyDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries) {
JNIEnv* env = AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_entries =
ToJavaArrayOfStrings(env, entries);
if (success) {
RunObjectCallbackAndroid(success_callback, j_entries);
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void FeedJournalBridge::OnStorageCheckExistingCallbackDone(
ScopedJavaGlobalRef<jobject> success_callback,
ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
bool exists) {
if (success) {
RunBooleanCallbackAndroid(success_callback, exists);
} else {
RunObjectCallbackAndroid(failure_callback, nullptr);
}
}
void FeedJournalBridge::OnStorageBooleanCallbackDone(
ScopedJavaGlobalRef<jobject> callback,
bool exists) {
RunBooleanCallbackAndroid(callback, exists);
}
} // namespace feed } // namespace feed
...@@ -73,6 +73,25 @@ class FeedJournalBridge { ...@@ -73,6 +73,25 @@ class FeedJournalBridge {
const base::android::JavaRef<jobject>& j_this); const base::android::JavaRef<jobject>& j_this);
private: private:
void OnLoadJournalDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries);
void OnLoadJournalKeyDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
std::vector<std::string> entries);
void OnStorageCheckExistingCallbackDone(
base::android::ScopedJavaGlobalRef<jobject> success_callback,
base::android::ScopedJavaGlobalRef<jobject> failure_callback,
bool success,
bool exists);
void OnStorageBooleanCallbackDone(
base::android::ScopedJavaGlobalRef<jobject> callback,
bool exists);
// This unique_ptr will hold a list of JournalOperations which are not // This unique_ptr will hold a list of JournalOperations which are not
// committed yet. After send |journal_mutation_| to database, this unique_ptr // committed yet. After send |journal_mutation_| to database, this unique_ptr
// will be reset. // will be reset.
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#include "chrome/browser/android/feed/feed_network_bridge.h" #include "chrome/browser/android/feed/feed_network_bridge.h"
#include <utility> #include <utility>
#include <vector>
#include "base/android/callback_android.h" #include "base/android/callback_android.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
...@@ -27,23 +26,8 @@ using base::android::ScopedJavaGlobalRef; ...@@ -27,23 +26,8 @@ using base::android::ScopedJavaGlobalRef;
namespace feed { namespace feed {
namespace { FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile)
: weak_factory_(this) {
void OnResult(const ScopedJavaGlobalRef<jobject>& j_callback,
int32_t http_code,
std::vector<uint8_t> response_bytes) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jbyteArray> j_response_bytes =
base::android::ToJavaByteArray(env, response_bytes);
ScopedJavaLocalRef<jobject> j_http_response =
Java_FeedNetworkBridge_createHttpResponse(env, http_code,
j_response_bytes);
base::android::RunObjectCallbackAndroid(j_callback, j_http_response);
}
} // namespace
FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile) {
Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile); Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
FeedHostService* host_service = FeedHostService* host_service =
FeedHostServiceFactory::GetForBrowserContext(profile); FeedHostServiceFactory::GetForBrowserContext(profile);
...@@ -51,6 +35,8 @@ FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile) { ...@@ -51,6 +35,8 @@ FeedNetworkBridge::FeedNetworkBridge(const JavaParamRef<jobject>& j_profile) {
DCHECK(networking_host_); DCHECK(networking_host_);
} }
FeedNetworkBridge::~FeedNetworkBridge() = default;
static jlong JNI_FeedNetworkBridge_Init( static jlong JNI_FeedNetworkBridge_Init(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& j_this, const JavaParamRef<jobject>& j_this,
...@@ -72,7 +58,8 @@ void FeedNetworkBridge::SendNetworkRequest( ...@@ -72,7 +58,8 @@ void FeedNetworkBridge::SendNetworkRequest(
const JavaParamRef<jobject>& j_callback) { const JavaParamRef<jobject>& j_callback) {
auto url = GURL(ConvertJavaStringToUTF8(env, j_url)); auto url = GURL(ConvertJavaStringToUTF8(env, j_url));
FeedNetworkingHost::ResponseCallback callback = FeedNetworkingHost::ResponseCallback callback =
base::BindOnce(&OnResult, ScopedJavaGlobalRef<jobject>(env, j_callback)); base::BindOnce(&FeedNetworkBridge::OnResult, weak_factory_.GetWeakPtr(),
ScopedJavaGlobalRef<jobject>(env, j_callback));
std::vector<uint8_t> request_body; std::vector<uint8_t> request_body;
base::android::JavaByteArrayToByteVector(env, j_body, &request_body); base::android::JavaByteArrayToByteVector(env, j_body, &request_body);
...@@ -80,4 +67,21 @@ void FeedNetworkBridge::SendNetworkRequest( ...@@ -80,4 +67,21 @@ void FeedNetworkBridge::SendNetworkRequest(
std::move(request_body), std::move(callback)); std::move(request_body), std::move(callback));
} }
void FeedNetworkBridge::CancelRequests(JNIEnv* env,
const JavaParamRef<jobject>& j_this) {
networking_host_->CancelRequests();
}
void FeedNetworkBridge::OnResult(const ScopedJavaGlobalRef<jobject>& j_callback,
int32_t http_code,
std::vector<uint8_t> response_bytes) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jbyteArray> j_response_bytes =
base::android::ToJavaByteArray(env, response_bytes);
ScopedJavaLocalRef<jobject> j_http_response =
Java_FeedNetworkBridge_createHttpResponse(env, http_code,
j_response_bytes);
base::android::RunObjectCallbackAndroid(j_callback, j_http_response);
}
} // namespace feed } // namespace feed
...@@ -6,9 +6,11 @@ ...@@ -6,9 +6,11 @@
#define CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_ #define CHROME_BROWSER_ANDROID_FEED_FEED_NETWORK_BRIDGE_H_
#include <jni.h> #include <jni.h>
#include <vector>
#include "base/android/scoped_java_ref.h" #include "base/android/scoped_java_ref.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h"
namespace feed { namespace feed {
...@@ -22,6 +24,7 @@ class FeedNetworkBridge { ...@@ -22,6 +24,7 @@ class FeedNetworkBridge {
public: public:
explicit FeedNetworkBridge( explicit FeedNetworkBridge(
const base::android::JavaParamRef<jobject>& j_profile); const base::android::JavaParamRef<jobject>& j_profile);
~FeedNetworkBridge();
void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_this); void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& j_this);
...@@ -33,9 +36,18 @@ class FeedNetworkBridge { ...@@ -33,9 +36,18 @@ class FeedNetworkBridge {
const base::android::JavaParamRef<jbyteArray>& j_body, const base::android::JavaParamRef<jbyteArray>& j_body,
const base::android::JavaParamRef<jobject>& j_callback); const base::android::JavaParamRef<jobject>& j_callback);
void CancelRequests(JNIEnv* env,
const base::android::JavaParamRef<jobject>& j_this);
private: private:
void OnResult(const base::android::ScopedJavaGlobalRef<jobject>& j_callback,
int32_t http_code,
std::vector<uint8_t> response_bytes);
FeedNetworkingHost* networking_host_; FeedNetworkingHost* networking_host_;
base::WeakPtrFactory<FeedNetworkBridge> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(FeedNetworkBridge); DISALLOW_COPY_AND_ASSIGN(FeedNetworkBridge);
}; };
......
...@@ -28,18 +28,6 @@ using base::android::ScopedJavaLocalRef; ...@@ -28,18 +28,6 @@ using base::android::ScopedJavaLocalRef;
namespace feed { namespace feed {
namespace {
void OnGetOfflineStatus(ScopedJavaGlobalRef<jobject> callback,
std::vector<std::string> urls) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_urls =
base::android::ToJavaArrayOfStrings(env, urls);
RunObjectCallbackAndroid(callback, j_urls);
}
} // namespace
static jlong JNI_FeedOfflineBridge_Init( static jlong JNI_FeedOfflineBridge_Init(
JNIEnv* env, JNIEnv* env,
const JavaParamRef<jobject>& j_this, const JavaParamRef<jobject>& j_this,
...@@ -90,7 +78,8 @@ void FeedOfflineBridge::GetOfflineStatus(JNIEnv* env, ...@@ -90,7 +78,8 @@ void FeedOfflineBridge::GetOfflineStatus(JNIEnv* env,
base::android::AppendJavaStringArrayToStringVector(env, j_urls, &urls); base::android::AppendJavaStringArrayToStringVector(env, j_urls, &urls);
ScopedJavaGlobalRef<jobject> callback(j_callback); ScopedJavaGlobalRef<jobject> callback(j_callback);
offline_host_->GetOfflineStatus( offline_host_->GetOfflineStatus(
std::move(urls), base::BindOnce(&OnGetOfflineStatus, callback)); std::move(urls), base::BindOnce(&FeedOfflineBridge::OnGetOfflineStatus,
weak_factory_.GetWeakPtr(), callback));
} }
void FeedOfflineBridge::OnContentRemoved( void FeedOfflineBridge::OnContentRemoved(
...@@ -170,4 +159,13 @@ void FeedOfflineBridge::NotifyStatusChange(const std::string& url, ...@@ -170,4 +159,13 @@ void FeedOfflineBridge::NotifyStatusChange(const std::string& url,
available_offline); available_offline);
} }
void FeedOfflineBridge::OnGetOfflineStatus(
ScopedJavaGlobalRef<jobject> callback,
std::vector<std::string> urls) {
JNIEnv* env = base::android::AttachCurrentThread();
ScopedJavaLocalRef<jobjectArray> j_urls =
base::android::ToJavaArrayOfStrings(env, urls);
RunObjectCallbackAndroid(callback, j_urls);
}
} // namespace feed } // namespace feed
...@@ -79,6 +79,9 @@ class FeedOfflineBridge { ...@@ -79,6 +79,9 @@ class FeedOfflineBridge {
// call FeedOfflineHost::OnGetKnownContentDone() on async completion. // call FeedOfflineHost::OnGetKnownContentDone() on async completion.
void TriggerGetKnownContent(); void TriggerGetKnownContent();
void OnGetOfflineStatus(base::android::ScopedJavaGlobalRef<jobject> callback,
std::vector<std::string> urls);
// Reference to the Java half of this bridge. Always valid. // Reference to the Java half of this bridge. Always valid.
base::android::ScopedJavaGlobalRef<jobject> j_this_; base::android::ScopedJavaGlobalRef<jobject> j_this_;
......
...@@ -46,7 +46,7 @@ FeedSchedulerBridge::FeedSchedulerBridge(const JavaRef<jobject>& j_this, ...@@ -46,7 +46,7 @@ FeedSchedulerBridge::FeedSchedulerBridge(const JavaRef<jobject>& j_this,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
FeedSchedulerBridge::~FeedSchedulerBridge() {} FeedSchedulerBridge::~FeedSchedulerBridge() = default;
void FeedSchedulerBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) { void FeedSchedulerBridge::Destroy(JNIEnv* env, const JavaRef<jobject>& j_this) {
delete this; delete this;
...@@ -86,9 +86,9 @@ void FeedSchedulerBridge::OnFixedTimer( ...@@ -86,9 +86,9 @@ void FeedSchedulerBridge::OnFixedTimer(
JNIEnv* env, JNIEnv* env,
const JavaRef<jobject>& j_this, const JavaRef<jobject>& j_this,
const base::android::JavaRef<jobject>& j_callback) { const base::android::JavaRef<jobject>& j_callback) {
base::OnceClosure callback = base::OnceClosure callback = base::BindOnce(
base::BindOnce(&base::android::RunObjectCallbackAndroid, &FeedSchedulerBridge::FixedTimerHandlingDone, weak_factory_.GetWeakPtr(),
ScopedJavaGlobalRef<jobject>(j_callback), nullptr); ScopedJavaGlobalRef<jobject>(j_callback));
scheduler_host_->OnFixedTimer(std::move(callback)); scheduler_host_->OnFixedTimer(std::move(callback));
} }
...@@ -114,4 +114,9 @@ void FeedSchedulerBridge::CancelWakeUp() { ...@@ -114,4 +114,9 @@ void FeedSchedulerBridge::CancelWakeUp() {
Java_FeedSchedulerBridge_cancelWakeUp(env, j_this_); Java_FeedSchedulerBridge_cancelWakeUp(env, j_this_);
} }
void FeedSchedulerBridge::FixedTimerHandlingDone(
ScopedJavaGlobalRef<jobject> j_callback) {
base::android::RunObjectCallbackAndroid(j_callback, nullptr);
}
} // namespace feed } // namespace feed
...@@ -68,6 +68,9 @@ class FeedSchedulerBridge { ...@@ -68,6 +68,9 @@ class FeedSchedulerBridge {
// Cancels previously scheduled background task. // Cancels previously scheduled background task.
void CancelWakeUp(); void CancelWakeUp();
void FixedTimerHandlingDone(
base::android::ScopedJavaGlobalRef<jobject> j_callback);
// Reference to the Java half of this bridge. Always valid. // Reference to the Java half of this bridge. Always valid.
base::android::ScopedJavaGlobalRef<jobject> j_this_; base::android::ScopedJavaGlobalRef<jobject> j_this_;
......
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