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