Index: android_webview/native/aw_settings.cc |
diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc |
index 292defe1bb66d040a71f113fb465a91e3abcb38a..14f49aa19c48327a3771ee362401fcaab3778498 100644 |
--- a/android_webview/native/aw_settings.cc |
+++ b/android_webview/native/aw_settings.cc |
@@ -8,6 +8,7 @@ |
#include "android_webview/native/aw_contents.h" |
#include "base/android/jni_android.h" |
#include "base/android/jni_string.h" |
+#include "base/supports_user_data.h" |
#include "content/public/browser/navigation_controller.h" |
#include "content/public/browser/navigation_entry.h" |
#include "content/public/browser/render_view_host.h" |
@@ -24,13 +25,37 @@ using base::android::ScopedJavaLocalRef; |
namespace android_webview { |
+const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey; |
+ |
+class AwSettingsUserData : public base::SupportsUserData::Data { |
+ public: |
+ AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {} |
+ |
+ static AwSettings* GetSettings(content::WebContents* web_contents) { |
+ if (!web_contents) |
+ return NULL; |
+ AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>( |
+ web_contents->GetUserData(kAwSettingsUserDataKey)); |
+ return data ? data->settings_ : NULL; |
+ } |
+ |
+ private: |
+ AwSettings* settings_; |
+}; |
+ |
AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents) |
: WebContentsObserver( |
reinterpret_cast<content::WebContents*>(web_contents)), |
aw_settings_(env, obj) { |
+ reinterpret_cast<content::WebContents*>(web_contents)-> |
+ SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this)); |
} |
AwSettings::~AwSettings() { |
+ if (web_contents()) { |
+ web_contents()->SetUserData(kAwSettingsUserDataKey, NULL); |
+ } |
+ |
JNIEnv* env = base::android::AttachCurrentThread(); |
ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); |
jobject obj = scoped_obj.obj(); |
@@ -43,6 +68,10 @@ void AwSettings::Destroy(JNIEnv* env, jobject obj) { |
delete this; |
} |
+AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) { |
+ return AwSettingsUserData::GetSettings(web_contents); |
+} |
+ |
AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { |
if (!web_contents()) return NULL; |
AwContents* contents = AwContents::FromWebContents(web_contents()); |
@@ -100,160 +129,175 @@ void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { |
content::RenderViewHost* render_view_host = |
web_contents()->GetRenderViewHost(); |
if (!render_view_host) return; |
- WebPreferences prefs = render_view_host->GetWebkitPreferences(); |
+ render_view_host->UpdateWebkitPreferences( |
+ render_view_host->GetWebkitPreferences()); |
+} |
+ |
+void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { |
+ AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); |
+ if (!rvhe) return; |
- prefs.text_autosizing_enabled = |
+ float 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>( |
+ Java_AwSettings_getDIPScaleLocked(env, obj)); |
+ rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f); |
+ } |
+} |
+ |
+void AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) { |
+ if (!web_contents()) return; |
+ AwContents* contents = AwContents::FromWebContents(web_contents()); |
+ if (!contents) return; |
+ |
+ contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj)); |
+} |
+ |
+void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) { |
+ // A single WebContents can normally have 0 to many RenderViewHost instances |
+ // associated with it. |
+ // This is important since there is only one RenderViewHostExt instance per |
+ // WebContents (and not one RVHExt per RVH, as you might expect) and updating |
+ // settings via RVHExt only ever updates the 'current' RVH. |
+ // In android_webview we don't swap out the RVH on cross-site navigations, so |
+ // we shouldn't have to deal with the multiple RVH per WebContents case. That |
+ // in turn means that the newly created RVH is always the 'current' RVH |
+ // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK. |
+ DCHECK(web_contents()->GetRenderViewHost() == render_view_host); |
+ |
+ UpdateEverything(); |
+} |
+ |
+void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) { |
+ delete this; |
+} |
+ |
+void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ CHECK(env); |
+ |
+ AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt(); |
+ if (!render_view_host_ext) return; |
+ |
+ ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); |
+ jobject obj = scoped_obj.obj(); |
+ if (!obj) return; |
+ |
+ web_prefs->text_autosizing_enabled = |
Java_AwSettings_getTextAutosizingEnabledLocked(env, obj); |
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; |
+ if (web_prefs->text_autosizing_enabled) { |
+ web_prefs->font_scale_factor = text_size_percent / 100.0f; |
+ web_prefs->force_enable_zoom = text_size_percent >= 130; |
// Use the default zoom factor value when Text Autosizer is turned on. |
render_view_host_ext->SetTextZoomFactor(1); |
} else { |
- prefs.force_enable_zoom = false; |
+ web_prefs->force_enable_zoom = false; |
render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f); |
} |
- prefs.standard_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->standard_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getStandardFontFamilyLocked(env, obj)); |
- prefs.fixed_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getFixedFontFamilyLocked(env, obj)); |
- prefs.sans_serif_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getSansSerifFontFamilyLocked(env, obj)); |
- prefs.serif_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->serif_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getSerifFontFamilyLocked(env, obj)); |
- prefs.cursive_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getCursiveFontFamilyLocked(env, obj)); |
- prefs.fantasy_font_family_map[webkit_glue::kCommonScript] = |
+ web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] = |
ConvertJavaStringToUTF16( |
Java_AwSettings_getFantasyFontFamilyLocked(env, obj)); |
- prefs.default_encoding = ConvertJavaStringToUTF8( |
+ web_prefs->default_encoding = ConvertJavaStringToUTF8( |
Java_AwSettings_getDefaultTextEncodingLocked(env, obj)); |
- prefs.minimum_font_size = Java_AwSettings_getMinimumFontSizeLocked(env, obj); |
+ web_prefs->minimum_font_size = |
+ Java_AwSettings_getMinimumFontSizeLocked(env, obj); |
- prefs.minimum_logical_font_size = |
+ web_prefs->minimum_logical_font_size = |
Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj); |
- prefs.default_font_size = Java_AwSettings_getDefaultFontSizeLocked(env, obj); |
+ web_prefs->default_font_size = |
+ Java_AwSettings_getDefaultFontSizeLocked(env, obj); |
- prefs.default_fixed_font_size = |
+ web_prefs->default_fixed_font_size = |
Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj); |
// Blink's LoadsImagesAutomatically and ImagesEnabled must be |
// set cris-cross to Android's. See |
// https://code.google.com/p/chromium/issues/detail?id=224317#c26 |
- prefs.loads_images_automatically = |
+ web_prefs->loads_images_automatically = |
Java_AwSettings_getImagesEnabledLocked(env, obj); |
- prefs.images_enabled = |
+ web_prefs->images_enabled = |
Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj); |
- prefs.javascript_enabled = |
+ web_prefs->javascript_enabled = |
Java_AwSettings_getJavaScriptEnabledLocked(env, obj); |
- prefs.allow_universal_access_from_file_urls = |
+ web_prefs->allow_universal_access_from_file_urls = |
Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj); |
- prefs.allow_file_access_from_file_urls = |
+ web_prefs->allow_file_access_from_file_urls = |
Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj); |
- prefs.javascript_can_open_windows_automatically = |
+ web_prefs->javascript_can_open_windows_automatically = |
Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj); |
- prefs.supports_multiple_windows = |
+ web_prefs->supports_multiple_windows = |
Java_AwSettings_getSupportMultipleWindowsLocked(env, obj); |
- prefs.plugins_enabled = !Java_AwSettings_getPluginsDisabledLocked(env, obj); |
+ web_prefs->plugins_enabled = |
+ !Java_AwSettings_getPluginsDisabledLocked(env, obj); |
- prefs.application_cache_enabled = |
+ web_prefs->application_cache_enabled = |
Java_AwSettings_getAppCacheEnabledLocked(env, obj); |
- prefs.local_storage_enabled = |
+ web_prefs->local_storage_enabled = |
Java_AwSettings_getDomStorageEnabledLocked(env, obj); |
- prefs.databases_enabled = Java_AwSettings_getDatabaseEnabledLocked(env, obj); |
+ web_prefs->databases_enabled = |
+ Java_AwSettings_getDatabaseEnabledLocked(env, obj); |
- prefs.wide_viewport_quirk = true; |
- prefs.double_tap_to_zoom_enabled = prefs.use_wide_viewport = |
+ web_prefs->wide_viewport_quirk = true; |
+ web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport = |
Java_AwSettings_getUseWideViewportLocked(env, obj); |
- prefs.initialize_at_minimum_page_scale = |
+ web_prefs->initialize_at_minimum_page_scale = |
Java_AwSettings_getLoadWithOverviewModeLocked(env, obj); |
- prefs.user_gesture_required_for_media_playback = |
+ web_prefs->user_gesture_required_for_media_playback = |
Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj); |
ScopedJavaLocalRef<jstring> url = |
Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj); |
- prefs.default_video_poster_url = url.obj() ? |
+ web_prefs->default_video_poster_url = url.obj() ? |
GURL(ConvertJavaStringToUTF8(url)) : GURL(); |
bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj); |
- prefs.support_deprecated_target_density_dpi = support_quirks; |
- prefs.use_legacy_background_size_shorthand_behavior = support_quirks; |
- prefs.viewport_meta_layout_size_quirk = support_quirks; |
- prefs.viewport_meta_zero_values_quirk = support_quirks; |
- prefs.ignore_main_frame_overflow_hidden_quirk = support_quirks; |
+ web_prefs->support_deprecated_target_density_dpi = support_quirks; |
+ web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks; |
+ web_prefs->viewport_meta_layout_size_quirk = support_quirks; |
+ web_prefs->viewport_meta_zero_values_quirk = support_quirks; |
+ web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks; |
- prefs.password_echo_enabled = |
+ web_prefs->password_echo_enabled = |
Java_AwSettings_getPasswordEchoEnabled(env, obj); |
- |
- render_view_host->UpdateWebkitPreferences(prefs); |
-} |
- |
-void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { |
- AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); |
- if (!rvhe) return; |
- |
- float 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>( |
- Java_AwSettings_getDIPScaleLocked(env, obj)); |
- rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f); |
- } |
-} |
- |
-void AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) { |
- if (!web_contents()) return; |
- AwContents* contents = AwContents::FromWebContents(web_contents()); |
- if (!contents) return; |
- |
- contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj)); |
-} |
- |
-void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) { |
- // A single WebContents can normally have 0 to many RenderViewHost instances |
- // associated with it. |
- // This is important since there is only one RenderViewHostExt instance per |
- // WebContents (and not one RVHExt per RVH, as you might expect) and updating |
- // settings via RVHExt only ever updates the 'current' RVH. |
- // In android_webview we don't swap out the RVH on cross-site navigations, so |
- // we shouldn't have to deal with the multiple RVH per WebContents case. That |
- // in turn means that the newly created RVH is always the 'current' RVH |
- // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK. |
- DCHECK(web_contents()->GetRenderViewHost() == render_view_host); |
- |
- UpdateEverything(); |
-} |
- |
-void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) { |
- delete this; |
} |
static jint Init(JNIEnv* env, |