summaryrefslogtreecommitdiffstats
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
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
-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
-rw-r--r--build/android/findbugs_filter/findbugs_known_bugs.txt1
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ContentSettings.java181
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ContentView.java19
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java60
-rw-r--r--content/public/android/java/src/org/chromium/content/browser/ZoomManager.java94
9 files changed, 284 insertions, 342 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
diff --git a/build/android/findbugs_filter/findbugs_known_bugs.txt b/build/android/findbugs_filter/findbugs_known_bugs.txt
index c0fe27f..3533af4 100644
--- a/build/android/findbugs_filter/findbugs_known_bugs.txt
+++ b/build/android/findbugs_filter/findbugs_known_bugs.txt
@@ -27,7 +27,6 @@ M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_we
M D DMI: Hard coded reference to an absolute pathname in org.chromium.android_webview.test.ArchiveTest.testExplicitBadPath() At ArchiveTest.java
M D SF: Switch statement found in org.chromium.chrome.browser.ChromeBrowserProvider.insert(Uri, ContentValues) where one case falls through to the next case At ChromeBrowserProvider.java
M D SF: Switch statement found in org.chromium.chrome.browser.database.SQLiteCursor.fillWindow(int, CursorWindow) where default case is missing At SQLiteCursor.java
-M D SF: Switch statement found in org.chromium.content.browser.ContentSettings$EventHandler$1.handleMessage(Message) where default case is missing At ContentSettings.java
M D SF: Switch statement found in org.chromium.content.browser.third_party.GestureDetector.onTouchEvent(MotionEvent) where default case is missing At GestureDetector.java
M M LI: Incorrect lazy initialization and update of static field org.chromium.content.browser.ContentVideoView.sContentVideoView in org.chromium.content.browser.ContentVideoView.createContentVideoView(int) At ContentVideoView.java
M M UG: org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.getBooleanValue() is unsynchronized, org.chromium.content.browser.JavaBridgeReturnValuesTest$TestObject.setBooleanValue(boolean) is synchronized At JavaBridgeReturnValuesTest.java
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java b/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java
index df03f00..d3ca0c6 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentSettings.java
@@ -4,78 +4,25 @@
package org.chromium.content.browser;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
import org.chromium.base.CalledByNative;
import org.chromium.base.JNINamespace;
import org.chromium.base.ThreadUtils;
-import java.util.concurrent.Callable;
-
/**
* Manages settings state for a ContentView. A ContentSettings instance is obtained
- * from ContentView.getContentSettings(). If ContentView is used in the
- * ContentView.PERSONALITY_VIEW role, all settings are read / write. If ContentView
- * is in the ContentView.PERSONALITY_CHROME role, setting can only be read.
+ * from ContentViewCore.getContentSettings().
*/
@JNINamespace("content")
public class ContentSettings {
private static final String TAG = "ContentSettings";
- // This class must be created on the UI thread. Afterwards, it can be
- // used from any thread. Internally, the class uses a message queue
- // to call native code on the UI thread only.
-
// The native side of this object. Ownership is retained native-side by the WebContents
// instance that backs the associated ContentViewCore.
private int mNativeContentSettings = 0;
private ContentViewCore mContentViewCore;
- // Custom handler that queues messages to call native code on the UI thread.
- private final EventHandler mEventHandler;
-
- // Protects access to settings fields.
- private final Object mContentSettingsLock = new Object();
-
- private boolean mSupportZoom = true;
- private boolean mBuiltInZoomControls = false;
- private boolean mDisplayZoomControls = true;
-
- // Class to handle messages to be processed on the UI thread.
- private class EventHandler {
- // Message id for updating multi-touch zoom state in the view
- private static final int UPDATE_MULTI_TOUCH = 2;
- // Actual UI thread handler
- private Handler mHandler;
-
- EventHandler() {
- if (mContentViewCore.isPersonalityView()) {
- mHandler = new Handler(Looper.getMainLooper()) {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case UPDATE_MULTI_TOUCH:
- if (mContentViewCore.isAlive()) {
- mContentViewCore.updateMultiTouchZoomSupport();
- }
- break;
- }
- }
- };
- }
- }
-
- private void sendUpdateMultiTouchMessageLocked() {
- assert Thread.holdsLock(mContentSettingsLock);
- if (mNativeContentSettings == 0) return;
- mHandler.sendMessage(Message.obtain(null, UPDATE_MULTI_TOUCH));
- }
- }
-
/**
* Package constructor to prevent clients from creating a new settings
* instance. Must be called on the UI thread.
@@ -85,12 +32,6 @@ public class ContentSettings {
mContentViewCore = contentViewCore;
mNativeContentSettings = nativeInit(nativeContentView);
assert mNativeContentSettings != 0;
-
- mEventHandler = new EventHandler();
- if (!mContentViewCore.isPersonalityView()) {
- mBuiltInZoomControls = true;
- mDisplayZoomControls = false;
- }
}
/**
@@ -104,126 +45,14 @@ public class ContentSettings {
}
/**
- * Sets whether the WebView should support zooming using its on-screen zoom
- * controls and gestures. The particular zoom mechanisms that should be used
- * can be set with {@link #setBuiltInZoomControls}. This setting does not
- * affect zooming performed using the {@link WebView#zoomIn()} and
- * {@link WebView#zoomOut()} methods. The default is true.
- *
- * @param support whether the WebView should support zoom
- */
- public void setSupportZoom(boolean support) {
- synchronized (mContentSettingsLock) {
- mSupportZoom = support;
- mEventHandler.sendUpdateMultiTouchMessageLocked();
- }
- }
-
- /**
- * Gets whether the WebView supports zoom.
- *
- * @return true if the WebView supports zoom
- * @see #setSupportZoom
- */
- public boolean supportZoom() {
- return mSupportZoom;
- }
-
- /**
- * Sets whether the WebView should use its built-in zoom mechanisms. The
- * built-in zoom mechanisms comprise on-screen zoom controls, which are
- * displayed over the WebView's content, and the use of a pinch gesture to
- * control zooming. Whether or not these on-screen controls are displayed
- * can be set with {@link #setDisplayZoomControls}. The default is false,
- * due to compatibility reasons.
- * <p>
- * The built-in mechanisms are the only currently supported zoom
- * mechanisms, so it is recommended that this setting is always enabled.
- * In other words, there is no point of calling this method other than
- * with the 'true' parameter.
- *
- * @param enabled whether the WebView should use its built-in zoom mechanisms
- */
- public void setBuiltInZoomControls(boolean enabled) {
- synchronized (mContentSettingsLock) {
- mBuiltInZoomControls = enabled;
- mEventHandler.sendUpdateMultiTouchMessageLocked();
- }
- }
-
- /**
- * Gets whether the zoom mechanisms built into WebView are being used.
- *
- * @return true if the zoom mechanisms built into WebView are being used
- * @see #setBuiltInZoomControls
- */
- public boolean getBuiltInZoomControls() {
- return mBuiltInZoomControls;
- }
-
- /**
- * Sets whether the WebView should display on-screen zoom controls when
- * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
- * The default is true.
- *
- * @param enabled whether the WebView should display on-screen zoom controls
- */
- public void setDisplayZoomControls(boolean enabled) {
- synchronized (mContentSettingsLock) {
- mDisplayZoomControls = enabled;
- mEventHandler.sendUpdateMultiTouchMessageLocked();
- }
- }
-
- /**
- * Gets whether the WebView displays on-screen zoom controls when using
- * the built-in zoom mechanisms.
- *
- * @return true if the WebView displays on-screen zoom controls when using
- * the built-in zoom mechanisms
- * @see #setDisplayZoomControls
- */
- public boolean getDisplayZoomControls() {
- return mDisplayZoomControls;
- }
-
- boolean supportsMultiTouchZoom() {
- return mSupportZoom && mBuiltInZoomControls;
- }
-
- boolean shouldDisplayZoomControls() {
- return supportsMultiTouchZoom() && mDisplayZoomControls;
- }
-
- /**
- * Return true if JavaScript is enabled.
+ * Return true if JavaScript is enabled. Must be called on the UI thread.
*
* @return True if JavaScript is enabled.
*/
public boolean getJavaScriptEnabled() {
- return ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Boolean>() {
- @Override
- public Boolean call() {
- if (mNativeContentSettings != 0) {
- return nativeGetJavaScriptEnabled(mNativeContentSettings);
- } else {
- return false;
- }
- }
- });
- }
-
- /**
- * Sets the settings in this object to those from another
- * ContentSettings.
- * Required by WebView when we swap a in a new ContentViewCore
- * to an existing AwContents (i.e. to support displaying popup
- * windows in an already created WebView)
- */
- public void initFrom(ContentSettings settings) {
- setSupportZoom(settings.supportZoom());
- setBuiltInZoomControls(settings.getBuiltInZoomControls());
- setDisplayZoomControls(settings.getDisplayZoomControls());
+ ThreadUtils.assertOnUiThread();
+ return mNativeContentSettings != 0 ?
+ nativeGetJavaScriptEnabled(mNativeContentSettings) : false;
}
// Initialize the ContentSettings native side.
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentView.java b/content/public/android/java/src/org/chromium/content/browser/ContentView.java
index 9ea4fb4..ae00c5b 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentView.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentView.java
@@ -635,14 +635,6 @@ public class ContentView extends FrameLayout
mContentViewCore.onVisibilityChanged(changedView, visibility);
}
- void updateMultiTouchZoomSupport() {
- mContentViewCore.updateMultiTouchZoomSupport();
- }
-
- public boolean isMultiTouchZoomSupported() {
- return mContentViewCore.isMultiTouchZoomSupported();
- }
-
/**
* Register the delegate to be used when content can not be handled by
* the rendering engine, and should be downloaded instead. This will replace
@@ -742,17 +734,6 @@ public class ContentView extends FrameLayout
return mContentViewCore.zoomReset();
}
- // Invokes the graphical zoom picker widget for this ContentView.
- public void invokeZoomPicker() {
- mContentViewCore.invokeZoomPicker();
- }
-
- // Unlike legacy WebView getZoomControls which returns external zoom controls,
- // this method returns built-in zoom controls. This method is used in tests.
- public View getZoomControlsForTest() {
- return mContentViewCore.getZoomControlsForTest();
- }
-
/**
* Return the current scale of the WebView
* @return The current scale.
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
index 88375d7..62a4693 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
@@ -119,7 +119,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
* implementing container view.
*/
@SuppressWarnings("javadoc")
- public static interface InternalAccessDelegate {
+ public interface InternalAccessDelegate {
/**
* @see View#drawChild(Canvas, View, long)
*/
@@ -170,7 +170,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
* An interface that allows the embedder to be notified when the pinch gesture starts and
* stops.
*/
- public static interface PinchGestureStateListener {
+ public interface PinchGestureStateListener {
/**
* Called when the pinch gesture starts.
*/
@@ -181,6 +181,24 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
void onPinchGestureEnd();
}
+ /**
+ * An interface for controlling visibility and state of embedder-provided zoom controls.
+ */
+ public interface ZoomControlsDelegate {
+ /**
+ * Called when it's reasonable to show zoom controls.
+ */
+ void invokeZoomPicker();
+ /**
+ * Called when zoom controls need to be hidden (e.g. when the view hides).
+ */
+ void dismissZoomPicker();
+ /**
+ * Called when page scale has been changed, so the controls can update their state.
+ */
+ void updateZoomControls();
+ }
+
private VSyncManager.Provider mVSyncProvider;
private VSyncManager.Listener mVSyncListener;
private int mVSyncSubscriberCount;
@@ -276,6 +294,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
private ContentViewGestureHandler mContentViewGestureHandler;
private PinchGestureStateListener mPinchGestureStateListener;
private ZoomManager mZoomManager;
+ private ZoomControlsDelegate mZoomControlsDelegate;
private PopupZoomer mPopupZoomer;
@@ -655,8 +674,15 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
}
mZoomManager = new ZoomManager(mContext, this);
- mZoomManager.updateMultiTouchSupport();
mContentViewGestureHandler = new ContentViewGestureHandler(mContext, this, mZoomManager);
+ mZoomControlsDelegate = new ZoomControlsDelegate() {
+ @Override
+ public void invokeZoomPicker() {}
+ @Override
+ public void dismissZoomPicker() {}
+ @Override
+ public void updateZoomControls() {}
+ };
mRenderCoordinates.reset();
@@ -1367,9 +1393,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
}
setAccessibilityState(false);
hidePopupDialog();
- if (mContentSettings != null && mContentSettings.supportZoom()) {
- mZoomManager.dismissZoomPicker();
- }
+ mZoomControlsDelegate.dismissZoomPicker();
}
/**
@@ -1377,9 +1401,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
*/
public void onVisibilityChanged(View changedView, int visibility) {
if (visibility != View.VISIBLE) {
- if (mContentSettings.supportZoom()) {
- mZoomManager.dismissZoomPicker();
- }
+ mZoomControlsDelegate.dismissZoomPicker();
}
}
@@ -1781,12 +1803,12 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
}
}
- void updateMultiTouchZoomSupport() {
- mZoomManager.updateMultiTouchSupport();
+ public void setZoomControlsDelegate(ZoomControlsDelegate zoomControlsDelegate) {
+ mZoomControlsDelegate = zoomControlsDelegate;
}
- public boolean isMultiTouchZoomSupported() {
- return mZoomManager.isMultiTouchZoomSupported();
+ public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) {
+ mZoomManager.updateMultiTouchSupport(supportsMultiTouchZoom);
}
public void selectPopupMenuItems(int[] indices) {
@@ -2160,7 +2182,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
contentOffsetYPix);
if (needTemporarilyHideHandles) temporarilyHideTextHandles();
- if (needUpdateZoomControls) mZoomManager.updateZoomControls();
+ if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls();
if (contentOffsetChanged) updateHandleScreenPositions();
// Update offsets for fullscreen.
@@ -2445,15 +2467,7 @@ public class ContentViewCore implements MotionEventDelegate, NavigationClient {
*/
@Override
public void invokeZoomPicker() {
- if (mContentSettings != null && mContentSettings.supportZoom()) {
- mZoomManager.invokeZoomPicker();
- }
- }
-
- // Unlike legacy WebView getZoomControls which returns external zoom controls,
- // this method returns built-in zoom controls. This method is used in tests.
- public View getZoomControlsForTest() {
- return mZoomManager.getZoomControlsViewForTest();
+ mZoomControlsDelegate.invokeZoomPicker();
}
/**
diff --git a/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java b/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java
index 8e8df31..986d61e 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ZoomManager.java
@@ -6,23 +6,17 @@ package org.chromium.content.browser;
import android.content.Context;
import android.util.Log;
-import android.view.Gravity;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.ZoomButtonsController;
/**
- * The ZoomManager is responsible for maintaining the ContentView's current zoom
- * level state. It is also responsible for managing the on-screen zoom controls.
+ * ZoomManager is responsible for maintaining the ContentView's current zoom
+ * level state and process scaling-related gestures.
*/
class ZoomManager {
private static final String TAG = "ContentViewZoom";
private ContentViewCore mContentViewCore;
- private ZoomButtonsController mZoomButtonsController;
private class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener {
// Completely silence scaling events. Used in WebView when zoom support
@@ -102,26 +96,8 @@ class ZoomManager {
mMultiTouchDetector = new ScaleGestureDetector(context, mMultiTouchListener);
}
- void invokeZoomPicker() {
- ZoomButtonsController zoomControls = getZoomControls();
- if (zoomControls != null && !zoomControls.isVisible()) {
- zoomControls.setVisible(true);
- }
- }
-
- void dismissZoomPicker() {
- ZoomButtonsController zoomControls = getZoomControls();
- if (zoomControls != null && zoomControls.isVisible()) {
- zoomControls.setVisible(false);
- }
- }
-
- boolean isMultiTouchZoomSupported() {
- return !mMultiTouchListener.getPermanentlyIgnoreDetectorEvents();
- }
-
boolean isScaleGestureDetectionInProgress() {
- return isMultiTouchZoomSupported()
+ return !mMultiTouchListener.getPermanentlyIgnoreDetectorEvents()
&& mMultiTouchDetector.isInProgress();
}
@@ -156,67 +132,7 @@ class ZoomManager {
return false;
}
- void updateMultiTouchSupport() {
- mMultiTouchListener.setPermanentlyIgnoreDetectorEvents(
- !mContentViewCore.getContentSettings().supportsMultiTouchZoom());
- }
-
- private ZoomButtonsController getZoomControls() {
- if (mZoomButtonsController == null &&
- mContentViewCore.getContentSettings().shouldDisplayZoomControls()) {
- mZoomButtonsController = new ZoomButtonsController(
- mContentViewCore.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;
- }
-
- // This method is used in tests. It doesn't modify the state of zoom controls.
- View getZoomControlsViewForTest() {
- return mZoomButtonsController != null ? mZoomButtonsController.getZoomControls() : null;
- }
-
- void updateZoomControls() {
- if (mZoomButtonsController == null) return;
- boolean canZoomIn = mContentViewCore.canZoomIn();
- boolean canZoomOut = mContentViewCore.canZoomOut();
- if (!canZoomIn && !canZoomOut) {
- // Hide the zoom in and out buttons if the page cannot zoom
- mZoomButtonsController.getZoomControls().setVisibility(View.GONE);
- } else {
- // Set each one individually, as a page may be able to zoom in or out
- mZoomButtonsController.setZoomInEnabled(canZoomIn);
- mZoomButtonsController.setZoomOutEnabled(canZoomOut);
- }
- }
-
- 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) {
- mContentViewCore.zoomIn();
- } else {
- mContentViewCore.zoomOut();
- }
- // ContentView will call updateZoomControls after its current page scale
- // is got updated from the native code.
- }
+ void updateMultiTouchSupport(boolean supportsMultiTouchZoom) {
+ mMultiTouchListener.setPermanentlyIgnoreDetectorEvents(!supportsMultiTouchZoom);
}
}