summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 07:56:16 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-08 07:56:16 +0000
commitc0b970f01e3f58382cdb3439b8c53f7b117d1f55 (patch)
treefb1b38c678b8c453b4febd7ab92d6ad8fbbb4015 /android_webview
parenta1726beda77bdab1bf0324e74b300279e683f712 (diff)
downloadchromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.zip
chromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.tar.gz
chromium_src-c0b970f01e3f58382cdb3439b8c53f7b117d1f55.tar.bz2
[Android] Move zoom controls management into WebView
Chrome for Android doesn't use zoom controls, so it makes sense to move all the related code into android_webview. However, as visibility of zoom controls is controlled from the internals of ContentView*, we are providing hooks through a new delegate interface. BUG=b/8296421 R=benm@chromium.org, joth@chromium.org Review URL: https://codereview.chromium.org/14840011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198862 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java20
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwSettings.java97
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwZoomControls.java102
-rw-r--r--android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java (renamed from android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java)52
4 files changed, 237 insertions, 34 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 4118f49..683304f 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -115,6 +115,7 @@ public class AwContents {
private InterceptNavigationDelegateImpl mInterceptNavigationDelegate;
private InternalAccessDelegate mInternalAccessAdapter;
private final AwLayoutSizer mLayoutSizer;
+ private AwZoomControls mZoomControls;
// This can be accessed on any thread after construction. See AwContentsIoThreadClient.
private final AwSettings mSettings;
private boolean mIsPaused;
@@ -328,12 +329,15 @@ public class AwContents {
mCleanupReference = new CleanupReference(this, new DestroyRunnable(mNativeAwContents));
int nativeWebContents = nativeGetWebContents(mNativeAwContents);
- mContentViewCore.initialize(containerView, internalAccessAdapter, nativeWebContents, null);
+ mContentViewCore.initialize(
+ containerView, internalAccessAdapter, nativeWebContents, null);
mContentViewCore.setContentViewClient(mContentsClient.getContentViewClient());
+ mZoomControls = new AwZoomControls(this);
+ mContentViewCore.setZoomControlsDelegate(mZoomControls);
mContentsClient.installWebContentsObserver(mContentViewCore);
mSettings = new AwSettings(mContentViewCore.getContext(), nativeWebContents,
- isAccessFromFileURLsGrantedByDefault);
+ mContentViewCore, isAccessFromFileURLsGrantedByDefault);
setIoThreadClient(new IoThreadClientImpl());
setInterceptNavigationDelegate(new InterceptNavigationDelegateImpl());
@@ -573,11 +577,9 @@ public class AwContents {
ContentViewCore.PERSONALITY_VIEW);
newCore.initialize(mContainerView, mInternalAccessAdapter, newWebContentsPtr, null);
newCore.setContentViewClient(mContentsClient.getContentViewClient());
+ newCore.setZoomControlsDelegate(mZoomControls);
mContentsClient.installWebContentsObserver(newCore);
- ContentSettings oldSettings = mContentViewCore.getContentSettings();
- newCore.getContentSettings().initFrom(oldSettings);
-
// Now swap the Java side reference.
mContentViewCore.destroy();
mContentViewCore = newCore;
@@ -610,6 +612,14 @@ public class AwContents {
}
}
+ public boolean isMultiTouchZoomSupported() {
+ return mSettings.supportsMultiTouchZoom();
+ }
+
+ public View getZoomControlsForTest() {
+ return mZoomControls.getZoomControlsViewForTest();
+ }
+
//--------------------------------------------------------------------------------------------
// WebView[Provider] method implementations (where not provided by ContentViewCore)
//--------------------------------------------------------------------------------------------
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 8d1c57c7..cd8c484 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java
@@ -17,6 +17,7 @@ import android.webkit.WebView;
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.base.ThreadUtils;
+import org.chromium.content.browser.ContentViewCore;
/**
* Stores Android WebView specific settings that does not need to be synced to WebKit.
@@ -89,6 +90,9 @@ public class AwSettings {
private int mCacheMode = WebSettings.LOAD_DEFAULT;
private boolean mShouldFocusFirstNode = true;
private boolean mGeolocationEnabled = true;
+ private boolean mSupportZoom = true;
+ private boolean mBuiltInZoomControls = false;
+ private boolean mDisplayZoomControls = true;
static class LazyDefaultUserAgent{
// Lazy Holder pattern
private static final String sInstance = nativeGetDefaultUserAgent();
@@ -104,6 +108,8 @@ public class AwSettings {
// The native side of this object.
private int mNativeAwSettings = 0;
+ private ContentViewCore mContentViewCore;
+
// A flag to avoid sending superfluous synchronization messages.
private boolean mIsUpdateWebkitPrefsMessagePending = false;
// Custom handler that queues messages to call native code on the UI thread.
@@ -159,7 +165,9 @@ public class AwSettings {
}
}
- public AwSettings(Context context, int nativeWebContents,
+ public AwSettings(Context context,
+ int nativeWebContents,
+ ContentViewCore contentViewCore,
boolean isAccessFromFileURLsGrantedByDefault) {
ThreadUtils.assertOnUiThread();
mContext = context;
@@ -169,6 +177,8 @@ public class AwSettings {
Process.myUid()) != PackageManager.PERMISSION_GRANTED;
mNativeAwSettings = nativeInit(nativeWebContents);
assert mNativeAwSettings != 0;
+ mContentViewCore = contentViewCore;
+ mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked());
if (isAccessFromFileURLsGrantedByDefault) {
mAllowUniversalAccessFromFileURLs = true;
@@ -1059,6 +1069,91 @@ public class AwSettings {
}
}
+ private void updateMultiTouchZoomSupport(final boolean supportsMultiTouchZoom) {
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mContentViewCore.updateMultiTouchZoomSupport(supportsMultiTouchZoom);
+ }
+ });
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#setSupportZoom}.
+ */
+ public void setSupportZoom(boolean support) {
+ synchronized (mAwSettingsLock) {
+ if (mSupportZoom != support) {
+ mSupportZoom = support;
+ updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked());
+ }
+ }
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#supportZoom}.
+ */
+ public boolean supportZoom() {
+ synchronized (mAwSettingsLock) {
+ return mSupportZoom;
+ }
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#setBuiltInZoomControls}.
+ */
+ public void setBuiltInZoomControls(boolean enabled) {
+ synchronized (mAwSettingsLock) {
+ if (mBuiltInZoomControls != enabled) {
+ mBuiltInZoomControls = enabled;
+ updateMultiTouchZoomSupport(supportsMultiTouchZoomLocked());
+ }
+ }
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#getBuiltInZoomControls}.
+ */
+ public boolean getBuiltInZoomControls() {
+ synchronized (mAwSettingsLock) {
+ return mBuiltInZoomControls;
+ }
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#setDisplayZoomControls}.
+ */
+ public void setDisplayZoomControls(boolean enabled) {
+ synchronized (mAwSettingsLock) {
+ mDisplayZoomControls = enabled;
+ }
+ }
+
+ /**
+ * See {@link android.webkit.WebSettings#getDisplayZoomControls}.
+ */
+ public boolean getDisplayZoomControls() {
+ synchronized (mAwSettingsLock) {
+ return mDisplayZoomControls;
+ }
+ }
+
+ private boolean supportsMultiTouchZoomLocked() {
+ return mSupportZoom && mBuiltInZoomControls;
+ }
+
+ boolean supportsMultiTouchZoom() {
+ synchronized (mAwSettingsLock) {
+ return supportsMultiTouchZoomLocked();
+ }
+ }
+
+ boolean shouldDisplayZoomControls() {
+ synchronized (mAwSettingsLock) {
+ return supportsMultiTouchZoomLocked() && mDisplayZoomControls;
+ }
+ }
+
private int clipFontSize(int size) {
if (size < MINIMUM_FONT_SIZE) {
return MINIMUM_FONT_SIZE;
diff --git a/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java
new file mode 100644
index 0000000..0bcae18
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java
@@ -0,0 +1,102 @@
+// 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.
+
+package org.chromium.android_webview;
+
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.ZoomButtonsController;
+import org.chromium.content.browser.ContentViewCore.ZoomControlsDelegate;
+
+class AwZoomControls implements ZoomControlsDelegate {
+
+ private AwContents mAwContents;
+ // It is advised to use getZoomController() where possible.
+ private ZoomButtonsController mZoomButtonsController;
+
+ AwZoomControls(AwContents awContents) {
+ mAwContents = awContents;
+ }
+
+ @Override
+ public void invokeZoomPicker() {
+ ZoomButtonsController zoomController = getZoomController();
+ if (zoomController != null) {
+ zoomController.setVisible(true);
+ }
+ }
+
+ @Override
+ public void dismissZoomPicker() {
+ ZoomButtonsController zoomController = getZoomController();
+ if (zoomController != null) {
+ zoomController.setVisible(false);
+ }
+ }
+
+ @Override
+ public void updateZoomControls() {
+ ZoomButtonsController zoomController = getZoomController();
+ if (zoomController == null) {
+ return;
+ }
+ boolean canZoomIn = mAwContents.canZoomIn();
+ boolean canZoomOut = mAwContents.canZoomOut();
+ if (!canZoomIn && !canZoomOut) {
+ // Hide the zoom in and out buttons if the page cannot zoom
+ zoomController.getZoomControls().setVisibility(View.GONE);
+ } else {
+ // Set each one individually, as a page may be able to zoom in or out
+ zoomController.setZoomInEnabled(canZoomIn);
+ zoomController.setZoomOutEnabled(canZoomOut);
+ }
+ }
+
+ // This method is used in tests. It doesn't modify the state of zoom controls.
+ View getZoomControlsViewForTest() {
+ return mZoomButtonsController != null ? mZoomButtonsController.getZoomControls() : null;
+ }
+
+ private ZoomButtonsController getZoomController() {
+ if (mZoomButtonsController == null &&
+ mAwContents.getSettings().shouldDisplayZoomControls()) {
+ mZoomButtonsController = new ZoomButtonsController(
+ mAwContents.getContentViewCore().getContainerView());
+ mZoomButtonsController.setOnZoomListener(new ZoomListener());
+ // ZoomButtonsController positions the buttons at the bottom, but in
+ // the middle. Change their layout parameters so they appear on the
+ // right.
+ View controls = mZoomButtonsController.getZoomControls();
+ ViewGroup.LayoutParams params = controls.getLayoutParams();
+ if (params instanceof FrameLayout.LayoutParams) {
+ ((FrameLayout.LayoutParams) params).gravity = Gravity.RIGHT;
+ }
+ }
+ return mZoomButtonsController;
+ }
+
+ private class ZoomListener implements ZoomButtonsController.OnZoomListener {
+ @Override
+ public void onVisibilityChanged(boolean visible) {
+ if (visible) {
+ // Bring back the hidden zoom controls.
+ mZoomButtonsController.getZoomControls().setVisibility(View.VISIBLE);
+ updateZoomControls();
+ }
+ }
+
+ @Override
+ public void onZoom(boolean zoomIn) {
+ if (zoomIn) {
+ mAwContents.zoomIn();
+ } else {
+ mAwContents.zoomOut();
+ }
+ // ContentView will call updateZoomControls after its current page scale
+ // is got updated from the native code.
+ }
+ }
+}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
index c50d6f5..db46d07 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
@@ -14,8 +14,6 @@ import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwSettings;
import org.chromium.base.ThreadUtils;
import org.chromium.base.test.util.Feature;
-import org.chromium.content.browser.ContentSettings;
-import org.chromium.content.browser.ContentViewCore;
import org.chromium.content.browser.test.util.Criteria;
import org.chromium.content.browser.test.util.CriteriaHelper;
@@ -24,13 +22,12 @@ import java.util.concurrent.Callable;
/**
* A test suite for zooming-related methods and settings.
*/
-public class ContentViewZoomTest extends AwTestBase {
+public class AwZoomTest extends AwTestBase {
private static final long TEST_TIMEOUT_MS = 20000L;
private static final int CHECK_INTERVAL_MS = 100;
private TestAwContentsClient mContentsClient;
private AwContents mAwContents;
- private ContentViewCore mContentViewCore;
@Override
public void setUp() throws Exception {
@@ -39,7 +36,6 @@ public class ContentViewZoomTest extends AwTestBase {
final AwTestContainerView testContainerView =
createAwTestContainerViewOnMainSync(mContentsClient);
mAwContents = testContainerView.getAwContents();
- mContentViewCore = testContainerView.getContentViewCore();
}
private String getZoomableHtml() {
@@ -62,7 +58,7 @@ public class ContentViewZoomTest extends AwTestBase {
return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
- return mContentViewCore.isMultiTouchZoomSupported();
+ return mAwContents.isMultiTouchZoomSupported();
}
});
}
@@ -80,7 +76,7 @@ public class ContentViewZoomTest extends AwTestBase {
return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
- return mContentViewCore.canZoomIn();
+ return mAwContents.canZoomIn();
}
});
}
@@ -89,7 +85,7 @@ public class ContentViewZoomTest extends AwTestBase {
return runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
- return mContentViewCore.canZoomOut();
+ return mAwContents.canZoomOut();
}
});
}
@@ -98,7 +94,7 @@ public class ContentViewZoomTest extends AwTestBase {
return runTestOnUiThreadAndGetResult(new Callable<Float>() {
@Override
public Float call() throws Exception {
- return mContentViewCore.getScale();
+ return mAwContents.getScale();
}
});
}
@@ -107,7 +103,7 @@ public class ContentViewZoomTest extends AwTestBase {
return runTestOnUiThreadAndGetResult(new Callable<View>() {
@Override
public View call() throws Exception {
- return mContentViewCore.getZoomControlsForTest();
+ return mAwContents.getZoomControlsForTest();
}
});
}
@@ -116,7 +112,7 @@ public class ContentViewZoomTest extends AwTestBase {
ThreadUtils.runOnUiThreadBlocking(new Runnable() {
@Override
public void run() {
- mContentViewCore.invokeZoomPicker();
+ mAwContents.invokeZoomPicker();
}
});
}
@@ -126,7 +122,7 @@ public class ContentViewZoomTest extends AwTestBase {
if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
- return mContentViewCore.zoomIn();
+ return mAwContents.zoomIn();
}
}))
return false;
@@ -139,7 +135,7 @@ public class ContentViewZoomTest extends AwTestBase {
if (!runTestOnUiThreadAndGetResult(new Callable<Boolean>() {
@Override
public Boolean call() throws Exception {
- return mContentViewCore.zoomOut();
+ return mAwContents.zoomOut();
}
}))
return false;
@@ -182,7 +178,7 @@ public class ContentViewZoomTest extends AwTestBase {
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);
mContentsClient.getOnScaleChangedHelper().waitForCallback(onScaleChangedCallCount);
- getContentSettingsOnUiThread(mAwContents).setSupportZoom(supportZoom);
+ getAwSettingsOnUiThread(mAwContents).setSupportZoom(supportZoom);
assertTrue("Should be able to zoom in", canZoomInOnUiThread());
assertFalse("Should not be able to zoom out", canZoomOutOnUiThread());
@@ -218,14 +214,14 @@ public class ContentViewZoomTest extends AwTestBase {
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);
- assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom());
- assertFalse(getContentSettingsOnUiThread(mAwContents).getBuiltInZoomControls());
+ assertTrue(webSettings.supportZoom());
+ assertFalse(webSettings.getBuiltInZoomControls());
assertFalse(isMultiTouchZoomSupportedOnUiThread());
- getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true);
+ webSettings.setBuiltInZoomControls(true);
assertTrue(isMultiTouchZoomSupportedOnUiThread());
- getContentSettingsOnUiThread(mAwContents).setSupportZoom(false);
+ webSettings.setSupportZoom(false);
assertFalse(isMultiTouchZoomSupportedOnUiThread());
}
@@ -240,9 +236,9 @@ public class ContentViewZoomTest extends AwTestBase {
// It must be possible to zoom in (or zoom out) for zoom controls to be shown
assertTrue("Should be able to zoom in", canZoomInOnUiThread());
- assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom());
- getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true);
- getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(false);
+ assertTrue(webSettings.supportZoom());
+ webSettings.setBuiltInZoomControls(true);
+ webSettings.setDisplayZoomControls(false);
// With DisplayZoomControls set to false, attempts to display zoom
// controls must be ignored.
@@ -250,7 +246,7 @@ public class ContentViewZoomTest extends AwTestBase {
invokeZoomPickerOnUiThread();
assertNull(getZoomControlsOnUiThread());
- getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true);
+ webSettings.setDisplayZoomControls(true);
assertNull(getZoomControlsOnUiThread());
invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread();
@@ -267,9 +263,9 @@ public class ContentViewZoomTest extends AwTestBase {
// ContentView must update itself according to the viewport setup.
waitUntilCanNotZoom();
- assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom());
- getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true);
- getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true);
+ assertTrue(webSettings.supportZoom());
+ webSettings.setBuiltInZoomControls(true);
+ webSettings.setDisplayZoomControls(true);
assertNull(getZoomControlsOnUiThread());
invokeZoomPickerOnUiThread();
View zoomControls = getZoomControlsOnUiThread();
@@ -283,9 +279,9 @@ public class ContentViewZoomTest extends AwTestBase {
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);
- assertTrue(getContentSettingsOnUiThread(mAwContents).supportZoom());
- getContentSettingsOnUiThread(mAwContents).setBuiltInZoomControls(true);
- getContentSettingsOnUiThread(mAwContents).setDisplayZoomControls(true);
+ assertTrue(webSettings.supportZoom());
+ webSettings.setBuiltInZoomControls(true);
+ webSettings.setDisplayZoomControls(true);
invokeZoomPickerOnUiThread();
// Now force an orientation change, and try to display the zoom picker