Allow OpenApkAsset() to open resource files as well as assets.

This will be necessary for when language .pak files are moved to
res/raw (for apk splits).

BUG=394502

Review URL: https://codereview.chromium.org/1156573008

Cr-Commit-Position: refs/heads/master@{#332998}
diff --git a/android_webview/browser/aw_browser_main_parts.cc b/android_webview/browser/aw_browser_main_parts.cc
index 4ea656ce..4e5548e 100644
--- a/android_webview/browser/aw_browser_main_parts.cc
+++ b/android_webview/browser/aw_browser_main_parts.cc
@@ -61,7 +61,8 @@
       base::android::GetDefaultLocale(),
       NULL,
       ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
-  std::string locale = l10n_util::GetApplicationLocale(std::string()) + ".pak";
+  std::string locale =
+      "assets/" + l10n_util::GetApplicationLocale(std::string()) + ".pak";
   int pak_fd = base::android::OpenApkAsset(locale, &pak_region);
   if (pak_fd != -1) {
     ui::ResourceBundle::CleanupSharedInstance();
@@ -74,7 +75,8 @@
 
   // Try to directly mmap the webviewchromium.pak from the apk. Fall back to
   // load from file, using PATH_SERVICE, otherwise.
-  pak_fd = base::android::OpenApkAsset("webviewchromium.pak", &pak_region);
+  pak_fd = base::android::OpenApkAsset("assets/webviewchromium.pak",
+                                       &pak_region);
   if (pak_fd != -1) {
     ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion(
         base::File(pak_fd), pak_region, ui::SCALE_FACTOR_NONE);
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 60ad9f82..fa67e9f 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -106,11 +106,11 @@
   // AwContentBrowserClient::GetAdditionalMappedFilesForChildProcess.
 #ifdef V8_USE_EXTERNAL_STARTUP_DATA
 #ifdef __LP64__
-  const char kNativesFileName[] = "natives_blob_64.bin";
-  const char kSnapshotFileName[] = "snapshot_blob_64.bin";
+  const char kNativesFileName[] = "assets/natives_blob_64.bin";
+  const char kSnapshotFileName[] = "assets/snapshot_blob_64.bin";
 #else
-  const char kNativesFileName[] = "natives_blob_32.bin";
-  const char kSnapshotFileName[] = "snapshot_blob_32.bin";
+  const char kNativesFileName[] = "assets/natives_blob_32.bin";
+  const char kSnapshotFileName[] = "assets/snapshot_blob_32.bin";
 #endif // __LP64__
   // TODO(gsennton) we should use
   // gin::IsolateHolder::kNativesFileName/kSnapshotFileName
@@ -121,7 +121,7 @@
       kV8SnapshotDataDescriptor, kSnapshotFileName));
 #endif
   CHECK(base::android::RegisterApkAssetWithGlobalDescriptors(
-      kAndroidICUDataDescriptor, base::i18n::kIcuDataFileName));
+      kAndroidICUDataDescriptor, "assets/icudtl.dat"));
 
   return false;
 }
diff --git a/android_webview/native/aw_media_url_interceptor.cc b/android_webview/native/aw_media_url_interceptor.cc
index 6923d69..a2c1cdd 100644
--- a/android_webview/native/aw_media_url_interceptor.cc
+++ b/android_webview/native/aw_media_url_interceptor.cc
@@ -21,7 +21,8 @@
 
   if (StartsWithASCII(url, asset_file_prefix, true)) {
     std::string filename(url);
-    ReplaceFirstSubstringAfterOffset(&filename, 0, asset_file_prefix, "");
+    ReplaceFirstSubstringAfterOffset(
+        &filename, 0, asset_file_prefix, "assets/");
     base::MemoryMappedFile::Region region =
         base::MemoryMappedFile::Region::kWholeFile;
     *fd = base::android::OpenApkAsset(filename, &region);
diff --git a/base/android/apk_assets.cc b/base/android/apk_assets.cc
index 431c75c..bcdac6d 100644
--- a/base/android/apk_assets.cc
+++ b/base/android/apk_assets.cc
@@ -18,13 +18,15 @@
   return RegisterNativesImpl(env);
 }
 
-int OpenApkAsset(const std::string& filename,
+int OpenApkAsset(const std::string& file_path,
                  base::MemoryMappedFile::Region* region) {
+  // The AAssetManager API of the NDK is does not expose a method for accessing
+  // raw resources :(.
   JNIEnv* env = base::android::AttachCurrentThread();
-  ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_openAsset(
+  ScopedJavaLocalRef<jlongArray> jarr = Java_ApkAssets_open(
       env,
       base::android::GetApplicationContext(),
-      base::android::ConvertUTF8ToJavaString(env, filename).Release());
+      base::android::ConvertUTF8ToJavaString(env, file_path).Release());
   std::vector<jlong> results;
   base::android::JavaLongArrayToLongVector(env, jarr.obj(), &results);
   CHECK_EQ(3U, results.size());
@@ -35,10 +37,10 @@
 }
 
 bool RegisterApkAssetWithGlobalDescriptors(base::GlobalDescriptors::Key key,
-                                           const std::string& asset_filename) {
+                                           const std::string& file_path) {
   base::MemoryMappedFile::Region region =
       base::MemoryMappedFile::Region::kWholeFile;
-  int asset_fd = OpenApkAsset(asset_filename, &region);
+  int asset_fd = OpenApkAsset(file_path, &region);
   if (asset_fd != -1) {
     base::GlobalDescriptors::GetInstance()->Set(key, asset_fd, region);
   }
diff --git a/base/android/apk_assets.h b/base/android/apk_assets.h
index f5df35d..6eb5da3 100644
--- a/base/android/apk_assets.h
+++ b/base/android/apk_assets.h
@@ -20,17 +20,19 @@
 // Can be used from renderer process.
 // Fails if the asset is not stored uncompressed within the .apk.
 // Returns: The File Descriptor of the asset, or -1 upon failure.
+// Input arguments:
+// - |file_path|: Path to file within .apk. e.g.: assets/foo.pak
 // Output arguments:
 // - |region|: size & offset (in bytes) within the .apk of the asset.
 BASE_EXPORT int OpenApkAsset(
-    const std::string& filename,
+    const std::string& file_path,
     base::MemoryMappedFile::Region* region);
 
 // Registers an uncompressed asset from within the apk with GlobalDescriptors.
 // Returns: true in case of success, false otherwise.
 BASE_EXPORT bool RegisterApkAssetWithGlobalDescriptors(
     base::GlobalDescriptors::Key key,
-    const std::string& asset_filename);
+    const std::string& file_path);
 
 }  // namespace android
 }  // namespace base
diff --git a/base/android/java/src/org/chromium/base/ApkAssets.java b/base/android/java/src/org/chromium/base/ApkAssets.java
index 0b7bc32..329660f 100644
--- a/base/android/java/src/org/chromium/base/ApkAssets.java
+++ b/base/android/java/src/org/chromium/base/ApkAssets.java
@@ -21,11 +21,11 @@
     private static final String LOGTAG = "ApkAssets";
 
     @CalledByNative
-    public static long[] openAsset(Context context, String fileName) {
+    public static long[] open(Context context, String fileName) {
         AssetFileDescriptor afd = null;
         try {
             AssetManager manager = context.getAssets();
-            afd = manager.openFd(fileName);
+            afd = manager.openNonAssetFd(fileName);
             return new long[] { afd.getParcelFileDescriptor().detachFd(),
                                 afd.getStartOffset(),
                                 afd.getLength() };