| Index: content/public/android/java/org/chromium/content/browser/ContentViewClient.java
|
| diff --git a/content/public/android/java/org/chromium/content/browser/ContentViewClient.java b/content/public/android/java/org/chromium/content/browser/ContentViewClient.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..93d5504fac3ced8cf5a00754f77b90e921ac553a
|
| --- /dev/null
|
| +++ b/content/public/android/java/org/chromium/content/browser/ContentViewClient.java
|
| @@ -0,0 +1,285 @@
|
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.content.browser;
|
| +
|
| +import android.content.ActivityNotFoundException;
|
| +import android.content.Intent;
|
| +import android.graphics.Rect;
|
| +import android.graphics.RectF;
|
| +import android.util.Log;
|
| +import android.view.KeyEvent;
|
| +
|
| +import java.net.URISyntaxException;
|
| +
|
| +import org.chromium.base.AccessedByNative;
|
| +import org.chromium.base.CalledByNative;
|
| +
|
| +/**
|
| + * Main callback class used by ContentView.
|
| + *
|
| + * This contains the superset of callbacks required to implement the browser UI and the callbacks
|
| + * required to implement the WebView API.
|
| + * The memory and reference ownership of this class is unusual - see the .cc file and ContentView
|
| + * for more details.
|
| + *
|
| + * TODO(mkosiba): Rid this guy of default implementations. This class is used by both WebView and
|
| + * the browser and we don't want a the browser-specific default implementation to accidentally leak
|
| + * over to WebView.
|
| + */
|
| +public class ContentViewClient {
|
| +
|
| + // Tag used for logging.
|
| + private static final String TAG = "ContentViewClient";
|
| +
|
| + // Native class pointer which will be set by nativeInit()
|
| + @AccessedByNative
|
| + private int mNativeClazz = 0;
|
| +
|
| + // These ints must match up to the native values in content_view_client.h.
|
| + // Generic error
|
| + public static final int ERROR_UNKNOWN = -1;
|
| + // Server or proxy hostname lookup failed
|
| + public static final int ERROR_HOST_LOOKUP = -2;
|
| + // Unsupported authentication scheme (not basic or digest)
|
| + public static final int ERROR_UNSUPPORTED_AUTH_SCHEME = -3;
|
| + // User authentication failed on server
|
| + public static final int ERROR_AUTHENTICATION = -4;
|
| + // User authentication failed on proxy
|
| + public static final int ERROR_PROXY_AUTHENTICATION = -5;
|
| + // Failed to connect to the server
|
| + public static final int ERROR_CONNECT = -6;
|
| + // Failed to read or write to the server
|
| + public static final int ERROR_IO = -7;
|
| + // Connection timed out
|
| + public static final int ERROR_TIMEOUT = -8;
|
| + // Too many redirects
|
| + public static final int ERROR_REDIRECT_LOOP = -9;
|
| + // Unsupported URI scheme
|
| + public static final int ERROR_UNSUPPORTED_SCHEME = -10;
|
| + // Failed to perform SSL handshake
|
| + public static final int ERROR_FAILED_SSL_HANDSHAKE = -11;
|
| + // Malformed URL
|
| + public static final int ERROR_BAD_URL = -12;
|
| + // Generic file error
|
| + public static final int ERROR_FILE = -13;
|
| + // File not found
|
| + public static final int ERROR_FILE_NOT_FOUND = -14;
|
| + // Too many requests during this load
|
| + public static final int ERROR_TOO_MANY_REQUESTS = -15;
|
| +
|
| + @CalledByNative
|
| + public void openNewTab(String url, boolean incognito) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public boolean addNewContents(int nativeSourceWebContents, int nativeWebContents,
|
| + int disposition, Rect initialPosition, boolean userGesture) {
|
| + return false;
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void closeContents() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onUrlStarredChanged(boolean starred) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onPageStarted(String url) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onPageFinished(String url) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onLoadStarted() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onLoadStopped() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onReceivedError(int errorCode, String description, String failingUrl) {
|
| + }
|
| +
|
| + // TODO(jrg): add onReceivedHttpAuthRequest() once ContentHttpAuthHandler is upstreamed
|
| +
|
| + @CalledByNative
|
| + public void onMainFrameCommitted(String url, String baseUrl) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onTabHeaderStateChanged() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onLoadProgressChanged(double progress) {
|
| + }
|
| +
|
| + public void onUpdateTitle(String title) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onUpdateUrl(String url) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onReceiveFindMatchRects(int version, float[] rect_data,
|
| + RectF activeRect) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onInterstitialShown() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public void onInterstitialHidden() {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public boolean takeFocus(boolean reverse) {
|
| + return false;
|
| + }
|
| +
|
| + public void onTabCrash(int pid) {
|
| + }
|
| +
|
| + @CalledByNative
|
| + public boolean shouldOverrideUrlLoading(String url) {
|
| + return false;
|
| + }
|
| +
|
| + public boolean shouldOverrideKeyEvent(KeyEvent event) {
|
| + int keyCode = event.getKeyCode();
|
| + // We need to send almost every key to WebKit. However:
|
| + // 1. We don't want to block the device on the renderer for
|
| + // some keys like menu, home, call.
|
| + // 2. There are no WebKit equivalents for some of these keys
|
| + // (see app/keyboard_codes_win.h)
|
| + // Note that these are not the same set as KeyEvent.isSystemKey:
|
| + // for instance, AKEYCODE_MEDIA_* will be dispatched to webkit.
|
| + if (keyCode == KeyEvent.KEYCODE_MENU ||
|
| + keyCode == KeyEvent.KEYCODE_HOME ||
|
| + keyCode == KeyEvent.KEYCODE_BACK ||
|
| + keyCode == KeyEvent.KEYCODE_CALL ||
|
| + keyCode == KeyEvent.KEYCODE_ENDCALL ||
|
| + keyCode == KeyEvent.KEYCODE_POWER ||
|
| + keyCode == KeyEvent.KEYCODE_HEADSETHOOK ||
|
| + keyCode == KeyEvent.KEYCODE_CAMERA ||
|
| + keyCode == KeyEvent.KEYCODE_FOCUS ||
|
| + keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
|
| + keyCode == KeyEvent.KEYCODE_VOLUME_MUTE ||
|
| + keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
|
| + return true;
|
| + }
|
| +
|
| + // We also have to intercept some shortcuts before we send them to the ContentView.
|
| + if (event.isCtrlPressed() && (
|
| + keyCode == KeyEvent.KEYCODE_TAB ||
|
| + keyCode == KeyEvent.KEYCODE_W ||
|
| + keyCode == KeyEvent.KEYCODE_F4)) {
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| + }
|
| +
|
| + // Called when an ImeEvent is sent to the page. Can be used to know when some text is entered
|
| + // in a page.
|
| + public void onImeEvent() {
|
| + }
|
| +
|
| + public void onUnhandledKeyEvent(KeyEvent event) {
|
| + // TODO(bulach): we probably want to re-inject the KeyEvent back into
|
| + // the system. Investigate if this is at all possible.
|
| + }
|
| +
|
| +
|
| + @CalledByNative
|
| + public void runFileChooser(FileChooserParams params) {
|
| + }
|
| +
|
| + // Return true if the client will handle the JS alert.
|
| + @CalledByNative
|
| + public boolean onJsAlert(String url, String Message) {
|
| + return false;
|
| + }
|
| +
|
| + // Return true if the client will handle the JS before unload dialog.
|
| + @CalledByNative
|
| + public boolean onJsBeforeUnload(String url, String message) {
|
| + return false;
|
| + }
|
| +
|
| + // Return true if the client will handle the JS confirmation prompt.
|
| + @CalledByNative
|
| + public boolean onJsConfirm(String url, String message) {
|
| + return false;
|
| + }
|
| +
|
| + // Return true if the client will handle the JS prompt dialog.
|
| + @CalledByNative
|
| + public boolean onJsPrompt(String url, String message, String defaultValue) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * A callback invoked after the JavaScript code passed to evaluateJavaScript
|
| + * has finished execution.
|
| + * Used in automation tests.
|
| + * @hide
|
| + */
|
| + public void onEvaluateJavaScriptResult(int id, String jsonResult) {
|
| + }
|
| +
|
| + // TODO (dtrainor): Should expose getScrollX/Y from ContentView or make
|
| + // computeHorizontalScrollOffset()/computeVerticalScrollOffset() public.
|
| + /**
|
| + * Gives the UI the chance to override each scroll event.
|
| + * @param dx The amount scrolled in the X direction.
|
| + * @param dy The amount scrolled in the Y direction.
|
| + * @param scrollX The current X scroll offset.
|
| + * @param scrollY The current Y scroll offset.
|
| + * @return Whether or not the UI consumed and handled this event.
|
| + */
|
| + public boolean shouldOverrideScroll(float dx, float dy, float scrollX, float scrollY) {
|
| + return false;
|
| + }
|
| +
|
| + /**
|
| + * Called when the contextual ActionBar is shown.
|
| + */
|
| + public void onContextualActionBarShown() {
|
| + }
|
| +
|
| + /**
|
| + * Called when the contextual ActionBar is hidden.
|
| + */
|
| + public void onContextualActionBarHidden() {
|
| + }
|
| +
|
| + /**
|
| + * Called when a new content intent is requested to be started.
|
| + */
|
| + public void onStartContentIntent(ContentView chromeView, String contentUrl) {
|
| + Intent intent;
|
| + // Perform generic parsing of the URI to turn it into an Intent.
|
| + try {
|
| + intent = Intent.parseUri(contentUrl, Intent.URI_INTENT_SCHEME);
|
| + } catch (URISyntaxException ex) {
|
| + Log.w(TAG, "Bad URI " + contentUrl + ": " + ex.getMessage());
|
| + return;
|
| + }
|
| +
|
| + try {
|
| + chromeView.getContext().startActivity(intent);
|
| + } catch (ActivityNotFoundException ex) {
|
| + Log.w(TAG, "No application can handle " + contentUrl);
|
| + }
|
| + }
|
| +}
|
|
|