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