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