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