private String mSerifFontFamily = "serif";
private String mCursiveFontFamily = "cursive";
private String mFantasyFontFamily = "fantasy";
- // TODO(mnaganov): Should be obtained from Android. Problem: it is hidden.
- private String mDefaultTextEncoding = "Latin-1";
+ private String mDefaultTextEncoding;
private String mUserAgent;
private int mMinimumFontSize = 8;
private int mMinimumLogicalFontSize = 8;
private final boolean mPasswordEchoEnabled;
- // Font scale factor determined by Android system setting.
- private final float mFontScale;
-
// Not accessed by the native side.
private boolean mBlockNetworkLoads; // Default depends on permission of embedding APK.
private boolean mAllowContentUrlAccess = true;
// The native side of this object. It's lifetime is bounded by the WebContent it is attached to.
private long mNativeAwSettings = 0;
- // 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.
private final EventHandler mEventHandler;
// Class to handle messages to be processed on the UI thread.
private class EventHandler {
- // Message id for updating Webkit preferences
- private static final int UPDATE_WEBKIT_PREFERENCES = 0;
+ // Message id for running a Runnable with mAwSettingsLock held.
+ private static final int RUN_RUNNABLE_BLOCKING = 0;
// Actual UI thread handler
private Handler mHandler;
+ // Synchronization flag.
+ private boolean mSynchronizationPending = false;
EventHandler() {
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
- case UPDATE_WEBKIT_PREFERENCES:
+ case RUN_RUNNABLE_BLOCKING:
synchronized (mAwSettingsLock) {
- updateWebkitPreferencesOnUiThreadLocked();
- mIsUpdateWebkitPrefsMessagePending = false;
+ if (mNativeAwSettings != 0) {
+ ((Runnable)msg.obj).run();
+ }
+ mSynchronizationPending = false;
mAwSettingsLock.notifyAll();
}
break;
};
}
- void maybeRunOnUiThreadBlocking(Runnable r) {
- if (mHandler != null) {
- ThreadUtils.runOnUiThreadBlocking(r);
- }
- }
-
- void maybePostOnUiThread(Runnable r) {
- if (mHandler != null) {
- mHandler.post(r);
- }
- }
-
- private void updateWebkitPreferencesLocked() {
+ void runOnUiThreadBlockingAndLocked(Runnable r) {
assert Thread.holdsLock(mAwSettingsLock);
- if (mNativeAwSettings == 0) return;
if (mHandler == null) return;
if (ThreadUtils.runningOnUiThread()) {
- updateWebkitPreferencesOnUiThreadLocked();
+ r.run();
} else {
- // We're being called on a background thread, so post a message.
- if (mIsUpdateWebkitPrefsMessagePending) {
- return;
- }
- mIsUpdateWebkitPrefsMessagePending = true;
- mHandler.sendMessage(Message.obtain(null, UPDATE_WEBKIT_PREFERENCES));
- // We must block until the settings have been sync'd to native to
- // ensure that they have taken effect.
+ assert !mSynchronizationPending;
+ mSynchronizationPending = true;
+ mHandler.sendMessage(Message.obtain(null, RUN_RUNNABLE_BLOCKING, r));
try {
- while (mIsUpdateWebkitPrefsMessagePending) {
+ while (mSynchronizationPending) {
mAwSettingsLock.wait();
}
} catch (InterruptedException e) {
- Log.e(TAG, "Interrupted waiting to sync settings to native", e);
+ Log.e(TAG, "Interrupted waiting a Runnable to complete", e);
+ mSynchronizationPending = false;
}
}
}
+
+ void maybePostOnUiThread(Runnable r) {
+ if (mHandler != null) {
+ mHandler.post(r);
+ }
+ }
+
+ void updateWebkitPreferencesLocked() {
+ runOnUiThreadBlockingAndLocked(new Runnable() {
+ @Override
+ public void run() {
+ updateWebkitPreferencesOnUiThreadLocked();
+ }
+ });
+ }
}
interface ZoomSupportChangeListener {
- public void onGestureZoomSupportChanged(boolean supportsGestureZoom);
+ public void onGestureZoomSupportChanged(
+ boolean supportsDoubleTapZoom, boolean supportsMultiTouchZoom);
}
public AwSettings(Context context,
mAllowFileAccessFromFileURLs = true;
}
+ mDefaultTextEncoding = AwResource.getDefaultTextEncoding();
mUserAgent = LazyDefaultUserAgent.sInstance;
// Best-guess a sensible initial value based on the features supported on the device.
// Respect the system setting for password echoing.
mPasswordEchoEnabled = Settings.System.getInt(context.getContentResolver(),
Settings.System.TEXT_SHOW_PASSWORD, 1) == 1;
- mFontScale = context.getResources().getConfiguration().fontScale;
- mTextSizePercent *= mFontScale;
+
+ // By default, scale the text size by the system font scale factor. Embedders
+ // may override this by invoking setTextZoom().
+ mTextSizePercent *= context.getResources().getConfiguration().fontScale;
mSupportLegacyQuirks = supportsLegacyQuirks;
}
@CalledByNative
private double getDIPScaleLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDIPScale;
}
mEventHandler.bindUiThread();
mNativeAwSettings = nativeInit(nativeWebContents);
nativeUpdateEverythingLocked(mNativeAwSettings);
- onGestureZoomSupportChanged(supportsGestureZoomLocked());
+ onGestureZoomSupportChanged(
+ supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
}
}
}
synchronized (mAwSettingsLock) {
if (mInitialPageScalePercent != scaleInPercent) {
mInitialPageScalePercent = scaleInPercent;
- mEventHandler.maybeRunOnUiThreadBlocking(new Runnable() {
+ mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
@Override
public void run() {
- if (mNativeAwSettings != 0) {
- nativeUpdateInitialPageScaleLocked(mNativeAwSettings);
- }
+ nativeUpdateInitialPageScaleLocked(mNativeAwSettings);
}
});
}
@CalledByNative
private float getInitialPageScalePercentLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mInitialPageScalePercent;
}
@CalledByNative
private boolean getSpatialNavigationLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mSpatialNavigationEnabled;
}
@CalledByNative
private boolean getEnableSupportedHardwareAcceleratedFeaturesLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mEnableSupportedHardwareAcceleratedFeatures;
}
synchronized (mAwSettingsLock) {
if (mAutoCompleteEnabled != enable) {
mAutoCompleteEnabled = enable;
- mEventHandler.maybeRunOnUiThreadBlocking(new Runnable() {
+ mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
@Override
public void run() {
- if (mNativeAwSettings != 0) {
- nativeUpdateFormDataPreferencesLocked(mNativeAwSettings);
- }
+ nativeUpdateFormDataPreferencesLocked(mNativeAwSettings);
}
});
}
@CalledByNative
private boolean getSaveFormDataLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mAutoCompleteEnabled;
}
mUserAgent = ua;
}
if (!oldUserAgent.equals(mUserAgent)) {
- mEventHandler.maybeRunOnUiThreadBlocking(new Runnable() {
+ mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
@Override
public void run() {
- if (mNativeAwSettings != 0) {
- nativeUpdateUserAgentLocked(mNativeAwSettings);
- }
+ nativeUpdateUserAgentLocked(mNativeAwSettings);
}
});
}
@CalledByNative
private String getUserAgentLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mUserAgent;
}
synchronized (mAwSettingsLock) {
if (mLoadWithOverviewMode != overview) {
mLoadWithOverviewMode = overview;
- mEventHandler.updateWebkitPreferencesLocked();
- mEventHandler.maybeRunOnUiThreadBlocking(new Runnable() {
+ mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
@Override
public void run() {
- if (mNativeAwSettings != 0) {
- nativeResetScrollAndScaleState(mNativeAwSettings);
- }
+ updateWebkitPreferencesOnUiThreadLocked();
+ nativeResetScrollAndScaleState(mNativeAwSettings);
}
});
}
@CalledByNative
private boolean getLoadWithOverviewModeLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mLoadWithOverviewMode;
}
*/
public void setTextZoom(final int textZoom) {
synchronized (mAwSettingsLock) {
- int scaledTextZoomPercent = (int)(textZoom * mFontScale);
- if (mTextSizePercent != scaledTextZoomPercent) {
- mTextSizePercent = scaledTextZoomPercent;
+ if (mTextSizePercent != textZoom) {
+ mTextSizePercent = textZoom;
mEventHandler.updateWebkitPreferencesLocked();
}
}
@CalledByNative
private int getTextSizePercentLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mTextSizePercent;
}
@CalledByNative
private String getStandardFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mStandardFontFamily;
}
@CalledByNative
private String getFixedFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mFixedFontFamily;
}
@CalledByNative
private String getSansSerifFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mSansSerifFontFamily;
}
@CalledByNative
private String getSerifFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mSerifFontFamily;
}
@CalledByNative
private String getCursiveFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mCursiveFontFamily;
}
@CalledByNative
private String getFantasyFontFamilyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mFantasyFontFamily;
}
@CalledByNative
private int getMinimumFontSizeLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mMinimumFontSize;
}
@CalledByNative
private int getMinimumLogicalFontSizeLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mMinimumLogicalFontSize;
}
@CalledByNative
private int getDefaultFontSizeLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDefaultFontSize;
}
@CalledByNative
private int getDefaultFixedFontSizeLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDefaultFixedFontSize;
}
@CalledByNative
private boolean getLoadsImagesAutomaticallyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mLoadsImagesAutomatically;
}
@CalledByNative
private boolean getImagesEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mImagesEnabled;
}
@CalledByNative
private boolean getJavaScriptEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mJavaScriptEnabled;
}
@CalledByNative
private boolean getAllowUniversalAccessFromFileURLsLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mAllowUniversalAccessFromFileURLs;
}
@CalledByNative
private boolean getAllowFileAccessFromFileURLsLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mAllowFileAccessFromFileURLs;
}
/**
* Return true if plugins are disabled.
* @return True if plugins are disabled.
- * @hide
*/
@CalledByNative
private boolean getPluginsDisabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mPluginState == PluginState.OFF;
}
@CalledByNative
private boolean getJavaScriptCanOpenWindowsAutomaticallyLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mJavaScriptCanOpenWindowsAutomatically;
}
* Gets whether Text Auto-sizing layout algorithm is enabled.
*
* @return true if Text Auto-sizing layout algorithm is enabled
- * @hide
*/
@CalledByNative
private boolean getTextAutosizingEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mLayoutAlgorithm == LayoutAlgorithm.TEXT_AUTOSIZING;
}
@CalledByNative
private boolean getSupportMultipleWindowsLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mSupportMultipleWindows;
}
@CalledByNative
private boolean getSupportLegacyQuirksLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mSupportLegacyQuirks;
}
synchronized (mAwSettingsLock) {
if (mUseWideViewport != use) {
mUseWideViewport = use;
+ onGestureZoomSupportChanged(
+ supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
mEventHandler.updateWebkitPreferencesLocked();
}
}
@CalledByNative
private boolean getUseWideViewportLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mUseWideViewport;
}
@CalledByNative
private boolean getPasswordEchoEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mPasswordEchoEnabled;
}
* Gets whether Application Cache is enabled.
*
* @return true if Application Cache is enabled
- * @hide
*/
@CalledByNative
private boolean getAppCacheEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
if (!mAppCacheEnabled) {
return false;
}
@CalledByNative
private boolean getDomStorageEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDomStorageEnabled;
}
@CalledByNative
private boolean getDatabaseEnabledLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDatabaseEnabled;
}
@CalledByNative
private String getDefaultTextEncodingLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDefaultTextEncoding;
}
@CalledByNative
private boolean getMediaPlaybackRequiresUserGestureLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mMediaPlaybackRequiresUserGesture;
}
@CalledByNative
private String getDefaultVideoPosterURLLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
return mDefaultVideoPosterURL;
}
- private void onGestureZoomSupportChanged(final boolean supportsGestureZoom) {
+ private void onGestureZoomSupportChanged(
+ final boolean supportsDoubleTapZoom, final boolean supportsMultiTouchZoom) {
// Always post asynchronously here, to avoid doubling back onto the caller.
mEventHandler.maybePostOnUiThread(new Runnable() {
@Override
public void run() {
synchronized (mAwSettingsLock) {
if (mZoomChangeListener != null) {
- mZoomChangeListener.onGestureZoomSupportChanged(supportsGestureZoom);
+ mZoomChangeListener.onGestureZoomSupportChanged(
+ supportsDoubleTapZoom, supportsMultiTouchZoom);
}
}
}
synchronized (mAwSettingsLock) {
if (mSupportZoom != support) {
mSupportZoom = support;
- onGestureZoomSupportChanged(supportsGestureZoomLocked());
+ onGestureZoomSupportChanged(
+ supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
}
}
}
synchronized (mAwSettingsLock) {
if (mBuiltInZoomControls != enabled) {
mBuiltInZoomControls = enabled;
- onGestureZoomSupportChanged(supportsGestureZoomLocked());
+ onGestureZoomSupportChanged(
+ supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
}
}
}
}
}
- private boolean supportsGestureZoomLocked() {
+ @CalledByNative
+ private boolean supportsDoubleTapZoomLocked() {
+ assert Thread.holdsLock(mAwSettingsLock);
+ return mSupportZoom && mBuiltInZoomControls && mUseWideViewport;
+ }
+
+ private boolean supportsMultiTouchZoomLocked() {
assert Thread.holdsLock(mAwSettingsLock);
return mSupportZoom && mBuiltInZoomControls;
}
- boolean supportsGestureZoom() {
+ boolean supportsMultiTouchZoom() {
synchronized (mAwSettingsLock) {
- return supportsGestureZoomLocked();
+ return supportsMultiTouchZoomLocked();
}
}
boolean shouldDisplayZoomControls() {
synchronized (mAwSettingsLock) {
- return supportsGestureZoomLocked() && mDisplayZoomControls;
+ return supportsMultiTouchZoomLocked() && mDisplayZoomControls;
}
}
}
}
- private void updateWebkitPreferencesOnUiThreadLocked() {
- if (mNativeAwSettings != 0) {
- assert mEventHandler.mHandler != null;
- ThreadUtils.assertOnUiThread();
- nativeUpdateWebkitPreferencesLocked(mNativeAwSettings);
+ @CalledByNative
+ private void populateWebPreferences(long webPrefsPtr) {
+ synchronized (mAwSettingsLock) {
+ nativePopulateWebPreferencesLocked(mNativeAwSettings, webPrefsPtr);
}
}
+ private void updateWebkitPreferencesOnUiThreadLocked() {
+ assert mEventHandler.mHandler != null;
+ ThreadUtils.assertOnUiThread();
+ nativeUpdateWebkitPreferencesLocked(mNativeAwSettings);
+ }
+
private native long nativeInit(long webContentsPtr);
private native void nativeDestroy(long nativeAwSettings);
+ private native void nativePopulateWebPreferencesLocked(long nativeAwSettings, long webPrefsPtr);
+
private native void nativeResetScrollAndScaleState(long nativeAwSettings);
private native void nativeUpdateEverythingLocked(long nativeAwSettings);