1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.webkit; 18 19 import android.annotation.Widget; 20 import android.content.Context; 21 import android.content.res.Configuration; 22 import android.graphics.Bitmap; 23 import android.graphics.Canvas; 24 import android.graphics.Paint; 25 import android.graphics.Picture; 26 import android.graphics.Rect; 27 import android.graphics.drawable.Drawable; 28 import android.net.http.SslCertificate; 29 import android.os.Build; 30 import android.os.Bundle; 31 import android.os.Looper; 32 import android.os.Message; 33 import android.os.StrictMode; 34 import android.print.PrintDocumentAdapter; 35 import android.security.KeyChain; 36 import android.util.AttributeSet; 37 import android.util.Log; 38 import android.view.KeyEvent; 39 import android.view.MotionEvent; 40 import android.view.View; 41 import android.view.ViewDebug; 42 import android.view.ViewGroup; 43 import android.view.ViewTreeObserver; 44 import android.view.accessibility.AccessibilityEvent; 45 import android.view.accessibility.AccessibilityNodeInfo; 46 import android.view.accessibility.AccessibilityNodeProvider; 47 import android.view.inputmethod.EditorInfo; 48 import android.view.inputmethod.InputConnection; 49 import android.widget.AbsoluteLayout; 50 51 import java.io.BufferedWriter; 52 import java.io.File; 53 import java.util.Map; 54 55 /** 56 * <p>A View that displays web pages. This class is the basis upon which you 57 * can roll your own web browser or simply display some online content within your Activity. 58 * It uses the WebKit rendering engine to display 59 * web pages and includes methods to navigate forward and backward 60 * through a history, zoom in and out, perform text searches and more.</p> 61 * <p>Note that, in order for your Activity to access the Internet and load web pages 62 * in a WebView, you must add the {@code INTERNET} permissions to your 63 * Android Manifest file:</p> 64 * <pre><uses-permission android:name="android.permission.INTERNET" /></pre> 65 * 66 * <p>This must be a child of the <a 67 * href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code <manifest>}</a> 68 * element.</p> 69 * 70 * <p>For more information, read 71 * <a href="{@docRoot}guide/webapps/webview.html">Building Web Apps in WebView</a>.</p> 72 * 73 * <h3>Basic usage</h3> 74 * 75 * <p>By default, a WebView provides no browser-like widgets, does not 76 * enable JavaScript and web page errors are ignored. If your goal is only 77 * to display some HTML as a part of your UI, this is probably fine; 78 * the user won't need to interact with the web page beyond reading 79 * it, and the web page won't need to interact with the user. If you 80 * actually want a full-blown web browser, then you probably want to 81 * invoke the Browser application with a URL Intent rather than show it 82 * with a WebView. For example: 83 * <pre> 84 * Uri uri = Uri.parse("http://www.example.com"); 85 * Intent intent = new Intent(Intent.ACTION_VIEW, uri); 86 * startActivity(intent); 87 * </pre> 88 * <p>See {@link android.content.Intent} for more information.</p> 89 * 90 * <p>To provide a WebView in your own Activity, include a {@code <WebView>} in your layout, 91 * or set the entire Activity window as a WebView during {@link 92 * android.app.Activity#onCreate(Bundle) onCreate()}:</p> 93 * <pre class="prettyprint"> 94 * WebView webview = new WebView(this); 95 * setContentView(webview); 96 * </pre> 97 * 98 * <p>Then load the desired web page:</p> 99 * <pre> 100 * // Simplest usage: note that an exception will NOT be thrown 101 * // if there is an error loading this page (see below). 102 * webview.loadUrl("http://slashdot.org/"); 103 * 104 * // OR, you can also load from an HTML string: 105 * String summary = "<html><body>You scored <b>192</b> points.</body></html>"; 106 * webview.loadData(summary, "text/html", null); 107 * // ... although note that there are restrictions on what this HTML can do. 108 * // See the JavaDocs for {@link #loadData(String,String,String) loadData()} and {@link 109 * #loadDataWithBaseURL(String,String,String,String,String) loadDataWithBaseURL()} for more info. 110 * </pre> 111 * 112 * <p>A WebView has several customization points where you can add your 113 * own behavior. These are:</p> 114 * 115 * <ul> 116 * <li>Creating and setting a {@link android.webkit.WebChromeClient} subclass. 117 * This class is called when something that might impact a 118 * browser UI happens, for instance, progress updates and 119 * JavaScript alerts are sent here (see <a 120 * href="{@docRoot}guide/developing/debug-tasks.html#DebuggingWebPages">Debugging Tasks</a>). 121 * </li> 122 * <li>Creating and setting a {@link android.webkit.WebViewClient} subclass. 123 * It will be called when things happen that impact the 124 * rendering of the content, eg, errors or form submissions. You 125 * can also intercept URL loading here (via {@link 126 * android.webkit.WebViewClient#shouldOverrideUrlLoading(WebView,String) 127 * shouldOverrideUrlLoading()}).</li> 128 * <li>Modifying the {@link android.webkit.WebSettings}, such as 129 * enabling JavaScript with {@link android.webkit.WebSettings#setJavaScriptEnabled(boolean) 130 * setJavaScriptEnabled()}. </li> 131 * <li>Injecting Java objects into the WebView using the 132 * {@link android.webkit.WebView#addJavascriptInterface} method. This 133 * method allows you to inject Java objects into a page's JavaScript 134 * context, so that they can be accessed by JavaScript in the page.</li> 135 * </ul> 136 * 137 * <p>Here's a more complicated example, showing error handling, 138 * settings, and progress notification:</p> 139 * 140 * <pre class="prettyprint"> 141 * // Let's display the progress in the activity title bar, like the 142 * // browser app does. 143 * getWindow().requestFeature(Window.FEATURE_PROGRESS); 144 * 145 * webview.getSettings().setJavaScriptEnabled(true); 146 * 147 * final Activity activity = this; 148 * webview.setWebChromeClient(new WebChromeClient() { 149 * public void onProgressChanged(WebView view, int progress) { 150 * // Activities and WebViews measure progress with different scales. 151 * // The progress meter will automatically disappear when we reach 100% 152 * activity.setProgress(progress * 1000); 153 * } 154 * }); 155 * webview.setWebViewClient(new WebViewClient() { 156 * public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 157 * Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); 158 * } 159 * }); 160 * 161 * webview.loadUrl("http://developer.android.com/"); 162 * </pre> 163 * 164 * <h3>Zoom</h3> 165 * 166 * <p>To enable the built-in zoom, set 167 * {@link #getSettings() WebSettings}.{@link WebSettings#setBuiltInZoomControls(boolean)} 168 * (introduced in API level {@link android.os.Build.VERSION_CODES#CUPCAKE}).</p> 169 * <p>NOTE: Using zoom if either the height or width is set to 170 * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} may lead to undefined behavior 171 * and should be avoided.</p> 172 * 173 * <h3>Cookie and window management</h3> 174 * 175 * <p>For obvious security reasons, your application has its own 176 * cache, cookie store etc.—it does not share the Browser 177 * application's data. 178 * </p> 179 * 180 * <p>By default, requests by the HTML to open new windows are 181 * ignored. This is true whether they be opened by JavaScript or by 182 * the target attribute on a link. You can customize your 183 * {@link WebChromeClient} to provide your own behaviour for opening multiple windows, 184 * and render them in whatever manner you want.</p> 185 * 186 * <p>The standard behavior for an Activity is to be destroyed and 187 * recreated when the device orientation or any other configuration changes. This will cause 188 * the WebView to reload the current page. If you don't want that, you 189 * can set your Activity to handle the {@code orientation} and {@code keyboardHidden} 190 * changes, and then just leave the WebView alone. It'll automatically 191 * re-orient itself as appropriate. Read <a 192 * href="{@docRoot}guide/topics/resources/runtime-changes.html">Handling Runtime Changes</a> for 193 * more information about how to handle configuration changes during runtime.</p> 194 * 195 * 196 * <h3>Building web pages to support different screen densities</h3> 197 * 198 * <p>The screen density of a device is based on the screen resolution. A screen with low density 199 * has fewer available pixels per inch, where a screen with high density 200 * has more — sometimes significantly more — pixels per inch. The density of a 201 * screen is important because, other things being equal, a UI element (such as a button) whose 202 * height and width are defined in terms of screen pixels will appear larger on the lower density 203 * screen and smaller on the higher density screen. 204 * For simplicity, Android collapses all actual screen densities into three generalized densities: 205 * high, medium, and low.</p> 206 * <p>By default, WebView scales a web page so that it is drawn at a size that matches the default 207 * appearance on a medium density screen. So, it applies 1.5x scaling on a high density screen 208 * (because its pixels are smaller) and 0.75x scaling on a low density screen (because its pixels 209 * are bigger). 210 * Starting with API level {@link android.os.Build.VERSION_CODES#ECLAIR}, WebView supports DOM, CSS, 211 * and meta tag features to help you (as a web developer) target screens with different screen 212 * densities.</p> 213 * <p>Here's a summary of the features you can use to handle different screen densities:</p> 214 * <ul> 215 * <li>The {@code window.devicePixelRatio} DOM property. The value of this property specifies the 216 * default scaling factor used for the current device. For example, if the value of {@code 217 * window.devicePixelRatio} is "1.0", then the device is considered a medium density (mdpi) device 218 * and default scaling is not applied to the web page; if the value is "1.5", then the device is 219 * considered a high density device (hdpi) and the page content is scaled 1.5x; if the 220 * value is "0.75", then the device is considered a low density device (ldpi) and the content is 221 * scaled 0.75x.</li> 222 * <li>The {@code -webkit-device-pixel-ratio} CSS media query. Use this to specify the screen 223 * densities for which this style sheet is to be used. The corresponding value should be either 224 * "0.75", "1", or "1.5", to indicate that the styles are for devices with low density, medium 225 * density, or high density screens, respectively. For example: 226 * <pre> 227 * <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio:1.5)" href="hdpi.css" /></pre> 228 * <p>The {@code hdpi.css} stylesheet is only used for devices with a screen pixel ration of 1.5, 229 * which is the high density pixel ratio.</p> 230 * </li> 231 * </ul> 232 * 233 * <h3>HTML5 Video support</h3> 234 * 235 * <p>In order to support inline HTML5 video in your application, you need to have hardware 236 * acceleration turned on, and set a {@link android.webkit.WebChromeClient}. For full screen support, 237 * implementations of {@link WebChromeClient#onShowCustomView(View, WebChromeClient.CustomViewCallback)} 238 * and {@link WebChromeClient#onHideCustomView()} are required, 239 * {@link WebChromeClient#getVideoLoadingProgressView()} is optional. 240 * </p> 241 */ 242 // Implementation notes. 243 // The WebView is a thin API class that delegates its public API to a backend WebViewProvider 244 // class instance. WebView extends {@link AbsoluteLayout} for backward compatibility reasons. 245 // Methods are delegated to the provider implementation: all public API methods introduced in this 246 // file are fully delegated, whereas public and protected methods from the View base classes are 247 // only delegated where a specific need exists for them to do so. 248 @Widget 249 public class WebView extends AbsoluteLayout 250 implements ViewTreeObserver.OnGlobalFocusChangeListener, 251 ViewGroup.OnHierarchyChangeListener, ViewDebug.HierarchyHandler { 252 253 /** 254 * Broadcast Action: Indicates the data reduction proxy setting changed. 255 * Sent by the settings app when user changes the data reduction proxy value. This intent will 256 * always stay as a hidden API. 257 * @hide 258 */ 259 public static final String DATA_REDUCTION_PROXY_SETTING_CHANGED = 260 "android.webkit.DATA_REDUCTION_PROXY_SETTING_CHANGED"; 261 262 private static final String LOGTAG = "WebView"; 263 264 // Throwing an exception for incorrect thread usage if the 265 // build target is JB MR2 or newer. Defaults to false, and is 266 // set in the WebView constructor. 267 private static volatile boolean sEnforceThreadChecking = false; 268 269 /** 270 * Transportation object for returning WebView across thread boundaries. 271 */ 272 public class WebViewTransport { 273 private WebView mWebview; 274 275 /** 276 * Sets the WebView to the transportation object. 277 * 278 * @param webview the WebView to transport 279 */ setWebView(WebView webview)280 public synchronized void setWebView(WebView webview) { 281 mWebview = webview; 282 } 283 284 /** 285 * Gets the WebView object. 286 * 287 * @return the transported WebView object 288 */ getWebView()289 public synchronized WebView getWebView() { 290 return mWebview; 291 } 292 } 293 294 /** 295 * URI scheme for telephone number. 296 */ 297 public static final String SCHEME_TEL = "tel:"; 298 /** 299 * URI scheme for email address. 300 */ 301 public static final String SCHEME_MAILTO = "mailto:"; 302 /** 303 * URI scheme for map address. 304 */ 305 public static final String SCHEME_GEO = "geo:0,0?q="; 306 307 /** 308 * Interface to listen for find results. 309 */ 310 public interface FindListener { 311 /** 312 * Notifies the listener about progress made by a find operation. 313 * 314 * @param activeMatchOrdinal the zero-based ordinal of the currently selected match 315 * @param numberOfMatches how many matches have been found 316 * @param isDoneCounting whether the find operation has actually completed. The listener 317 * may be notified multiple times while the 318 * operation is underway, and the numberOfMatches 319 * value should not be considered final unless 320 * isDoneCounting is true. 321 */ onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting)322 public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 323 boolean isDoneCounting); 324 } 325 326 /** 327 * Interface to listen for new pictures as they change. 328 * 329 * @deprecated This interface is now obsolete. 330 */ 331 @Deprecated 332 public interface PictureListener { 333 /** 334 * Used to provide notification that the WebView's picture has changed. 335 * See {@link WebView#capturePicture} for details of the picture. 336 * 337 * @param view the WebView that owns the picture 338 * @param picture the new picture. Applications targeting 339 * {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2} or above 340 * will always receive a null Picture. 341 * @deprecated Deprecated due to internal changes. 342 */ 343 @Deprecated onNewPicture(WebView view, Picture picture)344 public void onNewPicture(WebView view, Picture picture); 345 } 346 347 public static class HitTestResult { 348 /** 349 * Default HitTestResult, where the target is unknown. 350 */ 351 public static final int UNKNOWN_TYPE = 0; 352 /** 353 * @deprecated This type is no longer used. 354 */ 355 @Deprecated 356 public static final int ANCHOR_TYPE = 1; 357 /** 358 * HitTestResult for hitting a phone number. 359 */ 360 public static final int PHONE_TYPE = 2; 361 /** 362 * HitTestResult for hitting a map address. 363 */ 364 public static final int GEO_TYPE = 3; 365 /** 366 * HitTestResult for hitting an email address. 367 */ 368 public static final int EMAIL_TYPE = 4; 369 /** 370 * HitTestResult for hitting an HTML::img tag. 371 */ 372 public static final int IMAGE_TYPE = 5; 373 /** 374 * @deprecated This type is no longer used. 375 */ 376 @Deprecated 377 public static final int IMAGE_ANCHOR_TYPE = 6; 378 /** 379 * HitTestResult for hitting a HTML::a tag with src=http. 380 */ 381 public static final int SRC_ANCHOR_TYPE = 7; 382 /** 383 * HitTestResult for hitting a HTML::a tag with src=http + HTML::img. 384 */ 385 public static final int SRC_IMAGE_ANCHOR_TYPE = 8; 386 /** 387 * HitTestResult for hitting an edit text area. 388 */ 389 public static final int EDIT_TEXT_TYPE = 9; 390 391 private int mType; 392 private String mExtra; 393 394 /** 395 * @hide Only for use by WebViewProvider implementations 396 */ HitTestResult()397 public HitTestResult() { 398 mType = UNKNOWN_TYPE; 399 } 400 401 /** 402 * @hide Only for use by WebViewProvider implementations 403 */ setType(int type)404 public void setType(int type) { 405 mType = type; 406 } 407 408 /** 409 * @hide Only for use by WebViewProvider implementations 410 */ setExtra(String extra)411 public void setExtra(String extra) { 412 mExtra = extra; 413 } 414 415 /** 416 * Gets the type of the hit test result. See the XXX_TYPE constants 417 * defined in this class. 418 * 419 * @return the type of the hit test result 420 */ getType()421 public int getType() { 422 return mType; 423 } 424 425 /** 426 * Gets additional type-dependant information about the result. See 427 * {@link WebView#getHitTestResult()} for details. May either be null 428 * or contain extra information about this result. 429 * 430 * @return additional type-dependant information about the result 431 */ getExtra()432 public String getExtra() { 433 return mExtra; 434 } 435 } 436 437 /** 438 * Constructs a new WebView with a Context object. 439 * 440 * @param context a Context object used to access application assets 441 */ WebView(Context context)442 public WebView(Context context) { 443 this(context, null); 444 } 445 446 /** 447 * Constructs a new WebView with layout parameters. 448 * 449 * @param context a Context object used to access application assets 450 * @param attrs an AttributeSet passed to our parent 451 */ WebView(Context context, AttributeSet attrs)452 public WebView(Context context, AttributeSet attrs) { 453 this(context, attrs, com.android.internal.R.attr.webViewStyle); 454 } 455 456 /** 457 * Constructs a new WebView with layout parameters and a default style. 458 * 459 * @param context a Context object used to access application assets 460 * @param attrs an AttributeSet passed to our parent 461 * @param defStyleAttr an attribute in the current theme that contains a 462 * reference to a style resource that supplies default values for 463 * the view. Can be 0 to not look for defaults. 464 */ WebView(Context context, AttributeSet attrs, int defStyleAttr)465 public WebView(Context context, AttributeSet attrs, int defStyleAttr) { 466 this(context, attrs, defStyleAttr, 0); 467 } 468 469 /** 470 * Constructs a new WebView with layout parameters and a default style. 471 * 472 * @param context a Context object used to access application assets 473 * @param attrs an AttributeSet passed to our parent 474 * @param defStyleAttr an attribute in the current theme that contains a 475 * reference to a style resource that supplies default values for 476 * the view. Can be 0 to not look for defaults. 477 * @param defStyleRes a resource identifier of a style resource that 478 * supplies default values for the view, used only if 479 * defStyleAttr is 0 or can not be found in the theme. Can be 0 480 * to not look for defaults. 481 */ WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)482 public WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 483 this(context, attrs, defStyleAttr, defStyleRes, null, false); 484 } 485 486 /** 487 * Constructs a new WebView with layout parameters and a default style. 488 * 489 * @param context a Context object used to access application assets 490 * @param attrs an AttributeSet passed to our parent 491 * @param defStyleAttr an attribute in the current theme that contains a 492 * reference to a style resource that supplies default values for 493 * the view. Can be 0 to not look for defaults. 494 * @param privateBrowsing whether this WebView will be initialized in 495 * private mode 496 * 497 * @deprecated Private browsing is no longer supported directly via 498 * WebView and will be removed in a future release. Prefer using 499 * {@link WebSettings}, {@link WebViewDatabase}, {@link CookieManager} 500 * and {@link WebStorage} for fine-grained control of privacy data. 501 */ 502 @Deprecated WebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing)503 public WebView(Context context, AttributeSet attrs, int defStyleAttr, 504 boolean privateBrowsing) { 505 this(context, attrs, defStyleAttr, 0, null, privateBrowsing); 506 } 507 508 /** 509 * Constructs a new WebView with layout parameters, a default style and a set 510 * of custom Javscript interfaces to be added to this WebView at initialization 511 * time. This guarantees that these interfaces will be available when the JS 512 * context is initialized. 513 * 514 * @param context a Context object used to access application assets 515 * @param attrs an AttributeSet passed to our parent 516 * @param defStyleAttr an attribute in the current theme that contains a 517 * reference to a style resource that supplies default values for 518 * the view. Can be 0 to not look for defaults. 519 * @param javaScriptInterfaces a Map of interface names, as keys, and 520 * object implementing those interfaces, as 521 * values 522 * @param privateBrowsing whether this WebView will be initialized in 523 * private mode 524 * @hide This is used internally by dumprendertree, as it requires the javaScript interfaces to 525 * be added synchronously, before a subsequent loadUrl call takes effect. 526 */ WebView(Context context, AttributeSet attrs, int defStyleAttr, Map<String, Object> javaScriptInterfaces, boolean privateBrowsing)527 protected WebView(Context context, AttributeSet attrs, int defStyleAttr, 528 Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) { 529 this(context, attrs, defStyleAttr, 0, javaScriptInterfaces, privateBrowsing); 530 } 531 532 /** 533 * @hide 534 */ 535 @SuppressWarnings("deprecation") // for super() call into deprecated base class constructor. WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, Map<String, Object> javaScriptInterfaces, boolean privateBrowsing)536 protected WebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, 537 Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) { 538 super(context, attrs, defStyleAttr, defStyleRes); 539 if (context == null) { 540 throw new IllegalArgumentException("Invalid context argument"); 541 } 542 sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >= 543 Build.VERSION_CODES.JELLY_BEAN_MR2; 544 checkThread(); 545 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "WebView<init>"); 546 547 ensureProviderCreated(); 548 mProvider.init(javaScriptInterfaces, privateBrowsing); 549 // Post condition of creating a webview is the CookieSyncManager.getInstance() is allowed. 550 CookieSyncManager.setGetInstanceIsAllowed(); 551 } 552 553 /** 554 * Specifies whether the horizontal scrollbar has overlay style. 555 * 556 * @param overlay true if horizontal scrollbar should have overlay style 557 */ setHorizontalScrollbarOverlay(boolean overlay)558 public void setHorizontalScrollbarOverlay(boolean overlay) { 559 checkThread(); 560 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHorizontalScrollbarOverlay=" + overlay); 561 mProvider.setHorizontalScrollbarOverlay(overlay); 562 } 563 564 /** 565 * Specifies whether the vertical scrollbar has overlay style. 566 * 567 * @param overlay true if vertical scrollbar should have overlay style 568 */ setVerticalScrollbarOverlay(boolean overlay)569 public void setVerticalScrollbarOverlay(boolean overlay) { 570 checkThread(); 571 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setVerticalScrollbarOverlay=" + overlay); 572 mProvider.setVerticalScrollbarOverlay(overlay); 573 } 574 575 /** 576 * Gets whether horizontal scrollbar has overlay style. 577 * 578 * @return true if horizontal scrollbar has overlay style 579 */ overlayHorizontalScrollbar()580 public boolean overlayHorizontalScrollbar() { 581 checkThread(); 582 return mProvider.overlayHorizontalScrollbar(); 583 } 584 585 /** 586 * Gets whether vertical scrollbar has overlay style. 587 * 588 * @return true if vertical scrollbar has overlay style 589 */ overlayVerticalScrollbar()590 public boolean overlayVerticalScrollbar() { 591 checkThread(); 592 return mProvider.overlayVerticalScrollbar(); 593 } 594 595 /** 596 * Gets the visible height (in pixels) of the embedded title bar (if any). 597 * 598 * @deprecated This method is now obsolete. 599 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 600 */ getVisibleTitleHeight()601 public int getVisibleTitleHeight() { 602 checkThread(); 603 return mProvider.getVisibleTitleHeight(); 604 } 605 606 /** 607 * Gets the SSL certificate for the main top-level page or null if there is 608 * no certificate (the site is not secure). 609 * 610 * @return the SSL certificate for the main top-level page 611 */ getCertificate()612 public SslCertificate getCertificate() { 613 checkThread(); 614 return mProvider.getCertificate(); 615 } 616 617 /** 618 * Sets the SSL certificate for the main top-level page. 619 * 620 * @deprecated Calling this function has no useful effect, and will be 621 * ignored in future releases. 622 */ 623 @Deprecated setCertificate(SslCertificate certificate)624 public void setCertificate(SslCertificate certificate) { 625 checkThread(); 626 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setCertificate=" + certificate); 627 mProvider.setCertificate(certificate); 628 } 629 630 //------------------------------------------------------------------------- 631 // Methods called by activity 632 //------------------------------------------------------------------------- 633 634 /** 635 * Sets a username and password pair for the specified host. This data is 636 * used by the Webview to autocomplete username and password fields in web 637 * forms. Note that this is unrelated to the credentials used for HTTP 638 * authentication. 639 * 640 * @param host the host that required the credentials 641 * @param username the username for the given host 642 * @param password the password for the given host 643 * @see WebViewDatabase#clearUsernamePassword 644 * @see WebViewDatabase#hasUsernamePassword 645 * @deprecated Saving passwords in WebView will not be supported in future versions. 646 */ 647 @Deprecated savePassword(String host, String username, String password)648 public void savePassword(String host, String username, String password) { 649 checkThread(); 650 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePassword=" + host); 651 mProvider.savePassword(host, username, password); 652 } 653 654 /** 655 * Stores HTTP authentication credentials for a given host and realm. This 656 * method is intended to be used with 657 * {@link WebViewClient#onReceivedHttpAuthRequest}. 658 * 659 * @param host the host to which the credentials apply 660 * @param realm the realm to which the credentials apply 661 * @param username the username 662 * @param password the password 663 * @see #getHttpAuthUsernamePassword 664 * @see WebViewDatabase#hasHttpAuthUsernamePassword 665 * @see WebViewDatabase#clearHttpAuthUsernamePassword 666 */ setHttpAuthUsernamePassword(String host, String realm, String username, String password)667 public void setHttpAuthUsernamePassword(String host, String realm, 668 String username, String password) { 669 checkThread(); 670 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setHttpAuthUsernamePassword=" + host); 671 mProvider.setHttpAuthUsernamePassword(host, realm, username, password); 672 } 673 674 /** 675 * Retrieves HTTP authentication credentials for a given host and realm. 676 * This method is intended to be used with 677 * {@link WebViewClient#onReceivedHttpAuthRequest}. 678 * 679 * @param host the host to which the credentials apply 680 * @param realm the realm to which the credentials apply 681 * @return the credentials as a String array, if found. The first element 682 * is the username and the second element is the password. Null if 683 * no credentials are found. 684 * @see #setHttpAuthUsernamePassword 685 * @see WebViewDatabase#hasHttpAuthUsernamePassword 686 * @see WebViewDatabase#clearHttpAuthUsernamePassword 687 */ getHttpAuthUsernamePassword(String host, String realm)688 public String[] getHttpAuthUsernamePassword(String host, String realm) { 689 checkThread(); 690 return mProvider.getHttpAuthUsernamePassword(host, realm); 691 } 692 693 /** 694 * Destroys the internal state of this WebView. This method should be called 695 * after this WebView has been removed from the view system. No other 696 * methods may be called on this WebView after destroy. 697 */ destroy()698 public void destroy() { 699 checkThread(); 700 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "destroy"); 701 mProvider.destroy(); 702 } 703 704 /** 705 * Enables platform notifications of data state and proxy changes. 706 * Notifications are enabled by default. 707 * 708 * @deprecated This method is now obsolete. 709 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 710 */ 711 @Deprecated enablePlatformNotifications()712 public static void enablePlatformNotifications() { 713 // noop 714 } 715 716 /** 717 * Disables platform notifications of data state and proxy changes. 718 * Notifications are enabled by default. 719 * 720 * @deprecated This method is now obsolete. 721 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 722 */ 723 @Deprecated disablePlatformNotifications()724 public static void disablePlatformNotifications() { 725 // noop 726 } 727 728 /** 729 * Used only by internal tests to free up memory. 730 * 731 * @hide 732 */ freeMemoryForTests()733 public static void freeMemoryForTests() { 734 getFactory().getStatics().freeMemoryForTests(); 735 } 736 737 /** 738 * Informs WebView of the network state. This is used to set 739 * the JavaScript property window.navigator.isOnline and 740 * generates the online/offline event as specified in HTML5, sec. 5.7.7 741 * 742 * @param networkUp a boolean indicating if network is available 743 */ setNetworkAvailable(boolean networkUp)744 public void setNetworkAvailable(boolean networkUp) { 745 checkThread(); 746 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setNetworkAvailable=" + networkUp); 747 mProvider.setNetworkAvailable(networkUp); 748 } 749 750 /** 751 * Saves the state of this WebView used in 752 * {@link android.app.Activity#onSaveInstanceState}. Please note that this 753 * method no longer stores the display data for this WebView. The previous 754 * behavior could potentially leak files if {@link #restoreState} was never 755 * called. 756 * 757 * @param outState the Bundle to store this WebView's state 758 * @return the same copy of the back/forward list used to save the state. If 759 * saveState fails, the returned list will be null. 760 */ saveState(Bundle outState)761 public WebBackForwardList saveState(Bundle outState) { 762 checkThread(); 763 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveState"); 764 return mProvider.saveState(outState); 765 } 766 767 /** 768 * Saves the current display data to the Bundle given. Used in conjunction 769 * with {@link #saveState}. 770 * @param b a Bundle to store the display data 771 * @param dest the file to store the serialized picture data. Will be 772 * overwritten with this WebView's picture data. 773 * @return true if the picture was successfully saved 774 * @deprecated This method is now obsolete. 775 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 776 */ 777 @Deprecated savePicture(Bundle b, final File dest)778 public boolean savePicture(Bundle b, final File dest) { 779 checkThread(); 780 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "savePicture=" + dest.getName()); 781 return mProvider.savePicture(b, dest); 782 } 783 784 /** 785 * Restores the display data that was saved in {@link #savePicture}. Used in 786 * conjunction with {@link #restoreState}. Note that this will not work if 787 * this WebView is hardware accelerated. 788 * 789 * @param b a Bundle containing the saved display data 790 * @param src the file where the picture data was stored 791 * @return true if the picture was successfully restored 792 * @deprecated This method is now obsolete. 793 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 794 */ 795 @Deprecated restorePicture(Bundle b, File src)796 public boolean restorePicture(Bundle b, File src) { 797 checkThread(); 798 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restorePicture=" + src.getName()); 799 return mProvider.restorePicture(b, src); 800 } 801 802 /** 803 * Restores the state of this WebView from the given Bundle. This method is 804 * intended for use in {@link android.app.Activity#onRestoreInstanceState} 805 * and should be called to restore the state of this WebView. If 806 * it is called after this WebView has had a chance to build state (load 807 * pages, create a back/forward list, etc.) there may be undesirable 808 * side-effects. Please note that this method no longer restores the 809 * display data for this WebView. 810 * 811 * @param inState the incoming Bundle of state 812 * @return the restored back/forward list or null if restoreState failed 813 */ restoreState(Bundle inState)814 public WebBackForwardList restoreState(Bundle inState) { 815 checkThread(); 816 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "restoreState"); 817 return mProvider.restoreState(inState); 818 } 819 820 /** 821 * Loads the given URL with the specified additional HTTP headers. 822 * 823 * @param url the URL of the resource to load 824 * @param additionalHttpHeaders the additional headers to be used in the 825 * HTTP request for this URL, specified as a map from name to 826 * value. Note that if this map contains any of the headers 827 * that are set by default by this WebView, such as those 828 * controlling caching, accept types or the User-Agent, their 829 * values may be overriden by this WebView's defaults. 830 */ loadUrl(String url, Map<String, String> additionalHttpHeaders)831 public void loadUrl(String url, Map<String, String> additionalHttpHeaders) { 832 checkThread(); 833 if (DebugFlags.TRACE_API) { 834 StringBuilder headers = new StringBuilder(); 835 if (additionalHttpHeaders != null) { 836 for (Map.Entry<String, String> entry : additionalHttpHeaders.entrySet()) { 837 headers.append(entry.getKey() + ":" + entry.getValue() + "\n"); 838 } 839 } 840 Log.d(LOGTAG, "loadUrl(extra headers)=" + url + "\n" + headers); 841 } 842 mProvider.loadUrl(url, additionalHttpHeaders); 843 } 844 845 /** 846 * Loads the given URL. 847 * 848 * @param url the URL of the resource to load 849 */ loadUrl(String url)850 public void loadUrl(String url) { 851 checkThread(); 852 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadUrl=" + url); 853 mProvider.loadUrl(url); 854 } 855 856 /** 857 * Loads the URL with postData using "POST" method into this WebView. If url 858 * is not a network URL, it will be loaded with {@link #loadUrl(String)} 859 * instead, ignoring the postData param. 860 * 861 * @param url the URL of the resource to load 862 * @param postData the data will be passed to "POST" request, which must be 863 * be "application/x-www-form-urlencoded" encoded. 864 */ postUrl(String url, byte[] postData)865 public void postUrl(String url, byte[] postData) { 866 checkThread(); 867 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "postUrl=" + url); 868 if (URLUtil.isNetworkUrl(url)) { 869 mProvider.postUrl(url, postData); 870 } else { 871 mProvider.loadUrl(url); 872 } 873 } 874 875 /** 876 * Loads the given data into this WebView using a 'data' scheme URL. 877 * <p> 878 * Note that JavaScript's same origin policy means that script running in a 879 * page loaded using this method will be unable to access content loaded 880 * using any scheme other than 'data', including 'http(s)'. To avoid this 881 * restriction, use {@link 882 * #loadDataWithBaseURL(String,String,String,String,String) 883 * loadDataWithBaseURL()} with an appropriate base URL. 884 * <p> 885 * The encoding parameter specifies whether the data is base64 or URL 886 * encoded. If the data is base64 encoded, the value of the encoding 887 * parameter must be 'base64'. For all other values of the parameter, 888 * including null, it is assumed that the data uses ASCII encoding for 889 * octets inside the range of safe URL characters and use the standard %xx 890 * hex encoding of URLs for octets outside that range. For example, '#', 891 * '%', '\', '?' should be replaced by %23, %25, %27, %3f respectively. 892 * <p> 893 * The 'data' scheme URL formed by this method uses the default US-ASCII 894 * charset. If you need need to set a different charset, you should form a 895 * 'data' scheme URL which explicitly specifies a charset parameter in the 896 * mediatype portion of the URL and call {@link #loadUrl(String)} instead. 897 * Note that the charset obtained from the mediatype portion of a data URL 898 * always overrides that specified in the HTML or XML document itself. 899 * 900 * @param data a String of data in the given encoding 901 * @param mimeType the MIME type of the data, e.g. 'text/html' 902 * @param encoding the encoding of the data 903 */ loadData(String data, String mimeType, String encoding)904 public void loadData(String data, String mimeType, String encoding) { 905 checkThread(); 906 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadData"); 907 mProvider.loadData(data, mimeType, encoding); 908 } 909 910 /** 911 * Loads the given data into this WebView, using baseUrl as the base URL for 912 * the content. The base URL is used both to resolve relative URLs and when 913 * applying JavaScript's same origin policy. The historyUrl is used for the 914 * history entry. 915 * <p> 916 * Note that content specified in this way can access local device files 917 * (via 'file' scheme URLs) only if baseUrl specifies a scheme other than 918 * 'http', 'https', 'ftp', 'ftps', 'about' or 'javascript'. 919 * <p> 920 * If the base URL uses the data scheme, this method is equivalent to 921 * calling {@link #loadData(String,String,String) loadData()} and the 922 * historyUrl is ignored, and the data will be treated as part of a data: URL. 923 * If the base URL uses any other scheme, then the data will be loaded into 924 * the WebView as a plain string (i.e. not part of a data URL) and any URL-encoded 925 * entities in the string will not be decoded. 926 * 927 * @param baseUrl the URL to use as the page's base URL. If null defaults to 928 * 'about:blank'. 929 * @param data a String of data in the given encoding 930 * @param mimeType the MIMEType of the data, e.g. 'text/html'. If null, 931 * defaults to 'text/html'. 932 * @param encoding the encoding of the data 933 * @param historyUrl the URL to use as the history entry. If null defaults 934 * to 'about:blank'. If non-null, this must be a valid URL. 935 */ loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)936 public void loadDataWithBaseURL(String baseUrl, String data, 937 String mimeType, String encoding, String historyUrl) { 938 checkThread(); 939 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "loadDataWithBaseURL=" + baseUrl); 940 mProvider.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl); 941 } 942 943 /** 944 * Asynchronously evaluates JavaScript in the context of the currently displayed page. 945 * If non-null, |resultCallback| will be invoked with any result returned from that 946 * execution. This method must be called on the UI thread and the callback will 947 * be made on the UI thread. 948 * 949 * @param script the JavaScript to execute. 950 * @param resultCallback A callback to be invoked when the script execution 951 * completes with the result of the execution (if any). 952 * May be null if no notificaion of the result is required. 953 */ evaluateJavascript(String script, ValueCallback<String> resultCallback)954 public void evaluateJavascript(String script, ValueCallback<String> resultCallback) { 955 checkThread(); 956 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "evaluateJavascript=" + script); 957 mProvider.evaluateJavaScript(script, resultCallback); 958 } 959 960 /** 961 * Saves the current view as a web archive. 962 * 963 * @param filename the filename where the archive should be placed 964 */ saveWebArchive(String filename)965 public void saveWebArchive(String filename) { 966 checkThread(); 967 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive=" + filename); 968 mProvider.saveWebArchive(filename); 969 } 970 971 /** 972 * Saves the current view as a web archive. 973 * 974 * @param basename the filename where the archive should be placed 975 * @param autoname if false, takes basename to be a file. If true, basename 976 * is assumed to be a directory in which a filename will be 977 * chosen according to the URL of the current page. 978 * @param callback called after the web archive has been saved. The 979 * parameter for onReceiveValue will either be the filename 980 * under which the file was saved, or null if saving the 981 * file failed. 982 */ saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback)983 public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) { 984 checkThread(); 985 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "saveWebArchive(auto)=" + basename); 986 mProvider.saveWebArchive(basename, autoname, callback); 987 } 988 989 /** 990 * Stops the current load. 991 */ stopLoading()992 public void stopLoading() { 993 checkThread(); 994 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "stopLoading"); 995 mProvider.stopLoading(); 996 } 997 998 /** 999 * Reloads the current URL. 1000 */ reload()1001 public void reload() { 1002 checkThread(); 1003 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "reload"); 1004 mProvider.reload(); 1005 } 1006 1007 /** 1008 * Gets whether this WebView has a back history item. 1009 * 1010 * @return true iff this WebView has a back history item 1011 */ canGoBack()1012 public boolean canGoBack() { 1013 checkThread(); 1014 return mProvider.canGoBack(); 1015 } 1016 1017 /** 1018 * Goes back in the history of this WebView. 1019 */ goBack()1020 public void goBack() { 1021 checkThread(); 1022 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBack"); 1023 mProvider.goBack(); 1024 } 1025 1026 /** 1027 * Gets whether this WebView has a forward history item. 1028 * 1029 * @return true iff this Webview has a forward history item 1030 */ canGoForward()1031 public boolean canGoForward() { 1032 checkThread(); 1033 return mProvider.canGoForward(); 1034 } 1035 1036 /** 1037 * Goes forward in the history of this WebView. 1038 */ goForward()1039 public void goForward() { 1040 checkThread(); 1041 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goForward"); 1042 mProvider.goForward(); 1043 } 1044 1045 /** 1046 * Gets whether the page can go back or forward the given 1047 * number of steps. 1048 * 1049 * @param steps the negative or positive number of steps to move the 1050 * history 1051 */ canGoBackOrForward(int steps)1052 public boolean canGoBackOrForward(int steps) { 1053 checkThread(); 1054 return mProvider.canGoBackOrForward(steps); 1055 } 1056 1057 /** 1058 * Goes to the history item that is the number of steps away from 1059 * the current item. Steps is negative if backward and positive 1060 * if forward. 1061 * 1062 * @param steps the number of steps to take back or forward in the back 1063 * forward list 1064 */ goBackOrForward(int steps)1065 public void goBackOrForward(int steps) { 1066 checkThread(); 1067 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "goBackOrForwad=" + steps); 1068 mProvider.goBackOrForward(steps); 1069 } 1070 1071 /** 1072 * Gets whether private browsing is enabled in this WebView. 1073 */ isPrivateBrowsingEnabled()1074 public boolean isPrivateBrowsingEnabled() { 1075 checkThread(); 1076 return mProvider.isPrivateBrowsingEnabled(); 1077 } 1078 1079 /** 1080 * Scrolls the contents of this WebView up by half the view size. 1081 * 1082 * @param top true to jump to the top of the page 1083 * @return true if the page was scrolled 1084 */ pageUp(boolean top)1085 public boolean pageUp(boolean top) { 1086 checkThread(); 1087 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageUp"); 1088 return mProvider.pageUp(top); 1089 } 1090 1091 /** 1092 * Scrolls the contents of this WebView down by half the page size. 1093 * 1094 * @param bottom true to jump to bottom of page 1095 * @return true if the page was scrolled 1096 */ pageDown(boolean bottom)1097 public boolean pageDown(boolean bottom) { 1098 checkThread(); 1099 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pageDown"); 1100 return mProvider.pageDown(bottom); 1101 } 1102 1103 /** 1104 * Clears this WebView so that onDraw() will draw nothing but white background, 1105 * and onMeasure() will return 0 if MeasureSpec is not MeasureSpec.EXACTLY. 1106 * @deprecated Use WebView.loadUrl("about:blank") to reliably reset the view state 1107 * and release page resources (including any running JavaScript). 1108 */ 1109 @Deprecated clearView()1110 public void clearView() { 1111 checkThread(); 1112 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearView"); 1113 mProvider.clearView(); 1114 } 1115 1116 /** 1117 * Gets a new picture that captures the current contents of this WebView. 1118 * The picture is of the entire document being displayed, and is not 1119 * limited to the area currently displayed by this WebView. Also, the 1120 * picture is a static copy and is unaffected by later changes to the 1121 * content being displayed. 1122 * <p> 1123 * Note that due to internal changes, for API levels between 1124 * {@link android.os.Build.VERSION_CODES#HONEYCOMB} and 1125 * {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH} inclusive, the 1126 * picture does not include fixed position elements or scrollable divs. 1127 * <p> 1128 * Note that from {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} the returned picture 1129 * should only be drawn into bitmap-backed Canvas - using any other type of Canvas will involve 1130 * additional conversion at a cost in memory and performance. Also the 1131 * {@link android.graphics.Picture#createFromStream} and 1132 * {@link android.graphics.Picture#writeToStream} methods are not supported on the 1133 * returned object. 1134 * 1135 * @deprecated Use {@link #onDraw} to obtain a bitmap snapshot of the WebView, or 1136 * {@link #saveWebArchive} to save the content to a file. 1137 * 1138 * @return a picture that captures the current contents of this WebView 1139 */ 1140 @Deprecated capturePicture()1141 public Picture capturePicture() { 1142 checkThread(); 1143 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "capturePicture"); 1144 return mProvider.capturePicture(); 1145 } 1146 1147 /** 1148 * @deprecated Use {@link #createPrintDocumentAdapter(String)} which requires user 1149 * to provide a print document name. 1150 */ 1151 @Deprecated createPrintDocumentAdapter()1152 public PrintDocumentAdapter createPrintDocumentAdapter() { 1153 checkThread(); 1154 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "createPrintDocumentAdapter"); 1155 return mProvider.createPrintDocumentAdapter("default"); 1156 } 1157 1158 /** 1159 * Creates a PrintDocumentAdapter that provides the content of this Webview for printing. 1160 * 1161 * The adapter works by converting the Webview contents to a PDF stream. The Webview cannot 1162 * be drawn during the conversion process - any such draws are undefined. It is recommended 1163 * to use a dedicated off screen Webview for the printing. If necessary, an application may 1164 * temporarily hide a visible WebView by using a custom PrintDocumentAdapter instance 1165 * wrapped around the object returned and observing the onStart and onFinish methods. See 1166 * {@link android.print.PrintDocumentAdapter} for more information. 1167 * 1168 * @param documentName The user-facing name of the printed document. See 1169 * {@link android.print.PrintDocumentInfo} 1170 */ createPrintDocumentAdapter(String documentName)1171 public PrintDocumentAdapter createPrintDocumentAdapter(String documentName) { 1172 checkThread(); 1173 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "createPrintDocumentAdapter"); 1174 return mProvider.createPrintDocumentAdapter(documentName); 1175 } 1176 1177 /** 1178 * Gets the current scale of this WebView. 1179 * 1180 * @return the current scale 1181 * 1182 * @deprecated This method is prone to inaccuracy due to race conditions 1183 * between the web rendering and UI threads; prefer 1184 * {@link WebViewClient#onScaleChanged}. 1185 */ 1186 @Deprecated 1187 @ViewDebug.ExportedProperty(category = "webview") getScale()1188 public float getScale() { 1189 checkThread(); 1190 return mProvider.getScale(); 1191 } 1192 1193 /** 1194 * Sets the initial scale for this WebView. 0 means default. 1195 * The behavior for the default scale depends on the state of 1196 * {@link WebSettings#getUseWideViewPort()} and 1197 * {@link WebSettings#getLoadWithOverviewMode()}. 1198 * If the content fits into the WebView control by width, then 1199 * the zoom is set to 100%. For wide content, the behavor 1200 * depends on the state of {@link WebSettings#getLoadWithOverviewMode()}. 1201 * If its value is true, the content will be zoomed out to be fit 1202 * by width into the WebView control, otherwise not. 1203 * 1204 * If initial scale is greater than 0, WebView starts with this value 1205 * as initial scale. 1206 * Please note that unlike the scale properties in the viewport meta tag, 1207 * this method doesn't take the screen density into account. 1208 * 1209 * @param scaleInPercent the initial scale in percent 1210 */ setInitialScale(int scaleInPercent)1211 public void setInitialScale(int scaleInPercent) { 1212 checkThread(); 1213 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setInitialScale=" + scaleInPercent); 1214 mProvider.setInitialScale(scaleInPercent); 1215 } 1216 1217 /** 1218 * Invokes the graphical zoom picker widget for this WebView. This will 1219 * result in the zoom widget appearing on the screen to control the zoom 1220 * level of this WebView. 1221 */ invokeZoomPicker()1222 public void invokeZoomPicker() { 1223 checkThread(); 1224 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "invokeZoomPicker"); 1225 mProvider.invokeZoomPicker(); 1226 } 1227 1228 /** 1229 * Gets a HitTestResult based on the current cursor node. If a HTML::a 1230 * tag is found and the anchor has a non-JavaScript URL, the HitTestResult 1231 * type is set to SRC_ANCHOR_TYPE and the URL is set in the "extra" field. 1232 * If the anchor does not have a URL or if it is a JavaScript URL, the type 1233 * will be UNKNOWN_TYPE and the URL has to be retrieved through 1234 * {@link #requestFocusNodeHref} asynchronously. If a HTML::img tag is 1235 * found, the HitTestResult type is set to IMAGE_TYPE and the URL is set in 1236 * the "extra" field. A type of 1237 * SRC_IMAGE_ANCHOR_TYPE indicates an anchor with a URL that has an image as 1238 * a child node. If a phone number is found, the HitTestResult type is set 1239 * to PHONE_TYPE and the phone number is set in the "extra" field of 1240 * HitTestResult. If a map address is found, the HitTestResult type is set 1241 * to GEO_TYPE and the address is set in the "extra" field of HitTestResult. 1242 * If an email address is found, the HitTestResult type is set to EMAIL_TYPE 1243 * and the email is set in the "extra" field of HitTestResult. Otherwise, 1244 * HitTestResult type is set to UNKNOWN_TYPE. 1245 */ getHitTestResult()1246 public HitTestResult getHitTestResult() { 1247 checkThread(); 1248 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "getHitTestResult"); 1249 return mProvider.getHitTestResult(); 1250 } 1251 1252 /** 1253 * Requests the anchor or image element URL at the last tapped point. 1254 * If hrefMsg is null, this method returns immediately and does not 1255 * dispatch hrefMsg to its target. If the tapped point hits an image, 1256 * an anchor, or an image in an anchor, the message associates 1257 * strings in named keys in its data. The value paired with the key 1258 * may be an empty string. 1259 * 1260 * @param hrefMsg the message to be dispatched with the result of the 1261 * request. The message data contains three keys. "url" 1262 * returns the anchor's href attribute. "title" returns the 1263 * anchor's text. "src" returns the image's src attribute. 1264 */ requestFocusNodeHref(Message hrefMsg)1265 public void requestFocusNodeHref(Message hrefMsg) { 1266 checkThread(); 1267 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestFocusNodeHref"); 1268 mProvider.requestFocusNodeHref(hrefMsg); 1269 } 1270 1271 /** 1272 * Requests the URL of the image last touched by the user. msg will be sent 1273 * to its target with a String representing the URL as its object. 1274 * 1275 * @param msg the message to be dispatched with the result of the request 1276 * as the data member with "url" as key. The result can be null. 1277 */ requestImageRef(Message msg)1278 public void requestImageRef(Message msg) { 1279 checkThread(); 1280 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "requestImageRef"); 1281 mProvider.requestImageRef(msg); 1282 } 1283 1284 /** 1285 * Gets the URL for the current page. This is not always the same as the URL 1286 * passed to WebViewClient.onPageStarted because although the load for 1287 * that URL has begun, the current page may not have changed. 1288 * 1289 * @return the URL for the current page 1290 */ 1291 @ViewDebug.ExportedProperty(category = "webview") getUrl()1292 public String getUrl() { 1293 checkThread(); 1294 return mProvider.getUrl(); 1295 } 1296 1297 /** 1298 * Gets the original URL for the current page. This is not always the same 1299 * as the URL passed to WebViewClient.onPageStarted because although the 1300 * load for that URL has begun, the current page may not have changed. 1301 * Also, there may have been redirects resulting in a different URL to that 1302 * originally requested. 1303 * 1304 * @return the URL that was originally requested for the current page 1305 */ 1306 @ViewDebug.ExportedProperty(category = "webview") getOriginalUrl()1307 public String getOriginalUrl() { 1308 checkThread(); 1309 return mProvider.getOriginalUrl(); 1310 } 1311 1312 /** 1313 * Gets the title for the current page. This is the title of the current page 1314 * until WebViewClient.onReceivedTitle is called. 1315 * 1316 * @return the title for the current page 1317 */ 1318 @ViewDebug.ExportedProperty(category = "webview") getTitle()1319 public String getTitle() { 1320 checkThread(); 1321 return mProvider.getTitle(); 1322 } 1323 1324 /** 1325 * Gets the favicon for the current page. This is the favicon of the current 1326 * page until WebViewClient.onReceivedIcon is called. 1327 * 1328 * @return the favicon for the current page 1329 */ getFavicon()1330 public Bitmap getFavicon() { 1331 checkThread(); 1332 return mProvider.getFavicon(); 1333 } 1334 1335 /** 1336 * Gets the touch icon URL for the apple-touch-icon <link> element, or 1337 * a URL on this site's server pointing to the standard location of a 1338 * touch icon. 1339 * 1340 * @hide 1341 */ getTouchIconUrl()1342 public String getTouchIconUrl() { 1343 return mProvider.getTouchIconUrl(); 1344 } 1345 1346 /** 1347 * Gets the progress for the current page. 1348 * 1349 * @return the progress for the current page between 0 and 100 1350 */ getProgress()1351 public int getProgress() { 1352 checkThread(); 1353 return mProvider.getProgress(); 1354 } 1355 1356 /** 1357 * Gets the height of the HTML content. 1358 * 1359 * @return the height of the HTML content 1360 */ 1361 @ViewDebug.ExportedProperty(category = "webview") getContentHeight()1362 public int getContentHeight() { 1363 checkThread(); 1364 return mProvider.getContentHeight(); 1365 } 1366 1367 /** 1368 * Gets the width of the HTML content. 1369 * 1370 * @return the width of the HTML content 1371 * @hide 1372 */ 1373 @ViewDebug.ExportedProperty(category = "webview") getContentWidth()1374 public int getContentWidth() { 1375 return mProvider.getContentWidth(); 1376 } 1377 1378 /** 1379 * Pauses all layout, parsing, and JavaScript timers for all WebViews. This 1380 * is a global requests, not restricted to just this WebView. This can be 1381 * useful if the application has been paused. 1382 */ pauseTimers()1383 public void pauseTimers() { 1384 checkThread(); 1385 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "pauseTimers"); 1386 mProvider.pauseTimers(); 1387 } 1388 1389 /** 1390 * Resumes all layout, parsing, and JavaScript timers for all WebViews. 1391 * This will resume dispatching all timers. 1392 */ resumeTimers()1393 public void resumeTimers() { 1394 checkThread(); 1395 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "resumeTimers"); 1396 mProvider.resumeTimers(); 1397 } 1398 1399 /** 1400 * Pauses any extra processing associated with this WebView and its 1401 * associated DOM, plugins, JavaScript etc. For example, if this WebView is 1402 * taken offscreen, this could be called to reduce unnecessary CPU or 1403 * network traffic. When this WebView is again "active", call onResume(). 1404 * Note that this differs from pauseTimers(), which affects all WebViews. 1405 */ onPause()1406 public void onPause() { 1407 checkThread(); 1408 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onPause"); 1409 mProvider.onPause(); 1410 } 1411 1412 /** 1413 * Resumes a WebView after a previous call to onPause(). 1414 */ onResume()1415 public void onResume() { 1416 checkThread(); 1417 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "onResume"); 1418 mProvider.onResume(); 1419 } 1420 1421 /** 1422 * Gets whether this WebView is paused, meaning onPause() was called. 1423 * Calling onResume() sets the paused state back to false. 1424 * 1425 * @hide 1426 */ isPaused()1427 public boolean isPaused() { 1428 return mProvider.isPaused(); 1429 } 1430 1431 /** 1432 * Informs this WebView that memory is low so that it can free any available 1433 * memory. 1434 * @deprecated Memory caches are automatically dropped when no longer needed, and in response 1435 * to system memory pressure. 1436 */ 1437 @Deprecated freeMemory()1438 public void freeMemory() { 1439 checkThread(); 1440 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "freeMemory"); 1441 mProvider.freeMemory(); 1442 } 1443 1444 /** 1445 * Clears the resource cache. Note that the cache is per-application, so 1446 * this will clear the cache for all WebViews used. 1447 * 1448 * @param includeDiskFiles if false, only the RAM cache is cleared 1449 */ clearCache(boolean includeDiskFiles)1450 public void clearCache(boolean includeDiskFiles) { 1451 checkThread(); 1452 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearCache"); 1453 mProvider.clearCache(includeDiskFiles); 1454 } 1455 1456 /** 1457 * Removes the autocomplete popup from the currently focused form field, if 1458 * present. Note this only affects the display of the autocomplete popup, 1459 * it does not remove any saved form data from this WebView's store. To do 1460 * that, use {@link WebViewDatabase#clearFormData}. 1461 */ clearFormData()1462 public void clearFormData() { 1463 checkThread(); 1464 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearFormData"); 1465 mProvider.clearFormData(); 1466 } 1467 1468 /** 1469 * Tells this WebView to clear its internal back/forward list. 1470 */ clearHistory()1471 public void clearHistory() { 1472 checkThread(); 1473 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearHistory"); 1474 mProvider.clearHistory(); 1475 } 1476 1477 /** 1478 * Clears the SSL preferences table stored in response to proceeding with 1479 * SSL certificate errors. 1480 */ clearSslPreferences()1481 public void clearSslPreferences() { 1482 checkThread(); 1483 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearSslPreferences"); 1484 mProvider.clearSslPreferences(); 1485 } 1486 1487 /** 1488 * Clears the client certificate preferences stored in response 1489 * to proceeding/cancelling client cert requests. Note that Webview 1490 * automatically clears these preferences when it receives a 1491 * {@link KeyChain#ACTION_STORAGE_CHANGED} intent. The preferences are 1492 * shared by all the webviews that are created by the embedder application. 1493 * 1494 * @param onCleared A runnable to be invoked when client certs are cleared. 1495 * The embedder can pass null if not interested in the 1496 * callback. The runnable will be called in UI thread. 1497 */ clearClientCertPreferences(Runnable onCleared)1498 public static void clearClientCertPreferences(Runnable onCleared) { 1499 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearClientCertPreferences"); 1500 getFactory().getStatics().clearClientCertPreferences(onCleared); 1501 } 1502 1503 /** 1504 * Gets the WebBackForwardList for this WebView. This contains the 1505 * back/forward list for use in querying each item in the history stack. 1506 * This is a copy of the private WebBackForwardList so it contains only a 1507 * snapshot of the current state. Multiple calls to this method may return 1508 * different objects. The object returned from this method will not be 1509 * updated to reflect any new state. 1510 */ copyBackForwardList()1511 public WebBackForwardList copyBackForwardList() { 1512 checkThread(); 1513 return mProvider.copyBackForwardList(); 1514 1515 } 1516 1517 /** 1518 * Registers the listener to be notified as find-on-page operations 1519 * progress. This will replace the current listener. 1520 * 1521 * @param listener an implementation of {@link FindListener} 1522 */ setFindListener(FindListener listener)1523 public void setFindListener(FindListener listener) { 1524 checkThread(); 1525 setupFindListenerIfNeeded(); 1526 mFindListener.mUserFindListener = listener; 1527 } 1528 1529 /** 1530 * Highlights and scrolls to the next match found by 1531 * {@link #findAllAsync}, wrapping around page boundaries as necessary. 1532 * Notifies any registered {@link FindListener}. If {@link #findAllAsync(String)} 1533 * has not been called yet, or if {@link #clearMatches} has been called since the 1534 * last find operation, this function does nothing. 1535 * 1536 * @param forward the direction to search 1537 * @see #setFindListener 1538 */ findNext(boolean forward)1539 public void findNext(boolean forward) { 1540 checkThread(); 1541 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findNext"); 1542 mProvider.findNext(forward); 1543 } 1544 1545 /** 1546 * Finds all instances of find on the page and highlights them. 1547 * Notifies any registered {@link FindListener}. 1548 * 1549 * @param find the string to find 1550 * @return the number of occurances of the String "find" that were found 1551 * @deprecated {@link #findAllAsync} is preferred. 1552 * @see #setFindListener 1553 */ 1554 @Deprecated findAll(String find)1555 public int findAll(String find) { 1556 checkThread(); 1557 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAll"); 1558 StrictMode.noteSlowCall("findAll blocks UI: prefer findAllAsync"); 1559 return mProvider.findAll(find); 1560 } 1561 1562 /** 1563 * Finds all instances of find on the page and highlights them, 1564 * asynchronously. Notifies any registered {@link FindListener}. 1565 * Successive calls to this will cancel any pending searches. 1566 * 1567 * @param find the string to find. 1568 * @see #setFindListener 1569 */ findAllAsync(String find)1570 public void findAllAsync(String find) { 1571 checkThread(); 1572 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "findAllAsync"); 1573 mProvider.findAllAsync(find); 1574 } 1575 1576 /** 1577 * Starts an ActionMode for finding text in this WebView. Only works if this 1578 * WebView is attached to the view system. 1579 * 1580 * @param text if non-null, will be the initial text to search for. 1581 * Otherwise, the last String searched for in this WebView will 1582 * be used to start. 1583 * @param showIme if true, show the IME, assuming the user will begin typing. 1584 * If false and text is non-null, perform a find all. 1585 * @return true if the find dialog is shown, false otherwise 1586 * @deprecated This method does not work reliably on all Android versions; 1587 * implementing a custom find dialog using WebView.findAllAsync() 1588 * provides a more robust solution. 1589 */ 1590 @Deprecated showFindDialog(String text, boolean showIme)1591 public boolean showFindDialog(String text, boolean showIme) { 1592 checkThread(); 1593 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "showFindDialog"); 1594 return mProvider.showFindDialog(text, showIme); 1595 } 1596 1597 /** 1598 * Gets the first substring consisting of the address of a physical 1599 * location. Currently, only addresses in the United States are detected, 1600 * and consist of: 1601 * <ul> 1602 * <li>a house number</li> 1603 * <li>a street name</li> 1604 * <li>a street type (Road, Circle, etc), either spelled out or 1605 * abbreviated</li> 1606 * <li>a city name</li> 1607 * <li>a state or territory, either spelled out or two-letter abbr</li> 1608 * <li>an optional 5 digit or 9 digit zip code</li> 1609 * </ul> 1610 * All names must be correctly capitalized, and the zip code, if present, 1611 * must be valid for the state. The street type must be a standard USPS 1612 * spelling or abbreviation. The state or territory must also be spelled 1613 * or abbreviated using USPS standards. The house number may not exceed 1614 * five digits. 1615 * 1616 * @param addr the string to search for addresses 1617 * @return the address, or if no address is found, null 1618 */ findAddress(String addr)1619 public static String findAddress(String addr) { 1620 // TODO: Rewrite this in Java so it is not needed to start up chromium 1621 // Could also be deprecated 1622 return getFactory().getStatics().findAddress(addr); 1623 } 1624 1625 /** 1626 * For apps targeting the L release, WebView has a new default behavior that reduces 1627 * memory footprint and increases performance by intelligently choosing 1628 * the portion of the HTML document that needs to be drawn. These 1629 * optimizations are transparent to the developers. However, under certain 1630 * circumstances, an App developer may want to disable them: 1631 * 1. When an app uses {@link #onDraw} to do own drawing and accesses portions 1632 * of the page that is way outside the visible portion of the page. 1633 * 2. When an app uses {@link #capturePicture} to capture a very large HTML document. 1634 * Note that capturePicture is a deprecated API. 1635 * 1636 * Enabling drawing the entire HTML document has a significant performance 1637 * cost. This method should be called before any WebViews are created. 1638 */ enableSlowWholeDocumentDraw()1639 public static void enableSlowWholeDocumentDraw() { 1640 getFactory().getStatics().enableSlowWholeDocumentDraw(); 1641 } 1642 1643 /** 1644 * Clears the highlighting surrounding text matches created by 1645 * {@link #findAllAsync}. 1646 */ clearMatches()1647 public void clearMatches() { 1648 checkThread(); 1649 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "clearMatches"); 1650 mProvider.clearMatches(); 1651 } 1652 1653 /** 1654 * Queries the document to see if it contains any image references. The 1655 * message object will be dispatched with arg1 being set to 1 if images 1656 * were found and 0 if the document does not reference any images. 1657 * 1658 * @param response the message that will be dispatched with the result 1659 */ documentHasImages(Message response)1660 public void documentHasImages(Message response) { 1661 checkThread(); 1662 mProvider.documentHasImages(response); 1663 } 1664 1665 /** 1666 * Sets the WebViewClient that will receive various notifications and 1667 * requests. This will replace the current handler. 1668 * 1669 * @param client an implementation of WebViewClient 1670 */ setWebViewClient(WebViewClient client)1671 public void setWebViewClient(WebViewClient client) { 1672 checkThread(); 1673 mProvider.setWebViewClient(client); 1674 } 1675 1676 /** 1677 * Registers the interface to be used when content can not be handled by 1678 * the rendering engine, and should be downloaded instead. This will replace 1679 * the current handler. 1680 * 1681 * @param listener an implementation of DownloadListener 1682 */ setDownloadListener(DownloadListener listener)1683 public void setDownloadListener(DownloadListener listener) { 1684 checkThread(); 1685 mProvider.setDownloadListener(listener); 1686 } 1687 1688 /** 1689 * Sets the chrome handler. This is an implementation of WebChromeClient for 1690 * use in handling JavaScript dialogs, favicons, titles, and the progress. 1691 * This will replace the current handler. 1692 * 1693 * @param client an implementation of WebChromeClient 1694 */ setWebChromeClient(WebChromeClient client)1695 public void setWebChromeClient(WebChromeClient client) { 1696 checkThread(); 1697 mProvider.setWebChromeClient(client); 1698 } 1699 1700 /** 1701 * Sets the Picture listener. This is an interface used to receive 1702 * notifications of a new Picture. 1703 * 1704 * @param listener an implementation of WebView.PictureListener 1705 * @deprecated This method is now obsolete. 1706 */ 1707 @Deprecated setPictureListener(PictureListener listener)1708 public void setPictureListener(PictureListener listener) { 1709 checkThread(); 1710 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "setPictureListener=" + listener); 1711 mProvider.setPictureListener(listener); 1712 } 1713 1714 /** 1715 * Injects the supplied Java object into this WebView. The object is 1716 * injected into the JavaScript context of the main frame, using the 1717 * supplied name. This allows the Java object's methods to be 1718 * accessed from JavaScript. For applications targeted to API 1719 * level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 1720 * and above, only public methods that are annotated with 1721 * {@link android.webkit.JavascriptInterface} can be accessed from JavaScript. 1722 * For applications targeted to API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN} or below, 1723 * all public methods (including the inherited ones) can be accessed, see the 1724 * important security note below for implications. 1725 * <p> Note that injected objects will not 1726 * appear in JavaScript until the page is next (re)loaded. For example: 1727 * <pre> 1728 * class JsObject { 1729 * {@literal @}JavascriptInterface 1730 * public String toString() { return "injectedObject"; } 1731 * } 1732 * webView.addJavascriptInterface(new JsObject(), "injectedObject"); 1733 * webView.loadData("<!DOCTYPE html><title></title>", "text/html", null); 1734 * webView.loadUrl("javascript:alert(injectedObject.toString())");</pre> 1735 * <p> 1736 * <strong>IMPORTANT:</strong> 1737 * <ul> 1738 * <li> This method can be used to allow JavaScript to control the host 1739 * application. This is a powerful feature, but also presents a security 1740 * risk for apps targeting {@link android.os.Build.VERSION_CODES#JELLY_BEAN} or earlier. 1741 * Apps that target a version later than {@link android.os.Build.VERSION_CODES#JELLY_BEAN} 1742 * are still vulnerable if the app runs on a device running Android earlier than 4.2. 1743 * The most secure way to use this method is to target {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 1744 * and to ensure the method is called only when running on Android 4.2 or later. 1745 * With these older versions, JavaScript could use reflection to access an 1746 * injected object's public fields. Use of this method in a WebView 1747 * containing untrusted content could allow an attacker to manipulate the 1748 * host application in unintended ways, executing Java code with the 1749 * permissions of the host application. Use extreme care when using this 1750 * method in a WebView which could contain untrusted content.</li> 1751 * <li> JavaScript interacts with Java object on a private, background 1752 * thread of this WebView. Care is therefore required to maintain thread 1753 * safety. 1754 * </li> 1755 * <li> The Java object's fields are not accessible.</li> 1756 * <li> For applications targeted to API level {@link android.os.Build.VERSION_CODES#LOLLIPOP} 1757 * and above, methods of injected Java objects are enumerable from 1758 * JavaScript.</li> 1759 * </ul> 1760 * 1761 * @param object the Java object to inject into this WebView's JavaScript 1762 * context. Null values are ignored. 1763 * @param name the name used to expose the object in JavaScript 1764 */ addJavascriptInterface(Object object, String name)1765 public void addJavascriptInterface(Object object, String name) { 1766 checkThread(); 1767 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "addJavascriptInterface=" + name); 1768 mProvider.addJavascriptInterface(object, name); 1769 } 1770 1771 /** 1772 * Removes a previously injected Java object from this WebView. Note that 1773 * the removal will not be reflected in JavaScript until the page is next 1774 * (re)loaded. See {@link #addJavascriptInterface}. 1775 * 1776 * @param name the name used to expose the object in JavaScript 1777 */ removeJavascriptInterface(String name)1778 public void removeJavascriptInterface(String name) { 1779 checkThread(); 1780 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "removeJavascriptInterface=" + name); 1781 mProvider.removeJavascriptInterface(name); 1782 } 1783 1784 /** 1785 * Gets the WebSettings object used to control the settings for this 1786 * WebView. 1787 * 1788 * @return a WebSettings object that can be used to control this WebView's 1789 * settings 1790 */ getSettings()1791 public WebSettings getSettings() { 1792 checkThread(); 1793 return mProvider.getSettings(); 1794 } 1795 1796 /** 1797 * Enables debugging of web contents (HTML / CSS / JavaScript) 1798 * loaded into any WebViews of this application. This flag can be enabled 1799 * in order to facilitate debugging of web layouts and JavaScript 1800 * code running inside WebViews. Please refer to WebView documentation 1801 * for the debugging guide. 1802 * 1803 * The default is false. 1804 * 1805 * @param enabled whether to enable web contents debugging 1806 */ setWebContentsDebuggingEnabled(boolean enabled)1807 public static void setWebContentsDebuggingEnabled(boolean enabled) { 1808 getFactory().getStatics().setWebContentsDebuggingEnabled(enabled); 1809 } 1810 1811 /** 1812 * Gets the list of currently loaded plugins. 1813 * 1814 * @return the list of currently loaded plugins 1815 * @deprecated This was used for Gears, which has been deprecated. 1816 * @hide 1817 */ 1818 @Deprecated getPluginList()1819 public static synchronized PluginList getPluginList() { 1820 return new PluginList(); 1821 } 1822 1823 /** 1824 * @deprecated This was used for Gears, which has been deprecated. 1825 * @hide 1826 */ 1827 @Deprecated refreshPlugins(boolean reloadOpenPages)1828 public void refreshPlugins(boolean reloadOpenPages) { 1829 checkThread(); 1830 } 1831 1832 /** 1833 * Puts this WebView into text selection mode. Do not rely on this 1834 * functionality; it will be deprecated in the future. 1835 * 1836 * @deprecated This method is now obsolete. 1837 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 1838 */ 1839 @Deprecated emulateShiftHeld()1840 public void emulateShiftHeld() { 1841 checkThread(); 1842 } 1843 1844 /** 1845 * @deprecated WebView no longer needs to implement 1846 * ViewGroup.OnHierarchyChangeListener. This method does nothing now. 1847 */ 1848 @Override 1849 // Cannot add @hide as this can always be accessed via the interface. 1850 @Deprecated onChildViewAdded(View parent, View child)1851 public void onChildViewAdded(View parent, View child) {} 1852 1853 /** 1854 * @deprecated WebView no longer needs to implement 1855 * ViewGroup.OnHierarchyChangeListener. This method does nothing now. 1856 */ 1857 @Override 1858 // Cannot add @hide as this can always be accessed via the interface. 1859 @Deprecated onChildViewRemoved(View p, View child)1860 public void onChildViewRemoved(View p, View child) {} 1861 1862 /** 1863 * @deprecated WebView should not have implemented 1864 * ViewTreeObserver.OnGlobalFocusChangeListener. This method does nothing now. 1865 */ 1866 @Override 1867 // Cannot add @hide as this can always be accessed via the interface. 1868 @Deprecated onGlobalFocusChanged(View oldFocus, View newFocus)1869 public void onGlobalFocusChanged(View oldFocus, View newFocus) { 1870 } 1871 1872 /** 1873 * @deprecated Only the default case, true, will be supported in a future version. 1874 */ 1875 @Deprecated setMapTrackballToArrowKeys(boolean setMap)1876 public void setMapTrackballToArrowKeys(boolean setMap) { 1877 checkThread(); 1878 mProvider.setMapTrackballToArrowKeys(setMap); 1879 } 1880 1881 flingScroll(int vx, int vy)1882 public void flingScroll(int vx, int vy) { 1883 checkThread(); 1884 if (DebugFlags.TRACE_API) Log.d(LOGTAG, "flingScroll"); 1885 mProvider.flingScroll(vx, vy); 1886 } 1887 1888 /** 1889 * Gets the zoom controls for this WebView, as a separate View. The caller 1890 * is responsible for inserting this View into the layout hierarchy. 1891 * <p/> 1892 * API level {@link android.os.Build.VERSION_CODES#CUPCAKE} introduced 1893 * built-in zoom mechanisms for the WebView, as opposed to these separate 1894 * zoom controls. The built-in mechanisms are preferred and can be enabled 1895 * using {@link WebSettings#setBuiltInZoomControls}. 1896 * 1897 * @deprecated the built-in zoom mechanisms are preferred 1898 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN} 1899 */ 1900 @Deprecated getZoomControls()1901 public View getZoomControls() { 1902 checkThread(); 1903 return mProvider.getZoomControls(); 1904 } 1905 1906 /** 1907 * Gets whether this WebView can be zoomed in. 1908 * 1909 * @return true if this WebView can be zoomed in 1910 * 1911 * @deprecated This method is prone to inaccuracy due to race conditions 1912 * between the web rendering and UI threads; prefer 1913 * {@link WebViewClient#onScaleChanged}. 1914 */ 1915 @Deprecated canZoomIn()1916 public boolean canZoomIn() { 1917 checkThread(); 1918 return mProvider.canZoomIn(); 1919 } 1920 1921 /** 1922 * Gets whether this WebView can be zoomed out. 1923 * 1924 * @return true if this WebView can be zoomed out 1925 * 1926 * @deprecated This method is prone to inaccuracy due to race conditions 1927 * between the web rendering and UI threads; prefer 1928 * {@link WebViewClient#onScaleChanged}. 1929 */ 1930 @Deprecated canZoomOut()1931 public boolean canZoomOut() { 1932 checkThread(); 1933 return mProvider.canZoomOut(); 1934 } 1935 1936 /** 1937 * Performs a zoom operation in this WebView. 1938 * 1939 * @param zoomFactor the zoom factor to apply. The zoom factor will be clamped to the Webview's 1940 * zoom limits. This value must be in the range 0.01 to 100.0 inclusive. 1941 */ zoomBy(float zoomFactor)1942 public void zoomBy(float zoomFactor) { 1943 checkThread(); 1944 if (zoomFactor < 0.01) 1945 throw new IllegalArgumentException("zoomFactor must be greater than 0.01."); 1946 if (zoomFactor > 100.0) 1947 throw new IllegalArgumentException("zoomFactor must be less than 100."); 1948 mProvider.zoomBy(zoomFactor); 1949 } 1950 1951 /** 1952 * Performs zoom in in this WebView. 1953 * 1954 * @return true if zoom in succeeds, false if no zoom changes 1955 */ zoomIn()1956 public boolean zoomIn() { 1957 checkThread(); 1958 return mProvider.zoomIn(); 1959 } 1960 1961 /** 1962 * Performs zoom out in this WebView. 1963 * 1964 * @return true if zoom out succeeds, false if no zoom changes 1965 */ zoomOut()1966 public boolean zoomOut() { 1967 checkThread(); 1968 return mProvider.zoomOut(); 1969 } 1970 1971 /** 1972 * @deprecated This method is now obsolete. 1973 * @hide Since API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1} 1974 */ 1975 @Deprecated debugDump()1976 public void debugDump() { 1977 checkThread(); 1978 } 1979 1980 /** 1981 * See {@link ViewDebug.HierarchyHandler#dumpViewHierarchyWithProperties(BufferedWriter, int)} 1982 * @hide 1983 */ 1984 @Override dumpViewHierarchyWithProperties(BufferedWriter out, int level)1985 public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) { 1986 mProvider.dumpViewHierarchyWithProperties(out, level); 1987 } 1988 1989 /** 1990 * See {@link ViewDebug.HierarchyHandler#findHierarchyView(String, int)} 1991 * @hide 1992 */ 1993 @Override findHierarchyView(String className, int hashCode)1994 public View findHierarchyView(String className, int hashCode) { 1995 return mProvider.findHierarchyView(className, hashCode); 1996 } 1997 1998 //------------------------------------------------------------------------- 1999 // Interface for WebView providers 2000 //------------------------------------------------------------------------- 2001 2002 /** 2003 * Gets the WebViewProvider. Used by providers to obtain the underlying 2004 * implementation, e.g. when the appliction responds to 2005 * WebViewClient.onCreateWindow() request. 2006 * 2007 * @hide WebViewProvider is not public API. 2008 */ getWebViewProvider()2009 public WebViewProvider getWebViewProvider() { 2010 return mProvider; 2011 } 2012 2013 /** 2014 * Callback interface, allows the provider implementation to access non-public methods 2015 * and fields, and make super-class calls in this WebView instance. 2016 * @hide Only for use by WebViewProvider implementations 2017 */ 2018 public class PrivateAccess { 2019 // ---- Access to super-class methods ---- super_getScrollBarStyle()2020 public int super_getScrollBarStyle() { 2021 return WebView.super.getScrollBarStyle(); 2022 } 2023 super_scrollTo(int scrollX, int scrollY)2024 public void super_scrollTo(int scrollX, int scrollY) { 2025 WebView.super.scrollTo(scrollX, scrollY); 2026 } 2027 super_computeScroll()2028 public void super_computeScroll() { 2029 WebView.super.computeScroll(); 2030 } 2031 super_onHoverEvent(MotionEvent event)2032 public boolean super_onHoverEvent(MotionEvent event) { 2033 return WebView.super.onHoverEvent(event); 2034 } 2035 super_performAccessibilityAction(int action, Bundle arguments)2036 public boolean super_performAccessibilityAction(int action, Bundle arguments) { 2037 return WebView.super.performAccessibilityAction(action, arguments); 2038 } 2039 super_performLongClick()2040 public boolean super_performLongClick() { 2041 return WebView.super.performLongClick(); 2042 } 2043 super_setFrame(int left, int top, int right, int bottom)2044 public boolean super_setFrame(int left, int top, int right, int bottom) { 2045 return WebView.super.setFrame(left, top, right, bottom); 2046 } 2047 super_dispatchKeyEvent(KeyEvent event)2048 public boolean super_dispatchKeyEvent(KeyEvent event) { 2049 return WebView.super.dispatchKeyEvent(event); 2050 } 2051 super_onGenericMotionEvent(MotionEvent event)2052 public boolean super_onGenericMotionEvent(MotionEvent event) { 2053 return WebView.super.onGenericMotionEvent(event); 2054 } 2055 super_requestFocus(int direction, Rect previouslyFocusedRect)2056 public boolean super_requestFocus(int direction, Rect previouslyFocusedRect) { 2057 return WebView.super.requestFocus(direction, previouslyFocusedRect); 2058 } 2059 super_setLayoutParams(ViewGroup.LayoutParams params)2060 public void super_setLayoutParams(ViewGroup.LayoutParams params) { 2061 WebView.super.setLayoutParams(params); 2062 } 2063 2064 // ---- Access to non-public methods ---- overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)2065 public void overScrollBy(int deltaX, int deltaY, 2066 int scrollX, int scrollY, 2067 int scrollRangeX, int scrollRangeY, 2068 int maxOverScrollX, int maxOverScrollY, 2069 boolean isTouchEvent) { 2070 WebView.this.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, 2071 maxOverScrollX, maxOverScrollY, isTouchEvent); 2072 } 2073 awakenScrollBars(int duration)2074 public void awakenScrollBars(int duration) { 2075 WebView.this.awakenScrollBars(duration); 2076 } 2077 awakenScrollBars(int duration, boolean invalidate)2078 public void awakenScrollBars(int duration, boolean invalidate) { 2079 WebView.this.awakenScrollBars(duration, invalidate); 2080 } 2081 getVerticalScrollFactor()2082 public float getVerticalScrollFactor() { 2083 return WebView.this.getVerticalScrollFactor(); 2084 } 2085 getHorizontalScrollFactor()2086 public float getHorizontalScrollFactor() { 2087 return WebView.this.getHorizontalScrollFactor(); 2088 } 2089 setMeasuredDimension(int measuredWidth, int measuredHeight)2090 public void setMeasuredDimension(int measuredWidth, int measuredHeight) { 2091 WebView.this.setMeasuredDimension(measuredWidth, measuredHeight); 2092 } 2093 onScrollChanged(int l, int t, int oldl, int oldt)2094 public void onScrollChanged(int l, int t, int oldl, int oldt) { 2095 WebView.this.onScrollChanged(l, t, oldl, oldt); 2096 } 2097 getHorizontalScrollbarHeight()2098 public int getHorizontalScrollbarHeight() { 2099 return WebView.this.getHorizontalScrollbarHeight(); 2100 } 2101 super_onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b)2102 public void super_onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, 2103 int l, int t, int r, int b) { 2104 WebView.super.onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b); 2105 } 2106 2107 // ---- Access to (non-public) fields ---- 2108 /** Raw setter for the scroll X value, without invoking onScrollChanged handlers etc. */ setScrollXRaw(int scrollX)2109 public void setScrollXRaw(int scrollX) { 2110 WebView.this.mScrollX = scrollX; 2111 } 2112 2113 /** Raw setter for the scroll Y value, without invoking onScrollChanged handlers etc. */ setScrollYRaw(int scrollY)2114 public void setScrollYRaw(int scrollY) { 2115 WebView.this.mScrollY = scrollY; 2116 } 2117 2118 } 2119 2120 //------------------------------------------------------------------------- 2121 // Package-private internal stuff 2122 //------------------------------------------------------------------------- 2123 2124 // Only used by android.webkit.FindActionModeCallback. setFindDialogFindListener(FindListener listener)2125 void setFindDialogFindListener(FindListener listener) { 2126 checkThread(); 2127 setupFindListenerIfNeeded(); 2128 mFindListener.mFindDialogFindListener = listener; 2129 } 2130 2131 // Only used by android.webkit.FindActionModeCallback. notifyFindDialogDismissed()2132 void notifyFindDialogDismissed() { 2133 checkThread(); 2134 mProvider.notifyFindDialogDismissed(); 2135 } 2136 2137 //------------------------------------------------------------------------- 2138 // Private internal stuff 2139 //------------------------------------------------------------------------- 2140 2141 private WebViewProvider mProvider; 2142 2143 /** 2144 * In addition to the FindListener that the user may set via the WebView.setFindListener 2145 * API, FindActionModeCallback will register it's own FindListener. We keep them separate 2146 * via this class so that that the two FindListeners can potentially exist at once. 2147 */ 2148 private class FindListenerDistributor implements FindListener { 2149 private FindListener mFindDialogFindListener; 2150 private FindListener mUserFindListener; 2151 2152 @Override onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, boolean isDoneCounting)2153 public void onFindResultReceived(int activeMatchOrdinal, int numberOfMatches, 2154 boolean isDoneCounting) { 2155 if (mFindDialogFindListener != null) { 2156 mFindDialogFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, 2157 isDoneCounting); 2158 } 2159 2160 if (mUserFindListener != null) { 2161 mUserFindListener.onFindResultReceived(activeMatchOrdinal, numberOfMatches, 2162 isDoneCounting); 2163 } 2164 } 2165 } 2166 private FindListenerDistributor mFindListener; 2167 setupFindListenerIfNeeded()2168 private void setupFindListenerIfNeeded() { 2169 if (mFindListener == null) { 2170 mFindListener = new FindListenerDistributor(); 2171 mProvider.setFindListener(mFindListener); 2172 } 2173 } 2174 ensureProviderCreated()2175 private void ensureProviderCreated() { 2176 checkThread(); 2177 if (mProvider == null) { 2178 // As this can get called during the base class constructor chain, pass the minimum 2179 // number of dependencies here; the rest are deferred to init(). 2180 mProvider = getFactory().createWebView(this, new PrivateAccess()); 2181 } 2182 } 2183 getFactory()2184 private static synchronized WebViewFactoryProvider getFactory() { 2185 return WebViewFactory.getProvider(); 2186 } 2187 2188 private final Looper mWebViewThread = Looper.myLooper(); 2189 checkThread()2190 private void checkThread() { 2191 // Ignore mWebViewThread == null because this can be called during in the super class 2192 // constructor, before this class's own constructor has even started. 2193 if (mWebViewThread != null && Looper.myLooper() != mWebViewThread) { 2194 Throwable throwable = new Throwable( 2195 "A WebView method was called on thread '" + 2196 Thread.currentThread().getName() + "'. " + 2197 "All WebView methods must be called on the same thread. " + 2198 "(Expected Looper " + mWebViewThread + " called on " + Looper.myLooper() + 2199 ", FYI main Looper is " + Looper.getMainLooper() + ")"); 2200 Log.w(LOGTAG, Log.getStackTraceString(throwable)); 2201 StrictMode.onWebViewMethodCalledOnWrongThread(throwable); 2202 2203 if (sEnforceThreadChecking) { 2204 throw new RuntimeException(throwable); 2205 } 2206 } 2207 } 2208 2209 //------------------------------------------------------------------------- 2210 // Override View methods 2211 //------------------------------------------------------------------------- 2212 2213 // TODO: Add a test that enumerates all methods in ViewDelegte & ScrollDelegate, and ensures 2214 // there's a corresponding override (or better, caller) for each of them in here. 2215 2216 @Override onAttachedToWindow()2217 protected void onAttachedToWindow() { 2218 super.onAttachedToWindow(); 2219 mProvider.getViewDelegate().onAttachedToWindow(); 2220 } 2221 2222 /** @hide */ 2223 @Override onDetachedFromWindowInternal()2224 protected void onDetachedFromWindowInternal() { 2225 mProvider.getViewDelegate().onDetachedFromWindow(); 2226 super.onDetachedFromWindowInternal(); 2227 } 2228 2229 @Override setLayoutParams(ViewGroup.LayoutParams params)2230 public void setLayoutParams(ViewGroup.LayoutParams params) { 2231 mProvider.getViewDelegate().setLayoutParams(params); 2232 } 2233 2234 @Override setOverScrollMode(int mode)2235 public void setOverScrollMode(int mode) { 2236 super.setOverScrollMode(mode); 2237 // This method may be called in the constructor chain, before the WebView provider is 2238 // created. 2239 ensureProviderCreated(); 2240 mProvider.getViewDelegate().setOverScrollMode(mode); 2241 } 2242 2243 @Override setScrollBarStyle(int style)2244 public void setScrollBarStyle(int style) { 2245 mProvider.getViewDelegate().setScrollBarStyle(style); 2246 super.setScrollBarStyle(style); 2247 } 2248 2249 @Override computeHorizontalScrollRange()2250 protected int computeHorizontalScrollRange() { 2251 return mProvider.getScrollDelegate().computeHorizontalScrollRange(); 2252 } 2253 2254 @Override computeHorizontalScrollOffset()2255 protected int computeHorizontalScrollOffset() { 2256 return mProvider.getScrollDelegate().computeHorizontalScrollOffset(); 2257 } 2258 2259 @Override computeVerticalScrollRange()2260 protected int computeVerticalScrollRange() { 2261 return mProvider.getScrollDelegate().computeVerticalScrollRange(); 2262 } 2263 2264 @Override computeVerticalScrollOffset()2265 protected int computeVerticalScrollOffset() { 2266 return mProvider.getScrollDelegate().computeVerticalScrollOffset(); 2267 } 2268 2269 @Override computeVerticalScrollExtent()2270 protected int computeVerticalScrollExtent() { 2271 return mProvider.getScrollDelegate().computeVerticalScrollExtent(); 2272 } 2273 2274 @Override computeScroll()2275 public void computeScroll() { 2276 mProvider.getScrollDelegate().computeScroll(); 2277 } 2278 2279 @Override onHoverEvent(MotionEvent event)2280 public boolean onHoverEvent(MotionEvent event) { 2281 return mProvider.getViewDelegate().onHoverEvent(event); 2282 } 2283 2284 @Override onTouchEvent(MotionEvent event)2285 public boolean onTouchEvent(MotionEvent event) { 2286 return mProvider.getViewDelegate().onTouchEvent(event); 2287 } 2288 2289 @Override onGenericMotionEvent(MotionEvent event)2290 public boolean onGenericMotionEvent(MotionEvent event) { 2291 return mProvider.getViewDelegate().onGenericMotionEvent(event); 2292 } 2293 2294 @Override onTrackballEvent(MotionEvent event)2295 public boolean onTrackballEvent(MotionEvent event) { 2296 return mProvider.getViewDelegate().onTrackballEvent(event); 2297 } 2298 2299 @Override onKeyDown(int keyCode, KeyEvent event)2300 public boolean onKeyDown(int keyCode, KeyEvent event) { 2301 return mProvider.getViewDelegate().onKeyDown(keyCode, event); 2302 } 2303 2304 @Override onKeyUp(int keyCode, KeyEvent event)2305 public boolean onKeyUp(int keyCode, KeyEvent event) { 2306 return mProvider.getViewDelegate().onKeyUp(keyCode, event); 2307 } 2308 2309 @Override onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)2310 public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { 2311 return mProvider.getViewDelegate().onKeyMultiple(keyCode, repeatCount, event); 2312 } 2313 2314 /* 2315 TODO: These are not currently implemented in WebViewClassic, but it seems inconsistent not 2316 to be delegating them too. 2317 2318 @Override 2319 public boolean onKeyPreIme(int keyCode, KeyEvent event) { 2320 return mProvider.getViewDelegate().onKeyPreIme(keyCode, event); 2321 } 2322 @Override 2323 public boolean onKeyLongPress(int keyCode, KeyEvent event) { 2324 return mProvider.getViewDelegate().onKeyLongPress(keyCode, event); 2325 } 2326 @Override 2327 public boolean onKeyShortcut(int keyCode, KeyEvent event) { 2328 return mProvider.getViewDelegate().onKeyShortcut(keyCode, event); 2329 } 2330 */ 2331 2332 @Override getAccessibilityNodeProvider()2333 public AccessibilityNodeProvider getAccessibilityNodeProvider() { 2334 AccessibilityNodeProvider provider = 2335 mProvider.getViewDelegate().getAccessibilityNodeProvider(); 2336 return provider == null ? super.getAccessibilityNodeProvider() : provider; 2337 } 2338 2339 @Deprecated 2340 @Override shouldDelayChildPressedState()2341 public boolean shouldDelayChildPressedState() { 2342 return mProvider.getViewDelegate().shouldDelayChildPressedState(); 2343 } 2344 2345 @Override onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info)2346 public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 2347 super.onInitializeAccessibilityNodeInfo(info); 2348 info.setClassName(WebView.class.getName()); 2349 mProvider.getViewDelegate().onInitializeAccessibilityNodeInfo(info); 2350 } 2351 2352 @Override onInitializeAccessibilityEvent(AccessibilityEvent event)2353 public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 2354 super.onInitializeAccessibilityEvent(event); 2355 event.setClassName(WebView.class.getName()); 2356 mProvider.getViewDelegate().onInitializeAccessibilityEvent(event); 2357 } 2358 2359 @Override performAccessibilityAction(int action, Bundle arguments)2360 public boolean performAccessibilityAction(int action, Bundle arguments) { 2361 return mProvider.getViewDelegate().performAccessibilityAction(action, arguments); 2362 } 2363 2364 /** @hide */ 2365 @Override onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b)2366 protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, 2367 int l, int t, int r, int b) { 2368 mProvider.getViewDelegate().onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b); 2369 } 2370 2371 @Override onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY)2372 protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 2373 mProvider.getViewDelegate().onOverScrolled(scrollX, scrollY, clampedX, clampedY); 2374 } 2375 2376 @Override onWindowVisibilityChanged(int visibility)2377 protected void onWindowVisibilityChanged(int visibility) { 2378 super.onWindowVisibilityChanged(visibility); 2379 mProvider.getViewDelegate().onWindowVisibilityChanged(visibility); 2380 } 2381 2382 @Override onDraw(Canvas canvas)2383 protected void onDraw(Canvas canvas) { 2384 mProvider.getViewDelegate().onDraw(canvas); 2385 } 2386 2387 @Override performLongClick()2388 public boolean performLongClick() { 2389 return mProvider.getViewDelegate().performLongClick(); 2390 } 2391 2392 @Override onConfigurationChanged(Configuration newConfig)2393 protected void onConfigurationChanged(Configuration newConfig) { 2394 mProvider.getViewDelegate().onConfigurationChanged(newConfig); 2395 } 2396 2397 @Override onCreateInputConnection(EditorInfo outAttrs)2398 public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 2399 return mProvider.getViewDelegate().onCreateInputConnection(outAttrs); 2400 } 2401 2402 @Override onVisibilityChanged(View changedView, int visibility)2403 protected void onVisibilityChanged(View changedView, int visibility) { 2404 super.onVisibilityChanged(changedView, visibility); 2405 // This method may be called in the constructor chain, before the WebView provider is 2406 // created. 2407 ensureProviderCreated(); 2408 mProvider.getViewDelegate().onVisibilityChanged(changedView, visibility); 2409 } 2410 2411 @Override onWindowFocusChanged(boolean hasWindowFocus)2412 public void onWindowFocusChanged(boolean hasWindowFocus) { 2413 mProvider.getViewDelegate().onWindowFocusChanged(hasWindowFocus); 2414 super.onWindowFocusChanged(hasWindowFocus); 2415 } 2416 2417 @Override onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect)2418 protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 2419 mProvider.getViewDelegate().onFocusChanged(focused, direction, previouslyFocusedRect); 2420 super.onFocusChanged(focused, direction, previouslyFocusedRect); 2421 } 2422 2423 /** @hide */ 2424 @Override setFrame(int left, int top, int right, int bottom)2425 protected boolean setFrame(int left, int top, int right, int bottom) { 2426 return mProvider.getViewDelegate().setFrame(left, top, right, bottom); 2427 } 2428 2429 @Override onSizeChanged(int w, int h, int ow, int oh)2430 protected void onSizeChanged(int w, int h, int ow, int oh) { 2431 super.onSizeChanged(w, h, ow, oh); 2432 mProvider.getViewDelegate().onSizeChanged(w, h, ow, oh); 2433 } 2434 2435 @Override onScrollChanged(int l, int t, int oldl, int oldt)2436 protected void onScrollChanged(int l, int t, int oldl, int oldt) { 2437 super.onScrollChanged(l, t, oldl, oldt); 2438 mProvider.getViewDelegate().onScrollChanged(l, t, oldl, oldt); 2439 } 2440 2441 @Override dispatchKeyEvent(KeyEvent event)2442 public boolean dispatchKeyEvent(KeyEvent event) { 2443 return mProvider.getViewDelegate().dispatchKeyEvent(event); 2444 } 2445 2446 @Override requestFocus(int direction, Rect previouslyFocusedRect)2447 public boolean requestFocus(int direction, Rect previouslyFocusedRect) { 2448 return mProvider.getViewDelegate().requestFocus(direction, previouslyFocusedRect); 2449 } 2450 2451 @Override onMeasure(int widthMeasureSpec, int heightMeasureSpec)2452 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 2453 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 2454 mProvider.getViewDelegate().onMeasure(widthMeasureSpec, heightMeasureSpec); 2455 } 2456 2457 @Override requestChildRectangleOnScreen(View child, Rect rect, boolean immediate)2458 public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { 2459 return mProvider.getViewDelegate().requestChildRectangleOnScreen(child, rect, immediate); 2460 } 2461 2462 @Override setBackgroundColor(int color)2463 public void setBackgroundColor(int color) { 2464 mProvider.getViewDelegate().setBackgroundColor(color); 2465 } 2466 2467 @Override setLayerType(int layerType, Paint paint)2468 public void setLayerType(int layerType, Paint paint) { 2469 super.setLayerType(layerType, paint); 2470 mProvider.getViewDelegate().setLayerType(layerType, paint); 2471 } 2472 2473 @Override dispatchDraw(Canvas canvas)2474 protected void dispatchDraw(Canvas canvas) { 2475 mProvider.getViewDelegate().preDispatchDraw(canvas); 2476 super.dispatchDraw(canvas); 2477 } 2478 2479 @Override onStartTemporaryDetach()2480 public void onStartTemporaryDetach() { 2481 super.onStartTemporaryDetach(); 2482 mProvider.getViewDelegate().onStartTemporaryDetach(); 2483 } 2484 2485 @Override onFinishTemporaryDetach()2486 public void onFinishTemporaryDetach() { 2487 super.onFinishTemporaryDetach(); 2488 mProvider.getViewDelegate().onFinishTemporaryDetach(); 2489 } 2490 } 2491