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 192032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsenimport android.net.ProxyProperties; 20cc749dee638785cee52a05c3c76445573591c6f1Ben Murdochimport android.net.Uri; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 258a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scottimport java.lang.ref.WeakReference; 26cc749dee638785cee52a05c3c76445573591c6f1Ben Murdochimport java.util.HashMap; 27a6d747d5c74558d73a95a69a52907c37815d3ba1Andrei Popescuimport java.util.Set; 28a6d747d5c74558d73a95a69a52907c37815d3ba1Andrei Popescu 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class JWebCoreJavaBridge extends Handler { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Identifier for the timer message. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int TIMER_MESSAGE = 1; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ID for servicing functionptr queue 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FUNCPTR_MESSAGE = 2; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Log system identifier. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String LOGTAG = "webkit-timers"; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Native object pointer for interacting in native code. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNativeBridge; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Instant timer is used to implement a timer that needs to fire almost 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // immediately. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mHasInstantTimer; 429ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian 439ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian private boolean mTimerPaused; 449ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian private boolean mHasDeferredTimers; 459ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian 463c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon // keep track of the main WebViewClassic attached to the current window so that we 479b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba // can get the proper Context. 483c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon private static WeakReference<WebViewClassic> sCurrentMainWebView = 493c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon new WeakReference<WebViewClassic>(null); 5041d8565e816a29192d966f271c06bee91272087cChia-chi Yeh 51658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba /* package */ 52658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba static final int REFRESH_PLUGINS = 100; 53658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba 5465b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch private HashMap<String, String> mContentUriToFilePathMap; 55cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Construct a new JWebCoreJavaBridge to interface with 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WebCore timers and cookies. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba public JWebCoreJavaBridge() { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeConstructor(); 62cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeFinalize(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 703c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon static synchronized void setActiveWebView(WebViewClassic webview) { 718a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scott if (sCurrentMainWebView.get() != null) { 729b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba // it is possible if there is a sub-WebView. Do nothing. 739b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba return; 749b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } 753c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon sCurrentMainWebView = new WeakReference<WebViewClassic>(webview); 769b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } 779b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba 783c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon static synchronized void removeActiveWebView(WebViewClassic webview) { 798a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scott if (sCurrentMainWebView.get() != webview) { 809b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba // it is possible if there is a sub-WebView. Do nothing. 819b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba return; 829b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } 838a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scott sCurrentMainWebView.clear(); 849b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } 859b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian * Call native timer callbacks. 889ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian */ 899ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian private void fireSharedTimer() { 909ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian // clear the flag so that sharedTimerFired() can set a new timer 919ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mHasInstantTimer = false; 929ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian sharedTimerFired(); 939ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian } 949ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian 959ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handleMessage 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param msg The dispatched message. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The only accepted message currently is TIMER_MESSAGE 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case TIMER_MESSAGE: { 1059ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian if (mTimerPaused) { 1069ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mHasDeferredTimers = true; 1079ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian } else { 1089ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian fireSharedTimer(); 1099ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian } 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FUNCPTR_MESSAGE: 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nativeServiceFuncPtrQueue(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 115658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba case REFRESH_PLUGINS: 116658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba nativeUpdatePluginDirectories(PluginManager.getInstance(null) 11737eb3c35152fadc2541ebe6af3e39b246ca87fb7Derek Sollenberger .getPluginDirectories(), ((Boolean) msg.obj) 118658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba .booleanValue()); 119658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba break; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // called from JNI side 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void signalServiceFuncPtrQueue() { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(FUNCPTR_MESSAGE); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessage(msg); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void nativeServiceFuncPtrQueue(); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pause all timers. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void pause() { 135358d2cd96403383cfb91bb68598a4cb2fe2e170eShimeng (Simon) Wang if (!mTimerPaused) { 1369ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mTimerPaused = true; 1379ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mHasDeferredTimers = false; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Resume all timers. 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void resume() { 145358d2cd96403383cfb91bb68598a4cb2fe2e170eShimeng (Simon) Wang if (mTimerPaused) { 1469ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mTimerPaused = false; 1479ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian if (mHasDeferredTimers) { 1489ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mHasDeferredTimers = false; 1499ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian fireSharedTimer(); 1509ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian } 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set WebCore cache size. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bytes The cache size in bytes. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setCacheSize(int bytes); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Store a cookie string associated with a url. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The url to be used as a key for the cookie. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value The cookie string to be stored. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16516be88a912e7d39b6dc1375b6346254b3f7629ffFeng Qian private void setCookies(String url, String value) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.contains("\r") || value.contains("\n")) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // for security reason, filter out '\r' and '\n' from the cookie 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = value.length(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder buffer = new StringBuilder(size); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i != -1 && i < size) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ir = value.indexOf('\r', i); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int in = value.indexOf('\n', i); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newi = (ir == -1) ? in : (in == -1 ? ir : (ir < in ? ir 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : in)); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newi > i) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append(value.subSequence(i, newi)); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (newi == -1) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer.append(value.subSequence(i, size)); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = newi + 1; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = buffer.toString(); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CookieManager.getInstance().setCookie(url, value); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the cookie string for the given url. 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param url The resource's url. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A String representing the cookies for the given resource url. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String cookies(String url) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CookieManager.getInstance().getCookie(url); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether cookies are enabled or not. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean cookiesEnabled() { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return CookieManager.getInstance().acceptCookie(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 206658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba * Returns an array of plugin directoies 207658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba */ 208658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba private String[] getPluginDirectories() { 20937eb3c35152fadc2541ebe6af3e39b246ca87fb7Derek Sollenberger return PluginManager.getInstance(null).getPluginDirectories(); 210658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba } 211658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba 212658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba /** 213fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba * Returns the path of the plugin data directory 214fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba */ 215fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba private String getPluginSharedDataDirectory() { 216fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba return PluginManager.getInstance(null).getPluginSharedDataDirectory(); 217fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba } 218fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba 219fd055b2d7cebd6693925a30adad6c66a697af407Grace Kloba /** 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setSharedTimer 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timemillis The relative time when the timer should fire 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setSharedTimer(long timemillis) { 2242e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.J_WEB_CORE_JAVA_BRIDGE) Log.v(LOGTAG, "setSharedTimer " + timemillis); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timemillis <= 0) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we don't accumulate the sharedTimer unless it is a delayed 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // request. This way we won't flood the message queue with 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // WebKit messages. This should improve the browser's 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // responsiveness to key events. 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mHasInstantTimer) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasInstantTimer = true; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(TIMER_MESSAGE); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessageDelayed(msg, timemillis); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = obtainMessage(TIMER_MESSAGE); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendMessageDelayed(msg, timemillis); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Stop the shared timer. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void stopSharedTimer() { 2482e5c150e746647a1ce5c10e1708debbf06c45ea7Derek Sollenberger if (DebugFlags.J_WEB_CORE_JAVA_BRIDGE) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(LOGTAG, "stopSharedTimer removing all timers"); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeMessages(TIMER_MESSAGE); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHasInstantTimer = false; 2539ae010a349e953a443f1cc8bc33ff1becf997a19Feng Qian mHasDeferredTimers = false; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2567180efed8990b843321500208e3fe5fbe977bd87Grace Kloba private String[] getKeyStrengthList() { 257c633253bef85252e44ffb86500b50943a024246cChia-chi Yeh return CertTool.getKeyStrengthList(); 2587180efed8990b843321500208e3fe5fbe977bd87Grace Kloba } 2597180efed8990b843321500208e3fe5fbe977bd87Grace Kloba 2609b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba synchronized private String getSignedPublicKey(int index, String challenge, 2619b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba String url) { 2623c90952036a5ff7ddb2946c643f1a0bf1c31d53aJonathan Dixon WebViewClassic current = sCurrentMainWebView.get(); 2638a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scott if (current != null) { 2649b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba // generateKeyPair expects organizations which we don't have. Ignore 2659b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba // url. 2669b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba return CertTool.getSignedPublicKey( 2678a5d335a5533eef89aa8e4b701b692673145eef1Patrick Scott current.getContext(), index, challenge); 2689b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } else { 2699b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba Log.e(LOGTAG, "There is no active WebView for getSignedPublicKey"); 2709b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba return ""; 2719b95ab17ecdaf1e3501f0deb7580cb2b5492331aGrace Kloba } 2727180efed8990b843321500208e3fe5fbe977bd87Grace Kloba } 2737180efed8990b843321500208e3fe5fbe977bd87Grace Kloba 274cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch // Called on the WebCore thread through JNI. 27565b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch private String resolveFilePathForContentUri(String uri) { 27665b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch if (mContentUriToFilePathMap != null) { 27765b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch String fileName = mContentUriToFilePathMap.get(uri); 278cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch if (fileName != null) { 279cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch return fileName; 280cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch } 281cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch } 282cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch 283cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch // Failsafe fallback to just use the last path segment. 284cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch // (See OpenableColumns documentation in the SDK) 285cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch Uri jUri = Uri.parse(uri); 286cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch return jUri.getLastPathSegment(); 287cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch } 288cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch 28965b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch public void storeFilePathForContentUri(String path, String contentUri) { 29065b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch if (mContentUriToFilePathMap == null) { 29165b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch mContentUriToFilePathMap = new HashMap<String, String>(); 292cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch } 29365b4cdabb0b626635606c4b2dfec145c547d3396Ben Murdoch mContentUriToFilePathMap.put(contentUri, path); 294cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch } 295cc749dee638785cee52a05c3c76445573591c6f1Ben Murdoch 2962032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen public void updateProxy(ProxyProperties proxyProperties) { 2972032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen if (proxyProperties == null) { 2982032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen nativeUpdateProxy("", ""); 2992032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen return; 3002032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen } 3012032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen 3022032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen String host = proxyProperties.getHost(); 3032032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen int port = proxyProperties.getPort(); 3042032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen if (port != 0) 3052032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen host += ":" + port; 3062032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen 3072032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen nativeUpdateProxy(host, proxyProperties.getExclusionList()); 3082032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen } 3092032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void nativeConstructor(); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void nativeFinalize(); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void sharedTimerFired(); 313658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba private native void nativeUpdatePluginDirectories(String[] directories, 314658ab7d787f64987d7c45aae08e5a12a073afe78Grace Kloba boolean reload); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native void setNetworkOnLine(boolean online); 316f5dba888c671c1a4f32a07a4e8f028f7dadd2ce9Andrei Popescu public native void setNetworkType(String type, String subtype); 317a6d747d5c74558d73a95a69a52907c37815d3ba1Andrei Popescu public native void addPackageNames(Set<String> packageNames); 318a6d747d5c74558d73a95a69a52907c37815d3ba1Andrei Popescu public native void addPackageName(String packageName); 319a6d747d5c74558d73a95a69a52907c37815d3ba1Andrei Popescu public native void removePackageName(String packageName); 3202032eee0c178a15fd41cebbdec71c7622d2aab23Kristian Monsen public native void nativeUpdateProxy(String newProxy, String exclusionList); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 322