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