Chromium Code Reviews| Index: android_webview/native/aw_settings.cc |
| diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc |
| index 752a937fac9e14a25b82573ffbb8787356908ea4..aeb21b3fa9f5239aa1295ce34f17d9716d5e0a17 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" |
| @@ -18,16 +19,38 @@ |
| #include "webkit/common/webpreferences.h" |
| #include "webkit/glue/webkit_glue.h" |
| +#include "base/logging.h" |
| + |
| using base::android::ConvertJavaStringToUTF16; |
| using base::android::ConvertUTF8ToJavaString; |
| 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() { |
|
joth
2013/09/25 12:04:01
if (web_contents())
web_contents()->SetUserData(
benm (inactive)
2013/09/25 16:00:56
Done.
|
| @@ -43,174 +66,197 @@ void AwSettings::Destroy(JNIEnv* env, jobject obj) { |
| delete this; |
| } |
| -AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { |
| - if (!web_contents()) return NULL; |
| - AwContents* contents = AwContents::FromWebContents(web_contents()); |
| - if (!contents) return NULL; |
| - return contents->render_view_host_ext(); |
| +AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) { |
| + return AwSettingsUserData::GetSettings(web_contents); |
| } |
| -void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) { |
| - AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); |
| - if (!rvhe) return; |
| - rvhe->ResetScrollAndScaleState(); |
| -} |
| +void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) { |
| -void AwSettings::UpdateEverything() { |
| JNIEnv* env = base::android::AttachCurrentThread(); |
| CHECK(env); |
| - ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); |
| - jobject obj = scoped_obj.obj(); |
| - if (!obj) return; |
| - // Grab the lock and call UpdateEverythingLocked. |
| - Java_AwSettings_updateEverything(env, obj); |
| -} |
| - |
| -void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) { |
| - UpdateInitialPageScaleLocked(env, obj); |
| - UpdateWebkitPreferencesLocked(env, obj); |
| - UpdateUserAgentLocked(env, obj); |
| - ResetScrollAndScaleState(env, obj); |
| - UpdateFormDataPreferencesLocked(env, obj); |
| -} |
| - |
| -void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) { |
| - if (!web_contents()) return; |
| - ScopedJavaLocalRef<jstring> str = |
| - Java_AwSettings_getUserAgentLocked(env, obj); |
| - bool ua_overidden = str.obj() != NULL; |
| - |
| - if (ua_overidden) { |
| - std::string override = base::android::ConvertJavaStringToUTF8(str); |
| - web_contents()->SetUserAgentOverride(override); |
| - } |
| - |
| - const content::NavigationController& controller = |
| - web_contents()->GetController(); |
| - for (int i = 0; i < controller.GetEntryCount(); ++i) |
| - controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden); |
| -} |
| - |
| -void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { |
| - if (!web_contents()) return; |
| AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt(); |
| if (!render_view_host_ext) return; |
| - content::RenderViewHost* render_view_host = |
| - web_contents()->GetRenderViewHost(); |
| - if (!render_view_host) return; |
| - WebPreferences prefs = render_view_host->GetWebkitPreferences(); |
| + ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); |
| + jobject obj = scoped_obj.obj(); |
| + if (!obj) return; |
| - prefs.text_autosizing_enabled = |
| + 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; |
| - // Use the default zoom factor value when Text Autosizer is turned on. |
| - render_view_host_ext->SetTextZoomFactor(1); |
| + 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 level value when Text Autosizer is turned on. |
| + render_view_host_ext->SetTextZoomLevel(0); |
| } else { |
| - prefs.force_enable_zoom = false; |
| - render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f); |
| + web_prefs->force_enable_zoom = false; |
| + render_view_host_ext->SetTextZoomLevel(content::ZoomFactorToZoomLevel( |
| + 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); |
| + LOG(ERROR) << "Set javascript pref to " << web_prefs->javascript_enabled; |
| - 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); |
| + // Temporary setting, for K release only |
| + // This is a fork from upstream chromium, and should go away once |
| + // https://code.google.com/p/chromium/issues/detail?id=297216 |
| + // is implemented |
| + web_prefs->allow_running_insecure_content = true; |
| + |
| 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; |
| + 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); |
| +} |
| + |
| +AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { |
| + if (!web_contents()) return NULL; |
| + AwContents* contents = AwContents::FromWebContents(web_contents()); |
| + if (!contents) return NULL; |
| + return contents->render_view_host_ext(); |
| +} |
| + |
| +void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) { |
| + AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); |
| + if (!rvhe) return; |
| + rvhe->ResetScrollAndScaleState(); |
| +} |
| + |
| +void AwSettings::UpdateEverything() { |
| + JNIEnv* env = base::android::AttachCurrentThread(); |
| + CHECK(env); |
| + ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); |
| + jobject obj = scoped_obj.obj(); |
| + if (!obj) return; |
| + // Grab the lock and call UpdateEverythingLocked. |
| + Java_AwSettings_updateEverything(env, obj); |
| +} |
| + |
| +void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) { |
| + UpdateInitialPageScaleLocked(env, obj); |
| + UpdateWebkitPreferencesLocked(env, obj); |
| + UpdateUserAgentLocked(env, obj); |
| + ResetScrollAndScaleState(env, obj); |
| + UpdateFormDataPreferencesLocked(env, obj); |
| +} |
| + |
| +void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) { |
| + if (!web_contents()) return; |
| + |
| + ScopedJavaLocalRef<jstring> str = |
| + Java_AwSettings_getUserAgentLocked(env, obj); |
| + bool ua_overidden = str.obj() != NULL; |
| + |
| + if (ua_overidden) { |
| + std::string override = base::android::ConvertJavaStringToUTF8(str); |
| + web_contents()->SetUserAgentOverride(override); |
| + } |
| + |
| + const content::NavigationController& controller = |
| + web_contents()->GetController(); |
| + for (int i = 0; i < controller.GetEntryCount(); ++i) |
| + controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden); |
| +} |
| + |
| +void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { |
| + if (!web_contents()) return; |
| + |
| + content::RenderViewHost* render_view_host = |
| + web_contents()->GetRenderViewHost(); |
| + if (!render_view_host) return; |
| + render_view_host->UpdateWebkitPreferences( |
| + render_view_host->GetWebkitPreferences()); |
| - render_view_host->UpdateWebkitPreferences(prefs); |
| } |
| void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { |