summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-14 17:04:33 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-14 17:04:33 +0000
commitcbe55d26046503c95619ef54527194881ad5a13e (patch)
treeedec75c9ba1f28ecb633efccd4a83dabc039dab1
parent776936ba0803247a4343e1ad7d2d1352a360579d (diff)
downloadchromium_src-cbe55d26046503c95619ef54527194881ad5a13e.zip
chromium_src-cbe55d26046503c95619ef54527194881ad5a13e.tar.gz
chromium_src-cbe55d26046503c95619ef54527194881ad5a13e.tar.bz2
[Android WebView] Implement WebSettings.setTextZoom for legacy layout modes
We rely on the fact that on Android, page scaling factor isn't used for page zooming, so text scaling can be used (unlike desktop Chrome). Review URL: https://chromiumcodereview.appspot.com/12220012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182481 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--android_webview/browser/renderer_host/aw_render_view_host_ext.cc5
-rw-r--r--android_webview/browser/renderer_host/aw_render_view_host_ext.h4
-rw-r--r--android_webview/common/render_view_messages.h5
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java9
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwSettings.java44
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java63
-rw-r--r--android_webview/native/android_webview_jni_registrar.cc2
-rw-r--r--android_webview/native/aw_contents.h4
-rw-r--r--android_webview/native/aw_settings.cc67
-rw-r--r--android_webview/native/aw_settings.h41
-rw-r--r--android_webview/native/webview_native.gyp3
-rw-r--r--android_webview/renderer/aw_render_view_ext.cc9
-rw-r--r--android_webview/renderer/aw_render_view_ext.h2
-rw-r--r--content/browser/android/content_settings.cc8
-rw-r--r--content/renderer/render_view_impl.cc7
-rw-r--r--webkit/glue/webkit_glue.cc4
-rw-r--r--webkit/glue/webkit_glue.h4
17 files changed, 274 insertions, 7 deletions
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
index 761074e..d76c7e9 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc
@@ -70,6 +70,11 @@ void AwRenderViewHostExt::EnableCapturePictureCallback(bool enabled) {
web_contents()->GetRoutingID(), enabled));
}
+void AwRenderViewHostExt::SetTextZoomLevel(double level) {
+ DCHECK(CalledOnValidThread());
+ Send(new AwViewMsg_SetTextZoomLevel(web_contents()->GetRoutingID(), level));
+}
+
void AwRenderViewHostExt::RenderViewGone(base::TerminationStatus status) {
DCHECK(CalledOnValidThread());
for (std::map<int, DocumentHasImagesResult>::iterator pending_req =
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
index a7d3ed5..678ef1a 100644
--- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h
+++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h
@@ -66,6 +66,10 @@ class AwRenderViewHostExt : public content::WebContentsObserver,
// Captures the latest available picture pile synchronously.
void CapturePictureSync();
+ // Sets the zoom level for text only. Used in layout modes other than
+ // Text Autosizing.
+ void SetTextZoomLevel(double level);
+
private:
// content::WebContentsObserver implementation.
virtual void RenderViewGone(base::TerminationStatus status) OVERRIDE;
diff --git a/android_webview/common/render_view_messages.h b/android_webview/common/render_view_messages.h
index beb1132..39f1915 100644
--- a/android_webview/common/render_view_messages.h
+++ b/android_webview/common/render_view_messages.h
@@ -59,6 +59,11 @@ IPC_MESSAGE_ROUTED1(AwViewMsg_EnableCapturePictureCallback,
// This message blocks the browser process on the renderer until complete.
IPC_SYNC_MESSAGE_ROUTED0_0(AwViewMsg_CapturePictureSync)
+// Sets the zoom level for text only. Used in layout modes other than
+// Text Autosizing.
+IPC_MESSAGE_ROUTED1(AwViewMsg_SetTextZoomLevel,
+ double /* zoom_level */)
+
//-----------------------------------------------------------------------------
// RenderView messages
// These are messages sent from the renderer to the browser process.
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 51c7a14..a0027c3 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -255,8 +255,9 @@ public class AwContents {
mContentsClient = contentsClient;
mCleanupReference = new CleanupReference(this, new DestroyRunnable(mNativeAwContents));
+ int nativeWebContents = nativeGetWebContents(mNativeAwContents);
mContentViewCore.initialize(containerView, internalAccessAdapter,
- nativeGetWebContents(mNativeAwContents),
+ nativeWebContents,
new AwNativeWindow(mContainerView.getContext()),
isAccessFromFileURLsGrantedByDefault);
mContentViewCore.setContentViewClient(mContentsClient);
@@ -264,7 +265,7 @@ public class AwContents {
mContentViewCore.setContentSizeChangeListener(mLayoutSizer);
mContentsClient.installWebContentsObserver(mContentViewCore);
- mSettings = new AwSettings(mContentViewCore.getContext());
+ mSettings = new AwSettings(mContentViewCore.getContext(), nativeWebContents);
setIoThreadClient(new IoThreadClientImpl());
setInterceptNavigationDelegate(new InterceptNavigationDelegateImpl());
@@ -299,6 +300,8 @@ public class AwContents {
public void destroy() {
mContentViewCore.destroy();
+ // The native part of AwSettings isn't needed for the IoThreadClient instance.
+ mSettings.destroy();
// We explicitly do not null out the mContentViewCore reference here
// because ContentViewCore already has code to deal with the case
// methods are called on it after it's been destroyed, and other
@@ -482,6 +485,8 @@ public class AwContents {
nativeSetIoThreadClient(mNativeAwContents, mIoThreadClient);
nativeSetInterceptNavigationDelegate(mNativeAwContents, mInterceptNavigationDelegate);
+ mSettings.setWebContents(newWebContentsPtr);
+
// Finally poke the new ContentViewCore with the size of the container view and show it.
if (mContainerView.getWidth() != 0 || mContainerView.getHeight() != 0) {
mContentViewCore.onSizeChanged(
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 65b0c34..426cf13 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -9,6 +9,9 @@ import android.content.pm.PackageManager;
import android.os.Process;
import android.webkit.WebSettings;
+import org.chromium.base.JNINamespace;
+import org.chromium.base.ThreadUtils;
+
/**
* Stores Android WebView specific settings that does not need to be synced to WebKit.
* Use {@link org.chromium.content.browser.ContentSettings} for WebKit settings.
@@ -16,6 +19,7 @@ import android.webkit.WebSettings;
* Methods in this class can be called from any thread, including threads created by
* the client of WebView.
*/
+@JNINamespace("android_webview")
public class AwSettings {
// Lock to protect all settings.
private final Object mAwSettingsLock = new Object();
@@ -28,12 +32,22 @@ public class AwSettings {
private boolean mShouldFocusFirstNode = true;
private boolean mGeolocationEnabled = true;
- public AwSettings(Context context) {
+ // The native side of this object.
+ private int mNativeAwSettings = 0;
+
+ public AwSettings(Context context, int nativeWebContents) {
mContext = context;
mBlockNetworkLoads = mContext.checkPermission(
android.Manifest.permission.INTERNET,
Process.myPid(),
Process.myUid()) != PackageManager.PERMISSION_GRANTED;
+ mNativeAwSettings = nativeInit(nativeWebContents);
+ assert mNativeAwSettings != 0;
+ }
+
+ public void destroy() {
+ nativeDestroy(mNativeAwSettings);
+ mNativeAwSettings = 0;
}
/**
@@ -131,6 +145,22 @@ public class AwSettings {
}
/**
+ * Sets the text zoom of the page in percent. This kind of zooming is
+ * only applicable when Text Autosizing is turned off. Passing -1 will
+ * reset the zoom to the default value.
+ */
+ public void setTextZoom(final int textZoom) {
+ // There is no need to lock, because the native code doesn't
+ // read anything from the Java side.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ nativeSetTextZoom(mNativeAwSettings, textZoom);
+ }
+ });
+ }
+
+ /**
* See {@link android.webkit.WebSettings#setNeedInitialFocus}.
*/
public boolean shouldFocusFirstNode() {
@@ -158,4 +188,16 @@ public class AwSettings {
return mGeolocationEnabled;
}
}
+
+ public void setWebContents(int nativeWebContents) {
+ nativeSetWebContents(mNativeAwSettings, nativeWebContents);
+ }
+
+ private native int nativeInit(int webContentsPtr);
+
+ private native void nativeDestroy(int nativeAwSettings);
+
+ private native void nativeSetWebContents(int nativeAwSettings, int nativeWebContents);
+
+ private native void nativeSetTextZoom(int nativeAwSettings, int textZoom);
}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index 72baaf1..2ffd087 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -803,7 +803,8 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
// This class provides helper methods for testing of settings related to
// the text autosizing feature.
- abstract class AwSettingsTextAutosizingTestHelper<T> extends AwSettingsTestHelper<T> {
+ abstract class AwSettingsTextAutosizingTestHelper<T>
+ extends AwSettingsWithSettingsTestHelper<T> {
protected static final float PARAGRAPH_FONT_SIZE = 14.0f;
AwSettingsTextAutosizingTestHelper(
@@ -895,7 +896,54 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
AwContents awContents,
TestAwContentsClient contentViewClient) throws Throwable {
super(awContents, contentViewClient);
- // See b/7873666.
+ mInitialActualFontSize = getActualFontSize();
+ }
+
+ @Override
+ protected Integer getAlteredValue() {
+ return INITIAL_TEXT_ZOOM * 2;
+ }
+
+ @Override
+ protected Integer getInitialValue() {
+ return INITIAL_TEXT_ZOOM;
+ }
+
+ @Override
+ protected Integer getCurrentValue() {
+ return mContentSettings.getTextZoom();
+ }
+
+ @Override
+ protected void setCurrentValue(Integer value) {
+ mContentSettings.setTextZoom(value);
+ mAwSettings.setTextZoom(value);
+ }
+
+ @Override
+ protected void doEnsureSettingHasValue(Integer value) throws Throwable {
+ final float actualFontSize = getActualFontSize();
+ // Ensure that actual vs. initial font size ratio is similar to actual vs. initial
+ // text zoom values ratio.
+ final float ratiosDelta = Math.abs(
+ (actualFontSize / mInitialActualFontSize) -
+ (value / (float)INITIAL_TEXT_ZOOM));
+ assertTrue(
+ "|(" + actualFontSize + " / " + mInitialActualFontSize + ") - (" +
+ value + " / " + INITIAL_TEXT_ZOOM + ")| = " + ratiosDelta,
+ ratiosDelta <= 0.2f);
+ }
+ }
+
+ class AwSettingsTextZoomAutosizingTestHelper
+ extends AwSettingsTextAutosizingTestHelper<Integer> {
+ private static final int INITIAL_TEXT_ZOOM = 100;
+ private final float mInitialActualFontSize;
+
+ AwSettingsTextZoomAutosizingTestHelper(
+ AwContents awContents,
+ TestAwContentsClient contentViewClient) throws Throwable {
+ super(awContents, contentViewClient);
mContentSettings.setLayoutAlgorithm(LayoutAlgorithm.TEXT_AUTOSIZING);
// The initial font size can be adjusted by font autosizer depending on the page's
// viewport width.
@@ -920,6 +968,8 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
@Override
protected void setCurrentValue(Integer value) {
mContentSettings.setTextZoom(value);
+ // This is to verify that AwSettings will not affect font boosting by Autosizer.
+ mAwSettings.setTextZoom(-1);
}
@Override
@@ -1805,6 +1855,15 @@ public class AwSettingsTest extends AndroidWebViewTestBase {
@SmallTest
@Feature({"AndroidWebView", "Preferences"})
+ public void testTextZoomAutosizingWithTwoViews() throws Throwable {
+ ViewPair views = createViews();
+ runPerViewSettingsTest(
+ new AwSettingsTextZoomAutosizingTestHelper(views.getContents0(), views.getClient0()),
+ new AwSettingsTextZoomAutosizingTestHelper(views.getContents1(), views.getClient1()));
+ }
+
+ @SmallTest
+ @Feature({"AndroidWebView", "Preferences"})
public void testJavaScriptPopupsWithTwoViews() throws Throwable {
ViewPair views = createViews();
runPerViewSettingsTest(
diff --git a/android_webview/native/android_webview_jni_registrar.cc b/android_webview/native/android_webview_jni_registrar.cc
index 64e6073..33dfff0 100644
--- a/android_webview/native/android_webview_jni_registrar.cc
+++ b/android_webview/native/android_webview_jni_registrar.cc
@@ -9,6 +9,7 @@
#include "android_webview/native/aw_contents_io_thread_client_impl.h"
#include "android_webview/native/aw_http_auth_handler.h"
#include "android_webview/native/aw_resource.h"
+#include "android_webview/native/aw_settings.h"
#include "android_webview/native/aw_web_contents_delegate.h"
#include "android_webview/native/cookie_manager.h"
#include "android_webview/native/input_stream_impl.h"
@@ -24,6 +25,7 @@ static base::android::RegistrationMethod kWebViewRegisteredMethods[] = {
{ "AndroidProtocolHandler", RegisterAndroidProtocolHandler },
{ "AwContents", RegisterAwContents },
{ "AwContentsIoThreadClientImpl", RegisterAwContentsIoThreadClientImpl},
+ { "AwSettings", RegisterAwSettings },
{ "AwHttpAuthHandler", RegisterAwHttpAuthHandler },
{ "AwResource", AwResource::RegisterAwResource },
{ "AwWebContentsDelegate", RegisterAwWebContentsDelegate },
diff --git a/android_webview/native/aw_contents.h b/android_webview/native/aw_contents.h
index 7313027..78ababc 100644
--- a/android_webview/native/aw_contents.h
+++ b/android_webview/native/aw_contents.h
@@ -68,6 +68,10 @@ class AwContents : public FindHelper::Listener,
jobject web_contents_delegate);
virtual ~AwContents();
+ AwRenderViewHostExt* render_view_host_ext() {
+ return render_view_host_ext_.get();
+ }
+
void DrawGL(AwDrawGLInfo* draw_info);
bool DrawSW(JNIEnv* env,
jobject obj,
diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc
new file mode 100644
index 0000000..e3716d8
--- /dev/null
+++ b/android_webview/native/aw_settings.cc
@@ -0,0 +1,67 @@
+// Copyright (c) 2013 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.
+
+#include "android_webview/native/aw_settings.h"
+
+#include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
+#include "android_webview/native/aw_contents.h"
+#include "jni/AwSettings_jni.h"
+#include "webkit/glue/webkit_glue.h"
+
+namespace android_webview {
+
+AwSettings::AwSettings(JNIEnv* env, jobject obj)
+ : java_ref_(env, obj),
+ text_zoom_percent_(100) {
+}
+
+AwSettings::~AwSettings() {
+}
+
+void AwSettings::Destroy(JNIEnv* env, jobject obj) {
+ delete this;
+}
+
+void AwSettings::SetTextZoom(JNIEnv* env, jobject obj, jint text_zoom_percent) {
+ if (text_zoom_percent_ == text_zoom_percent) return;
+ text_zoom_percent_ = text_zoom_percent;
+ UpdateTextZoom();
+}
+
+void AwSettings::SetWebContents(JNIEnv* env, jobject obj, jint web_contents) {
+ Observe(reinterpret_cast<content::WebContents*>(web_contents));
+}
+
+void AwSettings::UpdateTextZoom() {
+ if (!web_contents()) return;
+ AwContents* contents = AwContents::FromWebContents(web_contents());
+ if (!contents) return;
+ AwRenderViewHostExt* rvhe = contents->render_view_host_ext();
+ if (!rvhe) return;
+ if (text_zoom_percent_ > 0) {
+ rvhe->SetTextZoomLevel(webkit_glue::ZoomFactorToZoomLevel(
+ text_zoom_percent_ / 100.0f));
+ } else {
+ // Use the default zoom level value when Text Autosizer is turned on.
+ rvhe->SetTextZoomLevel(0);
+ }
+}
+
+void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
+ UpdateTextZoom();
+}
+
+static jint Init(JNIEnv* env,
+ jobject obj,
+ jint web_contents) {
+ AwSettings* settings = new AwSettings(env, obj);
+ settings->SetWebContents(env, obj, web_contents);
+ return reinterpret_cast<jint>(settings);
+}
+
+bool RegisterAwSettings(JNIEnv* env) {
+ return RegisterNativesImpl(env) >= 0;
+}
+
+} // namespace android_webview
diff --git a/android_webview/native/aw_settings.h b/android_webview/native/aw_settings.h
new file mode 100644
index 0000000..a0b7730
--- /dev/null
+++ b/android_webview/native/aw_settings.h
@@ -0,0 +1,41 @@
+// Copyright (c) 2013 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 ANDROID_WEBVIEW_NATIVE_AW_SETTINGS_H_
+#define ANDROID_WEBVIEW_NATIVE_AW_SETTINGS_H_
+
+#include <jni.h>
+
+#include "base/android/jni_helper.h"
+#include "base/android/scoped_java_ref.h"
+#include "content/public/browser/web_contents_observer.h"
+
+namespace android_webview {
+
+class AwSettings : public content::WebContentsObserver {
+ public:
+ AwSettings(JNIEnv* env, jobject obj);
+ virtual ~AwSettings();
+
+ // Called from Java.
+ void Destroy(JNIEnv* env, jobject obj);
+ void SetTextZoom(JNIEnv* env, jobject obj, jint text_zoom_percent);
+ void SetWebContents(JNIEnv* env, jobject obj, jint web_contents);
+
+ private:
+ void UpdateTextZoom();
+
+ // WebContentsObserver overrides:
+ virtual void RenderViewCreated(
+ content::RenderViewHost* render_view_host) OVERRIDE;
+
+ JavaObjectWeakGlobalRef java_ref_;
+ int text_zoom_percent_;
+};
+
+bool RegisterAwSettings(JNIEnv* env);
+
+} // namespace android_webview
+
+#endif // ANDROID_WEBVIEW_NATIVE_AW_SETTINGS_H_
diff --git a/android_webview/native/webview_native.gyp b/android_webview/native/webview_native.gyp
index 5b3a1df..1290683 100644
--- a/android_webview/native/webview_native.gyp
+++ b/android_webview/native/webview_native.gyp
@@ -40,6 +40,8 @@
'aw_javascript_dialog_manager.h',
'aw_resource.cc',
'aw_resource.h',
+ 'aw_settings.cc',
+ 'aw_settings.h',
'aw_web_contents_delegate.cc',
'aw_web_contents_delegate.h',
'aw_web_contents_view_delegate.cc',
@@ -77,6 +79,7 @@
'../java/src/org/chromium/android_webview/AwCookieManager.java',
'../java/src/org/chromium/android_webview/AwHttpAuthHandler.java',
'../java/src/org/chromium/android_webview/AwResource.java',
+ '../java/src/org/chromium/android_webview/AwSettings.java',
'../java/src/org/chromium/android_webview/AwWebContentsDelegate.java',
'../java/src/org/chromium/android_webview/InterceptedRequestData.java',
'../java/src/org/chromium/android_webview/JsResultHandler.java',
diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc
index b381352..cf2630d 100644
--- a/android_webview/renderer/aw_render_view_ext.cc
+++ b/android_webview/renderer/aw_render_view_ext.cc
@@ -156,6 +156,7 @@ bool AwRenderViewExt::OnMessageReceived(const IPC::Message& message) {
OnEnableCapturePictureCallback)
IPC_MESSAGE_HANDLER(AwViewMsg_CapturePictureSync,
OnCapturePictureSync)
+ IPC_MESSAGE_HANDLER(AwViewMsg_SetTextZoomLevel, OnSetTextZoomLevel)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
@@ -268,4 +269,12 @@ void AwRenderViewExt::OnCapturePictureSync() {
// routing_id(), render_view()->CapturePicture());
}
+void AwRenderViewExt::OnSetTextZoomLevel(double zoom_level) {
+ if (!render_view() || !render_view()->GetWebView())
+ return;
+ // Hide selection and autofill popups.
+ render_view()->GetWebView()->hidePopups();
+ render_view()->GetWebView()->setZoomLevel(true, zoom_level);
+}
+
} // namespace android_webview
diff --git a/android_webview/renderer/aw_render_view_ext.h b/android_webview/renderer/aw_render_view_ext.h
index 8efa5b3..2a99086 100644
--- a/android_webview/renderer/aw_render_view_ext.h
+++ b/android_webview/renderer/aw_render_view_ext.h
@@ -53,6 +53,8 @@ class AwRenderViewExt : public content::RenderViewObserver,
void OnCapturePictureSync();
+ void OnSetTextZoomLevel(double zoom_level);
+
// WebKit::WebPermissionClient implementation.
virtual bool allowImage(WebKit::WebFrame* frame,
bool enabledPerSettings,
diff --git a/content/browser/android/content_settings.cc b/content/browser/android/content_settings.cc
index cd61c41..959bf11 100644
--- a/content/browser/android/content_settings.cc
+++ b/content/browser/android/content_settings.cc
@@ -285,8 +285,12 @@ void ContentSettings::SyncToNativeImpl() {
Java_ContentSettings_getTextAutosizingEnabled(env, obj);
int text_size_percent = env->GetIntField(obj, field_ids_->text_size_percent);
- prefs.font_scale_factor = text_size_percent / 100.0f;
- prefs.force_enable_zoom = text_size_percent >= 130;
+ if (prefs.text_autosizing_enabled) {
+ prefs.font_scale_factor = text_size_percent / 100.0f;
+ prefs.force_enable_zoom = text_size_percent >= 130;
+ } else {
+ prefs.force_enable_zoom = false;
+ }
ScopedJavaLocalRef<jstring> str(
env, static_cast<jstring>(
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 8dde7b7..fdc41f0 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -5133,7 +5133,12 @@ void RenderViewImpl::OnSetZoomLevel(double zoom_level) {
void RenderViewImpl::OnSetZoomLevelForLoadingURL(const GURL& url,
double zoom_level) {
+#if !defined(OS_ANDROID)
+ // On Android, page zoom isn't used, and in case of WebView, text zoom is used
+ // for legacy WebView text scaling emulation. Thus, the code that resets
+ // the zoom level from this map will be effectively resetting text zoom level.
host_zoom_levels_[url] = zoom_level;
+#endif
}
void RenderViewImpl::OnSetPageEncoding(const std::string& encoding_name) {
@@ -5439,6 +5444,8 @@ void RenderViewImpl::OnSetRendererPrefs(
// If the zoom level for this page matches the old zoom default, and this
// is not a plugin, update the zoom level to match the new default.
if (webview() && !webview()->mainFrame()->document().isPluginDocument() &&
+ !ZoomValuesEqual(old_zoom_level,
+ renderer_preferences_.default_zoom_level) &&
ZoomValuesEqual(webview()->zoomLevel(), old_zoom_level)) {
webview()->setZoomLevel(false, renderer_preferences_.default_zoom_level);
zoomLevelChanged();
diff --git a/webkit/glue/webkit_glue.cc b/webkit/glue/webkit_glue.cc
index fc33205..535a7b4 100644
--- a/webkit/glue/webkit_glue.cc
+++ b/webkit/glue/webkit_glue.cc
@@ -372,4 +372,8 @@ size_t MemoryUsageKB() {
}
#endif
+double ZoomFactorToZoomLevel(double factor) {
+ return WebView::zoomFactorToZoomLevel(factor);
+}
+
} // namespace webkit_glue
diff --git a/webkit/glue/webkit_glue.h b/webkit/glue/webkit_glue.h
index 6c3c2e3..f2d511b 100644
--- a/webkit/glue/webkit_glue.h
+++ b/webkit/glue/webkit_glue.h
@@ -120,6 +120,10 @@ WEBKIT_GLUE_EXPORT void ConfigureURLRequestForReferrerPolicy(
// computed inside the sandbox and thus its not always accurate.
WEBKIT_GLUE_EXPORT size_t MemoryUsageKB();
+// Converts from zoom factor (zoom percent / 100) to zoom level, where 0 means
+// no zoom, positive numbers mean zoom in, negatives mean zoom out.
+WEBKIT_GLUE_EXPORT double ZoomFactorToZoomLevel(double factor);
+
} // namespace webkit_glue
#endif // WEBKIT_GLUE_WEBKIT_GLUE_H_