1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.android_webview;
7 import android.content.Context;
8 import android.content.pm.PackageManager;
9 import android.os.Handler;
10 import android.os.Message;
11 import android.os.Process;
12 import android.provider.Settings;
13 import android.util.Log;
14 import android.webkit.WebSettings;
15 import android.webkit.WebSettings.PluginState;
17 import org.chromium.base.CalledByNative;
18 import org.chromium.base.JNINamespace;
19 import org.chromium.base.ThreadUtils;
22 * Stores Android WebView specific settings that does not need to be synced to WebKit.
23 * Use {@link org.chromium.content.browser.ContentSettings} for WebKit settings.
25 * Methods in this class can be called from any thread, including threads created by
26 * the client of WebView.
28 @JNINamespace("android_webview")
29 public class AwSettings {
30 // This enum corresponds to WebSettings.LayoutAlgorithm. We use our own to be
32 public enum LayoutAlgorithm {
39 private static final String TAG = "AwSettings";
41 // This class must be created on the UI thread. Afterwards, it can be
42 // used from any thread. Internally, the class uses a message queue
43 // to call native code on the UI thread only.
45 // Values passed in on construction.
46 private final boolean mHasInternetPermission;
48 private ZoomSupportChangeListener mZoomChangeListener;
49 private double mDIPScale = 1.0;
51 // Lock to protect all settings.
52 private final Object mAwSettingsLock = new Object();
54 private LayoutAlgorithm mLayoutAlgorithm = LayoutAlgorithm.NARROW_COLUMNS;
55 private int mTextSizePercent = 100;
56 private String mStandardFontFamily = "sans-serif";
57 private String mFixedFontFamily = "monospace";
58 private String mSansSerifFontFamily = "sans-serif";
59 private String mSerifFontFamily = "serif";
60 private String mCursiveFontFamily = "cursive";
61 private String mFantasyFontFamily = "fantasy";
62 private String mDefaultTextEncoding;
63 private String mUserAgent;
64 private int mMinimumFontSize = 8;
65 private int mMinimumLogicalFontSize = 8;
66 private int mDefaultFontSize = 16;
67 private int mDefaultFixedFontSize = 13;
68 private boolean mLoadsImagesAutomatically = true;
69 private boolean mImagesEnabled = true;
70 private boolean mJavaScriptEnabled = false;
71 private boolean mAllowUniversalAccessFromFileURLs = false;
72 private boolean mAllowFileAccessFromFileURLs = false;
73 private boolean mJavaScriptCanOpenWindowsAutomatically = false;
74 private boolean mSupportMultipleWindows = false;
75 private PluginState mPluginState = PluginState.OFF;
76 private boolean mAppCacheEnabled = false;
77 private boolean mDomStorageEnabled = false;
78 private boolean mDatabaseEnabled = false;
79 private boolean mUseWideViewport = false;
80 private boolean mLoadWithOverviewMode = false;
81 private boolean mMediaPlaybackRequiresUserGesture = true;
82 private String mDefaultVideoPosterURL;
83 private float mInitialPageScalePercent = 0;
84 private boolean mSpatialNavigationEnabled; // Default depends on device features.
85 private boolean mEnableSupportedHardwareAcceleratedFeatures = false;
87 private final boolean mSupportLegacyQuirks;
89 private final boolean mPasswordEchoEnabled;
91 // Not accessed by the native side.
92 private boolean mBlockNetworkLoads; // Default depends on permission of embedding APK.
93 private boolean mAllowContentUrlAccess = true;
94 private boolean mAllowFileUrlAccess = true;
95 private int mCacheMode = WebSettings.LOAD_DEFAULT;
96 private boolean mShouldFocusFirstNode = true;
97 private boolean mGeolocationEnabled = true;
98 private boolean mAutoCompleteEnabled = true;
99 private boolean mSupportZoom = true;
100 private boolean mBuiltInZoomControls = false;
101 private boolean mDisplayZoomControls = true;
103 static class LazyDefaultUserAgent{
104 // Lazy Holder pattern
105 private static final String sInstance = nativeGetDefaultUserAgent();
108 // Protects access to settings global fields.
109 private static final Object sGlobalContentSettingsLock = new Object();
110 // For compatibility with the legacy WebView, we can only enable AppCache when the path is
111 // provided. However, we don't use the path, so we just check if we have received it from the
113 private static boolean sAppCachePathIsSet = false;
115 // The native side of this object. It's lifetime is bounded by the WebContent it is attached to.
116 private long mNativeAwSettings = 0;
118 // Custom handler that queues messages to call native code on the UI thread.
119 private final EventHandler mEventHandler;
121 private static final int MINIMUM_FONT_SIZE = 1;
122 private static final int MAXIMUM_FONT_SIZE = 72;
124 // Class to handle messages to be processed on the UI thread.
125 private class EventHandler {
126 // Message id for running a Runnable with mAwSettingsLock held.
127 private static final int RUN_RUNNABLE_BLOCKING = 0;
128 // Actual UI thread handler
129 private Handler mHandler;
130 // Synchronization flag.
131 private boolean mSynchronizationPending = false;
136 void bindUiThread() {
137 if (mHandler != null) return;
138 mHandler = new Handler(ThreadUtils.getUiThreadLooper()) {
140 public void handleMessage(Message msg) {
142 case RUN_RUNNABLE_BLOCKING:
143 synchronized (mAwSettingsLock) {
144 if (mNativeAwSettings != 0) {
145 ((Runnable)msg.obj).run();
147 mSynchronizationPending = false;
148 mAwSettingsLock.notifyAll();
156 void runOnUiThreadBlockingAndLocked(Runnable r) {
157 assert Thread.holdsLock(mAwSettingsLock);
158 if (mHandler == null) return;
159 if (ThreadUtils.runningOnUiThread()) {
162 assert !mSynchronizationPending;
163 mSynchronizationPending = true;
164 mHandler.sendMessage(Message.obtain(null, RUN_RUNNABLE_BLOCKING, r));
166 while (mSynchronizationPending) {
167 mAwSettingsLock.wait();
169 } catch (InterruptedException e) {
170 Log.e(TAG, "Interrupted waiting a Runnable to complete", e);
171 mSynchronizationPending = false;
176 void maybePostOnUiThread(Runnable r) {
177 if (mHandler != null) {
182 void updateWebkitPreferencesLocked() {
183 runOnUiThreadBlockingAndLocked(new Runnable() {
186 updateWebkitPreferencesOnUiThreadLocked();
192 interface ZoomSupportChangeListener {
193 public void onGestureZoomSupportChanged(
194 boolean supportsDoubleTapZoom, boolean supportsMultiTouchZoom);
197 public AwSettings(Context context,
198 boolean isAccessFromFileURLsGrantedByDefault,
199 boolean supportsLegacyQuirks) {
200 boolean hasInternetPermission = context.checkPermission(
201 android.Manifest.permission.INTERNET,
203 Process.myUid()) == PackageManager.PERMISSION_GRANTED;
204 synchronized (mAwSettingsLock) {
205 mHasInternetPermission = hasInternetPermission;
206 mBlockNetworkLoads = !hasInternetPermission;
207 mEventHandler = new EventHandler();
208 if (isAccessFromFileURLsGrantedByDefault) {
209 mAllowUniversalAccessFromFileURLs = true;
210 mAllowFileAccessFromFileURLs = true;
213 mDefaultTextEncoding = AwResource.getDefaultTextEncoding();
214 mUserAgent = LazyDefaultUserAgent.sInstance;
216 // Best-guess a sensible initial value based on the features supported on the device.
217 mSpatialNavigationEnabled = !context.getPackageManager().hasSystemFeature(
218 PackageManager.FEATURE_TOUCHSCREEN);
220 // Respect the system setting for password echoing.
221 mPasswordEchoEnabled = Settings.System.getInt(context.getContentResolver(),
222 Settings.System.TEXT_SHOW_PASSWORD, 1) == 1;
224 // By default, scale the text size by the system font scale factor. Embedders
225 // may override this by invoking setTextZoom().
226 mTextSizePercent *= context.getResources().getConfiguration().fontScale;
228 mSupportLegacyQuirks = supportsLegacyQuirks;
230 // Defer initializing the native side until a native WebContents instance is set.
234 private void nativeAwSettingsGone(long nativeAwSettings) {
235 assert mNativeAwSettings != 0 && mNativeAwSettings == nativeAwSettings;
236 mNativeAwSettings = 0;
240 private double getDIPScaleLocked() {
241 assert Thread.holdsLock(mAwSettingsLock);
245 void setDIPScale(double dipScale) {
246 synchronized (mAwSettingsLock) {
247 mDIPScale = dipScale;
248 // TODO(joth): This should also be synced over to native side, but right now
249 // the setDIPScale call is always followed by a setWebContents() which covers this.
253 void setZoomListener(ZoomSupportChangeListener zoomChangeListener) {
254 synchronized (mAwSettingsLock) {
255 mZoomChangeListener = zoomChangeListener;
259 void setWebContents(int nativeWebContents) {
260 synchronized (mAwSettingsLock) {
261 if (mNativeAwSettings != 0) {
262 nativeDestroy(mNativeAwSettings);
263 assert mNativeAwSettings == 0; // nativeAwSettingsGone should have been called.
265 if (nativeWebContents != 0) {
266 mEventHandler.bindUiThread();
267 mNativeAwSettings = nativeInit(nativeWebContents);
268 nativeUpdateEverythingLocked(mNativeAwSettings);
269 onGestureZoomSupportChanged(
270 supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
276 * See {@link android.webkit.WebSettings#setBlockNetworkLoads}.
278 public void setBlockNetworkLoads(boolean flag) {
279 synchronized (mAwSettingsLock) {
280 if (!flag && !mHasInternetPermission) {
281 throw new SecurityException("Permission denied - " +
282 "application missing INTERNET permission");
284 mBlockNetworkLoads = flag;
289 * See {@link android.webkit.WebSettings#getBlockNetworkLoads}.
291 public boolean getBlockNetworkLoads() {
292 synchronized (mAwSettingsLock) {
293 return mBlockNetworkLoads;
298 * See {@link android.webkit.WebSettings#setAllowFileAccess}.
300 public void setAllowFileAccess(boolean allow) {
301 synchronized (mAwSettingsLock) {
302 if (mAllowFileUrlAccess != allow) {
303 mAllowFileUrlAccess = allow;
309 * See {@link android.webkit.WebSettings#getAllowFileAccess}.
311 public boolean getAllowFileAccess() {
312 synchronized (mAwSettingsLock) {
313 return mAllowFileUrlAccess;
318 * See {@link android.webkit.WebSettings#setAllowContentAccess}.
320 public void setAllowContentAccess(boolean allow) {
321 synchronized (mAwSettingsLock) {
322 if (mAllowContentUrlAccess != allow) {
323 mAllowContentUrlAccess = allow;
329 * See {@link android.webkit.WebSettings#getAllowContentAccess}.
331 public boolean getAllowContentAccess() {
332 synchronized (mAwSettingsLock) {
333 return mAllowContentUrlAccess;
338 * See {@link android.webkit.WebSettings#setCacheMode}.
340 public void setCacheMode(int mode) {
341 synchronized (mAwSettingsLock) {
342 if (mCacheMode != mode) {
349 * See {@link android.webkit.WebSettings#getCacheMode}.
351 public int getCacheMode() {
352 synchronized (mAwSettingsLock) {
358 * See {@link android.webkit.WebSettings#setNeedInitialFocus}.
360 public void setShouldFocusFirstNode(boolean flag) {
361 synchronized (mAwSettingsLock) {
362 mShouldFocusFirstNode = flag;
367 * See {@link android.webkit.WebView#setInitialScale}.
369 public void setInitialPageScale(final float scaleInPercent) {
370 synchronized (mAwSettingsLock) {
371 if (mInitialPageScalePercent != scaleInPercent) {
372 mInitialPageScalePercent = scaleInPercent;
373 mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
376 nativeUpdateInitialPageScaleLocked(mNativeAwSettings);
384 private float getInitialPageScalePercentLocked() {
385 assert Thread.holdsLock(mAwSettingsLock);
386 return mInitialPageScalePercent;
389 void setSpatialNavigationEnabled(boolean enable) {
390 synchronized (mAwSettingsLock) {
391 if (mSpatialNavigationEnabled != enable) {
392 mSpatialNavigationEnabled = enable;
393 mEventHandler.updateWebkitPreferencesLocked();
399 private boolean getSpatialNavigationLocked() {
400 assert Thread.holdsLock(mAwSettingsLock);
401 return mSpatialNavigationEnabled;
404 void setEnableSupportedHardwareAcceleratedFeatures(boolean enable) {
405 synchronized (mAwSettingsLock) {
406 if (mEnableSupportedHardwareAcceleratedFeatures != enable) {
407 mEnableSupportedHardwareAcceleratedFeatures = enable;
408 mEventHandler.updateWebkitPreferencesLocked();
414 private boolean getEnableSupportedHardwareAcceleratedFeaturesLocked() {
415 assert Thread.holdsLock(mAwSettingsLock);
416 return mEnableSupportedHardwareAcceleratedFeatures;
420 * See {@link android.webkit.WebSettings#setNeedInitialFocus}.
422 public boolean shouldFocusFirstNode() {
423 synchronized (mAwSettingsLock) {
424 return mShouldFocusFirstNode;
429 * See {@link android.webkit.WebSettings#setGeolocationEnabled}.
431 public void setGeolocationEnabled(boolean flag) {
432 synchronized (mAwSettingsLock) {
433 if (mGeolocationEnabled != flag) {
434 mGeolocationEnabled = flag;
440 * @return Returns if geolocation is currently enabled.
442 boolean getGeolocationEnabled() {
443 synchronized (mAwSettingsLock) {
444 return mGeolocationEnabled;
449 * See {@link android.webkit.WebSettings#setSaveFormData}.
451 public void setSaveFormData(final boolean enable) {
452 synchronized (mAwSettingsLock) {
453 if (mAutoCompleteEnabled != enable) {
454 mAutoCompleteEnabled = enable;
455 mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
458 nativeUpdateFormDataPreferencesLocked(mNativeAwSettings);
466 * See {@link android.webkit.WebSettings#getSaveFormData}.
468 public boolean getSaveFormData() {
469 synchronized (mAwSettingsLock) {
470 return getSaveFormDataLocked();
475 private boolean getSaveFormDataLocked() {
476 assert Thread.holdsLock(mAwSettingsLock);
477 return mAutoCompleteEnabled;
481 * @returns the default User-Agent used by each ContentViewCore instance, i.e. unless
482 * overridden by {@link #setUserAgentString()}
484 public static String getDefaultUserAgent() {
485 return LazyDefaultUserAgent.sInstance;
489 * See {@link android.webkit.WebSettings#setUserAgentString}.
491 public void setUserAgentString(String ua) {
492 synchronized (mAwSettingsLock) {
493 final String oldUserAgent = mUserAgent;
494 if (ua == null || ua.length() == 0) {
495 mUserAgent = LazyDefaultUserAgent.sInstance;
499 if (!oldUserAgent.equals(mUserAgent)) {
500 mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
503 nativeUpdateUserAgentLocked(mNativeAwSettings);
511 * See {@link android.webkit.WebSettings#getUserAgentString}.
513 public String getUserAgentString() {
514 synchronized (mAwSettingsLock) {
520 private String getUserAgentLocked() {
521 assert Thread.holdsLock(mAwSettingsLock);
526 * See {@link android.webkit.WebSettings#setLoadWithOverviewMode}.
528 public void setLoadWithOverviewMode(boolean overview) {
529 synchronized (mAwSettingsLock) {
530 if (mLoadWithOverviewMode != overview) {
531 mLoadWithOverviewMode = overview;
532 mEventHandler.runOnUiThreadBlockingAndLocked(new Runnable() {
535 updateWebkitPreferencesOnUiThreadLocked();
536 nativeResetScrollAndScaleState(mNativeAwSettings);
544 * See {@link android.webkit.WebSettings#getLoadWithOverviewMode}.
546 public boolean getLoadWithOverviewMode() {
547 synchronized (mAwSettingsLock) {
548 return mLoadWithOverviewMode;
553 private boolean getLoadWithOverviewModeLocked() {
554 assert Thread.holdsLock(mAwSettingsLock);
555 return mLoadWithOverviewMode;
559 * See {@link android.webkit.WebSettings#setTextZoom}.
561 public void setTextZoom(final int textZoom) {
562 synchronized (mAwSettingsLock) {
563 if (mTextSizePercent != textZoom) {
564 mTextSizePercent = textZoom;
565 mEventHandler.updateWebkitPreferencesLocked();
571 * See {@link android.webkit.WebSettings#getTextZoom}.
573 public int getTextZoom() {
574 synchronized (mAwSettingsLock) {
575 return mTextSizePercent;
580 private int getTextSizePercentLocked() {
581 assert Thread.holdsLock(mAwSettingsLock);
582 return mTextSizePercent;
586 * See {@link android.webkit.WebSettings#setStandardFontFamily}.
588 public void setStandardFontFamily(String font) {
589 synchronized (mAwSettingsLock) {
590 if (font != null && !mStandardFontFamily.equals(font)) {
591 mStandardFontFamily = font;
592 mEventHandler.updateWebkitPreferencesLocked();
598 * See {@link android.webkit.WebSettings#getStandardFontFamily}.
600 public String getStandardFontFamily() {
601 synchronized (mAwSettingsLock) {
602 return mStandardFontFamily;
607 private String getStandardFontFamilyLocked() {
608 assert Thread.holdsLock(mAwSettingsLock);
609 return mStandardFontFamily;
613 * See {@link android.webkit.WebSettings#setFixedFontFamily}.
615 public void setFixedFontFamily(String font) {
616 synchronized (mAwSettingsLock) {
617 if (font != null && !mFixedFontFamily.equals(font)) {
618 mFixedFontFamily = font;
619 mEventHandler.updateWebkitPreferencesLocked();
625 * See {@link android.webkit.WebSettings#getFixedFontFamily}.
627 public String getFixedFontFamily() {
628 synchronized (mAwSettingsLock) {
629 return mFixedFontFamily;
634 private String getFixedFontFamilyLocked() {
635 assert Thread.holdsLock(mAwSettingsLock);
636 return mFixedFontFamily;
640 * See {@link android.webkit.WebSettings#setSansSerifFontFamily}.
642 public void setSansSerifFontFamily(String font) {
643 synchronized (mAwSettingsLock) {
644 if (font != null && !mSansSerifFontFamily.equals(font)) {
645 mSansSerifFontFamily = font;
646 mEventHandler.updateWebkitPreferencesLocked();
652 * See {@link android.webkit.WebSettings#getSansSerifFontFamily}.
654 public String getSansSerifFontFamily() {
655 synchronized (mAwSettingsLock) {
656 return mSansSerifFontFamily;
661 private String getSansSerifFontFamilyLocked() {
662 assert Thread.holdsLock(mAwSettingsLock);
663 return mSansSerifFontFamily;
667 * See {@link android.webkit.WebSettings#setSerifFontFamily}.
669 public void setSerifFontFamily(String font) {
670 synchronized (mAwSettingsLock) {
671 if (font != null && !mSerifFontFamily.equals(font)) {
672 mSerifFontFamily = font;
673 mEventHandler.updateWebkitPreferencesLocked();
679 * See {@link android.webkit.WebSettings#getSerifFontFamily}.
681 public String getSerifFontFamily() {
682 synchronized (mAwSettingsLock) {
683 return mSerifFontFamily;
688 private String getSerifFontFamilyLocked() {
689 assert Thread.holdsLock(mAwSettingsLock);
690 return mSerifFontFamily;
694 * See {@link android.webkit.WebSettings#setCursiveFontFamily}.
696 public void setCursiveFontFamily(String font) {
697 synchronized (mAwSettingsLock) {
698 if (font != null && !mCursiveFontFamily.equals(font)) {
699 mCursiveFontFamily = font;
700 mEventHandler.updateWebkitPreferencesLocked();
706 * See {@link android.webkit.WebSettings#getCursiveFontFamily}.
708 public String getCursiveFontFamily() {
709 synchronized (mAwSettingsLock) {
710 return mCursiveFontFamily;
715 private String getCursiveFontFamilyLocked() {
716 assert Thread.holdsLock(mAwSettingsLock);
717 return mCursiveFontFamily;
721 * See {@link android.webkit.WebSettings#setFantasyFontFamily}.
723 public void setFantasyFontFamily(String font) {
724 synchronized (mAwSettingsLock) {
725 if (font != null && !mFantasyFontFamily.equals(font)) {
726 mFantasyFontFamily = font;
727 mEventHandler.updateWebkitPreferencesLocked();
733 * See {@link android.webkit.WebSettings#getFantasyFontFamily}.
735 public String getFantasyFontFamily() {
736 synchronized (mAwSettingsLock) {
737 return mFantasyFontFamily;
742 private String getFantasyFontFamilyLocked() {
743 assert Thread.holdsLock(mAwSettingsLock);
744 return mFantasyFontFamily;
748 * See {@link android.webkit.WebSettings#setMinimumFontSize}.
750 public void setMinimumFontSize(int size) {
751 synchronized (mAwSettingsLock) {
752 size = clipFontSize(size);
753 if (mMinimumFontSize != size) {
754 mMinimumFontSize = size;
755 mEventHandler.updateWebkitPreferencesLocked();
761 * See {@link android.webkit.WebSettings#getMinimumFontSize}.
763 public int getMinimumFontSize() {
764 synchronized (mAwSettingsLock) {
765 return mMinimumFontSize;
770 private int getMinimumFontSizeLocked() {
771 assert Thread.holdsLock(mAwSettingsLock);
772 return mMinimumFontSize;
776 * See {@link android.webkit.WebSettings#setMinimumLogicalFontSize}.
778 public void setMinimumLogicalFontSize(int size) {
779 synchronized (mAwSettingsLock) {
780 size = clipFontSize(size);
781 if (mMinimumLogicalFontSize != size) {
782 mMinimumLogicalFontSize = size;
783 mEventHandler.updateWebkitPreferencesLocked();
789 * See {@link android.webkit.WebSettings#getMinimumLogicalFontSize}.
791 public int getMinimumLogicalFontSize() {
792 synchronized (mAwSettingsLock) {
793 return mMinimumLogicalFontSize;
798 private int getMinimumLogicalFontSizeLocked() {
799 assert Thread.holdsLock(mAwSettingsLock);
800 return mMinimumLogicalFontSize;
804 * See {@link android.webkit.WebSettings#setDefaultFontSize}.
806 public void setDefaultFontSize(int size) {
807 synchronized (mAwSettingsLock) {
808 size = clipFontSize(size);
809 if (mDefaultFontSize != size) {
810 mDefaultFontSize = size;
811 mEventHandler.updateWebkitPreferencesLocked();
817 * See {@link android.webkit.WebSettings#getDefaultFontSize}.
819 public int getDefaultFontSize() {
820 synchronized (mAwSettingsLock) {
821 return mDefaultFontSize;
826 private int getDefaultFontSizeLocked() {
827 assert Thread.holdsLock(mAwSettingsLock);
828 return mDefaultFontSize;
832 * See {@link android.webkit.WebSettings#setDefaultFixedFontSize}.
834 public void setDefaultFixedFontSize(int size) {
835 synchronized (mAwSettingsLock) {
836 size = clipFontSize(size);
837 if (mDefaultFixedFontSize != size) {
838 mDefaultFixedFontSize = size;
839 mEventHandler.updateWebkitPreferencesLocked();
845 * See {@link android.webkit.WebSettings#getDefaultFixedFontSize}.
847 public int getDefaultFixedFontSize() {
848 synchronized (mAwSettingsLock) {
849 return mDefaultFixedFontSize;
854 private int getDefaultFixedFontSizeLocked() {
855 assert Thread.holdsLock(mAwSettingsLock);
856 return mDefaultFixedFontSize;
860 * See {@link android.webkit.WebSettings#setJavaScriptEnabled}.
862 public void setJavaScriptEnabled(boolean flag) {
863 synchronized (mAwSettingsLock) {
864 if (mJavaScriptEnabled != flag) {
865 mJavaScriptEnabled = flag;
866 mEventHandler.updateWebkitPreferencesLocked();
872 * See {@link android.webkit.WebSettings#setAllowUniversalAccessFromFileURLs}.
874 public void setAllowUniversalAccessFromFileURLs(boolean flag) {
875 synchronized (mAwSettingsLock) {
876 if (mAllowUniversalAccessFromFileURLs != flag) {
877 mAllowUniversalAccessFromFileURLs = flag;
878 mEventHandler.updateWebkitPreferencesLocked();
884 * See {@link android.webkit.WebSettings#setAllowFileAccessFromFileURLs}.
886 public void setAllowFileAccessFromFileURLs(boolean flag) {
887 synchronized (mAwSettingsLock) {
888 if (mAllowFileAccessFromFileURLs != flag) {
889 mAllowFileAccessFromFileURLs = flag;
890 mEventHandler.updateWebkitPreferencesLocked();
896 * See {@link android.webkit.WebSettings#setLoadsImagesAutomatically}.
898 public void setLoadsImagesAutomatically(boolean flag) {
899 synchronized (mAwSettingsLock) {
900 if (mLoadsImagesAutomatically != flag) {
901 mLoadsImagesAutomatically = flag;
902 mEventHandler.updateWebkitPreferencesLocked();
908 * See {@link android.webkit.WebSettings#getLoadsImagesAutomatically}.
910 public boolean getLoadsImagesAutomatically() {
911 synchronized (mAwSettingsLock) {
912 return mLoadsImagesAutomatically;
917 private boolean getLoadsImagesAutomaticallyLocked() {
918 assert Thread.holdsLock(mAwSettingsLock);
919 return mLoadsImagesAutomatically;
923 * See {@link android.webkit.WebSettings#setImagesEnabled}.
925 public void setImagesEnabled(boolean flag) {
926 synchronized (mAwSettingsLock) {
927 if (mImagesEnabled != flag) {
928 mImagesEnabled = flag;
929 mEventHandler.updateWebkitPreferencesLocked();
935 * See {@link android.webkit.WebSettings#getImagesEnabled}.
937 public boolean getImagesEnabled() {
938 synchronized (mAwSettingsLock) {
939 return mImagesEnabled;
944 private boolean getImagesEnabledLocked() {
945 assert Thread.holdsLock(mAwSettingsLock);
946 return mImagesEnabled;
950 * See {@link android.webkit.WebSettings#getJavaScriptEnabled}.
952 public boolean getJavaScriptEnabled() {
953 synchronized (mAwSettingsLock) {
954 return mJavaScriptEnabled;
959 private boolean getJavaScriptEnabledLocked() {
960 assert Thread.holdsLock(mAwSettingsLock);
961 return mJavaScriptEnabled;
965 * See {@link android.webkit.WebSettings#getAllowUniversalAccessFromFileURLs}.
967 public boolean getAllowUniversalAccessFromFileURLs() {
968 synchronized (mAwSettingsLock) {
969 return mAllowUniversalAccessFromFileURLs;
974 private boolean getAllowUniversalAccessFromFileURLsLocked() {
975 assert Thread.holdsLock(mAwSettingsLock);
976 return mAllowUniversalAccessFromFileURLs;
980 * See {@link android.webkit.WebSettings#getAllowFileAccessFromFileURLs}.
982 public boolean getAllowFileAccessFromFileURLs() {
983 synchronized (mAwSettingsLock) {
984 return mAllowFileAccessFromFileURLs;
989 private boolean getAllowFileAccessFromFileURLsLocked() {
990 assert Thread.holdsLock(mAwSettingsLock);
991 return mAllowFileAccessFromFileURLs;
995 * See {@link android.webkit.WebSettings#setPluginsEnabled}.
997 public void setPluginsEnabled(boolean flag) {
998 setPluginState(flag ? PluginState.ON : PluginState.OFF);
1002 * See {@link android.webkit.WebSettings#setPluginState}.
1004 public void setPluginState(PluginState state) {
1005 synchronized (mAwSettingsLock) {
1006 if (mPluginState != state) {
1007 mPluginState = state;
1008 mEventHandler.updateWebkitPreferencesLocked();
1014 * See {@link android.webkit.WebSettings#getPluginsEnabled}.
1016 public boolean getPluginsEnabled() {
1017 synchronized (mAwSettingsLock) {
1018 return mPluginState == PluginState.ON;
1023 * Return true if plugins are disabled.
1024 * @return True if plugins are disabled.
1027 private boolean getPluginsDisabledLocked() {
1028 assert Thread.holdsLock(mAwSettingsLock);
1029 return mPluginState == PluginState.OFF;
1033 * See {@link android.webkit.WebSettings#getPluginState}.
1035 public PluginState getPluginState() {
1036 synchronized (mAwSettingsLock) {
1037 return mPluginState;
1043 * See {@link android.webkit.WebSettings#setJavaScriptCanOpenWindowsAutomatically}.
1045 public void setJavaScriptCanOpenWindowsAutomatically(boolean flag) {
1046 synchronized (mAwSettingsLock) {
1047 if (mJavaScriptCanOpenWindowsAutomatically != flag) {
1048 mJavaScriptCanOpenWindowsAutomatically = flag;
1049 mEventHandler.updateWebkitPreferencesLocked();
1055 * See {@link android.webkit.WebSettings#getJavaScriptCanOpenWindowsAutomatically}.
1057 public boolean getJavaScriptCanOpenWindowsAutomatically() {
1058 synchronized (mAwSettingsLock) {
1059 return mJavaScriptCanOpenWindowsAutomatically;
1064 private boolean getJavaScriptCanOpenWindowsAutomaticallyLocked() {
1065 assert Thread.holdsLock(mAwSettingsLock);
1066 return mJavaScriptCanOpenWindowsAutomatically;
1070 * See {@link android.webkit.WebSettings#setLayoutAlgorithm}.
1072 public void setLayoutAlgorithm(LayoutAlgorithm l) {
1073 synchronized (mAwSettingsLock) {
1074 if (mLayoutAlgorithm != l) {
1075 mLayoutAlgorithm = l;
1076 mEventHandler.updateWebkitPreferencesLocked();
1082 * See {@link android.webkit.WebSettings#getLayoutAlgorithm}.
1084 public LayoutAlgorithm getLayoutAlgorithm() {
1085 synchronized (mAwSettingsLock) {
1086 return mLayoutAlgorithm;
1091 * Gets whether Text Auto-sizing layout algorithm is enabled.
1093 * @return true if Text Auto-sizing layout algorithm is enabled
1096 private boolean getTextAutosizingEnabledLocked() {
1097 assert Thread.holdsLock(mAwSettingsLock);
1098 return mLayoutAlgorithm == LayoutAlgorithm.TEXT_AUTOSIZING;
1102 * See {@link android.webkit.WebSettings#setSupportMultipleWindows}.
1104 public void setSupportMultipleWindows(boolean support) {
1105 synchronized (mAwSettingsLock) {
1106 if (mSupportMultipleWindows != support) {
1107 mSupportMultipleWindows = support;
1108 mEventHandler.updateWebkitPreferencesLocked();
1114 * See {@link android.webkit.WebSettings#supportMultipleWindows}.
1116 public boolean supportMultipleWindows() {
1117 synchronized (mAwSettingsLock) {
1118 return mSupportMultipleWindows;
1123 private boolean getSupportMultipleWindowsLocked() {
1124 assert Thread.holdsLock(mAwSettingsLock);
1125 return mSupportMultipleWindows;
1129 private boolean getSupportLegacyQuirksLocked() {
1130 assert Thread.holdsLock(mAwSettingsLock);
1131 return mSupportLegacyQuirks;
1135 * See {@link android.webkit.WebSettings#setUseWideViewPort}.
1137 public void setUseWideViewPort(boolean use) {
1138 synchronized (mAwSettingsLock) {
1139 if (mUseWideViewport != use) {
1140 mUseWideViewport = use;
1141 onGestureZoomSupportChanged(
1142 supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
1143 mEventHandler.updateWebkitPreferencesLocked();
1149 * See {@link android.webkit.WebSettings#getUseWideViewPort}.
1151 public boolean getUseWideViewPort() {
1152 synchronized (mAwSettingsLock) {
1153 return mUseWideViewport;
1158 private boolean getUseWideViewportLocked() {
1159 assert Thread.holdsLock(mAwSettingsLock);
1160 return mUseWideViewport;
1164 private boolean getPasswordEchoEnabledLocked() {
1165 assert Thread.holdsLock(mAwSettingsLock);
1166 return mPasswordEchoEnabled;
1170 * See {@link android.webkit.WebSettings#setAppCacheEnabled}.
1172 public void setAppCacheEnabled(boolean flag) {
1173 synchronized (mAwSettingsLock) {
1174 if (mAppCacheEnabled != flag) {
1175 mAppCacheEnabled = flag;
1176 mEventHandler.updateWebkitPreferencesLocked();
1182 * See {@link android.webkit.WebSettings#setAppCachePath}.
1184 public void setAppCachePath(String path) {
1185 boolean needToSync = false;
1186 synchronized (sGlobalContentSettingsLock) {
1187 // AppCachePath can only be set once.
1188 if (!sAppCachePathIsSet && path != null && !path.isEmpty()) {
1189 sAppCachePathIsSet = true;
1193 // The obvious problem here is that other WebViews will not be updated,
1194 // until they execute synchronization from Java to the native side.
1195 // But this is the same behaviour as it was in the legacy WebView.
1197 synchronized (mAwSettingsLock) {
1198 mEventHandler.updateWebkitPreferencesLocked();
1204 * Gets whether Application Cache is enabled.
1206 * @return true if Application Cache is enabled
1209 private boolean getAppCacheEnabledLocked() {
1210 assert Thread.holdsLock(mAwSettingsLock);
1211 if (!mAppCacheEnabled) {
1214 synchronized (sGlobalContentSettingsLock) {
1215 return sAppCachePathIsSet;
1220 * See {@link android.webkit.WebSettings#setDomStorageEnabled}.
1222 public void setDomStorageEnabled(boolean flag) {
1223 synchronized (mAwSettingsLock) {
1224 if (mDomStorageEnabled != flag) {
1225 mDomStorageEnabled = flag;
1226 mEventHandler.updateWebkitPreferencesLocked();
1232 * See {@link android.webkit.WebSettings#getDomStorageEnabled}.
1234 public boolean getDomStorageEnabled() {
1235 synchronized (mAwSettingsLock) {
1236 return mDomStorageEnabled;
1241 private boolean getDomStorageEnabledLocked() {
1242 assert Thread.holdsLock(mAwSettingsLock);
1243 return mDomStorageEnabled;
1247 * See {@link android.webkit.WebSettings#setDatabaseEnabled}.
1249 public void setDatabaseEnabled(boolean flag) {
1250 synchronized (mAwSettingsLock) {
1251 if (mDatabaseEnabled != flag) {
1252 mDatabaseEnabled = flag;
1253 mEventHandler.updateWebkitPreferencesLocked();
1259 * See {@link android.webkit.WebSettings#getDatabaseEnabled}.
1261 public boolean getDatabaseEnabled() {
1262 synchronized (mAwSettingsLock) {
1263 return mDatabaseEnabled;
1268 private boolean getDatabaseEnabledLocked() {
1269 assert Thread.holdsLock(mAwSettingsLock);
1270 return mDatabaseEnabled;
1274 * See {@link android.webkit.WebSettings#setDefaultTextEncodingName}.
1276 public void setDefaultTextEncodingName(String encoding) {
1277 synchronized (mAwSettingsLock) {
1278 if (encoding != null && !mDefaultTextEncoding.equals(encoding)) {
1279 mDefaultTextEncoding = encoding;
1280 mEventHandler.updateWebkitPreferencesLocked();
1286 * See {@link android.webkit.WebSettings#getDefaultTextEncodingName}.
1288 public String getDefaultTextEncodingName() {
1289 synchronized (mAwSettingsLock) {
1290 return mDefaultTextEncoding;
1295 private String getDefaultTextEncodingLocked() {
1296 assert Thread.holdsLock(mAwSettingsLock);
1297 return mDefaultTextEncoding;
1301 * See {@link android.webkit.WebSettings#setMediaPlaybackRequiresUserGesture}.
1303 public void setMediaPlaybackRequiresUserGesture(boolean require) {
1304 synchronized (mAwSettingsLock) {
1305 if (mMediaPlaybackRequiresUserGesture != require) {
1306 mMediaPlaybackRequiresUserGesture = require;
1307 mEventHandler.updateWebkitPreferencesLocked();
1313 * See {@link android.webkit.WebSettings#getMediaPlaybackRequiresUserGesture}.
1315 public boolean getMediaPlaybackRequiresUserGesture() {
1316 synchronized (mAwSettingsLock) {
1317 return mMediaPlaybackRequiresUserGesture;
1322 private boolean getMediaPlaybackRequiresUserGestureLocked() {
1323 assert Thread.holdsLock(mAwSettingsLock);
1324 return mMediaPlaybackRequiresUserGesture;
1328 * See {@link android.webkit.WebSettings#setDefaultVideoPosterURL}.
1330 public void setDefaultVideoPosterURL(String url) {
1331 synchronized (mAwSettingsLock) {
1332 if (mDefaultVideoPosterURL != null && !mDefaultVideoPosterURL.equals(url) ||
1333 mDefaultVideoPosterURL == null && url != null) {
1334 mDefaultVideoPosterURL = url;
1335 mEventHandler.updateWebkitPreferencesLocked();
1341 * See {@link android.webkit.WebSettings#getDefaultVideoPosterURL}.
1343 public String getDefaultVideoPosterURL() {
1344 synchronized (mAwSettingsLock) {
1345 return mDefaultVideoPosterURL;
1350 private String getDefaultVideoPosterURLLocked() {
1351 assert Thread.holdsLock(mAwSettingsLock);
1352 return mDefaultVideoPosterURL;
1355 private void onGestureZoomSupportChanged(
1356 final boolean supportsDoubleTapZoom, final boolean supportsMultiTouchZoom) {
1357 // Always post asynchronously here, to avoid doubling back onto the caller.
1358 mEventHandler.maybePostOnUiThread(new Runnable() {
1361 synchronized (mAwSettingsLock) {
1362 if (mZoomChangeListener != null) {
1363 mZoomChangeListener.onGestureZoomSupportChanged(
1364 supportsDoubleTapZoom, supportsMultiTouchZoom);
1372 * See {@link android.webkit.WebSettings#setSupportZoom}.
1374 public void setSupportZoom(boolean support) {
1375 synchronized (mAwSettingsLock) {
1376 if (mSupportZoom != support) {
1377 mSupportZoom = support;
1378 onGestureZoomSupportChanged(
1379 supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
1385 * See {@link android.webkit.WebSettings#supportZoom}.
1387 public boolean supportZoom() {
1388 synchronized (mAwSettingsLock) {
1389 return mSupportZoom;
1394 * See {@link android.webkit.WebSettings#setBuiltInZoomControls}.
1396 public void setBuiltInZoomControls(boolean enabled) {
1397 synchronized (mAwSettingsLock) {
1398 if (mBuiltInZoomControls != enabled) {
1399 mBuiltInZoomControls = enabled;
1400 onGestureZoomSupportChanged(
1401 supportsDoubleTapZoomLocked(), supportsMultiTouchZoomLocked());
1407 * See {@link android.webkit.WebSettings#getBuiltInZoomControls}.
1409 public boolean getBuiltInZoomControls() {
1410 synchronized (mAwSettingsLock) {
1411 return mBuiltInZoomControls;
1416 * See {@link android.webkit.WebSettings#setDisplayZoomControls}.
1418 public void setDisplayZoomControls(boolean enabled) {
1419 synchronized (mAwSettingsLock) {
1420 mDisplayZoomControls = enabled;
1425 * See {@link android.webkit.WebSettings#getDisplayZoomControls}.
1427 public boolean getDisplayZoomControls() {
1428 synchronized (mAwSettingsLock) {
1429 return mDisplayZoomControls;
1434 private boolean supportsDoubleTapZoomLocked() {
1435 assert Thread.holdsLock(mAwSettingsLock);
1436 return mSupportZoom && mBuiltInZoomControls && mUseWideViewport;
1439 private boolean supportsMultiTouchZoomLocked() {
1440 assert Thread.holdsLock(mAwSettingsLock);
1441 return mSupportZoom && mBuiltInZoomControls;
1444 boolean supportsMultiTouchZoom() {
1445 synchronized (mAwSettingsLock) {
1446 return supportsMultiTouchZoomLocked();
1450 boolean shouldDisplayZoomControls() {
1451 synchronized (mAwSettingsLock) {
1452 return supportsMultiTouchZoomLocked() && mDisplayZoomControls;
1456 private int clipFontSize(int size) {
1457 if (size < MINIMUM_FONT_SIZE) {
1458 return MINIMUM_FONT_SIZE;
1459 } else if (size > MAXIMUM_FONT_SIZE) {
1460 return MAXIMUM_FONT_SIZE;
1466 private void updateEverything() {
1467 synchronized (mAwSettingsLock) {
1468 nativeUpdateEverythingLocked(mNativeAwSettings);
1473 private void populateWebPreferences(long webPrefsPtr) {
1474 synchronized (mAwSettingsLock) {
1475 nativePopulateWebPreferencesLocked(mNativeAwSettings, webPrefsPtr);
1479 private void updateWebkitPreferencesOnUiThreadLocked() {
1480 assert mEventHandler.mHandler != null;
1481 ThreadUtils.assertOnUiThread();
1482 nativeUpdateWebkitPreferencesLocked(mNativeAwSettings);
1485 private native long nativeInit(long webContentsPtr);
1487 private native void nativeDestroy(long nativeAwSettings);
1489 private native void nativePopulateWebPreferencesLocked(long nativeAwSettings, long webPrefsPtr);
1491 private native void nativeResetScrollAndScaleState(long nativeAwSettings);
1493 private native void nativeUpdateEverythingLocked(long nativeAwSettings);
1495 private native void nativeUpdateInitialPageScaleLocked(long nativeAwSettings);
1497 private native void nativeUpdateUserAgentLocked(long nativeAwSettings);
1499 private native void nativeUpdateWebkitPreferencesLocked(long nativeAwSettings);
1501 private static native String nativeGetDefaultUserAgent();
1503 private native void nativeUpdateFormDataPreferencesLocked(long nativeAwSettings);