WebViewChromium.java revision 6b5f3d1546ae2a9c712cde60c54ec027582bc4e6
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.webview.chromium;
18
19import android.content.res.Configuration;
20import android.graphics.Bitmap;
21import android.graphics.Canvas;
22import android.graphics.Paint;
23import android.graphics.Picture;
24import android.graphics.Rect;
25import android.graphics.drawable.Drawable;
26import android.net.http.SslCertificate;
27import android.os.Build;
28import android.os.Bundle;
29import android.os.Message;
30import android.util.Log;
31import android.view.HardwareCanvas;
32import android.view.KeyEvent;
33import android.view.MotionEvent;
34import android.view.View;
35import android.view.View.MeasureSpec;
36import android.view.ViewGroup;
37import android.view.accessibility.AccessibilityEvent;
38import android.view.accessibility.AccessibilityNodeInfo;
39import android.view.inputmethod.EditorInfo;
40import android.view.inputmethod.InputConnection;
41import android.webkit.DownloadListener;
42import android.webkit.FindActionModeCallback;
43import android.webkit.JavascriptInterface;
44import android.webkit.ValueCallback;
45import android.webkit.WebBackForwardList;
46import android.webkit.WebChromeClient;
47import android.webkit.WebSettings;
48import android.webkit.WebView;
49import android.webkit.WebViewClient;
50import android.webkit.WebViewProvider;
51
52import org.chromium.android_webview.AwContents;
53import org.chromium.android_webview.AwNativeWindow;
54import org.chromium.content.browser.ContentViewCore;
55import org.chromium.content.browser.LoadUrlParams;
56import org.chromium.net.NetworkChangeNotifier;
57
58import java.io.BufferedWriter;
59import java.io.File;
60import java.lang.annotation.Annotation;
61import java.util.Map;
62
63/**
64 * This class is the delegate to which WebViewProxy forwards all API calls.
65 *
66 * Most of the actual functionality is implemented by AwContents (or ContentViewCore within
67 * it). This class also contains WebView-specific APIs that require the creation of other
68 * adapters (otherwise org.chromium.content would depend on the webview.chromium package)
69 * and a small set of no-op deprecated APIs.
70 */
71class WebViewChromium implements WebViewProvider,
72          WebViewProvider.ScrollDelegate, WebViewProvider.ViewDelegate {
73
74    private static final String TAG = WebViewChromium.class.getSimpleName();
75
76    // The WebView that this WebViewChromium is the provider for.
77    WebView mWebView;
78    // Lets us access protected View-derived methods on the WebView instance we're backing.
79    WebView.PrivateAccess mWebViewPrivate;
80    // The client adapter class.
81    private WebViewContentsClientAdapter mContentsClientAdapter;
82
83    // Variables for functionality provided by this adapter ---------------------------------------
84    // WebSettings adapter, lazily initialized in the getter
85    private WebSettings mWebSettings;
86    // The WebView wrapper for ContentViewCore and required browser compontents.
87    private AwContents mAwContents;
88    // Non-null if this webview is using the GL accelerated draw path.
89    private DrawGLFunctor mGLfunctor;
90
91    private final WebView.HitTestResult mHitTestResult;
92
93    public WebViewChromium(WebView webView, WebView.PrivateAccess webViewPrivate) {
94        mWebView = webView;
95        mWebViewPrivate = webViewPrivate;
96        mHitTestResult = new WebView.HitTestResult();
97    }
98
99    static void completeWindowCreation(WebView parent, WebView child) {
100        AwContents parentContents = ((WebViewChromium) parent.getWebViewProvider()).mAwContents;
101        AwContents childContents = ((WebViewChromium) child.getWebViewProvider()).mAwContents;
102        parentContents.supplyContentsForPopup(childContents);
103    }
104
105    // WebViewProvider methods --------------------------------------------------------------------
106
107    @Override
108    public void init(Map<String, Object> javaScriptInterfaces, boolean privateBrowsing) {
109        // TODO: BUG=6790250 javaScriptInterfaces were only ever used by DumpRenderTree and should
110        // probably be implemented as a hidden hook in WebViewClassic.
111        if (privateBrowsing) {
112            throw new IllegalArgumentException(
113                    "Private browsing is not supported in this version of the WebView.");
114        }
115
116        final boolean isAccessFromFileURLsGrantedByDefault =
117                mWebView.getContext().getApplicationInfo().targetSdkVersion <
118                Build.VERSION_CODES.JELLY_BEAN;
119        mContentsClientAdapter = new WebViewContentsClientAdapter(mWebView);
120        mAwContents = new AwContents(mWebView, new InternalAccessAdapter(), mContentsClientAdapter,
121                isAccessFromFileURLsGrantedByDefault);
122    }
123
124    @Override
125    public void setHorizontalScrollbarOverlay(boolean overlay) {
126        UnimplementedWebViewApi.invoke();
127    }
128
129    @Override
130    public void setVerticalScrollbarOverlay(boolean overlay) {
131        UnimplementedWebViewApi.invoke();
132    }
133
134    @Override
135    public boolean overlayHorizontalScrollbar() {
136        UnimplementedWebViewApi.invoke();
137        return false;
138    }
139
140    @Override
141    public boolean overlayVerticalScrollbar() {
142        UnimplementedWebViewApi.invoke();
143        return false;
144    }
145
146    @Override
147    public int getVisibleTitleHeight() {
148        // This is deprecated in WebView and should always return 0.
149        return 0;
150    }
151
152    @Override
153    public SslCertificate getCertificate() {
154        return mAwContents.getCertificate();
155    }
156
157    @Override
158    public void setCertificate(SslCertificate certificate) {
159        UnimplementedWebViewApi.invoke();
160    }
161
162    @Override
163    public void savePassword(String host, String username, String password) {
164        // This is a deprecated API: intentional no-op.
165    }
166
167    @Override
168    public void setHttpAuthUsernamePassword(String host, String realm, String username,
169                                            String password) {
170        mAwContents.setHttpAuthUsernamePassword(host, realm, username, password);
171    }
172
173    @Override
174    public String[] getHttpAuthUsernamePassword(String host, String realm) {
175        return mAwContents.getHttpAuthUsernamePassword(host, realm);
176    }
177
178    @Override
179    public void destroy() {
180        mAwContents.destroy();
181        if (mGLfunctor != null) {
182            mGLfunctor.destroy();
183            mGLfunctor = null;
184        }
185    }
186
187    @Override
188    public void setNetworkAvailable(boolean networkUp) {
189        NetworkChangeNotifier.forceConnectivityState(networkUp);
190    }
191
192    @Override
193    public WebBackForwardList saveState(Bundle outState) {
194        if (outState == null) return null;
195        if (!mAwContents.saveState(outState)) return null;
196        return copyBackForwardList();
197    }
198
199    @Override
200    public boolean savePicture(Bundle b, File dest) {
201        UnimplementedWebViewApi.invoke();
202        return false;
203    }
204
205    @Override
206    public boolean restorePicture(Bundle b, File src) {
207        UnimplementedWebViewApi.invoke();
208        return false;
209    }
210
211    @Override
212    public WebBackForwardList restoreState(Bundle inState) {
213        if (inState == null) return null;
214        if (!mAwContents.restoreState(inState)) return null;
215        return copyBackForwardList();
216    }
217
218    @Override
219    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
220        // TODO: We may actually want to do some sanity checks here (like filter about://chrome).
221        LoadUrlParams params = new LoadUrlParams(url);
222        if (additionalHttpHeaders != null) params.setExtraHeaders(additionalHttpHeaders);
223        mAwContents.loadUrl(params);
224    }
225
226    @Override
227    public void loadUrl(String url) {
228        loadUrl(url, null);
229    }
230
231    @Override
232    public void postUrl(String url, byte[] postData) {
233        mAwContents.loadUrl(LoadUrlParams.createLoadHttpPostParams(
234                url, postData));
235    }
236
237    private static boolean isBase64Encoded(String encoding) {
238        return "base64".equals(encoding);
239    }
240
241    @Override
242    public void loadData(String data, String mimeType, String encoding) {
243        mAwContents.loadUrl(LoadUrlParams.createLoadDataParams(
244                  data, mimeType, isBase64Encoded(encoding)));
245    }
246
247    @Override
248    public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding,
249                                    String historyUrl) {
250        if (baseUrl == null || baseUrl.length() == 0) baseUrl = "about:blank";
251        boolean isBase64 = isBase64Encoded(encoding);
252        // For backwards compatibility with WebViewClassic, we use the value of |encoding|
253        // as the charset, as long as it's not "base64".
254        mAwContents.loadUrl(LoadUrlParams.createLoadDataParamsWithBaseUrl(
255                data, mimeType, isBase64, baseUrl, historyUrl, isBase64 ? null : encoding));
256    }
257
258    @Override
259    public void saveWebArchive(String filename) {
260        saveWebArchive(filename, false, null);
261    }
262
263    @Override
264    public void saveWebArchive(String basename, boolean autoname, ValueCallback<String> callback) {
265        mAwContents.saveWebArchive(basename, autoname, callback);
266    }
267
268    @Override
269    public void stopLoading() {
270        mAwContents.getContentViewCore().stopLoading();
271    }
272
273    @Override
274    public void reload() {
275        mAwContents.getContentViewCore().reload();
276    }
277
278    @Override
279    public boolean canGoBack() {
280        return mAwContents.getContentViewCore().canGoBack();
281    }
282
283    @Override
284    public void goBack() {
285        mAwContents.getContentViewCore().goBack();
286    }
287
288    @Override
289    public boolean canGoForward() {
290        return mAwContents.getContentViewCore().canGoForward();
291    }
292
293    @Override
294    public void goForward() {
295        mAwContents.getContentViewCore().goForward();
296    }
297
298    @Override
299    public boolean canGoBackOrForward(int steps) {
300        return mAwContents.getContentViewCore().canGoToOffset(steps);
301    }
302
303    @Override
304    public void goBackOrForward(int steps) {
305        mAwContents.getContentViewCore().goToOffset(steps);
306    }
307
308    @Override
309    public boolean isPrivateBrowsingEnabled() {
310        // Not supported in this WebView implementation.
311        return false;
312    }
313
314    @Override
315    public boolean pageUp(boolean top) {
316        return mAwContents.getContentViewCore().pageUp(top);
317    }
318
319    @Override
320    public boolean pageDown(boolean bottom) {
321        return mAwContents.getContentViewCore().pageDown(bottom);
322    }
323
324    @Override
325    public void clearView() {
326        UnimplementedWebViewApi.invoke();
327    }
328
329    @Override
330    public Picture capturePicture() {
331        return mAwContents.capturePicture();
332    }
333
334    @Override
335    public float getScale() {
336        return mAwContents.getContentViewCore().getScale();
337    }
338
339    @Override
340    public void setInitialScale(int scaleInPercent) {
341        UnimplementedWebViewApi.invoke();
342    }
343
344    @Override
345    public void invokeZoomPicker() {
346        mAwContents.getContentViewCore().invokeZoomPicker();
347    }
348
349    @Override
350    public WebView.HitTestResult getHitTestResult() {
351        AwContents.HitTestData data = mAwContents.getLastHitTestResult();
352        mHitTestResult.setType(data.hitTestResultType);
353        mHitTestResult.setExtra(data.hitTestResultExtraData);
354        return mHitTestResult;
355    }
356
357    @Override
358    public void requestFocusNodeHref(Message hrefMsg) {
359        mAwContents.requestFocusNodeHref(hrefMsg);
360    }
361
362    @Override
363    public void requestImageRef(Message msg) {
364        mAwContents.requestImageRef(msg);
365    }
366
367    @Override
368    public String getUrl() {
369        String url =  mAwContents.getContentViewCore().getUrl();
370        if (url == null || url.trim().isEmpty()) return null;
371        return url;
372    }
373
374    @Override
375    public String getOriginalUrl() {
376        String url =  mAwContents.getOriginalUrl();
377        if (url == null || url.trim().isEmpty()) return null;
378        return url;
379    }
380
381    @Override
382    public String getTitle() {
383        return mAwContents.getContentViewCore().getTitle();
384    }
385
386    @Override
387    public Bitmap getFavicon() {
388        UnimplementedWebViewApi.invoke();
389        return null;
390    }
391
392    @Override
393    public String getTouchIconUrl() {
394        UnimplementedWebViewApi.invoke();
395        return null;
396    }
397
398    @Override
399    public int getProgress() {
400        return mAwContents.getMostRecentProgress();
401    }
402
403    @Override
404    public int getContentHeight() {
405        return mAwContents.getContentHeightCss();
406    }
407
408    @Override
409    public int getContentWidth() {
410        return mAwContents.getContentWidthCss();
411    }
412
413    @Override
414    public void pauseTimers() {
415        mAwContents.pauseTimers();
416    }
417
418    @Override
419    public void resumeTimers() {
420        mAwContents.resumeTimers();
421    }
422
423    @Override
424    public void onPause() {
425        mAwContents.onPause();
426    }
427
428    @Override
429    public void onResume() {
430        mAwContents.onResume();
431    }
432
433    @Override
434    public boolean isPaused() {
435        return mAwContents.isPaused();
436    }
437
438    @Override
439    public void freeMemory() {
440        UnimplementedWebViewApi.invoke();
441    }
442
443    @Override
444    public void clearCache(boolean includeDiskFiles) {
445        mAwContents.clearCache(includeDiskFiles);
446    }
447
448    @Override
449    public void clearFormData() {
450        UnimplementedWebViewApi.invoke();
451    }
452
453    @Override
454    public void clearHistory() {
455        mAwContents.getContentViewCore().clearHistory();
456    }
457
458    @Override
459    public void clearSslPreferences() {
460        mAwContents.getContentViewCore().clearSslPreferences();
461    }
462
463    @Override
464    public WebBackForwardList copyBackForwardList() {
465        return new WebBackForwardListChromium(
466                mAwContents.getContentViewCore().getNavigationHistory());
467    }
468
469    @Override
470    public void setFindListener(WebView.FindListener listener) {
471        mContentsClientAdapter.setFindListener(listener);
472    }
473
474    @Override
475    public void findNext(boolean forwards) {
476        mAwContents.findNext(forwards);
477    }
478
479    @Override
480    public int findAll(String searchString) {
481        return mAwContents.findAllSync(searchString);
482    }
483
484    @Override
485    public void findAllAsync(String searchString) {
486        mAwContents.findAllAsync(searchString);
487    }
488
489    @Override
490    public boolean showFindDialog(String text, boolean showIme) {
491        if (mWebView.getParent() == null) {
492            return false;
493        }
494
495        FindActionModeCallback findAction = new FindActionModeCallback(mWebView.getContext());
496        if (findAction == null) {
497            return false;
498        }
499
500        mWebView.startActionMode(findAction);
501        findAction.setWebView(mWebView);
502        if (showIme) {
503            findAction.showSoftInput();
504        }
505
506        if (text != null) {
507            findAction.setText(text);
508            findAction.findAll();
509        }
510
511        return true;
512    }
513
514    @Override
515    public void notifyFindDialogDismissed() {
516        clearMatches();
517    }
518
519    @Override
520    public void clearMatches() {
521        mAwContents.clearMatches();
522    }
523
524    @Override
525    public void documentHasImages(Message response) {
526        mAwContents.documentHasImages(response);
527    }
528
529    @Override
530    public void setWebViewClient(WebViewClient client) {
531        mContentsClientAdapter.setWebViewClient(client);
532    }
533
534    @Override
535    public void setDownloadListener(DownloadListener listener) {
536        mContentsClientAdapter.setDownloadListener(listener);
537    }
538
539    @Override
540    public void setWebChromeClient(WebChromeClient client) {
541        mContentsClientAdapter.setWebChromeClient(client);
542    }
543
544    @Override
545    public void setPictureListener(WebView.PictureListener listener) {
546        mContentsClientAdapter.setPictureListener(listener);
547        mAwContents.enableOnNewPicture(listener != null,
548                mWebView.getContext().getApplicationInfo().targetSdkVersion >=
549                Build.VERSION_CODES.K);
550    }
551
552    @Override
553    public void addJavascriptInterface(Object obj, String interfaceName) {
554        Class<? extends Annotation> requiredAnnotation = null;
555        if (mWebView.getContext().getApplicationInfo().targetSdkVersion >=
556                Build.VERSION_CODES.JELLY_BEAN_MR1) {
557           requiredAnnotation = JavascriptInterface.class;
558        }
559        mAwContents.getContentViewCore().addPossiblyUnsafeJavascriptInterface(obj, interfaceName,
560            requiredAnnotation);
561    }
562
563    @Override
564    public void removeJavascriptInterface(String interfaceName) {
565        mAwContents.getContentViewCore().removeJavascriptInterface(interfaceName);
566    }
567
568    @Override
569    public WebSettings getSettings() {
570        if (mWebSettings == null) {
571            mWebSettings = new ContentSettingsAdapter(
572                    mAwContents.getContentViewCore().getContentSettings(),
573                    mAwContents.getSettings());
574        }
575        return mWebSettings;
576    }
577
578    @Override
579    public void setMapTrackballToArrowKeys(boolean setMap) {
580        // This is a deprecated API: intentional no-op.
581    }
582
583    @Override
584    public void flingScroll(int vx, int vy) {
585        mAwContents.getContentViewCore().flingScroll(vx, vy);
586    }
587
588    @Override
589    public View getZoomControls() {
590        // This was deprecated in 2009 and hidden in JB MR1, so just provide the minimum needed
591        // to stop very out-dated applications from crashing.
592        Log.w(TAG, "WebView doesn't support getZoomControls");
593        return mAwContents.getContentViewCore().getContentSettings().supportZoom() ?
594            new View(mWebView.getContext()) : null;
595    }
596
597    @Override
598    public boolean canZoomIn() {
599        return mAwContents.getContentViewCore().canZoomIn();
600    }
601
602    @Override
603    public boolean canZoomOut() {
604        return mAwContents.getContentViewCore().canZoomOut();
605    }
606
607    @Override
608    public boolean zoomIn() {
609        return mAwContents.getContentViewCore().zoomIn();
610    }
611
612    @Override
613    public boolean zoomOut() {
614        return mAwContents.getContentViewCore().zoomOut();
615    }
616
617    @Override
618    public void dumpViewHierarchyWithProperties(BufferedWriter out, int level) {
619        UnimplementedWebViewApi.invoke();
620    }
621
622    @Override
623    public View findHierarchyView(String className, int hashCode) {
624        UnimplementedWebViewApi.invoke();
625        return null;
626    }
627
628    // WebViewProvider glue methods ---------------------------------------------------------------
629
630    @Override
631    public WebViewProvider.ViewDelegate getViewDelegate() {
632        return this;
633    }
634
635    @Override
636    public WebViewProvider.ScrollDelegate getScrollDelegate() {
637        return this;
638    }
639
640
641    // WebViewProvider.ViewDelegate implementation ------------------------------------------------
642
643    @Override
644    public boolean shouldDelayChildPressedState() {
645        UnimplementedWebViewApi.invoke();
646        return false;
647    }
648
649    @Override
650    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
651        mAwContents.getContentViewCore().onInitializeAccessibilityNodeInfo(info);
652    }
653
654    @Override
655    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
656        mAwContents.getContentViewCore().onInitializeAccessibilityEvent(event);
657    }
658
659    // TODO: Update WebView to mimic ContentView implementation for the
660    // real View#performAccessibilityAction(int, Bundle).  This method has different behavior.
661    // See ContentViewCore#performAccessibilityAction(int, Bundle) for more details.
662    @Override
663    public boolean performAccessibilityAction(int action, Bundle arguments) {
664        return mAwContents.getContentViewCore().performAccessibilityAction(action, arguments);
665    }
666
667    @Override
668    public void setOverScrollMode(int mode) {
669        UnimplementedWebViewApi.invoke();
670    }
671
672    @Override
673    public void setScrollBarStyle(int style) {
674        UnimplementedWebViewApi.invoke();
675    }
676
677    @Override
678    public void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
679                                        int l, int t, int r, int b) {
680        UnimplementedWebViewApi.invoke();
681    }
682
683    @Override
684    public void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
685        UnimplementedWebViewApi.invoke();
686    }
687
688    @Override
689    public void onWindowVisibilityChanged(int visibility) {
690        mAwContents.onWindowVisibilityChanged(visibility);
691    }
692
693    @Override
694    public void onDraw(Canvas canvas) {
695        if (canvas.isHardwareAccelerated() && mAwContents.onPrepareDrawGL(canvas)) {
696            if (mGLfunctor == null) {
697                mGLfunctor = new DrawGLFunctor(mAwContents.getAwDrawGLViewContext());
698            }
699            mGLfunctor.requestDrawGL((HardwareCanvas) canvas, mWebView.getViewRootImpl());
700        } else {
701            mAwContents.onDraw(canvas);
702        }
703    }
704
705    @Override
706    public void setLayoutParams(ViewGroup.LayoutParams layoutParams) {
707        // TODO: This is the minimum implementation for HTMLViewer
708        // bringup. Likely will need to go up to ContentViewCore for
709        // a complete implementation.
710        mWebViewPrivate.super_setLayoutParams(layoutParams);
711    }
712
713    @Override
714    public boolean performLongClick() {
715        return mWebViewPrivate.super_performLongClick();
716    }
717
718    @Override
719    public void onConfigurationChanged(Configuration newConfig) {
720        mAwContents.onConfigurationChanged(newConfig);
721    }
722
723    @Override
724    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
725        return mAwContents.getContentViewCore().onCreateInputConnection(outAttrs);
726    }
727
728    @Override
729    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
730        UnimplementedWebViewApi.invoke();
731        return false;
732    }
733
734    @Override
735    public boolean onKeyDown(int keyCode, KeyEvent event) {
736        UnimplementedWebViewApi.invoke();
737        return false;
738    }
739
740    @Override
741    public boolean onKeyUp(int keyCode, KeyEvent event) {
742        return mAwContents.getContentViewCore().onKeyUp(keyCode, event);
743    }
744
745    @Override
746    public void onAttachedToWindow() {
747        mAwContents.onAttachedToWindow();
748    }
749
750    @Override
751    public void onDetachedFromWindow() {
752        mAwContents.onDetachedFromWindow();
753        if (mGLfunctor != null) {
754            mGLfunctor.detach();
755        }
756    }
757
758    @Override
759    public void onVisibilityChanged(View changedView, int visibility) {
760        // The AwContents will find out the container view visibility before the first draw so we
761        // can safely ignore onVisibilityChanged callbacks that happen before init().
762        if (mAwContents != null) {
763            mAwContents.onVisibilityChanged(changedView, visibility);
764        }
765    }
766
767    @Override
768    public void onWindowFocusChanged(boolean hasWindowFocus) {
769        mAwContents.onWindowFocusChanged(hasWindowFocus);
770    }
771
772    @Override
773    public void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
774        mAwContents.onFocusChanged(focused, direction, previouslyFocusedRect);
775    }
776
777    @Override
778    public boolean setFrame(int left, int top, int right, int bottom) {
779        // TODO(joth): This is the minimum implementation for initial
780        // bringup. Likely will need to go up to AwContents for a complete
781        // implementation, e.g. setting the compositor visible region (to
782        // avoid painting tiles that are offscreen due to the view's position).
783        return mWebViewPrivate.super_setFrame(left, top, right, bottom);
784    }
785
786    @Override
787    public void onSizeChanged(int w, int h, int ow, int oh) {
788        mAwContents.onSizeChanged(w, h, ow, oh);
789    }
790
791    @Override
792    public void onScrollChanged(int l, int t, int oldl, int oldt) {
793    }
794
795    @Override
796    public boolean dispatchKeyEvent(KeyEvent event) {
797        return mAwContents.getContentViewCore().dispatchKeyEvent(event);
798    }
799
800    @Override
801    public boolean onTouchEvent(MotionEvent ev) {
802        return mAwContents.onTouchEvent(ev);
803    }
804
805    @Override
806    public boolean onHoverEvent(MotionEvent event) {
807        return mAwContents.onHoverEvent(event);
808    }
809
810    @Override
811    public boolean onGenericMotionEvent(MotionEvent event) {
812        return mAwContents.onGenericMotionEvent(event);
813    }
814
815    @Override
816    public boolean onTrackballEvent(MotionEvent ev) {
817        // Trackball event not handled, which eventually gets converted to DPAD keyevents
818        return false;
819    }
820
821    @Override
822    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
823        mAwContents.requestFocus();
824        return mWebViewPrivate.super_requestFocus(direction, previouslyFocusedRect);
825    }
826
827    @Override
828    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
829        mAwContents.onMeasure(widthMeasureSpec, heightMeasureSpec);
830    }
831
832    @Override
833    public boolean requestChildRectangleOnScreen(View child, Rect rect, boolean immediate) {
834        UnimplementedWebViewApi.invoke();
835        return false;
836    }
837
838    @Override
839    public void setBackgroundColor(int color) {
840        UnimplementedWebViewApi.invoke();
841    }
842
843    @Override
844    public void setLayerType(int layerType, Paint paint) {
845        UnimplementedWebViewApi.invoke();
846    }
847
848    @Override
849    public void preDispatchDraw(Canvas canvas) {
850        // TODO(leandrogracia): remove this method from WebViewProvider if we think
851        // we won't need it again.
852    }
853
854    // WebViewProvider.ScrollDelegate implementation ----------------------------------------------
855
856    @Override
857    public int computeHorizontalScrollRange() {
858        return mAwContents.getContentViewCore().computeHorizontalScrollRange();
859    }
860
861    @Override
862    public int computeHorizontalScrollOffset() {
863        return mAwContents.getContentViewCore().computeHorizontalScrollOffset();
864    }
865
866    @Override
867    public int computeVerticalScrollRange() {
868        return mAwContents.getContentViewCore().computeVerticalScrollRange();
869    }
870
871    @Override
872    public int computeVerticalScrollOffset() {
873        return mAwContents.getContentViewCore().computeVerticalScrollOffset();
874    }
875
876    @Override
877    public int computeVerticalScrollExtent() {
878        return mAwContents.getContentViewCore().computeVerticalScrollExtent();
879    }
880
881    @Override
882    public void computeScroll() {
883        // BUG=http://b/6029133
884        UnimplementedWebViewApi.invoke();
885    }
886
887    // AwContents.InternalAccessDelegate implementation --------------------------------------
888    private class InternalAccessAdapter implements AwContents.InternalAccessDelegate {
889        @Override
890        public boolean drawChild(Canvas arg0, View arg1, long arg2) {
891            UnimplementedWebViewApi.invoke();
892            return false;
893        }
894
895        @Override
896        public boolean super_onKeyUp(int arg0, KeyEvent arg1) {
897            UnimplementedWebViewApi.invoke();
898            return false;
899        }
900
901        @Override
902        public boolean super_dispatchKeyEventPreIme(KeyEvent arg0) {
903            UnimplementedWebViewApi.invoke();
904            return false;
905        }
906
907        @Override
908        public boolean super_dispatchKeyEvent(KeyEvent event) {
909            return mWebViewPrivate.super_dispatchKeyEvent(event);
910        }
911
912        @Override
913        public boolean super_onGenericMotionEvent(MotionEvent arg0) {
914            UnimplementedWebViewApi.invoke();
915            return false;
916        }
917
918        @Override
919        public void super_onConfigurationChanged(Configuration arg0) {
920            UnimplementedWebViewApi.invoke();
921        }
922
923        @Override
924        public void onScrollChanged(int l, int t, int oldl, int oldt) {
925            mWebViewPrivate.setScrollXRaw(l);
926            mWebViewPrivate.setScrollYRaw(t);
927            mWebViewPrivate.onScrollChanged(l, t, oldl, oldt);
928        }
929
930        @Override
931        public boolean awakenScrollBars() {
932            mWebViewPrivate.awakenScrollBars(0);
933            // TODO: modify the WebView.PrivateAccess to provide a return value.
934            return true;
935        }
936
937        @Override
938        public boolean super_awakenScrollBars(int arg0, boolean arg1) {
939            // TODO: need method on WebView.PrivateAccess?
940            UnimplementedWebViewApi.invoke();
941            return false;
942        }
943
944        @Override
945        public void setMeasuredDimension(int measuredWidth, int measuredHeight) {
946            mWebViewPrivate.setMeasuredDimension(measuredWidth, measuredHeight);
947        }
948    }
949}
950