diff options
7 files changed, 65 insertions, 13 deletions
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 507f568..f03f50e 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -284,6 +284,8 @@ public class AwContents { mContentViewCore.getNativeContentViewCore()); mDIPScale = DeviceDisplayInfo.create(containerView.getContext()).getDIPScale(); + mContentsClient.setDIPScale(mDIPScale); + mSettings.setDIPScale(mDIPScale); ContentVideoView.registerContentVideoViewContextDelegate( new AwContentVideoViewDelegate(contentsClient, containerView.getContext())); @@ -671,6 +673,16 @@ public class AwContents { msg.sendToTarget(); } + /** + * @see android.webkit.WebView#getScale() + * + * Please note that the scale returned is the page scale multiplied by + * the screen density factor. See CTS WebViewTest.testSetInitialScale. + */ + public float getScale() { + return (float)(getContentViewCore().getScale() * mDIPScale); + } + //-------------------------------------------------------------------------------------------- // View and ViewGroup method implementations //-------------------------------------------------------------------------------------------- diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java index a409f58..f0436ea 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java @@ -47,6 +47,8 @@ public abstract class AwContentsClient extends ContentViewClient { private AwWebContentsObserver mWebContentsObserver; + private double mDIPScale; + //-------------------------------------------------------------------------------------------- // Adapter for WebContentsDelegate methods. //-------------------------------------------------------------------------------------------- @@ -201,6 +203,10 @@ public abstract class AwContentsClient extends ContentViewClient { mWebContentsObserver = new AwWebContentsObserver(contentViewCore); } + void setDIPScale(double dipScale) { + mDIPScale = dipScale; + } + final AwWebContentsDelegate getWebContentsDelegate() { return mWebContentsDelegateAdapter; } @@ -246,6 +252,15 @@ public abstract class AwContentsClient extends ContentViewClient { public abstract void onGeolocationPermissionsHidePrompt(); + // TODO(mnaganov): Make final after updating the glue layer. + public /*final*/ void onScaleChanged(float oldScale, float newScale) { + onScaleChangedScaled((float)(oldScale * mDIPScale), (float)(newScale * mDIPScale)); + } + + // TODO(mnaganov): Make abstract after updating the glue layer. + public /*abstract*/ void onScaleChangedScaled(float oldScale, float newScale) { + } + protected abstract void handleJsAlert(String url, String message, JsResultReceiver receiver); protected abstract void handleJsBeforeUnload(String url, String message, 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 8352638..5451611 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -25,6 +25,7 @@ public class AwSettings { private final Object mAwSettingsLock = new Object(); private final Context mContext; + private double mDIPScale; private boolean mBlockNetworkLoads; // Default depends on permission of embedding APK. private boolean mAllowContentUrlAccess = true; private boolean mAllowFileUrlAccess = true; @@ -50,6 +51,10 @@ public class AwSettings { mNativeAwSettings = 0; } + void setDIPScale(double dipScale) { + mDIPScale = dipScale; + } + /** * See {@link android.webkit.WebSettings#setBlockNetworkLoads}. */ @@ -161,7 +166,7 @@ public class AwSettings { /** * Sets the initial scale for this WebView. The default value - * is -1. A non-default value overrides initial scale set by + * is 0. A non-default value overrides initial scale set by * the meta viewport tag. */ public void setInitialPageScale(final float scaleInPercent) { @@ -170,7 +175,7 @@ public class AwSettings { ThreadUtils.runOnUiThread(new Runnable() { @Override public void run() { - nativeSetInitialPageScale(mNativeAwSettings, scaleInPercent); + nativeSetInitialPageScale(mNativeAwSettings, (float)(scaleInPercent / mDIPScale)); } }); } 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 b5e7f20..f4e6cd3 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 @@ -2428,29 +2428,30 @@ public class AwSettingsTest extends AndroidWebViewTestBase { final String page = "<html><body>" + "<p style='height:1000px;width:1000px'>testSetInitialScale</p>" + "</body></html>"; - final float defaultScale = 1.0f; + final float defaultScale = + getInstrumentation().getTargetContext().getResources().getDisplayMetrics().density; - assertEquals(defaultScale, getScaleOnUiThread(awContents)); + assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f); loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false); - assertEquals(defaultScale, getScaleOnUiThread(awContents)); + assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f); int onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount(); awSettings.setInitialPageScale(50); loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false); contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); - assertEquals(0.5f, getScaleOnUiThread(awContents)); + assertEquals(0.5f, getPixelScaleOnUiThread(awContents), .01f); onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount(); - awSettings.setInitialPageScale(200); + awSettings.setInitialPageScale(500); loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false); contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); - assertEquals(2.0f, getScaleOnUiThread(awContents)); + assertEquals(5.0f, getPixelScaleOnUiThread(awContents), .01f); onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount(); - awSettings.setInitialPageScale(-1); + awSettings.setInitialPageScale(0); loadDataSync(awContents, onPageFinishedHelper, page, "text/html", false); contentClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount); - assertEquals(defaultScale, getScaleOnUiThread(awContents)); + assertEquals(defaultScale, getPixelScaleOnUiThread(awContents), .01f); } /** @@ -2638,6 +2639,9 @@ public class AwSettingsTest extends AndroidWebViewTestBase { AndroidProtocolHandler.setResourceContextForTesting(null); } + /** + * Returns pure page scale. + */ private float getScaleOnUiThread(final AwContents awContents) throws Throwable { return runTestOnUiThreadAndGetResult(new Callable<Float>() { @Override @@ -2646,4 +2650,16 @@ public class AwSettingsTest extends AndroidWebViewTestBase { } }); } + + /** + * Returns page scale multiplied by the screen density. + */ + private float getPixelScaleOnUiThread(final AwContents awContents) throws Throwable { + return runTestOnUiThreadAndGetResult(new Callable<Float>() { + @Override + public Float call() throws Exception { + return awContents.getScale(); + } + }); + } } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/NullContentsClient.java b/android_webview/javatests/src/org/chromium/android_webview/test/NullContentsClient.java index cc34abf..fc28c95 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/NullContentsClient.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/NullContentsClient.java @@ -152,4 +152,8 @@ class NullContentsClient extends AwContentsClient { public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) { } + + @Override + public void onScaleChangedScaled(float oldScale, float newScale) { + } } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java index 2f81b57..66b5f62 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java @@ -135,7 +135,7 @@ class TestAwContentsClient extends NullContentsClient { } @Override - public void onScaleChanged(float oldScale, float newScale) { + public void onScaleChangedScaled(float oldScale, float newScale) { mOnScaleChangedHelper.notifyCalled(oldScale, newScale); } } diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc index 2af6f5e..ef10859 100644 --- a/android_webview/native/aw_settings.cc +++ b/android_webview/native/aw_settings.cc @@ -14,7 +14,7 @@ namespace android_webview { AwSettings::AwSettings(JNIEnv* env, jobject obj) : java_ref_(env, obj), enable_fixed_layout_(false), - initial_page_scale_percent_(-1), + initial_page_scale_percent_(0), text_zoom_percent_(100) { } @@ -72,7 +72,7 @@ void AwSettings::UpdateEnableFixedLayoutMode() { void AwSettings::UpdateInitialPageScale() { AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); if (!rvhe) return; - if (initial_page_scale_percent_ == -1) { + if (initial_page_scale_percent_ == 0) { rvhe->SetInitialPageScale(-1); } else { rvhe->SetInitialPageScale(initial_page_scale_percent_ / 100.0f); |