Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2850)

Unified Diff: android_webview/native/android_protocol_handler.cc

Issue 2800833003: Revert of Android: Remove GetApplicationContext part 2 (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: android_webview/native/android_protocol_handler.cc
diff --git a/android_webview/native/android_protocol_handler.cc b/android_webview/native/android_protocol_handler.cc
index b90feaada9eb4c3e9f033926a83ae860423e4b3f..62243c6ce08a6e1048fb97af3ed7d8ab11609628 100644
--- a/android_webview/native/android_protocol_handler.cc
+++ b/android_webview/native/android_protocol_handler.cc
@@ -10,6 +10,7 @@
#include "android_webview/browser/net/aw_url_request_job_factory.h"
#include "android_webview/common/url_constants.h"
#include "android_webview/native/input_stream_impl.h"
+#include "base/android/context_utils.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/jni_weak_ref.h"
@@ -37,6 +38,17 @@
namespace {
+// Override resource context for reading resource and asset files. Used for
+// testing.
+JavaObjectWeakGlobalRef* g_resource_context = NULL;
+
+void ResetResourceContext(JavaObjectWeakGlobalRef* ref) {
+ if (g_resource_context)
+ delete g_resource_context;
+
+ g_resource_context = ref;
+}
+
void* kPreviouslyFailedKey = &kPreviouslyFailedKey;
void MarkRequestAsFailed(net::URLRequest* request) {
@@ -96,6 +108,12 @@
ContentSchemeRequestInterceptor();
bool ShouldHandleRequest(const net::URLRequest* request) const override;
};
+
+static ScopedJavaLocalRef<jobject> GetResourceContext(JNIEnv* env) {
+ if (g_resource_context)
+ return g_resource_context->get(env);
+ return ScopedJavaLocalRef<jobject>(base::android::GetApplicationContext());
+}
// AndroidStreamReaderURLRequestJobDelegateImpl -------------------------------
@@ -116,7 +134,8 @@
ScopedJavaLocalRef<jstring> jurl =
ConvertUTF8ToJavaString(env, url.spec());
ScopedJavaLocalRef<jobject> stream =
- android_webview::Java_AndroidProtocolHandler_open(env, jurl);
+ android_webview::Java_AndroidProtocolHandler_open(
+ env, GetResourceContext(env), jurl);
if (stream.is_null()) {
DLOG(ERROR) << "Unable to open input stream for Android URL";
@@ -150,7 +169,7 @@
InputStreamImpl::FromInputStream(stream);
ScopedJavaLocalRef<jstring> returned_type =
android_webview::Java_AndroidProtocolHandler_getMimeType(
- env, stream_impl->jobj(), url);
+ env, GetResourceContext(env), stream_impl->jobj(), url);
if (returned_type.is_null())
return false;
@@ -242,6 +261,23 @@
new AssetFileRequestInterceptor());
}
+// Set a context object to be used for resolving resource queries. This can
+// be used to override the default application context and redirect all
+// resource queries to a specific context object, e.g., for the purposes of
+// testing.
+//
+// |context| should be a android.content.Context instance or NULL to enable
+// the use of the standard application context.
+static void SetResourceContextForTesting(JNIEnv* env,
+ const JavaParamRef<jclass>& /*clazz*/,
+ const JavaParamRef<jobject>& context) {
+ if (context) {
+ ResetResourceContext(new JavaObjectWeakGlobalRef(env, context));
+ } else {
+ ResetResourceContext(NULL);
+ }
+}
+
static ScopedJavaLocalRef<jstring> GetAndroidAssetPath(
JNIEnv* env,
const JavaParamRef<jclass>& /*clazz*/) {

Powered by Google App Engine
This is Rietveld 408576698