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