• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.webkit;
18 
19 import android.content.Context;
20 import android.content.SharedPreferences;
21 import android.content.pm.PackageManager;
22 import android.os.Build;
23 import android.os.Handler;
24 import android.os.Message;
25 import android.util.DisplayMetrics;
26 import android.util.EventLog;
27 
28 import java.util.Locale;
29 
30 /**
31  * Manages settings state for a WebView. When a WebView is first created, it
32  * obtains a set of default settings. These default settings will be returned
33  * from any getter call. A WebSettings object obtained from
34  * WebView.getSettings() is tied to the life of the WebView. If a WebView has
35  * been destroyed, any method call on WebSettings will throw an
36  * IllegalStateException.
37  */
38 public class WebSettings {
39     /**
40      * Enum for controlling the layout of html.
41      * NORMAL means no rendering changes.
42      * SINGLE_COLUMN moves all content into one column that is the width of the
43      * view.
44      * NARROW_COLUMNS makes all columns no wider than the screen if possible.
45      * @deprecated This enum is now obsolete.
46      */
47     // XXX: These must match LayoutAlgorithm in Settings.h in WebCore.
48     @Deprecated
49     public enum LayoutAlgorithm {
50         NORMAL,
51         SINGLE_COLUMN,
52         NARROW_COLUMNS
53     }
54 
55     /**
56      * Enum for specifying the text size.
57      * SMALLEST is 50%
58      * SMALLER is 75%
59      * NORMAL is 100%
60      * LARGER is 150%
61      * LARGEST is 200%
62      * @deprecated Use {@link WebSettings#setTextZoom(int)} and {@link WebSettings#getTextZoom()} instead.
63      */
64     public enum TextSize {
65         SMALLEST(50),
66         SMALLER(75),
67         NORMAL(100),
68         LARGER(150),
69         LARGEST(200);
TextSize(int size)70         TextSize(int size) {
71             value = size;
72         }
73         int value;
74     }
75 
76     /**
77      * Enum for specifying the WebView's desired density.
78      * FAR makes 100% looking like in 240dpi
79      * MEDIUM makes 100% looking like in 160dpi
80      * CLOSE makes 100% looking like in 120dpi
81      */
82     public enum ZoomDensity {
83         FAR(150),      // 240dpi
84         MEDIUM(100),    // 160dpi
85         CLOSE(75);     // 120dpi
ZoomDensity(int size)86         ZoomDensity(int size) {
87             value = size;
88         }
89         int value;
90     }
91 
92     /**
93      * Default cache usage pattern  Use with {@link #setCacheMode}.
94      */
95     public static final int LOAD_DEFAULT = -1;
96 
97     /**
98      * Normal cache usage pattern  Use with {@link #setCacheMode}.
99      */
100     public static final int LOAD_NORMAL = 0;
101 
102     /**
103      * Use cache if content is there, even if expired (eg, history nav)
104      * If it is not in the cache, load from network.
105      * Use with {@link #setCacheMode}.
106      */
107     public static final int LOAD_CACHE_ELSE_NETWORK = 1;
108 
109     /**
110      * Don't use the cache, load from network
111      * Use with {@link #setCacheMode}.
112      */
113     public static final int LOAD_NO_CACHE = 2;
114 
115     /**
116      * Don't use the network, load from cache only.
117      * Use with {@link #setCacheMode}.
118      */
119     public static final int LOAD_CACHE_ONLY = 3;
120 
121     public enum RenderPriority {
122         NORMAL,
123         HIGH,
124         LOW
125     }
126 
127     /**
128      * The plugin state effects how plugins are treated on a page. ON means
129      * that any object will be loaded even if a plugin does not exist to handle
130      * the content. ON_DEMAND means that if there is a plugin installed that
131      * can handle the content, a placeholder is shown until the user clicks on
132      * the placeholder. Once clicked, the plugin will be enabled on the page.
133      * OFF means that all plugins will be turned off and any fallback content
134      * will be used.
135      */
136     public enum PluginState {
137         ON,
138         ON_DEMAND,
139         OFF
140     }
141 
142     // TODO: Keep this up to date
143     private static final String PREVIOUS_VERSION = "3.1";
144 
145     // WebView associated with this WebSettings.
146     private WebView mWebView;
147     // BrowserFrame used to access the native frame pointer.
148     private BrowserFrame mBrowserFrame;
149     // Flag to prevent multiple SYNC messages at one time.
150     private boolean mSyncPending = false;
151     // Custom handler that queues messages until the WebCore thread is active.
152     private final EventHandler mEventHandler;
153 
154     // Private settings so we don't have to go into native code to
155     // retrieve the values. After setXXX, postSync() needs to be called.
156     //
157     // The default values need to match those in WebSettings.cpp
158     // If the defaults change, please also update the JavaDocs so developers
159     // know what they are.
160     private LayoutAlgorithm mLayoutAlgorithm = LayoutAlgorithm.NARROW_COLUMNS;
161     private Context         mContext;
162     private int             mTextSize = 100;
163     private String          mStandardFontFamily = "sans-serif";
164     private String          mFixedFontFamily = "monospace";
165     private String          mSansSerifFontFamily = "sans-serif";
166     private String          mSerifFontFamily = "serif";
167     private String          mCursiveFontFamily = "cursive";
168     private String          mFantasyFontFamily = "fantasy";
169     private String          mDefaultTextEncoding;
170     private String          mUserAgent;
171     private boolean         mUseDefaultUserAgent;
172     private String          mAcceptLanguage;
173     private int             mMinimumFontSize = 8;
174     private int             mMinimumLogicalFontSize = 8;
175     private int             mDefaultFontSize = 16;
176     private int             mDefaultFixedFontSize = 13;
177     private int             mPageCacheCapacity = 0;
178     private boolean         mLoadsImagesAutomatically = true;
179     private boolean         mBlockNetworkImage = false;
180     private boolean         mBlockNetworkLoads;
181     private boolean         mJavaScriptEnabled = false;
182     private boolean         mHardwareAccelSkia = false;
183     private boolean         mShowVisualIndicator = false;
184     private PluginState     mPluginState = PluginState.OFF;
185     private boolean         mJavaScriptCanOpenWindowsAutomatically = false;
186     private boolean         mUseDoubleTree = false;
187     private boolean         mUseWideViewport = false;
188     private boolean         mSupportMultipleWindows = false;
189     private boolean         mShrinksStandaloneImagesToFit = false;
190     private long            mMaximumDecodedImageSize = 0; // 0 means default
191     private boolean         mPrivateBrowsingEnabled = false;
192     private boolean         mSyntheticLinksEnabled = true;
193     // HTML5 API flags
194     private boolean         mAppCacheEnabled = false;
195     private boolean         mDatabaseEnabled = false;
196     private boolean         mDomStorageEnabled = false;
197     private boolean         mWorkersEnabled = false;  // only affects V8.
198     private boolean         mGeolocationEnabled = true;
199     private boolean         mXSSAuditorEnabled = false;
200     // HTML5 configuration parameters
201     private long            mAppCacheMaxSize = Long.MAX_VALUE;
202     private String          mAppCachePath = "";
203     private String          mDatabasePath = "";
204     // The WebCore DatabaseTracker only allows the database path to be set
205     // once. Keep track of when the path has been set.
206     private boolean         mDatabasePathHasBeenSet = false;
207     private String          mGeolocationDatabasePath = "";
208     // Don't need to synchronize the get/set methods as they
209     // are basic types, also none of these values are used in
210     // native WebCore code.
211     private ZoomDensity     mDefaultZoom = ZoomDensity.MEDIUM;
212     private RenderPriority  mRenderPriority = RenderPriority.NORMAL;
213     private int             mOverrideCacheMode = LOAD_DEFAULT;
214     private int             mDoubleTapZoom = 100;
215     private boolean         mSaveFormData = true;
216     private boolean         mAutoFillEnabled = false;
217     private boolean         mSavePassword = true;
218     private boolean         mLightTouchEnabled = false;
219     private boolean         mNeedInitialFocus = true;
220     private boolean         mNavDump = false;
221     private boolean         mSupportZoom = true;
222     private boolean         mBuiltInZoomControls = false;
223     private boolean         mDisplayZoomControls = true;
224     private boolean         mAllowFileAccess = true;
225     private boolean         mAllowContentAccess = true;
226     private boolean         mLoadWithOverviewMode = false;
227     private boolean         mEnableSmoothTransition = false;
228     private boolean         mForceUserScalable = false;
229 
230     // AutoFill Profile data
231     /**
232      * @hide for now, pending API council approval.
233      */
234     public static class AutoFillProfile {
235         private int mUniqueId;
236         private String mFullName;
237         private String mEmailAddress;
238         private String mCompanyName;
239         private String mAddressLine1;
240         private String mAddressLine2;
241         private String mCity;
242         private String mState;
243         private String mZipCode;
244         private String mCountry;
245         private String mPhoneNumber;
246 
AutoFillProfile(int uniqueId, String fullName, String email, String companyName, String addressLine1, String addressLine2, String city, String state, String zipCode, String country, String phoneNumber)247         public AutoFillProfile(int uniqueId, String fullName, String email,
248                 String companyName, String addressLine1, String addressLine2,
249                 String city, String state, String zipCode, String country,
250                 String phoneNumber) {
251             mUniqueId = uniqueId;
252             mFullName = fullName;
253             mEmailAddress = email;
254             mCompanyName = companyName;
255             mAddressLine1 = addressLine1;
256             mAddressLine2 = addressLine2;
257             mCity = city;
258             mState = state;
259             mZipCode = zipCode;
260             mCountry = country;
261             mPhoneNumber = phoneNumber;
262         }
263 
getUniqueId()264         public int getUniqueId() { return mUniqueId; }
getFullName()265         public String getFullName() { return mFullName; }
getEmailAddress()266         public String getEmailAddress() { return mEmailAddress; }
getCompanyName()267         public String getCompanyName() { return mCompanyName; }
getAddressLine1()268         public String getAddressLine1() { return mAddressLine1; }
getAddressLine2()269         public String getAddressLine2() { return mAddressLine2; }
getCity()270         public String getCity() { return mCity; }
getState()271         public String getState() { return mState; }
getZipCode()272         public String getZipCode() { return mZipCode; }
getCountry()273         public String getCountry() { return mCountry; }
getPhoneNumber()274         public String getPhoneNumber() { return mPhoneNumber; }
275     }
276 
277 
278     private AutoFillProfile mAutoFillProfile;
279 
280     private boolean         mUseWebViewBackgroundForOverscroll = true;
281 
282     // private WebSettings, not accessible by the host activity
283     static private int      mDoubleTapToastCount = 3;
284 
285     private static final String PREF_FILE = "WebViewSettings";
286     private static final String DOUBLE_TAP_TOAST_COUNT = "double_tap_toast_count";
287 
288     // Class to handle messages before WebCore is ready.
289     private class EventHandler {
290         // Message id for syncing
291         static final int SYNC = 0;
292         // Message id for setting priority
293         static final int PRIORITY = 1;
294         // Message id for writing double-tap toast count
295         static final int SET_DOUBLE_TAP_TOAST_COUNT = 2;
296         // Actual WebCore thread handler
297         private Handler mHandler;
298 
createHandler()299         private synchronized void createHandler() {
300             // as mRenderPriority can be set before thread is running, sync up
301             setRenderPriority();
302 
303             // create a new handler
304             mHandler = new Handler() {
305                 @Override
306                 public void handleMessage(Message msg) {
307                     switch (msg.what) {
308                         case SYNC:
309                             synchronized (WebSettings.this) {
310                                 if (mBrowserFrame.mNativeFrame != 0) {
311                                     nativeSync(mBrowserFrame.mNativeFrame);
312                                 }
313                                 mSyncPending = false;
314                             }
315                             break;
316 
317                         case PRIORITY: {
318                             setRenderPriority();
319                             break;
320                         }
321 
322                         case SET_DOUBLE_TAP_TOAST_COUNT: {
323                             SharedPreferences.Editor editor = mContext
324                                     .getSharedPreferences(PREF_FILE,
325                                             Context.MODE_PRIVATE).edit();
326                             editor.putInt(DOUBLE_TAP_TOAST_COUNT,
327                                     mDoubleTapToastCount);
328                             editor.commit();
329                             break;
330                         }
331                     }
332                 }
333             };
334         }
335 
setRenderPriority()336         private void setRenderPriority() {
337             synchronized (WebSettings.this) {
338                 if (mRenderPriority == RenderPriority.NORMAL) {
339                     android.os.Process.setThreadPriority(
340                             android.os.Process.THREAD_PRIORITY_DEFAULT);
341                 } else if (mRenderPriority == RenderPriority.HIGH) {
342                     android.os.Process.setThreadPriority(
343                             android.os.Process.THREAD_PRIORITY_FOREGROUND +
344                             android.os.Process.THREAD_PRIORITY_LESS_FAVORABLE);
345                 } else if (mRenderPriority == RenderPriority.LOW) {
346                     android.os.Process.setThreadPriority(
347                             android.os.Process.THREAD_PRIORITY_BACKGROUND);
348                 }
349             }
350         }
351 
352         /**
353          * Send a message to the private queue or handler.
354          */
sendMessage(Message msg)355         private synchronized boolean sendMessage(Message msg) {
356             if (mHandler != null) {
357                 mHandler.sendMessage(msg);
358                 return true;
359             } else {
360                 return false;
361             }
362         }
363     }
364 
365     // User agent strings.
366     private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (X11; " +
367         "Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) " +
368         "Chrome/11.0.696.34 Safari/534.24";
369     private static final String IPHONE_USERAGENT =
370             "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)"
371             + " AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0"
372             + " Mobile/7A341 Safari/528.16";
373     private static Locale sLocale;
374     private static Object sLockForLocaleSettings;
375 
376     /**
377      * Package constructor to prevent clients from creating a new settings
378      * instance.
379      */
WebSettings(Context context, WebView webview)380     WebSettings(Context context, WebView webview) {
381         mEventHandler = new EventHandler();
382         mContext = context;
383         mWebView = webview;
384         mDefaultTextEncoding = context.getString(com.android.internal.
385                                                  R.string.default_text_encoding);
386 
387         if (sLockForLocaleSettings == null) {
388             sLockForLocaleSettings = new Object();
389             sLocale = Locale.getDefault();
390         }
391         mAcceptLanguage = getCurrentAcceptLanguage();
392         mUserAgent = getCurrentUserAgent();
393         mUseDefaultUserAgent = true;
394 
395         mBlockNetworkLoads = mContext.checkPermission(
396                 "android.permission.INTERNET", android.os.Process.myPid(),
397                 android.os.Process.myUid()) != PackageManager.PERMISSION_GRANTED;
398     }
399 
400     private static final String ACCEPT_LANG_FOR_US_LOCALE = "en-US";
401 
402     /**
403      * Looks at sLocale and returns current AcceptLanguage String.
404      * @return Current AcceptLanguage String.
405      */
getCurrentAcceptLanguage()406     private String getCurrentAcceptLanguage() {
407         Locale locale;
408         synchronized(sLockForLocaleSettings) {
409             locale = sLocale;
410         }
411         StringBuilder buffer = new StringBuilder();
412         addLocaleToHttpAcceptLanguage(buffer, locale);
413 
414         if (!Locale.US.equals(locale)) {
415             if (buffer.length() > 0) {
416                 buffer.append(", ");
417             }
418             buffer.append(ACCEPT_LANG_FOR_US_LOCALE);
419         }
420 
421         return buffer.toString();
422     }
423 
424     /**
425      * Convert obsolete language codes, including Hebrew/Indonesian/Yiddish,
426      * to new standard.
427      */
convertObsoleteLanguageCodeToNew(String langCode)428     private static String convertObsoleteLanguageCodeToNew(String langCode) {
429         if (langCode == null) {
430             return null;
431         }
432         if ("iw".equals(langCode)) {
433             // Hebrew
434             return "he";
435         } else if ("in".equals(langCode)) {
436             // Indonesian
437             return "id";
438         } else if ("ji".equals(langCode)) {
439             // Yiddish
440             return "yi";
441         }
442         return langCode;
443     }
444 
addLocaleToHttpAcceptLanguage(StringBuilder builder, Locale locale)445     private static void addLocaleToHttpAcceptLanguage(StringBuilder builder,
446                                                       Locale locale) {
447         String language = convertObsoleteLanguageCodeToNew(locale.getLanguage());
448         if (language != null) {
449             builder.append(language);
450             String country = locale.getCountry();
451             if (country != null) {
452                 builder.append("-");
453                 builder.append(country);
454             }
455         }
456     }
457 
458     /**
459      * Looks at sLocale and mContext and returns current UserAgent String.
460      * @return Current UserAgent String.
461      */
getCurrentUserAgent()462     private synchronized String getCurrentUserAgent() {
463         Locale locale;
464         synchronized(sLockForLocaleSettings) {
465             locale = sLocale;
466         }
467         StringBuffer buffer = new StringBuffer();
468         // Add version
469         final String version = Build.VERSION.RELEASE;
470         if (version.length() > 0) {
471             if (Character.isDigit(version.charAt(0))) {
472                 // Release is a version, eg "3.1"
473                 buffer.append(version);
474             } else {
475                 // Release is a codename, eg "Honeycomb"
476                 // In this case, use the previous release's version
477                 buffer.append(PREVIOUS_VERSION);
478             }
479         } else {
480             // default to "1.0"
481             buffer.append("1.0");
482         }
483         buffer.append("; ");
484         final String language = locale.getLanguage();
485         if (language != null) {
486             buffer.append(convertObsoleteLanguageCodeToNew(language));
487             final String country = locale.getCountry();
488             if (country != null) {
489                 buffer.append("-");
490                 buffer.append(country.toLowerCase());
491             }
492         } else {
493             // default to "en"
494             buffer.append("en");
495         }
496         buffer.append(";");
497         // add the model for the release build
498         if ("REL".equals(Build.VERSION.CODENAME)) {
499             final String model = Build.MODEL;
500             if (model.length() > 0) {
501                 buffer.append(" ");
502                 buffer.append(model);
503             }
504         }
505         final String id = Build.ID;
506         if (id.length() > 0) {
507             buffer.append(" Build/");
508             buffer.append(id);
509         }
510         String mobile = mContext.getResources().getText(
511             com.android.internal.R.string.web_user_agent_target_content).toString();
512         final String base = mContext.getResources().getText(
513                 com.android.internal.R.string.web_user_agent).toString();
514         return String.format(base, buffer, mobile);
515     }
516 
517     /**
518      * Enables dumping the pages navigation cache to a text file.
519      * @deprecated This method is now obsolete.
520      */
521     @Deprecated
setNavDump(boolean enabled)522     public void setNavDump(boolean enabled) {
523         mNavDump = enabled;
524     }
525 
526     /**
527      * Returns true if dumping the navigation cache is enabled.
528      * @deprecated This method is now obsolete.
529      */
530     @Deprecated
getNavDump()531     public boolean getNavDump() {
532         return mNavDump;
533     }
534 
535     /**
536      * If WebView only supports touch, a different navigation model will be
537      * applied. Otherwise, the navigation to support both touch and keyboard
538      * will be used.
539      * @hide
540     public void setSupportTouchOnly(boolean touchOnly) {
541         mSupportTounchOnly = touchOnly;
542     }
543      */
544 
supportTouchOnly()545     boolean supportTouchOnly() {
546         // for debug only, use mLightTouchEnabled for mSupportTounchOnly
547         return mLightTouchEnabled;
548     }
549 
550     /**
551      * Set whether the WebView supports zoom
552      */
setSupportZoom(boolean support)553     public void setSupportZoom(boolean support) {
554         mSupportZoom = support;
555         mWebView.updateMultiTouchSupport(mContext);
556     }
557 
558     /**
559      * Returns whether the WebView supports zoom
560      */
supportZoom()561     public boolean supportZoom() {
562         return mSupportZoom;
563     }
564 
565     /**
566      * Sets whether the zoom mechanism built into WebView is used.
567      */
setBuiltInZoomControls(boolean enabled)568     public void setBuiltInZoomControls(boolean enabled) {
569         mBuiltInZoomControls = enabled;
570         mWebView.updateMultiTouchSupport(mContext);
571     }
572 
573     /**
574      * Returns true if the zoom mechanism built into WebView is being used.
575      */
getBuiltInZoomControls()576     public boolean getBuiltInZoomControls() {
577         return mBuiltInZoomControls;
578     }
579 
580     /**
581      * Sets whether the on screen zoom buttons are used.
582      * A combination of built in zoom controls enabled
583      * and on screen zoom controls disabled allows for pinch to zoom
584      * to work without the on screen controls
585      */
setDisplayZoomControls(boolean enabled)586     public void setDisplayZoomControls(boolean enabled) {
587         mDisplayZoomControls = enabled;
588         mWebView.updateMultiTouchSupport(mContext);
589     }
590 
591     /**
592      * Returns true if the on screen zoom buttons are being used.
593      */
getDisplayZoomControls()594     public boolean getDisplayZoomControls() {
595         return mDisplayZoomControls;
596     }
597 
598     /**
599      * Enable or disable file access within WebView. File access is enabled by
600      * default.  Note that this enables or disables file system access only.
601      * Assets and resources are still accessible using file:///android_asset and
602      * file:///android_res.
603      */
setAllowFileAccess(boolean allow)604     public void setAllowFileAccess(boolean allow) {
605         mAllowFileAccess = allow;
606     }
607 
608     /**
609      * Returns true if this WebView supports file access.
610      */
getAllowFileAccess()611     public boolean getAllowFileAccess() {
612         return mAllowFileAccess;
613     }
614 
615     /**
616      * Enable or disable content url access within WebView.  Content url access
617      * allows WebView to load content from a content provider installed in the
618      * system.  The default is enabled.
619      */
setAllowContentAccess(boolean allow)620     public void setAllowContentAccess(boolean allow) {
621         mAllowContentAccess = allow;
622     }
623 
624     /**
625      * Returns true if this WebView supports content url access.
626      */
getAllowContentAccess()627     public boolean getAllowContentAccess() {
628         return mAllowContentAccess;
629     }
630 
631     /**
632      * Set whether the WebView loads a page with overview mode.
633      */
setLoadWithOverviewMode(boolean overview)634     public void setLoadWithOverviewMode(boolean overview) {
635         mLoadWithOverviewMode = overview;
636     }
637 
638     /**
639      * Returns true if this WebView loads page with overview mode
640      */
getLoadWithOverviewMode()641     public boolean getLoadWithOverviewMode() {
642         return mLoadWithOverviewMode;
643     }
644 
645     /**
646      * Set whether the WebView will enable smooth transition while panning or
647      * zooming or while the window hosting the WebView does not have focus.
648      * If it is true, WebView will choose a solution to maximize the performance.
649      * e.g. the WebView's content may not be updated during the transition.
650      * If it is false, WebView will keep its fidelity. The default value is false.
651      */
setEnableSmoothTransition(boolean enable)652     public void setEnableSmoothTransition(boolean enable) {
653         mEnableSmoothTransition = enable;
654     }
655 
656     /**
657      * Returns true if the WebView enables smooth transition while panning or
658      * zooming.
659      */
enableSmoothTransition()660     public boolean enableSmoothTransition() {
661         return mEnableSmoothTransition;
662     }
663 
664     /**
665      * Set whether the WebView uses its background for over scroll background.
666      * If true, it will use the WebView's background. If false, it will use an
667      * internal pattern. Default is true.
668      * @deprecated This method is now obsolete.
669      */
670     @Deprecated
setUseWebViewBackgroundForOverscrollBackground(boolean view)671     public void setUseWebViewBackgroundForOverscrollBackground(boolean view) {
672         mUseWebViewBackgroundForOverscroll = view;
673     }
674 
675     /**
676      * Returns true if this WebView uses WebView's background instead of
677      * internal pattern for over scroll background.
678      * @deprecated This method is now obsolete.
679      */
680     @Deprecated
getUseWebViewBackgroundForOverscrollBackground()681     public boolean getUseWebViewBackgroundForOverscrollBackground() {
682         return mUseWebViewBackgroundForOverscroll;
683     }
684 
685     /**
686      * Store whether the WebView is saving form data.
687      */
setSaveFormData(boolean save)688     public void setSaveFormData(boolean save) {
689         mSaveFormData = save;
690     }
691 
692     /**
693      *  Return whether the WebView is saving form data and displaying prior
694      *  entries/autofill++.  Always false in private browsing mode.
695      */
getSaveFormData()696     public boolean getSaveFormData() {
697         return mSaveFormData && !mPrivateBrowsingEnabled;
698     }
699 
700     /**
701      *  Store whether the WebView is saving password.
702      */
setSavePassword(boolean save)703     public void setSavePassword(boolean save) {
704         mSavePassword = save;
705     }
706 
707     /**
708      *  Return whether the WebView is saving password.
709      */
getSavePassword()710     public boolean getSavePassword() {
711         return mSavePassword;
712     }
713 
714     /**
715      * Set the text zoom of the page in percent. Default is 100.
716      * @param textZoom A percent value for increasing or decreasing the text.
717      */
setTextZoom(int textZoom)718     public synchronized void setTextZoom(int textZoom) {
719         if (mTextSize != textZoom) {
720             if (WebView.mLogEvent) {
721                 EventLog.writeEvent(EventLogTags.BROWSER_TEXT_SIZE_CHANGE,
722                         mTextSize, textZoom);
723             }
724             mTextSize = textZoom;
725             postSync();
726         }
727     }
728 
729     /**
730      * Get the text zoom of the page in percent.
731      * @return A percent value describing the text zoom.
732      * @see setTextSizeZoom
733      */
getTextZoom()734     public synchronized int getTextZoom() {
735         return mTextSize;
736     }
737 
738     /**
739      * Set the text size of the page.
740      * @param t A TextSize value for increasing or decreasing the text.
741      * @see WebSettings.TextSize
742      * @deprecated Use {@link #setTextZoom(int)} instead
743      */
setTextSize(TextSize t)744     public synchronized void setTextSize(TextSize t) {
745         setTextZoom(t.value);
746     }
747 
748     /**
749      * Get the text size of the page. If the text size was previously specified
750      * in percent using {@link #setTextZoom(int)}, this will return
751      * the closest matching {@link TextSize}.
752      * @return A TextSize enum value describing the text size.
753      * @see WebSettings.TextSize
754      * @deprecated Use {@link #getTextZoom()} instead
755      */
getTextSize()756     public synchronized TextSize getTextSize() {
757         TextSize closestSize = null;
758         int smallestDelta = Integer.MAX_VALUE;
759         for (TextSize size : TextSize.values()) {
760             int delta = Math.abs(mTextSize - size.value);
761             if (delta == 0) {
762                 return size;
763             }
764             if (delta < smallestDelta) {
765                 smallestDelta = delta;
766                 closestSize = size;
767             }
768         }
769         return closestSize != null ? closestSize : TextSize.NORMAL;
770     }
771 
772     /**
773      * Set the double-tap zoom of the page in percent. Default is 100.
774      * @param doubleTapZoom A percent value for increasing or decreasing the double-tap zoom.
775      * @hide
776      */
setDoubleTapZoom(int doubleTapZoom)777     public void setDoubleTapZoom(int doubleTapZoom) {
778         if (mDoubleTapZoom != doubleTapZoom) {
779             mDoubleTapZoom = doubleTapZoom;
780             mWebView.updateDoubleTapZoom();
781         }
782     }
783 
784     /**
785      * Get the double-tap zoom of the page in percent.
786      * @return A percent value describing the double-tap zoom.
787      * @hide
788      */
getDoubleTapZoom()789     public int getDoubleTapZoom() {
790         return mDoubleTapZoom;
791     }
792 
793     /**
794      * Set the default zoom density of the page. This should be called from UI
795      * thread.
796      * @param zoom A ZoomDensity value
797      * @see WebSettings.ZoomDensity
798      */
setDefaultZoom(ZoomDensity zoom)799     public void setDefaultZoom(ZoomDensity zoom) {
800         if (mDefaultZoom != zoom) {
801             mDefaultZoom = zoom;
802             mWebView.updateDefaultZoomDensity(zoom.value);
803         }
804     }
805 
806     /**
807      * Get the default zoom density of the page. This should be called from UI
808      * thread.
809      * @return A ZoomDensity value
810      * @see WebSettings.ZoomDensity
811      */
getDefaultZoom()812     public ZoomDensity getDefaultZoom() {
813         return mDefaultZoom;
814     }
815 
816     /**
817      * Enables using light touches to make a selection and activate mouseovers.
818      */
setLightTouchEnabled(boolean enabled)819     public void setLightTouchEnabled(boolean enabled) {
820         mLightTouchEnabled = enabled;
821     }
822 
823     /**
824      * Returns true if light touches are enabled.
825      */
getLightTouchEnabled()826     public boolean getLightTouchEnabled() {
827         return mLightTouchEnabled;
828     }
829 
830     /**
831      * @deprecated This setting controlled a rendering optimization
832      * that is no longer present. Setting it now has no effect.
833      */
834     @Deprecated
setUseDoubleTree(boolean use)835     public synchronized void setUseDoubleTree(boolean use) {
836         return;
837     }
838 
839     /**
840      * @deprecated This setting controlled a rendering optimization
841      * that is no longer present. Setting it now has no effect.
842      */
843     @Deprecated
getUseDoubleTree()844     public synchronized boolean getUseDoubleTree() {
845         return false;
846     }
847 
848     /**
849      * Tell the WebView about user-agent string.
850      * @param ua 0 if the WebView should use an Android user-agent string,
851      *           1 if the WebView should use a desktop user-agent string.
852      *
853      * @deprecated Please use setUserAgentString instead.
854      */
855     @Deprecated
setUserAgent(int ua)856     public synchronized void setUserAgent(int ua) {
857         String uaString = null;
858         if (ua == 1) {
859             if (DESKTOP_USERAGENT.equals(mUserAgent)) {
860                 return; // do nothing
861             } else {
862                 uaString = DESKTOP_USERAGENT;
863             }
864         } else if (ua == 2) {
865             if (IPHONE_USERAGENT.equals(mUserAgent)) {
866                 return; // do nothing
867             } else {
868                 uaString = IPHONE_USERAGENT;
869             }
870         } else if (ua != 0) {
871             return; // do nothing
872         }
873         setUserAgentString(uaString);
874     }
875 
876     /**
877      * Return user-agent as int
878      * @return int  0 if the WebView is using an Android user-agent string.
879      *              1 if the WebView is using a desktop user-agent string.
880      *             -1 if the WebView is using user defined user-agent string.
881      *
882      * @deprecated Please use getUserAgentString instead.
883      */
884     @Deprecated
getUserAgent()885     public synchronized int getUserAgent() {
886         if (DESKTOP_USERAGENT.equals(mUserAgent)) {
887             return 1;
888         } else if (IPHONE_USERAGENT.equals(mUserAgent)) {
889             return 2;
890         } else if (mUseDefaultUserAgent) {
891             return 0;
892         }
893         return -1;
894     }
895 
896     /**
897      * Tell the WebView to use the wide viewport
898      */
setUseWideViewPort(boolean use)899     public synchronized void setUseWideViewPort(boolean use) {
900         if (mUseWideViewport != use) {
901             mUseWideViewport = use;
902             postSync();
903         }
904     }
905 
906     /**
907      * @return True if the WebView is using a wide viewport
908      */
getUseWideViewPort()909     public synchronized boolean getUseWideViewPort() {
910         return mUseWideViewport;
911     }
912 
913     /**
914      * Tell the WebView whether it supports multiple windows. TRUE means
915      *         that {@link WebChromeClient#onCreateWindow(WebView, boolean,
916      *         boolean, Message)} is implemented by the host application.
917      */
setSupportMultipleWindows(boolean support)918     public synchronized void setSupportMultipleWindows(boolean support) {
919         if (mSupportMultipleWindows != support) {
920             mSupportMultipleWindows = support;
921             postSync();
922         }
923     }
924 
925     /**
926      * @return True if the WebView is supporting multiple windows. This means
927      *         that {@link WebChromeClient#onCreateWindow(WebView, boolean,
928      *         boolean, Message)} is implemented by the host application.
929      */
supportMultipleWindows()930     public synchronized boolean supportMultipleWindows() {
931         return mSupportMultipleWindows;
932     }
933 
934     /**
935      * Set the underlying layout algorithm. This will cause a relayout of the
936      * WebView.
937      * @param l A LayoutAlgorithm enum specifying the algorithm to use.
938      * @see WebSettings.LayoutAlgorithm
939      * @deprecated This method is now obsolete.
940      */
941     @Deprecated
setLayoutAlgorithm(LayoutAlgorithm l)942     public synchronized void setLayoutAlgorithm(LayoutAlgorithm l) {
943         // XXX: This will only be affective if libwebcore was built with
944         // ANDROID_LAYOUT defined.
945         if (mLayoutAlgorithm != l) {
946             mLayoutAlgorithm = l;
947             postSync();
948         }
949     }
950 
951     /**
952      * Return the current layout algorithm. The default is NARROW_COLUMNS.
953      * @return LayoutAlgorithm enum value describing the layout algorithm
954      *         being used.
955      * @see WebSettings.LayoutAlgorithm
956      * @deprecated This method is now obsolete.
957      */
958     @Deprecated
getLayoutAlgorithm()959     public synchronized LayoutAlgorithm getLayoutAlgorithm() {
960         return mLayoutAlgorithm;
961     }
962 
963     /**
964      * Set the standard font family name.
965      * @param font A font family name.
966      */
setStandardFontFamily(String font)967     public synchronized void setStandardFontFamily(String font) {
968         if (font != null && !font.equals(mStandardFontFamily)) {
969             mStandardFontFamily = font;
970             postSync();
971         }
972     }
973 
974     /**
975      * Get the standard font family name. The default is "sans-serif".
976      * @return The standard font family name as a string.
977      */
getStandardFontFamily()978     public synchronized String getStandardFontFamily() {
979         return mStandardFontFamily;
980     }
981 
982     /**
983      * Set the fixed font family name.
984      * @param font A font family name.
985      */
setFixedFontFamily(String font)986     public synchronized void setFixedFontFamily(String font) {
987         if (font != null && !font.equals(mFixedFontFamily)) {
988             mFixedFontFamily = font;
989             postSync();
990         }
991     }
992 
993     /**
994      * Get the fixed font family name. The default is "monospace".
995      * @return The fixed font family name as a string.
996      */
getFixedFontFamily()997     public synchronized String getFixedFontFamily() {
998         return mFixedFontFamily;
999     }
1000 
1001     /**
1002      * Set the sans-serif font family name.
1003      * @param font A font family name.
1004      */
setSansSerifFontFamily(String font)1005     public synchronized void setSansSerifFontFamily(String font) {
1006         if (font != null && !font.equals(mSansSerifFontFamily)) {
1007             mSansSerifFontFamily = font;
1008             postSync();
1009         }
1010     }
1011 
1012     /**
1013      * Get the sans-serif font family name.
1014      * @return The sans-serif font family name as a string.
1015      */
getSansSerifFontFamily()1016     public synchronized String getSansSerifFontFamily() {
1017         return mSansSerifFontFamily;
1018     }
1019 
1020     /**
1021      * Set the serif font family name. The default is "sans-serif".
1022      * @param font A font family name.
1023      */
setSerifFontFamily(String font)1024     public synchronized void setSerifFontFamily(String font) {
1025         if (font != null && !font.equals(mSerifFontFamily)) {
1026             mSerifFontFamily = font;
1027             postSync();
1028         }
1029     }
1030 
1031     /**
1032      * Get the serif font family name. The default is "serif".
1033      * @return The serif font family name as a string.
1034      */
getSerifFontFamily()1035     public synchronized String getSerifFontFamily() {
1036         return mSerifFontFamily;
1037     }
1038 
1039     /**
1040      * Set the cursive font family name.
1041      * @param font A font family name.
1042      */
setCursiveFontFamily(String font)1043     public synchronized void setCursiveFontFamily(String font) {
1044         if (font != null && !font.equals(mCursiveFontFamily)) {
1045             mCursiveFontFamily = font;
1046             postSync();
1047         }
1048     }
1049 
1050     /**
1051      * Get the cursive font family name. The default is "cursive".
1052      * @return The cursive font family name as a string.
1053      */
getCursiveFontFamily()1054     public synchronized String getCursiveFontFamily() {
1055         return mCursiveFontFamily;
1056     }
1057 
1058     /**
1059      * Set the fantasy font family name.
1060      * @param font A font family name.
1061      */
setFantasyFontFamily(String font)1062     public synchronized void setFantasyFontFamily(String font) {
1063         if (font != null && !font.equals(mFantasyFontFamily)) {
1064             mFantasyFontFamily = font;
1065             postSync();
1066         }
1067     }
1068 
1069     /**
1070      * Get the fantasy font family name. The default is "fantasy".
1071      * @return The fantasy font family name as a string.
1072      */
getFantasyFontFamily()1073     public synchronized String getFantasyFontFamily() {
1074         return mFantasyFontFamily;
1075     }
1076 
1077     /**
1078      * Set the minimum font size.
1079      * @param size A non-negative integer between 1 and 72.
1080      * Any number outside the specified range will be pinned.
1081      */
setMinimumFontSize(int size)1082     public synchronized void setMinimumFontSize(int size) {
1083         size = pin(size);
1084         if (mMinimumFontSize != size) {
1085             mMinimumFontSize = size;
1086             postSync();
1087         }
1088     }
1089 
1090     /**
1091      * Get the minimum font size. The default is 8.
1092      * @return A non-negative integer between 1 and 72.
1093      */
getMinimumFontSize()1094     public synchronized int getMinimumFontSize() {
1095         return mMinimumFontSize;
1096     }
1097 
1098     /**
1099      * Set the minimum logical font size.
1100      * @param size A non-negative integer between 1 and 72.
1101      * Any number outside the specified range will be pinned.
1102      */
setMinimumLogicalFontSize(int size)1103     public synchronized void setMinimumLogicalFontSize(int size) {
1104         size = pin(size);
1105         if (mMinimumLogicalFontSize != size) {
1106             mMinimumLogicalFontSize = size;
1107             postSync();
1108         }
1109     }
1110 
1111     /**
1112      * Get the minimum logical font size. The default is 8.
1113      * @return A non-negative integer between 1 and 72.
1114      */
getMinimumLogicalFontSize()1115     public synchronized int getMinimumLogicalFontSize() {
1116         return mMinimumLogicalFontSize;
1117     }
1118 
1119     /**
1120      * Set the default font size.
1121      * @param size A non-negative integer between 1 and 72.
1122      * Any number outside the specified range will be pinned.
1123      */
setDefaultFontSize(int size)1124     public synchronized void setDefaultFontSize(int size) {
1125         size = pin(size);
1126         if (mDefaultFontSize != size) {
1127             mDefaultFontSize = size;
1128             postSync();
1129         }
1130     }
1131 
1132     /**
1133      * Get the default font size. The default is 16.
1134      * @return A non-negative integer between 1 and 72.
1135      */
getDefaultFontSize()1136     public synchronized int getDefaultFontSize() {
1137         return mDefaultFontSize;
1138     }
1139 
1140     /**
1141      * Set the default fixed font size.
1142      * @param size A non-negative integer between 1 and 72.
1143      * Any number outside the specified range will be pinned.
1144      */
setDefaultFixedFontSize(int size)1145     public synchronized void setDefaultFixedFontSize(int size) {
1146         size = pin(size);
1147         if (mDefaultFixedFontSize != size) {
1148             mDefaultFixedFontSize = size;
1149             postSync();
1150         }
1151     }
1152 
1153     /**
1154      * Get the default fixed font size. The default is 16.
1155      * @return A non-negative integer between 1 and 72.
1156      */
getDefaultFixedFontSize()1157     public synchronized int getDefaultFixedFontSize() {
1158         return mDefaultFixedFontSize;
1159     }
1160 
1161     /**
1162      * Set the number of pages cached by the WebKit for the history navigation.
1163      * @param size A non-negative integer between 0 (no cache) and 20 (max).
1164      * @hide
1165      */
setPageCacheCapacity(int size)1166     public synchronized void setPageCacheCapacity(int size) {
1167         if (size < 0) size = 0;
1168         if (size > 20) size = 20;
1169         if (mPageCacheCapacity != size) {
1170             mPageCacheCapacity = size;
1171             postSync();
1172         }
1173     }
1174 
1175     /**
1176      * Tell the WebView to load image resources automatically.
1177      * @param flag True if the WebView should load images automatically.
1178      */
setLoadsImagesAutomatically(boolean flag)1179     public synchronized void setLoadsImagesAutomatically(boolean flag) {
1180         if (mLoadsImagesAutomatically != flag) {
1181             mLoadsImagesAutomatically = flag;
1182             postSync();
1183         }
1184     }
1185 
1186     /**
1187      * Return true if the WebView will load image resources automatically.
1188      * The default is true.
1189      * @return True if the WebView loads images automatically.
1190      */
getLoadsImagesAutomatically()1191     public synchronized boolean getLoadsImagesAutomatically() {
1192         return mLoadsImagesAutomatically;
1193     }
1194 
1195     /**
1196      * Tell the WebView to block network images. This is only checked when
1197      * {@link #getLoadsImagesAutomatically} is true. If you set the value to
1198      * false, images will automatically be loaded. Use this api to reduce
1199      * bandwidth only. Use {@link #setBlockNetworkLoads} if possible.
1200      * @param flag True if the WebView should block network images.
1201      * @see #setBlockNetworkLoads
1202      */
setBlockNetworkImage(boolean flag)1203     public synchronized void setBlockNetworkImage(boolean flag) {
1204         if (mBlockNetworkImage != flag) {
1205             mBlockNetworkImage = flag;
1206             postSync();
1207         }
1208     }
1209 
1210     /**
1211      * Return true if the WebView will block network images. The default is
1212      * false.
1213      * @return True if the WebView blocks network images.
1214      */
getBlockNetworkImage()1215     public synchronized boolean getBlockNetworkImage() {
1216         return mBlockNetworkImage;
1217     }
1218 
1219     /**
1220      * Tell the WebView to block all network load requests. If you set the
1221      * value to false, you must call {@link android.webkit.WebView#reload} to
1222      * fetch remote resources. This flag supercedes the value passed to
1223      * {@link #setBlockNetworkImage}.
1224      * @param flag True if the WebView should block all network loads.
1225      * @see android.webkit.WebView#reload
1226      */
setBlockNetworkLoads(boolean flag)1227     public synchronized void setBlockNetworkLoads(boolean flag) {
1228         if (mBlockNetworkLoads != flag) {
1229             mBlockNetworkLoads = flag;
1230             verifyNetworkAccess();
1231             postSync();
1232         }
1233     }
1234 
1235     /**
1236      * Return true if the WebView will block all network loads. The default is
1237      * false.
1238      * @return True if the WebView blocks all network loads.
1239      */
getBlockNetworkLoads()1240     public synchronized boolean getBlockNetworkLoads() {
1241         return mBlockNetworkLoads;
1242     }
1243 
1244 
verifyNetworkAccess()1245     private void verifyNetworkAccess() {
1246         if (!mBlockNetworkLoads) {
1247             if (mContext.checkPermission("android.permission.INTERNET",
1248                     android.os.Process.myPid(), android.os.Process.myUid()) !=
1249                         PackageManager.PERMISSION_GRANTED) {
1250                 throw new SecurityException
1251                         ("Permission denied - " +
1252                                 "application missing INTERNET permission");
1253             }
1254         }
1255     }
1256 
1257     /**
1258      * Tell the WebView to enable javascript execution.
1259      * @param flag True if the WebView should execute javascript.
1260      */
setJavaScriptEnabled(boolean flag)1261     public synchronized void setJavaScriptEnabled(boolean flag) {
1262         if (mJavaScriptEnabled != flag) {
1263             mJavaScriptEnabled = flag;
1264             postSync();
1265         }
1266     }
1267 
1268     /**
1269      * Tell the WebView to use Skia's hardware accelerated rendering path
1270      * @param flag True if the WebView should use Skia's hw-accel path
1271      * @hide
1272      */
setHardwareAccelSkiaEnabled(boolean flag)1273     public synchronized void setHardwareAccelSkiaEnabled(boolean flag) {
1274         if (mHardwareAccelSkia != flag) {
1275             mHardwareAccelSkia = flag;
1276             postSync();
1277         }
1278     }
1279 
1280     /**
1281      * @return True if the WebView is using hardware accelerated skia
1282      * @hide
1283      */
getHardwareAccelSkiaEnabled()1284     public synchronized boolean getHardwareAccelSkiaEnabled() {
1285         return mHardwareAccelSkia;
1286     }
1287 
1288     /**
1289      * Tell the WebView to show the visual indicator
1290      * @param flag True if the WebView should show the visual indicator
1291      * @hide
1292      */
setShowVisualIndicator(boolean flag)1293     public synchronized void setShowVisualIndicator(boolean flag) {
1294         if (mShowVisualIndicator != flag) {
1295             mShowVisualIndicator = flag;
1296             postSync();
1297         }
1298     }
1299 
1300     /**
1301      * @return True if the WebView is showing the visual indicator
1302      * @hide
1303      */
getShowVisualIndicator()1304     public synchronized boolean getShowVisualIndicator() {
1305         return mShowVisualIndicator;
1306     }
1307 
1308     /**
1309      * Tell the WebView to enable plugins.
1310      * @param flag True if the WebView should load plugins.
1311      * @deprecated This method has been deprecated in favor of
1312      *             {@link #setPluginState}
1313      */
1314     @Deprecated
setPluginsEnabled(boolean flag)1315     public synchronized void setPluginsEnabled(boolean flag) {
1316         setPluginState(flag ? PluginState.ON : PluginState.OFF);
1317     }
1318 
1319     /**
1320      * Tell the WebView to enable, disable, or have plugins on demand. On
1321      * demand mode means that if a plugin exists that can handle the embedded
1322      * content, a placeholder icon will be shown instead of the plugin. When
1323      * the placeholder is clicked, the plugin will be enabled.
1324      * @param state One of the PluginState values.
1325      */
setPluginState(PluginState state)1326     public synchronized void setPluginState(PluginState state) {
1327         if (mPluginState != state) {
1328             mPluginState = state;
1329             postSync();
1330         }
1331     }
1332 
1333     /**
1334      * Set a custom path to plugins used by the WebView. This method is
1335      * obsolete since each plugin is now loaded from its own package.
1336      * @param pluginsPath String path to the directory containing plugins.
1337      * @deprecated This method is no longer used as plugins are loaded from
1338      * their own APK via the system's package manager.
1339      */
1340     @Deprecated
setPluginsPath(String pluginsPath)1341     public synchronized void setPluginsPath(String pluginsPath) {
1342     }
1343 
1344     /**
1345      * Set the path to where database storage API databases should be saved.
1346      * Nota that the WebCore Database Tracker only allows the path to be set once.
1347      * This will update WebCore when the Sync runs in the C++ side.
1348      * @param databasePath String path to the directory where databases should
1349      *     be saved. May be the empty string but should never be null.
1350      */
setDatabasePath(String databasePath)1351     public synchronized void setDatabasePath(String databasePath) {
1352         if (databasePath != null && !mDatabasePathHasBeenSet) {
1353             mDatabasePath = databasePath;
1354             mDatabasePathHasBeenSet = true;
1355             postSync();
1356         }
1357     }
1358 
1359     /**
1360      * Set the path where the Geolocation permissions database should be saved.
1361      * This will update WebCore when the Sync runs in the C++ side.
1362      * @param databasePath String path to the directory where the Geolocation
1363      *     permissions database should be saved. May be the empty string but
1364      *     should never be null.
1365      */
setGeolocationDatabasePath(String databasePath)1366     public synchronized void setGeolocationDatabasePath(String databasePath) {
1367         if (databasePath != null
1368                 && !databasePath.equals(mGeolocationDatabasePath)) {
1369             mGeolocationDatabasePath = databasePath;
1370             postSync();
1371         }
1372     }
1373 
1374     /**
1375      * Tell the WebView to enable Application Caches API.
1376      * @param flag True if the WebView should enable Application Caches.
1377      */
setAppCacheEnabled(boolean flag)1378     public synchronized void setAppCacheEnabled(boolean flag) {
1379         if (mAppCacheEnabled != flag) {
1380             mAppCacheEnabled = flag;
1381             postSync();
1382         }
1383     }
1384 
1385     /**
1386      * Set a custom path to the Application Caches files. The client
1387      * must ensure it exists before this call.
1388      * @param appCachePath String path to the directory containing Application
1389      * Caches files. The appCache path can be the empty string but should not
1390      * be null. Passing null for this parameter will result in a no-op.
1391      */
setAppCachePath(String appCachePath)1392     public synchronized void setAppCachePath(String appCachePath) {
1393         if (appCachePath != null && !appCachePath.equals(mAppCachePath)) {
1394             mAppCachePath = appCachePath;
1395             postSync();
1396         }
1397     }
1398 
1399     /**
1400      * Set the maximum size for the Application Caches content.
1401      * @param appCacheMaxSize the maximum size in bytes.
1402      */
setAppCacheMaxSize(long appCacheMaxSize)1403     public synchronized void setAppCacheMaxSize(long appCacheMaxSize) {
1404         if (appCacheMaxSize != mAppCacheMaxSize) {
1405             mAppCacheMaxSize = appCacheMaxSize;
1406             postSync();
1407         }
1408     }
1409 
1410     /**
1411      * Set whether the database storage API is enabled.
1412      * @param flag boolean True if the WebView should use the database storage
1413      *     API.
1414      */
setDatabaseEnabled(boolean flag)1415     public synchronized void setDatabaseEnabled(boolean flag) {
1416        if (mDatabaseEnabled != flag) {
1417            mDatabaseEnabled = flag;
1418            postSync();
1419        }
1420     }
1421 
1422     /**
1423      * Set whether the DOM storage API is enabled.
1424      * @param flag boolean True if the WebView should use the DOM storage
1425      *     API.
1426      */
setDomStorageEnabled(boolean flag)1427     public synchronized void setDomStorageEnabled(boolean flag) {
1428        if (mDomStorageEnabled != flag) {
1429            mDomStorageEnabled = flag;
1430            postSync();
1431        }
1432     }
1433 
1434     /**
1435      * Returns true if the DOM Storage API's are enabled.
1436      * @return True if the DOM Storage API's are enabled.
1437      */
getDomStorageEnabled()1438     public synchronized boolean getDomStorageEnabled() {
1439        return mDomStorageEnabled;
1440     }
1441 
1442     /**
1443      * Return the path to where database storage API databases are saved for
1444      * the current WebView.
1445      * @return the String path to the database storage API databases.
1446      */
getDatabasePath()1447     public synchronized String getDatabasePath() {
1448         return mDatabasePath;
1449     }
1450 
1451     /**
1452      * Returns true if database storage API is enabled.
1453      * @return True if the database storage API is enabled.
1454      */
getDatabaseEnabled()1455     public synchronized boolean getDatabaseEnabled() {
1456         return mDatabaseEnabled;
1457     }
1458 
1459     /**
1460      * Tell the WebView to enable WebWorkers API.
1461      * @param flag True if the WebView should enable WebWorkers.
1462      * Note that this flag only affects V8. JSC does not have
1463      * an equivalent setting.
1464      * @hide pending api council approval
1465      */
setWorkersEnabled(boolean flag)1466     public synchronized void setWorkersEnabled(boolean flag) {
1467         if (mWorkersEnabled != flag) {
1468             mWorkersEnabled = flag;
1469             postSync();
1470         }
1471     }
1472 
1473     /**
1474      * Sets whether Geolocation is enabled.
1475      * @param flag Whether Geolocation should be enabled.
1476      */
setGeolocationEnabled(boolean flag)1477     public synchronized void setGeolocationEnabled(boolean flag) {
1478         if (mGeolocationEnabled != flag) {
1479             mGeolocationEnabled = flag;
1480             postSync();
1481         }
1482     }
1483 
1484     /**
1485      * Sets whether XSS Auditor is enabled.
1486      * @param flag Whether XSS Auditor should be enabled.
1487      * @hide Only used by LayoutTestController.
1488      */
setXSSAuditorEnabled(boolean flag)1489     public synchronized void setXSSAuditorEnabled(boolean flag) {
1490         if (mXSSAuditorEnabled != flag) {
1491             mXSSAuditorEnabled = flag;
1492             postSync();
1493         }
1494     }
1495 
1496     /**
1497      * Return true if javascript is enabled. <b>Note: The default is false.</b>
1498      * @return True if javascript is enabled.
1499      */
getJavaScriptEnabled()1500     public synchronized boolean getJavaScriptEnabled() {
1501         return mJavaScriptEnabled;
1502     }
1503 
1504     /**
1505      * Return true if plugins are enabled.
1506      * @return True if plugins are enabled.
1507      * @deprecated This method has been replaced by {@link #getPluginState}
1508      */
1509     @Deprecated
getPluginsEnabled()1510     public synchronized boolean getPluginsEnabled() {
1511         return mPluginState == PluginState.ON;
1512     }
1513 
1514     /**
1515      * Return the current plugin state.
1516      * @return A value corresponding to the enum PluginState.
1517      */
getPluginState()1518     public synchronized PluginState getPluginState() {
1519         return mPluginState;
1520     }
1521 
1522     /**
1523      * Returns the directory that contains the plugin libraries. This method is
1524      * obsolete since each plugin is now loaded from its own package.
1525      * @return An empty string.
1526      * @deprecated This method is no longer used as plugins are loaded from
1527      * their own APK via the system's package manager.
1528      */
1529     @Deprecated
getPluginsPath()1530     public synchronized String getPluginsPath() {
1531         return "";
1532     }
1533 
1534     /**
1535      * Tell javascript to open windows automatically. This applies to the
1536      * javascript function window.open().
1537      * @param flag True if javascript can open windows automatically.
1538      */
setJavaScriptCanOpenWindowsAutomatically( boolean flag)1539     public synchronized void setJavaScriptCanOpenWindowsAutomatically(
1540             boolean flag) {
1541         if (mJavaScriptCanOpenWindowsAutomatically != flag) {
1542             mJavaScriptCanOpenWindowsAutomatically = flag;
1543             postSync();
1544         }
1545     }
1546 
1547     /**
1548      * Return true if javascript can open windows automatically. The default
1549      * is false.
1550      * @return True if javascript can open windows automatically during
1551      *         window.open().
1552      */
getJavaScriptCanOpenWindowsAutomatically()1553     public synchronized boolean getJavaScriptCanOpenWindowsAutomatically() {
1554         return mJavaScriptCanOpenWindowsAutomatically;
1555     }
1556 
1557     /**
1558      * Set the default text encoding name to use when decoding html pages.
1559      * @param encoding The text encoding name.
1560      */
setDefaultTextEncodingName(String encoding)1561     public synchronized void setDefaultTextEncodingName(String encoding) {
1562         if (encoding != null && !encoding.equals(mDefaultTextEncoding)) {
1563             mDefaultTextEncoding = encoding;
1564             postSync();
1565         }
1566     }
1567 
1568     /**
1569      * Get the default text encoding name. The default is "Latin-1".
1570      * @return The default text encoding name as a string.
1571      */
getDefaultTextEncodingName()1572     public synchronized String getDefaultTextEncodingName() {
1573         return mDefaultTextEncoding;
1574     }
1575 
1576     /**
1577      * Set the WebView's user-agent string. If the string "ua" is null or empty,
1578      * it will use the system default user-agent string.
1579      */
setUserAgentString(String ua)1580     public synchronized void setUserAgentString(String ua) {
1581         if (ua == null || ua.length() == 0) {
1582             synchronized(sLockForLocaleSettings) {
1583                 Locale currentLocale = Locale.getDefault();
1584                 if (!sLocale.equals(currentLocale)) {
1585                     sLocale = currentLocale;
1586                     mAcceptLanguage = getCurrentAcceptLanguage();
1587                 }
1588             }
1589             ua = getCurrentUserAgent();
1590             mUseDefaultUserAgent = true;
1591         } else  {
1592             mUseDefaultUserAgent = false;
1593         }
1594 
1595         if (!ua.equals(mUserAgent)) {
1596             mUserAgent = ua;
1597             postSync();
1598         }
1599     }
1600 
1601     /**
1602      * Return the WebView's user-agent string.
1603      */
getUserAgentString()1604     public synchronized String getUserAgentString() {
1605         if (DESKTOP_USERAGENT.equals(mUserAgent) ||
1606                 IPHONE_USERAGENT.equals(mUserAgent) ||
1607                 !mUseDefaultUserAgent) {
1608             return mUserAgent;
1609         }
1610 
1611         boolean doPostSync = false;
1612         synchronized(sLockForLocaleSettings) {
1613             Locale currentLocale = Locale.getDefault();
1614             if (!sLocale.equals(currentLocale)) {
1615                 sLocale = currentLocale;
1616                 mUserAgent = getCurrentUserAgent();
1617                 mAcceptLanguage = getCurrentAcceptLanguage();
1618                 doPostSync = true;
1619             }
1620         }
1621         if (doPostSync) {
1622             postSync();
1623         }
1624         return mUserAgent;
1625     }
1626 
1627     /* package api to grab the Accept Language string. */
getAcceptLanguage()1628     /*package*/ synchronized String getAcceptLanguage() {
1629         synchronized(sLockForLocaleSettings) {
1630             Locale currentLocale = Locale.getDefault();
1631             if (!sLocale.equals(currentLocale)) {
1632                 sLocale = currentLocale;
1633                 mAcceptLanguage = getCurrentAcceptLanguage();
1634             }
1635         }
1636         return mAcceptLanguage;
1637     }
1638 
isNarrowColumnLayout()1639     /* package */ boolean isNarrowColumnLayout() {
1640         return getLayoutAlgorithm() == LayoutAlgorithm.NARROW_COLUMNS;
1641     }
1642 
1643     /**
1644      * Tell the WebView whether it needs to set a node to have focus when
1645      * {@link WebView#requestFocus(int, android.graphics.Rect)} is called.
1646      *
1647      * @param flag
1648      */
setNeedInitialFocus(boolean flag)1649     public void setNeedInitialFocus(boolean flag) {
1650         if (mNeedInitialFocus != flag) {
1651             mNeedInitialFocus = flag;
1652         }
1653     }
1654 
1655     /* Package api to get the choice whether it needs to set initial focus. */
getNeedInitialFocus()1656     /* package */ boolean getNeedInitialFocus() {
1657         return mNeedInitialFocus;
1658     }
1659 
1660     /**
1661      * Set the priority of the Render thread. Unlike the other settings, this
1662      * one only needs to be called once per process. The default is NORMAL.
1663      *
1664      * @param priority RenderPriority, can be normal, high or low.
1665      */
setRenderPriority(RenderPriority priority)1666     public synchronized void setRenderPriority(RenderPriority priority) {
1667         if (mRenderPriority != priority) {
1668             mRenderPriority = priority;
1669             mEventHandler.sendMessage(Message.obtain(null,
1670                     EventHandler.PRIORITY));
1671         }
1672     }
1673 
1674     /**
1675      * Override the way the cache is used. The way the cache is used is based
1676      * on the navigation option. For a normal page load, the cache is checked
1677      * and content is re-validated as needed. When navigating back, content is
1678      * not revalidated, instead the content is just pulled from the cache.
1679      * This function allows the client to override this behavior.
1680      * @param mode One of the LOAD_ values.
1681      */
setCacheMode(int mode)1682     public void setCacheMode(int mode) {
1683         if (mode != mOverrideCacheMode) {
1684             mOverrideCacheMode = mode;
1685             postSync();
1686         }
1687     }
1688 
1689     /**
1690      * Return the current setting for overriding the cache mode. For a full
1691      * description, see the {@link #setCacheMode(int)} function.
1692      */
getCacheMode()1693     public int getCacheMode() {
1694         return mOverrideCacheMode;
1695     }
1696 
1697     /**
1698      * If set, webkit alternately shrinks and expands images viewed outside
1699      * of an HTML page to fit the screen. This conflicts with attempts by
1700      * the UI to zoom in and out of an image, so it is set false by default.
1701      * @param shrink Set true to let webkit shrink the standalone image to fit.
1702      * {@hide}
1703      */
setShrinksStandaloneImagesToFit(boolean shrink)1704     public void setShrinksStandaloneImagesToFit(boolean shrink) {
1705         if (mShrinksStandaloneImagesToFit != shrink) {
1706             mShrinksStandaloneImagesToFit = shrink;
1707             postSync();
1708         }
1709      }
1710 
1711     /**
1712      * Specify the maximum decoded image size. The default is
1713      * 2 megs for small memory devices and 8 megs for large memory devices.
1714      * @param size The maximum decoded size, or zero to set to the default.
1715      * @hide pending api council approval
1716      */
setMaximumDecodedImageSize(long size)1717     public void setMaximumDecodedImageSize(long size) {
1718         if (mMaximumDecodedImageSize != size) {
1719             mMaximumDecodedImageSize = size;
1720             postSync();
1721         }
1722     }
1723 
1724     /**
1725      * Returns whether to use fixed viewport.  Use fixed viewport
1726      * whenever wide viewport is on.
1727      */
getUseFixedViewport()1728     /* package */ boolean getUseFixedViewport() {
1729         return getUseWideViewPort();
1730     }
1731 
1732     /**
1733      * Returns whether private browsing is enabled.
1734      */
isPrivateBrowsingEnabled()1735     /* package */ boolean isPrivateBrowsingEnabled() {
1736         return mPrivateBrowsingEnabled;
1737     }
1738 
1739     /**
1740      * Sets whether private browsing is enabled.
1741      * @param flag Whether private browsing should be enabled.
1742      */
setPrivateBrowsingEnabled(boolean flag)1743     /* package */ synchronized void setPrivateBrowsingEnabled(boolean flag) {
1744         if (mPrivateBrowsingEnabled != flag) {
1745             mPrivateBrowsingEnabled = flag;
1746 
1747             // AutoFill is dependant on private browsing being enabled so
1748             // reset it to take account of the new value of mPrivateBrowsingEnabled.
1749             setAutoFillEnabled(mAutoFillEnabled);
1750 
1751             postSync();
1752         }
1753     }
1754 
1755     /**
1756      * Returns whether the viewport metatag can disable zooming
1757      * @hide
1758      */
forceUserScalable()1759     public boolean forceUserScalable() {
1760         return mForceUserScalable;
1761     }
1762 
1763     /**
1764      * Sets whether viewport metatag can disable zooming.
1765      * @param flag Whether or not to forceably enable user scalable.
1766      * @hide
1767      */
setForceUserScalable(boolean flag)1768     public synchronized void setForceUserScalable(boolean flag) {
1769         mForceUserScalable = flag;
1770     }
1771 
setSyntheticLinksEnabled(boolean flag)1772     synchronized void setSyntheticLinksEnabled(boolean flag) {
1773         if (mSyntheticLinksEnabled != flag) {
1774             mSyntheticLinksEnabled = flag;
1775             postSync();
1776         }
1777     }
1778 
1779     /**
1780      * @hide
1781      */
setAutoFillEnabled(boolean enabled)1782     public synchronized void setAutoFillEnabled(boolean enabled) {
1783         // AutoFill is always disabled in private browsing mode.
1784         boolean autoFillEnabled = enabled && !mPrivateBrowsingEnabled;
1785         if (mAutoFillEnabled != autoFillEnabled) {
1786             mAutoFillEnabled = autoFillEnabled;
1787             postSync();
1788         }
1789     }
1790 
1791     /**
1792      * @hide
1793      */
getAutoFillEnabled()1794     public synchronized boolean getAutoFillEnabled() {
1795         return mAutoFillEnabled;
1796     }
1797 
1798     /**
1799      * @hide
1800      */
setAutoFillProfile(AutoFillProfile profile)1801     public synchronized void setAutoFillProfile(AutoFillProfile profile) {
1802         if (mAutoFillProfile != profile) {
1803             mAutoFillProfile = profile;
1804             postSync();
1805         }
1806     }
1807 
1808     /**
1809      * @hide
1810      */
getAutoFillProfile()1811     public synchronized AutoFillProfile getAutoFillProfile() {
1812         return mAutoFillProfile;
1813     }
1814 
getDoubleTapToastCount()1815     int getDoubleTapToastCount() {
1816         return mDoubleTapToastCount;
1817     }
1818 
setDoubleTapToastCount(int count)1819     void setDoubleTapToastCount(int count) {
1820         if (mDoubleTapToastCount != count) {
1821             mDoubleTapToastCount = count;
1822             // write the settings in the non-UI thread
1823             mEventHandler.sendMessage(Message.obtain(null,
1824                     EventHandler.SET_DOUBLE_TAP_TOAST_COUNT));
1825         }
1826     }
1827 
1828     /**
1829      * @hide
1830      */
setProperty(String key, String value)1831     public void setProperty(String key, String value) {
1832         if (mWebView.nativeSetProperty(key, value)) {
1833             mWebView.contentInvalidateAll();
1834         }
1835     }
1836 
1837     /**
1838      * @hide
1839      */
getProperty(String key)1840     public String getProperty(String key) {
1841         return mWebView.nativeGetProperty(key);
1842     }
1843 
1844     /**
1845      * Transfer messages from the queue to the new WebCoreThread. Called from
1846      * WebCore thread.
1847      */
1848     /*package*/
syncSettingsAndCreateHandler(BrowserFrame frame)1849     synchronized void syncSettingsAndCreateHandler(BrowserFrame frame) {
1850         mBrowserFrame = frame;
1851         if (DebugFlags.WEB_SETTINGS) {
1852             junit.framework.Assert.assertTrue(frame.mNativeFrame != 0);
1853         }
1854 
1855         SharedPreferences sp = mContext.getSharedPreferences(PREF_FILE,
1856                 Context.MODE_PRIVATE);
1857         if (mDoubleTapToastCount > 0) {
1858             mDoubleTapToastCount = sp.getInt(DOUBLE_TAP_TOAST_COUNT,
1859                     mDoubleTapToastCount);
1860         }
1861         nativeSync(frame.mNativeFrame);
1862         mSyncPending = false;
1863         mEventHandler.createHandler();
1864     }
1865 
1866     /**
1867      * Let the Settings object know that our owner is being destroyed.
1868      */
1869     /*package*/
onDestroyed()1870     synchronized void onDestroyed() {
1871     }
1872 
pin(int size)1873     private int pin(int size) {
1874         // FIXME: 72 is just an arbitrary max text size value.
1875         if (size < 1) {
1876             return 1;
1877         } else if (size > 72) {
1878             return 72;
1879         }
1880         return size;
1881     }
1882 
1883     /* Post a SYNC message to handle syncing the native settings. */
postSync()1884     private synchronized void postSync() {
1885         // Only post if a sync is not pending
1886         if (!mSyncPending) {
1887             mSyncPending = mEventHandler.sendMessage(
1888                     Message.obtain(null, EventHandler.SYNC));
1889         }
1890     }
1891 
1892     // Synchronize the native and java settings.
nativeSync(int nativeFrame)1893     private native void nativeSync(int nativeFrame);
1894 }
1895