| 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
 | 
| index da09a1a3eb0c9816f9cd5e5e638c42e7f5df459b..7e3512d7ec64f28b71cf73d941ba2f3540d9a5f6 100644
 | 
| --- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
 | 
| +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsDelegateAdapter.java
 | 
| @@ -10,6 +10,7 @@ import android.os.Looper;
 | 
|  import android.os.Message;
 | 
|  import android.util.Log;
 | 
|  import android.view.KeyEvent;
 | 
| +import android.view.View;
 | 
|  import android.webkit.ConsoleMessage;
 | 
|  import android.webkit.ValueCallback;
 | 
|  
 | 
| @@ -37,11 +38,14 @@ class AwWebContentsDelegateAdapter extends AwWebContentsDelegate {
 | 
|  
 | 
|      final AwContentsClient mContentsClient;
 | 
|      final PreferredSizeChangedListener mPreferredSizeChangedListener;
 | 
| +    final View mContainerView;
 | 
|  
 | 
|      public AwWebContentsDelegateAdapter(AwContentsClient contentsClient,
 | 
| -            PreferredSizeChangedListener preferredSizeChangedListener) {
 | 
| +            PreferredSizeChangedListener preferredSizeChangedListener,
 | 
| +            View containerView) {
 | 
|          mContentsClient = contentsClient;
 | 
|          mPreferredSizeChangedListener = preferredSizeChangedListener;
 | 
| +        mContainerView = containerView;
 | 
|      }
 | 
|  
 | 
|      @Override
 | 
| @@ -51,10 +55,46 @@ class AwWebContentsDelegateAdapter extends AwWebContentsDelegate {
 | 
|  
 | 
|      @Override
 | 
|      public void handleKeyboardEvent(KeyEvent event) {
 | 
| +        if (event.getAction() == KeyEvent.ACTION_DOWN) {
 | 
| +            int direction;
 | 
| +            switch (event.getKeyCode()) {
 | 
| +                case KeyEvent.KEYCODE_DPAD_DOWN:
 | 
| +                    direction = View.FOCUS_DOWN;
 | 
| +                    break;
 | 
| +                case KeyEvent.KEYCODE_DPAD_UP:
 | 
| +                    direction = View.FOCUS_UP;
 | 
| +                    break;
 | 
| +                case KeyEvent.KEYCODE_DPAD_LEFT:
 | 
| +                    direction = View.FOCUS_LEFT;
 | 
| +                    break;
 | 
| +                case KeyEvent.KEYCODE_DPAD_RIGHT:
 | 
| +                    direction = View.FOCUS_RIGHT;
 | 
| +                    break;
 | 
| +                default:
 | 
| +                    direction = 0;
 | 
| +                    break;
 | 
| +            }
 | 
| +            if (direction != 0 && tryToMoveFocus(direction)) return;
 | 
| +        }
 | 
|          mContentsClient.onUnhandledKeyEvent(event);
 | 
|      }
 | 
|  
 | 
|      @Override
 | 
| +    public boolean takeFocus(boolean reverse) {
 | 
| +        int direction =
 | 
| +            (reverse == (mContainerView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL)) ?
 | 
| +            View.FOCUS_RIGHT : View.FOCUS_LEFT;
 | 
| +        if (tryToMoveFocus(direction)) return true;
 | 
| +        direction = reverse ? View.FOCUS_UP : View.FOCUS_DOWN;
 | 
| +        return tryToMoveFocus(direction);
 | 
| +    }
 | 
| +
 | 
| +    private boolean tryToMoveFocus(int direction) {
 | 
| +        View focus = mContainerView.focusSearch(direction);
 | 
| +        return focus != null && focus != mContainerView && focus.requestFocus();
 | 
| +    }
 | 
| +
 | 
| +    @Override
 | 
|      public boolean addMessageToConsole(int level, String message, int lineNumber,
 | 
|              String sourceId) {
 | 
|          ConsoleMessage.MessageLevel messageLevel = ConsoleMessage.MessageLevel.DEBUG;
 | 
| 
 |