diff options
-rw-r--r-- | android_webview/java/src/org/chromium/android_webview/AwSettings.java | 199 | ||||
-rw-r--r-- | android_webview/native/aw_settings.cc | 262 | ||||
-rw-r--r-- | android_webview/native/aw_settings.h | 18 |
3 files changed, 244 insertions, 235 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index cd8c484..2cbaf53 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -132,7 +132,7 @@ public class AwSettings { switch (msg.what) { case UPDATE_WEBKIT_PREFERENCES: synchronized (mAwSettingsLock) { - updateWebkitPreferencesOnUiThread(); + updateWebkitPreferencesOnUiThreadLocked(); mIsUpdateWebkitPrefsMessagePending = false; mAwSettingsLock.notifyAll(); } @@ -146,7 +146,7 @@ public class AwSettings { assert Thread.holdsLock(mAwSettingsLock); if (mNativeAwSettings == 0) return; if (Looper.myLooper() == mHandler.getLooper()) { - updateWebkitPreferencesOnUiThread(); + updateWebkitPreferencesOnUiThreadLocked(); } else { // We're being called on a background thread, so post a message. if (mIsUpdateWebkitPrefsMessagePending) { @@ -175,8 +175,6 @@ public class AwSettings { android.Manifest.permission.INTERNET, Process.myPid(), Process.myUid()) != PackageManager.PERMISSION_GRANTED; - mNativeAwSettings = nativeInit(nativeWebContents); - assert mNativeAwSettings != 0; mContentViewCore = contentViewCore; mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked()); @@ -187,7 +185,11 @@ public class AwSettings { mEventHandler = new EventHandler(); mUserAgent = LazyDefaultUserAgent.sInstance; - nativeUpdateEverything(mNativeAwSettings); + + synchronized (mAwSettingsLock) { + mNativeAwSettings = nativeInit(nativeWebContents); + } + assert mNativeAwSettings != 0; } public void destroy() { @@ -201,9 +203,14 @@ public class AwSettings { } } + @CalledByNative + private double getDIPScaleLocked() { + return mDIPScale; + } + public void setWebContents(int nativeWebContents) { synchronized (mAwSettingsLock) { - nativeSetWebContents(mNativeAwSettings, nativeWebContents); + nativeSetWebContentsLocked(mNativeAwSettings, nativeWebContents); } } @@ -301,11 +308,6 @@ public class AwSettings { } } - @Deprecated - public void setEnableFixedLayoutMode(final boolean enable) { - // No-op. Will be removed. - } - /** * See {@link android.webkit.WebView#setInitialScale}. */ @@ -317,7 +319,7 @@ public class AwSettings { @Override public void run() { if (mNativeAwSettings != 0) { - nativeUpdateInitialPageScale(mNativeAwSettings); + nativeUpdateInitialPageScaleLocked(mNativeAwSettings); } } }); @@ -325,6 +327,11 @@ public class AwSettings { } } + @CalledByNative + private float getInitialPageScalePercentLocked() { + return mInitialPageScalePercent; + } + /** * See {@link android.webkit.WebSettings#setNeedInitialFocus}. */ @@ -378,7 +385,7 @@ public class AwSettings { @Override public void run() { if (mNativeAwSettings != 0) { - nativeUpdateUserAgent(mNativeAwSettings); + nativeUpdateUserAgentLocked(mNativeAwSettings); } } }); @@ -395,6 +402,11 @@ public class AwSettings { } } + @CalledByNative + private String getUserAgentLocked() { + return mUserAgent; + } + /** * See {@link android.webkit.WebSettings#setLoadWithOverviewMode}. */ @@ -424,6 +436,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getLoadWithOverviewModeLocked() { + return mLoadWithOverviewMode; + } + /** * See {@link android.webkit.WebSettings#setTextZoom}. */ @@ -445,6 +462,11 @@ public class AwSettings { } } + @CalledByNative + private int getTextSizePercentLocked() { + return mTextSizePercent; + } + /** * See {@link android.webkit.WebSettings#setStandardFontFamily}. */ @@ -466,6 +488,11 @@ public class AwSettings { } } + @CalledByNative + private String getStandardFontFamilyLocked() { + return mStandardFontFamily; + } + /** * See {@link android.webkit.WebSettings#setFixedFontFamily}. */ @@ -487,6 +514,11 @@ public class AwSettings { } } + @CalledByNative + private String getFixedFontFamilyLocked() { + return mFixedFontFamily; + } + /** * See {@link android.webkit.WebSettings#setSansSerifFontFamily}. */ @@ -508,6 +540,11 @@ public class AwSettings { } } + @CalledByNative + private String getSansSerifFontFamilyLocked() { + return mSansSerifFontFamily; + } + /** * See {@link android.webkit.WebSettings#setSerifFontFamily}. */ @@ -529,6 +566,11 @@ public class AwSettings { } } + @CalledByNative + private String getSerifFontFamilyLocked() { + return mSerifFontFamily; + } + /** * See {@link android.webkit.WebSettings#setCursiveFontFamily}. */ @@ -550,6 +592,11 @@ public class AwSettings { } } + @CalledByNative + private String getCursiveFontFamilyLocked() { + return mCursiveFontFamily; + } + /** * See {@link android.webkit.WebSettings#setFantasyFontFamily}. */ @@ -571,6 +618,11 @@ public class AwSettings { } } + @CalledByNative + private String getFantasyFontFamilyLocked() { + return mFantasyFontFamily; + } + /** * See {@link android.webkit.WebSettings#setMinimumFontSize}. */ @@ -593,6 +645,11 @@ public class AwSettings { } } + @CalledByNative + private int getMinimumFontSizeLocked() { + return mMinimumFontSize; + } + /** * See {@link android.webkit.WebSettings#setMinimumLogicalFontSize}. */ @@ -615,6 +672,11 @@ public class AwSettings { } } + @CalledByNative + private int getMinimumLogicalFontSizeLocked() { + return mMinimumLogicalFontSize; + } + /** * See {@link android.webkit.WebSettings#setDefaultFontSize}. */ @@ -637,6 +699,11 @@ public class AwSettings { } } + @CalledByNative + private int getDefaultFontSizeLocked() { + return mDefaultFontSize; + } + /** * See {@link android.webkit.WebSettings#setDefaultFixedFontSize}. */ @@ -659,6 +726,11 @@ public class AwSettings { } } + @CalledByNative + private int getDefaultFixedFontSizeLocked() { + return mDefaultFixedFontSize; + } + /** * See {@link android.webkit.WebSettings#setJavaScriptEnabled}. */ @@ -716,6 +788,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getLoadsImagesAutomaticallyLocked() { + return mLoadsImagesAutomatically; + } + /** * See {@link android.webkit.WebSettings#setImagesEnabled}. */ @@ -737,6 +814,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getImagesEnabledLocked() { + return mImagesEnabled; + } + /** * See {@link android.webkit.WebSettings#getJavaScriptEnabled}. */ @@ -746,6 +828,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getJavaScriptEnabledLocked() { + return mJavaScriptEnabled; + } + /** * See {@link android.webkit.WebSettings#getAllowUniversalAccessFromFileURLs}. */ @@ -755,6 +842,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getAllowUniversalAccessFromFileURLsLocked() { + return mAllowUniversalAccessFromFileURLs; + } + /** * See {@link android.webkit.WebSettings#getAllowFileAccessFromFileURLs}. */ @@ -764,6 +856,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getAllowFileAccessFromFileURLsLocked() { + return mAllowFileAccessFromFileURLs; + } + /** * See {@link android.webkit.WebSettings#setPluginsEnabled}. */ @@ -800,9 +897,7 @@ public class AwSettings { * @hide */ @CalledByNative - private boolean getPluginsDisabled() { - // This should only be called from UpdateWebkitPreferences, which is called - // either from the constructor, or with mAwSettingsLock being held. + private boolean getPluginsDisabledLocked() { return mPluginState == PluginState.OFF; } @@ -837,6 +932,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getJavaScriptCanOpenWindowsAutomaticallyLocked() { + return mJavaScriptCanOpenWindowsAutomatically; + } + /** * See {@link android.webkit.WebSettings#setLayoutAlgorithm}. */ @@ -865,7 +965,7 @@ public class AwSettings { * @hide */ @CalledByNative - private boolean getTextAutosizingEnabled() { + private boolean getTextAutosizingEnabledLocked() { return mLayoutAlgorithm == LayoutAlgorithm.TEXT_AUTOSIZING; } @@ -890,6 +990,16 @@ public class AwSettings { } } + @CalledByNative + private boolean getSupportMultipleWindowsLocked() { + return mSupportMultipleWindows; + } + + @CalledByNative + private boolean getSupportDeprecatedTargetDensityDPILocked() { + return mSupportDeprecatedTargetDensityDPI; + } + /** * See {@link android.webkit.WebSettings#setUseWideViewPort}. */ @@ -911,6 +1021,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getUseWideViewportLocked() { + return mUseWideViewport; + } + /** * See {@link android.webkit.WebSettings#setAppCacheEnabled}. */ @@ -952,9 +1067,7 @@ public class AwSettings { * @hide */ @CalledByNative - private boolean getAppCacheEnabled() { - // This should only be called from UpdateWebkitPreferences, which is called - // either from the constructor, or with mAwSettingsLock being held. + private boolean getAppCacheEnabledLocked() { if (!mAppCacheEnabled) { return false; } @@ -984,6 +1097,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getDomStorageEnabledLocked() { + return mDomStorageEnabled; + } + /** * See {@link android.webkit.WebSettings#setDatabaseEnabled}. */ @@ -1005,6 +1123,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getDatabaseEnabledLocked() { + return mDatabaseEnabled; + } + /** * See {@link android.webkit.WebSettings#setDefaultTextEncodingName}. */ @@ -1026,6 +1149,11 @@ public class AwSettings { } } + @CalledByNative + private String getDefaultTextEncodingLocked() { + return mDefaultTextEncoding; + } + /** * See {@link android.webkit.WebSettings#setMediaPlaybackRequiresUserGesture}. */ @@ -1047,6 +1175,11 @@ public class AwSettings { } } + @CalledByNative + private boolean getMediaPlaybackRequiresUserGestureLocked() { + return mMediaPlaybackRequiresUserGesture; + } + /** * See {@link android.webkit.WebSettings#setDefaultVideoPosterURL}. */ @@ -1069,6 +1202,11 @@ public class AwSettings { } } + @CalledByNative + private String getDefaultVideoPosterURLLocked() { + return mDefaultVideoPosterURL; + } + private void updateMultiTouchZoomSupport(final boolean supportsMultiTouchZoom) { ThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override @@ -1163,10 +1301,17 @@ public class AwSettings { return size; } - private void updateWebkitPreferencesOnUiThread() { + @CalledByNative + private void updateEverything() { + synchronized (mAwSettingsLock) { + nativeUpdateEverythingLocked(mNativeAwSettings); + } + } + + private void updateWebkitPreferencesOnUiThreadLocked() { if (mNativeAwSettings != 0) { ThreadUtils.assertOnUiThread(); - nativeUpdateWebkitPreferences(mNativeAwSettings); + nativeUpdateWebkitPreferencesLocked(mNativeAwSettings); } } @@ -1176,15 +1321,15 @@ public class AwSettings { private native void nativeResetScrollAndScaleState(int nativeAwSettings); - private native void nativeSetWebContents(int nativeAwSettings, int nativeWebContents); + private native void nativeSetWebContentsLocked(int nativeAwSettings, int nativeWebContents); - private native void nativeUpdateEverything(int nativeAwSettings); + private native void nativeUpdateEverythingLocked(int nativeAwSettings); - private native void nativeUpdateInitialPageScale(int nativeAwSettings); + private native void nativeUpdateInitialPageScaleLocked(int nativeAwSettings); - private native void nativeUpdateUserAgent(int nativeAwSettings); + private native void nativeUpdateUserAgentLocked(int nativeAwSettings); - private native void nativeUpdateWebkitPreferences(int nativeAwSettings); + private native void nativeUpdateWebkitPreferencesLocked(int nativeAwSettings); private static native String nativeGetDefaultUserAgent(); } diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc index 8dd383e..21b9968 100644 --- a/android_webview/native/aw_settings.cc +++ b/android_webview/native/aw_settings.cc @@ -18,119 +18,12 @@ #include "webkit/glue/webpreferences.h" #include "webkit/user_agent/user_agent.h" -using base::android::CheckException; using base::android::ConvertJavaStringToUTF16; -using base::android::ConvertUTF16ToJavaString; using base::android::ConvertUTF8ToJavaString; -using base::android::GetClass; -using base::android::GetFieldID; -using base::android::GetMethodIDFromClassName; using base::android::ScopedJavaLocalRef; namespace android_webview { -struct AwSettings::FieldIds { - // Note on speed. One may think that an approach that reads field values via - // JNI is ineffective and should not be used. Please keep in mind that in the - // legacy WebView the whole Sync method took <1ms on Xoom, and no one is - // expected to modify settings in performance-critical code. - FieldIds() { } - - FieldIds(JNIEnv* env) { - const char* kStringClassName = "Ljava/lang/String;"; - - // FIXME: we should be using a new GetFieldIDFromClassName() with caching. - ScopedJavaLocalRef<jclass> clazz( - GetClass(env, "org/chromium/android_webview/AwSettings")); - text_size_percent = GetFieldID(env, clazz, "mTextSizePercent", "I"); - standard_fond_family = - GetFieldID(env, clazz, "mStandardFontFamily", kStringClassName); - fixed_font_family = - GetFieldID(env, clazz, "mFixedFontFamily", kStringClassName); - sans_serif_font_family = - GetFieldID(env, clazz, "mSansSerifFontFamily", kStringClassName); - serif_font_family = - GetFieldID(env, clazz, "mSerifFontFamily", kStringClassName); - cursive_font_family = - GetFieldID(env, clazz, "mCursiveFontFamily", kStringClassName); - fantasy_font_family = - GetFieldID(env, clazz, "mFantasyFontFamily", kStringClassName); - default_text_encoding = - GetFieldID(env, clazz, "mDefaultTextEncoding", kStringClassName); - user_agent = - GetFieldID(env, clazz, "mUserAgent", kStringClassName); - minimum_font_size = GetFieldID(env, clazz, "mMinimumFontSize", "I"); - minimum_logical_font_size = - GetFieldID(env, clazz, "mMinimumLogicalFontSize", "I"); - default_font_size = GetFieldID(env, clazz, "mDefaultFontSize", "I"); - default_fixed_font_size = - GetFieldID(env, clazz, "mDefaultFixedFontSize", "I"); - load_images_automatically = - GetFieldID(env, clazz, "mLoadsImagesAutomatically", "Z"); - images_enabled = - GetFieldID(env, clazz, "mImagesEnabled", "Z"); - java_script_enabled = - GetFieldID(env, clazz, "mJavaScriptEnabled", "Z"); - allow_universal_access_from_file_urls = - GetFieldID(env, clazz, "mAllowUniversalAccessFromFileURLs", "Z"); - allow_file_access_from_file_urls = - GetFieldID(env, clazz, "mAllowFileAccessFromFileURLs", "Z"); - java_script_can_open_windows_automatically = - GetFieldID(env, clazz, "mJavaScriptCanOpenWindowsAutomatically", "Z"); - support_multiple_windows = - GetFieldID(env, clazz, "mSupportMultipleWindows", "Z"); - dom_storage_enabled = - GetFieldID(env, clazz, "mDomStorageEnabled", "Z"); - database_enabled = - GetFieldID(env, clazz, "mDatabaseEnabled", "Z"); - use_wide_viewport = - GetFieldID(env, clazz, "mUseWideViewport", "Z"); - load_with_overview_mode = - GetFieldID(env, clazz, "mLoadWithOverviewMode", "Z"); - media_playback_requires_user_gesture = - GetFieldID(env, clazz, "mMediaPlaybackRequiresUserGesture", "Z"); - default_video_poster_url = - GetFieldID(env, clazz, "mDefaultVideoPosterURL", kStringClassName); - support_deprecated_target_density_dpi = - GetFieldID(env, clazz, "mSupportDeprecatedTargetDensityDPI", "Z"); - dip_scale = - GetFieldID(env, clazz, "mDIPScale", "D"); - initial_page_scale_percent = - GetFieldID(env, clazz, "mInitialPageScalePercent", "F"); - } - - // Field ids - jfieldID text_size_percent; - jfieldID standard_fond_family; - jfieldID fixed_font_family; - jfieldID sans_serif_font_family; - jfieldID serif_font_family; - jfieldID cursive_font_family; - jfieldID fantasy_font_family; - jfieldID default_text_encoding; - jfieldID user_agent; - jfieldID minimum_font_size; - jfieldID minimum_logical_font_size; - jfieldID default_font_size; - jfieldID default_fixed_font_size; - jfieldID load_images_automatically; - jfieldID images_enabled; - jfieldID java_script_enabled; - jfieldID allow_universal_access_from_file_urls; - jfieldID allow_file_access_from_file_urls; - jfieldID java_script_can_open_windows_automatically; - jfieldID support_multiple_windows; - jfieldID dom_storage_enabled; - jfieldID database_enabled; - jfieldID use_wide_viewport; - jfieldID load_with_overview_mode; - jfieldID media_playback_requires_user_gesture; - jfieldID default_video_poster_url; - jfieldID support_deprecated_target_density_dpi; - jfieldID dip_scale; - jfieldID initial_page_scale_percent; -}; - AwSettings::AwSettings(JNIEnv* env, jobject obj) : aw_settings_(env, obj) { } @@ -155,12 +48,13 @@ void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) { rvhe->ResetScrollAndScaleState(); } -void AwSettings::SetWebContents(JNIEnv* env, jobject obj, jint jweb_contents) { +void AwSettings::SetWebContentsLocked( + JNIEnv* env, jobject obj, jint jweb_contents) { content::WebContents* web_contents = reinterpret_cast<content::WebContents*>(jweb_contents); Observe(web_contents); - UpdateEverything(env, obj); + UpdateEverythingLocked(env, obj); } void AwSettings::UpdateEverything() { @@ -169,25 +63,23 @@ void AwSettings::UpdateEverything() { ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); jobject obj = scoped_obj.obj(); if (!obj) return; - UpdateEverything(env, obj); + // Grab the lock and call UpdateEverythingLocked. + Java_AwSettings_updateEverything(env, obj); } -void AwSettings::UpdateEverything(JNIEnv* env, jobject obj) { - UpdateInitialPageScale(env, obj); - UpdateWebkitPreferences(env, obj); - UpdateUserAgent(env, obj); +void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) { + UpdateInitialPageScaleLocked(env, obj); + UpdateWebkitPreferencesLocked(env, obj); + UpdateUserAgentLocked(env, obj); ResetScrollAndScaleState(env, obj); UpdatePreferredSizeMode(); } -void AwSettings::UpdateUserAgent(JNIEnv* env, jobject obj) { +void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) { if (!web_contents()) return; - if (!field_ids_) - field_ids_.reset(new FieldIds(env)); - - ScopedJavaLocalRef<jstring> str(env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->user_agent))); + ScopedJavaLocalRef<jstring> str = + Java_AwSettings_getUserAgentLocked(env, obj); bool ua_overidden = str.obj() != NULL; if (ua_overidden) { @@ -201,23 +93,20 @@ void AwSettings::UpdateUserAgent(JNIEnv* env, jobject obj) { controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden); } -void AwSettings::UpdateWebkitPreferences(JNIEnv* env, jobject obj) { +void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { if (!web_contents()) return; AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt(); if (!render_view_host_ext) return; - if (!field_ids_) - field_ids_.reset(new FieldIds(env)); - content::RenderViewHost* render_view_host = web_contents()->GetRenderViewHost(); if (!render_view_host) return; WebPreferences prefs = render_view_host->GetWebkitPreferences(); prefs.text_autosizing_enabled = - Java_AwSettings_getTextAutosizingEnabled(env, obj); + Java_AwSettings_getTextAutosizingEnabledLocked(env, obj); - int text_size_percent = env->GetIntField(obj, field_ids_->text_size_percent); + int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj); if (prefs.text_autosizing_enabled) { prefs.font_scale_factor = text_size_percent / 100.0f; prefs.force_enable_zoom = text_size_percent >= 130; @@ -229,126 +118,104 @@ void AwSettings::UpdateWebkitPreferences(JNIEnv* env, jobject obj) { text_size_percent / 100.0f)); } - ScopedJavaLocalRef<jstring> str( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->standard_fond_family))); prefs.standard_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getStandardFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->fixed_font_family))); prefs.fixed_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getFixedFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->sans_serif_font_family))); prefs.sans_serif_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getSansSerifFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->serif_font_family))); prefs.serif_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getSerifFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->cursive_font_family))); prefs.cursive_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getCursiveFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->fantasy_font_family))); prefs.fantasy_font_family_map[webkit_glue::kCommonScript] = - ConvertJavaStringToUTF16(str); + ConvertJavaStringToUTF16( + Java_AwSettings_getFantasyFontFamilyLocked(env, obj)); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->default_text_encoding))); - prefs.default_encoding = ConvertJavaStringToUTF8(str); + prefs.default_encoding = ConvertJavaStringToUTF8( + Java_AwSettings_getDefaultTextEncodingLocked(env, obj)); - prefs.minimum_font_size = - env->GetIntField(obj, field_ids_->minimum_font_size); + prefs.minimum_font_size = Java_AwSettings_getMinimumFontSizeLocked(env, obj); prefs.minimum_logical_font_size = - env->GetIntField(obj, field_ids_->minimum_logical_font_size); + Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj); - prefs.default_font_size = - env->GetIntField(obj, field_ids_->default_font_size); + prefs.default_font_size = Java_AwSettings_getDefaultFontSizeLocked(env, obj); prefs.default_fixed_font_size = - env->GetIntField(obj, field_ids_->default_fixed_font_size); + Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj); prefs.loads_images_automatically = - env->GetBooleanField(obj, field_ids_->load_images_automatically); + Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj); - prefs.images_enabled = - env->GetBooleanField(obj, field_ids_->images_enabled); + prefs.images_enabled = Java_AwSettings_getImagesEnabledLocked(env, obj); prefs.javascript_enabled = - env->GetBooleanField(obj, field_ids_->java_script_enabled); + Java_AwSettings_getJavaScriptEnabledLocked(env, obj); - prefs.allow_universal_access_from_file_urls = env->GetBooleanField( - obj, field_ids_->allow_universal_access_from_file_urls); + prefs.allow_universal_access_from_file_urls = + Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj); - prefs.allow_file_access_from_file_urls = env->GetBooleanField( - obj, field_ids_->allow_file_access_from_file_urls); + prefs.allow_file_access_from_file_urls = + Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj); - prefs.javascript_can_open_windows_automatically = env->GetBooleanField( - obj, field_ids_->java_script_can_open_windows_automatically); + prefs.javascript_can_open_windows_automatically = + Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj); - prefs.supports_multiple_windows = env->GetBooleanField( - obj, field_ids_->support_multiple_windows); + prefs.supports_multiple_windows = + Java_AwSettings_getSupportMultipleWindowsLocked(env, obj); - prefs.plugins_enabled = !Java_AwSettings_getPluginsDisabled(env, obj); + prefs.plugins_enabled = !Java_AwSettings_getPluginsDisabledLocked(env, obj); prefs.application_cache_enabled = - Java_AwSettings_getAppCacheEnabled(env, obj); + Java_AwSettings_getAppCacheEnabledLocked(env, obj); - prefs.local_storage_enabled = env->GetBooleanField( - obj, field_ids_->dom_storage_enabled); + prefs.local_storage_enabled = + Java_AwSettings_getDomStorageEnabledLocked(env, obj); - prefs.databases_enabled = env->GetBooleanField( - obj, field_ids_->database_enabled); + prefs.databases_enabled = Java_AwSettings_getDatabaseEnabledLocked(env, obj); prefs.double_tap_to_zoom_enabled = prefs.use_wide_viewport = - env->GetBooleanField(obj, field_ids_->use_wide_viewport); + Java_AwSettings_getUseWideViewportLocked(env, obj); - prefs.initialize_at_minimum_page_scale = env->GetBooleanField( - obj, field_ids_->load_with_overview_mode); + prefs.initialize_at_minimum_page_scale = + Java_AwSettings_getLoadWithOverviewModeLocked(env, obj); - prefs.user_gesture_required_for_media_playback = env->GetBooleanField( - obj, field_ids_->media_playback_requires_user_gesture); + prefs.user_gesture_required_for_media_playback = + Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj); - str.Reset( - env, static_cast<jstring>( - env->GetObjectField(obj, field_ids_->default_video_poster_url))); - prefs.default_video_poster_url = str.obj() ? - GURL(ConvertJavaStringToUTF8(str)) : GURL(); + ScopedJavaLocalRef<jstring> url = + Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj); + prefs.default_video_poster_url = url.obj() ? + GURL(ConvertJavaStringToUTF8(url)) : GURL(); - prefs.support_deprecated_target_density_dpi = env->GetBooleanField( - obj, field_ids_->support_deprecated_target_density_dpi); + prefs.support_deprecated_target_density_dpi = + Java_AwSettings_getSupportDeprecatedTargetDensityDPILocked(env, obj); render_view_host->UpdateWebkitPreferences(prefs); } -void AwSettings::UpdateInitialPageScale(JNIEnv* env, jobject obj) { +void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); if (!rvhe) return; - if (!field_ids_) - field_ids_.reset(new FieldIds(env)); - float initial_page_scale_percent = - env->GetFloatField(obj, field_ids_->initial_page_scale_percent); + Java_AwSettings_getInitialPageScalePercentLocked(env, obj); if (initial_page_scale_percent == 0) { rvhe->SetInitialPageScale(-1); } else { float dip_scale = static_cast<float>( - env->GetDoubleField(obj, field_ids_->dip_scale)); + Java_AwSettings_getDIPScaleLocked(env, obj)); rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f); } } @@ -374,11 +241,12 @@ void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) { UpdateEverything(); } +// Assumed to be called from the Java object's constructor, thus is "Locked". static jint Init(JNIEnv* env, jobject obj, jint web_contents) { AwSettings* settings = new AwSettings(env, obj); - settings->SetWebContents(env, obj, web_contents); + settings->SetWebContentsLocked(env, obj, web_contents); return reinterpret_cast<jint>(settings); } diff --git a/android_webview/native/aw_settings.h b/android_webview/native/aw_settings.h index d24df56..42df647 100644 --- a/android_webview/native/aw_settings.h +++ b/android_webview/native/aw_settings.h @@ -21,18 +21,17 @@ class AwSettings : public content::WebContentsObserver { AwSettings(JNIEnv* env, jobject obj); virtual ~AwSettings(); - // Called from Java. + // Called from Java. Methods with "Locked" suffix require that the settings + // access lock is held during their execution. void Destroy(JNIEnv* env, jobject obj); void ResetScrollAndScaleState(JNIEnv* env, jobject obj); - void SetWebContents(JNIEnv* env, jobject obj, jint web_contents); - void UpdateEverything(JNIEnv* env, jobject obj); - void UpdateInitialPageScale(JNIEnv* env, jobject obj); - void UpdateUserAgent(JNIEnv* env, jobject obj); - void UpdateWebkitPreferences(JNIEnv* env, jobject obj); + void SetWebContentsLocked(JNIEnv* env, jobject obj, jint web_contents); + void UpdateEverythingLocked(JNIEnv* env, jobject obj); + void UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj); + void UpdateUserAgentLocked(JNIEnv* env, jobject obj); + void UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj); private: - struct FieldIds; - AwRenderViewHostExt* GetAwRenderViewHostExt(); void UpdateEverything(); void UpdatePreferredSizeMode(); @@ -41,9 +40,6 @@ class AwSettings : public content::WebContentsObserver { virtual void RenderViewCreated( content::RenderViewHost* render_view_host) OVERRIDE; - // Java field references for accessing the values in the Java object. - scoped_ptr<FieldIds> field_ids_; - JavaObjectWeakGlobalRef aw_settings_; }; |