// Copyright (c) 2012 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.test; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.Rect; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeProvider; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.widget.FrameLayout; import org.chromium.android_webview.AwContents; import org.chromium.content.browser.ContentViewCore; /** * A View used for testing the AwContents internals. * * This class takes the place android.webkit.WebView would have in the production configuration. */ public class AwTestContainerView extends FrameLayout { private AwContents mAwContents; private AwContents.InternalAccessDelegate mInternalAccessDelegate; public AwTestContainerView(Context context) { super(context); mInternalAccessDelegate = new InternalAccessAdapter(); setOverScrollMode(View.OVER_SCROLL_ALWAYS); } public void initialize(AwContents awContents) { mAwContents = awContents; } public ContentViewCore getContentViewCore() { return mAwContents.getContentViewCore(); } public AwContents getAwContents() { return mAwContents; } public AwContents.InternalAccessDelegate getInternalAccessDelegate() { return mInternalAccessDelegate; } public void destroy() { mAwContents.destroy(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mAwContents.onConfigurationChanged(newConfig); } @Override public void onAttachedToWindow() { super.onAttachedToWindow(); mAwContents.onAttachedToWindow(); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); mAwContents.onDetachedFromWindow(); } @Override public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(focused, direction, previouslyFocusedRect); mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public InputConnection onCreateInputConnection(EditorInfo outAttrs) { return mAwContents.onCreateInputConnection(outAttrs); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mAwContents.onKeyUp(keyCode, event); } @Override public boolean dispatchKeyEvent(KeyEvent event) { return mAwContents.dispatchKeyEvent(event); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public void onSizeChanged(int w, int h, int ow, int oh) { super.onSizeChanged(w, h, ow, oh); mAwContents.onSizeChanged(w, h, ow, oh); } @Override public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { mAwContents.onContainerViewOverScrolled(scrollX, scrollY, clampedX, clampedY); } @Override public void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mAwContents != null) { mAwContents.onContainerViewScrollChanged(l, t, oldl, oldt); } } @Override public void computeScroll() { mAwContents.computeScroll(); } @Override public void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); mAwContents.onVisibilityChanged(changedView, visibility); } @Override public void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); mAwContents.onWindowVisibilityChanged(visibility); } @Override public boolean onTouchEvent(MotionEvent ev) { super.onTouchEvent(ev); return mAwContents.onTouchEvent(ev); } @Override public void onDraw(Canvas canvas) { mAwContents.onDraw(canvas); super.onDraw(canvas); } @Override public AccessibilityNodeProvider getAccessibilityNodeProvider() { AccessibilityNodeProvider provider = mAwContents.getAccessibilityNodeProvider(); return provider == null ? super.getAccessibilityNodeProvider() : provider; } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(AwContents.class.getName()); mAwContents.onInitializeAccessibilityNodeInfo(info); } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(AwContents.class.getName()); mAwContents.onInitializeAccessibilityEvent(event); } @Override public boolean performAccessibilityAction(int action, Bundle arguments) { return mAwContents.performAccessibilityAction(action, arguments); } // TODO: AwContents could define a generic class that holds an implementation similar to // the one below. private class InternalAccessAdapter implements AwContents.InternalAccessDelegate { @Override public boolean drawChild(Canvas canvas, View child, long drawingTime) { return AwTestContainerView.super.drawChild(canvas, child, drawingTime); } @Override public boolean super_onKeyUp(int keyCode, KeyEvent event) { return AwTestContainerView.super.onKeyUp(keyCode, event); } @Override public boolean super_dispatchKeyEventPreIme(KeyEvent event) { return AwTestContainerView.super.dispatchKeyEventPreIme(event); } @Override public boolean super_dispatchKeyEvent(KeyEvent event) { return AwTestContainerView.super.dispatchKeyEvent(event); } @Override public boolean super_onGenericMotionEvent(MotionEvent event) { return AwTestContainerView.super.onGenericMotionEvent(event); } @Override public void super_onConfigurationChanged(Configuration newConfig) { AwTestContainerView.super.onConfigurationChanged(newConfig); } @Override public void super_scrollTo(int scrollX, int scrollY) { // We're intentionally not calling super.scrollTo here to make testing easier. AwTestContainerView.this.scrollTo(scrollX, scrollY); } @Override public void overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { // We're intentionally not calling super.scrollTo here to make testing easier. AwTestContainerView.this.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); } @Override public void onScrollChanged(int l, int t, int oldl, int oldt) { AwTestContainerView.super.onScrollChanged(l, t, oldl, oldt); } @Override public boolean awakenScrollBars() { return AwTestContainerView.super.awakenScrollBars(); } @Override public boolean super_awakenScrollBars(int startDelay, boolean invalidate) { return AwTestContainerView.super.awakenScrollBars(startDelay, invalidate); } @Override public void setMeasuredDimension(int measuredWidth, int measuredHeight) { AwTestContainerView.super.setMeasuredDimension(measuredWidth, measuredHeight); } @Override public int super_getScrollBarStyle() { return AwTestContainerView.super.getScrollBarStyle(); } @Override public boolean requestDrawGL(Canvas canvas) { return false; } } }