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