19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.webkit;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
191184313cbea3b34a4596a90be7081551d36f251aGrace Klobaimport android.app.ActivityManager;
2011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scottimport android.content.ComponentCallbacks;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
2311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scottimport android.content.res.Configuration;
2470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scrogginsimport android.database.Cursor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.ParseException;
2770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scrogginsimport android.net.Uri;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.WebAddress;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.http.SslCertificate;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
3270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scrogginsimport android.provider.OpenableColumns;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue;
35f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scottimport android.view.Surface;
3611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scottimport android.view.ViewRoot;
37dbde425e216e47ec9fbbf521146636c40fe3198ePatrick Scottimport android.view.WindowManager;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.Assert;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scrogginsimport java.io.InputStream;
4211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scottimport java.lang.ref.WeakReference;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.URLEncoder;
4411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scottimport java.util.ArrayList;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
464950b2b6951bbdc2b0023130bfbaca2a4044044fAndrei Popescuimport java.util.Map;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BrowserFrame extends Handler {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOGTAG = "webkit";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cap the number of LoadListeners that will be instantiated, so
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * we don't blow the GREF count.  Attempting to queue more than
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this many requests will prompt an error() callback on the
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * request's LoadListener
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int MAX_OUTSTANDING_REQUESTS = 300;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final CallbackProxy mCallbackProxy;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final WebSettings mSettings;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final Context mContext;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final WebViewDatabase mDatabase;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final WebViewCore mWebViewCore;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ boolean mLoadInitFromJava;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mLoadType;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mFirstLayoutDone = true;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mCommitted = true;
70c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke    // Flag for blocking messages. This is used during destroy() so
71c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke    // that if the UI thread posts any messages after the message
72c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke    // queue has been cleared,they are ignored.
73c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke    private boolean mBlockMessages = false;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Is this frame the main frame?
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mIsMainFrame;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Attached Javascript interfaces
794950b2b6951bbdc2b0023130bfbaca2a4044044fAndrei Popescu    private Map<String, Object> mJSInterfaceMap;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // message ids
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // a message posted when a frame loading is completed
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_COMPLETED = 1001;
84f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott    // orientation change message
85f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott    static final int ORIENTATION_CHANGED = 1002;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // a message posted when the user decides the policy
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int POLICY_FUNCTION = 1003;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Note: need to keep these in sync with FrameLoaderTypes.h in native
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_STANDARD = 0;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_BACK = 1;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_FORWARD = 2;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_INDEXEDBACKFORWARD = 3;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_RELOAD = 4;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_RELOADALLOWINGSTALEDATA = 5;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_SAME = 6;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_REDIRECT = 7;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FRAME_LOADTYPE_REPLACE = 8;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A progress threshold to switch from history Picture to live Picture
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int TRANSITION_SWITCH_THRESHOLD = 75;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is a field accessed by native code as well as package classes.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ int mNativeFrame;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Static instance of a JWebCoreJavaBridge to handle timer and cookie
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // requests from WebCore.
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static JWebCoreJavaBridge sJavaBridge;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott    private static class ConfigCallback implements ComponentCallbacks {
11111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        private final ArrayList<WeakReference<Handler>> mHandlers =
11211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                new ArrayList<WeakReference<Handler>>();
11311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        private final WindowManager mWindowManager;
11411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
11511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        ConfigCallback(WindowManager wm) {
11611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            mWindowManager = wm;
11711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        }
11811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
11911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        public synchronized void addHandler(Handler h) {
12011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            // No need to ever remove a Handler. If the BrowserFrame is
12111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            // destroyed, it will be collected and the WeakReference set to
12211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            // null. If it happens to still be around during a configuration
12311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            // change, the message will be ignored.
12411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            mHandlers.add(new WeakReference<Handler>(h));
12511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        }
12611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
12711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        public void onConfigurationChanged(Configuration newConfig) {
12811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            if (mHandlers.size() == 0) {
12911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                return;
13011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            }
13111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            int orientation =
13211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    mWindowManager.getDefaultDisplay().getOrientation();
13311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            switch (orientation) {
13411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                case Surface.ROTATION_90:
13511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    orientation = 90;
13611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    break;
13711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                case Surface.ROTATION_180:
13811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    orientation = 180;
13911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    break;
14011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                case Surface.ROTATION_270:
14111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    orientation = -90;
14211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    break;
14311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                case Surface.ROTATION_0:
14411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    orientation = 0;
14511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    break;
14611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                default:
14711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    break;
14811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            }
14911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            synchronized (this) {
15011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                // Create a list of handlers to remove. Go ahead and make it
15111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                // the same size to avoid resizing.
15211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                ArrayList<WeakReference> handlersToRemove =
15311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                        new ArrayList<WeakReference>(mHandlers.size());
15411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                for (WeakReference<Handler> wh : mHandlers) {
15511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    Handler h = wh.get();
15611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    if (h != null) {
15711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                        h.sendMessage(h.obtainMessage(ORIENTATION_CHANGED,
15811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                                    orientation, 0));
15911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    } else {
16011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                        handlersToRemove.add(wh);
16111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    }
16211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                }
16311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                // Now remove all the null references.
16411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                for (WeakReference weak : handlersToRemove) {
16511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    mHandlers.remove(weak);
16611f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                }
16711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            }
16811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        }
16911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
17011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        public void onLowMemory() {}
17111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott    }
17211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott    static ConfigCallback sConfigCallback;
17311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new BrowserFrame to be used in an application.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context An application context to use when retrieving assets.
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param w A WebViewCore used as the view for this frame.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param proxy A CallbackProxy for posting messages to the UI thread and
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              querying a client for information.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param settings A WebSettings object that holds all settings.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * XXX: Called by WebCore thread.
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BrowserFrame(Context context, WebViewCore w, CallbackProxy proxy,
1844950b2b6951bbdc2b0023130bfbaca2a4044044fAndrei Popescu            WebSettings settings, Map<String, Object> javascriptInterfaces) {
18501d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy
18601d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy        Context appContext = context.getApplicationContext();
18701d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Create a global JWebCoreJavaBridge to handle timers and
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // cookies in the WebCore thread.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sJavaBridge == null) {
1919b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba            sJavaBridge = new JWebCoreJavaBridge();
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // set WebCore native cache size
1931184313cbea3b34a4596a90be7081551d36f251aGrace Kloba            ActivityManager am = (ActivityManager) context
1941184313cbea3b34a4596a90be7081551d36f251aGrace Kloba                    .getSystemService(Context.ACTIVITY_SERVICE);
1951184313cbea3b34a4596a90be7081551d36f251aGrace Kloba            if (am.getMemoryClass() > 16) {
1961184313cbea3b34a4596a90be7081551d36f251aGrace Kloba                sJavaBridge.setCacheSize(8 * 1024 * 1024);
1971184313cbea3b34a4596a90be7081551d36f251aGrace Kloba            } else {
1981184313cbea3b34a4596a90be7081551d36f251aGrace Kloba                sJavaBridge.setCacheSize(4 * 1024 * 1024);
1991184313cbea3b34a4596a90be7081551d36f251aGrace Kloba            }
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // initialize CacheManager
20101d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy            CacheManager.init(appContext);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // create CookieSyncManager with current Context
20301d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy            CookieSyncManager.createInstance(appContext);
204658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba            // create PluginManager with current Context
20501d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy            PluginManager.getInstance(appContext);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20711f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
20811f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        if (sConfigCallback == null) {
20911f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            sConfigCallback = new ConfigCallback(
21011f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                    (WindowManager) context.getSystemService(
21111f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott                            Context.WINDOW_SERVICE));
21211f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott            ViewRoot.addConfigCallback(sConfigCallback);
21311f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        }
21411f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott        sConfigCallback.addHandler(this);
21511f5738424023ab0d2e90a41293685e71ac7e63aPatrick Scott
2164950b2b6951bbdc2b0023130bfbaca2a4044044fAndrei Popescu        mJSInterfaceMap = javascriptInterfaces;
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSettings = settings;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy = proxy;
22101d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy        mDatabase = WebViewDatabase.getInstance(appContext);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWebViewCore = w;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22483031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba        AssetManager am = context.getAssets();
22583031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba        nativeCreateFrame(w, am, proxy.getBackForwardList());
22683031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba
2272e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.BROWSER_FRAME) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(LOGTAG, "BrowserFrame constructor: this=" + this);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Load a url from the network or the filesystem into the main frame.
234d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba     * Following the same behaviour as Safari, javascript: URLs are not passed
235d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba     * to the main frame, instead they are evaluated immediately.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url to load.
237d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba     * @param extraHeaders The extra headers sent with this url. This should not
238d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba     *            include the common headers like "user-agent". If it does, it
239d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba     *            will be replaced by the intrinsic value of the WebView.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
241d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba    public void loadUrl(String url, Map<String, String> extraHeaders) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = true;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (URLUtil.isJavaScriptUrl(url)) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // strip off the scheme and evaluate the string
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringByEvaluatingJavaScriptFromString(
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    url.substring("javascript:".length()));
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
248d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba            nativeLoadUrl(url, extraHeaders);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = false;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2545753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba     * Load a url with "POST" method from the network into the main frame.
2555753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba     * @param url The url to load.
2565753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba     * @param data The data for POST request.
2575753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba     */
2585753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba    public void postUrl(String url, byte[] data) {
2595753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba        mLoadInitFromJava = true;
2605753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba        nativePostUrl(url, data);
2615753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba        mLoadInitFromJava = false;
2625753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba    }
2635753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba
2645753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba    /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Load the content as if it was loaded by the provided base URL. The
2661bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins     * historyUrl is used as the history entry for the load data.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param baseUrl Base URL used to resolve relative paths in the content
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param data Content to render in the browser
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mimeType Mimetype of the data being passed in
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param encoding Character set encoding of the provided data.
2721bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins     * @param historyUrl URL to use as the history entry.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void loadData(String baseUrl, String data, String mimeType,
2751bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins            String encoding, String historyUrl) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = true;
2771bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins        if (historyUrl == null || historyUrl.length() == 0) {
2781bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins            historyUrl = "about:blank";
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data == null) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data = "";
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Setup defaults for missing values. These defaults where taken from
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // WebKit's WebFrame.mm
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (baseUrl == null || baseUrl.length() == 0) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            baseUrl = "about:blank";
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mimeType == null || mimeType.length() == 0) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mimeType = "text/html";
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2921bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins        nativeLoadData(baseUrl, data, mimeType, encoding, historyUrl);
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = false;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Go back or forward the number of steps given.
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param steps A negative or positive number indicating the direction
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              and number of steps to move.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void goBackOrForward(int steps) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = true;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nativeGoBackOrForward(steps);
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLoadInitFromJava = false;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * native callback
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Report an error to an activity.
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param errorCode The HTTP error code.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param description A String description.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: Report all errors including resource errors but include some kind
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of domain identifier. Change errorCode to an enum for a cleaner
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * interface.
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void reportError(final int errorCode, final String description,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final String failingUrl) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // As this is called for the main resource and loading will be stopped
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // after, reset the state variables.
3204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        resetLoadingStates();
3214df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        mCallbackProxy.onReceivedError(errorCode, description, failingUrl);
3224df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
3234df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
3244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    private void resetLoadingStates() {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCommitted = true;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirstLayoutDone = true;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */boolean committed() {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCommitted;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */boolean firstLayoutDone() {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFirstLayoutDone;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */int loadType() {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLoadType;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */void didFirstLayout() {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mFirstLayoutDone) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirstLayoutDone = true;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // ensure {@link WebViewCore#webkitDraw} is called as we were
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // blocking the update in {@link #loadStarted}
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWebViewCore.contentDraw();
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * native callback
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the beginning of a new load.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method will be called once for the main frame.
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadStarted(String url, Bitmap favicon, int loadType,
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean isMainFrame) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mIsMainFrame = isMainFrame;
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isMainFrame || loadType == FRAME_LOADTYPE_STANDARD) {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadType = loadType;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isMainFrame) {
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Call onPageStarted for main frames.
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallbackProxy.onPageStarted(url, favicon);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // as didFirstLayout() is only called for the main frame, reset
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // mFirstLayoutDone only for the main frames
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFirstLayoutDone = false;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCommitted = false;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remove pending draw to block update until mFirstLayoutDone is
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // set to true in didFirstLayout()
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWebViewCore.removeMessages(WebViewCore.EventHub.WEBKIT_DRAW);
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Note: only saves committed form data in standard load
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (loadType == FRAME_LOADTYPE_STANDARD
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mSettings.getSaveFormData()) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final WebHistoryItem h = mCallbackProxy.getBackForwardList()
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .getCurrentItem();
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (h != null) {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String currentUrl = h.getUrl();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (currentUrl != null) {
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mDatabase.setFormData(currentUrl, getFormTextData());
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * native callback
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the WebKit has committed to the new load
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void transitionToCommitted(int loadType, boolean isMainFrame) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // loadType is not used yet
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isMainFrame) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCommitted = true;
3979a67c82089e43d37f5038c74b0e1dca8edc4ac8aGrace Kloba            mWebViewCore.getWebView().mViewManager.postResetStateAll();
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * native callback
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the end of a new load.
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method will be called once for the main frame.
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void loadFinished(String url, int loadType, boolean isMainFrame) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // mIsMainFrame and isMainFrame are better be equal!!!
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isMainFrame || loadType == FRAME_LOADTYPE_STANDARD) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isMainFrame) {
4124df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                resetLoadingStates();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallbackProxy.switchOutDrawHistory();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCallbackProxy.onPageFinished(url);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We have received an SSL certificate for the main top-level page.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * !!!Called from the network thread!!!
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void certificate(SslCertificate certificate) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIsMainFrame) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want to make this call even if the certificate is null
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // (ie, the site is not secure)
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallbackProxy.onReceivedCertificate(certificate);
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Destroy all native components of the BrowserFrame.
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void destroy() {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nativeDestroyFrame();
437c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke        mBlockMessages = true;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeCallbacksAndMessages(null);
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle messages posted to us.
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param msg The message to handle.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void handleMessage(Message msg) {
447c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke        if (mBlockMessages) {
448c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke            return;
449c0b778e10f8a4971f14b501a277b6b505d66b84dLeon Clarke        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (msg.what) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FRAME_COMPLETED: {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mSettings.getSavePassword() && hasPasswordField()) {
453af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                    WebHistoryItem item = mCallbackProxy.getBackForwardList()
454af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                            .getCurrentItem();
455af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                    if (item != null) {
456af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                        WebAddress uri = new WebAddress(item.getUrl());
457af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                        String schemePlusHost = uri.mScheme + uri.mHost;
458af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                        String[] up =
459af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                                mDatabase.getUsernamePassword(schemePlusHost);
460af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                        if (up != null && up[0] != null) {
461af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                            setUsernamePassword(up[0], up[1]);
462af31c3a42d48c9781b40587cf735f96352fe333aPatrick Scott                        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4652036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                WebViewWorker.getHandler().sendEmptyMessage(
4662036dbab1726c34953360a7a56d6b9ef1f2aa7ddGrace Kloba                        WebViewWorker.MSG_TRIM_CACHE);
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case POLICY_FUNCTION: {
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nativeCallPolicyFunction(msg.arg1, msg.arg2);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott            case ORIENTATION_CHANGED: {
476f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott                nativeOrientationChanged(msg.arg1);
477f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott                break;
478f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott            }
479f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Punch-through for WebCore to set the document
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * title. Inform the Activity of the new title.
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param title The new title of the document.
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setTitle(String title) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // FIXME: The activity must call getTitle (a native method) to get the
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // title. We should try and cache the title if we can also keep it in
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // sync with the document.
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onReceivedTitle(title);
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieves the render tree of this frame and puts it as the object for
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the message and sends the message.
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param callback the message to use to send the render tree
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void externalRepresentation(Message callback) {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callback.obj = externalRepresentation();;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callback.sendToTarget();
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the render tree as a string
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native String externalRepresentation();
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieves the visual text of the current frame, puts it as the object for
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the message and sends the message.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param callback the message to use to send the visual text
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void documentAsText(Message callback) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callback.obj = documentAsText();;
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        callback.sendToTarget();
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the text drawn on the screen as a string
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native String documentAsText();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called by WebCore to inform the frame that
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the Javascript window object has been cleared.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * We should re-attach any attached js interfaces.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void windowObjectCleared(int nativeFramePointer) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mJSInterfaceMap != null) {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Iterator iter = mJSInterfaceMap.keySet().iterator();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (iter.hasNext())  {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String interfaceName = (String) iter.next();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                nativeAddJavascriptInterface(nativeFramePointer,
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mJSInterfaceMap.get(interfaceName), interfaceName);
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is called by WebCore to check whether application
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * wants to hijack url loading
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean handleUrl(String url) {
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLoadInitFromJava == true) {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCallbackProxy.shouldOverrideUrlLoading(url)) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if the url is hijacked, reset the state of the BrowserFrame
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            didFirstLayout();
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addJavascriptInterface(Object obj, String interfaceName) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mJSInterfaceMap == null) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mJSInterfaceMap = new HashMap<String, Object>();
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mJSInterfaceMap.containsKey(interfaceName)) {
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mJSInterfaceMap.remove(interfaceName);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mJSInterfaceMap.put(interfaceName, obj);
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * Called by JNI.  Given a URI, find the associated file and return its size
57270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @param uri A String representing the URI of the desired file.
57370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @return int The size of the given file.
57470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     */
57570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    private int getFileSize(String uri) {
57670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        int size = 0;
577ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark        try {
578ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark            InputStream stream = mContext.getContentResolver()
579ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark                            .openInputStream(Uri.parse(uri));
580ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark            size = stream.available();
581ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark            stream.close();
582ac96fa575f17d4a65e65eddebe805c904fb29c19Cary Clark        } catch (Exception e) {}
58370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        return size;
58470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    }
58570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins
58670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    /**
58770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * Called by JNI.  Given a URI, a buffer, and an offset into the buffer,
58870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * copy the resource into buffer.
58970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @param uri A String representing the URI of the desired file.
59070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @param buffer The byte array to copy the data into.
59170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @param offset The offet into buffer to place the data.
59201d0fbfa683012623f030ec75a63e1a9fabcb916Romain Guy     * @param expectedSize The size that the buffer has allocated for this file.
59370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     * @return int The size of the given file, or zero if it fails.
59470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins     */
595d5ba82a1fe07a622dec3b304af285bec0410597dLeon Scroggins    private int getFile(String uri, byte[] buffer, int offset,
596d5ba82a1fe07a622dec3b304af285bec0410597dLeon Scroggins            int expectedSize) {
59770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        int size = 0;
59870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        try {
59970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            InputStream stream = mContext.getContentResolver()
60070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                            .openInputStream(Uri.parse(uri));
60170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            size = stream.available();
602d5ba82a1fe07a622dec3b304af285bec0410597dLeon Scroggins            if (size <= expectedSize && buffer != null
603d5ba82a1fe07a622dec3b304af285bec0410597dLeon Scroggins                    && buffer.length - offset >= size) {
60470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                stream.read(buffer, offset, size);
60570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            } else {
60670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins                size = 0;
60770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            }
60870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            stream.close();
60970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        } catch (java.io.FileNotFoundException e) {
61070ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            Log.e(LOGTAG, "FileNotFoundException:" + e);
61170ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            size = 0;
61270ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        } catch (java.io.IOException e2) {
61370ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            Log.e(LOGTAG, "IOException: " + e2);
61470ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins            size = 0;
61570ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        }
61670ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins        return size;
61770ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    }
61870ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins
61970ca3c25b959427359bdb7cf37a8c3d6eb962357Leon Scroggins    /**
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start loading a resource.
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param loaderHandle The native ResourceLoader that is the target of the
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                     data.
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param url The url to load.
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param method The http method.
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param headers The http headers.
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param postData If the method is "POST" postData is sent as the request
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 body. Is null when empty.
628dba8cb76371960457e91b31fa396478f809a5a34Brian Carlstrom     * @param postDataIdentifier If the post data contained form this is the form identifier, otherwise it is 0.
629dba8cb76371960457e91b31fa396478f809a5a34Brian Carlstrom     * @param cacheMode The cache mode to use when loading this resource. See WebSettings.setCacheMode
630dba8cb76371960457e91b31fa396478f809a5a34Brian Carlstrom     * @param mainResource True if the this resource is the main request, not a supporting resource
631dba8cb76371960457e91b31fa396478f809a5a34Brian Carlstrom     * @param userGesture
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param synchronous True if the load is synchronous.
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A newly created LoadListener object.
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private LoadListener startLoadingResource(int loaderHandle,
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              String url,
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              String method,
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              HashMap headers,
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              byte[] postData,
6408c92c39b858ae73a1b08ed698887efa98ced987cGrace Kloba                                              long postDataIdentifier,
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                              int cacheMode,
6427c24ed6904707ea7179cb81382b7ca8d8ce85b7fPatrick Scott                                              boolean mainResource,
6437c24ed6904707ea7179cb81382b7ca8d8ce85b7fPatrick Scott                                              boolean userGesture,
644ea08c513549c1ddd9ba32337cb30973d7b61ca32Steve Block                                              boolean synchronous,
645ea08c513549c1ddd9ba32337cb30973d7b61ca32Steve Block                                              String username,
646ea08c513549c1ddd9ba32337cb30973d7b61ca32Steve Block                                              String password) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PerfChecker checker = new PerfChecker();
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mSettings.getCacheMode() != WebSettings.LOAD_DEFAULT) {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cacheMode = mSettings.getCacheMode();
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (method.equals("POST")) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't use the cache on POSTs when issuing a normal POST
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // request.
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cacheMode == WebSettings.LOAD_NORMAL) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cacheMode = WebSettings.LOAD_NO_CACHE;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mSettings.getSavePassword() && hasPasswordField()) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
6612e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger                    if (DebugFlags.BROWSER_FRAME) {
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Assert.assertNotNull(mCallbackProxy.getBackForwardList()
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .getCurrentItem());
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    WebAddress uri = new WebAddress(mCallbackProxy
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .getBackForwardList().getCurrentItem().getUrl());
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String schemePlusHost = uri.mScheme + uri.mHost;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String[] ret = getUsernamePassword();
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Has the user entered a username/password pair and is
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // there some POST data
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (ret != null && postData != null &&
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ret[0].length() > 0 && ret[1].length() > 0) {
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Check to see if the username & password appear in
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // the post data (there could be another form on the
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // page and that was posted instead.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        String postString = new String(postData);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (postString.contains(URLEncoder.encode(ret[0])) &&
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                postString.contains(URLEncoder.encode(ret[1]))) {
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            String[] saved = mDatabase.getUsernamePassword(
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    schemePlusHost);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (saved != null) {
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // null username implies that user has chosen not to
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // save password
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                if (saved[0] != null) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    // non-null username implies that user has
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    // chosen to save password, so update the
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    // recorded password
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    mDatabase.setUsernamePassword(
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            schemePlusHost, ret[0], ret[1]);
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                }
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            } else {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // CallbackProxy will handle creating the resume
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                // message
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                mCallbackProxy.onSavePassword(schemePlusHost, ret[0],
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        ret[1], null);
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (ParseException ex) {
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // if it is bad uri, don't save its password
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // is this resource the main-frame top-level page?
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean isMainFramePage = mIsMainFrame;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7092e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger        if (DebugFlags.BROWSER_FRAME) {
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.v(LOGTAG, "startLoadingResource: url=" + url + ", method="
711fe4fec7c66b0d956f008ead0fd899b588cfacb5dPatrick Scott                    + method + ", postData=" + postData + ", isMainFramePage="
7127c24ed6904707ea7179cb81382b7ca8d8ce85b7fPatrick Scott                    + isMainFramePage + ", mainResource=" + mainResource
7137c24ed6904707ea7179cb81382b7ca8d8ce85b7fPatrick Scott                    + ", userGesture=" + userGesture);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Create a LoadListener
7178c92c39b858ae73a1b08ed698887efa98ced987cGrace Kloba        LoadListener loadListener = LoadListener.getLoadListener(mContext,
7188c92c39b858ae73a1b08ed698887efa98ced987cGrace Kloba                this, url, loaderHandle, synchronous, isMainFramePage,
719ea08c513549c1ddd9ba32337cb30973d7b61ca32Steve Block                mainResource, userGesture, postDataIdentifier, username, password);
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onLoadResource(url);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (LoadListener.getNativeLoaderCount() > MAX_OUTSTANDING_REQUESTS) {
724fadbbd2a0cc94e5da4dea1ec3dac337e274c77c9Grace Kloba            // send an error message, so that loadListener can be deleted
725fadbbd2a0cc94e5da4dea1ec3dac337e274c77c9Grace Kloba            // after this is returned. This is important as LoadListener's
726fadbbd2a0cc94e5da4dea1ec3dac337e274c77c9Grace Kloba            // nativeError will remove the request from its DocLoader's request
727fadbbd2a0cc94e5da4dea1ec3dac337e274c77c9Grace Kloba            // list. But the set up is not done until this method is returned.
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            loadListener.error(
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    android.net.http.EventHandler.ERROR, mContext.getString(
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            com.android.internal.R.string.httpErrorTooManyRequests));
731fadbbd2a0cc94e5da4dea1ec3dac337e274c77c9Grace Kloba            return loadListener;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
734fe4fec7c66b0d956f008ead0fd899b588cfacb5dPatrick Scott        FrameLoader loader = new FrameLoader(loadListener, mSettings, method);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loader.setHeaders(headers);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        loader.setPostData(postData);
7374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // Set the load mode to the mode used for the current page.
7384df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        // If WebKit wants validation, go to network directly.
7394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        loader.setCacheMode(headers.containsKey("If-Modified-Since")
7404df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                || headers.containsKey("If-None-Match") ?
7414df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project                        WebSettings.LOAD_NO_CACHE : cacheMode);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Set referrer to current URL?
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!loader.executeLoad()) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            checker.responseAlert("startLoadingResource fail");
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        checker.responseAlert("startLoadingResource succeed");
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return !synchronous ? loadListener : null;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the progress for the browser activity.  Called by native code.
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Uses a delay so it does not happen too often.
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newProgress An int between zero and one hundred representing
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    the current progress percentage of loading the page.
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setProgress(int newProgress) {
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onProgressChanged(newProgress);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (newProgress == 100) {
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sendMessageDelayed(obtainMessage(FRAME_COMPLETED), 100);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // FIXME: Need to figure out a better way to switch out of the history
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // drawing mode. Maybe we can somehow compare the history picture with
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // the current picture, and switch when it contains more content.
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFirstLayoutDone && newProgress > TRANSITION_SWITCH_THRESHOLD) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallbackProxy.switchOutDrawHistory();
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Send the icon to the activity for display.
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param icon A Bitmap representing a page's favicon.
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void didReceiveIcon(Bitmap icon) {
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onReceivedIcon(icon);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7782ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott    // Called by JNI when an apple-touch-icon attribute was found.
779d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott    private void didReceiveTouchIconUrl(String url, boolean precomposed) {
780d58ccff769e40a6c52e9f6e30e4016590e05ba9aPatrick Scott        mCallbackProxy.onReceivedTouchIconUrl(url, precomposed);
7812ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott    }
7822ba1262b420ef5b9abebcd818c46774b8517f244Patrick Scott
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request a new window from the client.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The BrowserFrame object stored in the new WebView.
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private BrowserFrame createWindow(boolean dialog, boolean userGesture) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WebView w = mCallbackProxy.createWindow(dialog, userGesture);
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (w != null) {
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return w.getWebViewCore().getBrowserFrame();
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Try to focus this WebView.
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void requestFocus() {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onRequestFocus();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Close this frame and window.
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void closeWindow(WebViewCore w) {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onCloseWindow(w.getWebView());
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX: Must match PolicyAction in FrameLoaderTypes.h in webcore
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int POLICY_USE = 0;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int POLICY_IGNORE = 2;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void decidePolicyForFormResubmission(int policyFunction) {
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message dontResend = obtainMessage(POLICY_FUNCTION, policyFunction,
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                POLICY_IGNORE);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Message resend = obtainMessage(POLICY_FUNCTION, policyFunction,
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                POLICY_USE);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.onFormResubmission(dontResend, resend);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Tell the activity to update its global history.
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void updateVisitedHistory(String url, boolean isReload) {
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCallbackProxy.doUpdateVisitedHistory(url, isReload);
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the CallbackProxy for sending messages to the UI thread.
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* package */ CallbackProxy getCallbackProxy() {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCallbackProxy;
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the User Agent used by this frame
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String getUserAgentString() {
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSettings.getUserAgentString();
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
842aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins    // These ids need to be in sync with enum rawResId in PlatformBridge.h
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int NODOMAIN = 1;
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int LOADERROR = 2;
84583031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba    private static final int DRAWABLEDIR = 3;
846aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins    private static final int FILE_UPLOAD_LABEL = 4;
847aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins    private static final int RESET_LABEL = 5;
848aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins    private static final int SUBMIT_LABEL = 6;
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String getRawResFilename(int id) {
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resid;
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (id) {
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case NODOMAIN:
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.raw.nodomain;
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case LOADERROR:
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                resid = com.android.internal.R.raw.loaderror;
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86183031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            case DRAWABLEDIR:
86283031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba                // use one known resource to find the drawable directory
86383031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba                resid = com.android.internal.R.drawable.btn_check_off;
86483031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba                break;
86583031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba
866aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins            case FILE_UPLOAD_LABEL:
867aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                return mContext.getResources().getString(
868aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                        com.android.internal.R.string.upload_file);
869aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins
870aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins            case RESET_LABEL:
871aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                return mContext.getResources().getString(
872aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                        com.android.internal.R.string.reset);
873aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins
874aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins            case SUBMIT_LABEL:
875aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                return mContext.getResources().getString(
876aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins                        com.android.internal.R.string.submit);
877aacced6bc5a64c7daa4af2f29b94a1b00770f083Leon Scroggins
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            default:
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e(LOGTAG, "getRawResFilename got incompatible resource ID");
880686cf75d5cf447d34961f6217f2ea3ce3e484ac2Cary Clark                return "";
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedValue value = new TypedValue();
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.getResources().getValue(resid, value, true);
88483031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba        if (id == DRAWABLEDIR) {
88583031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            String path = value.string.toString();
88683031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            int index = path.lastIndexOf('/');
88783031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            if (index < 0) {
88883031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba                Log.e(LOGTAG, "Can't find drawable directory.");
88983031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba                return "";
89083031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            }
89183031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba            return path.substring(0, index + 1);
89283031581d62e9f89fdb90e2e8fc72d27f3b0c323Grace Kloba        }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return value.string.toString();
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
896408cf85207a43c9169f9fb520a584d2858847d24Grace Kloba    private float density() {
897408cf85207a43c9169f9fb520a584d2858847d24Grace Kloba        return mContext.getResources().getDisplayMetrics().density;
898408cf85207a43c9169f9fb520a584d2858847d24Grace Kloba    }
899408cf85207a43c9169f9fb520a584d2858847d24Grace Kloba
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //==========================================================================
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // native functions
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //==========================================================================
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new native frame for a given WebView
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param w     A WebView that the frame draws into.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param am    AssetManager to use to get assets.
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param list  The native side will add and remove items from this list as
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              the native list changes.
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void nativeCreateFrame(WebViewCore w, AssetManager am,
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WebBackForwardList list);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Destroy the native frame.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void nativeDestroyFrame();
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void nativeCallPolicyFunction(int policyFunction,
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int decision);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reload the current main frame.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void reload(boolean allowStale);
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Go back or forward the number of steps given.
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param steps A negative or positive number indicating the direction
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *              and number of steps to move.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void nativeGoBackOrForward(int steps);
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stringByEvaluatingJavaScriptFromString will execute the
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * JS passed in in the context of this browser frame.
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param script A javascript string to execute
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return string result of execution or null
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String stringByEvaluatingJavaScriptFromString(String script);
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add a javascript interface to the main frame.
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void nativeAddJavascriptInterface(int nativeFramePointer,
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Object obj, String interfaceName);
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enable or disable the native cache.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* FIXME: The native cache is always on for now until we have a better
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * solution for our 2 caches. */
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void setCacheDisabled(boolean disabled);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean cacheDisabled();
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void clearCache();
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns false if the url is bad.
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
963d0d9bc2f2fe737d186c0cc8c29a325e4f2907e8eGrace Kloba    private native void nativeLoadUrl(String url, Map<String, String> headers);
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9655753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba    private native void nativePostUrl(String url, byte[] postData);
9665753430f6408fc5ddc9ef3592f59b968bcf282ccGrace Kloba
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void nativeLoadData(String baseUrl, String data,
9681bb1a911c35c9df5fdbcaca13f97aa29dcec6cfbLeon Scroggins            String mimeType, String encoding, String historyUrl);
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Stop loading the current page.
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9734df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    public void stopLoading() {
9744df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        if (mIsMainFrame) {
9754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project            resetLoadingStates();
9764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        }
9774df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        nativeStopLoading();
9784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
9794df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
9804df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    private native void nativeStopLoading();
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return true if the document has images.
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean documentHasImages();
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return TRUE if there is a password field in the current frame
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native boolean hasPasswordField();
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get username and password in the current frame. If found, String[0] is
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * username and String[1] is password. Otherwise return NULL.
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return String[]
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native String[] getUsernamePassword();
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set username and password to the proper fields in the current frame
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param username
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param password
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native void setUsernamePassword(String username, String password);
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get form's "text" type data associated with the current frame.
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return HashMap If succeed, returns a list of name/value pair. Otherwise
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         returns null.
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native HashMap getFormTextData();
1012f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott
1013f06364b8c69b0e6b497242ef0d1161a2539c1b5aPatrick Scott    private native void nativeOrientationChanged(int orientation);
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1015