diff --git a/android/webkit/WebSettings.java b/android/webkit/WebSettings.java
new file mode 100644
index 0000000..a46580d
--- /dev/null
+++ b/android/webkit/WebSettings.java
@@ -0,0 +1,1547 @@
+/*
+ * Copyright (C) 2007 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.webkit;
+
+import android.annotation.IntDef;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.annotation.UnsupportedAppUsage;
+import android.content.Context;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Manages settings state for a WebView. When a WebView is first created, it
+ * obtains a set of default settings. These default settings will be returned
+ * from any getter call. A {@code WebSettings} object obtained from
+ * {@link WebView#getSettings()} is tied to the life of the WebView. If a WebView has
+ * been destroyed, any method call on {@code WebSettings} will throw an
+ * {@link IllegalStateException}.
+ */
+// This is an abstract base class: concrete WebViewProviders must
+// create a class derived from this, and return an instance of it in the
+// WebViewProvider.getWebSettingsProvider() method implementation.
+public abstract class WebSettings {
+    /**
+     * Enum for controlling the layout of html.
+     * <ul>
+     *   <li>{@code NORMAL} means no rendering changes. This is the recommended choice for maximum
+     *       compatibility across different platforms and Android versions.</li>
+     *   <li>{@code SINGLE_COLUMN} moves all content into one column that is the width of the
+     *       view.</li>
+     *   <li>{@code NARROW_COLUMNS} makes all columns no wider than the screen if possible. Only use
+     *       this for API levels prior to {@link android.os.Build.VERSION_CODES#KITKAT}.</li>
+     *   <li>{@code TEXT_AUTOSIZING} boosts font size of paragraphs based on heuristics to make
+     *       the text readable when viewing a wide-viewport layout in the overview mode.
+     *       It is recommended to enable zoom support {@link #setSupportZoom} when
+     *       using this mode. Supported from API level
+     *       {@link android.os.Build.VERSION_CODES#KITKAT}</li>
+     * </ul>
+     */
+    // XXX: These must match LayoutAlgorithm in Settings.h in WebCore.
+    public enum LayoutAlgorithm {
+        NORMAL,
+        /**
+         * @deprecated This algorithm is now obsolete.
+         */
+        @Deprecated
+        SINGLE_COLUMN,
+        /**
+         * @deprecated This algorithm is now obsolete.
+         */
+        @Deprecated
+        NARROW_COLUMNS,
+        TEXT_AUTOSIZING
+    }
+
+    /**
+     * Enum for specifying the text size.
+     * <ul>
+     *   <li>SMALLEST is 50%</li>
+     *   <li>SMALLER is 75%</li>
+     *   <li>NORMAL is 100%</li>
+     *   <li>LARGER is 150%</li>
+     *   <li>LARGEST is 200%</li>
+     * </ul>
+     *
+     * @deprecated Use {@link WebSettings#setTextZoom(int)} and {@link WebSettings#getTextZoom()} instead.
+     */
+    @Deprecated
+    public enum TextSize {
+        SMALLEST(50),
+        SMALLER(75),
+        NORMAL(100),
+        LARGER(150),
+        LARGEST(200);
+        TextSize(int size) {
+            value = size;
+        }
+        @UnsupportedAppUsage
+        int value;
+    }
+
+    /**
+     * Enum for specifying the WebView's desired density.
+     * <ul>
+     *   <li>{@code FAR} makes 100% looking like in 240dpi</li>
+     *   <li>{@code MEDIUM} makes 100% looking like in 160dpi</li>
+     *   <li>{@code CLOSE} makes 100% looking like in 120dpi</li>
+     * </ul>
+     */
+    public enum ZoomDensity {
+        FAR(150),      // 240dpi
+        MEDIUM(100),    // 160dpi
+        CLOSE(75);     // 120dpi
+        ZoomDensity(int size) {
+            value = size;
+        }
+
+        /**
+         * @hide Only for use by WebViewProvider implementations
+         */
+        public int getValue() {
+            return value;
+        }
+
+        int value;
+    }
+
+    /** @hide */
+    @IntDef(prefix = { "LOAD_" }, value = {
+            LOAD_DEFAULT,
+            LOAD_NORMAL,
+            LOAD_CACHE_ELSE_NETWORK,
+            LOAD_NO_CACHE,
+            LOAD_CACHE_ONLY
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface CacheMode {}
+
+    /**
+     * Default cache usage mode. If the navigation type doesn't impose any
+     * specific behavior, use cached resources when they are available
+     * and not expired, otherwise load resources from the network.
+     * Use with {@link #setCacheMode}.
+     */
+    public static final int LOAD_DEFAULT = -1;
+
+    /**
+     * Normal cache usage mode. Use with {@link #setCacheMode}.
+     *
+     * @deprecated This value is obsolete, as from API level
+     * {@link android.os.Build.VERSION_CODES#HONEYCOMB} and onwards it has the
+     * same effect as {@link #LOAD_DEFAULT}.
+     */
+    @Deprecated
+    public static final int LOAD_NORMAL = 0;
+
+    /**
+     * Use cached resources when they are available, even if they have expired.
+     * Otherwise load resources from the network.
+     * Use with {@link #setCacheMode}.
+     */
+    public static final int LOAD_CACHE_ELSE_NETWORK = 1;
+
+    /**
+     * Don't use the cache, load from the network.
+     * Use with {@link #setCacheMode}.
+     */
+    public static final int LOAD_NO_CACHE = 2;
+
+    /**
+     * Don't use the network, load from the cache.
+     * Use with {@link #setCacheMode}.
+     */
+    public static final int LOAD_CACHE_ONLY = 3;
+
+    public enum RenderPriority {
+        NORMAL,
+        HIGH,
+        LOW
+    }
+
+    /**
+     * The plugin state effects how plugins are treated on a page. ON means
+     * that any object will be loaded even if a plugin does not exist to handle
+     * the content. ON_DEMAND means that if there is a plugin installed that
+     * can handle the content, a placeholder is shown until the user clicks on
+     * the placeholder. Once clicked, the plugin will be enabled on the page.
+     * OFF means that all plugins will be turned off and any fallback content
+     * will be used.
+     */
+    public enum PluginState {
+        ON,
+        ON_DEMAND,
+        OFF
+    }
+
+    /**
+     * Used with {@link #setMixedContentMode}
+     *
+     * In this mode, the WebView will allow a secure origin to load content from any other origin,
+     * even if that origin is insecure. This is the least secure mode of operation for the WebView,
+     * and where possible apps should not set this mode.
+     */
+    public static final int MIXED_CONTENT_ALWAYS_ALLOW = 0;
+
+    /**
+     * Used with {@link #setMixedContentMode}
+     *
+     * In this mode, the WebView will not allow a secure origin to load content from an insecure
+     * origin. This is the preferred and most secure mode of operation for the WebView and apps are
+     * strongly advised to use this mode.
+     */
+    public static final int MIXED_CONTENT_NEVER_ALLOW = 1;
+
+    /**
+     * Used with {@link #setMixedContentMode}
+     *
+     * In this mode, the WebView will attempt to be compatible with the approach of a modern web
+     * browser with regard to mixed content. Some insecure content may be allowed to be loaded by
+     * a secure origin and other types of content will be blocked. The types of content are allowed
+     * or blocked may change release to release and are not explicitly defined.
+     *
+     * This mode is intended to be used by apps that are not in control of the content that they
+     * render but desire to operate in a reasonably secure environment. For highest security, apps
+     * are recommended to use {@link #MIXED_CONTENT_NEVER_ALLOW}.
+     */
+    public static final int MIXED_CONTENT_COMPATIBILITY_MODE = 2;
+
+    /** @hide */
+    @IntDef(prefix = { "FORCE_DARK_" }, value = {
+            FORCE_DARK_OFF,
+            FORCE_DARK_AUTO,
+            FORCE_DARK_ON
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ForceDark {}
+
+    /**
+     * Used with {@link #setForceDark}
+     *
+     * Disable force dark, irrespective of the force dark mode of the WebView parent. In this mode,
+     * WebView content will always be rendered as-is, regardless of whether native views are being
+     * automatically darkened.
+     */
+    public static final int FORCE_DARK_OFF = 0;
+
+    /**
+     * Used with {@link #setForceDark}
+     *
+     * Enable force dark dependent on the state of the WebView parent view. If the WebView parent
+     * view is being automatically force darkened
+     * (see: {@link android.view.View#setForceDarkAllowed}), then WebView content will be rendered
+     * so as to emulate a dark theme. WebViews that are not attached to the view hierarchy will not
+     * be inverted.
+     */
+    public static final int FORCE_DARK_AUTO = 1;
+
+    /**
+     * Used with {@link #setForceDark}
+     *
+     * Unconditionally enable force dark. In this mode WebView content will always be rendered so
+     * as to emulate a dark theme.
+     */
+    public static final int FORCE_DARK_ON = 2;
+
+    /**
+     * Enables dumping the pages navigation cache to a text file. The default
+     * is {@code false}.
+     *
+     * @deprecated This method is now obsolete.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract void setNavDump(boolean enabled);
+
+    /**
+     * Gets whether dumping the navigation cache is enabled.
+     *
+     * @return whether dumping the navigation cache is enabled
+     * @see #setNavDump
+     * @deprecated This method is now obsolete.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract boolean getNavDump();
+
+    /**
+     * Sets whether the WebView should support zooming using its on-screen zoom
+     * controls and gestures. The particular zoom mechanisms that should be used
+     * can be set with {@link #setBuiltInZoomControls}. This setting does not
+     * affect zooming performed using the {@link WebView#zoomIn()} and
+     * {@link WebView#zoomOut()} methods. The default is {@code true}.
+     *
+     * @param support whether the WebView should support zoom
+     */
+    public abstract void setSupportZoom(boolean support);
+
+    /**
+     * Gets whether the WebView supports zoom.
+     *
+     * @return {@code true} if the WebView supports zoom
+     * @see #setSupportZoom
+     */
+    public abstract boolean supportZoom();
+
+    /**
+     * Sets whether the WebView requires a user gesture to play media.
+     * The default is {@code true}.
+     *
+     * @param require whether the WebView requires a user gesture to play media
+     */
+    public abstract void setMediaPlaybackRequiresUserGesture(boolean require);
+
+    /**
+     * Gets whether the WebView requires a user gesture to play media.
+     *
+     * @return {@code true} if the WebView requires a user gesture to play media
+     * @see #setMediaPlaybackRequiresUserGesture
+     */
+    public abstract boolean getMediaPlaybackRequiresUserGesture();
+
+    /**
+     * Sets whether the WebView should use its built-in zoom mechanisms. The
+     * built-in zoom mechanisms comprise on-screen zoom controls, which are
+     * displayed over the WebView's content, and the use of a pinch gesture to
+     * control zooming. Whether or not these on-screen controls are displayed
+     * can be set with {@link #setDisplayZoomControls}. The default is {@code false}.
+     * <p>
+     * The built-in mechanisms are the only currently supported zoom
+     * mechanisms, so it is recommended that this setting is always enabled.
+     *
+     * @param enabled whether the WebView should use its built-in zoom mechanisms
+     */
+    // This method was intended to select between the built-in zoom mechanisms
+    // and the separate zoom controls. The latter were obtained using
+    // {@link WebView#getZoomControls}, which is now hidden.
+    public abstract void setBuiltInZoomControls(boolean enabled);
+
+    /**
+     * Gets whether the zoom mechanisms built into WebView are being used.
+     *
+     * @return {@code true} if the zoom mechanisms built into WebView are being used
+     * @see #setBuiltInZoomControls
+     */
+    public abstract boolean getBuiltInZoomControls();
+
+    /**
+     * Sets whether the WebView should display on-screen zoom controls when
+     * using the built-in zoom mechanisms. See {@link #setBuiltInZoomControls}.
+     * The default is {@code true}.
+     *
+     * @param enabled whether the WebView should display on-screen zoom controls
+     */
+    public abstract void setDisplayZoomControls(boolean enabled);
+
+    /**
+     * Gets whether the WebView displays on-screen zoom controls when using
+     * the built-in zoom mechanisms.
+     *
+     * @return {@code true} if the WebView displays on-screen zoom controls when using
+     *         the built-in zoom mechanisms
+     * @see #setDisplayZoomControls
+     */
+    public abstract boolean getDisplayZoomControls();
+
+    /**
+     * Enables or disables file access within WebView. File access is enabled by
+     * default.  Note that this enables or disables file system access only.
+     * Assets and resources are still accessible using file:///android_asset and
+     * file:///android_res.
+     */
+    public abstract void setAllowFileAccess(boolean allow);
+
+    /**
+     * Gets whether this WebView supports file access.
+     *
+     * @see #setAllowFileAccess
+     */
+    public abstract boolean getAllowFileAccess();
+
+    /**
+     * Enables or disables content URL access within WebView.  Content URL
+     * access allows WebView to load content from a content provider installed
+     * in the system. The default is enabled.
+     */
+    public abstract void setAllowContentAccess(boolean allow);
+
+    /**
+     * Gets whether this WebView supports content URL access.
+     *
+     * @see #setAllowContentAccess
+     */
+    public abstract boolean getAllowContentAccess();
+
+    /**
+     * Sets whether the WebView loads pages in overview mode, that is,
+     * zooms out the content to fit on screen by width. This setting is
+     * taken into account when the content width is greater than the width
+     * of the WebView control, for example, when {@link #getUseWideViewPort}
+     * is enabled. The default is {@code false}.
+     */
+    public abstract void setLoadWithOverviewMode(boolean overview);
+
+    /**
+     * Gets whether this WebView loads pages in overview mode.
+     *
+     * @return whether this WebView loads pages in overview mode
+     * @see #setLoadWithOverviewMode
+     */
+    public abstract boolean getLoadWithOverviewMode();
+
+    /**
+     * Sets whether the WebView will enable smooth transition while panning or
+     * zooming or while the window hosting the WebView does not have focus.
+     * If it is {@code true}, WebView will choose a solution to maximize the performance.
+     * e.g. the WebView's content may not be updated during the transition.
+     * If it is false, WebView will keep its fidelity. The default value is {@code false}.
+     *
+     * @deprecated This method is now obsolete, and will become a no-op in future.
+     */
+    @Deprecated
+    public abstract void setEnableSmoothTransition(boolean enable);
+
+    /**
+     * Gets whether the WebView enables smooth transition while panning or
+     * zooming.
+     *
+     * @see #setEnableSmoothTransition
+     *
+     * @deprecated This method is now obsolete, and will become a no-op in future.
+     */
+    @Deprecated
+    public abstract  boolean enableSmoothTransition();
+
+    /**
+     * Sets whether the WebView uses its background for over scroll background.
+     * If {@code true}, it will use the WebView's background. If {@code false}, it will use an
+     * internal pattern. Default is {@code true}.
+     *
+     * @deprecated This method is now obsolete.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract  void setUseWebViewBackgroundForOverscrollBackground(boolean view);
+
+    /**
+     * Gets whether this WebView uses WebView's background instead of
+     * internal pattern for over scroll background.
+     *
+     * @see #setUseWebViewBackgroundForOverscrollBackground
+     * @deprecated This method is now obsolete.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract  boolean getUseWebViewBackgroundForOverscrollBackground();
+
+    /**
+     * Sets whether the WebView should save form data. In Android O, the
+     * platform has implemented a fully functional Autofill feature to store
+     * form data. Therefore, the Webview form data save feature is disabled.
+     *
+     * Note that the feature will continue to be supported on older versions of
+     * Android as before.
+     *
+     * This function does not have any effect.
+     */
+    @Deprecated
+    public abstract  void setSaveFormData(boolean save);
+
+    /**
+     * Gets whether the WebView saves form data.
+     *
+     * @return whether the WebView saves form data
+     * @see #setSaveFormData
+     */
+    @Deprecated
+    public abstract boolean getSaveFormData();
+
+    /**
+     * Sets whether the WebView should save passwords. The default is {@code true}.
+     * @deprecated Saving passwords in WebView will not be supported in future versions.
+     */
+    @Deprecated
+    public abstract void setSavePassword(boolean save);
+
+    /**
+     * Gets whether the WebView saves passwords.
+     *
+     * @return whether the WebView saves passwords
+     * @see #setSavePassword
+     * @deprecated Saving passwords in WebView will not be supported in future versions.
+     */
+    @Deprecated
+    public abstract boolean getSavePassword();
+
+    /**
+     * Sets the text zoom of the page in percent. The default is 100.
+     *
+     * @param textZoom the text zoom in percent
+     */
+    public abstract void setTextZoom(int textZoom);
+
+    /**
+     * Gets the text zoom of the page in percent.
+     *
+     * @return the text zoom of the page in percent
+     * @see #setTextZoom
+     */
+    public abstract int getTextZoom();
+
+    /**
+     * Sets policy for third party cookies.
+     * Developers should access this via {@link CookieManager#setShouldAcceptThirdPartyCookies}.
+     * @hide Internal API.
+     */
+    @SystemApi
+    public abstract void setAcceptThirdPartyCookies(boolean accept);
+
+    /**
+     * Gets policy for third party cookies.
+     * Developers should access this via {@link CookieManager#getShouldAcceptThirdPartyCookies}.
+     * @hide Internal API
+     */
+    @SystemApi
+    public abstract boolean getAcceptThirdPartyCookies();
+
+    /**
+     * Sets the text size of the page. The default is {@link TextSize#NORMAL}.
+     *
+     * @param t the text size as a {@link TextSize} value
+     * @deprecated Use {@link #setTextZoom} instead.
+     */
+    @Deprecated
+    public synchronized void setTextSize(TextSize t) {
+        setTextZoom(t.value);
+    }
+
+    /**
+     * Gets the text size of the page. If the text size was previously specified
+     * in percent using {@link #setTextZoom}, this will return the closest
+     * matching {@link TextSize}.
+     *
+     * @return the text size as a {@link TextSize} value
+     * @see #setTextSize
+     * @deprecated Use {@link #getTextZoom} instead.
+     */
+    @Deprecated
+    public synchronized TextSize getTextSize() {
+        TextSize closestSize = null;
+        int smallestDelta = Integer.MAX_VALUE;
+        int textSize = getTextZoom();
+        for (TextSize size : TextSize.values()) {
+            int delta = Math.abs(textSize - size.value);
+            if (delta == 0) {
+                return size;
+            }
+            if (delta < smallestDelta) {
+                smallestDelta = delta;
+                closestSize = size;
+            }
+        }
+        return closestSize != null ? closestSize : TextSize.NORMAL;
+    }
+
+    /**
+     * Sets the default zoom density of the page. This must be called from the UI
+     * thread. The default is {@link ZoomDensity#MEDIUM}.
+     *
+     * This setting is not recommended for use in new applications.  If the WebView
+     * is utilized to display mobile-oriented pages, the desired effect can be achieved by
+     * adjusting 'width' and 'initial-scale' attributes of page's 'meta viewport'
+     * tag. For pages lacking the tag, {@link android.webkit.WebView#setInitialScale}
+     * and {@link #setUseWideViewPort} can be used.
+     *
+     * @param zoom the zoom density
+     * @deprecated This method is no longer supported, see the function documentation for
+     *             recommended alternatives.
+     */
+    @Deprecated
+    public abstract void setDefaultZoom(ZoomDensity zoom);
+
+    /**
+     * Gets the default zoom density of the page. This should be called from
+     * the UI thread.
+     *
+     * This setting is not recommended for use in new applications.
+     *
+     * @return the zoom density
+     * @see #setDefaultZoom
+     * @deprecated Will only return the default value.
+     */
+    @Deprecated
+    public abstract ZoomDensity getDefaultZoom();
+
+    /**
+     * Enables using light touches to make a selection and activate mouseovers.
+     * @deprecated From {@link android.os.Build.VERSION_CODES#JELLY_BEAN} this
+     *             setting is obsolete and has no effect.
+     */
+    @Deprecated
+    public abstract void setLightTouchEnabled(boolean enabled);
+
+    /**
+     * Gets whether light touches are enabled.
+     * @see #setLightTouchEnabled
+     * @deprecated This setting is obsolete.
+     */
+    @Deprecated
+    public abstract boolean getLightTouchEnabled();
+
+    /**
+     * Controlled a rendering optimization that is no longer present. Setting
+     * it now has no effect.
+     *
+     * @deprecated This setting now has no effect.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public void setUseDoubleTree(boolean use) {
+        // Specified to do nothing, so no need for derived classes to override.
+    }
+
+    /**
+     * Controlled a rendering optimization that is no longer present. Setting
+     * it now has no effect.
+     *
+     * @deprecated This setting now has no effect.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public boolean getUseDoubleTree() {
+        // Returns false unconditionally, so no need for derived classes to override.
+        return false;
+    }
+
+    /**
+     * Sets the user-agent string using an integer code.
+     * <ul>
+     *   <li>0 means the WebView should use an Android user-agent string</li>
+     *   <li>1 means the WebView should use a desktop user-agent string</li>
+     * </ul>
+     * Other values are ignored. The default is an Android user-agent string,
+     * i.e. code value 0.
+     *
+     * @param ua the integer code for the user-agent string
+     * @deprecated Please use {@link #setUserAgentString} instead.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract void setUserAgent(int ua);
+
+    /**
+     * Gets the user-agent as an integer code.
+     * <ul>
+     *   <li>-1 means the WebView is using a custom user-agent string set with
+     *   {@link #setUserAgentString}</li>
+     *   <li>0 means the WebView should use an Android user-agent string</li>
+     *   <li>1 means the WebView should use a desktop user-agent string</li>
+     * </ul>
+     *
+     * @return the integer code for the user-agent string
+     * @see #setUserAgent
+     * @deprecated Please use {@link #getUserAgentString} instead.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract int getUserAgent();
+
+    /**
+     * Sets whether the WebView should enable support for the &quot;viewport&quot;
+     * HTML meta tag or should use a wide viewport.
+     * When the value of the setting is {@code false}, the layout width is always set to the
+     * width of the WebView control in device-independent (CSS) pixels.
+     * When the value is {@code true} and the page contains the viewport meta tag, the value
+     * of the width specified in the tag is used. If the page does not contain the tag or
+     * does not provide a width, then a wide viewport will be used.
+     *
+     * @param use whether to enable support for the viewport meta tag
+     */
+    public abstract void setUseWideViewPort(boolean use);
+
+    /**
+     * Gets whether the WebView supports the &quot;viewport&quot;
+     * HTML meta tag or will use a wide viewport.
+     *
+     * @return {@code true} if the WebView supports the viewport meta tag
+     * @see #setUseWideViewPort
+     */
+    public abstract boolean getUseWideViewPort();
+
+    /**
+     * Sets whether the WebView whether supports multiple windows. If set to
+     * true, {@link WebChromeClient#onCreateWindow} must be implemented by the
+     * host application. The default is {@code false}.
+     *
+     * @param support whether to support multiple windows
+     */
+    public abstract void setSupportMultipleWindows(boolean support);
+
+    /**
+     * Gets whether the WebView supports multiple windows.
+     *
+     * @return {@code true} if the WebView supports multiple windows
+     * @see #setSupportMultipleWindows
+     */
+    public abstract boolean supportMultipleWindows();
+
+    /**
+     * Sets the underlying layout algorithm. This will cause a re-layout of the
+     * WebView. The default is {@link LayoutAlgorithm#NARROW_COLUMNS}.
+     *
+     * @param l the layout algorithm to use, as a {@link LayoutAlgorithm} value
+     */
+    public abstract void setLayoutAlgorithm(LayoutAlgorithm l);
+
+    /**
+     * Gets the current layout algorithm.
+     *
+     * @return the layout algorithm in use, as a {@link LayoutAlgorithm} value
+     * @see #setLayoutAlgorithm
+     */
+    public abstract LayoutAlgorithm getLayoutAlgorithm();
+
+    /**
+     * Sets the standard font family name. The default is "sans-serif".
+     *
+     * @param font a font family name
+     */
+    public abstract void setStandardFontFamily(String font);
+
+    /**
+     * Gets the standard font family name.
+     *
+     * @return the standard font family name as a string
+     * @see #setStandardFontFamily
+     */
+    public abstract String getStandardFontFamily();
+
+    /**
+     * Sets the fixed font family name. The default is "monospace".
+     *
+     * @param font a font family name
+     */
+    public abstract void setFixedFontFamily(String font);
+
+    /**
+     * Gets the fixed font family name.
+     *
+     * @return the fixed font family name as a string
+     * @see #setFixedFontFamily
+     */
+    public abstract String getFixedFontFamily();
+
+    /**
+     * Sets the sans-serif font family name. The default is "sans-serif".
+     *
+     * @param font a font family name
+     */
+    public abstract void setSansSerifFontFamily(String font);
+
+    /**
+     * Gets the sans-serif font family name.
+     *
+     * @return the sans-serif font family name as a string
+     * @see #setSansSerifFontFamily
+     */
+    public abstract String getSansSerifFontFamily();
+
+    /**
+     * Sets the serif font family name. The default is "sans-serif".
+     *
+     * @param font a font family name
+     */
+    public abstract void setSerifFontFamily(String font);
+
+    /**
+     * Gets the serif font family name. The default is "serif".
+     *
+     * @return the serif font family name as a string
+     * @see #setSerifFontFamily
+     */
+    public abstract String getSerifFontFamily();
+
+    /**
+     * Sets the cursive font family name. The default is "cursive".
+     *
+     * @param font a font family name
+     */
+    public abstract void setCursiveFontFamily(String font);
+
+    /**
+     * Gets the cursive font family name.
+     *
+     * @return the cursive font family name as a string
+     * @see #setCursiveFontFamily
+     */
+    public abstract String getCursiveFontFamily();
+
+    /**
+     * Sets the fantasy font family name. The default is "fantasy".
+     *
+     * @param font a font family name
+     */
+    public abstract void setFantasyFontFamily(String font);
+
+    /**
+     * Gets the fantasy font family name.
+     *
+     * @return the fantasy font family name as a string
+     * @see #setFantasyFontFamily
+     */
+    public abstract String getFantasyFontFamily();
+
+    /**
+     * Sets the minimum font size. The default is 8.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
+     */
+    public abstract void setMinimumFontSize(int size);
+
+    /**
+     * Gets the minimum font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setMinimumFontSize
+     */
+    public abstract int getMinimumFontSize();
+
+    /**
+     * Sets the minimum logical font size. The default is 8.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
+     */
+    public abstract void setMinimumLogicalFontSize(int size);
+
+    /**
+     * Gets the minimum logical font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setMinimumLogicalFontSize
+     */
+    public abstract int getMinimumLogicalFontSize();
+
+    /**
+     * Sets the default font size. The default is 16.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
+     */
+    public abstract void setDefaultFontSize(int size);
+
+    /**
+     * Gets the default font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setDefaultFontSize
+     */
+    public abstract int getDefaultFontSize();
+
+    /**
+     * Sets the default fixed font size. The default is 16.
+     *
+     * @param size a non-negative integer between 1 and 72. Any number outside
+     *             the specified range will be pinned.
+     */
+    public abstract void setDefaultFixedFontSize(int size);
+
+    /**
+     * Gets the default fixed font size.
+     *
+     * @return a non-negative integer between 1 and 72
+     * @see #setDefaultFixedFontSize
+     */
+    public abstract int getDefaultFixedFontSize();
+
+    /**
+     * Sets whether the WebView should load image resources. Note that this method
+     * controls loading of all images, including those embedded using the data
+     * URI scheme. Use {@link #setBlockNetworkImage} to control loading only
+     * of images specified using network URI schemes. Note that if the value of this
+     * setting is changed from {@code false} to {@code true}, all images resources referenced
+     * by content currently displayed by the WebView are loaded automatically.
+     * The default is {@code true}.
+     *
+     * @param flag whether the WebView should load image resources
+     */
+    public abstract void setLoadsImagesAutomatically(boolean flag);
+
+    /**
+     * Gets whether the WebView loads image resources. This includes
+     * images embedded using the data URI scheme.
+     *
+     * @return {@code true} if the WebView loads image resources
+     * @see #setLoadsImagesAutomatically
+     */
+    public abstract boolean getLoadsImagesAutomatically();
+
+    /**
+     * Sets whether the WebView should not load image resources from the
+     * network (resources accessed via http and https URI schemes).  Note
+     * that this method has no effect unless
+     * {@link #getLoadsImagesAutomatically} returns {@code true}. Also note that
+     * disabling all network loads using {@link #setBlockNetworkLoads}
+     * will also prevent network images from loading, even if this flag is set
+     * to false. When the value of this setting is changed from {@code true} to {@code false},
+     * network images resources referenced by content currently displayed by
+     * the WebView are fetched automatically. The default is {@code false}.
+     *
+     * @param flag whether the WebView should not load image resources from the
+     *             network
+     * @see #setBlockNetworkLoads
+     */
+    public abstract void setBlockNetworkImage(boolean flag);
+
+    /**
+     * Gets whether the WebView does not load image resources from the network.
+     *
+     * @return {@code true} if the WebView does not load image resources from the network
+     * @see #setBlockNetworkImage
+     */
+    public abstract boolean getBlockNetworkImage();
+
+    /**
+     * Sets whether the WebView should not load resources from the network.
+     * Use {@link #setBlockNetworkImage} to only avoid loading
+     * image resources. Note that if the value of this setting is
+     * changed from {@code true} to {@code false}, network resources referenced by content
+     * currently displayed by the WebView are not fetched until
+     * {@link android.webkit.WebView#reload} is called.
+     * If the application does not have the
+     * {@link android.Manifest.permission#INTERNET} permission, attempts to set
+     * a value of {@code false} will cause a {@link java.lang.SecurityException}
+     * to be thrown. The default value is {@code false} if the application has the
+     * {@link android.Manifest.permission#INTERNET} permission, otherwise it is
+     * {@code true}.
+     *
+     * @param flag {@code true} means block network loads by the WebView
+     * @see android.webkit.WebView#reload
+     */
+    public abstract void setBlockNetworkLoads(boolean flag);
+
+    /**
+     * Gets whether the WebView does not load any resources from the network.
+     *
+     * @return {@code true} if the WebView does not load any resources from the network
+     * @see #setBlockNetworkLoads
+     */
+    public abstract boolean getBlockNetworkLoads();
+
+    /**
+     * Tells the WebView to enable JavaScript execution.
+     * <b>The default is {@code false}.</b>
+     *
+     * @param flag {@code true} if the WebView should execute JavaScript
+     */
+    public abstract void setJavaScriptEnabled(boolean flag);
+
+    /**
+     * Sets whether JavaScript running in the context of a file scheme URL
+     * should be allowed to access content from any origin. This includes
+     * access to content from other file scheme URLs. See
+     * {@link #setAllowFileAccessFromFileURLs}. To enable the most restrictive,
+     * and therefore secure policy, this setting should be disabled.
+     * Note that this setting affects only JavaScript access to file scheme
+     * resources. Other access to such resources, for example, from image HTML
+     * elements, is unaffected. To prevent possible violation of same domain policy
+     * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
+     * you should explicitly set this value to {@code false}.
+     * <p>
+     * The default value is {@code true} for apps targeting
+     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
+     * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+     * and above.
+     *
+     * @param flag whether JavaScript running in the context of a file scheme
+     *             URL should be allowed to access content from any origin
+     */
+    public abstract void setAllowUniversalAccessFromFileURLs(boolean flag);
+
+    /**
+     * Sets whether JavaScript running in the context of a file scheme URL
+     * should be allowed to access content from other file scheme URLs. To
+     * enable the most restrictive, and therefore secure, policy this setting
+     * should be disabled. Note that the value of this setting is ignored if
+     * the value of {@link #getAllowUniversalAccessFromFileURLs} is {@code true}.
+     * Note too, that this setting affects only JavaScript access to file scheme
+     * resources. Other access to such resources, for example, from image HTML
+     * elements, is unaffected. To prevent possible violation of same domain policy
+     * when targeting {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and earlier,
+     * you should explicitly set this value to {@code false}.
+     * <p>
+     * The default value is {@code true} for apps targeting
+     * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1} and below,
+     * and {@code false} when targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN}
+     * and above.
+     *
+     * @param flag whether JavaScript running in the context of a file scheme
+     *             URL should be allowed to access content from other file
+     *             scheme URLs
+     */
+    public abstract void setAllowFileAccessFromFileURLs(boolean flag);
+
+    /**
+     * Sets whether the WebView should enable plugins. The default is {@code false}.
+     *
+     * @param flag {@code true} if plugins should be enabled
+     * @deprecated This method has been deprecated in favor of
+     *             {@link #setPluginState}
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract void setPluginsEnabled(boolean flag);
+
+    /**
+     * Tells the WebView to enable, disable, or have plugins on demand. On
+     * demand mode means that if a plugin exists that can handle the embedded
+     * content, a placeholder icon will be shown instead of the plugin. When
+     * the placeholder is clicked, the plugin will be enabled. The default is
+     * {@link PluginState#OFF}.
+     *
+     * @param state a PluginState value
+     * @deprecated Plugins are not supported in API level
+     *             {@link android.os.Build.VERSION_CODES#KITKAT} or later;
+     *             enabling plugins is a no-op.
+     */
+    @Deprecated
+    public abstract void setPluginState(PluginState state);
+
+    /**
+     * Sets a custom path to plugins used by the WebView. This method is
+     * obsolete since each plugin is now loaded from its own package.
+     *
+     * @param pluginsPath a String path to the directory containing plugins
+     * @deprecated This method is no longer used as plugins are loaded from
+     *             their own APK via the system's package manager.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public void setPluginsPath(String pluginsPath) {
+        // Specified to do nothing, so no need for derived classes to override.
+    }
+
+    /**
+     * Sets the path to where database storage API databases should be saved.
+     * In order for the database storage API to function correctly, this method
+     * must be called with a path to which the application can write. This
+     * method should only be called once: repeated calls are ignored.
+     *
+     * @param databasePath a path to the directory where databases should be
+     *                     saved.
+     * @deprecated Database paths are managed by the implementation and calling this method
+     *             will have no effect.
+     */
+    @Deprecated
+    public abstract void setDatabasePath(String databasePath);
+
+    /**
+     * Sets the path where the Geolocation databases should be saved. In order
+     * for Geolocation permissions and cached positions to be persisted, this
+     * method must be called with a path to which the application can write.
+     *
+     * @param databasePath a path to the directory where databases should be
+     *                     saved.
+     * @deprecated Geolocation database are managed by the implementation and calling this method
+     *             will have no effect.
+     */
+    @Deprecated
+    public abstract void setGeolocationDatabasePath(String databasePath);
+
+    /**
+     * Sets whether the Application Caches API should be enabled. The default
+     * is {@code false}. Note that in order for the Application Caches API to be
+     * enabled, a valid database path must also be supplied to
+     * {@link #setAppCachePath}.
+     *
+     * @param flag {@code true} if the WebView should enable Application Caches
+     */
+    public abstract void setAppCacheEnabled(boolean flag);
+
+    /**
+     * Sets the path to the Application Caches files. In order for the
+     * Application Caches API to be enabled, this method must be called with a
+     * path to which the application can write. This method should only be
+     * called once: repeated calls are ignored.
+     *
+     * @param appCachePath a String path to the directory containing
+     *                     Application Caches files.
+     * @see #setAppCacheEnabled
+     */
+    public abstract void setAppCachePath(String appCachePath);
+
+    /**
+     * Sets the maximum size for the Application Cache content. The passed size
+     * will be rounded to the nearest value that the database can support, so
+     * this should be viewed as a guide, not a hard limit. Setting the
+     * size to a value less than current database size does not cause the
+     * database to be trimmed. The default size is {@link Long#MAX_VALUE}.
+     * It is recommended to leave the maximum size set to the default value.
+     *
+     * @param appCacheMaxSize the maximum size in bytes
+     * @deprecated In future quota will be managed automatically.
+     */
+    @Deprecated
+    public abstract void setAppCacheMaxSize(long appCacheMaxSize);
+
+    /**
+     * Sets whether the database storage API is enabled. The default value is
+     * false. See also {@link #setDatabasePath} for how to correctly set up the
+     * database storage API.
+     *
+     * This setting is global in effect, across all WebView instances in a process.
+     * Note you should only modify this setting prior to making <b>any</b> WebView
+     * page load within a given process, as the WebView implementation may ignore
+     * changes to this setting after that point.
+     *
+     * @param flag {@code true} if the WebView should use the database storage API
+     */
+    public abstract void setDatabaseEnabled(boolean flag);
+
+    /**
+     * Sets whether the DOM storage API is enabled. The default value is {@code false}.
+     *
+     * @param flag {@code true} if the WebView should use the DOM storage API
+     */
+    public abstract void setDomStorageEnabled(boolean flag);
+
+    /**
+     * Gets whether the DOM Storage APIs are enabled.
+     *
+     * @return {@code true} if the DOM Storage APIs are enabled
+     * @see #setDomStorageEnabled
+     */
+    public abstract boolean getDomStorageEnabled();
+
+    /**
+     * Gets the path to where database storage API databases are saved.
+     *
+     * @return the String path to the database storage API databases
+     * @see #setDatabasePath
+     * @deprecated Database paths are managed by the implementation this method is obsolete.
+     */
+    @Deprecated
+    public abstract String getDatabasePath();
+
+    /**
+     * Gets whether the database storage API is enabled.
+     *
+     * @return {@code true} if the database storage API is enabled
+     * @see #setDatabaseEnabled
+     */
+    public abstract boolean getDatabaseEnabled();
+
+    /**
+     * Sets whether Geolocation is enabled. The default is {@code true}.
+     * <p>
+     * Please note that in order for the Geolocation API to be usable
+     * by a page in the WebView, the following requirements must be met:
+     * <ul>
+     *   <li>an application must have permission to access the device location,
+     *   see {@link android.Manifest.permission#ACCESS_COARSE_LOCATION},
+     *   {@link android.Manifest.permission#ACCESS_FINE_LOCATION};
+     *   <li>an application must provide an implementation of the
+     *   {@link WebChromeClient#onGeolocationPermissionsShowPrompt} callback
+     *   to receive notifications that a page is requesting access to location
+     *   via the JavaScript Geolocation API.
+     * </ul>
+     * <p>
+     *
+     * @param flag whether Geolocation should be enabled
+     */
+    public abstract void setGeolocationEnabled(boolean flag);
+
+    /**
+     * Gets whether JavaScript is enabled.
+     *
+     * @return {@code true} if JavaScript is enabled
+     * @see #setJavaScriptEnabled
+     */
+    public abstract boolean getJavaScriptEnabled();
+
+    /**
+     * Gets whether JavaScript running in the context of a file scheme URL can
+     * access content from any origin. This includes access to content from
+     * other file scheme URLs.
+     *
+     * @return whether JavaScript running in the context of a file scheme URL
+     *         can access content from any origin
+     * @see #setAllowUniversalAccessFromFileURLs
+     */
+    public abstract boolean getAllowUniversalAccessFromFileURLs();
+
+    /**
+     * Gets whether JavaScript running in the context of a file scheme URL can
+     * access content from other file scheme URLs.
+     *
+     * @return whether JavaScript running in the context of a file scheme URL
+     *         can access content from other file scheme URLs
+     * @see #setAllowFileAccessFromFileURLs
+     */
+    public abstract boolean getAllowFileAccessFromFileURLs();
+
+    /**
+     * Gets whether plugins are enabled.
+     *
+     * @return {@code true} if plugins are enabled
+     * @see #setPluginsEnabled
+     * @deprecated This method has been replaced by {@link #getPluginState}
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
+     */
+    @SystemApi
+    @Deprecated
+    public abstract boolean getPluginsEnabled();
+
+    /**
+     * Gets the current state regarding whether plugins are enabled.
+     *
+     * @return the plugin state as a {@link PluginState} value
+     * @see #setPluginState
+     * @deprecated Plugins are not supported in API level
+     *             {@link android.os.Build.VERSION_CODES#KITKAT} or later;
+     *             enabling plugins is a no-op.
+     */
+    @Deprecated
+    public abstract PluginState getPluginState();
+
+    /**
+     * Gets the directory that contains the plugin libraries. This method is
+     * obsolete since each plugin is now loaded from its own package.
+     *
+     * @return an empty string
+     * @deprecated This method is no longer used as plugins are loaded from
+     * their own APK via the system's package manager.
+     * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}
+     */
+    @Deprecated
+    @UnsupportedAppUsage
+    public String getPluginsPath() {
+        // Unconditionally returns empty string, so no need for derived classes to override.
+        return "";
+    }
+
+    /**
+     * Tells JavaScript to open windows automatically. This applies to the
+     * JavaScript function {@code window.open()}. The default is {@code false}.
+     *
+     * @param flag {@code true} if JavaScript can open windows automatically
+     */
+    public abstract void setJavaScriptCanOpenWindowsAutomatically(boolean flag);
+
+    /**
+     * Gets whether JavaScript can open windows automatically.
+     *
+     * @return {@code true} if JavaScript can open windows automatically during
+     *         {@code window.open()}
+     * @see #setJavaScriptCanOpenWindowsAutomatically
+     */
+    public abstract boolean getJavaScriptCanOpenWindowsAutomatically();
+
+    /**
+     * Sets the default text encoding name to use when decoding html pages.
+     * The default is "UTF-8".
+     *
+     * @param encoding the text encoding name
+     */
+    public abstract void setDefaultTextEncodingName(String encoding);
+
+    /**
+     * Gets the default text encoding name.
+     *
+     * @return the default text encoding name as a string
+     * @see #setDefaultTextEncodingName
+     */
+    public abstract String getDefaultTextEncodingName();
+
+    /**
+     * Sets the WebView's user-agent string. If the string is {@code null} or empty,
+     * the system default value will be used.
+     *
+     * Note that starting from {@link android.os.Build.VERSION_CODES#KITKAT} Android
+     * version, changing the user-agent while loading a web page causes WebView
+     * to initiate loading once again.
+     *
+     * @param ua new user-agent string
+     */
+    public abstract void setUserAgentString(@Nullable String ua);
+
+    /**
+     * Gets the WebView's user-agent string.
+     *
+     * @return the WebView's user-agent string
+     * @see #setUserAgentString
+     */
+    public abstract String getUserAgentString();
+
+    /**
+     * Returns the default User-Agent used by a WebView.
+     * An instance of WebView could use a different User-Agent if a call
+     * is made to {@link WebSettings#setUserAgentString(String)}.
+     *
+     * @param context a Context object used to access application assets
+     */
+    public static String getDefaultUserAgent(Context context) {
+        return WebViewFactory.getProvider().getStatics().getDefaultUserAgent(context);
+    }
+
+    /**
+     * Tells the WebView whether it needs to set a node to have focus when
+     * {@link WebView#requestFocus(int, android.graphics.Rect)} is called. The
+     * default value is {@code true}.
+     *
+     * @param flag whether the WebView needs to set a node
+     */
+    public abstract void setNeedInitialFocus(boolean flag);
+
+    /**
+     * Sets the priority of the Render thread. Unlike the other settings, this
+     * one only needs to be called once per process. The default value is
+     * {@link RenderPriority#NORMAL}.
+     *
+     * @param priority the priority
+     * @deprecated It is not recommended to adjust thread priorities, and this will
+     *             not be supported in future versions.
+     */
+    @Deprecated
+    public abstract void setRenderPriority(RenderPriority priority);
+
+    /**
+     * Overrides the way the cache is used. The way the cache is used is based
+     * on the navigation type. For a normal page load, the cache is checked
+     * and content is re-validated as needed. When navigating back, content is
+     * not revalidated, instead the content is just retrieved from the cache.
+     * This method allows the client to override this behavior by specifying
+     * one of {@link #LOAD_DEFAULT},
+     * {@link #LOAD_CACHE_ELSE_NETWORK}, {@link #LOAD_NO_CACHE} or
+     * {@link #LOAD_CACHE_ONLY}. The default value is {@link #LOAD_DEFAULT}.
+     *
+     * @param mode the mode to use
+     */
+    public abstract void setCacheMode(@CacheMode int mode);
+
+    /**
+     * Gets the current setting for overriding the cache mode.
+     *
+     * @return the current setting for overriding the cache mode
+     * @see #setCacheMode
+     */
+    @CacheMode
+    public abstract int getCacheMode();
+
+    /**
+     * Configures the WebView's behavior when a secure origin attempts to load a resource from an
+     * insecure origin.
+     *
+     * By default, apps that target {@link android.os.Build.VERSION_CODES#KITKAT} or below default
+     * to {@link #MIXED_CONTENT_ALWAYS_ALLOW}. Apps targeting
+     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} default to {@link #MIXED_CONTENT_NEVER_ALLOW}.
+     *
+     * The preferred and most secure mode of operation for the WebView is
+     * {@link #MIXED_CONTENT_NEVER_ALLOW} and use of {@link #MIXED_CONTENT_ALWAYS_ALLOW} is
+     * strongly discouraged.
+     *
+     * @param mode The mixed content mode to use. One of {@link #MIXED_CONTENT_NEVER_ALLOW},
+     *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
+     */
+    public abstract void setMixedContentMode(int mode);
+
+    /**
+     * Gets the current behavior of the WebView with regard to loading insecure content from a
+     * secure origin.
+     * @return The current setting, one of {@link #MIXED_CONTENT_NEVER_ALLOW},
+     *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
+     */
+    public abstract int getMixedContentMode();
+
+    /**
+     * Sets whether to use a video overlay for embedded encrypted video.
+     * In API levels prior to {@link android.os.Build.VERSION_CODES#LOLLIPOP}, encrypted video can
+     * only be rendered directly on a secure video surface, so it had been a hard problem to play
+     * encrypted video in HTML.  When this flag is on, WebView can play encrypted video (MSE/EME)
+     * by using a video overlay (aka hole-punching) for videos embedded using HTML &lt;video&gt;
+     * tag.<br>
+     * Caution: This setting is intended for use only in a narrow set of circumstances and apps
+     * should only enable it if they require playback of encrypted video content. It will impose
+     * the following limitations on the WebView:
+     * <ul>
+     * <li> Only one video overlay can be played at a time.
+     * <li> Changes made to position or dimensions of a video element may be propagated to the
+     * corresponding video overlay with a noticeable delay.
+     * <li> The video overlay is not visible to web APIs and as such may not interact with
+     * script or styling. For example, CSS styles applied to the &lt;video&gt; tag may be ignored.
+     * </ul>
+     * This is not an exhaustive set of constraints and it may vary with new versions of the
+     * WebView.
+     * @hide
+     */
+    @SystemApi
+    public abstract void setVideoOverlayForEmbeddedEncryptedVideoEnabled(boolean flag);
+
+    /**
+     * Gets whether a video overlay will be used for embedded encrypted video.
+     *
+     * @return {@code true} if WebView uses a video overlay for embedded encrypted video.
+     * @see #setVideoOverlayForEmbeddedEncryptedVideoEnabled
+     * @hide
+     */
+    @SystemApi
+    public abstract boolean getVideoOverlayForEmbeddedEncryptedVideoEnabled();
+
+    /**
+     * Sets whether this WebView should raster tiles when it is
+     * offscreen but attached to a window. Turning this on can avoid
+     * rendering artifacts when animating an offscreen WebView on-screen.
+     * Offscreen WebViews in this mode use more memory. The default value is
+     * false.<br>
+     * Please follow these guidelines to limit memory usage:
+     * <ul>
+     * <li> WebView size should be not be larger than the device screen size.
+     * <li> Limit use of this mode to a small number of WebViews. Use it for
+     *   visible WebViews and WebViews about to be animated to visible.
+     * </ul>
+     */
+    public abstract void setOffscreenPreRaster(boolean enabled);
+
+    /**
+     * Gets whether this WebView should raster tiles when it is
+     * offscreen but attached to a window.
+     * @return {@code true} if this WebView will raster tiles when it is
+     * offscreen but attached to a window.
+     */
+    public abstract boolean getOffscreenPreRaster();
+
+
+    /**
+     * Sets whether Safe Browsing is enabled. Safe Browsing allows WebView to
+     * protect against malware and phishing attacks by verifying the links.
+     *
+     * <p>
+     * Safe Browsing can be disabled for all WebViews using a manifest tag (read <a
+     * href="{@docRoot}reference/android/webkit/WebView.html">general Safe Browsing info</a>). The
+     * manifest tag has a lower precedence than this API.
+     *
+     * <p>
+     * Safe Browsing is enabled by default for devices which support it.
+     *
+     * @param enabled Whether Safe Browsing is enabled.
+     */
+    public abstract void setSafeBrowsingEnabled(boolean enabled);
+
+    /**
+     * Gets whether Safe Browsing is enabled.
+     * See {@link #setSafeBrowsingEnabled}.
+     *
+     * @return {@code true} if Safe Browsing is enabled and {@code false} otherwise.
+     */
+    public abstract boolean getSafeBrowsingEnabled();
+
+
+    /**
+     * Set the force dark mode for this WebView.
+     *
+     * @param forceDark the force dark mode to set.
+     */
+    public void setForceDark(@ForceDark int forceDark) {
+        // Stub implementation to satisfy Roboelectrc shadows that don't override this yet.
+    }
+
+    /**
+     * Get the force dark mode for this WebView.
+     *
+     * The default force dark mode is {@link #FORCE_DARK_AUTO}
+     *
+     * @return the currently set force dark mode.
+     */
+    public @ForceDark int getForceDark() {
+        // Stub implementation to satisfy Roboelectrc shadows that don't override this yet.
+        return FORCE_DARK_AUTO;
+    }
+
+    /**
+     * @hide
+     */
+    @IntDef(flag = true, prefix = { "MENU_ITEM_" }, value = {
+            MENU_ITEM_NONE,
+            MENU_ITEM_SHARE,
+            MENU_ITEM_WEB_SEARCH,
+            MENU_ITEM_PROCESS_TEXT
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    @Target({ElementType.PARAMETER, ElementType.METHOD})
+    private @interface MenuItemFlags {}
+
+    /**
+     * Disables the action mode menu items according to {@code menuItems} flag.
+     * @param menuItems an integer field flag for the menu items to be disabled.
+     */
+    public abstract void setDisabledActionModeMenuItems(@MenuItemFlags int menuItems);
+
+    /**
+     * Gets the action mode menu items that are disabled, expressed in an integer field flag.
+     * The default value is {@link #MENU_ITEM_NONE}
+     *
+     * @return all the disabled menu item flags combined with bitwise OR.
+     */
+    public abstract @MenuItemFlags int getDisabledActionModeMenuItems();
+
+    /**
+     * Used with {@link #setDisabledActionModeMenuItems}.
+     *
+     * No menu items should be disabled.
+     */
+    public static final int MENU_ITEM_NONE = 0;
+
+    /**
+     * Used with {@link #setDisabledActionModeMenuItems}.
+     *
+     * Disable menu item "Share".
+     */
+    public static final int MENU_ITEM_SHARE = 1 << 0;
+
+    /**
+     * Used with {@link #setDisabledActionModeMenuItems}.
+     *
+     * Disable menu item "Web Search".
+     */
+    public static final int MENU_ITEM_WEB_SEARCH = 1 << 1;
+
+    /**
+     * Used with {@link #setDisabledActionModeMenuItems}.
+     *
+     * Disable all the action mode menu items for text processing.
+     * By default WebView searches for activities that are able to handle
+     * {@link android.content.Intent#ACTION_PROCESS_TEXT} and show them in the
+     * action mode menu. If this flag is set via {@link
+     * #setDisabledActionModeMenuItems}, these menu items will be disabled.
+     */
+    public static final int MENU_ITEM_PROCESS_TEXT = 1 << 2;
+}
