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