summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkosiba@chromium.org <mkosiba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-29 22:50:49 +0000
committermkosiba@chromium.org <mkosiba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-29 22:50:49 +0000
commitf617a70257d3e9e059d7beb3e5279607a1d73b6d (patch)
tree4ee4a7861162c25eee65f32eb5633914678fc7d9
parent938b23821ee343274ca4b9d55d5da3ffb3126651 (diff)
downloadchromium_src-f617a70257d3e9e059d7beb3e5279607a1d73b6d.zip
chromium_src-f617a70257d3e9e059d7beb3e5279607a1d73b6d.tar.gz
chromium_src-f617a70257d3e9e059d7beb3e5279607a1d73b6d.tar.bz2
Make it possible to find locale pak files in the Android apk.
This makes it possible for the ResourceBundle class to 'see' .pak files directly embedded in the apk. This enables the webview to directly mmap the files without extracting them to disk first. BUG=394502 Review URL: https://codereview.chromium.org/422533004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@286324 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ui/android/BUILD.gn1
-rw-r--r--ui/android/java/src/org/chromium/ui/base/ResourceBundle.java32
-rw-r--r--ui/base/BUILD.gn1
-rw-r--r--ui/base/android/ui_base_jni_registrar.cc2
-rw-r--r--ui/base/resource/resource_bundle.cc25
-rw-r--r--ui/base/resource/resource_bundle_android.cc15
-rw-r--r--ui/base/resource/resource_bundle_android.h20
-rw-r--r--ui/base/ui_base.gyp1
8 files changed, 94 insertions, 3 deletions
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn
index 8b2d7d5..875815d 100644
--- a/ui/android/BUILD.gn
+++ b/ui/android/BUILD.gn
@@ -104,6 +104,7 @@ android_library("ui_java") {
"java/src/org/chromium/ui/base/Clipboard.java",
"java/src/org/chromium/ui/base/DeviceFormFactor.java",
"java/src/org/chromium/ui/base/LocalizationUtils.java",
+ "java/src/org/chromium/ui/base/ResourceBundle.java",
"java/src/org/chromium/ui/base/SelectFileDialog.java",
"java/src/org/chromium/ui/base/TouchDevice.java",
"java/src/org/chromium/ui/base/ViewAndroid.java",
diff --git a/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java b/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java
new file mode 100644
index 0000000..a17975c
--- /dev/null
+++ b/ui/android/java/src/org/chromium/ui/base/ResourceBundle.java
@@ -0,0 +1,32 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.ui.base;
+
+import android.content.Context;
+import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
+
+import org.chromium.base.CalledByNative;
+import org.chromium.base.JNINamespace;
+
+import java.io.IOException;
+
+/**
+ * This class provides the resource bundle related methods for the native library.
+ */
+@JNINamespace("ui")
+class ResourceBundle {
+ @CalledByNative
+ static boolean assetContainedInApk(Context ctx, String filename) {
+ try {
+ AssetManager am = ctx.getAssets();
+ AssetFileDescriptor afd = am.openFd(filename);
+ afd.close();
+ return true;
+ } catch (IOException e) {
+ return false;
+ }
+ }
+}
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index dfe9ac80..08c3070 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -569,6 +569,7 @@ if (is_android) {
"../android/java/src/org/chromium/ui/base/Clipboard.java",
"../android/java/src/org/chromium/ui/base/DeviceFormFactor.java",
"../android/java/src/org/chromium/ui/base/LocalizationUtils.java",
+ "../android/java/src/org/chromium/ui/base/ResourceBundle.java",
"../android/java/src/org/chromium/ui/base/SelectFileDialog.java",
"../android/java/src/org/chromium/ui/base/TouchDevice.java",
"../android/java/src/org/chromium/ui/base/ViewAndroid.java",
diff --git a/ui/base/android/ui_base_jni_registrar.cc b/ui/base/android/ui_base_jni_registrar.cc
index cf4b579..23f3934 100644
--- a/ui/base/android/ui_base_jni_registrar.cc
+++ b/ui/base/android/ui_base_jni_registrar.cc
@@ -11,6 +11,7 @@
#include "ui/base/clipboard/clipboard_android_initialization.h"
#include "ui/base/device_form_factor_android.h"
#include "ui/base/l10n/l10n_util_android.h"
+#include "ui/base/resource/resource_bundle_android.h"
#include "ui/base/touch/touch_device.h"
namespace ui {
@@ -20,6 +21,7 @@ static base::android::RegistrationMethod kUiRegisteredMethods[] = {
{ "Clipboard", RegisterClipboardAndroid },
{ "DeviceFormFactor", RegisterDeviceFormFactorAndroid },
{ "LocalizationUtils", l10n_util::RegisterLocalizationUtil },
+ { "ResourceBundle", RegisterResourceBundleAndroid },
{ "TouchDevice", RegisterTouchDeviceAndroid },
{ "ViewAndroid", ViewAndroid::RegisterViewAndroid },
{ "WindowAndroid", WindowAndroid::RegisterWindowAndroid },
diff --git a/ui/base/resource/resource_bundle.cc b/ui/base/resource/resource_bundle.cc
index 0ae7924..c7e6834 100644
--- a/ui/base/resource/resource_bundle.cc
+++ b/ui/base/resource/resource_bundle.cc
@@ -36,6 +36,10 @@
#include "ui/gfx/screen.h"
#include "ui/gfx/size_conversions.h"
+#if defined(OS_ANDROID)
+#include "ui/base/resource/resource_bundle_android.h"
+#endif
+
#if defined(OS_CHROMEOS)
#include "ui/base/l10n/l10n_util.h"
#include "ui/gfx/platform_font_pango.h"
@@ -65,6 +69,10 @@ const size_t kPngChunkMetadataSize = 12; // length, type, crc32
const unsigned char kPngScaleChunkType[4] = { 'c', 's', 'C', 'l' };
const unsigned char kPngDataChunkType[4] = { 'I', 'D', 'A', 'T' };
+#if !defined(OS_MACOSX)
+const char kPakFileSuffix[] = ".pak";
+#endif
+
ResourceBundle* g_shared_instance_ = NULL;
void InitDefaultFontList() {
@@ -221,7 +229,16 @@ ResourceBundle& ResourceBundle::GetSharedInstance() {
}
bool ResourceBundle::LocaleDataPakExists(const std::string& locale) {
- return !GetLocaleFilePath(locale, true).empty();
+ bool locale_file_path_exists = !GetLocaleFilePath(locale, true).empty();
+#if defined(OS_ANDROID)
+ // TODO(mkosiba,primiano): Chrome should mmap the .pak files too, in which
+ // case we'd not need to check if locale_file_path_exists here.
+ // http://crbug.com/394502.
+ return locale_file_path_exists ||
+ AssetContainedInApk(locale + kPakFileSuffix);
+#else
+ return locale_file_path_exists;
+#endif
}
void ResourceBundle::AddDataPackFromPath(const base::FilePath& path,
@@ -264,8 +281,10 @@ base::FilePath ResourceBundle::GetLocaleFilePath(const std::string& app_locale,
PathService::Get(ui::DIR_LOCALES, &locale_file_path);
- if (!locale_file_path.empty())
- locale_file_path = locale_file_path.AppendASCII(app_locale + ".pak");
+ if (!locale_file_path.empty()) {
+ locale_file_path =
+ locale_file_path.AppendASCII(app_locale + kPakFileSuffix);
+ }
if (delegate_) {
locale_file_path =
diff --git a/ui/base/resource/resource_bundle_android.cc b/ui/base/resource/resource_bundle_android.cc
index b194269..630ad5c 100644
--- a/ui/base/resource/resource_bundle_android.cc
+++ b/ui/base/resource/resource_bundle_android.cc
@@ -6,11 +6,14 @@
#include <string>
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
#include "base/file_util.h"
#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/strings/stringprintf.h"
+#include "jni/ResourceBundle_jni.h"
#include "ui/base/resource/resource_handle.h"
#include "ui/base/ui_base_paths.h"
@@ -29,4 +32,16 @@ gfx::Image& ResourceBundle::GetNativeImageNamed(int resource_id, ImageRTL rtl) {
return GetImageNamed(resource_id);
}
+bool AssetContainedInApk(const std::string& filename) {
+ JNIEnv* env = base::android::AttachCurrentThread();
+ return Java_ResourceBundle_assetContainedInApk(
+ env,
+ base::android::GetApplicationContext(),
+ base::android::ConvertUTF8ToJavaString(env, filename).obj());
+}
+
+bool RegisterResourceBundleAndroid(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
}
diff --git a/ui/base/resource/resource_bundle_android.h b/ui/base/resource/resource_bundle_android.h
new file mode 100644
index 0000000..d1400f8
--- /dev/null
+++ b/ui/base/resource/resource_bundle_android.h
@@ -0,0 +1,20 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_RESOURCE_RESOURCE_BUNDLE_ANDROID_H_
+#define UI_BASE_RESOURCE_RESOURCE_BUNDLE_ANDROID_H_
+
+#include "base/basictypes.h"
+
+namespace ui {
+
+// Checks whether the locale data pak is contained within the .apk.
+bool AssetContainedInApk(const std::string& filename);
+
+bool RegisterResourceBundleAndroid(JNIEnv* env);
+
+} // namespace ui
+
+#endif // UI_BASE_RESOURCE_RESOURCE_BUNDLE_ANDROID_H_
+
diff --git a/ui/base/ui_base.gyp b/ui/base/ui_base.gyp
index c984834..e677122 100644
--- a/ui/base/ui_base.gyp
+++ b/ui/base/ui_base.gyp
@@ -739,6 +739,7 @@
'../android/java/src/org/chromium/ui/base/Clipboard.java',
'../android/java/src/org/chromium/ui/base/DeviceFormFactor.java',
'../android/java/src/org/chromium/ui/base/LocalizationUtils.java',
+ '../android/java/src/org/chromium/ui/base/ResourceBundle.java',
'../android/java/src/org/chromium/ui/base/SelectFileDialog.java',
'../android/java/src/org/chromium/ui/base/TouchDevice.java',
'../android/java/src/org/chromium/ui/base/ViewAndroid.java',