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