1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)package org.chromium.content.browser; 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import android.annotation.SuppressLint; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.app.Activity; 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.app.SearchManager; 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.content.ContentResolver; 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.Context; 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.content.Intent; 13929504d64b38e05de7355e162311d6791ad6f54dBo Liuimport android.content.pm.FeatureInfo; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.pm.PackageManager; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.content.res.Configuration; 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.database.ContentObserver; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Bitmap; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Canvas; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Color; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.graphics.Rect; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.net.Uri; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Build; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Bundle; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.Handler; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.os.ResultReceiver; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import android.os.SystemClock; 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.provider.Browser; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.provider.Settings; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import android.text.Editable; 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)import android.text.Selection; 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.text.TextUtils; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.util.Log; 335b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganovimport android.util.Pair; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.ActionMode; 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)import android.view.HapticFeedbackConstants; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.InputDevice; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.KeyEvent; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.MotionEvent; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.View; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.ViewGroup; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.accessibility.AccessibilityEvent; 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.view.accessibility.AccessibilityManager; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.accessibility.AccessibilityNodeInfo; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport android.view.accessibility.AccessibilityNodeProvider; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.inputmethod.EditorInfo; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.inputmethod.InputConnection; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import android.view.inputmethod.InputMethodManager; 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import android.widget.FrameLayout; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import com.google.common.annotations.VisibleForTesting; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import org.chromium.base.ApiCompatibilityUtils; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.CalledByNative; 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.base.CommandLine; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.base.JNINamespace; 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.ObserverList; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.ObserverList.RewindableIterator; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.base.TraceEvent; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.chromium.content.R; 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.content.browser.ScreenOrientationListener.ScreenOrientationObserver; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import org.chromium.content.browser.accessibility.AccessibilityInjector; 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport org.chromium.content.browser.accessibility.BrowserAccessibilityManager; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.AdapterInputConnection; 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import org.chromium.content.browser.input.GamepadList; 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.HandleView; 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.ImeAdapter; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.ImeAdapter.AdapterInputConnectionFactory; 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import org.chromium.content.browser.input.InputMethodManagerWrapper; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.InsertionHandleController; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.chromium.content.browser.input.SelectPopup; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.SelectPopupDialog; 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.chromium.content.browser.input.SelectPopupDropdown; 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.content.browser.input.SelectPopupItem; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.content.browser.input.SelectionHandleController; 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import org.chromium.content.common.ContentSwitches; 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.content_public.browser.GestureStateListener; 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)import org.chromium.content_public.browser.WebContents; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.ui.base.ViewAndroid; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.ui.base.ViewAndroidDelegate; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)import org.chromium.ui.base.WindowAndroid; 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import org.chromium.ui.gfx.DeviceDisplayInfo; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.lang.annotation.Annotation; 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport java.lang.reflect.Field; 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.ArrayList; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.HashMap; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.HashSet; 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)import java.util.List; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.Map; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Provides a Java-side 'wrapper' around a WebContent (native) instance. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Contains all the major functionality necessary to manage the lifecycle of a ContentView without 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * being tied to the view system. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@JNINamespace("content") 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)public class ContentViewCore 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) implements NavigationClient, AccessibilityStateChangeListener, ScreenOrientationObserver { 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch private static final String TAG = "ContentViewCore"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to avoid enabling zooming in / out if resulting zooming will 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // produce little visible difference. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final float ZOOM_CONTROLS_EPSILON = 0.007f; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Used to represent gestures for long press and long tap. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static final int IS_LONG_PRESS = 1; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static final int IS_LONG_TAP = 2; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Length of the delay (in ms) before fading in handles after the last page movement. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static final int TEXT_HANDLE_FADE_IN_DELAY = 300; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114929504d64b38e05de7355e162311d6791ad6f54dBo Liu // These values are obtained from Samsung. 115929504d64b38e05de7355e162311d6791ad6f54dBo Liu // TODO(changwan): refactor SPen related code into a separate class. See 116929504d64b38e05de7355e162311d6791ad6f54dBo Liu // http://crbug.com/398169. 117929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static final int SPEN_ACTION_DOWN = 211; 118929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static final int SPEN_ACTION_UP = 212; 119929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static final int SPEN_ACTION_MOVE = 213; 120929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static final int SPEN_ACTION_CANCEL = 214; 121929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static Boolean sIsSPenSupported; 122929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the embedder adds a JavaScript interface object that contains an indirect reference to 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the ContentViewCore, then storing a strong ref to the interface object on the native 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // side would prevent garbage collection of the ContentViewCore (as that strong ref would 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // create a new GC root). 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For that reason, we store only a weak reference to the interface object on the 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // native side. However we still need a strong reference on the Java side to 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // prevent garbage collection if the embedder doesn't maintain their own ref to the 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // interface object - the Java side ref won't create a new GC root. 1315b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov // This map stores those references. We put into the map on addJavaScriptInterface() 1325b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov // and remove from it in removeJavaScriptInterface(). The annotation class is stored for 1335b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov // the purpose of migrating injected objects from one instance of CVC to another, which 1345b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov // is used by Android WebView to support WebChromeClient.onCreateWindow scenario. 1355b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov private final Map<String, Pair<Object, Class>> mJavaScriptInterfaces = 1365b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov new HashMap<String, Pair<Object, Class>>(); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Additionally, we keep track of all Java bound JS objects that are in use on the 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // current page to ensure that they are not garbage collected until the page is 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // navigated. This includes interface objects that have been removed 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // via the removeJavaScriptInterface API and transient objects returned from methods 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the interface object. Note we use HashSet rather than Set as the native side 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // expects HashSet (no bindings for interfaces). 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final HashSet<Object> mRetainedJavaScriptObjects = new HashSet<Object>(); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Interface that consumers of {@link ContentViewCore} must implement to allow the proper 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * dispatching of view methods through the containing view. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <p> 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All methods with the "super_" prefix should be routed to the parent of the 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * implementing container view. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 155b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public interface InternalAccessDelegate { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#drawChild(Canvas, View, long) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean drawChild(Canvas canvas, View child, long drawingTime); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onKeyUp(keyCode, KeyEvent) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean super_onKeyUp(int keyCode, KeyEvent event); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#dispatchKeyEventPreIme(KeyEvent) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean super_dispatchKeyEventPreIme(KeyEvent event); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#dispatchKeyEvent(KeyEvent) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean super_dispatchKeyEvent(KeyEvent event); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onGenericMotionEvent(MotionEvent) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean super_onGenericMotionEvent(MotionEvent event); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onConfigurationChanged(Configuration) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void super_onConfigurationChanged(Configuration newConfig); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @see View#onScrollChanged(int, int, int, int) 1881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 1891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void onScrollChanged(int lPix, int tPix, int oldlPix, int oldtPix); 1901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) /** 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#awakenScrollBars() 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean awakenScrollBars(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#awakenScrollBars(int, boolean) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean super_awakenScrollBars(int startDelay, boolean invalidate); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * An interface for controlling visibility and state of embedder-provided zoom controls. 204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 205b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public interface ZoomControlsDelegate { 206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /** 207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Called when it's reasonable to show zoom controls. 208b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void invokeZoomPicker(); 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /** 212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Called when zoom controls need to be hidden (e.g. when the view hides). 213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void dismissZoomPicker(); 215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 216b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /** 217b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Called when page scale has been changed, so the controls can update their state. 218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) */ 219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) void updateZoomControls(); 220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * An interface that allows the embedder to be notified when the results of 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * extractSmartClipData are available. 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public interface SmartClipDataListener { 227929504d64b38e05de7355e162311d6791ad6f54dBo Liu public void onSmartClipDataExtracted(String text, String html, Rect clipRect); 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private final Context mContext; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ViewGroup mContainerView; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private InternalAccessDelegate mContainerViewInternals; 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private WebContents mWebContents; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private WebContentsObserverAndroid mWebContentsObserver; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ContentViewClient mContentViewClient; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ContentSettings mContentSettings; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Native pointer to C++ ContentViewCoreImpl object which will be set by nativeInit(). 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private long mNativeContentViewCore = 0; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private final ObserverList<GestureStateListener> mGestureStateListeners; 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private final RewindableIterator<GestureStateListener> mGestureStateListenersIterator; 245b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) private ZoomControlsDelegate mZoomControlsDelegate; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private PopupZoomer mPopupZoomer; 248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private SelectPopup mSelectPopup; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private Runnable mFakeMouseMoveRunnable = null; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only valid when focused on a text / password field. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ImeAdapter mImeAdapter; 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private ImeAdapter.AdapterInputConnectionFactory mAdapterInputConnectionFactory; 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private AdapterInputConnection mInputConnection; 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private InputMethodManagerWrapper mInputMethodManagerWrapper; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private SelectionHandleController mSelectionHandleController; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private InsertionHandleController mInsertionHandleController; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private Runnable mDeferredHandleFadeInRunnable; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private PositionObserver mPositionObserver; 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private PositionObserver.Listener mPositionListener; 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Size of the viewport in physical pixels as set from onSizeChanged. 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private int mViewportWidthPix; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private int mViewportHeightPix; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private int mPhysicalBackingWidthPix; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private int mPhysicalBackingHeightPix; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private int mOverdrawBottomHeightPix; 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private int mViewportSizeOffsetWidthPix; 273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private int mViewportSizeOffsetHeightPix; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cached copy of all positions and scales as reported by the renderer. 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final RenderCoordinates mRenderCoordinates; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final RenderCoordinates.NormalizedPoint mStartHandlePoint; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final RenderCoordinates.NormalizedPoint mEndHandlePoint; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final RenderCoordinates.NormalizedPoint mInsertionHandlePoint; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tracks whether a selection is currently active. When applied to selected text, indicates 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // whether the last selected text is still highlighted. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean mHasSelection; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private String mLastSelectedText; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private boolean mSelectionEditable; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ActionMode mActionMode; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private boolean mUnselectAllOnActionModeDismiss; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate that will handle GET downloads, and be notified of completion of POST downloads. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ContentViewDownloadDelegate mDownloadDelegate; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The AccessibilityInjector that handles loading Accessibility scripts into the web page. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private AccessibilityInjector mAccessibilityInjector; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Whether native accessibility, i.e. without any script injection, is allowed. 297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private boolean mNativeAccessibilityAllowed; 298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Whether native accessibility, i.e. without any script injection, has been enabled. 300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private boolean mNativeAccessibilityEnabled; 301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Handles native accessibility, i.e. without any script injection. 303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private BrowserAccessibilityManager mBrowserAccessibilityManager; 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // System accessibility service. 306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private final AccessibilityManager mAccessibilityManager; 307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 308a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Accessibility touch exploration state. 309a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private boolean mTouchExplorationEnabled; 310a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 311612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni // Whether accessibility focus should be set to the page when it finishes loading. 312612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni // This only applies if an accessibility service like TalkBack is running. 313612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni // This is desirable behavior for a browser window, but not for an embedded 314612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni // WebView. 315612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni private boolean mShouldSetAccessibilityFocusOnPageLoad; 316612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni 317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Allows us to dynamically respond when the accessibility script injection flag changes. 318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private ContentObserver mAccessibilityScriptInjectionObserver; 319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary notification to tell onSizeChanged to focus a form element, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because the OSK was just brought up. 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private final Rect mFocusPreOSKViewportRect = new Rect(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // On tap this will store the x, y coordinates of the touch. 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private int mLastTapX; 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private int mLastTapY; 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Whether a touch scroll sequence is active, used to hide text selection 329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // handles. Note that a scroll sequence will *always* bound a pinch 330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // sequence, so this will also be true for the duration of a pinch gesture. 331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private boolean mTouchScrollInProgress; 332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The outstanding fling start events that hasn't got fling end yet. It may be > 1 because 33423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // onNativeFlingStopped() is called asynchronously. 33523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private int mPotentiallyActiveFlingCount; 33623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private ViewAndroid mViewAndroid; 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private SmartClipDataListener mSmartClipDataListener = null; 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 34123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // This holds the state of editable text (e.g. contents of <input>, contenteditable) of 34223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // a focused element. 34323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Every time the user, IME, javascript (Blink), autofill etc. modifies the content, the new 34423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // state must be reflected to this to keep consistency. 345a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private final Editable mEditable; 34623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 34723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /** 34823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * PID used to indicate an invalid render process. 34923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) */ 35023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Keep in sync with the value returned from ContentViewCoreImpl::GetCurrentRendererProcessId() 35123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // if there is no render process. 35223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public static final int INVALID_RENDER_PROCESS_PID = 0; 35323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 3545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Offsets for the events that passes through this ContentViewCore. 3555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private float mCurrentTouchOffsetX; 3565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private float mCurrentTouchOffsetY; 3575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 358929504d64b38e05de7355e162311d6791ad6f54dBo Liu // Offsets for smart clip 359929504d64b38e05de7355e162311d6791ad6f54dBo Liu private int mSmartClipOffsetX; 360929504d64b38e05de7355e162311d6791ad6f54dBo Liu private int mSmartClipOffsetY; 361929504d64b38e05de7355e162311d6791ad6f54dBo Liu 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Constructs a new ContentViewCore. Embedders must call initialize() after constructing 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a ContentViewCore and before using it. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param context The context used to create this. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 368b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public ContentViewCore(Context context) { 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContext = context; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mAdapterInputConnectionFactory = new AdapterInputConnectionFactory(); 372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mInputMethodManagerWrapper = new InputMethodManagerWrapper(mContext); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRenderCoordinates = new RenderCoordinates(); 375a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float deviceScaleFactor = getContext().getResources().getDisplayMetrics().density; 376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) String forceScaleFactor = CommandLine.getInstance().getSwitchValue( 377a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ContentSwitches.FORCE_DEVICE_SCALE_FACTOR); 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (forceScaleFactor != null) { 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) deviceScaleFactor = Float.valueOf(forceScaleFactor); 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mRenderCoordinates.setDeviceScaleFactor(deviceScaleFactor); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mStartHandlePoint = mRenderCoordinates.createNormalizedPoint(); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mEndHandlePoint = mRenderCoordinates.createNormalizedPoint(); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandlePoint = mRenderCoordinates.createNormalizedPoint(); 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mAccessibilityManager = (AccessibilityManager) 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListeners = new ObserverList<GestureStateListener>(); 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator = mGestureStateListeners.rewindableIterator(); 38923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 39023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) mEditable = Editable.Factory.getInstance().newEditable(""); 39123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Selection.setSelection(mEditable, 0); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The context used for creating this ContentViewCore. 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) @CalledByNative 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public Context getContext() { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContext; 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The ViewGroup that all view actions of this ContentViewCore should interact with. 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ViewGroup getContainerView() { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerView; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * @return The WebContents currently being rendered. 411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public WebContents getWebContents() { 413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return mWebContents; 414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) /** 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Specifies how much smaller the WebKit layout size should be relative to the size of this 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * view. 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param offsetXPix The X amount in pixels to shrink the viewport by. 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param offsetYPix The Y amount in pixels to shrink the viewport by. 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void setViewportSizeOffset(int offsetXPix, int offsetYPix) { 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (offsetXPix != mViewportSizeOffsetWidthPix || 424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offsetYPix != mViewportSizeOffsetHeightPix) { 425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mViewportSizeOffsetWidthPix = offsetXPix; 426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mViewportSizeOffsetHeightPix = offsetYPix; 427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mNativeContentViewCore != 0) nativeWasResized(mNativeContentViewCore); 428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 430c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a delegate that can be used to add and remove views from the ContainerView. 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * NOTE: Use with care, as not all ContentViewCore users setup their ContainerView in the same 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * way. In particular, the Android WebView has limitations on what implementation details can 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be provided via a child view, as they are visible in the API and could introduce 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * compatibility breaks with existing applications. If in doubt, contact the 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * android_webview/OWNERS 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return A ViewAndroidDelegate that can be used to add and remove views. 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @VisibleForTesting 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public ViewAndroidDelegate getViewAndroidDelegate() { 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new ViewAndroidDelegate() { 445bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // mContainerView can change, but this ViewAndroidDelegate can only be used to 446bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // add and remove views from the mContainerViewAtCreation. 447bee9932bab44713b74b422b4b759b49f5a222977Bo Liu private final ViewGroup mContainerViewAtCreation = mContainerView; 448bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public View acquireAnchorView() { 451bee9932bab44713b74b422b4b759b49f5a222977Bo Liu View anchorView = new View(mContext); 452bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.addView(anchorView); 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return anchorView; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @Override 45723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) @SuppressWarnings("deprecation") // AbsoluteLayout 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void setAnchorViewPosition( 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) View view, float x, float y, float width, float height) { 4608728ef97d6ed89d149a438728f85cfeca6e78b2eigsolla if (view.getParent() == null) { 4618728ef97d6ed89d149a438728f85cfeca6e78b2eigsolla // Ignore. setAnchorViewPosition has been called after the anchor view has 4628728ef97d6ed89d149a438728f85cfeca6e78b2eigsolla // already been released. 4638728ef97d6ed89d149a438728f85cfeca6e78b2eigsolla return; 4648728ef97d6ed89d149a438728f85cfeca6e78b2eigsolla } 465bee9932bab44713b74b422b4b759b49f5a222977Bo Liu assert view.getParent() == mContainerViewAtCreation; 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 467bee9932bab44713b74b422b4b759b49f5a222977Bo Liu float scale = (float) DeviceDisplayInfo.create(mContext).getDIPScale(); 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The anchor view should not go outside the bounds of the ContainerView. 470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int leftMargin = Math.round(x * scale); 471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int topMargin = Math.round(mRenderCoordinates.getContentOffsetYPix() + y * scale); 47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int scaledWidth = Math.round(width * scale); 473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // ContentViewCore currently only supports these two container view types. 474bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (mContainerViewAtCreation instanceof FrameLayout) { 47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int startMargin; 476bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (ApiCompatibilityUtils.isLayoutRtl(mContainerViewAtCreation)) { 477bee9932bab44713b74b422b4b759b49f5a222977Bo Liu startMargin = mContainerViewAtCreation.getMeasuredWidth() 47846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) - Math.round((width + x) * scale); 47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else { 48046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) startMargin = leftMargin; 48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 482bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (scaledWidth + startMargin > mContainerViewAtCreation.getWidth()) { 483bee9932bab44713b74b422b4b759b49f5a222977Bo Liu scaledWidth = mContainerViewAtCreation.getWidth() - startMargin; 484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams( 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scaledWidth, Math.round(height * scale)); 48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ApiCompatibilityUtils.setMarginStart(lp, startMargin); 488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) lp.topMargin = topMargin; 489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) view.setLayoutParams(lp); 490bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } else if (mContainerViewAtCreation instanceof android.widget.AbsoluteLayout) { 491ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // This fixes the offset due to a difference in 492ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // scrolling model of WebView vs. Chrome. 493bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // TODO(sgurun) fix this to use mContainerViewAtCreation.getScroll[X/Y]() 494ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // as it naturally accounts for scroll differences between 495ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // these models. 496ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch leftMargin += mRenderCoordinates.getScrollXPixInt(); 497ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch topMargin += mRenderCoordinates.getScrollYPixInt(); 49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) android.widget.AbsoluteLayout.LayoutParams lp = 50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new android.widget.AbsoluteLayout.LayoutParams( 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scaledWidth, (int) (height * scale), leftMargin, topMargin); 502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) view.setLayoutParams(lp); 503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 504bee9932bab44713b74b422b4b759b49f5a222977Bo Liu Log.e(TAG, "Unknown layout " + mContainerViewAtCreation.getClass().getName()); 505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void releaseAnchorView(View anchorView) { 510bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.removeView(anchorView); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @VisibleForTesting 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void setImeAdapterForTest(ImeAdapter imeAdapter) { 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mImeAdapter = imeAdapter; 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @VisibleForTesting 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public ImeAdapter getImeAdapterForTest() { 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mImeAdapter; 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @VisibleForTesting 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void setAdapterInputConnectionFactory(AdapterInputConnectionFactory factory) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mAdapterInputConnectionFactory = factory; 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @VisibleForTesting 531a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void setInputMethodManagerWrapperForTest(InputMethodManagerWrapper immw) { 532a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mInputMethodManagerWrapper = immw; 533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 535a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @VisibleForTesting 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public AdapterInputConnection getInputConnectionForTest() { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mInputConnection; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private ImeAdapter createImeAdapter(Context context) { 541a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return new ImeAdapter(mInputMethodManagerWrapper, 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new ImeAdapter.ImeAdapterDelegate() { 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onImeEvent(boolean isFinish) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentViewClient().onImeEvent(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!isFinish) { 547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) hideHandles(); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onDismissInput() { 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getContentViewClient().onImeStateChangeRequested(false); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public View getAttachedView() { 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerView; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ResultReceiver getNewShowKeyboardReceiver() { 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ResultReceiver(new Handler()) { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onReceiveResult(int resultCode, Bundle resultData) { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getContentViewClient().onImeStateChangeRequested( 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resultCode == InputMethodManager.RESULT_SHOWN || 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (resultCode == InputMethodManager.RESULT_SHOWN) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If OSK is newly shown, delay the form focus until 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the onSizeChanged (in order to adjust relative to the 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // new size). 57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // TODO(jdduke): We should not assume that onSizeChanged will 57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // always be called, crbug.com/294908. 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getContainerView().getWindowVisibleDisplayFrame( 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mFocusPreOSKViewportRect); 57746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } else if (hasFocus() && resultCode == 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InputMethodManager.RESULT_UNCHANGED_SHOWN) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the OSK was already there, focus the form immediately. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scrollFocusedEditableNodeIntoView(); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param containerView The view that will act as a container for all views created by this. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param internalDispatcher Handles dispatching all hidden or super methods to the 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * containerView. 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param nativeWebContents A pointer to the native web contents. 595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param windowAndroid An instance of the WindowAndroid. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Perform important post-construction set up of the ContentViewCore. 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do not require the containing view in the constructor to allow embedders to create a 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ContentViewCore without having fully created its containing view. The containing view 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is a vital component of the ContentViewCore, so embedders must exercise caution in what 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they do with the ContentViewCore before calling initialize(). 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We supply the nativeWebContents pointer here rather than in the constructor to allow us 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to set the private browsing mode at a later point for the WebView implementation. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that the caller remains the owner of the nativeWebContents and is responsible for 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deleting it after destroying the ContentViewCore. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void initialize(ViewGroup containerView, InternalAccessDelegate internalDispatcher, 607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeWebContents, WindowAndroid windowAndroid) { 608bee9932bab44713b74b422b4b759b49f5a222977Bo Liu setContainerView(containerView); 609bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mPositionListener = new PositionObserver.Listener() { 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void onPositionChanged(int x, int y) { 6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (isSelectionHandleShowing() || isInsertionHandleShowing()) { 6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) temporarilyHideTextHandles(); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long windowNativePointer = windowAndroid != null ? windowAndroid.getNativePointer() : 0; 620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long viewAndroidNativePointer = 0; 622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (windowNativePointer != 0) { 623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mViewAndroid = new ViewAndroid(windowAndroid, getViewAndroidDelegate()); 624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) viewAndroidNativePointer = mViewAndroid.getNativePointer(); 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mZoomControlsDelegate = new ZoomControlsDelegate() { 6285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void invokeZoomPicker() {} 6305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 6315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void dismissZoomPicker() {} 6325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @Override 6335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void updateZoomControls() {} 6345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 6355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mNativeContentViewCore = nativeInit( 637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) nativeWebContents, viewAndroidNativePointer, windowNativePointer, 638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mRetainedJavaScriptObjects); 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mWebContents = nativeGetWebContentsAndroid(mNativeContentViewCore); 640c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mContentSettings = new ContentSettings(this, mNativeContentViewCore); 641bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 642bee9932bab44713b74b422b4b759b49f5a222977Bo Liu setContainerViewInternals(internalDispatcher); 643bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mRenderCoordinates.reset(); 644bee9932bab44713b74b422b4b759b49f5a222977Bo Liu initPopupZoomer(mContext); 645bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mImeAdapter = createImeAdapter(mContext); 646c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAccessibilityInjector = AccessibilityInjector.newInstance(this); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mWebContentsObserver = new WebContentsObserverAndroid(this) { 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 6510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public void didNavigateMainFrame(String url, String baseUrl, 65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) boolean isNavigationToDifferentPage, boolean isFragmentNavigation) { 6530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!isNavigationToDifferentPage) return; 654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) hidePopups(); 655c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch resetScrollInProgress(); 6560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch resetGestureDetection(); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 658a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch @Override 660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public void renderProcessGone(boolean wasOomProtected) { 661010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) hidePopups(); 662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch resetScrollInProgress(); 6630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // No need to reset gesture detection as the detector will have 6640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // been destroyed in the RenderWidgetHostView. 665a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 669bee9932bab44713b74b422b4b759b49f5a222977Bo Liu /** 670bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * Sets a new container view for this {@link ContentViewCore}. 671bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * 672bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <p>WARNING: This is not a general purpose method and has been designed with WebView 673bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * fullscreen in mind. Please be aware that it might not be appropriate for other use cases 674bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * and that it has a number of limitations. For example the PopupZoomer only works with the 675bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * container view with which this ContentViewCore has been initialized. 676bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * 677bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <p>This method only performs a small part of replacing the container view and 678bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * embedders are responsible for: 679bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <ul> 680bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <li>Disconnecting the old container view from this ContentViewCore</li> 681bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <li>Updating the InternalAccessDelegate</li> 682bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <li>Reconciling the state of this ContentViewCore with the new container view</li> 683bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <li>Tearing down and recreating the native GL rendering where appropriate</li> 684bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * <li>etc.</li> 685bee9932bab44713b74b422b4b759b49f5a222977Bo Liu * </ul> 686bee9932bab44713b74b422b4b759b49f5a222977Bo Liu */ 687bee9932bab44713b74b422b4b759b49f5a222977Bo Liu public void setContainerView(ViewGroup containerView) { 688bee9932bab44713b74b422b4b759b49f5a222977Bo Liu TraceEvent.begin(); 689bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (mContainerView != null) { 690bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mPositionObserver.removeListener(mPositionListener); 691bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mSelectionHandleController = null; 692bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mInsertionHandleController = null; 693bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mInputConnection = null; 694bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } 695bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 696bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerView = containerView; 697bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mPositionObserver = new ViewPositionObserver(mContainerView); 698bee9932bab44713b74b422b4b759b49f5a222977Bo Liu String contentDescription = "Web View"; 699bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (R.string.accessibility_content_view == 0) { 700bee9932bab44713b74b422b4b759b49f5a222977Bo Liu Log.w(TAG, "Setting contentDescription to 'Web View' as no value was specified."); 701bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } else { 702bee9932bab44713b74b422b4b759b49f5a222977Bo Liu contentDescription = mContext.getResources().getString( 703bee9932bab44713b74b422b4b759b49f5a222977Bo Liu R.string.accessibility_content_view); 704bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } 705bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerView.setContentDescription(contentDescription); 706bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerView.setWillNotDraw(false); 707bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerView.setClickable(true); 708bee9932bab44713b74b422b4b759b49f5a222977Bo Liu TraceEvent.end(); 709bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } 710bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void onNativeContentViewCoreDestroyed(long nativeContentViewCore) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert nativeContentViewCore == mNativeContentViewCore; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mNativeContentViewCore = 0; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * Set the Container view Internals. 7191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * @param internalDispatcher Handles dispatching all hidden or super methods to the 7201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * containerView. 7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) */ 7221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public void setContainerViewInternals(InternalAccessDelegate internalDispatcher) { 7231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mContainerViewInternals = internalDispatcher; 7241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private void initPopupZoomer(Context context) { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPopupZoomer = new PopupZoomer(context); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mPopupZoomer.setOnVisibilityChangedListener(new PopupZoomer.OnVisibilityChangedListener() { 729bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // mContainerView can change, but this OnVisibilityChangedListener can only be used 730bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // to add and remove views from the mContainerViewAtCreation. 731bee9932bab44713b74b422b4b759b49f5a222977Bo Liu private final ViewGroup mContainerViewAtCreation = mContainerView; 732bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void onPopupZoomerShown(final PopupZoomer zoomer) { 735bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.post(new Runnable() { 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 738bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (mContainerViewAtCreation.indexOfChild(zoomer) == -1) { 739bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.addView(zoomer); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert false : "PopupZoomer should never be shown without being hidden"; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void onPopupZoomerHidden(final PopupZoomer zoomer) { 749bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.post(new Runnable() { 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 752bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (mContainerViewAtCreation.indexOfChild(zoomer) != -1) { 753bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.removeView(zoomer); 754bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.invalidate(); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert false : "PopupZoomer should never be hidden without being shown"; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }); 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(yongsheng): LONG_TAP is not enabled in PopupZoomer. So need to dispatch a LONG_TAP 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // gesture if a user completes a tap on PopupZoomer UI after a LONG_PRESS gesture. 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PopupZoomer.OnTapListener listener = new PopupZoomer.OnTapListener() { 765bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // mContainerView can change, but this OnTapListener can only be used 766bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // with the mContainerViewAtCreation. 767bee9932bab44713b74b422b4b759b49f5a222977Bo Liu private final ViewGroup mContainerViewAtCreation = mContainerView; 768bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onSingleTap(View v, MotionEvent e) { 771bee9932bab44713b74b422b4b759b49f5a222977Bo Liu mContainerViewAtCreation.requestFocus(); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeSingleTap(mNativeContentViewCore, e.getEventTime(), e.getX(), e.getY()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onLongPress(View v, MotionEvent e) { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeLongPress(mNativeContentViewCore, e.getEventTime(), e.getX(), e.getY()); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPopupZoomer.setOnTapListener(listener); 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Destroy the internal state of the ContentView. This method may only be 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called after the ContentView has been removed from the view system. No 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * other methods may be called on this ContentView after this method has 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * been called. 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void destroy() { 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeOnJavaContentViewCoreDestroyed(mNativeContentViewCore); 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mWebContents = null; 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mViewAndroid != null) mViewAndroid.destroy(); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mNativeContentViewCore = 0; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentSettings = null; 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mJavaScriptInterfaces.clear(); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRetainedJavaScriptObjects.clear(); 805bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch unregisterAccessibilityContentObserver(); 8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListeners.clear(); 807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScreenOrientationListener.getInstance().removeObserver(this); 808bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 809bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 810bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch private void unregisterAccessibilityContentObserver() { 811bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (mAccessibilityScriptInjectionObserver == null) { 812bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 814bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch getContext().getContentResolver().unregisterContentObserver( 815bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch mAccessibilityScriptInjectionObserver); 816bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch mAccessibilityScriptInjectionObserver = null; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns true initially, false after destroy() has been called. 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * It is illegal to call any other public method after destroy(). 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isAlive() { 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mNativeContentViewCore != 0; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is only useful for passing over JNI to native code that requires ContentViewCore*. 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return native ContentViewCore pointer. 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 832f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public long getNativeContentViewCore() { 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mNativeContentViewCore; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setContentViewClient(ContentViewClient client) { 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client == null) { 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new IllegalArgumentException("The client can't be null."); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentViewClient = client; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch @VisibleForTesting 8440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public ContentViewClient getContentViewClient() { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mContentViewClient == null) { 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We use the Null Object pattern to avoid having to perform a null check in this class. 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We create it lazily because most of the time a client will be set almost immediately 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // after ContentView is created. 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContentViewClient = new ContentViewClient(); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We don't set the native ContentViewClient pointer here on purpose. The native 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // implementation doesn't mind a null delegate and using one is better than passing a 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Null Object, since we cut down on the number of JNI calls. 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContentViewClient; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getBackgroundColor() { 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nativeGetBackgroundColor(mNativeContentViewCore); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Color.WHITE; 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void onBackgroundColorChanged(int color) { 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getContentViewClient().onBackgroundColorChanged(color); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Load url without fixing up the url string. Consumers of ContentView are responsible for 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * off during user input). 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 874c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param params Parameters for this load. 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void loadUrl(LoadUrlParams params) { 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeLoadUrl(mNativeContentViewCore, 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mUrl, 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mLoadUrlType, 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mTransitionType, 8830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch params.getReferrer() != null ? params.getReferrer().getUrl() : null, 8840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch params.getReferrer() != null ? params.getReferrer().getPolicy() : 0, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mUaOverrideOption, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.getExtraHeadersString(), 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mPostData, 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mBaseUrlForDataUrl, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.mVirtualUrlForDataUrl, 890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.mCanLoadLocalResources, 891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) params.mIsRendererInitiated); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Stops loading the current web contents. 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void stopLoading() { 8980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (mWebContents != null) mWebContents.stop(); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the URL of the current page. 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The URL of the current page. 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getUrl() { 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) return nativeGetURL(mNativeContentViewCore); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return null; 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the title of the current page. 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return The title of the current page. 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public String getTitle() { 9170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return mWebContents == null ? null : mWebContents.getTitle(); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Shows an interstitial page driven by the passed in delegate. 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param url The URL being blocked by the interstitial. 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param delegate The delegate handling the interstitial. 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @VisibleForTesting 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void showInterstitialPage( 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) String url, InterstitialPageDelegateAndroid delegate) { 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mNativeContentViewCore == 0) return; 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nativeShowInterstitialPage(mNativeContentViewCore, url, delegate.getNative()); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return Whether the page is currently showing an interstitial, such as a bad HTTPS page. 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public boolean isShowingInterstitialPage() { 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mNativeContentViewCore == 0 ? 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) false : nativeIsShowingInterstitialPage(mNativeContentViewCore); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 942868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @return Viewport width in physical pixels as set from onSizeChanged. 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getViewportWidthPix() { return mViewportWidthPix; } 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 948868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * @return Viewport height in physical pixels as set from onSizeChanged. 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getViewportHeightPix() { return mViewportHeightPix; } 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return Width of underlying physical surface. 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getPhysicalBackingWidthPix() { return mPhysicalBackingWidthPix; } 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return Height of underlying physical surface. 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getPhysicalBackingHeightPix() { return mPhysicalBackingHeightPix; } 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return Amount the output surface extends past the bottom of the window viewport. 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public int getOverdrawBottomHeightPix() { return mOverdrawBottomHeightPix; } 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return The amount to shrink the viewport relative to {@link #getViewportWidthPix()}. 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @CalledByNative 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public int getViewportSizeOffsetWidthPix() { return mViewportSizeOffsetWidthPix; } 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return The amount to shrink the viewport relative to {@link #getViewportHeightPix()}. 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) @CalledByNative 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public int getViewportSizeOffsetHeightPix() { return mViewportSizeOffsetHeightPix; } 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /** 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see android.webkit.WebView#getContentHeight() 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public float getContentHeightCss() { 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getContentHeightCss(); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see android.webkit.WebView#getContentWidth() 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public float getContentWidthCss() { 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getContentWidthCss(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(teddchoc): Remove all these navigation controller methods from here and have the 998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // embedders manage it. 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Whether the current WebContents has a previous navigation entry. 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean canGoBack() { 1003a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return mWebContents != null && mWebContents.getNavigationController().canGoBack(); 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Whether the current WebContents has a navigation entry after the current one. 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean canGoForward() { 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return mWebContents != null && mWebContents.getNavigationController().canGoForward(); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param offset The offset into the navigation history. 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Whether we can move in history by given offset 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean canGoToOffset(int offset) { 1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return mWebContents != null && 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mWebContents.getNavigationController().canGoToOffset(offset); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Navigates to the specified offset from the "current entry". Does nothing if the offset is out 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of bounds. 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param offset The offset into the navigation history. 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void goToOffset(int offset) { 1028a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mWebContents != null) mWebContents.getNavigationController().goToOffset(offset); 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void goToNavigationIndex(int index) { 1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mWebContents != null) { 1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mWebContents.getNavigationController().goToNavigationIndex(index); 1035a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Goes to the navigation entry before the current one. 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void goBack() { 1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mWebContents != null) mWebContents.getNavigationController().goBack(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Goes to the navigation entry following the current one. 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void goForward() { 1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mWebContents != null) mWebContents.getNavigationController().goForward(); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * Loads the current navigation if there is a pending lazy load (after tab restore). 10548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) */ 10558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public void loadIfNecessary() { 10568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (mNativeContentViewCore != 0) nativeLoadIfNecessary(mNativeContentViewCore); 10578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 10588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /** 10608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * Requests the current navigation to be loaded upon the next call to loadIfNecessary(). 10618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) */ 10628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) public void requestRestoreLoad() { 10638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (mNativeContentViewCore != 0) nativeRequestRestoreLoad(mNativeContentViewCore); 10648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 10658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 10668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /** 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reload the current page. 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1069f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void reload(boolean checkForRepost) { 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAccessibilityInjector.addOrRemoveAccessibilityApisIfNecessary(); 1071f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (mNativeContentViewCore != 0) { 1072f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) nativeReload(mNativeContentViewCore, checkForRepost); 1073f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1074f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1075f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /** 1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Reload the current page, ignoring the contents of the cache. 1078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void reloadIgnoringCache(boolean checkForRepost) { 1080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mAccessibilityInjector.addOrRemoveAccessibilityApisIfNecessary(); 1081f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (mNativeContentViewCore != 0) { 1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) nativeReloadIgnoringCache(mNativeContentViewCore, checkForRepost); 1083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cancel the pending reload. 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void cancelPendingReload() { 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) nativeCancelPendingReload(mNativeContentViewCore); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Continue the pending reload. 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void continuePendingReload() { 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) nativeContinuePendingReload(mNativeContentViewCore); 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Clears the ContentViewCore's page history in both the backwards and 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * forwards directions. 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void clearHistory() { 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) nativeClearHistory(mNativeContentViewCore); 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1108c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch /** 1109c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch * @return The selected text (empty if no text selected). 1110c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch */ 1111c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch public String getSelectedText() { 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mHasSelection ? mLastSelectedText : ""; 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1116c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch * @return Whether the current selection is editable (false if no text selected). 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1118c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch public boolean isSelectionEditable() { 1119c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return mHasSelection ? mSelectionEditable : false; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // End FrameLayout overrides. 1123c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1125929504d64b38e05de7355e162311d6791ad6f54dBo Liu * TODO(changwan): refactor SPen related code into a separate class. See 1126929504d64b38e05de7355e162311d6791ad6f54dBo Liu * http://crbug.com/398169. 1127929504d64b38e05de7355e162311d6791ad6f54dBo Liu * @return Whether SPen is supported on the device. 1128929504d64b38e05de7355e162311d6791ad6f54dBo Liu */ 1129929504d64b38e05de7355e162311d6791ad6f54dBo Liu public static boolean isSPenSupported(Context context) { 1130929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (sIsSPenSupported == null) 1131929504d64b38e05de7355e162311d6791ad6f54dBo Liu sIsSPenSupported = detectSPenSupport(context); 1132929504d64b38e05de7355e162311d6791ad6f54dBo Liu return sIsSPenSupported.booleanValue(); 1133929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1134929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1135929504d64b38e05de7355e162311d6791ad6f54dBo Liu private static boolean detectSPenSupport(Context context) { 1136929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (!"SAMSUNG".equalsIgnoreCase(Build.MANUFACTURER)) 1137929504d64b38e05de7355e162311d6791ad6f54dBo Liu return false; 1138929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1139929504d64b38e05de7355e162311d6791ad6f54dBo Liu final FeatureInfo[] infos = context.getPackageManager().getSystemAvailableFeatures(); 1140929504d64b38e05de7355e162311d6791ad6f54dBo Liu for (FeatureInfo info : infos) { 1141929504d64b38e05de7355e162311d6791ad6f54dBo Liu if ("com.sec.feature.spen_usp".equalsIgnoreCase(info.name)) { 1142929504d64b38e05de7355e162311d6791ad6f54dBo Liu return true; 1143929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1144929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1145929504d64b38e05de7355e162311d6791ad6f54dBo Liu return false; 1146929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1147929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1148929504d64b38e05de7355e162311d6791ad6f54dBo Liu /** 1149929504d64b38e05de7355e162311d6791ad6f54dBo Liu * Convert SPen event action into normal event action. 1150929504d64b38e05de7355e162311d6791ad6f54dBo Liu * TODO(changwan): refactor SPen related code into a separate class. See 1151929504d64b38e05de7355e162311d6791ad6f54dBo Liu * http://crbug.com/398169. 1152929504d64b38e05de7355e162311d6791ad6f54dBo Liu * 1153929504d64b38e05de7355e162311d6791ad6f54dBo Liu * @param eventActionMasked Input event action. It is assumed that it is masked as the values 1154929504d64b38e05de7355e162311d6791ad6f54dBo Liu cannot be ORed. 1155929504d64b38e05de7355e162311d6791ad6f54dBo Liu * @return Event action after the conversion 1156929504d64b38e05de7355e162311d6791ad6f54dBo Liu */ 1157929504d64b38e05de7355e162311d6791ad6f54dBo Liu public static int convertSPenEventAction(int eventActionMasked) { 1158929504d64b38e05de7355e162311d6791ad6f54dBo Liu // S-Pen support: convert to normal stylus event handling 1159929504d64b38e05de7355e162311d6791ad6f54dBo Liu switch (eventActionMasked) { 1160929504d64b38e05de7355e162311d6791ad6f54dBo Liu case SPEN_ACTION_DOWN: 1161929504d64b38e05de7355e162311d6791ad6f54dBo Liu return MotionEvent.ACTION_DOWN; 1162929504d64b38e05de7355e162311d6791ad6f54dBo Liu case SPEN_ACTION_UP: 1163929504d64b38e05de7355e162311d6791ad6f54dBo Liu return MotionEvent.ACTION_UP; 1164929504d64b38e05de7355e162311d6791ad6f54dBo Liu case SPEN_ACTION_MOVE: 1165929504d64b38e05de7355e162311d6791ad6f54dBo Liu return MotionEvent.ACTION_MOVE; 1166929504d64b38e05de7355e162311d6791ad6f54dBo Liu case SPEN_ACTION_CANCEL: 1167929504d64b38e05de7355e162311d6791ad6f54dBo Liu return MotionEvent.ACTION_CANCEL; 1168929504d64b38e05de7355e162311d6791ad6f54dBo Liu default: 1169929504d64b38e05de7355e162311d6791ad6f54dBo Liu return eventActionMasked; 1170929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1171929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 1172929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1173929504d64b38e05de7355e162311d6791ad6f54dBo Liu /** 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onTouchEvent(MotionEvent) 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onTouchEvent(MotionEvent event) { 1177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TraceEvent.begin("onTouchEvent"); 1178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) try { 1179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cancelRequestToScrollFocusedEditableNodeIntoView(); 1180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1181929504d64b38e05de7355e162311d6791ad6f54dBo Liu int eventAction = event.getActionMasked(); 1182929504d64b38e05de7355e162311d6791ad6f54dBo Liu 1183929504d64b38e05de7355e162311d6791ad6f54dBo Liu if (isSPenSupported(mContext)) 1184929504d64b38e05de7355e162311d6791ad6f54dBo Liu eventAction = convertSPenEventAction(eventAction); 1185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Only these actions have any effect on gesture detection. Other 1187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // actions have no corresponding WebTouchEvent type and may confuse the 1188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // touch pipline, so we ignore them entirely. 1189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (eventAction != MotionEvent.ACTION_DOWN 1190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) && eventAction != MotionEvent.ACTION_UP 1191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) && eventAction != MotionEvent.ACTION_CANCEL 1192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) && eventAction != MotionEvent.ACTION_MOVE 1193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) && eventAction != MotionEvent.ACTION_POINTER_DOWN 1194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) && eventAction != MotionEvent.ACTION_POINTER_UP) { 1195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mNativeContentViewCore == 0) return false; 1199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // A zero offset is quite common, in which case the unnecessary copy should be avoided. 1201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) MotionEvent offset = null; 1202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mCurrentTouchOffsetX != 0 || mCurrentTouchOffsetY != 0) { 1203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) offset = createOffsetMotionEvent(event); 1204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event = offset; 1205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) final int pointerCount = event.getPointerCount(); 1208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) final boolean consumed = nativeOnTouchEvent(mNativeContentViewCore, event, 1209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event.getEventTime(), eventAction, 1210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointerCount, event.getHistorySize(), event.getActionIndex(), 1211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event.getX(), event.getY(), 1212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointerCount > 1 ? event.getX(1) : 0, 1213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pointerCount > 1 ? event.getY(1) : 0, 1214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) event.getPointerId(0), pointerCount > 1 ? event.getPointerId(1) : -1, 1215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) event.getTouchMajor(), pointerCount > 1 ? event.getTouchMajor(1) : 0, 1216929504d64b38e05de7355e162311d6791ad6f54dBo Liu event.getRawX(), event.getRawY(), 1217929504d64b38e05de7355e162311d6791ad6f54dBo Liu event.getToolType(0), 1218929504d64b38e05de7355e162311d6791ad6f54dBo Liu pointerCount > 1 ? event.getToolType(1) : MotionEvent.TOOL_TYPE_UNKNOWN, 1219929504d64b38e05de7355e162311d6791ad6f54dBo Liu event.getButtonState()); 1220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (offset != null) offset.recycle(); 1222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return consumed; 1223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } finally { 1224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TraceEvent.end("onTouchEvent"); 1225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void setIgnoreRemainingTouchEvents() { 12290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch resetGestureDetection(); 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public boolean isScrollInProgress() { 123323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return mTouchScrollInProgress || mPotentiallyActiveFlingCount > 0; 123423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 123523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 12365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 12375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onFlingStartEventConsumed(int vx, int vy) { 1239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchScrollInProgress = false; 124023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) mPotentiallyActiveFlingCount++; 12415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temporarilyHideTextHandles(); 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (mGestureStateListenersIterator.rewind(); 12435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.hasNext();) { 12445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.next().onFlingStartGesture( 12455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) vx, vy, computeVerticalScrollOffset(), computeVerticalScrollExtent()); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 12515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onFlingStartEventHadNoConsumer(int vx, int vy) { 1252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchScrollInProgress = false; 12535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (mGestureStateListenersIterator.rewind(); 12545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.hasNext();) { 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.next().onUnhandledFlingStartEvent(vx, vy); 12565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onFlingCancelEventAck() { 12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.FLING_CANCEL); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @SuppressWarnings("unused") 1266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) @CalledByNative 12675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onScrollBeginEventAck() { 1268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchScrollInProgress = true; 12695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temporarilyHideTextHandles(); 12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mZoomControlsDelegate.invokeZoomPicker(); 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.SCROLL_START); 1272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 1273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 12740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) @SuppressWarnings("unused") 12750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) @CalledByNative 12760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private void onScrollUpdateGestureConsumed() { 12775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mZoomControlsDelegate.invokeZoomPicker(); 12785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (mGestureStateListenersIterator.rewind(); 12795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.hasNext();) { 12805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.next().onScrollUpdateGestureConsumed(); 12810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 12820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 12830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 12845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 12855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 12865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onScrollEndEventAck() { 1287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!mTouchScrollInProgress) return; 1288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchScrollInProgress = false; 12895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.SCROLL_END); 12905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 12935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 12945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onPinchBeginEventAck() { 12955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temporarilyHideTextHandles(); 12965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.PINCH_BEGIN); 12975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 12985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 12995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 13005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 13015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onPinchEndEventAck() { 13025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.PINCH_END); 13035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 13065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private void onSingleTapEventAck(boolean consumed, int x, int y) { 13085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for (mGestureStateListenersIterator.rewind(); 13095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mGestureStateListenersIterator.hasNext();) { 1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mGestureStateListenersIterator.next().onSingleTap(consumed, x, y); 13115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 13125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 13135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 13145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu @SuppressWarnings("unused") 13155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu @CalledByNative 13165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onDoubleTapEventAck() { 13175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temporarilyHideTextHandles(); 13185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Called just prior to a tap or press gesture being forwarded to the renderer. 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 13235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @SuppressWarnings("unused") 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private boolean filterTapOrPressEvent(int type, int x, int y) { 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type == GestureEventType.LONG_PRESS && offerLongPressToEmbedder()) { 13275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateForTapOrPress(type, x, y); 13305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 13315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @VisibleForTesting 13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void sendDoubleTapForTest(long timeMs, int x, int y) { 1335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (mNativeContentViewCore == 0) return; 13365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeDoubleTap(mNativeContentViewCore, timeMs, x, y); 1337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @VisibleForTesting 13405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void flingForTest(long timeMs, int x, int y, int velocityX, int velocityY) { 1341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (mNativeContentViewCore == 0) return; 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeFlingCancel(mNativeContentViewCore, timeMs); 13435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeScrollBegin(mNativeContentViewCore, timeMs, x, y, velocityX, velocityY); 13445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeFlingStart(mNativeContentViewCore, timeMs, x, y, velocityX, velocityY); 13455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 13485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Cancel any fling gestures active. 13495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @param timeMs Current time (in milliseconds). 13505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 13515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public void cancelFling(long timeMs) { 13525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (mNativeContentViewCore == 0) return; 13535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu nativeFlingCancel(mNativeContentViewCore, timeMs); 13545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 13555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 13565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /** 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Add a listener that gets alerted on gesture state changes. 13585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param listener Listener to add. 13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void addGestureStateListener(GestureStateListener listener) { 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListeners.addObserver(listener); 13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Removes a listener that was added to watch for gesture state changes. 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param listener Listener to remove. 13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void removeGestureStateListener(GestureStateListener listener) { 13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListeners.removeObserver(listener); 13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void updateGestureStateListener(int gestureType) { 13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (mGestureStateListenersIterator.rewind(); 13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.hasNext();) { 13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GestureStateListener listener = mGestureStateListenersIterator.next(); 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (gestureType) { 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.PINCH_BEGIN: 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onPinchStarted(); 13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 13805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.PINCH_END: 13815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onPinchEnded(); 13825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.FLING_END: 13845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onFlingEndGesture( 13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollOffset(), 13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollExtent()); 13875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.FLING_CANCEL: 13895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onFlingCancelGesture(); 13905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 13915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.SCROLL_START: 13925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onScrollStarted( 13935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollOffset(), 13945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollExtent()); 13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 13965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case GestureEventType.SCROLL_END: 13975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) listener.onScrollEnded( 13985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollOffset(), 13995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollExtent()); 14005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) /** 14086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * Requests the renderer insert a link to the specified stylesheet in the 14096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) * main frame's document. 14106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) */ 14116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void addStyleSheetByURL(String url) { 14126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) nativeAddStyleSheetByURL(mNativeContentViewCore, url); 14136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 14146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 14155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** Callback interface for evaluateJavaScript(). */ 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public interface JavaScriptCallback { 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void handleJavaScriptResult(String jsonResult); 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Injects the passed Javascript code in the current page and evaluates it. 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * If a result is required, pass in a callback. 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Used in automation tests. 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param script The Javascript to execute. 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param callback The callback to be fired off when a result is ready. The script's 1427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * result will be json encoded and passed as the parameter, and the call 1428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * will be made on the main thread. 1429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * If no result is required, pass null. 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1431d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public void evaluateJavaScript(String script, JavaScriptCallback callback) { 1432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (mNativeContentViewCore == 0) return; 14333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) nativeEvaluateJavaScript(mNativeContentViewCore, script, callback, false); 14343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 14353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /** 14373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Injects the passed Javascript code in the current page and evaluates it. 14383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * If there is no page existing, a new one will be created. 14393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * 14403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * @param script The Javascript to execute. 14413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) */ 1442d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public void evaluateJavaScriptEvenIfNotYetNavigated(String script) { 1443d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (mNativeContentViewCore == 0) return; 14443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) nativeEvaluateJavaScript(mNativeContentViewCore, script, null, true); 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * To be called when the ContentView is shown. 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onShow() { 1451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assert mNativeContentViewCore != 0; 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeOnShow(mNativeContentViewCore); 1453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setAccessibilityState(mAccessibilityManager.isEnabled()); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 145723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * @return The ID of the renderer process that backs this tab or 145823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) * {@link #INVALID_RENDER_PROCESS_PID} if there is none. 145923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) */ 146023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public int getCurrentRenderProcessId() { 146123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return nativeGetCurrentRenderProcessId(mNativeContentViewCore); 146223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 146323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 146423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) /** 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * To be called when the ContentView is hidden. 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onHide() { 1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assert mNativeContentViewCore != 0; 1469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) hidePopups(); 1470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setInjectedAccessibility(false); 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeOnHide(mNativeContentViewCore); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1475b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Return the ContentSettings object used to retrieve the settings for this 1476b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * ContentViewCore. For modifications, ChromeNativePreferences is to be used. 1477b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * @return A ContentSettings object that can be used to retrieve this 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ContentViewCore's settings. 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ContentSettings getContentSettings() { 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContentSettings; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1484010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private void hidePopups() { 1485a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch hideSelectPopup(); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hideHandles(); 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hideSelectActionBar(); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public void hideSelectActionBar() { 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mActionMode != null) { 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mActionMode.finish(); 1493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mActionMode = null; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1497c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch public boolean isSelectActionBarShowing() { 1498c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return mActionMode != null; 1499c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 1500c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 15010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private void resetGestureDetection() { 1502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 15030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch nativeResetGestureDetection(mNativeContentViewCore); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onAttachedToWindow() 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onAttachedToWindow() { 1511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setAccessibilityState(mAccessibilityManager.isEnabled()); 1512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScreenOrientationListener.getInstance().addObserver(this, mContext); 151446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GamepadList.onAttachedToWindow(mContext); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onDetachedFromWindow() 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 1521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @SuppressLint("MissingSuperCall") 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onDetachedFromWindow() { 1523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setInjectedAccessibility(false); 1524010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) hidePopups(); 1525b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mZoomControlsDelegate.dismissZoomPicker(); 1526bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch unregisterAccessibilityContentObserver(); 1527a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1528a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScreenOrientationListener.getInstance().removeObserver(this); 152946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GamepadList.onDetachedFromWindow(); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onVisibilityChanged(android.view.View, int) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onVisibilityChanged(View changedView, int visibility) { 1536d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch if (visibility != View.VISIBLE) { 1537d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch mZoomControlsDelegate.dismissZoomPicker(); 1538d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch } 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onCreateInputConnection(EditorInfo) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mImeAdapter.hasTextInputType()) { 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Although onCheckIsTextEditor will return false in this case, the EditorInfo 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is still used by the InputMethodService. Need to make sure the IME doesn't 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // enter fullscreen mode. 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_FULLSCREEN; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 155123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) mInputConnection = mAdapterInputConnectionFactory.get(mContainerView, mImeAdapter, 155223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) mEditable, outAttrs); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mInputConnection; 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) @VisibleForTesting 155723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public AdapterInputConnection getAdapterInputConnectionForTest() { 155823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return mInputConnection; 155923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) } 156023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 156123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) @VisibleForTesting 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public Editable getEditableForTest() { 156323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) return mEditable; 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onCheckIsTextEditor() 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onCheckIsTextEditor() { 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mImeAdapter.hasTextInputType(); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onConfigurationChanged(Configuration) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onConfigurationChanged(Configuration newConfig) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.begin(); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (newConfig.keyboard != Configuration.KEYBOARD_NOKEYS) { 1581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mNativeContentViewCore != 0) { 1582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore), 1583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ImeAdapter.getTextInputTypeNone()); 1584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mInputMethodManagerWrapper.restartInput(mContainerView); 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContainerViewInternals.super_onConfigurationChanged(newConfig); 1588a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // To request layout has side effect, but it seems OK as it only happen in 15904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // onConfigurationChange and layout has to be changed in most case. 15914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mContainerView.requestLayout(); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.end(); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onSizeChanged(int, int, int, int) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void onSizeChanged(int wPix, int hPix, int owPix, int ohPix) { 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (getViewportWidthPix() == wPix && getViewportHeightPix() == hPix) return; 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mViewportWidthPix = wPix; 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mViewportHeightPix = hPix; 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mNativeContentViewCore != 0) { 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nativeWasResized(mNativeContentViewCore); 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) updateAfterSizeChanged(); 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Called when the underlying surface the compositor draws to changes size. 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This may be larger than the viewport size. 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void onPhysicalBackingSizeChanged(int wPix, int hPix) { 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mPhysicalBackingWidthPix == wPix && mPhysicalBackingHeightPix == hPix) return; 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mPhysicalBackingWidthPix = wPix; 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mPhysicalBackingHeightPix = hPix; 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mNativeContentViewCore != 0) { 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nativeWasResized(mNativeContentViewCore); 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Called when the amount the surface is overdrawing off the bottom has changed. 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param overdrawHeightPix The overdraw height. 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void onOverdrawBottomHeightChanged(int overdrawHeightPix) { 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mOverdrawBottomHeightPix == overdrawHeightPix) return; 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mOverdrawBottomHeightPix = overdrawHeightPix; 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mNativeContentViewCore != 0) { 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nativeWasResized(mNativeContentViewCore); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void updateAfterSizeChanged() { 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mPopupZoomer.hide(false); 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Execute a delayed form focus operation because the OSK was brought 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up earlier. 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mFocusPreOSKViewportRect.isEmpty()) { 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Rect rect = new Rect(); 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getContainerView().getWindowVisibleDisplayFrame(rect); 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!rect.equals(mFocusPreOSKViewportRect)) { 164968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Only assume the OSK triggered the onSizeChanged if width was preserved. 165068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (rect.width() == mFocusPreOSKViewportRect.width()) { 165168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scrollFocusedEditableNodeIntoView(); 165268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 1653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cancelRequestToScrollFocusedEditableNodeIntoView(); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1658a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void cancelRequestToScrollFocusedEditableNodeIntoView() { 1659a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Zero-ing the rect will prevent |updateAfterSizeChanged()| from 1660a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // issuing the delayed form focus event. 1661a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mFocusPreOSKViewportRect.setEmpty(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void scrollFocusedEditableNodeIntoView() { 1665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 1666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The native side keeps track of whether the zoom and scroll actually occurred. It is 1667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // more efficient to do it this way and sometimes fire an unnecessary message rather 1668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // than synchronize with the renderer and always have an additional message. 1669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeScrollFocusedEditableNodeIntoView(mNativeContentViewCore); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) /** 1673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * Selects the word around the caret, if any. 1674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) * The caller can check if selection actually occurred by listening to OnSelectionChanged. 1675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) */ 1676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public void selectWordAroundCaret() { 1677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 1678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) nativeSelectWordAroundCaret(mNativeContentViewCore); 1679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /** 1682d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * @see View#onWindowFocusChanged(boolean) 1683d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) */ 1684d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public void onWindowFocusChanged(boolean hasWindowFocus) { 16850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!hasWindowFocus) resetGestureDetection(); 1686d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1687d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 168890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public void onFocusChanged(boolean gainFocus) { 1689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!gainFocus) { 1690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) hideImeIfNeeded(); 169146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) cancelRequestToScrollFocusedEditableNodeIntoView(); 1692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) nativeSetFocus(mNativeContentViewCore, gainFocus); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onKeyUp(int, KeyEvent) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onKeyUp(int keyCode, KeyEvent event) { 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mPopupZoomer.isShowing() && keyCode == KeyEvent.KEYCODE_BACK) { 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPopupZoomer.hide(true); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerViewInternals.super_onKeyUp(keyCode, event); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#dispatchKeyEventPreIme(KeyEvent) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean dispatchKeyEventPreIme(KeyEvent event) { 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try { 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.begin(); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerViewInternals.super_dispatchKeyEventPreIme(event); 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } finally { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.end(); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#dispatchKeyEvent(KeyEvent) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean dispatchKeyEvent(KeyEvent event) { 172346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (GamepadList.dispatchKeyEvent(event)) return true; 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (getContentViewClient().shouldOverrideKeyEvent(event)) { 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mContainerViewInternals.super_dispatchKeyEvent(event); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mImeAdapter.dispatchKeyEvent(event)) return true; 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mContainerViewInternals.super_dispatchKeyEvent(event); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onHoverEvent(MotionEvent) 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mouse move events are sent on hover enter, hover move and hover exit. 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * They are sent on hover exit because sometimes it acts as both a hover 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * move and hover exit. 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onHoverEvent(MotionEvent event) { 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.begin("onHoverEvent"); 17415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MotionEvent offset = createOffsetMotionEvent(event); 1742010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) try { 1743010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mBrowserAccessibilityManager != null) { 1744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return mBrowserAccessibilityManager.onHoverEvent(offset); 1745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1747010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Work around Android bug where the x, y coordinates of a hover exit 1748010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // event are incorrect when touch exploration is on. 1749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mTouchExplorationEnabled && offset.getAction() == MotionEvent.ACTION_HOVER_EXIT) { 1750010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1751010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1752effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1753010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mContainerView.removeCallbacks(mFakeMouseMoveRunnable); 1754010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mNativeContentViewCore != 0) { 1755010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) nativeSendMouseMoveEvent(mNativeContentViewCore, offset.getEventTime(), 1756010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) offset.getX(), offset.getY()); 1757010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 1759010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } finally { 1760010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) offset.recycle(); 1761010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) TraceEvent.end("onHoverEvent"); 1762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onGenericMotionEvent(MotionEvent) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean onGenericMotionEvent(MotionEvent event) { 176946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (GamepadList.onGenericMotionEvent(event)) return true; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((event.getSource() & InputDevice.SOURCE_CLASS_POINTER) != 0) { 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.getAction()) { 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case MotionEvent.ACTION_SCROLL: 1773010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mNativeContentViewCore == 0) return false; 1774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeSendMouseWheelEvent(mNativeContentViewCore, event.getEventTime(), 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.getX(), event.getY(), 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.getAxisValue(MotionEvent.AXIS_VSCROLL)); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContainerView.removeCallbacks(mFakeMouseMoveRunnable); 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send a delayed onMouseMove event so that we end 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // up hovering over the right position after the scroll. 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final MotionEvent eventFakeMouseMove = MotionEvent.obtain(event); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mFakeMouseMoveRunnable = new Runnable() { 1784f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @Override 1785f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public void run() { 1786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) onHoverEvent(eventFakeMouseMove); 1787010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) eventFakeMouseMove.recycle(); 1788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mContainerView.postDelayed(mFakeMouseMoveRunnable, 250); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerViewInternals.super_onGenericMotionEvent(event); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 17985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * Sets the current amount to offset incoming touch events by. This is used to handle content 17995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * moving and not lining up properly with the android input system. 18005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @param dx The X offset in pixels to shift touch events. 18015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu * @param dy The Y offset in pixels to shift touch events. 18025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu */ 18035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public void setCurrentMotionEventOffsets(float dx, float dy) { 18045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mCurrentTouchOffsetX = dx; 18055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mCurrentTouchOffsetY = dy; 18065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 18075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 18085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private MotionEvent createOffsetMotionEvent(MotionEvent src) { 18095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MotionEvent dst = MotionEvent.obtain(src); 18105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu dst.offsetLocation(mCurrentTouchOffsetX, mCurrentTouchOffsetY); 18115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return dst; 18125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 18135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 18145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu /** 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#scrollBy(int, int) 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Currently the ContentView scrolling happens in the native side. In 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the Java view system, it is always pinned at (0, 0). scrollBy() and scrollTo() 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are overridden, so that View's mScrollX and mScrollY will be unchanged at 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (0, 0). This is critical for drawing ContentView correctly. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void scrollBy(int xPix, int yPix) { 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nativeScrollBy(mNativeContentViewCore, 1824a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SystemClock.uptimeMillis(), 0, 0, xPix, yPix); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#scrollTo(int, int) 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void scrollTo(int xPix, int yPix) { 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float xCurrentPix = mRenderCoordinates.getScrollXPix(); 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float yCurrentPix = mRenderCoordinates.getScrollYPix(); 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float dxPix = xPix - xCurrentPix; 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float dyPix = yPix - yCurrentPix; 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (dxPix != 0 || dyPix != 0) { 1838a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long time = SystemClock.uptimeMillis(); 18395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeScrollBegin(mNativeContentViewCore, time, 18405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) xCurrentPix, yCurrentPix, -dxPix, -dyPix); 1841c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) nativeScrollBy(mNativeContentViewCore, 184258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) time, xCurrentPix, yCurrentPix, dxPix, dyPix); 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeScrollEnd(mNativeContentViewCore, time); 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: this can go away once ContentView.getScrollX() reports correct values. 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see: b/6029133 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getNativeScrollXForTest() { 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getScrollXPixInt(); 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: this can go away once ContentView.getScrollY() reports correct values. 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // see: b/6029133 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getNativeScrollYForTest() { 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getScrollYPixInt(); 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeHorizontalScrollExtent() 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeHorizontalScrollExtent() { 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getLastFrameViewportWidthPixInt(); 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeHorizontalScrollOffset() 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeHorizontalScrollOffset() { 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getScrollXPixInt(); 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeHorizontalScrollRange() 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeHorizontalScrollRange() { 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getContentWidthPixInt(); 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeVerticalScrollExtent() 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeVerticalScrollExtent() { 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getLastFrameViewportHeightPixInt(); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeVerticalScrollOffset() 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeVerticalScrollOffset() { 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getScrollYPixInt(); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#computeVerticalScrollRange() 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int computeVerticalScrollRange() { 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getContentHeightPixInt(); 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // End FrameLayout overrides. 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#awakenScrollBars(int, boolean) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("javadoc") 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean awakenScrollBars(int startDelay, boolean invalidate) { 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For the default implementation of ContentView which draws the scrollBars on the native 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // side, calling this function may get us into a bad state where we keep drawing the 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // scrollBars, so disable it by always returning false. 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mContainerView.getScrollBarStyle() == View.SCROLLBARS_INSIDE_OVERLAY) { 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerViewInternals.super_awakenScrollBars(startDelay, invalidate); 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void updateForTapOrPress(int type, float xPix, float yPix) { 19255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type != GestureEventType.SINGLE_TAP_CONFIRMED 19265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) && type != GestureEventType.SINGLE_TAP_UP 19275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) && type != GestureEventType.LONG_PRESS 19285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) && type != GestureEventType.LONG_TAP) { 19295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 19305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (mContainerView.isFocusable() && mContainerView.isFocusableInTouchMode() 19333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) && !mContainerView.isFocused()) { 19343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) mContainerView.requestFocus(); 19353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!mPopupZoomer.isShowing()) mPopupZoomer.setLastTouch(xPix, yPix); 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mLastTapX = (int) xPix; 1940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mLastTapY = (int) yPix; 1941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (type == GestureEventType.LONG_PRESS 19435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) || type == GestureEventType.LONG_TAP) { 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInsertionHandleController().allowAutomaticShowing(); 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getSelectionHandleController().allowAutomaticShowing(); 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mSelectionEditable) getInsertionHandleController().allowAutomaticShowing(); 19485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 1952f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @return The x coordinate for the last point that a tap or press gesture was initiated from. 19535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 1954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public int getLastTapX() { 1955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return mLastTapX; 19565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /** 1959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * @return The y coordinate for the last point that a tap or press gesture was initiated from. 19605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 1961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public int getLastTapY() { 1962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return mLastTapY; 19635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 19645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1965b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public void setZoomControlsDelegate(ZoomControlsDelegate zoomControlsDelegate) { 1966b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mZoomControlsDelegate = zoomControlsDelegate; 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1969b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) public void updateMultiTouchZoomSupport(boolean supportsMultiTouchZoom) { 1970a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 1971a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeSetMultiTouchZoomSupportEnabled(mNativeContentViewCore, supportsMultiTouchZoom); 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void updateDoubleTapSupport(boolean supportsDoubleTap) { 1975a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 1976a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeSetDoubleTapSupportEnabled(mNativeContentViewCore, supportsDoubleTap); 19773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 19783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void selectPopupMenuItems(int[] indices) { 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeSelectPopupMenuItems(mNativeContentViewCore, indices); 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1983010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mSelectPopup = null; 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 1987a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Send the screen orientation value to the renderer. 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1989a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @VisibleForTesting 1990a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void sendOrientationChangeEvent(int orientation) { 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore == 0) return; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1993a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeSendOrientationChangeEvent(mNativeContentViewCore, orientation); 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Register the delegate to be used when content can not be handled by 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the rendering engine, and should be downloaded instead. This will replace 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the current delegate, if any. 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param delegate An implementation of ContentViewDownloadDelegate. 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setDownloadDelegate(ContentViewDownloadDelegate delegate) { 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mDownloadDelegate = delegate; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by DownloadController. 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentViewDownloadDelegate getDownloadDelegate() { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mDownloadDelegate; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private SelectionHandleController getSelectionHandleController() { 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mSelectionHandleController == null) { 20134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mSelectionHandleController = new SelectionHandleController( 20144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) getContainerView(), mPositionObserver) { 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void selectBetweenCoordinates(int x1, int y1, int x2, int y2) { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0 && !(x1 == x2 && y1 == y2)) { 2018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) nativeSelectBetweenCoordinates(mNativeContentViewCore, 2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x1, y1 - mRenderCoordinates.getContentOffsetYPix(), 2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x2, y2 - mRenderCoordinates.getContentOffsetYPix()); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void showHandles(int startDir, int endDir) { 2026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) final boolean wasShowing = isShowing(); 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super.showHandles(startDir, endDir); 2028f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!wasShowing || mActionMode == null) showSelectActionBar(); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mSelectionHandleController.hideAndDisallowAutomaticShowing(); 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mSelectionHandleController; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private InsertionHandleController getInsertionHandleController() { 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mInsertionHandleController == null) { 20414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mInsertionHandleController = new InsertionHandleController( 20424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) getContainerView(), mPositionObserver) { 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private static final int AVERAGE_LINE_HEIGHT = 14; 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setCursorPosition(int x, int y) { 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 2048c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) nativeMoveCaret(mNativeContentViewCore, 2049c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x, y - mRenderCoordinates.getContentOffsetYPix()); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void paste() { 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mImeAdapter.paste(); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hideHandles(); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public int getLineHeight() { 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (int) Math.ceil( 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRenderCoordinates.fromLocalCssToPix(AVERAGE_LINE_HEIGHT)); 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void showHandle() { 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) super.showHandle(); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInsertionHandleController.hideAndDisallowAutomaticShowing(); 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mInsertionHandleController; 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2077c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch @VisibleForTesting 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public InsertionHandleController getInsertionHandleControllerForTest() { 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mInsertionHandleController; 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2082c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch @VisibleForTesting 2083c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch public SelectionHandleController getSelectionHandleControllerForTest() { 2084c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch return mSelectionHandleController; 2085c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch } 2086c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void updateHandleScreenPositions() { 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isSelectionHandleShowing()) { 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mSelectionHandleController.setStartHandlePosition( 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mStartHandlePoint.getXPix(), mStartHandlePoint.getYPix()); 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mSelectionHandleController.setEndHandlePosition( 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mEndHandlePoint.getXPix(), mEndHandlePoint.getYPix()); 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isInsertionHandleShowing()) { 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandleController.setHandlePosition( 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandlePoint.getXPix(), mInsertionHandlePoint.getYPix()); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void hideHandles() { 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mSelectionHandleController != null) { 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mSelectionHandleController.hideAndDisallowAutomaticShowing(); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mInsertionHandleController != null) { 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInsertionHandleController.hideAndDisallowAutomaticShowing(); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mPositionObserver.removeListener(mPositionListener); 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void showSelectActionBar() { 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mActionMode != null) { 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mActionMode.invalidate(); 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start a new action mode with a SelectActionModeCallback. 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SelectActionModeCallback.ActionHandler actionHandler = 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new SelectActionModeCallback.ActionHandler() { 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 212158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void selectAll() { 212258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mImeAdapter.selectAll(); 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 212658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void cut() { 212758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mImeAdapter.cut(); 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 213158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void copy() { 213258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mImeAdapter.copy(); 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 213658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void paste() { 213758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mImeAdapter.paste(); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 214158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void share() { 214258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final String query = getSelectedText(); 214358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (TextUtils.isEmpty(query)) return; 214458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 214558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Intent send = new Intent(Intent.ACTION_SEND); 214658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) send.setType("text/plain"); 214758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) send.putExtra(Intent.EXTRA_TEXT, query); 214858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) try { 214958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Intent i = Intent.createChooser(send, getContext().getString( 215058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) R.string.actionbar_share)); 215158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 215258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) getContext().startActivity(i); 215358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } catch (android.content.ActivityNotFoundException ex) { 215458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If no app handles it, do nothing. 215558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 215658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 215758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 215858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 215958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public void search() { 216058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) final String query = getSelectedText(); 216158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (TextUtils.isEmpty(query)) return; 216258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 216358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // See if ContentViewClient wants to override 216458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (getContentViewClient().doesPerformWebSearch()) { 216558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) getContentViewClient().performWebSearch(query); 216658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return; 216758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 216858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 216958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Intent i = new Intent(Intent.ACTION_WEB_SEARCH); 217058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i.putExtra(SearchManager.EXTRA_NEW_SEARCH, true); 217158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i.putExtra(SearchManager.QUERY, query); 217258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i.putExtra(Browser.EXTRA_APPLICATION_ID, getContext().getPackageName()); 217358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!(getContext() instanceof Activity)) { 217458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 217558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 217658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) try { 217758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) getContext().startActivity(i); 217858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } catch (android.content.ActivityNotFoundException ex) { 217958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // If no app handles it, do nothing. 218058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 2184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public boolean isSelectionPassword() { 2185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return mImeAdapter.isSelectionPassword(); 2186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) @Override 218958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean isSelectionEditable() { 219058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return mSelectionEditable; 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @Override 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onDestroyActionMode() { 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mActionMode = null; 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mUnselectAllOnActionModeDismiss) mImeAdapter.unselect(); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentViewClient().onContextualActionBarHidden(); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 219958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 220058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 220158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean isShareAvailable() { 220258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Intent intent = new Intent(Intent.ACTION_SEND); 220358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) intent.setType("text/plain"); 220458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return getContext().getPackageManager().queryIntentActivities(intent, 220558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PackageManager.MATCH_DEFAULT_ONLY).size() > 0; 220658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 220758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 220858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @Override 220958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public boolean isWebSearchAvailable() { 221058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (getContentViewClient().doesPerformWebSearch()) return true; 221158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 221258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) intent.putExtra(SearchManager.EXTRA_NEW_SEARCH, true); 221358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return getContext().getPackageManager().queryIntentActivities(intent, 221458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PackageManager.MATCH_DEFAULT_ONLY).size() > 0; 221558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mActionMode = null; 2218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // On ICS, startActionMode throws an NPE when getParent() is null. 2219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mContainerView.getParent() != null) { 2220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mActionMode = mContainerView.startActionMode( 2221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) getContentViewClient().getSelectActionModeCallback(getContext(), actionHandler, 2222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) nativeIsIncognito(mNativeContentViewCore))); 2223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mUnselectAllOnActionModeDismiss = true; 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mActionMode == null) { 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There is no ActionMode, so remove the selection. 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mImeAdapter.unselect(); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentViewClient().onContextualActionBarShown(); 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean getUseDesktopUserAgent() { 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return nativeGetUseDesktopUserAgent(mNativeContentViewCore); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set whether or not we're using a desktop user agent for the currently loaded page. 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param override If true, use a desktop user agent. Use a mobile one otherwise. 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param reloadOnChange Reload the page if the UA has changed. 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setUseDesktopUserAgent(boolean override, boolean reloadOnChange) { 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeSetUseDesktopUserAgent(mNativeContentViewCore, override, reloadOnChange); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void clearSslPreferences() { 2252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mNativeContentViewCore != 0) nativeClearSslPreferences(mNativeContentViewCore); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private boolean isSelectionHandleShowing() { 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mSelectionHandleController != null && mSelectionHandleController.isShowing(); 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private boolean isInsertionHandleShowing() { 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mInsertionHandleController != null && mInsertionHandleController.isShowing(); 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Makes the insertion/selection handles invisible. They will fade back in shortly after the 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // last call to scheduleTextHandleFadeIn (or temporarilyHideTextHandles). 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void temporarilyHideTextHandles() { 22664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (isSelectionHandleShowing() && !mSelectionHandleController.isDragging()) { 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mSelectionHandleController.setHandleVisibility(HandleView.INVISIBLE); 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (isInsertionHandleShowing() && !mInsertionHandleController.isDragging()) { 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandleController.setHandleVisibility(HandleView.INVISIBLE); 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduleTextHandleFadeIn(); 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private boolean allowTextHandleFadeIn() { 2276a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mTouchScrollInProgress) return false; 2277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (mPopupZoomer.isShowing()) return false; 2279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 2281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cancels any pending fade in and schedules a new one. 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void scheduleTextHandleFadeIn() { 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!isInsertionHandleShowing() && !isSelectionHandleShowing()) return; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mDeferredHandleFadeInRunnable == null) { 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mDeferredHandleFadeInRunnable = new Runnable() { 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void run() { 2291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!allowTextHandleFadeIn()) { 2292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Delay fade in until it is allowed. 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scheduleTextHandleFadeIn(); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isSelectionHandleShowing()) { 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mSelectionHandleController.beginHandleFadeIn(); 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isInsertionHandleShowing()) { 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandleController.beginHandleFadeIn(); 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mContainerView.removeCallbacks(mDeferredHandleFadeInRunnable); 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mContainerView.postDelayed(mDeferredHandleFadeInRunnable, TEXT_HANDLE_FADE_IN_DELAY); 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Shows the IME if the focused widget could accept text input. 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void showImeIfNeeded() { 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mNativeContentViewCore != 0) nativeShowImeIfNeeded(mNativeContentViewCore); 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 2318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Hides the IME if the containerView is the active view for IME. 2319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 2320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void hideImeIfNeeded() { 2321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Hide input method window from the current view synchronously 2322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // because ImeAdapter does so asynchronouly with a delay, and 2323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // by the time when ImeAdapter dismisses the input, the 2324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // containerView may have lost focus. 2325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We cannot trust ContentViewClient#onImeStateChangeRequested to 2326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // hide the input window because it has an empty default implementation. 2327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // So we need to explicitly hide the input method window here. 2328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mInputMethodManagerWrapper.isActive(mContainerView)) { 2329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mInputMethodManagerWrapper.hideSoftInputFromWindow( 2330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mContainerView.getWindowToken(), 0, null); 2331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) getContentViewClient().onImeStateChangeRequested(false); 2333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void updateFrameInfo( 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float scrollOffsetX, float scrollOffsetY, 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float pageScaleFactor, float minPageScaleFactor, float maxPageScaleFactor, 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float contentWidth, float contentHeight, 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float viewportWidth, float viewportHeight, 2342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float controlsOffsetYCss, float contentOffsetYCss, 2343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float overdrawBottomHeightCss) { 2344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TraceEvent.instant("ContentViewCore:updateFrameInfo"); 2345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Adjust contentWidth/Height to be always at least as big as 2346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the actual viewport (as set by onSizeChanged). 2347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch final float deviceScale = mRenderCoordinates.getDeviceScaleFactor(); 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contentWidth = Math.max(contentWidth, 2349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mViewportWidthPix / (deviceScale * pageScaleFactor)); 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contentHeight = Math.max(contentHeight, 2351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mViewportHeightPix / (deviceScale * pageScaleFactor)); 2352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final float contentOffsetYPix = mRenderCoordinates.fromDipToPix(contentOffsetYCss); 2353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean contentSizeChanged = 23552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contentWidth != mRenderCoordinates.getContentWidthCss() 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) || contentHeight != mRenderCoordinates.getContentHeightCss(); 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean scaleLimitsChanged = 23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) minPageScaleFactor != mRenderCoordinates.getMinPageScaleFactor() 23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) || maxPageScaleFactor != mRenderCoordinates.getMaxPageScaleFactor(); 23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean pageScaleChanged = 23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pageScaleFactor != mRenderCoordinates.getPageScaleFactor(); 23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean scrollChanged = 23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pageScaleChanged 23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) || scrollOffsetX != mRenderCoordinates.getScrollX() 23652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) || scrollOffsetY != mRenderCoordinates.getScrollY(); 2366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final boolean contentOffsetChanged = 2367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentOffsetYPix != mRenderCoordinates.getContentOffsetYPix(); 2368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean needHidePopupZoomer = contentSizeChanged || scrollChanged; 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean needUpdateZoomControls = scaleLimitsChanged || scrollChanged; 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final boolean needTemporarilyHideHandles = scrollChanged; 23722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (needHidePopupZoomer) mPopupZoomer.hide(true); 23742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (scrollChanged) { 23761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mContainerViewInternals.onScrollChanged( 23771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetX), 23781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (int) mRenderCoordinates.fromLocalCssToPix(scrollOffsetY), 23791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (int) mRenderCoordinates.getScrollXPix(), 23801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) (int) mRenderCoordinates.getScrollYPix()); 23811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 23821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRenderCoordinates.updateFrameInfo( 23842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scrollOffsetX, scrollOffsetY, 23852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contentWidth, contentHeight, 23862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) viewportWidth, viewportHeight, 2387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pageScaleFactor, minPageScaleFactor, maxPageScaleFactor, 2388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contentOffsetYPix); 23892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (scrollChanged || contentOffsetChanged) { 23915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (mGestureStateListenersIterator.rewind(); 23925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.hasNext();) { 23935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mGestureStateListenersIterator.next().onScrollOffsetOrExtentChanged( 23945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollOffset(), 23955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) computeVerticalScrollExtent()); 23965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 23992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (needTemporarilyHideHandles) temporarilyHideTextHandles(); 2400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (needUpdateZoomControls) mZoomControlsDelegate.updateZoomControls(); 2401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (contentOffsetChanged) updateHandleScreenPositions(); 24022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update offsets for fullscreen. 24042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float controlsOffsetPix = controlsOffsetYCss * deviceScale; 2405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) final float overdrawBottomHeightPix = overdrawBottomHeightCss * deviceScale; 2406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) getContentViewClient().onOffsetsForFullscreenChanged( 2407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) controlsOffsetPix, contentOffsetYPix, overdrawBottomHeightPix); 2408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (mBrowserAccessibilityManager != null) { 2410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mBrowserAccessibilityManager.notifyFrameInfoInitialized(); 2411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 2415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputType, 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String text, int selectionStart, int selectionEnd, 2417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int compositionStart, int compositionEnd, boolean showImeIfNeeded, 2418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch boolean isNonImeChange) { 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.begin(); 2420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mSelectionEditable = (textInputType != ImeAdapter.getTextInputTypeNone()); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu mImeAdapter.updateKeyboardVisibility( 24235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu nativeImeAdapterAndroid, textInputType, showImeIfNeeded); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mInputConnection != null) { 24264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mInputConnection.updateState(text, selectionStart, selectionEnd, compositionStart, 2427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch compositionEnd, isNonImeChange); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (mActionMode != null) mActionMode.invalidate(); 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TraceEvent.end(); 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void setTitle(String title) { 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentViewClient().onUpdateTitle(title); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called (from native) when the <select> popup needs to be shown. 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param items Items to show. 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param enabled POPUP_ITEM_TYPEs for items. 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param multiple Whether the popup menu should support multi-select. 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param selectedIndices Indices of selected items. 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 2449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private void showSelectPopup(Rect bounds, String[] items, int[] enabled, boolean multiple, 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int[] selectedIndices) { 2451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mContainerView.getParent() == null || mContainerView.getVisibility() != View.VISIBLE) { 2452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) selectPopupMenuItems(null); 2453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 2454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) assert items.length == enabled.length; 2457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) List<SelectPopupItem> popupItems = new ArrayList<SelectPopupItem>(); 2458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < items.length; i++) { 2459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) popupItems.add(new SelectPopupItem(items[i], enabled[i])); 2460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2461010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) hidePopups(); 2462010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (DeviceUtils.isTablet(mContext) && !multiple) { 2463010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mSelectPopup = new SelectPopupDropdown(this, popupItems, bounds, selectedIndices); 2464010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 2465010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mSelectPopup = new SelectPopupDialog(this, popupItems, multiple, selectedIndices); 2466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 2467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) mSelectPopup.show(); 2468a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2470a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 2471c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Called when the <select> popup needs to be hidden. 2472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 2473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch @CalledByNative 2474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private void hideSelectPopup() { 2475010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (mSelectPopup != null) mSelectPopup.hide(); 2476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 2477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /** 2479010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * @return The visible select popup being shown. 2480a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 2481010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public SelectPopup getSelectPopupForTest() { 2482010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return mSelectPopup; 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void showDisambiguationPopup(Rect targetRect, Bitmap zoomedBitmap) { 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPopupZoomer.setBitmap(zoomedBitmap); 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mPopupZoomer.show(targetRect); 2490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) temporarilyHideTextHandles(); 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 2495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private TouchEventSynthesizer createTouchEventSynthesizer() { 2496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return new TouchEventSynthesizer(this); 249758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 249858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 249958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @SuppressWarnings("unused") 250058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) @CalledByNative 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void onSelectionChanged(String text) { 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mLastSelectedText = text; 2503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch getContentViewClient().onSelectionChanged(text); 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 2508929504d64b38e05de7355e162311d6791ad6f54dBo Liu private void showSelectionHandlesAutomatically() { 2509929504d64b38e05de7355e162311d6791ad6f54dBo Liu getSelectionHandleController().allowAutomaticShowing(); 2510929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 2511929504d64b38e05de7355e162311d6791ad6f54dBo Liu 2512929504d64b38e05de7355e162311d6791ad6f54dBo Liu @SuppressWarnings("unused") 2513929504d64b38e05de7355e162311d6791ad6f54dBo Liu @CalledByNative 25142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void onSelectionBoundsChanged(Rect anchorRectDip, int anchorDir, Rect focusRectDip, 25152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int focusDir, boolean isAnchorFirst) { 25162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All coordinates are in DIP. 25172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int x1 = anchorRectDip.left; 25182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int y1 = anchorRectDip.bottom; 25192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int x2 = focusRectDip.left; 25202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int y2 = focusRectDip.bottom; 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (x1 != x2 || y1 != y2 || 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (mSelectionHandleController != null && mSelectionHandleController.isDragging())) { 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mInsertionHandleController != null) { 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInsertionHandleController.hide(); 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (isAnchorFirst) { 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mStartHandlePoint.setLocalDip(x1, y1); 25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mEndHandlePoint.setLocalDip(x2, y2); 25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mStartHandlePoint.setLocalDip(x2, y2); 25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mEndHandlePoint.setLocalDip(x1, y1); 25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) boolean wereSelectionHandlesShowing = getSelectionHandleController().isShowing(); 25364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) getSelectionHandleController().onSelectionChanged(anchorDir, focusDir); 25384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) updateHandleScreenPositions(); 25394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mHasSelection = true; 25404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 25414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!wereSelectionHandlesShowing && getSelectionHandleController().isShowing()) { 254258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(cjhopman): Remove this when there is a better signal that long press caused 254358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a selection. See http://crbug.com/150151. 254458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) mContainerView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS); 254558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 254658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mUnselectAllOnActionModeDismiss = false; 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hideSelectActionBar(); 25502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (x1 != 0 && y1 != 0 && mSelectionEditable) { 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selection is a caret, and a text field is focused. 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mSelectionHandleController != null) { 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mSelectionHandleController.hide(); 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandlePoint.setLocalDip(x1, y1); 25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInsertionHandleController().onCursorPositionChanged(); 25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updateHandleScreenPositions(); 2559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (mInputMethodManagerWrapper.isWatchingCursor(mContainerView)) { 25602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final int xPix = (int) mInsertionHandlePoint.getXPix(); 25612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final int yPix = (int) mInsertionHandlePoint.getYPix(); 2562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mInputMethodManagerWrapper.updateCursor( 2563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mContainerView, xPix, yPix, xPix, yPix); 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deselection 25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mSelectionHandleController != null) { 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mSelectionHandleController.hideAndDisallowAutomaticShowing(); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mInsertionHandleController != null) { 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mInsertionHandleController.hideAndDisallowAutomaticShowing(); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mHasSelection = false; 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (isSelectionHandleShowing() || isInsertionHandleShowing()) { 25774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mPositionObserver.addListener(mPositionListener); 25784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @SuppressWarnings("unused") 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static void onEvaluateJavaScriptResult( 25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) String jsonResult, JavaScriptCallback callback) { 25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.handleJavaScriptResult(jsonResult); 25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SuppressWarnings("unused") 25892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void showPastePopup(int xDip, int yDip) { 25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mInsertionHandlePoint.setLocalDip(xDip, yDip); 25922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInsertionHandleController().showHandle(); 25932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) updateHandleScreenPositions(); 25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) getInsertionHandleController().showHandleWithPastePopup(); 25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @SuppressWarnings("unused") 25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 2599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private void onRenderProcessChange() { 26004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) attachImeAdapter(); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 26044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Attaches the native ImeAdapter object to the java ImeAdapter to allow communication via JNI. 26054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 26064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public void attachImeAdapter() { 2607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mImeAdapter != null && mNativeContentViewCore != 0) { 2608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore)); 2609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#hasFocus() 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean hasFocus() { 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mContainerView.hasFocus(); 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks whether the ContentViewCore can be zoomed in. 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return True if the ContentViewCore can be zoomed in. 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method uses the term 'zoom' for legacy reasons, but relates 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to what chrome calls the 'page scale factor'. 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean canZoomIn() { 26282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float zoomInExtent = mRenderCoordinates.getMaxPageScaleFactor() 26292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) - mRenderCoordinates.getPageScaleFactor(); 26302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return zoomInExtent > ZOOM_CONTROLS_EPSILON; 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks whether the ContentViewCore can be zoomed out. 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return True if the ContentViewCore can be zoomed out. 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method uses the term 'zoom' for legacy reasons, but relates 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to what chrome calls the 'page scale factor'. 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean canZoomOut() { 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) final float zoomOutExtent = mRenderCoordinates.getPageScaleFactor() 26422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) - mRenderCoordinates.getMinPageScaleFactor(); 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return zoomOutExtent > ZOOM_CONTROLS_EPSILON; 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Zooms in the ContentViewCore by 25% (or less if that would result in 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * zooming in more than possible). 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return True if there was a zoom change, false otherwise. 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method uses the term 'zoom' for legacy reasons, but relates 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to what chrome calls the 'page scale factor'. 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean zoomIn() { 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!canZoomIn()) { 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return pinchByDelta(1.25f); 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Zooms out the ContentViewCore by 20% (or less if that would result in 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * zooming out more than possible). 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return True if there was a zoom change, false otherwise. 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method uses the term 'zoom' for legacy reasons, but relates 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to what chrome calls the 'page scale factor'. 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean zoomOut() { 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!canZoomOut()) { 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return pinchByDelta(0.8f); 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Resets the zoom factor of the ContentViewCore. 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return True if there was a zoom change, false otherwise. 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method uses the term 'zoom' for legacy reasons, but relates 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to what chrome calls the 'page scale factor'. 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean zoomReset() { 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The page scale factor is initialized to mNativeMinimumScale when 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the page finishes loading. Thus sets it back to mNativeMinimumScale. 26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!canZoomOut()) return false; 26874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return pinchByDelta( 26882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mRenderCoordinates.getMinPageScaleFactor() 26892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) / mRenderCoordinates.getPageScaleFactor()); 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /** 26934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Simulate a pinch zoom gesture. 26944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 26954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @param delta the factor by which the current page scale should be multiplied by. 26964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * @return whether the gesture was sent. 26974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 26984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public boolean pinchByDelta(float delta) { 26995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (mNativeContentViewCore == 0) return false; 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2701a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long timeMs = SystemClock.uptimeMillis(); 27022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int xPix = getViewportWidthPix() / 2; 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int yPix = getViewportHeightPix() / 2; 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativePinchBegin(mNativeContentViewCore, timeMs, xPix, yPix); 27065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativePinchBy(mNativeContentViewCore, timeMs, xPix, yPix, delta); 27075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativePinchEnd(mNativeContentViewCore, timeMs); 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Invokes the graphical zoom picker widget for this ContentView. 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void invokeZoomPicker() { 2716b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mZoomControlsDelegate.invokeZoomPicker(); 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2720a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Enables or disables inspection of JavaScript objects added via 2721a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * {@link #addJavascriptInterface(Object, String)} by means of Object.keys() method and 2722a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * "for .. in" loop. Being able to inspect JavaScript objects is useful 2723a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * when debugging hybrid Android apps, but can't be enabled for legacy applications due 2724a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * to compatibility risks. 2725a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * 2726a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * @param allow Whether to allow JavaScript objects inspection. 2727a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 2728a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void setAllowJavascriptInterfacesInspection(boolean allow) { 2729a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) nativeSetAllowJavascriptInterfacesInspection(mNativeContentViewCore, allow); 2730a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2731a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2732a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /** 27335b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov * Returns JavaScript interface objects previously injected via 27345b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov * {@link #addJavascriptInterface(Object, String)}. 27355b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov * 27365b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov * @return the mapping of names to interface objects and corresponding annotation classes 27375b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov */ 27385b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov public Map<String, Pair<Object, Class>> getJavascriptInterfaces() { 27395b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov return mJavaScriptInterfaces; 27405b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov } 27415b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov 27425b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov /** 27432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This will mimic {@link #addPossiblyUnsafeJavascriptInterface(Object, String, Class)} 27442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * and automatically pass in {@link JavascriptInterface} as the required annotation. 27452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 27462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param object The Java object to inject into the ContentViewCore's JavaScript context. Null 27472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * values are ignored. 27482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param name The name used to expose the instance in JavaScript. 27492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 27502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void addJavascriptInterface(Object object, String name) { 27512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) addPossiblyUnsafeJavascriptInterface(object, name, JavascriptInterface.class); 27522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This method injects the supplied Java object into the ContentViewCore. 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The object is injected into the JavaScript context of the main frame, 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * using the supplied name. This allows the Java object to be accessed from 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * JavaScript. Note that that injected objects will not appear in 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * JavaScript until the page is next (re)loaded. For example: 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <pre> view.addJavascriptInterface(new Object(), "injectedObject"); 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * view.loadData("<!DOCTYPE html><title></title>", "text/html", null); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * view.loadUrl("javascript:alert(injectedObject.toString())");</pre> 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <p><strong>IMPORTANT:</strong> 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <ul> 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <li> addJavascriptInterface() can be used to allow JavaScript to control 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the host application. This is a powerful feature, but also presents a 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * security risk. Use of this method in a ContentViewCore containing 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * untrusted content could allow an attacker to manipulate the host 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * application in unintended ways, executing Java code with the permissions 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the host application. Use extreme care when using this method in a 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ContentViewCore which could contain untrusted content. Particular care 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should be taken to avoid unintentional access to inherited methods, such 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * as {@link Object#getClass()}. To prevent access to inherited methods, 27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * pass an annotation for {@code requiredAnnotation}. This will ensure 27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * that only methods with {@code requiredAnnotation} are exposed to the 27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Javascript layer. {@code requiredAnnotation} will be passed to all 27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * subsequently injected Java objects if any methods return an object. This 27782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * means the same restrictions (or lack thereof) will apply. Alternatively, 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * {@link #addJavascriptInterface(Object, String)} can be called, which 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * automatically uses the {@link JavascriptInterface} annotation. 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <li> JavaScript interacts with Java objects on a private, background 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thread of the ContentViewCore. Care is therefore required to maintain 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * thread safety.</li> 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * </ul></p> 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param object The Java object to inject into the 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * ContentViewCore's JavaScript context. Null 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * values are ignored. 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param name The name used to expose the instance in 27902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * JavaScript. 27912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @param requiredAnnotation Restrict exposed methods to ones with this 27922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * annotation. If {@code null} all methods are 27932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * exposed. 27942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 27962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void addPossiblyUnsafeJavascriptInterface(Object object, String name, 27972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Class<? extends Annotation> requiredAnnotation) { 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0 && object != null) { 27995b236bc719a7be3357af2c4c1cc0ba616b7cd2b5Mikhail Naganov mJavaScriptInterfaces.put(name, new Pair<Object, Class>(object, requiredAnnotation)); 2800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) nativeAddJavascriptInterface(mNativeContentViewCore, object, name, requiredAnnotation); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Removes a previously added JavaScript interface with the given name. 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param name The name of the interface to remove. 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void removeJavascriptInterface(String name) { 28102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mJavaScriptInterfaces.remove(name); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mNativeContentViewCore != 0) { 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nativeRemoveJavascriptInterface(mNativeContentViewCore, name); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the current scale of the ContentView. 28182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return The current page scale factor. 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public float getScale() { 28212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates.getPageScaleFactor(); 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If the view is ready to draw contents to the screen. In hardware mode, 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the initialization of the surface texture may not occur until after the 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * view has been added to the layout. This method will return {@code true} 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * once the texture is actually ready. 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isReady() { 2831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (mNativeContentViewCore == 0) return false; 28322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return nativeIsRenderWidgetHostViewReady(mNativeContentViewCore); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private void startContentIntent(String contentUrl) { 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) getContentViewClient().onStartContentIntent(getContext(), contentUrl); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch @Override 2841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void onAccessibilityStateChanged(boolean enabled) { 2842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setAccessibilityState(enabled); 2843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determines whether or not this ContentViewCore can handle this accessibility action. 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param action The action to perform. 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Whether or not this action is supported. 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean supportsAccessibilityAction(int action) { 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mAccessibilityInjector.supportsAccessibilityAction(action); 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Attempts to perform an accessibility action on the web content. If the accessibility action 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cannot be processed, it returns {@code null}, allowing the caller to know to call the 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * super {@link View#performAccessibilityAction(int, Bundle)} method and use that return value. 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Otherwise the return value from this method should be used. 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param action The action to perform. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @param arguments Optional action arguments. 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @return Whether the action was performed or {@code null} if the call should be delegated to 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the super {@link View} class. 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean performAccessibilityAction(int action, Bundle arguments) { 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mAccessibilityInjector.supportsAccessibilityAction(action)) { 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mAccessibilityInjector.performAccessibilityAction(action, arguments); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Set the BrowserAccessibilityManager, used for native accessibility 2874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * (not script injection). This is only set when system accessibility 2875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * has been enabled. 2876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @param manager The new BrowserAccessibilityManager. 2877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 2878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void setBrowserAccessibilityManager(BrowserAccessibilityManager manager) { 2879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mBrowserAccessibilityManager = manager; 2880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 2883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Get the BrowserAccessibilityManager, used for native accessibility 2884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * (not script injection). This will return null when system accessibility 2885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * is not enabled. 2886eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @return This view's BrowserAccessibilityManager. 2887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 2888eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public BrowserAccessibilityManager getBrowserAccessibilityManager() { 2889eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return mBrowserAccessibilityManager; 2890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2891eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 2893eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * If native accessibility (not script injection) is enabled, and if this is 2894eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * running on JellyBean or later, returns an AccessibilityNodeProvider that 2895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * implements native accessibility for this view. Returns null otherwise. 2896424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * Lazily initializes native accessibility here if it's allowed. 2897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * @return The AccessibilityNodeProvider, if available, or null otherwise. 2898eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 2899eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public AccessibilityNodeProvider getAccessibilityNodeProvider() { 2900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (mBrowserAccessibilityManager != null) { 2901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return mBrowserAccessibilityManager.getAccessibilityNodeProvider(); 2902eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2903424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2904424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (mNativeAccessibilityAllowed && 2905424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) !mNativeAccessibilityEnabled && 2906424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) mNativeContentViewCore != 0 && 2907424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 2908424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) mNativeAccessibilityEnabled = true; 2909424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) nativeSetAccessibilityEnabled(mNativeContentViewCore, true); 2910424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2911424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 2912424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return null; 2913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo) 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { 2919eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: this is only used by the script-injecting accessibility code. 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAccessibilityInjector.onInitializeAccessibilityNodeInfo(info); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @see View#onInitializeAccessibilityEvent(AccessibilityEvent) 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 2927eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Note: this is only used by the script-injecting accessibility code. 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.setClassName(this.getClass().getName()); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Identify where the top-left of the screen currently points to. 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.setScrollX(mRenderCoordinates.getScrollXPixInt()); 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.setScrollY(mRenderCoordinates.getScrollYPixInt()); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The maximum scroll values are determined by taking the content dimensions and 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subtracting off the actual dimensions of the ChromeView. 29362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int maxScrollXPix = Math.max(0, mRenderCoordinates.getMaxHorizontalScrollPixInt()); 29372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int maxScrollYPix = Math.max(0, mRenderCoordinates.getMaxVerticalScrollPixInt()); 29382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.setScrollable(maxScrollXPix > 0 || maxScrollYPix > 0); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setting the maximum scroll values requires API level 15 or higher. 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) final int SDK_VERSION_REQUIRED_TO_SET_SCROLL = 15; 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (Build.VERSION.SDK_INT >= SDK_VERSION_REQUIRED_TO_SET_SCROLL) { 29432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.setMaxScrollX(maxScrollXPix); 29442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.setMaxScrollY(maxScrollYPix); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 2949eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Returns whether accessibility script injection is enabled on the device 2950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 2951eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public boolean isDeviceAccessibilityScriptInjectionEnabled() { 2952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch try { 29530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // On JellyBean and higher, native accessibility is the default so script 29540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // injection is only allowed if enabled via a flag. 29550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && 29560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !CommandLine.getInstance().hasSwitch( 29570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ContentSwitches.ENABLE_ACCESSIBILITY_SCRIPT_INJECTION)) { 2958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return false; 2959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2961eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!mContentSettings.getJavaScriptEnabled()) { 2962eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 2963eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2964eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2965eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int result = getContext().checkCallingOrSelfPermission( 2966eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch android.Manifest.permission.INTERNET); 2967eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (result != PackageManager.PERMISSION_GRANTED) { 2968eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 2969eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2970eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2971eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Field field = Settings.Secure.class.getField("ACCESSIBILITY_SCRIPT_INJECTION"); 2972eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch field.setAccessible(true); 2973eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch String accessibilityScriptInjection = (String) field.get(null); 2974eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ContentResolver contentResolver = getContext().getContentResolver(); 2975eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2976eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (mAccessibilityScriptInjectionObserver == null) { 2977eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ContentObserver contentObserver = new ContentObserver(new Handler()) { 29784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) @Override 2979eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void onChange(boolean selfChange, Uri uri) { 2980eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch setAccessibilityState(mAccessibilityManager.isEnabled()); 2981eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2982eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 2983eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch contentResolver.registerContentObserver( 2984eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Settings.Secure.getUriFor(accessibilityScriptInjection), 2985eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 2986eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch contentObserver); 2987eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mAccessibilityScriptInjectionObserver = contentObserver; 2988eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2989eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2990eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return Settings.Secure.getInt(contentResolver, accessibilityScriptInjection, 0) == 1; 2991eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } catch (NoSuchFieldException e) { 29925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Do nothing, default to false. 2993eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } catch (IllegalAccessException e) { 29945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Do nothing, default to false. 2995eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2996eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 2997eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2998eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2999eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns whether or not accessibility injection is being used. 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public boolean isInjectingAccessibilityScript() { 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return mAccessibilityInjector.accessibilityIsAvailable(); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 30070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch * Returns true if accessibility is on and touch exploration is enabled. 30080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 30090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch public boolean isTouchExplorationEnabled() { 30100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return mTouchExplorationEnabled; 30110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 30120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 30130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /** 3014eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Turns browser accessibility on or off. 3015eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * If |state| is |false|, this turns off both native and injected accessibility. 3016eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Otherwise, if accessibility script injection is enabled, this will enable the injected 3017424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) * accessibility scripts. Native accessibility is enabled on demand. 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void setAccessibilityState(boolean state) { 3020424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (!state) { 3021424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) setInjectedAccessibility(false); 30224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mNativeAccessibilityAllowed = false; 3023a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchExplorationEnabled = false; 30244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 30254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) boolean useScriptInjection = isDeviceAccessibilityScriptInjectionEnabled(); 30264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) setInjectedAccessibility(useScriptInjection); 30274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mNativeAccessibilityAllowed = !useScriptInjection; 3028a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled(); 3029eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 3031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /** 3033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * Enable or disable injected accessibility features 3034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch */ 3035eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public void setInjectedAccessibility(boolean enabled) { 3036eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mAccessibilityInjector.addOrRemoveAccessibilityApisIfNecessary(); 3037eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch mAccessibilityInjector.setScriptEnabled(enabled); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Stop any TTS notifications that are currently going on. 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public void stopCurrentAccessibilityNotifications() { 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mAccessibilityInjector.onPageLostFocus(); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3048612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni * Return whether or not we should set accessibility focus on page load. 3049612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni */ 3050612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni public boolean shouldSetAccessibilityFocusOnPageLoad() { 3051612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni return mShouldSetAccessibilityFocusOnPageLoad; 3052612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni } 3053612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni 3054612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni /** 3055612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni * Sets whether or not we should set accessibility focus on page load. 3056612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni * This only applies if an accessibility service like TalkBack is running. 3057612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni * This is desirable behavior for a browser window, but not for an embedded 3058612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni * WebView. 3059612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni */ 3060612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni public void setShouldSetAccessibilityFocusOnPageLoad(boolean on) { 3061612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni mShouldSetAccessibilityFocusOnPageLoad = on; 3062612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni } 3063612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni 3064612621e642e8a7cd3331e7aea89429c80a5c32d9dmazzoni /** 30652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Inform WebKit that Fullscreen mode has been exited by the user. 30662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 30672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public void exitFullscreen() { 30681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (mNativeContentViewCore != 0) nativeExitFullscreen(mNativeContentViewCore); 30692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 30722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Changes whether hiding the top controls is enabled. 30732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 3074c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param enableHiding Whether hiding the top controls should be enabled or not. 3075c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param enableShowing Whether showing the top controls should be enabled or not. 3076c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param animate Whether the transition should be animated or not. 30772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 3078c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public void updateTopControlsState(boolean enableHiding, boolean enableShowing, 3079c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) boolean animate) { 30801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (mNativeContentViewCore != 0) { 30811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) nativeUpdateTopControlsState( 30821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) mNativeContentViewCore, enableHiding, enableShowing, animate); 30831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 30842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /** 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Callback factory method for nativeGetNavigationHistory(). 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) @CalledByNative 30902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private void addToNavigationHistory(Object history, int index, String url, String virtualUrl, 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String originalUrl, String title, Bitmap favicon) { 30922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationEntry entry = new NavigationEntry( 30932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index, url, virtualUrl, originalUrl, title, favicon); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((NavigationHistory) history).addEntry(entry); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get a copy of the navigation history of the view. 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public NavigationHistory getNavigationHistory() { 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NavigationHistory history = new NavigationHistory(); 31024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (mNativeContentViewCore != 0) { 31034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int currentIndex = nativeGetNavigationHistory(mNativeContentViewCore, history); 31044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) history.setCurrentEntryIndex(currentIndex); 31054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return history; 31075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @Override 31102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public NavigationHistory getDirectedNavigationHistory(boolean isForward, int itemLimit) { 31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationHistory history = new NavigationHistory(); 31124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (mNativeContentViewCore != 0) { 31134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) nativeGetDirectedNavigationHistory( 31144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mNativeContentViewCore, history, isForward, itemLimit); 31154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return history; 31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 3120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return The original request URL for the current navigation entry, or null if there is no 3121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * current entry. 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public String getOriginalUrlForActiveNavigationEntry() { 31244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (mNativeContentViewCore != 0) { 31254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return nativeGetOriginalUrlForActiveNavigationEntry(mNativeContentViewCore); 31264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 31274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return ""; 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /** 31312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * @return The cached copy of render positions and scales. 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 31332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public RenderCoordinates getRenderCoordinates() { 31342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mRenderCoordinates; 31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) @CalledByNative 31382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private static Rect createRect(int x, int y, int right, int bottom) { 31392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new Rect(x, y, right, bottom); 31402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 31412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 31425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void extractSmartClipData(int x, int y, int width, int height) { 31435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (mNativeContentViewCore != 0) { 3144929504d64b38e05de7355e162311d6791ad6f54dBo Liu x += mSmartClipOffsetX; 3145929504d64b38e05de7355e162311d6791ad6f54dBo Liu y += mSmartClipOffsetY; 31465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nativeExtractSmartClipData(mNativeContentViewCore, x, y, width, height); 31475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3150929504d64b38e05de7355e162311d6791ad6f54dBo Liu /** 3151929504d64b38e05de7355e162311d6791ad6f54dBo Liu * Set offsets for smart clip. 3152929504d64b38e05de7355e162311d6791ad6f54dBo Liu * 3153929504d64b38e05de7355e162311d6791ad6f54dBo Liu * <p>This should be called if there is a viewport change introduced by, 3154929504d64b38e05de7355e162311d6791ad6f54dBo Liu * e.g., show and hide of a location bar. 3155929504d64b38e05de7355e162311d6791ad6f54dBo Liu * 3156929504d64b38e05de7355e162311d6791ad6f54dBo Liu * @param offsetX Offset for X position. 3157929504d64b38e05de7355e162311d6791ad6f54dBo Liu * @param offsetY Offset for Y position. 3158929504d64b38e05de7355e162311d6791ad6f54dBo Liu */ 3159929504d64b38e05de7355e162311d6791ad6f54dBo Liu public void setSmartClipOffsets(int offsetX, int offsetY) { 3160929504d64b38e05de7355e162311d6791ad6f54dBo Liu mSmartClipOffsetX = offsetX; 3161929504d64b38e05de7355e162311d6791ad6f54dBo Liu mSmartClipOffsetY = offsetY; 3162929504d64b38e05de7355e162311d6791ad6f54dBo Liu } 3163929504d64b38e05de7355e162311d6791ad6f54dBo Liu 31645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 3165929504d64b38e05de7355e162311d6791ad6f54dBo Liu private void onSmartClipDataExtracted(String text, String html, Rect clipRect) { 31665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (mSmartClipDataListener != null ) { 3167929504d64b38e05de7355e162311d6791ad6f54dBo Liu mSmartClipDataListener.onSmartClipDataExtracted(text, html, clipRect); 31685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public void setSmartClipDataListener(SmartClipDataListener listener) { 31725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mSmartClipDataListener = listener; 31735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 317546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public void setBackgroundOpaque(boolean opaque) { 317646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (mNativeContentViewCore != 0) { 317746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) nativeSetBackgroundOpaque(mNativeContentViewCore, opaque); 317846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 317946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 318046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 31817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch /** 31825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Offer a long press gesture to the embedding View, primarily for WebView compatibility. 31837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * 31847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch * @return true if the embedder handled the event. 31857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch */ 31865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private boolean offerLongPressToEmbedder() { 31875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return mContainerView.performLongClick(); 31887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 31897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /** 3191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Reset scroll and fling accounting, notifying listeners as appropriate. 3192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * This is useful as a failsafe when the input stream may have been interruped. 3193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 3194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch private void resetScrollInProgress() { 3195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!isScrollInProgress()) return; 3196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch final boolean touchScrollInProgress = mTouchScrollInProgress; 3198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch final int potentiallyActiveFlingCount = mPotentiallyActiveFlingCount; 3199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mTouchScrollInProgress = false; 3201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mPotentiallyActiveFlingCount = 0; 3202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (touchScrollInProgress) updateGestureStateListener(GestureEventType.SCROLL_END); 3204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (potentiallyActiveFlingCount > 0) updateGestureStateListener(GestureEventType.FLING_END); 3205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 3206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 32075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private native long nativeInit(long webContentsPtr, 3208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) long viewAndroidPtr, long windowAndroidPtr, HashSet<Object> retainedObjectSet); 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3210868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) @CalledByNative 3211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private ContentVideoViewClient getContentVideoViewClient() { 3212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return getContentViewClient().getContentVideoViewClient(); 3213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) @CalledByNative 3216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private boolean shouldBlockMediaRequest(String url) { 3217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return getContentViewClient().shouldBlockMediaRequest(url); 3218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) @CalledByNative 32215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private void onNativeFlingStopped() { 3222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Note that mTouchScrollInProgress should normally be false at this 3223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // point, but we reset it anyway as another failsafe. 3224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mTouchScrollInProgress = false; 3225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (mPotentiallyActiveFlingCount <= 0) return; 3226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mPotentiallyActiveFlingCount--; 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) updateGestureStateListener(GestureEventType.FLING_END); 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 32295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) @Override 3231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public void onScreenOrientationChanged(int orientation) { 3232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sendOrientationChangeEvent(orientation); 3233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private native WebContents nativeGetWebContentsAndroid(long nativeContentViewCoreImpl); 3236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeOnJavaContentViewCoreDestroyed(long nativeContentViewCoreImpl); 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeLoadUrl( 3240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String url, 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int loadUrlType, 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int transitionType, 32440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch String referrerUrl, 32450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int referrerPolicy, 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int uaOverrideOption, 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String extraHeaders, 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) byte[] postData, 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String baseUrlForDataUrl, 32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) String virtualUrlForDataUrl, 3251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) boolean canLoadLocalResources, 3252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) boolean isRendererInitiated); 32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native String nativeGetURL(long nativeContentViewCoreImpl); 32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private native void nativeShowInterstitialPage( 3257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, String url, long nativeInterstitialPageDelegateAndroid); 3258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native boolean nativeIsShowingInterstitialPage(long nativeContentViewCoreImpl); 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native boolean nativeIsIncognito(long nativeContentViewCoreImpl); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeSetFocus(long nativeContentViewCoreImpl, boolean focused); 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeSendOrientationChangeEvent( 3265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, int orientation); 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All touch events (including flings, scrolls etc) accept coordinates in physical pixels. 3268a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private native boolean nativeOnTouchEvent( 3269a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeContentViewCoreImpl, MotionEvent event, 3270a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long timeMs, int action, int pointerCount, int historySize, int actionIndex, 3271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) float x0, float y0, float x1, float y1, 3272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int pointerId0, int pointerId1, 3273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) float touchMajor0, float touchMajor1, 3274929504d64b38e05de7355e162311d6791ad6f54dBo Liu float rawX, float rawY, 3275929504d64b38e05de7355e162311d6791ad6f54dBo Liu int androidToolType0, int androidToolType1, int androidButtonState); 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native int nativeSendMouseMoveEvent( 3278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native int nativeSendMouseWheelEvent( 3281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y, float verticalAxis); 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private native void nativeScrollBegin( 32845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y, float hintX, 32855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float hintY); 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeScrollEnd(long nativeContentViewCoreImpl, long timeMs); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeScrollBy( 3290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y, 329158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) float deltaX, float deltaY); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeFlingStart( 3294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y, float vx, float vy); 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeFlingCancel(long nativeContentViewCoreImpl, long timeMs); 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeSingleTap( 3299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y); 33001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 33012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private native void nativeDoubleTap( 3302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private native void nativeLongPress( 3305a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y); 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private native void nativePinchBegin( 3308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, long timeMs, float x, float y); 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativePinchEnd(long nativeContentViewCoreImpl, long timeMs); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativePinchBy(long nativeContentViewCoreImpl, long timeMs, 331358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) float anchorX, float anchorY, float deltaScale); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private native void nativeSelectBetweenCoordinates( 3316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, float x1, float y1, float x2, float y2); 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeMoveCaret(long nativeContentViewCoreImpl, float x, float y); 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch private native void nativeResetGestureDetection(long nativeContentViewCoreImpl); 3321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private native void nativeSetDoubleTapSupportEnabled( 3322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeContentViewCoreImpl, boolean enabled); 3323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private native void nativeSetMultiTouchZoomSupportEnabled( 3324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeContentViewCoreImpl, boolean enabled); 3325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeLoadIfNecessary(long nativeContentViewCoreImpl); 3327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeRequestRestoreLoad(long nativeContentViewCoreImpl); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeReload(long nativeContentViewCoreImpl, boolean checkForRepost); 3330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeReloadIgnoringCache( 3331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, boolean checkForRepost); 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeCancelPendingReload(long nativeContentViewCoreImpl); 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeContinuePendingReload(long nativeContentViewCoreImpl); 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeSelectPopupMenuItems(long nativeContentViewCoreImpl, int[] indices); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeScrollFocusedEditableNodeIntoView(long nativeContentViewCoreImpl); 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private native void nativeSelectWordAroundCaret(long nativeContentViewCoreImpl); 3342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeClearHistory(long nativeContentViewCoreImpl); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) private native void nativeAddStyleSheetByURL(long nativeContentViewCoreImpl, 33466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) String stylesheetUrl); 33476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeEvaluateJavaScript(long nativeContentViewCoreImpl, 33493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) String script, JavaScriptCallback callback, boolean startRenderer); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3351a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private native long nativeGetNativeImeAdapter(long nativeContentViewCoreImpl); 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native int nativeGetCurrentRenderProcessId(long nativeContentViewCoreImpl); 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native int nativeGetBackgroundColor(long nativeContentViewCoreImpl); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeOnShow(long nativeContentViewCoreImpl); 3358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeOnHide(long nativeContentViewCoreImpl); 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeSetUseDesktopUserAgent(long nativeContentViewCoreImpl, 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean enabled, boolean reloadOnChange); 3362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native boolean nativeGetUseDesktopUserAgent(long nativeContentViewCoreImpl); 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeClearSslPreferences(long nativeContentViewCoreImpl); 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private native void nativeSetAllowJavascriptInterfacesInspection( 3367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) long nativeContentViewCoreImpl, boolean allow); 3368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeAddJavascriptInterface(long nativeContentViewCoreImpl, Object object, 3370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) String name, Class requiredAnnotation); 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeRemoveJavascriptInterface(long nativeContentViewCoreImpl, 3373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) String name); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native int nativeGetNavigationHistory(long nativeContentViewCoreImpl, Object context); 3376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeGetDirectedNavigationHistory(long nativeContentViewCoreImpl, 33772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Object context, boolean isForward, int maxEntries); 3378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private native String nativeGetOriginalUrlForActiveNavigationEntry( 3379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl); 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeWasResized(long nativeContentViewCoreImpl); 33822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native boolean nativeIsRenderWidgetHostViewReady(long nativeContentViewCoreImpl); 33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeExitFullscreen(long nativeContentViewCoreImpl); 3386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeUpdateTopControlsState(long nativeContentViewCoreImpl, 3387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) boolean enableHiding, boolean enableShowing, boolean animate); 33882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private native void nativeShowImeIfNeeded(long nativeContentViewCoreImpl); 33902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private native void nativeSetAccessibilityEnabled( 3392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) long nativeContentViewCoreImpl, boolean enabled); 3393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private native void nativeExtractSmartClipData(long nativeContentViewCoreImpl, 33955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int x, int y, int w, int h); 339646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl, boolean opaque); 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3398