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