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.annotation.IntDef;
20 import android.annotation.Nullable;
21 import android.annotation.SystemApi;
22 import android.content.Context;
23 
24 import java.lang.annotation.ElementType;
25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 import java.lang.annotation.Target;
28 
29 /**
30  * Manages settings state for a WebView. When a WebView is first created, it
31  * obtains a set of default settings. These default settings will be returned
32  * from any getter call. A {@code WebSettings} object obtained from
33  * {@link WebView#getSettings()} is tied to the life of the WebView. If a WebView has
34  * been destroyed, any method call on {@code WebSettings} will throw an
35  * {@link IllegalStateException}.
36  */
37 // This is an abstract base class: concrete WebViewProviders must
38 // create a class derived from this, and return an instance of it in the
39 // WebViewProvider.getWebSettingsProvider() method implementation.
40 public abstract class WebSettings {
41     /**
42      * Enum for controlling the layout of html.
43      * <ul>
44      *   <li>{@code NORMAL} means no rendering changes. This is the recommended choice for maximum
45      *       compatibility across different platforms and Android versions.</li>
46      *   <li>{@code SINGLE_COLUMN} moves all content into one column that is the width of the
47      *       view.</li>
48      *   <li>{@code NARROW_COLUMNS} makes all columns no wider than the screen if possible. Only use
49      *       this for API levels prior to {@link android.os.Build.VERSION_CODES#KITKAT}.</li>
50      *   <li>{@code TEXT_AUTOSIZING} boosts font size of paragraphs based on heuristics to make
51      *       the text readable when viewing a wide-viewport layout in the overview mode.
52      *       It is recommended to enable zoom support {@link #setSupportZoom} when
53      *       using this mode. Supported from API level
54      *       {@link android.os.Build.VERSION_CODES#KITKAT}</li>
55      * </ul>
56      */
57     // XXX: These must match LayoutAlgorithm in Settings.h in WebCore.
58     public enum LayoutAlgorithm {
59         NORMAL,
60         /**
61          * @deprecated This algorithm is now obsolete.
62          */
63         @Deprecated
64         SINGLE_COLUMN,
65         /**
66          * @deprecated This algorithm is now obsolete.
67          */
68         @Deprecated
69         NARROW_COLUMNS,
70         TEXT_AUTOSIZING
71     }
72 
73     /**
74      * Enum for specifying the text size.
75      * <ul>
76      *   <li>SMALLEST is 50%</li>
77      *   <li>SMALLER is 75%</li>
78      *   <li>NORMAL is 100%</li>
79      *   <li>LARGER is 150%</li>
80      *   <li>LARGEST is 200%</li>
81      * </ul>
82      *
83      * @deprecated Use {@link WebSettings#setTextZoom(int)} and {@link WebSettings#getTextZoom()} instead.
84      */
85     @Deprecated
86     public enum TextSize {
87         SMALLEST(50),
88         SMALLER(75),
89         NORMAL(100),
90         LARGER(150),
91         LARGEST(200);
TextSize(int size)92         TextSize(int size) {
93             value = size;
94         }
95         int value;
96     }
97 
98     /**
99      * Enum for specifying the WebView's desired density.
100      * <ul>
101      *   <li>{@code FAR} makes 100% looking like in 240dpi</li>
102      *   <li>{@code MEDIUM} makes 100% looking like in 160dpi</li>
103      *   <li>{@code CLOSE} makes 100% looking like in 120dpi</li>
104      * </ul>
105      */
106     public enum ZoomDensity {
107         FAR(150),      // 240dpi
108         MEDIUM(100),    // 160dpi
109         CLOSE(75);     // 120dpi
ZoomDensity(int size)110         ZoomDensity(int size) {
111             value = size;
112         }
113 
114         /**
115          * @hide Only for use by WebViewProvider implementations
116          */
getValue()117         public int getValue() {
118             return value;
119         }
120 
121         int value;
122     }
123 
124     /** @hide */
125     @IntDef(prefix = { "LOAD_" }, value = {
126             LOAD_DEFAULT,
127             LOAD_NORMAL,
128             LOAD_CACHE_ELSE_NETWORK,
129             LOAD_NO_CACHE,
130             LOAD_CACHE_ONLY
131     })
132     @Retention(RetentionPolicy.SOURCE)
133     public @interface CacheMode {}
134 
135     /**
136      * Default cache usage mode. If the navigation type doesn't impose any
137      * specific behavior, use cached resources when they are available
138      * and not expired, otherwise load resources from the network.
139      * Use with {@link #setCacheMode}.
140      */
141     public static final int LOAD_DEFAULT = -1;
142 
143     /**
144      * Normal cache usage mode. Use with {@link #setCacheMode}.
145      *
146      * @deprecated This value is obsolete, as from API level
147      * {@link android.os.Build.VERSION_CODES#HONEYCOMB} and onwards it has the
148      * same effect as {@link #LOAD_DEFAULT}.
149      */
150     @Deprecated
151     public static final int LOAD_NORMAL = 0;
152 
153     /**
154      * Use cached resources when they are available, even if they have expired.
155      * Otherwise load resources from the network.
156      * Use with {@link #setCacheMode}.
157      */
158     public static final int LOAD_CACHE_ELSE_NETWORK = 1;
159 
160     /**
161      * Don't use the cache, load from the network.
162      * Use with {@link #setCacheMode}.
163      */
164     public static final int LOAD_NO_CACHE = 2;
165 
166     /**
167      * Don't use the network, load from the cache.
168      * Use with {@link #setCacheMode}.
169      */
170     public static final int LOAD_CACHE_ONLY = 3;
171 
172     public enum RenderPriority {
173         NORMAL,
174         HIGH,
175         LOW
176     }
177 
178     /**
179      * The plugin state effects how plugins are treated on a page. ON means
180      * that any object will be loaded even if a plugin does not exist to handle
181      * the content. ON_DEMAND means that if there is a plugin installed that
182      * can handle the content, a placeholder is shown until the user clicks on
183      * the placeholder. Once clicked, the plugin will be enabled on the page.
184      * OFF means that all plugins will be turned off and any fallback content
185      * will be used.
186      */
187     public enum PluginState {
188         ON,
189         ON_DEMAND,
190         OFF
191     }
192 
193     /**
194      * Used with {@link #setMixedContentMode}
195      *
196      * In this mode, the WebView will allow a secure origin to load content from any other origin,
197      * even if that origin is insecure. This is the least secure mode of operation for the WebView,
198      * and where possible apps should not set this mode.
199      */
200     public static final int MIXED_CONTENT_ALWAYS_ALLOW = 0;
201 
202     /**
203      * Used with {@link #setMixedContentMode}
204      *
205      * In this mode, the WebView will not allow a secure origin to load content from an insecure
206      * origin. This is the preferred and most secure mode of operation for the WebView and apps are
207      * strongly advised to use this mode.
208      */
209     public static final int MIXED_CONTENT_NEVER_ALLOW = 1;
210 
211     /**
212      * Used with {@link #setMixedContentMode}
213      *
214      * In this mode, the WebView will attempt to be compatible with the approach of a modern web
215      * browser with regard to mixed content. Some insecure content may be allowed to be loaded by
216      * a secure origin and other types of content will be blocked. The types of content are allowed
217      * or blocked may change release to release and are not explicitly defined.
218      *
219      * This mode is intended to be used by apps that are not in control of the content that they
220      * render but desire to operate in a reasonably secure environment. For highest security, apps
221      * are recommended to use {@link #MIXED_CONTENT_NEVER_ALLOW}.
222      */
223     public static final int MIXED_CONTENT_COMPATIBILITY_MODE = 2;
224 
225     /**
226      * Enables dumping the pages navigation cache to a text file. The default
227      * is {@code false}.
228      *
229      * @deprecated This method is now obsolete.
230      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
231      */
232     @SystemApi
233     @Deprecated
setNavDump(boolean enabled)234     public abstract void setNavDump(boolean enabled);
235 
236     /**
237      * Gets whether dumping the navigation cache is enabled.
238      *
239      * @return whether dumping the navigation cache is enabled
240      * @see #setNavDump
241      * @deprecated This method is now obsolete.
242      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
243      */
244     @SystemApi
245     @Deprecated
getNavDump()246     public abstract boolean getNavDump();
247 
248     /**
249      * Sets whether the WebView should support zooming using its on-screen zoom
250      * controls and gestures. The particular zoom mechanisms that should be used
251      * can be set with {@link #setBuiltInZoomControls}. This setting does not
252      * affect zooming performed using the {@link WebView#zoomIn()} and
253      * {@link WebView#zoomOut()} methods. The default is {@code true}.
254      *
255      * @param support whether the WebView should support zoom
256      */
setSupportZoom(boolean support)257     public abstract void setSupportZoom(boolean support);
258 
259     /**
260      * Gets whether the WebView supports zoom.
261      *
262      * @return {@code true} if the WebView supports zoom
263      * @see #setSupportZoom
264      */
supportZoom()265     public abstract boolean supportZoom();
266 
267     /**
268      * Sets whether the WebView requires a user gesture to play media.
269      * The default is {@code true}.
270      *
271      * @param require whether the WebView requires a user gesture to play media
272      */
setMediaPlaybackRequiresUserGesture(boolean require)273     public abstract void setMediaPlaybackRequiresUserGesture(boolean require);
274 
275     /**
276      * Gets whether the WebView requires a user gesture to play media.
277      *
278      * @return {@code true} if the WebView requires a user gesture to play media
279      * @see #setMediaPlaybackRequiresUserGesture
280      */
getMediaPlaybackRequiresUserGesture()281     public abstract boolean getMediaPlaybackRequiresUserGesture();
282 
283     /**
284      * Sets whether the WebView should use its built-in zoom mechanisms. The
285      * built-in zoom mechanisms comprise on-screen zoom controls, which are
286      * displayed over the WebView's content, and the use of a pinch gesture to
287      * control zooming. Whether or not these on-screen controls are displayed
288      * can be set with {@link #setDisplayZoomControls}. The default is {@code false}.
289      * <p>
290      * The built-in mechanisms are the only currently supported zoom
291      * mechanisms, so it is recommended that this setting is always enabled.
292      *
293      * @param enabled whether the WebView should use its built-in zoom mechanisms
294      */
295     // This method was intended to select between the built-in zoom mechanisms
296     // and the separate zoom controls. The latter were obtained using
297     // {@link WebView#getZoomControls}, which is now hidden.
setBuiltInZoomControls(boolean enabled)298     public abstract void setBuiltInZoomControls(boolean enabled);
299 
300     /**
301      * Gets whether the zoom mechanisms built into WebView are being used.
302      *
303      * @return {@code true} if the zoom mechanisms built into WebView are being used
304      * @see #setBuiltInZoomControls
305      */
getBuiltInZoomControls()306     public abstract boolean getBuiltInZoomControls();
307 
308     /**
309      * Sets whether the WebView should display on-screen zoom controls when
310      * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
311      * The default is {@code true}.
312      *
313      * @param enabled whether the WebView should display on-screen zoom controls
314      */
setDisplayZoomControls(boolean enabled)315     public abstract void setDisplayZoomControls(boolean enabled);
316 
317     /**
318      * Gets whether the WebView displays on-screen zoom controls when using
319      * the built-in zoom mechanisms.
320      *
321      * @return {@code true} if the WebView displays on-screen zoom controls when using
322      *         the built-in zoom mechanisms
323      * @see #setDisplayZoomControls
324      */
getDisplayZoomControls()325     public abstract boolean getDisplayZoomControls();
326 
327     /**
328      * Enables or disables file access within WebView. File access is enabled by
329      * default.  Note that this enables or disables file system access only.
330      * Assets and resources are still accessible using file:///android_asset and
331      * file:///android_res.
332      */
setAllowFileAccess(boolean allow)333     public abstract void setAllowFileAccess(boolean allow);
334 
335     /**
336      * Gets whether this WebView supports file access.
337      *
338      * @see #setAllowFileAccess
339      */
getAllowFileAccess()340     public abstract boolean getAllowFileAccess();
341 
342     /**
343      * Enables or disables content URL access within WebView.  Content URL
344      * access allows WebView to load content from a content provider installed
345      * in the system. The default is enabled.
346      */
setAllowContentAccess(boolean allow)347     public abstract void setAllowContentAccess(boolean allow);
348 
349     /**
350      * Gets whether this WebView supports content URL access.
351      *
352      * @see #setAllowContentAccess
353      */
getAllowContentAccess()354     public abstract boolean getAllowContentAccess();
355 
356     /**
357      * Sets whether the WebView loads pages in overview mode, that is,
358      * zooms out the content to fit on screen by width. This setting is
359      * taken into account when the content width is greater than the width
360      * of the WebView control, for example, when {@link #getUseWideViewPort}
361      * is enabled. The default is {@code false}.
362      */
setLoadWithOverviewMode(boolean overview)363     public abstract void setLoadWithOverviewMode(boolean overview);
364 
365     /**
366      * Gets whether this WebView loads pages in overview mode.
367      *
368      * @return whether this WebView loads pages in overview mode
369      * @see #setLoadWithOverviewMode
370      */
getLoadWithOverviewMode()371     public abstract boolean getLoadWithOverviewMode();
372 
373     /**
374      * Sets whether the WebView will enable smooth transition while panning or
375      * zooming or while the window hosting the WebView does not have focus.
376      * If it is {@code true}, WebView will choose a solution to maximize the performance.
377      * e.g. the WebView's content may not be updated during the transition.
378      * If it is false, WebView will keep its fidelity. The default value is {@code false}.
379      *
380      * @deprecated This method is now obsolete, and will become a no-op in future.
381      */
382     @Deprecated
setEnableSmoothTransition(boolean enable)383     public abstract void setEnableSmoothTransition(boolean enable);
384 
385     /**
386      * Gets whether the WebView enables smooth transition while panning or
387      * zooming.
388      *
389      * @see #setEnableSmoothTransition
390      *
391      * @deprecated This method is now obsolete, and will become a no-op in future.
392      */
393     @Deprecated
enableSmoothTransition()394     public abstract  boolean enableSmoothTransition();
395 
396     /**
397      * Sets whether the WebView uses its background for over scroll background.
398      * If {@code true}, it will use the WebView's background. If {@code false}, it will use an
399      * internal pattern. Default is {@code true}.
400      *
401      * @deprecated This method is now obsolete.
402      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
403      */
404     @SystemApi
405     @Deprecated
setUseWebViewBackgroundForOverscrollBackground(boolean view)406     public abstract  void setUseWebViewBackgroundForOverscrollBackground(boolean view);
407 
408     /**
409      * Gets whether this WebView uses WebView's background instead of
410      * internal pattern for over scroll background.
411      *
412      * @see #setUseWebViewBackgroundForOverscrollBackground
413      * @deprecated This method is now obsolete.
414      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
415      */
416     @SystemApi
417     @Deprecated
getUseWebViewBackgroundForOverscrollBackground()418     public abstract  boolean getUseWebViewBackgroundForOverscrollBackground();
419 
420     /**
421      * Sets whether the WebView should save form data. In Android O, the
422      * platform has implemented a fully functional Autofill feature to store
423      * form data. Therefore, the Webview form data save feature is disabled.
424      *
425      * Note that the feature will continue to be supported on older versions of
426      * Android as before.
427      *
428      * This function does not have any effect.
429      */
430     @Deprecated
setSaveFormData(boolean save)431     public abstract  void setSaveFormData(boolean save);
432 
433     /**
434      * Gets whether the WebView saves form data.
435      *
436      * @return whether the WebView saves form data
437      * @see #setSaveFormData
438      */
439     @Deprecated
getSaveFormData()440     public abstract boolean getSaveFormData();
441 
442     /**
443      * Sets whether the WebView should save passwords. The default is {@code true}.
444      * @deprecated Saving passwords in WebView will not be supported in future versions.
445      */
446     @Deprecated
setSavePassword(boolean save)447     public abstract void setSavePassword(boolean save);
448 
449     /**
450      * Gets whether the WebView saves passwords.
451      *
452      * @return whether the WebView saves passwords
453      * @see #setSavePassword
454      * @deprecated Saving passwords in WebView will not be supported in future versions.
455      */
456     @Deprecated
getSavePassword()457     public abstract boolean getSavePassword();
458 
459     /**
460      * Sets the text zoom of the page in percent. The default is 100.
461      *
462      * @param textZoom the text zoom in percent
463      */
setTextZoom(int textZoom)464     public abstract void setTextZoom(int textZoom);
465 
466     /**
467      * Gets the text zoom of the page in percent.
468      *
469      * @return the text zoom of the page in percent
470      * @see #setTextZoom
471      */
getTextZoom()472     public abstract int getTextZoom();
473 
474     /**
475      * Sets policy for third party cookies.
476      * Developers should access this via {@link CookieManager#setShouldAcceptThirdPartyCookies}.
477      * @hide Internal API.
478      */
479     @SystemApi
setAcceptThirdPartyCookies(boolean accept)480     public abstract void setAcceptThirdPartyCookies(boolean accept);
481 
482     /**
483      * Gets policy for third party cookies.
484      * Developers should access this via {@link CookieManager#getShouldAcceptThirdPartyCookies}.
485      * @hide Internal API
486      */
487     @SystemApi
getAcceptThirdPartyCookies()488     public abstract boolean getAcceptThirdPartyCookies();
489 
490     /**
491      * Sets the text size of the page. The default is {@link TextSize#NORMAL}.
492      *
493      * @param t the text size as a {@link TextSize} value
494      * @deprecated Use {@link #setTextZoom} instead.
495      */
496     @Deprecated
setTextSize(TextSize t)497     public synchronized void setTextSize(TextSize t) {
498         setTextZoom(t.value);
499     }
500 
501     /**
502      * Gets the text size of the page. If the text size was previously specified
503      * in percent using {@link #setTextZoom}, this will return the closest
504      * matching {@link TextSize}.
505      *
506      * @return the text size as a {@link TextSize} value
507      * @see #setTextSize
508      * @deprecated Use {@link #getTextZoom} instead.
509      */
510     @Deprecated
getTextSize()511     public synchronized TextSize getTextSize() {
512         TextSize closestSize = null;
513         int smallestDelta = Integer.MAX_VALUE;
514         int textSize = getTextZoom();
515         for (TextSize size : TextSize.values()) {
516             int delta = Math.abs(textSize - size.value);
517             if (delta == 0) {
518                 return size;
519             }
520             if (delta < smallestDelta) {
521                 smallestDelta = delta;
522                 closestSize = size;
523             }
524         }
525         return closestSize != null ? closestSize : TextSize.NORMAL;
526     }
527 
528     /**
529      * Sets the default zoom density of the page. This must be called from the UI
530      * thread. The default is {@link ZoomDensity#MEDIUM}.
531      *
532      * This setting is not recommended for use in new applications.  If the WebView
533      * is utilized to display mobile-oriented pages, the desired effect can be achieved by
534      * adjusting 'width' and 'initial-scale' attributes of page's 'meta viewport'
535      * tag. For pages lacking the tag, {@link android.webkit.WebView#setInitialScale}
536      * and {@link #setUseWideViewPort} can be used.
537      *
538      * @param zoom the zoom density
539      * @deprecated This method is no longer supported, see the function documentation for
540      *             recommended alternatives.
541      */
542     @Deprecated
setDefaultZoom(ZoomDensity zoom)543     public abstract void setDefaultZoom(ZoomDensity zoom);
544 
545     /**
546      * Gets the default zoom density of the page. This should be called from
547      * the UI thread.
548      *
549      * This setting is not recommended for use in new applications.
550      *
551      * @return the zoom density
552      * @see #setDefaultZoom
553      * @deprecated Will only return the default value.
554      */
555     @Deprecated
getDefaultZoom()556     public abstract ZoomDensity getDefaultZoom();
557 
558     /**
559      * Enables using light touches to make a selection and activate mouseovers.
560      * @deprecated From {@link android.os.Build.VERSION_CODES#JELLY_BEAN} this
561      *             setting is obsolete and has no effect.
562      */
563     @Deprecated
setLightTouchEnabled(boolean enabled)564     public abstract void setLightTouchEnabled(boolean enabled);
565 
566     /**
567      * Gets whether light touches are enabled.
568      * @see #setLightTouchEnabled
569      * @deprecated This setting is obsolete.
570      */
571     @Deprecated
getLightTouchEnabled()572     public abstract boolean getLightTouchEnabled();
573 
574     /**
575      * Controlled a rendering optimization that is no longer present. Setting
576      * it now has no effect.
577      *
578      * @deprecated This setting now has no effect.
579      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
580      */
581     @Deprecated
setUseDoubleTree(boolean use)582     public void setUseDoubleTree(boolean use) {
583         // Specified to do nothing, so no need for derived classes to override.
584     }
585 
586     /**
587      * Controlled a rendering optimization that is no longer present. Setting
588      * it now has no effect.
589      *
590      * @deprecated This setting now has no effect.
591      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
592      */
593     @Deprecated
getUseDoubleTree()594     public boolean getUseDoubleTree() {
595         // Returns false unconditionally, so no need for derived classes to override.
596         return false;
597     }
598 
599     /**
600      * Sets the user-agent string using an integer code.
601      * <ul>
602      *   <li>0 means the WebView should use an Android user-agent string</li>
603      *   <li>1 means the WebView should use a desktop user-agent string</li>
604      * </ul>
605      * Other values are ignored. The default is an Android user-agent string,
606      * i.e. code value 0.
607      *
608      * @param ua the integer code for the user-agent string
609      * @deprecated Please use {@link #setUserAgentString} instead.
610      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
611      */
612     @SystemApi
613     @Deprecated
setUserAgent(int ua)614     public abstract void setUserAgent(int ua);
615 
616     /**
617      * Gets the user-agent as an integer code.
618      * <ul>
619      *   <li>-1 means the WebView is using a custom user-agent string set with
620      *   {@link #setUserAgentString}</li>
621      *   <li>0 means the WebView should use an Android user-agent string</li>
622      *   <li>1 means the WebView should use a desktop user-agent string</li>
623      * </ul>
624      *
625      * @return the integer code for the user-agent string
626      * @see #setUserAgent
627      * @deprecated Please use {@link #getUserAgentString} instead.
628      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
629      */
630     @SystemApi
631     @Deprecated
getUserAgent()632     public abstract int getUserAgent();
633 
634     /**
635      * Sets whether the WebView should enable support for the &quot;viewport&quot;
636      * HTML meta tag or should use a wide viewport.
637      * When the value of the setting is {@code false}, the layout width is always set to the
638      * width of the WebView control in device-independent (CSS) pixels.
639      * When the value is {@code true} and the page contains the viewport meta tag, the value
640      * of the width specified in the tag is used. If the page does not contain the tag or
641      * does not provide a width, then a wide viewport will be used.
642      *
643      * @param use whether to enable support for the viewport meta tag
644      */
setUseWideViewPort(boolean use)645     public abstract void setUseWideViewPort(boolean use);
646 
647     /**
648      * Gets whether the WebView supports the &quot;viewport&quot;
649      * HTML meta tag or will use a wide viewport.
650      *
651      * @return {@code true} if the WebView supports the viewport meta tag
652      * @see #setUseWideViewPort
653      */
getUseWideViewPort()654     public abstract boolean getUseWideViewPort();
655 
656     /**
657      * Sets whether the WebView whether supports multiple windows. If set to
658      * true, {@link WebChromeClient#onCreateWindow} must be implemented by the
659      * host application. The default is {@code false}.
660      *
661      * @param support whether to support multiple windows
662      */
setSupportMultipleWindows(boolean support)663     public abstract void setSupportMultipleWindows(boolean support);
664 
665     /**
666      * Gets whether the WebView supports multiple windows.
667      *
668      * @return {@code true} if the WebView supports multiple windows
669      * @see #setSupportMultipleWindows
670      */
supportMultipleWindows()671     public abstract boolean supportMultipleWindows();
672 
673     /**
674      * Sets the underlying layout algorithm. This will cause a re-layout of the
675      * WebView. The default is {@link LayoutAlgorithm#NARROW_COLUMNS}.
676      *
677      * @param l the layout algorithm to use, as a {@link LayoutAlgorithm} value
678      */
setLayoutAlgorithm(LayoutAlgorithm l)679     public abstract void setLayoutAlgorithm(LayoutAlgorithm l);
680 
681     /**
682      * Gets the current layout algorithm.
683      *
684      * @return the layout algorithm in use, as a {@link LayoutAlgorithm} value
685      * @see #setLayoutAlgorithm
686      */
getLayoutAlgorithm()687     public abstract LayoutAlgorithm getLayoutAlgorithm();
688 
689     /**
690      * Sets the standard font family name. The default is "sans-serif".
691      *
692      * @param font a font family name
693      */
setStandardFontFamily(String font)694     public abstract void setStandardFontFamily(String font);
695 
696     /**
697      * Gets the standard font family name.
698      *
699      * @return the standard font family name as a string
700      * @see #setStandardFontFamily
701      */
getStandardFontFamily()702     public abstract String getStandardFontFamily();
703 
704     /**
705      * Sets the fixed font family name. The default is "monospace".
706      *
707      * @param font a font family name
708      */
setFixedFontFamily(String font)709     public abstract void setFixedFontFamily(String font);
710 
711     /**
712      * Gets the fixed font family name.
713      *
714      * @return the fixed font family name as a string
715      * @see #setFixedFontFamily
716      */
getFixedFontFamily()717     public abstract String getFixedFontFamily();
718 
719     /**
720      * Sets the sans-serif font family name. The default is "sans-serif".
721      *
722      * @param font a font family name
723      */
setSansSerifFontFamily(String font)724     public abstract void setSansSerifFontFamily(String font);
725 
726     /**
727      * Gets the sans-serif font family name.
728      *
729      * @return the sans-serif font family name as a string
730      * @see #setSansSerifFontFamily
731      */
getSansSerifFontFamily()732     public abstract String getSansSerifFontFamily();
733 
734     /**
735      * Sets the serif font family name. The default is "sans-serif".
736      *
737      * @param font a font family name
738      */
setSerifFontFamily(String font)739     public abstract void setSerifFontFamily(String font);
740 
741     /**
742      * Gets the serif font family name. The default is "serif".
743      *
744      * @return the serif font family name as a string
745      * @see #setSerifFontFamily
746      */
getSerifFontFamily()747     public abstract String getSerifFontFamily();
748 
749     /**
750      * Sets the cursive font family name. The default is "cursive".
751      *
752      * @param font a font family name
753      */
setCursiveFontFamily(String font)754     public abstract void setCursiveFontFamily(String font);
755 
756     /**
757      * Gets the cursive font family name.
758      *
759      * @return the cursive font family name as a string
760      * @see #setCursiveFontFamily
761      */
getCursiveFontFamily()762     public abstract String getCursiveFontFamily();
763 
764     /**
765      * Sets the fantasy font family name. The default is "fantasy".
766      *
767      * @param font a font family name
768      */
setFantasyFontFamily(String font)769     public abstract void setFantasyFontFamily(String font);
770 
771     /**
772      * Gets the fantasy font family name.
773      *
774      * @return the fantasy font family name as a string
775      * @see #setFantasyFontFamily
776      */
getFantasyFontFamily()777     public abstract String getFantasyFontFamily();
778 
779     /**
780      * Sets the minimum font size. The default is 8.
781      *
782      * @param size a non-negative integer between 1 and 72. Any number outside
783      *             the specified range will be pinned.
784      */
setMinimumFontSize(int size)785     public abstract void setMinimumFontSize(int size);
786 
787     /**
788      * Gets the minimum font size.
789      *
790      * @return a non-negative integer between 1 and 72
791      * @see #setMinimumFontSize
792      */
getMinimumFontSize()793     public abstract int getMinimumFontSize();
794 
795     /**
796      * Sets the minimum logical font size. The default is 8.
797      *
798      * @param size a non-negative integer between 1 and 72. Any number outside
799      *             the specified range will be pinned.
800      */
setMinimumLogicalFontSize(int size)801     public abstract void setMinimumLogicalFontSize(int size);
802 
803     /**
804      * Gets the minimum logical font size.
805      *
806      * @return a non-negative integer between 1 and 72
807      * @see #setMinimumLogicalFontSize
808      */
getMinimumLogicalFontSize()809     public abstract int getMinimumLogicalFontSize();
810 
811     /**
812      * Sets the default font size. The default is 16.
813      *
814      * @param size a non-negative integer between 1 and 72. Any number outside
815      *             the specified range will be pinned.
816      */
setDefaultFontSize(int size)817     public abstract void setDefaultFontSize(int size);
818 
819     /**
820      * Gets the default font size.
821      *
822      * @return a non-negative integer between 1 and 72
823      * @see #setDefaultFontSize
824      */
getDefaultFontSize()825     public abstract int getDefaultFontSize();
826 
827     /**
828      * Sets the default fixed font size. The default is 16.
829      *
830      * @param size a non-negative integer between 1 and 72. Any number outside
831      *             the specified range will be pinned.
832      */
setDefaultFixedFontSize(int size)833     public abstract void setDefaultFixedFontSize(int size);
834 
835     /**
836      * Gets the default fixed font size.
837      *
838      * @return a non-negative integer between 1 and 72
839      * @see #setDefaultFixedFontSize
840      */
getDefaultFixedFontSize()841     public abstract int getDefaultFixedFontSize();
842 
843     /**
844      * Sets whether the WebView should load image resources. Note that this method
845      * controls loading of all images, including those embedded using the data
846      * URI scheme. Use {@link #setBlockNetworkImage} to control loading only
847      * of images specified using network URI schemes. Note that if the value of this
848      * setting is changed from {@code false} to {@code true}, all images resources referenced
849      * by content currently displayed by the WebView are loaded automatically.
850      * The default is {@code true}.
851      *
852      * @param flag whether the WebView should load image resources
853      */
setLoadsImagesAutomatically(boolean flag)854     public abstract void setLoadsImagesAutomatically(boolean flag);
855 
856     /**
857      * Gets whether the WebView loads image resources. This includes
858      * images embedded using the data URI scheme.
859      *
860      * @return {@code true} if the WebView loads image resources
861      * @see #setLoadsImagesAutomatically
862      */
getLoadsImagesAutomatically()863     public abstract boolean getLoadsImagesAutomatically();
864 
865     /**
866      * Sets whether the WebView should not load image resources from the
867      * network (resources accessed via http and https URI schemes).  Note
868      * that this method has no effect unless
869      * {@link #getLoadsImagesAutomatically} returns {@code true}. Also note that
870      * disabling all network loads using {@link #setBlockNetworkLoads}
871      * will also prevent network images from loading, even if this flag is set
872      * to false. When the value of this setting is changed from {@code true} to {@code false},
873      * network images resources referenced by content currently displayed by
874      * the WebView are fetched automatically. The default is {@code false}.
875      *
876      * @param flag whether the WebView should not load image resources from the
877      *             network
878      * @see #setBlockNetworkLoads
879      */
setBlockNetworkImage(boolean flag)880     public abstract void setBlockNetworkImage(boolean flag);
881 
882     /**
883      * Gets whether the WebView does not load image resources from the network.
884      *
885      * @return {@code true} if the WebView does not load image resources from the network
886      * @see #setBlockNetworkImage
887      */
getBlockNetworkImage()888     public abstract boolean getBlockNetworkImage();
889 
890     /**
891      * Sets whether the WebView should not load resources from the network.
892      * Use {@link #setBlockNetworkImage} to only avoid loading
893      * image resources. Note that if the value of this setting is
894      * changed from {@code true} to {@code false}, network resources referenced by content
895      * currently displayed by the WebView are not fetched until
896      * {@link android.webkit.WebView#reload} is called.
897      * If the application does not have the
898      * {@link android.Manifest.permission#INTERNET} permission, attempts to set
899      * a value of {@code false} will cause a {@link java.lang.SecurityException}
900      * to be thrown. The default value is {@code false} if the application has the
901      * {@link android.Manifest.permission#INTERNET} permission, otherwise it is
902      * {@code true}.
903      *
904      * @param flag {@code true} means block network loads by the WebView
905      * @see android.webkit.WebView#reload
906      */
setBlockNetworkLoads(boolean flag)907     public abstract void setBlockNetworkLoads(boolean flag);
908 
909     /**
910      * Gets whether the WebView does not load any resources from the network.
911      *
912      * @return {@code true} if the WebView does not load any resources from the network
913      * @see #setBlockNetworkLoads
914      */
getBlockNetworkLoads()915     public abstract boolean getBlockNetworkLoads();
916 
917     /**
918      * Tells the WebView to enable JavaScript execution.
919      * <b>The default is {@code false}.</b>
920      *
921      * @param flag {@code true} if the WebView should execute JavaScript
922      */
setJavaScriptEnabled(boolean flag)923     public abstract void setJavaScriptEnabled(boolean flag);
924 
925     /**
926      * Sets whether JavaScript running in the context of a file scheme URL
927      * should be allowed to access content from any origin. This includes
928      * access to content from other file scheme URLs. See
929      * {@link #setAllowFileAccessFromFileURLs}. To enable the most restrictive,
930      * and therefore secure policy, this setting should be disabled.
931      * Note that this setting affects only JavaScript access to file scheme
932      * resources. Other access to such resources, for example, from image HTML
933      * elements, is unaffected. To prevent possible violation of same domain policy
934      * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
935      * you should explicitly set this value to {@code false}.
936      * <p>
937      * The default value is {@code true} for apps targeting
938      * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
939      * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
940      * and above.
941      *
942      * @param flag whether JavaScript running in the context of a file scheme
943      *             URL should be allowed to access content from any origin
944      */
setAllowUniversalAccessFromFileURLs(boolean flag)945     public abstract void setAllowUniversalAccessFromFileURLs(boolean flag);
946 
947     /**
948      * Sets whether JavaScript running in the context of a file scheme URL
949      * should be allowed to access content from other file scheme URLs. To
950      * enable the most restrictive, and therefore secure, policy this setting
951      * should be disabled. Note that the value of this setting is ignored if
952      * the value of {@link #getAllowUniversalAccessFromFileURLs} is {@code true}.
953      * Note too, that this setting affects only JavaScript access to file scheme
954      * resources. Other access to such resources, for example, from image HTML
955      * elements, is unaffected. To prevent possible violation of same domain policy
956      * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
957      * you should explicitly set this value to {@code false}.
958      * <p>
959      * The default value is {@code true} for apps targeting
960      * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
961      * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
962      * and above.
963      *
964      * @param flag whether JavaScript running in the context of a file scheme
965      *             URL should be allowed to access content from other file
966      *             scheme URLs
967      */
setAllowFileAccessFromFileURLs(boolean flag)968     public abstract void setAllowFileAccessFromFileURLs(boolean flag);
969 
970     /**
971      * Sets whether the WebView should enable plugins. The default is {@code false}.
972      *
973      * @param flag {@code true} if plugins should be enabled
974      * @deprecated This method has been deprecated in favor of
975      *             {@link #setPluginState}
976      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
977      */
978     @SystemApi
979     @Deprecated
setPluginsEnabled(boolean flag)980     public abstract void setPluginsEnabled(boolean flag);
981 
982     /**
983      * Tells the WebView to enable, disable, or have plugins on demand. On
984      * demand mode means that if a plugin exists that can handle the embedded
985      * content, a placeholder icon will be shown instead of the plugin. When
986      * the placeholder is clicked, the plugin will be enabled. The default is
987      * {@link PluginState#OFF}.
988      *
989      * @param state a PluginState value
990      * @deprecated Plugins will not be supported in future, and should not be used.
991      */
992     @Deprecated
setPluginState(PluginState state)993     public abstract void setPluginState(PluginState state);
994 
995     /**
996      * Sets a custom path to plugins used by the WebView. This method is
997      * obsolete since each plugin is now loaded from its own package.
998      *
999      * @param pluginsPath a String path to the directory containing plugins
1000      * @deprecated This method is no longer used as plugins are loaded from
1001      *             their own APK via the system's package manager.
1002      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1003      */
1004     @Deprecated
setPluginsPath(String pluginsPath)1005     public void setPluginsPath(String pluginsPath) {
1006         // Specified to do nothing, so no need for derived classes to override.
1007     }
1008 
1009     /**
1010      * Sets the path to where database storage API databases should be saved.
1011      * In order for the database storage API to function correctly, this method
1012      * must be called with a path to which the application can write. This
1013      * method should only be called once: repeated calls are ignored.
1014      *
1015      * @param databasePath a path to the directory where databases should be
1016      *                     saved.
1017      * @deprecated Database paths are managed by the implementation and calling this method
1018      *             will have no effect.
1019      */
1020     @Deprecated
setDatabasePath(String databasePath)1021     public abstract void setDatabasePath(String databasePath);
1022 
1023     /**
1024      * Sets the path where the Geolocation databases should be saved. In order
1025      * for Geolocation permissions and cached positions to be persisted, this
1026      * method must be called with a path to which the application can write.
1027      *
1028      * @param databasePath a path to the directory where databases should be
1029      *                     saved.
1030      * @deprecated Geolocation database are managed by the implementation and calling this method
1031      *             will have no effect.
1032      */
1033     @Deprecated
setGeolocationDatabasePath(String databasePath)1034     public abstract void setGeolocationDatabasePath(String databasePath);
1035 
1036     /**
1037      * Sets whether the Application Caches API should be enabled. The default
1038      * is {@code false}. Note that in order for the Application Caches API to be
1039      * enabled, a valid database path must also be supplied to
1040      * {@link #setAppCachePath}.
1041      *
1042      * @param flag {@code true} if the WebView should enable Application Caches
1043      */
setAppCacheEnabled(boolean flag)1044     public abstract void setAppCacheEnabled(boolean flag);
1045 
1046     /**
1047      * Sets the path to the Application Caches files. In order for the
1048      * Application Caches API to be enabled, this method must be called with a
1049      * path to which the application can write. This method should only be
1050      * called once: repeated calls are ignored.
1051      *
1052      * @param appCachePath a String path to the directory containing
1053      *                     Application Caches files.
1054      * @see #setAppCacheEnabled
1055      */
setAppCachePath(String appCachePath)1056     public abstract void setAppCachePath(String appCachePath);
1057 
1058     /**
1059      * Sets the maximum size for the Application Cache content. The passed size
1060      * will be rounded to the nearest value that the database can support, so
1061      * this should be viewed as a guide, not a hard limit. Setting the
1062      * size to a value less than current database size does not cause the
1063      * database to be trimmed. The default size is {@link Long#MAX_VALUE}.
1064      * It is recommended to leave the maximum size set to the default value.
1065      *
1066      * @param appCacheMaxSize the maximum size in bytes
1067      * @deprecated In future quota will be managed automatically.
1068      */
1069     @Deprecated
setAppCacheMaxSize(long appCacheMaxSize)1070     public abstract void setAppCacheMaxSize(long appCacheMaxSize);
1071 
1072     /**
1073      * Sets whether the database storage API is enabled. The default value is
1074      * false. See also {@link #setDatabasePath} for how to correctly set up the
1075      * database storage API.
1076      *
1077      * This setting is global in effect, across all WebView instances in a process.
1078      * Note you should only modify this setting prior to making <b>any</b> WebView
1079      * page load within a given process, as the WebView implementation may ignore
1080      * changes to this setting after that point.
1081      *
1082      * @param flag {@code true} if the WebView should use the database storage API
1083      */
setDatabaseEnabled(boolean flag)1084     public abstract void setDatabaseEnabled(boolean flag);
1085 
1086     /**
1087      * Sets whether the DOM storage API is enabled. The default value is {@code false}.
1088      *
1089      * @param flag {@code true} if the WebView should use the DOM storage API
1090      */
setDomStorageEnabled(boolean flag)1091     public abstract void setDomStorageEnabled(boolean flag);
1092 
1093     /**
1094      * Gets whether the DOM Storage APIs are enabled.
1095      *
1096      * @return {@code true} if the DOM Storage APIs are enabled
1097      * @see #setDomStorageEnabled
1098      */
getDomStorageEnabled()1099     public abstract boolean getDomStorageEnabled();
1100 
1101     /**
1102      * Gets the path to where database storage API databases are saved.
1103      *
1104      * @return the String path to the database storage API databases
1105      * @see #setDatabasePath
1106      * @deprecated Database paths are managed by the implementation this method is obsolete.
1107      */
1108     @Deprecated
getDatabasePath()1109     public abstract String getDatabasePath();
1110 
1111     /**
1112      * Gets whether the database storage API is enabled.
1113      *
1114      * @return {@code true} if the database storage API is enabled
1115      * @see #setDatabaseEnabled
1116      */
getDatabaseEnabled()1117     public abstract boolean getDatabaseEnabled();
1118 
1119     /**
1120      * Sets whether Geolocation is enabled. The default is {@code true}.
1121      * <p>
1122      * Please note that in order for the Geolocation API to be usable
1123      * by a page in the WebView, the following requirements must be met:
1124      * <ul>
1125      *   <li>an application must have permission to access the device location,
1126      *   see {@link android.Manifest.permission#ACCESS_COARSE_LOCATION},
1127      *   {@link android.Manifest.permission#ACCESS_FINE_LOCATION};
1128      *   <li>an application must provide an implementation of the
1129      *   {@link WebChromeClient#onGeolocationPermissionsShowPrompt} callback
1130      *   to receive notifications that a page is requesting access to location
1131      *   via the JavaScript Geolocation API.
1132      * </ul>
1133      * <p>
1134      *
1135      * @param flag whether Geolocation should be enabled
1136      */
setGeolocationEnabled(boolean flag)1137     public abstract void setGeolocationEnabled(boolean flag);
1138 
1139     /**
1140      * Gets whether JavaScript is enabled.
1141      *
1142      * @return {@code true} if JavaScript is enabled
1143      * @see #setJavaScriptEnabled
1144      */
getJavaScriptEnabled()1145     public abstract boolean getJavaScriptEnabled();
1146 
1147     /**
1148      * Gets whether JavaScript running in the context of a file scheme URL can
1149      * access content from any origin. This includes access to content from
1150      * other file scheme URLs.
1151      *
1152      * @return whether JavaScript running in the context of a file scheme URL
1153      *         can access content from any origin
1154      * @see #setAllowUniversalAccessFromFileURLs
1155      */
getAllowUniversalAccessFromFileURLs()1156     public abstract boolean getAllowUniversalAccessFromFileURLs();
1157 
1158     /**
1159      * Gets whether JavaScript running in the context of a file scheme URL can
1160      * access content from other file scheme URLs.
1161      *
1162      * @return whether JavaScript running in the context of a file scheme URL
1163      *         can access content from other file scheme URLs
1164      * @see #setAllowFileAccessFromFileURLs
1165      */
getAllowFileAccessFromFileURLs()1166     public abstract boolean getAllowFileAccessFromFileURLs();
1167 
1168     /**
1169      * Gets whether plugins are enabled.
1170      *
1171      * @return {@code true} if plugins are enabled
1172      * @see #setPluginsEnabled
1173      * @deprecated This method has been replaced by {@link #getPluginState}
1174      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1175      */
1176     @SystemApi
1177     @Deprecated
getPluginsEnabled()1178     public abstract boolean getPluginsEnabled();
1179 
1180     /**
1181      * Gets the current state regarding whether plugins are enabled.
1182      *
1183      * @return the plugin state as a {@link PluginState} value
1184      * @see #setPluginState
1185      * @deprecated Plugins will not be supported in future, and should not be used.
1186      */
1187     @Deprecated
getPluginState()1188     public abstract PluginState getPluginState();
1189 
1190     /**
1191      * Gets the directory that contains the plugin libraries. This method is
1192      * obsolete since each plugin is now loaded from its own package.
1193      *
1194      * @return an empty string
1195      * @deprecated This method is no longer used as plugins are loaded from
1196      * their own APK via the system's package manager.
1197      * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
1198      */
1199     @Deprecated
getPluginsPath()1200     public String getPluginsPath() {
1201         // Unconditionally returns empty string, so no need for derived classes to override.
1202         return "";
1203     }
1204 
1205     /**
1206      * Tells JavaScript to open windows automatically. This applies to the
1207      * JavaScript function {@code window.open()}. The default is {@code false}.
1208      *
1209      * @param flag {@code true} if JavaScript can open windows automatically
1210      */
setJavaScriptCanOpenWindowsAutomatically(boolean flag)1211     public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean flag);
1212 
1213     /**
1214      * Gets whether JavaScript can open windows automatically.
1215      *
1216      * @return {@code true} if JavaScript can open windows automatically during
1217      *         {@code window.open()}
1218      * @see #setJavaScriptCanOpenWindowsAutomatically
1219      */
getJavaScriptCanOpenWindowsAutomatically()1220     public abstract boolean getJavaScriptCanOpenWindowsAutomatically();
1221 
1222     /**
1223      * Sets the default text encoding name to use when decoding html pages.
1224      * The default is "UTF-8".
1225      *
1226      * @param encoding the text encoding name
1227      */
setDefaultTextEncodingName(String encoding)1228     public abstract void setDefaultTextEncodingName(String encoding);
1229 
1230     /**
1231      * Gets the default text encoding name.
1232      *
1233      * @return the default text encoding name as a string
1234      * @see #setDefaultTextEncodingName
1235      */
getDefaultTextEncodingName()1236     public abstract String getDefaultTextEncodingName();
1237 
1238     /**
1239      * Sets the WebView's user-agent string. If the string is {@code null} or empty,
1240      * the system default value will be used.
1241      *
1242      * Note that starting from {@link android.os.Build.VERSION_CODES#KITKAT} Android
1243      * version, changing the user-agent while loading a web page causes WebView
1244      * to initiate loading once again.
1245      *
1246      * @param ua new user-agent string
1247      */
setUserAgentString(@ullable String ua)1248     public abstract void setUserAgentString(@Nullable String ua);
1249 
1250     /**
1251      * Gets the WebView's user-agent string.
1252      *
1253      * @return the WebView's user-agent string
1254      * @see #setUserAgentString
1255      */
getUserAgentString()1256     public abstract String getUserAgentString();
1257 
1258     /**
1259      * Returns the default User-Agent used by a WebView.
1260      * An instance of WebView could use a different User-Agent if a call
1261      * is made to {@link WebSettings#setUserAgentString(String)}.
1262      *
1263      * @param context a Context object used to access application assets
1264      */
getDefaultUserAgent(Context context)1265     public static String getDefaultUserAgent(Context context) {
1266         return WebViewFactory.getProvider().getStatics().getDefaultUserAgent(context);
1267     }
1268 
1269     /**
1270      * Tells the WebView whether it needs to set a node to have focus when
1271      * {@link WebView#requestFocus(int, android.graphics.Rect)} is called. The
1272      * default value is {@code true}.
1273      *
1274      * @param flag whether the WebView needs to set a node
1275      */
setNeedInitialFocus(boolean flag)1276     public abstract void setNeedInitialFocus(boolean flag);
1277 
1278     /**
1279      * Sets the priority of the Render thread. Unlike the other settings, this
1280      * one only needs to be called once per process. The default value is
1281      * {@link RenderPriority#NORMAL}.
1282      *
1283      * @param priority the priority
1284      * @deprecated It is not recommended to adjust thread priorities, and this will
1285      *             not be supported in future versions.
1286      */
1287     @Deprecated
setRenderPriority(RenderPriority priority)1288     public abstract void setRenderPriority(RenderPriority priority);
1289 
1290     /**
1291      * Overrides the way the cache is used. The way the cache is used is based
1292      * on the navigation type. For a normal page load, the cache is checked
1293      * and content is re-validated as needed. When navigating back, content is
1294      * not revalidated, instead the content is just retrieved from the cache.
1295      * This method allows the client to override this behavior by specifying
1296      * one of {@link #LOAD_DEFAULT},
1297      * {@link #LOAD_CACHE_ELSE_NETWORK}, {@link #LOAD_NO_CACHE} or
1298      * {@link #LOAD_CACHE_ONLY}. The default value is {@link #LOAD_DEFAULT}.
1299      *
1300      * @param mode the mode to use
1301      */
setCacheMode(@acheMode int mode)1302     public abstract void setCacheMode(@CacheMode int mode);
1303 
1304     /**
1305      * Gets the current setting for overriding the cache mode.
1306      *
1307      * @return the current setting for overriding the cache mode
1308      * @see #setCacheMode
1309      */
1310     @CacheMode
getCacheMode()1311     public abstract int getCacheMode();
1312 
1313     /**
1314      * Configures the WebView's behavior when a secure origin attempts to load a resource from an
1315      * insecure origin.
1316      *
1317      * By default, apps that target {@link android.os.Build.VERSION_CODES#KITKAT} or below default
1318      * to {@link #MIXED_CONTENT_ALWAYS_ALLOW}. Apps targeting
1319      * {@link android.os.Build.VERSION_CODES#LOLLIPOP} default to {@link #MIXED_CONTENT_NEVER_ALLOW}.
1320      *
1321      * The preferred and most secure mode of operation for the WebView is
1322      * {@link #MIXED_CONTENT_NEVER_ALLOW} and use of {@link #MIXED_CONTENT_ALWAYS_ALLOW} is
1323      * strongly discouraged.
1324      *
1325      * @param mode The mixed content mode to use. One of {@link #MIXED_CONTENT_NEVER_ALLOW},
1326      *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
1327      */
setMixedContentMode(int mode)1328     public abstract void setMixedContentMode(int mode);
1329 
1330     /**
1331      * Gets the current behavior of the WebView with regard to loading insecure content from a
1332      * secure origin.
1333      * @return The current setting, one of {@link #MIXED_CONTENT_NEVER_ALLOW},
1334      *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
1335      */
getMixedContentMode()1336     public abstract int getMixedContentMode();
1337 
1338     /**
1339      * Sets whether to use a video overlay for embedded encrypted video.
1340      * In API levels prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, encrypted video can
1341      * only be rendered directly on a secure video surface, so it had been a hard problem to play
1342      * encrypted video in HTML.  When this flag is on, WebView can play encrypted video (MSE/EME)
1343      * by using a video overlay (aka hole-punching) for videos embedded using HTML &lt;video&gt;
1344      * tag.<br>
1345      * Caution: This setting is intended for use only in a narrow set of circumstances and apps
1346      * should only enable it if they require playback of encrypted video content. It will impose
1347      * the following limitations on the WebView:
1348      * <ul>
1349      * <li> Only one video overlay can be played at a time.
1350      * <li> Changes made to position or dimensions of a video element may be propagated to the
1351      * corresponding video overlay with a noticeable delay.
1352      * <li> The video overlay is not visible to web APIs and as such may not interact with
1353      * script or styling. For example, CSS styles applied to the &lt;video&gt; tag may be ignored.
1354      * </ul>
1355      * This is not an exhaustive set of constraints and it may vary with new versions of the
1356      * WebView.
1357      * @hide
1358      */
1359     @SystemApi
setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean flag)1360     public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean flag);
1361 
1362     /**
1363      * Gets whether a video overlay will be used for embedded encrypted video.
1364      *
1365      * @return {@code true} if WebView uses a video overlay for embedded encrypted video.
1366      * @see #setVideoOverlayForEmbeddedEncryptedVideoEnabled
1367      * @hide
1368      */
1369     @SystemApi
getVideoOverlayForEmbeddedEncryptedVideoEnabled()1370     public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
1371 
1372     /**
1373      * Sets whether this WebView should raster tiles when it is
1374      * offscreen but attached to a window. Turning this on can avoid
1375      * rendering artifacts when animating an offscreen WebView on-screen.
1376      * Offscreen WebViews in this mode use more memory. The default value is
1377      * false.<br>
1378      * Please follow these guidelines to limit memory usage:
1379      * <ul>
1380      * <li> WebView size should be not be larger than the device screen size.
1381      * <li> Limit use of this mode to a small number of WebViews. Use it for
1382      *   visible WebViews and WebViews about to be animated to visible.
1383      * </ul>
1384      */
setOffscreenPreRaster(boolean enabled)1385     public abstract void setOffscreenPreRaster(boolean enabled);
1386 
1387     /**
1388      * Gets whether this WebView should raster tiles when it is
1389      * offscreen but attached to a window.
1390      * @return {@code true} if this WebView will raster tiles when it is
1391      * offscreen but attached to a window.
1392      */
getOffscreenPreRaster()1393     public abstract boolean getOffscreenPreRaster();
1394 
1395 
1396     /**
1397      * Sets whether Safe Browsing is enabled. Safe Browsing allows WebView to
1398      * protect against malware and phishing attacks by verifying the links.
1399      *
1400      * <p>
1401      * Safe Browsing can be disabled for all WebViews using a manifest tag (read <a
1402      * href="{@docRoot}reference/android/webkit/WebView.html">general Safe Browsing info</a>). The
1403      * manifest tag has a lower precedence than this API.
1404      *
1405      * <p>
1406      * Safe Browsing is enabled by default for devices which support it.
1407      *
1408      * @param enabled Whether Safe Browsing is enabled.
1409      */
setSafeBrowsingEnabled(boolean enabled)1410     public abstract void setSafeBrowsingEnabled(boolean enabled);
1411 
1412     /**
1413      * Gets whether Safe Browsing is enabled.
1414      * See {@link #setSafeBrowsingEnabled}.
1415      *
1416      * @return {@code true} if Safe Browsing is enabled and {@code false} otherwise.
1417      */
getSafeBrowsingEnabled()1418     public abstract boolean getSafeBrowsingEnabled();
1419 
1420 
1421     /**
1422      * @hide
1423      */
1424     @IntDef(flag = true, prefix = { "MENU_ITEM_" }, value = {
1425             MENU_ITEM_NONE,
1426             MENU_ITEM_SHARE,
1427             MENU_ITEM_WEB_SEARCH,
1428             MENU_ITEM_PROCESS_TEXT
1429     })
1430     @Retention(RetentionPolicy.SOURCE)
1431     @Target({ElementType.PARAMETER, ElementType.METHOD})
1432     private @interface MenuItemFlags {}
1433 
1434     /**
1435      * Disables the action mode menu items according to {@code menuItems} flag.
1436      * @param menuItems an integer field flag for the menu items to be disabled.
1437      */
setDisabledActionModeMenuItems(@enuItemFlags int menuItems)1438     public abstract void setDisabledActionModeMenuItems(@MenuItemFlags int menuItems);
1439 
1440     /**
1441      * Gets the action mode menu items that are disabled, expressed in an integer field flag.
1442      * The default value is {@link #MENU_ITEM_NONE}
1443      *
1444      * @return all the disabled menu item flags combined with bitwise OR.
1445      */
getDisabledActionModeMenuItems()1446     public abstract @MenuItemFlags int getDisabledActionModeMenuItems();
1447 
1448     /**
1449      * Used with {@link #setDisabledActionModeMenuItems}.
1450      *
1451      * No menu items should be disabled.
1452      */
1453     public static final int MENU_ITEM_NONE = 0;
1454 
1455     /**
1456      * Used with {@link #setDisabledActionModeMenuItems}.
1457      *
1458      * Disable menu item "Share".
1459      */
1460     public static final int MENU_ITEM_SHARE = 1 << 0;
1461 
1462     /**
1463      * Used with {@link #setDisabledActionModeMenuItems}.
1464      *
1465      * Disable menu item "Web Search".
1466      */
1467     public static final int MENU_ITEM_WEB_SEARCH = 1 << 1;
1468 
1469     /**
1470      * Used with {@link #setDisabledActionModeMenuItems}.
1471      *
1472      * Disable all the action mode menu items for text processing.
1473      * By default WebView searches for activities that are able to handle
1474      * {@link android.content.Intent#ACTION_PROCESS_TEXT} and show them in the
1475      * action mode menu. If this flag is set via {@link
1476      * #setDisabledActionModeMenuItems}, these menu items will be disabled.
1477      */
1478     public static final int MENU_ITEM_PROCESS_TEXT = 1 << 2;
1479 }
1480