blob: f5eefe871c9780ae227e1d3ed7aea083d793f03f [file] [log] [blame]
// 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, String extraHeaders, byte[] postData, int disposition) {
// 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);
}
}