WebViewChromium.java revision 19bc90be698e6d86ec6c77ea8b43bb6778bcc89d
146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/* 246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Copyright (C) 2012 The Android Open Source Project 346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * you may not use this file except in compliance with the License. 646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * You may obtain a copy of the License at 746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 1046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 1146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 1246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * See the License for the specific language governing permissions and 1446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * limitations under the License. 1546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 1646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)package com.android.webview.chromium; 1846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.content.res.Configuration; 2046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Bitmap; 2146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Canvas; 2246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Paint; 2346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Picture; 2446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.Rect; 2546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.graphics.drawable.Drawable; 2646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.net.http.SslCertificate; 2746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Build; 2846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Bundle; 2954a6e3d0cc566df6cec6807c0c03f05664de0a55Selim Gurunimport android.os.CancellationSignal; 3046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.os.Message; 31a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport android.os.ParcelFileDescriptor; 32a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport android.print.PrintAttributes; 3319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixonimport android.text.TextUtils; 34efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdochimport android.util.Base64; 35e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixonimport android.util.Log; 36a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixonimport android.view.HardwareCanvas; 3746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.KeyEvent; 3846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.MotionEvent; 3946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.View; 4046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.ViewGroup; 4146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent; 4246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo; 435c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdochimport android.view.accessibility.AccessibilityNodeProvider; 4446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.EditorInfo; 4546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.view.inputmethod.InputConnection; 4646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.DownloadListener; 476d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdochimport android.webkit.FindActionModeCallback; 487db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixonimport android.webkit.JavascriptInterface; 4946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.ValueCallback; 5046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebBackForwardList; 5146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebChromeClient; 5246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebSettings; 5346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebView; 5446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewClient; 5546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import android.webkit.WebViewProvider; 5633e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdochimport android.widget.TextView; 5746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 58aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsenimport org.chromium.android_webview.AwBrowserContext; 5946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.android_webview.AwContents; 60a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurunimport org.chromium.android_webview.AwPdfExportAttributes; 61a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsenimport org.chromium.base.ThreadUtils; 6246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.content.browser.LoadUrlParams; 6346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import org.chromium.net.NetworkChangeNotifier; 6446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 6546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.BufferedWriter; 6646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.io.File; 67ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixonimport java.lang.annotation.Annotation; 68b8281877c710018a3bc8066be17b1e11822be015Selim Gurunimport java.util.HashMap; 6946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)import java.util.Map; 7046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 7146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)/** 7246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * This class is the delegate to which WebViewProxy forwards all API calls. 7346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) * 741cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * Most of the actual functionality is implemented by AwContents (or ContentViewCore within 751cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * it). This class also contains WebView-specific APIs that require the creation of other 761cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * adapters (otherwise org.chromium.content would depend on the webview.chromium package) 771cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon * and a small set of no-op deprecated APIs. 7846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) */ 7946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)class WebViewChromium implements WebViewProvider, 8046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate { 81e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon 82e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon private static final String TAG = WebViewChromium.class.getSimpleName(); 83e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon 8446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The WebView that this WebViewChromium is the provider for. 8546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebView mWebView; 8646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Lets us access protected View-derived methods on the WebView instance we're backing. 8746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) WebView.PrivateAccess mWebViewPrivate; 8846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // The client adapter class. 8946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebViewContentsClientAdapter mContentsClientAdapter; 9046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 9146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Variables for functionality provided by this adapter --------------------------------------- 9246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebSettings adapter, lazily initialized in the getter 9346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private WebSettings mWebSettings; 943949435b480cb71106f65b237025da359cf8a8caBen Murdoch // The WebView wrapper for ContentViewCore and required browser compontents. 9546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private AwContents mAwContents; 96a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon // Non-null if this webview is using the GL accelerated draw path. 97a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon private DrawGLFunctor mGLfunctor; 9846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 99aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen private AwBrowserContext mBrowserContext; 100aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen 101c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu private final WebView.HitTestResult mHitTestResult; 102c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu 1036ef347a29d692df672aaf59ee4926a476288476aBen Murdoch private final int mAppTargetSdkVersion; 1046ef347a29d692df672aaf59ee4926a476288476aBen Murdoch 105aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate, 106aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen AwBrowserContext browserContext) { 107ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen checkThread(); 10846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebView = webView; 10946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewPrivate = webViewPrivate; 110c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu mHitTestResult = new WebView.HitTestResult(); 111aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen mBrowserContext = browserContext; 1126ef347a29d692df672aaf59ee4926a476288476aBen Murdoch mAppTargetSdkVersion = mWebView.getContext().getApplicationInfo().targetSdkVersion; 11346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 11446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1151ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch static void completeWindowCreation(WebView parent, WebView child) { 1161ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents; 117bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon AwContents childContents = 118bbfef40e5fc625f4821f012fae7f16468b7308cfJonathan Dixon child == null ? null : ((WebViewChromium) child.getWebViewProvider()).mAwContents; 1191ee9dd0420198429115c3fe8cf0b0502fab9cf62Ben Murdoch parentContents.supplyContentsForPopup(childContents); 12046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 12146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 12246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewProvider methods -------------------------------------------------------------------- 12346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 12446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 12546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) { 1264dcabaef9151384b571327b62234409b31caef38Jonathan Dixon // BUG=6790250 |javaScriptInterfaces| was only ever used by the obsolete DumpRenderTree 1274dcabaef9151384b571327b62234409b31caef38Jonathan Dixon // so is ignored. TODO: remove it from WebViewProvider. 12846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) final boolean isAccessFromFileURLsGrantedByDefault = 1296ef347a29d692df672aaf59ee4926a476288476aBen Murdoch mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN; 13046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView); 131aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen mAwContents = new AwContents(mBrowserContext, mWebView, new InternalAccessAdapter(), 132aa8b39f3e3f208586f3750d7278f1239a09ebd32Kristian Monsen mContentsClientAdapter, isAccessFromFileURLsGrantedByDefault); 1334dcabaef9151384b571327b62234409b31caef38Jonathan Dixon 1344dcabaef9151384b571327b62234409b31caef38Jonathan Dixon if (privateBrowsing) { 1354dcabaef9151384b571327b62234409b31caef38Jonathan Dixon final String msg = "Private browsing is not supported in WebView."; 1369cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase if (mAppTargetSdkVersion >= Build.VERSION_CODES.KITKAT) { 1374dcabaef9151384b571327b62234409b31caef38Jonathan Dixon throw new IllegalArgumentException(msg); 1384dcabaef9151384b571327b62234409b31caef38Jonathan Dixon } else { 1394dcabaef9151384b571327b62234409b31caef38Jonathan Dixon Log.w(TAG, msg); 1404dcabaef9151384b571327b62234409b31caef38Jonathan Dixon // Intentionally irreversibly disable the webview instance, so that private 1414dcabaef9151384b571327b62234409b31caef38Jonathan Dixon // user data cannot leak through misuse of a non-privateBrowing WebView instance. 1424dcabaef9151384b571327b62234409b31caef38Jonathan Dixon // Can't just null out mAwContents as we never null-check it before use. 1434dcabaef9151384b571327b62234409b31caef38Jonathan Dixon mAwContents.destroy(); 14433e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch TextView warningLabel = new TextView(mWebView.getContext()); 14533e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch warningLabel.setText(mWebView.getContext().getString( 14633e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch com.android.internal.R.string.webviewchromium_private_browsing_warning)); 14733e1eeae98299666b8c2d1e879f92d1c83fe33fbBen Murdoch mWebView.addView(warningLabel); 1484dcabaef9151384b571327b62234409b31caef38Jonathan Dixon } 1494dcabaef9151384b571327b62234409b31caef38Jonathan Dixon } 1504dcabaef9151384b571327b62234409b31caef38Jonathan Dixon 15146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 15246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 15357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen private RuntimeException createThreadException() { 15457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen return new IllegalStateException("Calling View methods on another thread than the UI " + 15557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen "thread. PLEASE FILE A BUG! go/klp-webview-bug"); 15657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen } 15757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen 15862389e2d66a99e936652092333782947e363241dKristian Monsen // Intentionally not static, as no need to check thread on static methods 15962389e2d66a99e936652092333782947e363241dKristian Monsen private void checkThread() { 16062389e2d66a99e936652092333782947e363241dKristian Monsen if (!ThreadUtils.runningOnUiThread()) { 16157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen final RuntimeException threadViolation = createThreadException(); 16257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen ThreadUtils.postOnUiThread(new Runnable() { 16357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen @Override 16457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen public void run() { 16557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen throw threadViolation; 16657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen } 16757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen }); 168ab73853ea633a4ada353f5a2321c6bf0e6c108e5Kristian Monsen throw createThreadException(); 16962389e2d66a99e936652092333782947e363241dKristian Monsen } 17062389e2d66a99e936652092333782947e363241dKristian Monsen } 17162389e2d66a99e936652092333782947e363241dKristian Monsen 17246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setHorizontalScrollbarOverlay(boolean overlay) { 17462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 175bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba mAwContents.setHorizontalScrollbarOverlay(overlay); 17646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 17746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 17846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 17946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setVerticalScrollbarOverlay(boolean overlay) { 18062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 181bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba mAwContents.setVerticalScrollbarOverlay(overlay); 18246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 18346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 18446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 18546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean overlayHorizontalScrollbar() { 18662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 187bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba return mAwContents.overlayHorizontalScrollbar(); 18846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 18946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 19046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 19146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean overlayVerticalScrollbar() { 19262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 193bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba return mAwContents.overlayVerticalScrollbar(); 19446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 19546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 19646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 19746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int getVisibleTitleHeight() { 19846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // This is deprecated in WebView and should always return 0. 19946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return 0; 20046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 20346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public SslCertificate getCertificate() { 20462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 20546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mAwContents.getCertificate(); 20646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 20746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 20846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 20946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setCertificate(SslCertificate certificate) { 21062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 21146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 21246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 21446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 21546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void savePassword(String host, String username, String password) { 216adc6c4d74c77a617100bdfeb174ab0c314b24ea8Selim Gurun // This is a deprecated API: intentional no-op. 21746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 21846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 21946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 22046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setHttpAuthUsernamePassword(String host, String realm, String username, 22146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) String password) { 22262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 22346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.setHttpAuthUsernamePassword(host, realm, username, password); 22446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 22546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 22646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 22746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String[] getHttpAuthUsernamePassword(String host, String realm) { 22862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 22946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mAwContents.getHttpAuthUsernamePassword(host, realm); 23046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 23146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 23246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 23346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void destroy() { 23462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 2353949435b480cb71106f65b237025da359cf8a8caBen Murdoch mAwContents.destroy(); 236a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon if (mGLfunctor != null) { 237a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mGLfunctor.destroy(); 238a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mGLfunctor = null; 239a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 24046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 24146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 24246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 24346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setNetworkAvailable(boolean networkUp) { 24462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 2450363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch // Note that this purely toggles the JS navigator.online property. 2460363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch // It does not in affect chromium or network stack state in any way. 2470363422b19ca6263dbfbcd0d9daa6d1abe5c6892Ben Murdoch mAwContents.setNetworkAvailable(networkUp); 24846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 24946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebBackForwardList saveState(Bundle outState) { 25262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 253a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu if (outState == null) return null; 254a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu if (!mAwContents.saveState(outState)) return null; 255a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu return copyBackForwardList(); 25646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 25746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 25846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 25946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean savePicture(Bundle b, File dest) { 2609405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon // Intentional no-op: hidden method on WebView. 26146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 26246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 26446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 26546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean restorePicture(Bundle b, File src) { 2669405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon // Intentional no-op: hidden method on WebView. 26746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 26846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 26946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 27046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebBackForwardList restoreState(Bundle inState) { 27262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 273a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu if (inState == null) return null; 274a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu if (!mAwContents.restoreState(inState)) return null; 275a08e8aada16dc4dbfb8745532169fb4a8347541dBo Liu return copyBackForwardList(); 27646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 27746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 27846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 27946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void loadUrl(String url, Map<String, String> additionalHttpHeaders) { 28046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: We may actually want to do some sanity checks here (like filter about://chrome). 2816ef347a29d692df672aaf59ee4926a476288476aBen Murdoch 2826ef347a29d692df672aaf59ee4926a476288476aBen Murdoch // For backwards compatibility, apps targeting less than K will have JS URLs evaluated 2836ef347a29d692df672aaf59ee4926a476288476aBen Murdoch // directly and any result of the evaluation will not replace the current page content. 2846ef347a29d692df672aaf59ee4926a476288476aBen Murdoch // Matching Chrome behavior more closely; apps targetting >= K that load a JS URL will 2856ef347a29d692df672aaf59ee4926a476288476aBen Murdoch // have the result of that URL replace the content of the current page. 2866ef347a29d692df672aaf59ee4926a476288476aBen Murdoch final String JAVASCRIPT_SCHEME = "javascript:"; 2879cd49cbc245e07e8e8c360fd22821a2918f99eaeChet Haase if (mAppTargetSdkVersion < Build.VERSION_CODES.KITKAT && 2886ef347a29d692df672aaf59ee4926a476288476aBen Murdoch url.startsWith(JAVASCRIPT_SCHEME)) { 2893d52163e1c466860651414670c59762f5bdd269fTao Bai mAwContents.evaluateJavaScriptEvenIfNotYetNavigated( 2903d52163e1c466860651414670c59762f5bdd269fTao Bai url.substring(JAVASCRIPT_SCHEME.length())); 2916ef347a29d692df672aaf59ee4926a476288476aBen Murdoch return; 2926ef347a29d692df672aaf59ee4926a476288476aBen Murdoch } 2936ef347a29d692df672aaf59ee4926a476288476aBen Murdoch 29446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) LoadUrlParams params = new LoadUrlParams(url); 29546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders); 296a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen loadUrlOnUiThread(params); 29746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 29846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 29946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 30046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void loadUrl(String url) { 30146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) loadUrl(url, null); 30246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 30346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 30446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 30546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void postUrl(String url, byte[] postData) { 306b8281877c710018a3bc8066be17b1e11822be015Selim Gurun LoadUrlParams params = LoadUrlParams.createLoadHttpPostParams(url, postData); 307b8281877c710018a3bc8066be17b1e11822be015Selim Gurun Map<String,String> headers = new HashMap<String,String>(); 308b8281877c710018a3bc8066be17b1e11822be015Selim Gurun headers.put("Content-Type", "application/x-www-form-urlencoded"); 309b8281877c710018a3bc8066be17b1e11822be015Selim Gurun params.setExtraHeaders(headers); 310b8281877c710018a3bc8066be17b1e11822be015Selim Gurun loadUrlOnUiThread(params); 31146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 31246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 31319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon private static String fixupMimeType(String mimeType) { 31419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon return TextUtils.isEmpty(mimeType) ? "text/html" : mimeType; 31519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon } 31619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon 31719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon private static String fixupData(String data) { 31819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon return TextUtils.isEmpty(data) ? "" : data; 31919bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon } 32019bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon 32119bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon private static String fixupBase(String url) { 32219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon return TextUtils.isEmpty(url) ? "about:blank" : url; 32319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon } 32419bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon 32519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon private static String fixupHistory(String url) { 32619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon return TextUtils.isEmpty(url) ? "about:blank" : url; 32719bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon } 32819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon 32946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) private static boolean isBase64Encoded(String encoding) { 33046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return "base64".equals(encoding); 33146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 33346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 33446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void loadData(String data, String mimeType, String encoding) { 335a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen loadUrlOnUiThread(LoadUrlParams.createLoadDataParams( 33619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding))); 33746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 33846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 33946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 34046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, 341efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch String historyUrl) { 34219bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon data = fixupData(data); 34319bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon mimeType = fixupMimeType(mimeType); 344efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch LoadUrlParams loadUrlParams; 34519bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon baseUrl = fixupBase(baseUrl); 34619bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon historyUrl = fixupHistory(historyUrl); 347efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch 34819bc90be698e6d86ec6c77ea8b43bb6778bcc89dJonathan Dixon if (baseUrl.startsWith("data:")) { 349efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // For backwards compatibility with WebViewClassic, we use the value of |encoding| 350efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // as the charset, as long as it's not "base64". 351efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch boolean isBase64 = isBase64Encoded(encoding); 352efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl( 353efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding); 354efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch } else { 355efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // When loading data with a non-data: base URL, the classic WebView would effectively 356efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // "dump" that string of data into the WebView without going through regular URL 357efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // loading steps such as decoding URL-encoded entities. We achieve this same behavior by 358efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch // base64 encoding the data that is passed here and then loading that as a data: URL. 359efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch try { 360efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch loadUrlParams = LoadUrlParams.createLoadDataParamsWithBaseUrl( 361efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch Base64.encodeToString(data.getBytes("utf-8"), Base64.DEFAULT), mimeType, 362efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch true, baseUrl, historyUrl, "utf-8"); 363efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch } catch (java.io.UnsupportedEncodingException e) { 364efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch Log.wtf(TAG, "Unable to load data string " + data, e); 365efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch return; 366efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch } 367efea4d8fe88696d8ced7711192e8471eabd7c3d8Ben Murdoch } 368a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen loadUrlOnUiThread(loadUrlParams); 369a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen } 370a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen 371a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen private void loadUrlOnUiThread(final LoadUrlParams loadUrlParams) { 372a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen if (ThreadUtils.runningOnUiThread()) { 373a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen mAwContents.loadUrl(loadUrlParams); 374a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen } else { 375a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen // Disallowed in WebView API for apps targetting a new SDK 376a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2; 377a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen ThreadUtils.postOnUiThread(new Runnable() { 378a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen @Override 379a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen public void run() { 380a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen mAwContents.loadUrl(loadUrlParams); 381a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen } 382a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen }); 383a125e0eeade22bc4b7a998e8f0e732c0f965663fKristian Monsen } 38446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 38546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 3866ef347a29d692df672aaf59ee4926a476288476aBen Murdoch public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) { 38762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 3886ef347a29d692df672aaf59ee4926a476288476aBen Murdoch mAwContents.evaluateJavaScript(script, resultCallback); 3896ef347a29d692df672aaf59ee4926a476288476aBen Murdoch } 3906ef347a29d692df672aaf59ee4926a476288476aBen Murdoch 39146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 39246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void saveWebArchive(String filename) { 39362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 39446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) saveWebArchive(filename, false, null); 39546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 39646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 39746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 39846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) { 39962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 40046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.saveWebArchive(basename, autoname, callback); 40146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 40446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void stopLoading() { 40562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4067cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.stopLoading(); 40746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 40846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 40946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void reload() { 41162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4127cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.reload(); 41346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 41446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 41546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 41646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean canGoBack() { 41762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4187cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.canGoBack(); 41946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 42246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void goBack() { 42362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4247cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.goBack(); 42546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 42646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 42746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 42846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean canGoForward() { 42962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4307cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.canGoForward(); 43146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 43446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void goForward() { 43562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4367cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.goForward(); 43746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 43846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 43946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean canGoBackOrForward(int steps) { 44162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4427cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.canGoBackOrForward(steps); 44346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 44446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 44546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 44646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void goBackOrForward(int steps) { 44762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4487cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.goBackOrForward(steps); 44946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean isPrivateBrowsingEnabled() { 4536d58f78e7fc0412a58b163559cb8e9c4af5c6fe1Jonathan Dixon // Not supported in this WebView implementation. 45446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 45546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 45646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 45746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 45846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean pageUp(boolean top) { 45962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4607cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.pageUp(top); 46146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 46446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean pageDown(boolean bottom) { 46562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4667cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.pageDown(bottom); 46746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 46846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 46946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 47046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearView() { 47162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 47246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 47346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 47446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 47546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 47646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public Picture capturePicture() { 47762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 4789c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil return mAwContents.capturePicture(); 47946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 48046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 48146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 482a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun public void exportToPdf(ParcelFileDescriptor fd, PrintAttributes attributes, 483a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun ValueCallback<Boolean> resultCallback, CancellationSignal cancellationSignal) 484a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun throws java.io.IOException { 48562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 486a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun // We convert frameworks attributes to an android_webview specific print attributes 487a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun // so we do not tie upstreaming android_webview changes to installation of correct 488a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun // SDK to try bots. 489a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun if (attributes == null) { 490a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun throw new IllegalArgumentException("attributes cannot be null"); 491a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 492a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun if (attributes.getMediaSize() == null) { 493a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun throw new IllegalArgumentException("attributes must specify a media size"); 494a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 495a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun if (attributes.getResolution() == null) { 496a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun throw new IllegalArgumentException("attributes must specify print resolution"); 497a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 498a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun if (attributes.getMargins() == null) { 499a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun throw new IllegalArgumentException("attributes must specify margins"); 500a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 501a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun AwPdfExportAttributes pdfAttributes = new AwPdfExportAttributes(); 502a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.pageWidth = attributes.getMediaSize().getWidthMils(); 503a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.pageHeight = attributes.getMediaSize().getHeightMils(); 504a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.dpi = getPrintDpi(attributes); 505a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.leftMargin = attributes.getMargins().getLeftMils(); 506a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.rightMargin = attributes.getMargins().getRightMils(); 507a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.topMargin = attributes.getMargins().getTopMils(); 508a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun pdfAttributes.bottomMargin = attributes.getMargins().getBottomMils(); 509a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun 510a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun mAwContents.getPdfExporter().exportToPdf(fd, pdfAttributes, resultCallback, 51154a6e3d0cc566df6cec6807c0c03f05664de0a55Selim Gurun cancellationSignal); 51249a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun } 51349a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun 514a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun private static int getPrintDpi(PrintAttributes attributes) { 515a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun // TODO(sgurun) android print attributes support horizontal and 516a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun // vertical DPI. Chrome has only one DPI. Revisit this. 517a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun int horizontalDpi = attributes.getResolution().getHorizontalDpi(); 518a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun int verticalDpi = attributes.getResolution().getVerticalDpi(); 519a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun if (horizontalDpi != verticalDpi) { 520a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun Log.w(TAG, "Horizontal and vertical DPIs differ. Using horizontal DPI " + 521a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun " hDpi=" + horizontalDpi + " vDPI=" + verticalDpi); 522a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 523a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun return horizontalDpi; 524a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun } 525a8d0ef2693c3bcd4a091cc7fa49b69b54e3472c4Selim Gurun 52649a1a6f9f27b63687edc1d98f842627d4719a327Selim Gurun @Override 52746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public float getScale() { 52862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5293520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov return mAwContents.getScale(); 53046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setInitialScale(int scaleInPercent) { 53462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5353520eb778d668dc76ca4541c69abd568b9d02691Mikhail Naganov mAwContents.getSettings().setInitialPageScale(scaleInPercent); 53646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 53746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 53846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 53946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void invokeZoomPicker() { 54062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5417cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.invokeZoomPicker(); 54246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 54346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 54446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 54546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebView.HitTestResult getHitTestResult() { 54662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 547c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu AwContents.HitTestData data = mAwContents.getLastHitTestResult(); 548c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu mHitTestResult.setType(data.hitTestResultType); 549c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu mHitTestResult.setExtra(data.hitTestResultExtraData); 550c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu return mHitTestResult; 55146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 55346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 55446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void requestFocusNodeHref(Message hrefMsg) { 55562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 556c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu mAwContents.requestFocusNodeHref(hrefMsg); 55746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 55846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 55946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 56046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void requestImageRef(Message msg) { 56162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 562c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu mAwContents.requestImageRef(msg); 56346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 56446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 56546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 56646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getUrl() { 56762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5687cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba String url = mAwContents.getUrl(); 56946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (url == null || url.trim().isEmpty()) return null; 57046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return url; 57146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 57246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 57346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 57446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getOriginalUrl() { 57562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 57646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) String url = mAwContents.getOriginalUrl(); 57746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (url == null || url.trim().isEmpty()) return null; 57846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return url; 57946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 58046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 58146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 58246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getTitle() { 58362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5847cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.getTitle(); 58546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 58646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 58746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 58846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public Bitmap getFavicon() { 58962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 5909405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon return mAwContents.getFavicon(); 59146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 59346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 59446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public String getTouchIconUrl() { 5959405536501747e2d7b4fc46a33e5f0a1e7fd47acJonathan Dixon // Intentional no-op: hidden method on WebView. 59646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return null; 59746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 59846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 59946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 60046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int getProgress() { 601c0c86c037ea697da375ae28c543cae9b050d6b68Jonathan Dixon // No checkThread() because the value is cached java side (workaround for b/10533304). 60246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mAwContents.getMostRecentProgress(); 60346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 60446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 60546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 60646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int getContentHeight() { 60794a8e6a6d7d1b2a6b3718eb91956403ef6b03d9cKristian Monsen // No checkThread() as it is mostly thread safe (workaround for b/10594869). 6086b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba return mAwContents.getContentHeightCss(); 60946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 61046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 61146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 61246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int getContentWidth() { 61362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6146b5f3d1546ae2a9c712cde60c54ec027582bc4e6Martin Kosiba return mAwContents.getContentWidthCss(); 61546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 61646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 61746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 61846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void pauseTimers() { 61962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 620531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch mAwContents.pauseTimers(); 62146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 62246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 62346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 62446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void resumeTimers() { 62562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 626531e68a2b50a5e542eeede13907f29e463a99ebfBen Murdoch mAwContents.resumeTimers(); 62746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 62846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 62946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 63046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onPause() { 63162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6321cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onPause(); 63346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 63446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 63546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 63646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onResume() { 63762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6381cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onResume(); 63946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 64146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 64246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean isPaused() { 64362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6441cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon return mAwContents.isPaused(); 64546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 64646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 64746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 64846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void freeMemory() { 64962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 650d43c55dd91cf7dd1bcd18d01e16acd5e55de0471Ben Murdoch // Intentional no-op. Memory is managed automatically by Chromium. 65146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 65246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 65346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 65446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearCache(boolean includeDiskFiles) { 65562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 65646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.clearCache(includeDiskFiles); 65746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 65846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 659bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun /** 660bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun * This is a poorly named method, but we keep it for historical reasons. 661bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun */ 66246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 66346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearFormData() { 66462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 665bbef8de5696d48fc6458c926026fc524a62814e1Selim Gurun mAwContents.hideAutofillPopup(); 66646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 66746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 66846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 66946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearHistory() { 67062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6717cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.clearHistory(); 67246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 67346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 67446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 67546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearSslPreferences() { 67662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 6777cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.clearSslPreferences(); 67846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 67946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 68046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 68146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebBackForwardList copyBackForwardList() { 68262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 68308a5e00cdfb74f4ffd843d2d0a9b0b40b86b107aBo Liu return new WebBackForwardListChromium( 6847cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.getNavigationHistory()); 68546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 68646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 68746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 68846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setFindListener(WebView.FindListener listener) { 68962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 69046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContentsClientAdapter.setFindListener(listener); 69146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 69246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 69346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 69446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void findNext(boolean forwards) { 69562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 69646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.findNext(forwards); 69746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 69846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 69946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 70046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int findAll(String searchString) { 70162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 702f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon mAwContents.findAllAsync(searchString); 703f37548d6d8e2a73c65d675a26706a38f52960800Jonathan Dixon return 0; 70446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 70546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 70646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 70746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void findAllAsync(String searchString) { 70862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 70946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.findAllAsync(searchString); 71046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 71146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 71246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 71346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean showFindDialog(String text, boolean showIme) { 71462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 7156d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch if (mWebView.getParent() == null) { 7166d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch return false; 7176d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch } 7186d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch 7196d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext()); 7206d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch if (findAction == null) { 7216d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch return false; 7226d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch } 7236d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch 7246d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch mWebView.startActionMode(findAction); 7256d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch findAction.setWebView(mWebView); 7266d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch if (showIme) { 7276d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch findAction.showSoftInput(); 7286d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch } 7296d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch 7306d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch if (text != null) { 7316d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch findAction.setText(text); 7326d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch findAction.findAll(); 7336d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch } 7346d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch 7356d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch return true; 73646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 73746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 7386d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch @Override 739fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch public void notifyFindDialogDismissed() { 74062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 7416d4097cfa188a95c95fd5d0c86238c91f817c3edBen Murdoch clearMatches(); 742fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch } 743fde8dae44f74be3de69ce6dd07b0023279b485a0Ben Murdoch 74446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 74546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void clearMatches() { 74662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 74746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.clearMatches(); 74846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 74946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 75046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 75146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void documentHasImages(Message response) { 75262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 75346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mAwContents.documentHasImages(response); 75446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 75546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 75646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 75746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setWebViewClient(WebViewClient client) { 75862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 75946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContentsClientAdapter.setWebViewClient(client); 76046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 76146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 76246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 76346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setDownloadListener(DownloadListener listener) { 76462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 7654320e428efc3bf69387f3b9d5a0589b2b8746409Bo Liu mContentsClientAdapter.setDownloadListener(listener); 76646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 76746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 76846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 76946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setWebChromeClient(WebChromeClient client) { 77062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 77146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContentsClientAdapter.setWebChromeClient(client); 77246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 77346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 77446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 77546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setPictureListener(WebView.PictureListener listener) { 77662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 77746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mContentsClientAdapter.setPictureListener(listener); 7789c5a40623b62737244deb2d04a98830d7ffa8404Leandro Gracia Gil mAwContents.enableOnNewPicture(listener != null, 7796ef347a29d692df672aaf59ee4926a476288476aBen Murdoch mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR2); 78046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 78146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 78246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 78346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void addJavascriptInterface(Object obj, String interfaceName) { 78462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 785ea844f60b1b559788566fe6e004b1eeca53a8039Jonathan Dixon Class<? extends Annotation> requiredAnnotation = null; 7866ef347a29d692df672aaf59ee4926a476288476aBen Murdoch if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 7877db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon requiredAnnotation = JavascriptInterface.class; 7887db34d3dcaac936566f912e1b0b21f3f103029ffJonathan Dixon } 7897cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation); 79046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 79146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 79246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 79346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void removeJavascriptInterface(String interfaceName) { 79462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 7957cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.removeJavascriptInterface(interfaceName); 79646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 79746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 79846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 79946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebSettings getSettings() { 80062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 80146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) if (mWebSettings == null) { 802420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov mWebSettings = new ContentSettingsAdapter(mAwContents.getSettings()); 80346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 80446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebSettings; 80546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 80646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 80746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 80846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setMapTrackballToArrowKeys(boolean setMap) { 80962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 81046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // This is a deprecated API: intentional no-op. 81146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 81246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 81346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 81446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void flingScroll(int vx, int vy) { 81562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8167cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.flingScroll(vx, vy); 81746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 81846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 81946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 82046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public View getZoomControls() { 82162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 822e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed 823e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon // to stop very out-dated applications from crashing. 824e78d6e40e4e78671e6621ba8cf49835568704899Jonathan Dixon Log.w(TAG, "WebView doesn't support getZoomControls"); 825420c0da3a4e06e1ac5574091e7c9c286ef012369Mikhail Naganov return mAwContents.getSettings().supportZoom() ? new View(mWebView.getContext()) : null; 82646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 82746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 82846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 82946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean canZoomIn() { 83062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8317cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.canZoomIn(); 83246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 83346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 83446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 83546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean canZoomOut() { 83662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8377cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.canZoomOut(); 83846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 83946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 84046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 84146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean zoomIn() { 84262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8437cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.zoomIn(); 84446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 84546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 84646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 84746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean zoomOut() { 84862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8497cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.zoomOut(); 85046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 85146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 852d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon @Override 85346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) { 85446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 85546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 85646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 857d2dcef4d9edfb7af7abff85b0867c3d6a363feb7Jonathan Dixon @Override 85846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public View findHierarchyView(String className, int hashCode) { 85946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 86046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return null; 86146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 86246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 86346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewProvider glue methods --------------------------------------------------------------- 86446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 86546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 86657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen // This needs to be kept thread safe! 86746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewProvider.ViewDelegate getViewDelegate() { 86846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return this; 86946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 87046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 87146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 87246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public WebViewProvider.ScrollDelegate getScrollDelegate() { 87362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 87446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return this; 87546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 87646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 87746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 87846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewProvider.ViewDelegate implementation ------------------------------------------------ 87946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 880a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch // TODO: remove from WebViewProvider and use default implementation from 881a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch // ViewGroup. 882a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch // @Override 88346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean shouldDelayChildPressedState() { 88462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 885a7fba41c5661cb61b41c8a4ff2d69e5153666f7fBen Murdoch return true; 88646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 88746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 8885c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch// @Override 8895c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch public AccessibilityNodeProvider getAccessibilityNodeProvider() { 89062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8915c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch return mAwContents.getAccessibilityNodeProvider(); 8925c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch } 8935c990caf9c0237064dab94059f6c46fc2d51cd97Ben Murdoch 89446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 89546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 89662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 8977cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.onInitializeAccessibilityNodeInfo(info); 89846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 89946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 90046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 90146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 90262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9037cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba mAwContents.onInitializeAccessibilityEvent(event); 90446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 90546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 90646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 90746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean performAccessibilityAction(int action, Bundle arguments) { 90862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 909b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch if (mAwContents.supportsAccessibilityAction(action)) { 910b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch return mAwContents.performAccessibilityAction(action, arguments); 911b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch } 912b7b706b2ed5cbb77dd690f5405b626a429989714Ben Murdoch return mWebViewPrivate.super_performAccessibilityAction(action, arguments); 91346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 91446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 91546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 91646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setOverScrollMode(int mode) { 91762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9182841152693d0410f8e8c309aae514329f008a612Martin Kosiba // This gets called from the android.view.View c'tor that WebView inherits from. This 9192841152693d0410f8e8c309aae514329f008a612Martin Kosiba // causes the method to be called when mAwContents == null. 9202841152693d0410f8e8c309aae514329f008a612Martin Kosiba // It's safe to ignore these calls however since AwContents will read the current value of 9212841152693d0410f8e8c309aae514329f008a612Martin Kosiba // this setting when it's created. 922ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba if (mAwContents != null) { 923ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba mAwContents.setOverScrollMode(mode); 924ab5398debe64d34306b0f709a93d840078ae181dMartin Kosiba } 92546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 92646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 92746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 92846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setScrollBarStyle(int style) { 92962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 930bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba mAwContents.setScrollBarStyle(style); 93146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 93246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 93346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 93446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, 93546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) int l, int t, int r, int b) { 93662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 937bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba // WebViewClassic was overriding this method to handle rubberband over-scroll. Since 938bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba // WebViewChromium doesn't support that the vanilla implementation of this method can be 939bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba // used. 940bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba mWebViewPrivate.super_onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b); 94146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 94246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 94346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 94446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 94562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9463951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY); 94746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 94846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 94946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 95046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onWindowVisibilityChanged(int visibility) { 95162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9521cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onWindowVisibilityChanged(visibility); 95346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 95446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 95546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 95646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onDraw(Canvas canvas) { 95762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9587ab33360e331e04f515d532064670e210d174a7aTao Bai mAwContents.onDraw(canvas); 95946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 96046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 96146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 96246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setLayoutParams(ViewGroup.LayoutParams layoutParams) { 96362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 96446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: This is the minimum implementation for HTMLViewer 96546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // bringup. Likely will need to go up to ContentViewCore for 96646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // a complete implementation. 96746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewPrivate.super_setLayoutParams(layoutParams); 96846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 96946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 97046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 97146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean performLongClick() { 97262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 973decc147cebc8f73d355c024d92c60d3f727cab31Bo Liu return mWebViewPrivate.super_performLongClick(); 97446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 97546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 97646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 97746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onConfigurationChanged(Configuration newConfig) { 97862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9791cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onConfigurationChanged(newConfig); 98046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 98146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 98246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 98346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 98462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 9857cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.onCreateInputConnection(outAttrs); 98646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 98746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 98846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 98946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { 99062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 99146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 99246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 99346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 99446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 99546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 99646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onKeyDown(int keyCode, KeyEvent event) { 99762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 99846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 99946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 100046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 100146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 100246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 100346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onKeyUp(int keyCode, KeyEvent event) { 100462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10057cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.onKeyUp(keyCode, event); 100646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 100746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 100846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 100946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onAttachedToWindow() { 101062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10111cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onAttachedToWindow(); 101246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 101346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 101446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 101546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onDetachedFromWindow() { 101662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10171cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onDetachedFromWindow(); 1018a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon if (mGLfunctor != null) { 1019a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon mGLfunctor.detach(); 1020a2b0d0b4d6d1ff22fbb1329e358e1cc0a112aab3Jonathan Dixon } 102146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 102246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 102346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 102446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onVisibilityChanged(View changedView, int visibility) { 102562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 1026c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba // The AwContents will find out the container view visibility before the first draw so we 1027c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba // can safely ignore onVisibilityChanged callbacks that happen before init(). 1028c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba if (mAwContents != null) { 1029c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba mAwContents.onVisibilityChanged(changedView, visibility); 1030c346a83062dfbf50ac2275813ccb2e36f9e778e9Martin Kosiba } 103146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 103246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 103346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 103446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onWindowFocusChanged(boolean hasWindowFocus) { 103562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10361cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onWindowFocusChanged(hasWindowFocus); 103746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 103846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 103946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 104046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 104162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10421cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect); 104346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 104446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 104546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 104646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean setFrame(int left, int top, int right, int bottom) { 10471cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon // TODO(joth): This is the minimum implementation for initial 10481cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon // bringup. Likely will need to go up to AwContents for a complete 10491cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon // implementation, e.g. setting the compositor visible region (to 10501cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon // avoid painting tiles that are offscreen due to the view's position). 105162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 105246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewPrivate.super_setFrame(left, top, right, bottom); 105346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 105446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 105546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 105646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onSizeChanged(int w, int h, int ow, int oh) { 105762389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10581cc4c3210fd2ea027bd6d883a15c3951476642bbJonathan Dixon mAwContents.onSizeChanged(w, h, ow, oh); 105946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 106046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 106146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 106246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onScrollChanged(int l, int t, int oldl, int oldt) { 106362389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 106446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 106546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 106646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 106746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean dispatchKeyEvent(KeyEvent event) { 106862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 10697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.dispatchKeyEvent(event); 107046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 107146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 107246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 107346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onTouchEvent(MotionEvent ev) { 107462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 1075c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu return mAwContents.onTouchEvent(ev); 107646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 107746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 107846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 107946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onHoverEvent(MotionEvent event) { 108062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 1081c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu return mAwContents.onHoverEvent(event); 108246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 108346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 108446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 108546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onGenericMotionEvent(MotionEvent event) { 108662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 1087c3fbc0fea57ba0dd4cf9eb8cc4d12f1b0edbcc5cBo Liu return mAwContents.onGenericMotionEvent(event); 108846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 108946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 109046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 109146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean onTrackballEvent(MotionEvent ev) { 109262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 109346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // Trackball event not handled, which eventually gets converted to DPAD keyevents 109446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 109546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 109646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 109746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 109846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean requestFocus(int direction, Rect previouslyFocusedRect) { 109962389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11004cee3bf50c125a52a49323aa999f4b619fa18c10Ben Murdoch mAwContents.requestFocus(); 110146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect); 110246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 110346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 110446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 110546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 110662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 1107d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec); 110846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 110946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 111046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 111146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) { 111262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 111346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 111446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 111546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 111646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 111746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 111857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen public void setBackgroundColor(final int color) { 111957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen if (ThreadUtils.runningOnUiThread()) { 112057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen mAwContents.setBackgroundColor(color); 112157b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen } else { 112257b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen // Disallowed in WebView API for apps targetting a new SDK 112357b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen assert mAppTargetSdkVersion < Build.VERSION_CODES.JELLY_BEAN_MR2; 112457b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen ThreadUtils.postOnUiThread(new Runnable() { 112557b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen @Override 112657b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen public void run() { 112757b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen mAwContents.setBackgroundColor(color); 112857b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen } 112957b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen }); 113057b714b4b5f44c9a385836c7074e4f879ad7a767Kristian Monsen } 113146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 113246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 113346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 113446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void setLayerType(int layerType, Paint paint) { 113562389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 113646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 113746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 113846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 11390b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil @Override 114046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void preDispatchDraw(Canvas canvas) { 114162389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11420b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil // TODO(leandrogracia): remove this method from WebViewProvider if we think 11430b528e4924a7c14687181185bc66173ad18f00eaLeandro Gracia Gil // we won't need it again. 114446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 114546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 114646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // WebViewProvider.ScrollDelegate implementation ---------------------------------------------- 114746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 114846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 114946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int computeHorizontalScrollRange() { 115062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11517cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.computeHorizontalScrollRange(); 115246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 115346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 115446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 115546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int computeHorizontalScrollOffset() { 115662389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11577cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.computeHorizontalScrollOffset(); 115846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 115946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 116046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 116146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int computeVerticalScrollRange() { 116262389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11637cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.computeVerticalScrollRange(); 116446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 116546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 116646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 116746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int computeVerticalScrollOffset() { 116862389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11697cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.computeVerticalScrollOffset(); 117046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 117146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 117246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 117346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public int computeVerticalScrollExtent() { 117462389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11757cb3dd1c0aca371b628b80afa69c58638de30fa1Martin Kosiba return mAwContents.computeVerticalScrollExtent(); 117646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 117746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 117846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 117946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void computeScroll() { 118062389e2d66a99e936652092333782947e363241dKristian Monsen checkThread(); 11812a120ba09921dbb1e8354ecbc4a6e063ec891101Martin Kosiba mAwContents.computeScroll(); 118246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 118346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 11844702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba // AwContents.InternalAccessDelegate implementation -------------------------------------- 11854702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba private class InternalAccessAdapter implements AwContents.InternalAccessDelegate { 118646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 118746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean drawChild(Canvas arg0, View arg1, long arg2) { 118846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 118946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 119046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 119146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 119246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 119346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean super_onKeyUp(int arg0, KeyEvent arg1) { 119446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 119546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 119646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 119746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 119846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 119946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) { 120046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 120146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 120246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 120346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 120446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 120546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean super_dispatchKeyEvent(KeyEvent event) { 120646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return mWebViewPrivate.super_dispatchKeyEvent(event); 120746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 120846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 120946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 121046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean super_onGenericMotionEvent(MotionEvent arg0) { 121146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 121246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 121346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 121446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 121546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 121646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public void super_onConfigurationChanged(Configuration arg0) { 121746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 121846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 121946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 1220bd819ca872a1711e4607ef11cd8b0b2156241897Martin Kosiba @Override 12210088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba public int super_getScrollBarStyle() { 12220088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba return mWebViewPrivate.super_getScrollBarStyle(); 12230088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba } 12240088640069ac3ed389f4d78582966248b0869ce9Martin Kosiba 122546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 122646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean awakenScrollBars() { 122746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) mWebViewPrivate.awakenScrollBars(0); 122846f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: modify the WebView.PrivateAccess to provide a return value. 122946f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return true; 123046f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 123146f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) 123246f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) @Override 123346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) public boolean super_awakenScrollBars(int arg0, boolean arg1) { 123446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) // TODO: need method on WebView.PrivateAccess? 123546f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) UnimplementedWebViewApi.invoke(); 123646f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) return false; 123746f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 12384702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba 1239d7bf6ab0cd8cc4005b112e4358eb797bb178a85fMarcin Kosiba @Override 12402a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba public void onScrollChanged(int l, int t, int oldl, int oldt) { 12412a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba mWebViewPrivate.setScrollXRaw(l); 12422a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba mWebViewPrivate.setScrollYRaw(t); 12432a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba mWebViewPrivate.onScrollChanged(l, t, oldl, oldt); 12442a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba } 12452a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba 12463951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba @Override 12472a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba public void overScrollBy(int deltaX, int deltaY, 12482a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba int scrollX, int scrollY, 12492a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba int scrollRangeX, int scrollRangeY, 12502a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba int maxOverScrollX, int maxOverScrollY, 12512a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba boolean isTouchEvent) { 12522a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba mWebViewPrivate.overScrollBy(deltaX, deltaY, scrollX, scrollY, 12532a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); 12542a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba } 12552a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba 12563951fbadf5157dd3fe73decc879f9b763e780b09Martin Kosiba @Override 12572a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba public void super_scrollTo(int scrollX, int scrollY) { 12582a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba mWebViewPrivate.super_scrollTo(scrollX, scrollY); 12592a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba } 12602a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba 12612a5e561c09bd9fc7b369d99c9166fa588e20ed38Martin Kosiba @Override 12624702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba public void setMeasuredDimension(int measuredWidth, int measuredHeight) { 12634702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight); 12644702a6de6031477029de5e6f5777c8b3e7846d35Marcin Kosiba } 126551f7cf16cd02f14050bb723175a2a57570e8486dTao Bai 12667ab33360e331e04f515d532064670e210d174a7aTao Bai @Override 126751f7cf16cd02f14050bb723175a2a57570e8486dTao Bai public boolean requestDrawGL(Canvas canvas) { 12687ab33360e331e04f515d532064670e210d174a7aTao Bai if (mGLfunctor == null) { 12697ab33360e331e04f515d532064670e210d174a7aTao Bai mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext()); 12707ab33360e331e04f515d532064670e210d174a7aTao Bai } 127151f7cf16cd02f14050bb723175a2a57570e8486dTao Bai return mGLfunctor.requestDrawGL((HardwareCanvas)canvas, mWebView.getViewRootImpl()); 127251f7cf16cd02f14050bb723175a2a57570e8486dTao Bai } 127346f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles) } 127446f104289826e85ba76a1a2139d7ecc7daca07b1Torne (Richard Coles)} 1275