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 database quota for the origin has been exceeded.
220    * @param url The URL that triggered the notification
221    * @param databaseIdentifier The identifier of the database that caused the
222    *     quota overflow.
223    * @param currentQuota The current quota for the origin.
224    * @param estimatedSize The estimated size of the database.
225    * @param totalUsedQuota is the sum of all origins' quota.
226    * @param quotaUpdater A callback to inform the WebCore thread that a new
227    *     quota is available. This callback must always be executed at some
228    *     point to ensure that the sleeping WebCore thread is woken up.
229    */
230    public void onExceededDatabaseQuota(String url, String databaseIdentifier,
231        long currentQuota, long estimatedSize, long totalUsedQuota,
232        WebStorage.QuotaUpdater quotaUpdater) {
233        // This default implementation passes the current quota back to WebCore.
234        // WebCore will interpret this that new quota was declined.
235        quotaUpdater.updateQuota(currentQuota);
236    }
237
238   /**
239    * Tell the client that the Application Cache has exceeded its max size.
240    * @param spaceNeeded is the amount of disk space that would be needed
241    * in order for the last appcache operation to succeed.
242    * @param totalUsedQuota is the sum of all origins' quota.
243    * @param quotaUpdater A callback to inform the WebCore thread that a new
244    * app cache size is available. This callback must always be executed at
245    * some point to ensure that the sleeping WebCore thread is woken up.
246    */
247    public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,
248            WebStorage.QuotaUpdater quotaUpdater) {
249        quotaUpdater.updateQuota(0);
250    }
251
252    /**
253     * Instructs the client to show a prompt to ask the user to set the
254     * Geolocation permission state for the specified origin.
255     */
256    public void onGeolocationPermissionsShowPrompt(String origin,
257            GeolocationPermissions.Callback callback) {}
258
259    /**
260     * Instructs the client to hide the Geolocation permissions prompt.
261     */
262    public void onGeolocationPermissionsHidePrompt() {}
263
264    /**
265     * Tell the client that a JavaScript execution timeout has occured. And the
266     * client may decide whether or not to interrupt the execution. If the
267     * client returns true, the JavaScript will be interrupted. If the client
268     * returns false, the execution will continue. Note that in the case of
269     * continuing execution, the timeout counter will be reset, and the callback
270     * will continue to occur if the script does not finish at the next check
271     * point.
272     * @return boolean Whether the JavaScript execution should be interrupted.
273     */
274    public boolean onJsTimeout() {
275        return true;
276    }
277
278    /**
279     * Report a JavaScript error message to the host application. The ChromeClient
280     * should override this to process the log message as they see fit.
281     * @param message The error message to report.
282     * @param lineNumber The line number of the error.
283     * @param sourceID The name of the source file that caused the error.
284     * @deprecated Use {@link #onConsoleMessage(ConsoleMessage) onConsoleMessage(ConsoleMessage)}
285     *      instead.
286     */
287    @Deprecated
288    public void onConsoleMessage(String message, int lineNumber, String sourceID) { }
289
290    /**
291     * Report a JavaScript console message to the host application. The ChromeClient
292     * should override this to process the log message as they see fit.
293     * @param consoleMessage Object containing details of the console message.
294     * @return true if the message is handled by the client.
295     */
296    public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
297        // Call the old version of this function for backwards compatability.
298        onConsoleMessage(consoleMessage.message(), consoleMessage.lineNumber(),
299                consoleMessage.sourceId());
300        return false;
301    }
302
303    /**
304     * When not playing, video elements are represented by a 'poster' image. The
305     * image to use can be specified by the poster attribute of the video tag in
306     * HTML. If the attribute is absent, then a default poster will be used. This
307     * method allows the ChromeClient to provide that default image.
308     *
309     * @return Bitmap The image to use as a default poster, or null if no such image is
310     * available.
311     */
312    public Bitmap getDefaultVideoPoster() {
313        return null;
314    }
315
316    /**
317     * When the user starts to playback a video element, it may take time for enough
318     * data to be buffered before the first frames can be rendered. While this buffering
319     * is taking place, the ChromeClient can use this function to provide a View to be
320     * displayed. For example, the ChromeClient could show a spinner animation.
321     *
322     * @return View The View to be displayed whilst the video is loading.
323     */
324    public View getVideoLoadingProgressView() {
325        return null;
326    }
327
328    /** Obtains a list of all visited history items, used for link coloring
329     */
330    public void getVisitedHistory(ValueCallback<String[]> callback) {
331    }
332
333    /**
334     * Tell the client to open a file chooser.
335     * @param uploadFile A ValueCallback to set the URI of the file to upload.
336     *      onReceiveValue must be called to wake up the thread.a
337     * @param acceptType The value of the 'accept' attribute of the input tag
338     *         associated with this file picker.
339     * @hide
340     */
341    public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {
342        uploadFile.onReceiveValue(null);
343    }
344
345    /**
346     * Tell the client that the page being viewed is web app capable,
347     * i.e. has specified the fullscreen-web-app-capable meta tag.
348     * @hide
349     */
350    public void setInstallableWebApp() { }
351
352    /**
353     * Tell the client that the page being viewed has an autofillable
354     * form and the user would like to set a profile up.
355     * @param msg A Message to send once the user has successfully
356     *      set up a profile and to inform the WebTextView it should
357     *      now autofill using that new profile.
358     * @hide
359     */
360    public void setupAutoFill(Message msg) { }
361
362}
363