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 */ onProgressChanged(WebView view, int newProgress)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 */ onReceivedTitle(WebView view, String title)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 */ onReceivedIcon(WebView view, Bitmap icon)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 */ onReceivedTouchIconUrl(WebView view, String url, boolean precomposed)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 */ onCustomViewHidden()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 */ onShowCustomView(View view, CustomViewCallback callback)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 */ onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback)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 */ onHideCustomView()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 */ onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)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 */ onRequestFocus(WebView view)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 */ onCloseWindow(WebView window)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 */ onJsAlert(WebView view, String url, String message, JsResult result)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 */ onJsConfirm(WebView view, String url, String message, JsResult result)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 */ onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)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 */ onJsBeforeUnload(WebView view, String url, String message, JsResult result)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. onExceededDatabaseQuota(String url, String databaseIdentifier, long quota, long estimatedDatabaseSize, long totalQuota, WebStorage.QuotaUpdater quotaUpdater)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. onReachedMaxAppCacheSize(long requiredStorage, long quota, WebStorage.QuotaUpdater quotaUpdater)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 */ onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback)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 */ onGeolocationPermissionsHidePrompt()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. onJsTimeout()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 onConsoleMessage(String message, int lineNumber, String sourceID)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 */ onConsoleMessage(ConsoleMessage consoleMessage)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 */ getDefaultVideoPoster()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 */ getVideoLoadingProgressView()356 public View getVideoLoadingProgressView() { 357 return null; 358 } 359 360 /** Obtains a list of all visited history items, used for link coloring 361 */ getVisitedHistory(ValueCallback<String[]> callback)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 */ openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)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 */ setupAutoFill(Message msg)387 public void setupAutoFill(Message msg) { } 388 389 } 390