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)     * &quot;for .. in&quot; 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