| Index: android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
|
| diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0b888d30d3dbdeda968083b21d22595b2d293ba1
|
| --- /dev/null
|
| +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
|
| @@ -0,0 +1,152 @@
|
| +// Copyright 2013 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.android_webview;
|
| +
|
| +import android.graphics.Rect;
|
| +import android.os.Handler;
|
| +import android.os.Looper;
|
| +import android.os.Message;
|
| +import android.util.Log;
|
| +import android.view.KeyEvent;
|
| +import android.webkit.ConsoleMessage;
|
| +
|
| +import org.chromium.content.browser.ContentViewCore;
|
| +
|
| +/**
|
| + * Adapts the AwWebContentsDelegate interface to the AwContentsClient interface.
|
| + * This class also serves a secondary function of routing certain callbacks from the content layer
|
| + * to specific listener interfaces.
|
| + */
|
| +class AwWebContentsDelegateAdapter extends AwWebContentsDelegate {
|
| + private static final String TAG = "AwWebContentsDelegateAdapter";
|
| +
|
| + /**
|
| + * Listener definition for a callback to be invoked when the preferred size of the page
|
| + * contents changes.
|
| + */
|
| + public interface PreferredSizeChangedListener {
|
| + /**
|
| + * Called when the preferred size of the page contents changes.
|
| + * @see AwWebContentsDelegate#updatePreferredSize
|
| + */
|
| + void updatePreferredSize(int width, int height);
|
| + }
|
| +
|
| + final AwContentsClient mContentsClient;
|
| + final PreferredSizeChangedListener mPreferredSizeChangedListener;
|
| +
|
| + public AwWebContentsDelegateAdapter(AwContentsClient contentsClient,
|
| + PreferredSizeChangedListener preferredSizeChangedListener) {
|
| + mContentsClient = contentsClient;
|
| + mPreferredSizeChangedListener = preferredSizeChangedListener;
|
| + }
|
| +
|
| + @Override
|
| + public void onLoadProgressChanged(int progress) {
|
| + mContentsClient.onProgressChanged(progress);
|
| + }
|
| +
|
| + @Override
|
| + public void handleKeyboardEvent(KeyEvent event) {
|
| + mContentsClient.onUnhandledKeyEvent(event);
|
| + }
|
| +
|
| + @Override
|
| + public boolean addMessageToConsole(int level, String message, int lineNumber,
|
| + String sourceId) {
|
| + ConsoleMessage.MessageLevel messageLevel = ConsoleMessage.MessageLevel.DEBUG;
|
| + switch(level) {
|
| + case LOG_LEVEL_TIP:
|
| + messageLevel = ConsoleMessage.MessageLevel.TIP;
|
| + break;
|
| + case LOG_LEVEL_LOG:
|
| + messageLevel = ConsoleMessage.MessageLevel.LOG;
|
| + break;
|
| + case LOG_LEVEL_WARNING:
|
| + messageLevel = ConsoleMessage.MessageLevel.WARNING;
|
| + break;
|
| + case LOG_LEVEL_ERROR:
|
| + messageLevel = ConsoleMessage.MessageLevel.ERROR;
|
| + break;
|
| + default:
|
| + Log.w(TAG, "Unknown message level, defaulting to DEBUG");
|
| + break;
|
| + }
|
| +
|
| + return mContentsClient.onConsoleMessage(
|
| + new ConsoleMessage(message, sourceId, lineNumber, messageLevel));
|
| + }
|
| +
|
| + @Override
|
| + public void onUpdateUrl(String url) {
|
| + // TODO: implement
|
| + }
|
| +
|
| + @Override
|
| + public void openNewTab(String url, boolean incognito) {
|
| + // TODO: implement
|
| + }
|
| +
|
| + @Override
|
| + public boolean addNewContents(int nativeSourceWebContents, int nativeWebContents,
|
| + int disposition, Rect initialPosition, boolean userGesture) {
|
| + // TODO: implement
|
| + return false;
|
| + }
|
| +
|
| + @Override
|
| + public void closeContents() {
|
| + mContentsClient.onCloseWindow();
|
| + }
|
| +
|
| + @Override
|
| + public void showRepostFormWarningDialog(final ContentViewCore contentViewCore) {
|
| + // TODO(mkosiba) We should be using something akin to the JsResultReceiver as the
|
| + // callback parameter (instead of ContentViewCore) and implement a way of converting
|
| + // that to a pair of messages.
|
| + final int MSG_CONTINUE_PENDING_RELOAD = 1;
|
| + final int MSG_CANCEL_PENDING_RELOAD = 2;
|
| +
|
| + // TODO(sgurun) Remember the URL to cancel the reload behavior
|
| + // if it is different than the most recent NavigationController entry.
|
| + final Handler handler = new Handler(Looper.getMainLooper()) {
|
| + @Override
|
| + public void handleMessage(Message msg) {
|
| + switch(msg.what) {
|
| + case MSG_CONTINUE_PENDING_RELOAD: {
|
| + contentViewCore.continuePendingReload();
|
| + break;
|
| + }
|
| + case MSG_CANCEL_PENDING_RELOAD: {
|
| + contentViewCore.cancelPendingReload();
|
| + break;
|
| + }
|
| + default:
|
| + throw new IllegalStateException(
|
| + "WebContentsDelegateAdapter: unhandled message " + msg.what);
|
| + }
|
| + }
|
| + };
|
| +
|
| + Message resend = handler.obtainMessage(MSG_CONTINUE_PENDING_RELOAD);
|
| + Message dontResend = handler.obtainMessage(MSG_CANCEL_PENDING_RELOAD);
|
| + mContentsClient.onFormResubmission(dontResend, resend);
|
| + }
|
| +
|
| + @Override
|
| + public boolean addNewContents(boolean isDialog, boolean isUserGesture) {
|
| + return mContentsClient.onCreateWindow(isDialog, isUserGesture);
|
| + }
|
| +
|
| + @Override
|
| + public void activateContents() {
|
| + mContentsClient.onRequestFocus();
|
| + }
|
| +
|
| + @Override
|
| + public void updatePreferredSize(int width, int height) {
|
| + mPreferredSizeChangedListener.updatePreferredSize(width, height);
|
| + }
|
| +}
|
|
|