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