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.content.pm.ActivityInfo; 20 import android.graphics.Bitmap; 21 import android.net.Uri; 22 import android.os.Message; 23 import android.view.View; 24 25 public class WebChromeClient { 26 27 /** 28 * Tell the host application the current progress of loading a page. 29 * @param view The WebView that initiated the callback. 30 * @param newProgress Current page loading progress, represented by 31 * an integer between 0 and 100. 32 */ 33 public void onProgressChanged(WebView view, int newProgress) {} 34 35 /** 36 * Notify the host application of a change in the document title. 37 * @param view The WebView that initiated the callback. 38 * @param title A String containing the new title of the document. 39 */ 40 public void onReceivedTitle(WebView view, String title) {} 41 42 /** 43 * Notify the host application of a new favicon for the current page. 44 * @param view The WebView that initiated the callback. 45 * @param icon A Bitmap containing the favicon for the current page. 46 */ 47 public void onReceivedIcon(WebView view, Bitmap icon) {} 48 49 /** 50 * Notify the host application of the url for an apple-touch-icon. 51 * @param view The WebView that initiated the callback. 52 * @param url The icon url. 53 * @param precomposed True if the url is for a precomposed touch icon. 54 */ 55 public void onReceivedTouchIconUrl(WebView view, String url, 56 boolean precomposed) {} 57 58 /** 59 * A callback interface used by the host application to notify 60 * the current page that its custom view has been dismissed. 61 */ 62 public interface CustomViewCallback { 63 /** 64 * Invoked when the host application dismisses the 65 * custom view. 66 */ 67 public void onCustomViewHidden(); 68 } 69 70 /** 71 * Notify the host application that the current page would 72 * like to show a custom View. This is used for Fullscreen 73 * video playback; see "HTML5 Video support" documentation on 74 * {@link WebView}. 75 * @param view is the View object to be shown. 76 * @param callback is the callback to be invoked if and when the view 77 * is dismissed. 78 */ 79 public void onShowCustomView(View view, CustomViewCallback callback) {}; 80 81 /** 82 * Notify the host application that the current page would 83 * like to show a custom View in a particular orientation. 84 * @param view is the View object to be shown. 85 * @param requestedOrientation An orientation constant as used in 86 * {@link ActivityInfo#screenOrientation ActivityInfo.screenOrientation}. 87 * @param callback is the callback to be invoked if and when the view 88 * is dismissed. 89 * @deprecated This method supports the obsolete plugin mechanism, 90 * and will not be invoked in future 91 */ 92 @Deprecated 93 public void onShowCustomView(View view, int requestedOrientation, 94 CustomViewCallback callback) {}; 95 96 /** 97 * Notify the host application that the current page would 98 * like to hide its custom view. 99 */ 100 public void onHideCustomView() {} 101 102 /** 103 * Request the host application to create a new window. If the host 104 * application chooses to honor this request, it should return true from 105 * this method, create a new WebView to host the window, insert it into the 106 * View system and send the supplied resultMsg message to its target with 107 * the new WebView as an argument. If the host application chooses not to 108 * honor the request, it should return false from this method. The default 109 * implementation of this method does nothing and hence returns false. 110 * @param view The WebView from which the request for a new window 111 * originated. 112 * @param isDialog True if the new window should be a dialog, rather than 113 * a full-size window. 114 * @param isUserGesture True if the request was initiated by a user gesture, 115 * such as the user clicking a link. 116 * @param resultMsg The message to send when once a new WebView has been 117 * created. resultMsg.obj is a 118 * {@link WebView.WebViewTransport} object. This should be 119 * used to transport the new WebView, by calling 120 * {@link WebView.WebViewTransport#setWebView(WebView) 121 * WebView.WebViewTransport.setWebView(WebView)}. 122 * @return This method should return true if the host application will 123 * create a new window, in which case resultMsg should be sent to 124 * its target. Otherwise, this method should return false. Returning 125 * false from this method but also sending resultMsg will result in 126 * undefined behavior. 127 */ 128 public boolean onCreateWindow(WebView view, boolean isDialog, 129 boolean isUserGesture, Message resultMsg) { 130 return false; 131 } 132 133 /** 134 * Request display and focus for this WebView. This may happen due to 135 * another WebView opening a link in this WebView and requesting that this 136 * WebView be displayed. 137 * @param view The WebView that needs to be focused. 138 */ 139 public void onRequestFocus(WebView view) {} 140 141 /** 142 * Notify the host application to close the given WebView and remove it 143 * from the view system if necessary. At this point, WebCore has stopped 144 * any loading in this window and has removed any cross-scripting ability 145 * in javascript. 146 * @param window The WebView that needs to be closed. 147 */ 148 public void onCloseWindow(WebView window) {} 149 150 /** 151 * Tell the client to display a javascript alert dialog. If the client 152 * returns true, WebView will assume that the client will handle the 153 * dialog. If the client returns false, it will continue execution. 154 * @param view The WebView that initiated the callback. 155 * @param url The url of the page requesting the dialog. 156 * @param message Message to be displayed in the window. 157 * @param result A JsResult to confirm that the user hit enter. 158 * @return boolean Whether the client will handle the alert dialog. 159 */ 160 public boolean onJsAlert(WebView view, String url, String message, 161 JsResult result) { 162 return false; 163 } 164 165 /** 166 * Tell the client to display a confirm dialog to the user. If the client 167 * returns true, WebView will assume that the client will handle the 168 * confirm dialog and call the appropriate JsResult method. If the 169 * client returns false, a default value of false will be returned to 170 * javascript. The default behavior is to return false. 171 * @param view The WebView that initiated the callback. 172 * @param url The url of the page requesting the dialog. 173 * @param message Message to be displayed in the window. 174 * @param result A JsResult used to send the user's response to 175 * javascript. 176 * @return boolean Whether the client will handle the confirm dialog. 177 */ 178 public boolean onJsConfirm(WebView view, String url, String message, 179 JsResult result) { 180 return false; 181 } 182 183 /** 184 * Tell the client to display a prompt dialog to the user. If the client 185 * returns true, WebView will assume that the client will handle the 186 * prompt dialog and call the appropriate JsPromptResult method. If the 187 * client returns false, a default value of false will be returned to to 188 * javascript. The default behavior is to return false. 189 * @param view The WebView that initiated the callback. 190 * @param url The url of the page requesting the dialog. 191 * @param message Message to be displayed in the window. 192 * @param defaultValue The default value displayed in the prompt dialog. 193 * @param result A JsPromptResult used to send the user's reponse to 194 * javascript. 195 * @return boolean Whether the client will handle the prompt dialog. 196 */ 197 public boolean onJsPrompt(WebView view, String url, String message, 198 String defaultValue, JsPromptResult result) { 199 return false; 200 } 201 202 /** 203 * Tell the client to display a dialog to confirm navigation away from the 204 * current page. This is the result of the onbeforeunload javascript event. 205 * If the client returns true, WebView will assume that the client will 206 * handle the confirm dialog and call the appropriate JsResult method. If 207 * the client returns false, a default value of true will be returned to 208 * javascript to accept navigation away from the current page. The default 209 * behavior is to return false. Setting the JsResult to true will navigate 210 * away from the current page, false will cancel the navigation. 211 * @param view The WebView that initiated the callback. 212 * @param url The url of the page requesting the dialog. 213 * @param message Message to be displayed in the window. 214 * @param result A JsResult used to send the user's response to 215 * javascript. 216 * @return boolean Whether the client will handle the confirm dialog. 217 */ 218 public boolean onJsBeforeUnload(WebView view, String url, String message, 219 JsResult result) { 220 return false; 221 } 222 223 /** 224 * Tell the client that the quota has been exceeded for the Web SQL Database 225 * API for a particular origin and request a new quota. The client must 226 * respond by invoking the 227 * {@link WebStorage.QuotaUpdater#updateQuota(long) updateQuota(long)} 228 * method of the supplied {@link WebStorage.QuotaUpdater} instance. The 229 * minimum value that can be set for the new quota is the current quota. The 230 * default implementation responds with the current quota, so the quota will 231 * not be increased. 232 * @param url The URL of the page that triggered the notification 233 * @param databaseIdentifier The identifier of the database where the quota 234 * was exceeded. 235 * @param quota The quota for the origin, in bytes 236 * @param estimatedDatabaseSize The estimated size of the offending 237 * database, in bytes 238 * @param totalQuota The total quota for all origins, in bytes 239 * @param quotaUpdater An instance of {@link WebStorage.QuotaUpdater} which 240 * must be used to inform the WebView of the new quota. 241 */ 242 // Note that the callback must always be executed at some point to ensure 243 // that the sleeping WebCore thread is woken up. 244 public void onExceededDatabaseQuota(String url, String databaseIdentifier, 245 long quota, long estimatedDatabaseSize, long totalQuota, 246 WebStorage.QuotaUpdater quotaUpdater) { 247 // This default implementation passes the current quota back to WebCore. 248 // WebCore will interpret this that new quota was declined. 249 quotaUpdater.updateQuota(quota); 250 } 251 252 /** 253 * Notify the host application that the Application Cache has reached the 254 * maximum size. The client must respond by invoking the 255 * {@link WebStorage.QuotaUpdater#updateQuota(long) updateQuota(long)} 256 * method of the supplied {@link WebStorage.QuotaUpdater} instance. The 257 * minimum value that can be set for the new quota is the current quota. The 258 * default implementation responds with the current quota, so the quota will 259 * not be increased. 260 * @param requiredStorage The amount of storage required by the Application 261 * Cache operation that triggered this notification, 262 * in bytes. 263 * @param quota the current maximum Application Cache size, 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 */ 267 // Note that the callback must always be executed at some point to ensure 268 // that the sleeping WebCore thread is woken up. 269 public void onReachedMaxAppCacheSize(long requiredStorage, long quota, 270 WebStorage.QuotaUpdater quotaUpdater) { 271 quotaUpdater.updateQuota(quota); 272 } 273 274 /** 275 * Notify the host application that web content from the specified origin 276 * is attempting to use the Geolocation API, but no permission state is 277 * currently set for that origin. The host application should invoke the 278 * specified callback with the desired permission state. See 279 * {@link GeolocationPermissions} for details. 280 * @param origin The origin of the web content attempting to use the 281 * Geolocation API. 282 * @param callback The callback to use to set the permission state for the 283 * origin. 284 */ 285 public void onGeolocationPermissionsShowPrompt(String origin, 286 GeolocationPermissions.Callback callback) {} 287 288 /** 289 * Notify the host application that a request for Geolocation permissions, 290 * made with a previous call to 291 * {@link #onGeolocationPermissionsShowPrompt(String,GeolocationPermissions.Callback) onGeolocationPermissionsShowPrompt()} 292 * has been canceled. Any related UI should therefore be hidden. 293 */ 294 public void onGeolocationPermissionsHidePrompt() {} 295 296 /** 297 * Tell the client that a JavaScript execution timeout has occured. And the 298 * client may decide whether or not to interrupt the execution. If the 299 * client returns true, the JavaScript will be interrupted. If the client 300 * returns false, the execution will continue. Note that in the case of 301 * continuing execution, the timeout counter will be reset, and the callback 302 * will continue to occur if the script does not finish at the next check 303 * point. 304 * @return boolean Whether the JavaScript execution should be interrupted. 305 * @deprecated This method is no longer supported and will not be invoked. 306 */ 307 // This method was only called when using the JSC javascript engine. V8 became 308 // the default JS engine with Froyo and support for building with JSC was 309 // removed in b/5495373. V8 does not have a mechanism for making a callback such 310 // as this. 311 public boolean onJsTimeout() { 312 return true; 313 } 314 315 /** 316 * Report a JavaScript error message to the host application. The ChromeClient 317 * should override this to process the log message as they see fit. 318 * @param message The error message to report. 319 * @param lineNumber The line number of the error. 320 * @param sourceID The name of the source file that caused the error. 321 * @deprecated Use {@link #onConsoleMessage(ConsoleMessage) onConsoleMessage(ConsoleMessage)} 322 * instead. 323 */ 324 @Deprecated 325 public void onConsoleMessage(String message, int lineNumber, String sourceID) { } 326 327 /** 328 * Report a JavaScript console message to the host application. The ChromeClient 329 * should override this to process the log message as they see fit. 330 * @param consoleMessage Object containing details of the console message. 331 * @return true if the message is handled by the client. 332 */ 333 public boolean onConsoleMessage(ConsoleMessage consoleMessage) { 334 // Call the old version of this function for backwards compatability. 335 onConsoleMessage(consoleMessage.message(), consoleMessage.lineNumber(), 336 consoleMessage.sourceId()); 337 return false; 338 } 339 340 /** 341 * When not playing, video elements are represented by a 'poster' image. The 342 * image to use can be specified by the poster attribute of the video tag in 343 * HTML. If the attribute is absent, then a default poster will be used. This 344 * method allows the ChromeClient to provide that default image. 345 * 346 * @return Bitmap The image to use as a default poster, or null if no such image is 347 * available. 348 */ 349 public Bitmap getDefaultVideoPoster() { 350 return null; 351 } 352 353 /** 354 * When the user starts to playback a video element, it may take time for enough 355 * data to be buffered before the first frames can be rendered. While this buffering 356 * is taking place, the ChromeClient can use this function to provide a View to be 357 * displayed. For example, the ChromeClient could show a spinner animation. 358 * 359 * @return View The View to be displayed whilst the video is loading. 360 */ 361 public View getVideoLoadingProgressView() { 362 return null; 363 } 364 365 /** Obtains a list of all visited history items, used for link coloring 366 */ 367 public void getVisitedHistory(ValueCallback<String[]> callback) { 368 } 369 370 /** 371 * Tell the client to open a file chooser. 372 * @param uploadFile A ValueCallback to set the URI of the file to upload. 373 * onReceiveValue must be called to wake up the thread.a 374 * @param acceptType The value of the 'accept' attribute of the input tag 375 * associated with this file picker. 376 * @param capture The value of the 'capture' attribute of the input tag 377 * associated with this file picker. 378 * @hide 379 */ 380 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture) { 381 uploadFile.onReceiveValue(null); 382 } 383 384 /** 385 * Tell the client that the page being viewed has an autofillable 386 * form and the user would like to set a profile up. 387 * @param msg A Message to send once the user has successfully 388 * set up a profile and to inform the WebTextView it should 389 * now autofill using that new profile. 390 * @hide 391 */ 392 public void setupAutoFill(Message msg) { } 393 394 } 395