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