#include "android_webview/native/aw_settings.h"
#include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
+#include "android_webview/common/aw_content_client.h"
#include "android_webview/native/aw_contents.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
-#include "base/command_line.h"
+#include "base/macros.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"
#include "content/public/browser/web_contents.h"
-#include "content/public/common/content_client.h"
-#include "content/public/common/content_switches.h"
+#include "content/public/common/renderer_preferences.h"
+#include "content/public/common/web_preferences.h"
#include "jni/AwSettings_jni.h"
-#include "webkit/common/user_agent/user_agent.h"
-#include "webkit/common/webpreferences.h"
+#include "ui/gfx/font_render_params.h"
using base::android::ConvertJavaStringToUTF16;
using base::android::ConvertUTF8ToJavaString;
using base::android::ScopedJavaLocalRef;
+using content::RendererPreferences;
+using content::WebPreferences;
namespace android_webview {
+namespace {
+
+void PopulateFixedRendererPreferences(RendererPreferences* prefs) {
+ prefs->tap_multiple_targets_strategy =
+ content::TAP_MULTIPLE_TARGETS_STRATEGY_NONE;
+
+ // TODO(boliu): Deduplicate with chrome/ code.
+ CR_DEFINE_STATIC_LOCAL(const gfx::FontRenderParams, params,
+ (gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(true), NULL)));
+ prefs->should_antialias_text = params.antialiasing;
+ prefs->use_subpixel_positioning = params.subpixel_positioning;
+ prefs->hinting = params.hinting;
+ prefs->use_autohinter = params.autohinter;
+ prefs->use_bitmaps = params.use_bitmaps;
+ prefs->subpixel_rendering = params.subpixel_rendering;
+}
+
+void PopulateFixedWebPreferences(WebPreferences* web_prefs) {
+ web_prefs->shrinks_standalone_images_to_fit = false;
+ web_prefs->should_clear_document_background = false;
+}
+
+}; // namespace
+
const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
class AwSettingsUserData : public base::SupportsUserData::Data {
static AwSettings* GetSettings(content::WebContents* web_contents) {
if (!web_contents)
return NULL;
- AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
+ AwSettingsUserData* data = static_cast<AwSettingsUserData*>(
web_contents->GetUserData(kAwSettingsUserDataKey));
return data ? data->settings_ : NULL;
}
AwSettings::AwSettings(JNIEnv* env, jobject obj, jlong web_contents)
: WebContentsObserver(
reinterpret_cast<content::WebContents*>(web_contents)),
- accelerated_2d_canvas_disabled_by_switch_(
- CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kDisableAccelerated2dCanvas)),
+ renderer_prefs_initialized_(false),
aw_settings_(env, obj) {
reinterpret_cast<content::WebContents*>(web_contents)->
SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
UpdateUserAgentLocked(env, obj);
ResetScrollAndScaleState(env, obj);
UpdateFormDataPreferencesLocked(env, obj);
+ UpdateRendererPreferencesLocked(env, obj);
}
void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) {
content::RenderViewHost* render_view_host =
web_contents()->GetRenderViewHost();
if (!render_view_host) return;
- render_view_host->UpdateWebkitPreferences(
- render_view_host->GetWebkitPreferences());
+ render_view_host->OnWebkitPreferencesChanged();
}
void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
}
+void AwSettings::UpdateRendererPreferencesLocked(JNIEnv* env, jobject obj) {
+ if (!web_contents()) return;
+
+ bool update_prefs = false;
+ RendererPreferences* prefs = web_contents()->GetMutableRendererPrefs();
+
+ if (!renderer_prefs_initialized_) {
+ PopulateFixedRendererPreferences(prefs);
+ renderer_prefs_initialized_ = true;
+ update_prefs = true;
+ }
+
+ bool video_overlay =
+ Java_AwSettings_getVideoOverlayForEmbeddedVideoEnabledLocked(env, obj);
+ if (video_overlay != prefs->use_video_overlay_for_embedded_encrypted_video) {
+ prefs->use_video_overlay_for_embedded_encrypted_video = video_overlay;
+ update_prefs = true;
+ }
+
+ content::RenderViewHost* host = web_contents()->GetRenderViewHost();
+ if (update_prefs && host)
+ host->SyncRendererPrefs();
+}
+
void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
// A single WebContents can normally have 0 to many RenderViewHost instances
// associated with it.
// 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);
+ DCHECK_EQ(render_view_host, web_contents()->GetRenderViewHost());
UpdateEverything();
}
-void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) {
+void AwSettings::WebContentsDestroyed() {
delete this;
}
-// static
-void AwSettings::PopulateFixedPreferences(WebPreferences* web_prefs) {
- web_prefs->shrinks_standalone_images_to_fit = false;
- web_prefs->should_clear_document_background = false;
-}
-
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;
+ // Grab the lock and call PopulateWebPreferencesLocked.
+ Java_AwSettings_populateWebPreferences(
+ env, obj, reinterpret_cast<jlong>(web_prefs));
+}
- PopulateFixedPreferences(web_prefs);
+void AwSettings::PopulateWebPreferencesLocked(
+ JNIEnv* env, jobject obj, jlong web_prefs_ptr) {
+ AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
+ if (!render_view_host_ext) return;
+
+ WebPreferences* web_prefs = reinterpret_cast<WebPreferences*>(web_prefs_ptr);
+ PopulateFixedWebPreferences(web_prefs);
web_prefs->text_autosizing_enabled =
Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
}
- web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->standard_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getStandardFontFamilyLocked(env, obj));
- web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->fixed_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getFixedFontFamilyLocked(env, obj));
- web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->sans_serif_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
- web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->serif_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getSerifFontFamilyLocked(env, obj));
- web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->cursive_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
- web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
+ web_prefs->fantasy_font_family_map[content::kCommonScript] =
ConvertJavaStringToUTF16(
Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
Java_AwSettings_getDatabaseEnabledLocked(env, obj);
web_prefs->wide_viewport_quirk = true;
- web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport =
+ web_prefs->use_wide_viewport =
Java_AwSettings_getUseWideViewportLocked(env, obj);
+ web_prefs->force_zero_layout_height =
+ Java_AwSettings_getForceZeroLayoutHeightLocked(env, obj);
+
+ const bool zero_layout_height_disables_viewport_quirk =
+ Java_AwSettings_getZeroLayoutHeightDisablesViewportQuirkLocked(env, obj);
+ web_prefs->viewport_enabled = !(zero_layout_height_disables_viewport_quirk &&
+ web_prefs->force_zero_layout_height);
+
+ web_prefs->double_tap_to_zoom_enabled =
+ Java_AwSettings_supportsDoubleTapZoomLocked(env, obj);
+
web_prefs->initialize_at_minimum_page_scale =
Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
web_prefs->spatial_navigation_enabled =
Java_AwSettings_getSpatialNavigationLocked(env, obj);
- web_prefs->accelerated_2d_canvas_enabled =
- !accelerated_2d_canvas_disabled_by_switch_ &&
+ bool enable_supported_hardware_accelerated_features =
Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
- env, obj);
+ env, obj);
+
+ bool accelerated_2d_canvas_enabled_by_switch =
+ web_prefs->accelerated_2d_canvas_enabled;
+ web_prefs->accelerated_2d_canvas_enabled = true;
+ if (!accelerated_2d_canvas_enabled_by_switch ||
+ !enable_supported_hardware_accelerated_features) {
+ // Any canvas smaller than this will fallback to software. Abusing this
+ // slightly to turn canvas off without changing
+ // accelerated_2d_canvas_enabled, which also affects compositing mode.
+ // Using 100M instead of max int to avoid overflows.
+ web_prefs->minimum_accelerated_2d_canvas_size = 100 * 1000 * 1000;
+ }
+ web_prefs->experimental_webgl_enabled =
+ web_prefs->experimental_webgl_enabled &&
+ enable_supported_hardware_accelerated_features;
+
+ web_prefs->allow_displaying_insecure_content =
+ Java_AwSettings_getAllowDisplayingInsecureContentLocked(env, obj);
+ web_prefs->allow_running_insecure_content =
+ Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
+
+ web_prefs->fullscreen_supported =
+ Java_AwSettings_getFullscreenSupportedLocked(env, obj);
}
static jlong Init(JNIEnv* env,
}
static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
- return base::android::ConvertUTF8ToJavaString(
- env, content::GetUserAgent(GURL())).Release();
+ return base::android::ConvertUTF8ToJavaString(env, GetUserAgent()).Release();
}
bool RegisterAwSettings(JNIEnv* env) {
- return RegisterNativesImpl(env) >= 0;
+ return RegisterNativesImpl(env);
}
} // namespace android_webview