1 /* 2 * Copyright (C) 2008 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.Nullable; 20 import android.annotation.SystemApi; 21 import android.content.Intent; 22 import android.content.pm.ActivityInfo; 23 import android.graphics.Bitmap; 24 import android.net.Uri; 25 import android.os.Message; 26 import android.view.View; 27 28 public class WebChromeClient { 29 30 /** 31 * Tell the host application the current progress of loading a page. 32 * @param view The WebView that initiated the callback. 33 * @param newProgress Current page loading progress, represented by 34 * an integer between 0 and 100. 35 */ onProgressChanged(WebView view, int newProgress)36 public void onProgressChanged(WebView view, int newProgress) {} 37 38 /** 39 * Notify the host application of a change in the document title. 40 * @param view The WebView that initiated the callback. 41 * @param title A String containing the new title of the document. 42 */ onReceivedTitle(WebView view, String title)43 public void onReceivedTitle(WebView view, String title) {} 44 45 /** 46 * Notify the host application of a new favicon for the current page. 47 * @param view The WebView that initiated the callback. 48 * @param icon A Bitmap containing the favicon for the current page. 49 */ onReceivedIcon(WebView view, Bitmap icon)50 public void onReceivedIcon(WebView view, Bitmap icon) {} 51 52 /** 53 * Notify the host application of the url for an apple-touch-icon. 54 * @param view The WebView that initiated the callback. 55 * @param url The icon url. 56 * @param precomposed {@code true} if the url is for a precomposed touch icon. 57 */ onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)58 public void onReceivedTouchIconUrl(WebView view, String url, 59 boolean precomposed) {} 60 61 /** 62 * A callback interface used by the host application to notify 63 * the current page that its custom view has been dismissed. 64 */ 65 public interface CustomViewCallback { 66 /** 67 * Invoked when the host application dismisses the 68 * custom view. 69 */ onCustomViewHidden()70 public void onCustomViewHidden(); 71 } 72 73 /** 74 * Notify the host application that the current page has entered full 75 * screen mode. The host application must show the custom View which 76 * contains the web contents — video or other HTML content — 77 * in full screen mode. Also see "Full screen support" documentation on 78 * {@link WebView}. 79 * @param view is the View object to be shown. 80 * @param callback invoke this callback to request the page to exit 81 * full screen mode. 82 */ onShowCustomView(View view, CustomViewCallback callback)83 public void onShowCustomView(View view, CustomViewCallback callback) {}; 84 85 /** 86 * Notify the host application that the current page would 87 * like to show a custom View in a particular orientation. 88 * @param view is the View object to be shown. 89 * @param requestedOrientation An orientation constant as used in 90 * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}. 91 * @param callback is the callback to be invoked if and when the view 92 * is dismissed. 93 * @deprecated This method supports the obsolete plugin mechanism, 94 * and will not be invoked in future 95 */ 96 @Deprecated onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback)97 public void onShowCustomView(View view, int requestedOrientation, 98 CustomViewCallback callback) {}; 99 100 /** 101 * Notify the host application that the current page has exited full 102 * screen mode. The host application must hide the custom View, ie. the 103 * View passed to {@link #onShowCustomView} when the content entered fullscreen. 104 * Also see "Full screen support" documentation on {@link WebView}. 105 */ onHideCustomView()106 public void onHideCustomView() {} 107 108 /** 109 * Request the host application to create a new window. If the host 110 * application chooses to honor this request, it should return {@code true} from 111 * this method, create a new WebView to host the window, insert it into the 112 * View system and send the supplied resultMsg message to its target with 113 * the new WebView as an argument. If the host application chooses not to 114 * honor the request, it should return {@code false} from this method. The default 115 * implementation of this method does nothing and hence returns {@code false}. 116 * <p> 117 * Applications should typically not allow windows to be created when the 118 * {@code isUserGesture} flag is false, as this may be an unwanted popup. 119 * <p> 120 * Applications should be careful how they display the new window: don't simply 121 * overlay it over the existing WebView as this may mislead the user about which 122 * site they are viewing. If your application displays the URL of the main page, 123 * make sure to also display the URL of the new window in a similar fashion. If 124 * your application does not display URLs, consider disallowing the creation of 125 * new windows entirely. 126 * <p class="note"><b>Note:</b> There is no trustworthy way to tell which page 127 * requested the new window: the request might originate from a third-party iframe 128 * inside the WebView. 129 * 130 * @param view The WebView from which the request for a new window 131 * originated. 132 * @param isDialog {@code true} if the new window should be a dialog, rather than 133 * a full-size window. 134 * @param isUserGesture {@code true} if the request was initiated by a user gesture, 135 * such as the user clicking a link. 136 * @param resultMsg The message to send when once a new WebView has been 137 * created. resultMsg.obj is a 138 * {@link WebView.WebViewTransport} object. This should be 139 * used to transport the new WebView, by calling 140 * {@link WebView.WebViewTransport#setWebView(WebView) 141 * WebView.WebViewTransport.setWebView(WebView)}. 142 * @return This method should return {@code true} if the host application will 143 * create a new window, in which case resultMsg should be sent to 144 * its target. Otherwise, this method should return {@code false}. Returning 145 * {@code false} from this method but also sending resultMsg will result in 146 * undefined behavior. 147 */ onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)148 public boolean onCreateWindow(WebView view, boolean isDialog, 149 boolean isUserGesture, Message resultMsg) { 150 return false; 151 } 152 153 /** 154 * Request display and focus for this WebView. This may happen due to 155 * another WebView opening a link in this WebView and requesting that this 156 * WebView be displayed. 157 * @param view The WebView that needs to be focused. 158 */ onRequestFocus(WebView view)159 public void onRequestFocus(WebView view) {} 160 161 /** 162 * Notify the host application to close the given WebView and remove it 163 * from the view system if necessary. At this point, WebCore has stopped 164 * any loading in this window and has removed any cross-scripting ability 165 * in javascript. 166 * <p> 167 * As with {@link #onCreateWindow}, the application should ensure that any 168 * URL or security indicator displayed is updated so that the user can tell 169 * that the page they were interacting with has been closed. 170 * 171 * @param window The WebView that needs to be closed. 172 */ onCloseWindow(WebView window)173 public void onCloseWindow(WebView window) {} 174 175 /** 176 * Tell the client to display a javascript alert dialog. If the client 177 * returns {@code true}, WebView will assume that the client will handle the 178 * dialog. If the client returns {@code false}, it will continue execution. 179 * @param view The WebView that initiated the callback. 180 * @param url The url of the page requesting the dialog. 181 * @param message Message to be displayed in the window. 182 * @param result A JsResult to confirm that the user hit enter. 183 * @return boolean Whether the client will handle the alert dialog. 184 */ onJsAlert(WebView view, String url, String message, JsResult result)185 public boolean onJsAlert(WebView view, String url, String message, 186 JsResult result) { 187 return false; 188 } 189 190 /** 191 * Tell the client to display a confirm dialog to the user. If the client 192 * returns {@code true}, WebView will assume that the client will handle the 193 * confirm dialog and call the appropriate JsResult method. If the 194 * client returns false, a default value of {@code false} will be returned to 195 * javascript. The default behavior is to return {@code false}. 196 * @param view The WebView that initiated the callback. 197 * @param url The url of the page requesting the dialog. 198 * @param message Message to be displayed in the window. 199 * @param result A JsResult used to send the user's response to 200 * javascript. 201 * @return boolean Whether the client will handle the confirm dialog. 202 */ onJsConfirm(WebView view, String url, String message, JsResult result)203 public boolean onJsConfirm(WebView view, String url, String message, 204 JsResult result) { 205 return false; 206 } 207 208 /** 209 * Tell the client to display a prompt dialog to the user. If the client 210 * returns {@code true}, WebView will assume that the client will handle the 211 * prompt dialog and call the appropriate JsPromptResult method. If the 212 * client returns false, a default value of {@code false} will be returned to to 213 * javascript. The default behavior is to return {@code false}. 214 * @param view The WebView that initiated the callback. 215 * @param url The url of the page requesting the dialog. 216 * @param message Message to be displayed in the window. 217 * @param defaultValue The default value displayed in the prompt dialog. 218 * @param result A JsPromptResult used to send the user's reponse to 219 * javascript. 220 * @return boolean Whether the client will handle the prompt dialog. 221 */ onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)222 public boolean onJsPrompt(WebView view, String url, String message, 223 String defaultValue, JsPromptResult result) { 224 return false; 225 } 226 227 /** 228 * Tell the client to display a dialog to confirm navigation away from the 229 * current page. This is the result of the onbeforeunload javascript event. 230 * If the client returns {@code true}, WebView will assume that the client will 231 * handle the confirm dialog and call the appropriate JsResult method. If 232 * the client returns {@code false}, a default value of {@code true} will be returned to 233 * javascript to accept navigation away from the current page. The default 234 * behavior is to return {@code false}. Setting the JsResult to {@code true} will navigate 235 * away from the current page, {@code false} will cancel the navigation. 236 * @param view The WebView that initiated the callback. 237 * @param url The url of the page requesting the dialog. 238 * @param message Message to be displayed in the window. 239 * @param result A JsResult used to send the user's response to 240 * javascript. 241 * @return boolean Whether the client will handle the confirm dialog. 242 */ onJsBeforeUnload(WebView view, String url, String message, JsResult result)243 public boolean onJsBeforeUnload(WebView view, String url, String message, 244 JsResult result) { 245 return false; 246 } 247 248 /** 249 * Tell the client that the quota has been exceeded for the Web SQL Database 250 * API for a particular origin and request a new quota. The client must 251 * respond by invoking the 252 * {@link WebStorage.QuotaUpdater#updateQuota(long) updateQuota(long)} 253 * method of the supplied {@link WebStorage.QuotaUpdater} instance. The 254 * minimum value that can be set for the new quota is the current quota. The 255 * default implementation responds with the current quota, so the quota will 256 * not be increased. 257 * @param url The URL of the page that triggered the notification 258 * @param databaseIdentifier The identifier of the database where the quota 259 * was exceeded. 260 * @param quota The quota for the origin, in bytes 261 * @param estimatedDatabaseSize The estimated size of the offending 262 * database, in bytes 263 * @param totalQuota The total quota for all origins, in bytes 264 * @param quotaUpdater An instance of {@link WebStorage.QuotaUpdater} which 265 * must be used to inform the WebView of the new quota. 266 * @deprecated This method is no longer called; WebView now uses the HTML5 / JavaScript Quota 267 * Management API. 268 */ 269 @Deprecated onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)270 public void onExceededDatabaseQuota(String url, String databaseIdentifier, 271 long quota, long estimatedDatabaseSize, long totalQuota, 272 WebStorage.QuotaUpdater quotaUpdater) { 273 // This default implementation passes the current quota back to WebCore. 274 // WebCore will interpret this that new quota was declined. 275 quotaUpdater.updateQuota(quota); 276 } 277 278 /** 279 * Notify the host application that the Application Cache has reached the 280 * maximum size. The client must respond by invoking the 281 * {@link WebStorage.QuotaUpdater#updateQuota(long) updateQuota(long)} 282 * method of the supplied {@link WebStorage.QuotaUpdater} instance. The 283 * minimum value that can be set for the new quota is the current quota. The 284 * default implementation responds with the current quota, so the quota will 285 * not be increased. 286 * @param requiredStorage The amount of storage required by the Application 287 * Cache operation that triggered this notification, 288 * in bytes. 289 * @param quota the current maximum Application Cache size, in bytes 290 * @param quotaUpdater An instance of {@link WebStorage.QuotaUpdater} which 291 * must be used to inform the WebView of the new quota. 292 * @deprecated This method is no longer called; WebView now uses the HTML5 / JavaScript Quota 293 * Management API. 294 */ 295 @Deprecated onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)296 public void onReachedMaxAppCacheSize(long requiredStorage, long quota, 297 WebStorage.QuotaUpdater quotaUpdater) { 298 quotaUpdater.updateQuota(quota); 299 } 300 301 /** 302 * Notify the host application that web content from the specified origin 303 * is attempting to use the Geolocation API, but no permission state is 304 * currently set for that origin. The host application should invoke the 305 * specified callback with the desired permission state. See 306 * {@link GeolocationPermissions} for details. 307 * 308 * <p>Note that for applications targeting Android N and later SDKs 309 * (API level > {@link android.os.Build.VERSION_CODES#M}) 310 * this method is only called for requests originating from secure 311 * origins such as https. On non-secure origins geolocation requests 312 * are automatically denied. 313 * 314 * @param origin The origin of the web content attempting to use the 315 * Geolocation API. 316 * @param callback The callback to use to set the permission state for the 317 * origin. 318 */ onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)319 public void onGeolocationPermissionsShowPrompt(String origin, 320 GeolocationPermissions.Callback callback) {} 321 322 /** 323 * Notify the host application that a request for Geolocation permissions, 324 * made with a previous call to 325 * {@link #onGeolocationPermissionsShowPrompt(String,GeolocationPermissions.Callback) onGeolocationPermissionsShowPrompt()} 326 * has been canceled. Any related UI should therefore be hidden. 327 */ onGeolocationPermissionsHidePrompt()328 public void onGeolocationPermissionsHidePrompt() {} 329 330 /** 331 * Notify the host application that web content is requesting permission to 332 * access the specified resources and the permission currently isn't granted 333 * or denied. The host application must invoke {@link PermissionRequest#grant(String[])} 334 * or {@link PermissionRequest#deny()}. 335 * 336 * If this method isn't overridden, the permission is denied. 337 * 338 * @param request the PermissionRequest from current web content. 339 */ onPermissionRequest(PermissionRequest request)340 public void onPermissionRequest(PermissionRequest request) { 341 request.deny(); 342 } 343 344 /** 345 * Notify the host application that the given permission request 346 * has been canceled. Any related UI should therefore be hidden. 347 * 348 * @param request the PermissionRequest that needs be canceled. 349 */ onPermissionRequestCanceled(PermissionRequest request)350 public void onPermissionRequestCanceled(PermissionRequest request) {} 351 352 /** 353 * Tell the client that a JavaScript execution timeout has occured. And the 354 * client may decide whether or not to interrupt the execution. If the 355 * client returns {@code true}, the JavaScript will be interrupted. If the client 356 * returns {@code false}, the execution will continue. Note that in the case of 357 * continuing execution, the timeout counter will be reset, and the callback 358 * will continue to occur if the script does not finish at the next check 359 * point. 360 * @return boolean Whether the JavaScript execution should be interrupted. 361 * @deprecated This method is no longer supported and will not be invoked. 362 */ 363 // This method was only called when using the JSC javascript engine. V8 became 364 // the default JS engine with Froyo and support for building with JSC was 365 // removed in b/5495373. V8 does not have a mechanism for making a callback such 366 // as this. 367 @Deprecated onJsTimeout()368 public boolean onJsTimeout() { 369 return true; 370 } 371 372 /** 373 * Report a JavaScript error message to the host application. The ChromeClient 374 * should override this to process the log message as they see fit. 375 * @param message The error message to report. 376 * @param lineNumber The line number of the error. 377 * @param sourceID The name of the source file that caused the error. 378 * @deprecated Use {@link #onConsoleMessage(ConsoleMessage) onConsoleMessage(ConsoleMessage)} 379 * instead. 380 */ 381 @Deprecated onConsoleMessage(String message, int lineNumber, String sourceID)382 public void onConsoleMessage(String message, int lineNumber, String sourceID) { } 383 384 /** 385 * Report a JavaScript console message to the host application. The ChromeClient 386 * should override this to process the log message as they see fit. 387 * @param consoleMessage Object containing details of the console message. 388 * @return {@code true} if the message is handled by the client. 389 */ onConsoleMessage(ConsoleMessage consoleMessage)390 public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 391 // Call the old version of this function for backwards compatability. 392 onConsoleMessage(consoleMessage.message(), consoleMessage.lineNumber(), 393 consoleMessage.sourceId()); 394 return false; 395 } 396 397 /** 398 * When not playing, video elements are represented by a 'poster' image. The 399 * image to use can be specified by the poster attribute of the video tag in 400 * HTML. If the attribute is absent, then a default poster will be used. This 401 * method allows the ChromeClient to provide that default image. 402 * 403 * @return Bitmap The image to use as a default poster, or {@code null} if no such image is 404 * available. 405 */ 406 @Nullable getDefaultVideoPoster()407 public Bitmap getDefaultVideoPoster() { 408 return null; 409 } 410 411 /** 412 * Obtains a View to be displayed while buffering of full screen video is taking 413 * place. The host application can override this method to provide a View 414 * containing a spinner or similar. 415 * 416 * @return View The View to be displayed whilst the video is loading. 417 */ 418 @Nullable getVideoLoadingProgressView()419 public View getVideoLoadingProgressView() { 420 return null; 421 } 422 423 /** Obtains a list of all visited history items, used for link coloring 424 */ getVisitedHistory(ValueCallback<String[]> callback)425 public void getVisitedHistory(ValueCallback<String[]> callback) { 426 } 427 428 /** 429 * Tell the client to show a file chooser. 430 * 431 * This is called to handle HTML forms with 'file' input type, in response to the 432 * user pressing the "Select File" button. 433 * To cancel the request, call <code>filePathCallback.onReceiveValue(null)</code> and 434 * return {@code true}. 435 * 436 * @param webView The WebView instance that is initiating the request. 437 * @param filePathCallback Invoke this callback to supply the list of paths to files to upload, 438 * or {@code null} to cancel. Must only be called if the 439 * {@link #onShowFileChooser} implementation returns {@code true}. 440 * @param fileChooserParams Describes the mode of file chooser to be opened, and options to be 441 * used with it. 442 * @return {@code true} if filePathCallback will be invoked, {@code false} to use default 443 * handling. 444 * 445 * @see FileChooserParams 446 */ onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams)447 public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, 448 FileChooserParams fileChooserParams) { 449 return false; 450 } 451 452 /** 453 * Parameters used in the {@link #onShowFileChooser} method. 454 */ 455 public static abstract class FileChooserParams { 456 /** Open single file. Requires that the file exists before allowing the user to pick it. */ 457 public static final int MODE_OPEN = 0; 458 /** Like Open but allows multiple files to be selected. */ 459 public static final int MODE_OPEN_MULTIPLE = 1; 460 /** Like Open but allows a folder to be selected. The implementation should enumerate 461 all files selected by this operation. 462 This feature is not supported at the moment. 463 @hide */ 464 public static final int MODE_OPEN_FOLDER = 2; 465 /** Allows picking a nonexistent file and saving it. */ 466 public static final int MODE_SAVE = 3; 467 468 /** 469 * Parse the result returned by the file picker activity. This method should be used with 470 * {@link #createIntent}. Refer to {@link #createIntent} for how to use it. 471 * 472 * @param resultCode the integer result code returned by the file picker activity. 473 * @param data the intent returned by the file picker activity. 474 * @return the Uris of selected file(s) or {@code null} if the resultCode indicates 475 * activity canceled or any other error. 476 */ 477 @Nullable parseResult(int resultCode, Intent data)478 public static Uri[] parseResult(int resultCode, Intent data) { 479 return WebViewFactory.getProvider().getStatics().parseFileChooserResult(resultCode, data); 480 } 481 482 /** 483 * Returns file chooser mode. 484 */ getMode()485 public abstract int getMode(); 486 487 /** 488 * Returns an array of acceptable MIME types. The returned MIME type 489 * could be partial such as audio/*. The array will be empty if no 490 * acceptable types are specified. 491 */ getAcceptTypes()492 public abstract String[] getAcceptTypes(); 493 494 /** 495 * Returns preference for a live media captured value (e.g. Camera, Microphone). 496 * True indicates capture is enabled, {@code false} disabled. 497 * 498 * Use <code>getAcceptTypes</code> to determine suitable capture devices. 499 */ isCaptureEnabled()500 public abstract boolean isCaptureEnabled(); 501 502 /** 503 * Returns the title to use for this file selector. If {@code null} a default title should 504 * be used. 505 */ 506 @Nullable getTitle()507 public abstract CharSequence getTitle(); 508 509 /** 510 * The file name of a default selection if specified, or {@code null}. 511 */ 512 @Nullable getFilenameHint()513 public abstract String getFilenameHint(); 514 515 /** 516 * Creates an intent that would start a file picker for file selection. 517 * The Intent supports choosing files from simple file sources available 518 * on the device. Some advanced sources (for example, live media capture) 519 * may not be supported and applications wishing to support these sources 520 * or more advanced file operations should build their own Intent. 521 * 522 * <pre> 523 * How to use: 524 * 1. Build an intent using {@link #createIntent} 525 * 2. Fire the intent using {@link android.app.Activity#startActivityForResult}. 526 * 3. Check for ActivityNotFoundException and take a user friendly action if thrown. 527 * 4. Listen the result using {@link android.app.Activity#onActivityResult} 528 * 5. Parse the result using {@link #parseResult} only if media capture was not requested. 529 * 6. Send the result using filePathCallback of {@link WebChromeClient#onShowFileChooser} 530 * </pre> 531 * 532 * @return an Intent that supports basic file chooser sources. 533 */ createIntent()534 public abstract Intent createIntent(); 535 } 536 537 /** 538 * Tell the client to open a file chooser. 539 * @param uploadFile A ValueCallback to set the URI of the file to upload. 540 * onReceiveValue must be called to wake up the thread.a 541 * @param acceptType The value of the 'accept' attribute of the input tag 542 * associated with this file picker. 543 * @param capture The value of the 'capture' attribute of the input tag 544 * associated with this file picker. 545 * 546 * @deprecated Use {@link #onShowFileChooser} instead. 547 * @hide This method was not published in any SDK version. 548 */ 549 @SystemApi 550 @Deprecated openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)551 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) { 552 uploadFile.onReceiveValue(null); 553 } 554 } 555