Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.content.browser; | 5 package org.chromium.content.browser; |
| 6 | 6 |
| 7 import android.annotation.SuppressLint; | 7 import android.annotation.SuppressLint; |
| 8 import android.annotation.TargetApi; | 8 import android.annotation.TargetApi; |
| 9 import android.app.assist.AssistStructure.ViewNode; | 9 import android.app.assist.AssistStructure.ViewNode; |
| 10 import android.content.ClipData; | 10 import android.content.ClipData; |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 568 assert windowNativePointer != 0; | 568 assert windowNativePointer != 0; |
| 569 | 569 |
| 570 final float dipScale = windowAndroid.getDisplay().getDipScale(); | 570 final float dipScale = windowAndroid.getDisplay().getDipScale(); |
| 571 | 571 |
| 572 mRenderCoordinates.reset(); | 572 mRenderCoordinates.reset(); |
| 573 mRenderCoordinates.setDeviceScaleFactor(dipScale, windowAndroid.getConte xt()); | 573 mRenderCoordinates.setDeviceScaleFactor(dipScale, windowAndroid.getConte xt()); |
| 574 | 574 |
| 575 mJoystickScrollProvider = | 575 mJoystickScrollProvider = |
| 576 new JoystickScrollProvider(webContents, getContainerView(), wind owAndroid); | 576 new JoystickScrollProvider(webContents, getContainerView(), wind owAndroid); |
| 577 | 577 |
| 578 mImeAdapter = createImeAdapter(); | |
| 578 mNativeContentViewCore = nativeInit(webContents, mViewAndroidDelegate, w indowNativePointer, | 579 mNativeContentViewCore = nativeInit(webContents, mViewAndroidDelegate, w indowNativePointer, |
| 579 dipScale, mRetainedJavaScriptObjects); | 580 mImeAdapter.getNativePointer(), dipScale, mRetainedJavaScriptObj ects); |
| 580 mWebContents = nativeGetWebContentsAndroid(mNativeContentViewCore); | 581 mWebContents = nativeGetWebContentsAndroid(mNativeContentViewCore); |
| 581 | 582 |
| 582 setContainerViewInternals(internalDispatcher); | 583 setContainerViewInternals(internalDispatcher); |
| 583 | 584 |
| 584 initPopupZoomer(mContext); | 585 initPopupZoomer(mContext); |
| 585 mImeAdapter = createImeAdapter(); | |
| 586 attachImeAdapter(); | |
| 587 | 586 |
| 588 mSelectionPopupController = new SelectionPopupController(mContext, windo wAndroid, | 587 mSelectionPopupController = new SelectionPopupController(mContext, windo wAndroid, |
| 589 webContents, viewDelegate.getContainerView(), mRenderCoordinates , mImeAdapter); | 588 webContents, viewDelegate.getContainerView(), mRenderCoordinates , mImeAdapter); |
| 590 mSelectionPopupController.setCallback(ActionModeCallbackHelper.EMPTY_CAL LBACK); | 589 mSelectionPopupController.setCallback(ActionModeCallbackHelper.EMPTY_CAL LBACK); |
| 591 mSelectionPopupController.setContainerView(getContainerView()); | 590 mSelectionPopupController.setContainerView(getContainerView()); |
| 592 | 591 |
| 593 mWebContentsObserver = new ContentViewWebContentsObserver(this); | 592 mWebContentsObserver = new ContentViewWebContentsObserver(this); |
| 594 | 593 |
| 595 mShouldRequestUnbufferedDispatch = Build.VERSION.SDK_INT >= Build.VERSIO N_CODES.LOLLIPOP | 594 mShouldRequestUnbufferedDispatch = Build.VERSION.SDK_INT >= Build.VERSIO N_CODES.LOLLIPOP |
| 596 && ContentFeatureList.isEnabled(ContentFeatureList.REQUEST_UNBUF FERED_DISPATCH); | 595 && ContentFeatureList.isEnabled(ContentFeatureList.REQUEST_UNBUF FERED_DISPATCH); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 764 @VisibleForTesting | 763 @VisibleForTesting |
| 765 public void setPopupZoomerForTest(PopupZoomer popupZoomer) { | 764 public void setPopupZoomerForTest(PopupZoomer popupZoomer) { |
| 766 mPopupZoomer = popupZoomer; | 765 mPopupZoomer = popupZoomer; |
| 767 } | 766 } |
| 768 | 767 |
| 769 /** | 768 /** |
| 770 * Destroy the internal state of the ContentView. This method may only be | 769 * Destroy the internal state of the ContentView. This method may only be |
| 771 * called after the ContentView has been removed from the view system. No | 770 * called after the ContentView has been removed from the view system. No |
| 772 * other methods may be called on this ContentView after this method has | 771 * other methods may be called on this ContentView after this method has |
| 773 * been called. | 772 * been called. |
| 774 * Warning: destroy() is not guranteed to be called in Android WebView. | 773 * Warning: destroy() is not guranteed to be called in Android WebView. |
|
boliu
2017/03/22 16:55:02
this will leak on webview
Jinsuk Kim
2017/03/23 01:17:49
Moved it to |onNativeContentViewCoreDestroyed()|
| |
| 775 * Any object that relies solely on destroy() being called to be cleaned up | 774 * Any object that relies solely on destroy() being called to be cleaned up |
| 776 * will leak in Android WebView. If appropriate, consider clean up in | 775 * will leak in Android WebView. If appropriate, consider clean up in |
| 777 * onDetachedFromWindow() which is guaranteed to be called in Android WebVie w. | 776 * onDetachedFromWindow() which is guaranteed to be called in Android WebVie w. |
| 778 */ | 777 */ |
| 779 public void destroy() { | 778 public void destroy() { |
| 780 removeDisplayAndroidObserver(); | 779 removeDisplayAndroidObserver(); |
| 781 if (mNativeContentViewCore != 0) { | 780 if (mNativeContentViewCore != 0) { |
| 782 nativeOnJavaContentViewCoreDestroyed(mNativeContentViewCore); | 781 nativeOnJavaContentViewCoreDestroyed(mNativeContentViewCore); |
| 783 } | 782 } |
| 784 mWebContentsObserver.destroy(); | 783 mWebContentsObserver.destroy(); |
| 785 mWebContentsObserver = null; | 784 mWebContentsObserver = null; |
| 786 mImeAdapter.resetAndHideKeyboard(); | 785 mImeAdapter.destroy(); |
| 786 | |
| 787 // TODO(igsolla): address TODO in ContentViewClient because ContentViewC lient is not | 787 // TODO(igsolla): address TODO in ContentViewClient because ContentViewC lient is not |
| 788 // currently a real Null Object. | 788 // currently a real Null Object. |
| 789 // | 789 // |
| 790 // Instead of deleting the client we use the Null Object pattern to avoi d null checks | 790 // Instead of deleting the client we use the Null Object pattern to avoi d null checks |
| 791 // in this class. | 791 // in this class. |
| 792 mContentViewClient = new ContentViewClient(); | 792 mContentViewClient = new ContentViewClient(); |
| 793 mWebContents = null; | 793 mWebContents = null; |
| 794 mNativeContentViewCore = 0; | 794 mNativeContentViewCore = 0; |
| 795 mJavaScriptInterfaces.clear(); | 795 mJavaScriptInterfaces.clear(); |
| 796 mRetainedJavaScriptObjects.clear(); | 796 mRetainedJavaScriptObjects.clear(); |
| (...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1745 } | 1745 } |
| 1746 | 1746 |
| 1747 mImeAdapter.onUpdateFrameInfo(mRenderCoordinates, hasInsertionMarker, | 1747 mImeAdapter.onUpdateFrameInfo(mRenderCoordinates, hasInsertionMarker, |
| 1748 isInsertionMarkerVisible, insertionMarkerHorizontal, insertionMa rkerTop, | 1748 isInsertionMarkerVisible, insertionMarkerHorizontal, insertionMa rkerTop, |
| 1749 insertionMarkerBottom); | 1749 insertionMarkerBottom); |
| 1750 | 1750 |
| 1751 TraceEvent.end("ContentViewCore:updateFrameInfo"); | 1751 TraceEvent.end("ContentViewCore:updateFrameInfo"); |
| 1752 } | 1752 } |
| 1753 | 1753 |
| 1754 @CalledByNative | 1754 @CalledByNative |
| 1755 private void updateImeAdapter(long nativeImeAdapterAndroid, int textInputTyp e, | 1755 private void updateImeAdapter(int textInputType, int textInputFlags, int tex tInputMode, |
| 1756 int textInputFlags, int textInputMode, String text, int selectionSta rt, | 1756 String text, int selectionStart, int selectionEnd, int compositionSt art, |
| 1757 int selectionEnd, int compositionStart, int compositionEnd, boolean showImeIfNeeded, | 1757 int compositionEnd, boolean showImeIfNeeded, boolean replyToRequest) { |
| 1758 boolean replyToRequest) { | |
| 1759 try { | 1758 try { |
| 1760 TraceEvent.begin("ContentViewCore.updateImeAdapter"); | 1759 TraceEvent.begin("ContentViewCore.updateImeAdapter"); |
| 1761 boolean focusedNodeEditable = (textInputType != TextInputType.NONE); | 1760 boolean focusedNodeEditable = (textInputType != TextInputType.NONE); |
| 1762 boolean focusedNodeIsPassword = (textInputType == TextInputType.PASS WORD); | 1761 boolean focusedNodeIsPassword = (textInputType == TextInputType.PASS WORD); |
| 1763 | 1762 |
| 1764 mImeAdapter.attach(nativeImeAdapterAndroid); | |
| 1765 mImeAdapter.updateState(textInputType, textInputFlags, textInputMode , showImeIfNeeded, | 1763 mImeAdapter.updateState(textInputType, textInputFlags, textInputMode , showImeIfNeeded, |
| 1766 text, selectionStart, selectionEnd, compositionStart, compos itionEnd, | 1764 text, selectionStart, selectionEnd, compositionStart, compos itionEnd, |
| 1767 replyToRequest); | 1765 replyToRequest); |
| 1768 | 1766 |
| 1769 boolean editableToggled = (focusedNodeEditable != isFocusedNodeEdita ble()); | 1767 boolean editableToggled = (focusedNodeEditable != isFocusedNodeEdita ble()); |
| 1770 mSelectionPopupController.updateSelectionState(focusedNodeEditable, | 1768 mSelectionPopupController.updateSelectionState(focusedNodeEditable, |
| 1771 focusedNodeIsPassword); | 1769 focusedNodeIsPassword); |
| 1772 if (editableToggled) { | 1770 if (editableToggled) { |
| 1773 mJoystickScrollProvider.setEnabled(!focusedNodeEditable); | 1771 mJoystickScrollProvider.setEnabled(!focusedNodeEditable); |
| 1774 getContentViewClient().onFocusedNodeEditabilityChanged(focusedNo deEditable); | 1772 getContentViewClient().onFocusedNodeEditabilityChanged(focusedNo deEditable); |
| 1775 } | 1773 } |
| 1776 } finally { | 1774 } finally { |
| 1777 TraceEvent.end("ContentViewCore.updateImeAdapter"); | 1775 TraceEvent.end("ContentViewCore.updateImeAdapter"); |
| 1778 } | 1776 } |
| 1779 } | 1777 } |
| 1780 | 1778 |
| 1781 @CalledByNative | |
| 1782 private void forceUpdateImeAdapter(long nativeImeAdapterAndroid) { | |
| 1783 mImeAdapter.attach(nativeImeAdapterAndroid); | |
| 1784 } | |
| 1785 | |
| 1786 /** | 1779 /** |
| 1787 * Called (from native) when the <select> popup needs to be shown. | 1780 * Called (from native) when the <select> popup needs to be shown. |
| 1788 * @param anchorView View anchored for popup. | 1781 * @param anchorView View anchored for popup. |
| 1789 * @param nativeSelectPopupSourceFrame The native RenderFrameHost that owns the popup. | 1782 * @param nativeSelectPopupSourceFrame The native RenderFrameHost that owns the popup. |
| 1790 * @param items Items to show. | 1783 * @param items Items to show. |
| 1791 * @param enabled POPUP_ITEM_TYPEs for items. | 1784 * @param enabled POPUP_ITEM_TYPEs for items. |
| 1792 * @param multiple Whether the popup menu should support multi-select . | 1785 * @param multiple Whether the popup menu should support multi-select . |
| 1793 * @param selectedIndices Indices of selected items. | 1786 * @param selectedIndices Indices of selected items. |
| 1794 */ | 1787 */ |
| 1795 @SuppressWarnings("unused") | 1788 @SuppressWarnings("unused") |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1890 } | 1883 } |
| 1891 | 1884 |
| 1892 private boolean canPaste() { | 1885 private boolean canPaste() { |
| 1893 return ((ClipboardManager) mContext.getSystemService( | 1886 return ((ClipboardManager) mContext.getSystemService( |
| 1894 Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); | 1887 Context.CLIPBOARD_SERVICE)).hasPrimaryClip(); |
| 1895 } | 1888 } |
| 1896 | 1889 |
| 1897 @SuppressWarnings("unused") | 1890 @SuppressWarnings("unused") |
| 1898 @CalledByNative | 1891 @CalledByNative |
| 1899 private void onRenderProcessChange() { | 1892 private void onRenderProcessChange() { |
| 1900 attachImeAdapter(); | |
| 1901 // Immediately sync closed caption settings to the new render process. | 1893 // Immediately sync closed caption settings to the new render process. |
| 1902 mSystemCaptioningBridge.syncToListener(this); | 1894 mSystemCaptioningBridge.syncToListener(this); |
| 1903 } | 1895 } |
| 1904 | 1896 |
| 1905 /** | 1897 /** |
| 1906 * Attaches the native ImeAdapter object to the java ImeAdapter to allow com munication via JNI. | |
| 1907 */ | |
| 1908 public void attachImeAdapter() { | |
| 1909 if (mImeAdapter != null && mNativeContentViewCore != 0) { | |
| 1910 mImeAdapter.attach(nativeGetNativeImeAdapter(mNativeContentViewCore) ); | |
| 1911 } | |
| 1912 } | |
| 1913 | |
| 1914 /** | |
| 1915 * @see View#hasFocus() | 1898 * @see View#hasFocus() |
| 1916 */ | 1899 */ |
| 1917 @CalledByNative | 1900 @CalledByNative |
| 1918 private boolean hasFocus() { | 1901 private boolean hasFocus() { |
| 1919 // If the container view is not focusable, we consider it always focused from | 1902 // If the container view is not focusable, we consider it always focused from |
| 1920 // Chromium's point of view. | 1903 // Chromium's point of view. |
| 1921 if (!mContainerView.isFocusable()) return true; | 1904 if (!mContainerView.isFocusable()) return true; |
| 1922 return mContainerView.hasFocus(); | 1905 return mContainerView.hasFocus(); |
| 1923 } | 1906 } |
| 1924 | 1907 |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2583 @VisibleForTesting | 2566 @VisibleForTesting |
| 2584 public ResultReceiver getNewShowKeyboardReceiver() { | 2567 public ResultReceiver getNewShowKeyboardReceiver() { |
| 2585 if (mShowKeyboardResultReceiver == null) { | 2568 if (mShowKeyboardResultReceiver == null) { |
| 2586 // Note: the returned object will get leaked by Android framework. | 2569 // Note: the returned object will get leaked by Android framework. |
| 2587 mShowKeyboardResultReceiver = new ShowKeyboardResultReceiver(this, n ew Handler()); | 2570 mShowKeyboardResultReceiver = new ShowKeyboardResultReceiver(this, n ew Handler()); |
| 2588 } | 2571 } |
| 2589 return mShowKeyboardResultReceiver; | 2572 return mShowKeyboardResultReceiver; |
| 2590 } | 2573 } |
| 2591 | 2574 |
| 2592 private native long nativeInit(WebContents webContents, ViewAndroidDelegate viewAndroidDelegate, | 2575 private native long nativeInit(WebContents webContents, ViewAndroidDelegate viewAndroidDelegate, |
| 2593 long windowAndroidPtr, float dipScale, HashSet<Object> retainedObjec tSet); | 2576 long windowAndroidPtr, long imeAdapterPtr, float dipScale, |
| 2577 HashSet<Object> retainedObjectSet); | |
| 2594 private static native ContentViewCore nativeFromWebContentsAndroid(WebConten ts webContents); | 2578 private static native ContentViewCore nativeFromWebContentsAndroid(WebConten ts webContents); |
| 2595 | 2579 |
| 2596 private native void nativeUpdateWindowAndroid( | 2580 private native void nativeUpdateWindowAndroid( |
| 2597 long nativeContentViewCoreImpl, long windowAndroidPtr); | 2581 long nativeContentViewCoreImpl, long windowAndroidPtr); |
| 2598 private native WebContents nativeGetWebContentsAndroid(long nativeContentVie wCoreImpl); | 2582 private native WebContents nativeGetWebContentsAndroid(long nativeContentVie wCoreImpl); |
| 2599 private native WindowAndroid nativeGetJavaWindowAndroid(long nativeContentVi ewCoreImpl); | 2583 private native WindowAndroid nativeGetJavaWindowAndroid(long nativeContentVi ewCoreImpl); |
| 2600 | 2584 |
| 2601 private native void nativeOnJavaContentViewCoreDestroyed(long nativeContentV iewCoreImpl); | 2585 private native void nativeOnJavaContentViewCoreDestroyed(long nativeContentV iewCoreImpl); |
| 2602 | 2586 |
| 2603 private native void nativeSetFocus(long nativeContentViewCoreImpl, boolean f ocused); | 2587 private native void nativeSetFocus(long nativeContentViewCoreImpl, boolean f ocused); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2648 | 2632 |
| 2649 private native void nativeSetDoubleTapSupportEnabled( | 2633 private native void nativeSetDoubleTapSupportEnabled( |
| 2650 long nativeContentViewCoreImpl, boolean enabled); | 2634 long nativeContentViewCoreImpl, boolean enabled); |
| 2651 | 2635 |
| 2652 private native void nativeSetMultiTouchZoomSupportEnabled( | 2636 private native void nativeSetMultiTouchZoomSupportEnabled( |
| 2653 long nativeContentViewCoreImpl, boolean enabled); | 2637 long nativeContentViewCoreImpl, boolean enabled); |
| 2654 | 2638 |
| 2655 private native void nativeSelectPopupMenuItems(long nativeContentViewCoreImp l, | 2639 private native void nativeSelectPopupMenuItems(long nativeContentViewCoreImp l, |
| 2656 long nativeSelectPopupSourceFrame, int[] indices); | 2640 long nativeSelectPopupSourceFrame, int[] indices); |
| 2657 | 2641 |
| 2658 | |
| 2659 private native long nativeGetNativeImeAdapter(long nativeContentViewCoreImpl ); | |
| 2660 | |
| 2661 private native int nativeGetCurrentRenderProcessId(long nativeContentViewCor eImpl); | 2642 private native int nativeGetCurrentRenderProcessId(long nativeContentViewCor eImpl); |
| 2662 | 2643 |
| 2663 private native void nativeSetAllowJavascriptInterfacesInspection( | 2644 private native void nativeSetAllowJavascriptInterfacesInspection( |
| 2664 long nativeContentViewCoreImpl, boolean allow); | 2645 long nativeContentViewCoreImpl, boolean allow); |
| 2665 | 2646 |
| 2666 private native void nativeAddJavascriptInterface(long nativeContentViewCoreI mpl, Object object, | 2647 private native void nativeAddJavascriptInterface(long nativeContentViewCoreI mpl, Object object, |
| 2667 String name, Class requiredAnnotation); | 2648 String name, Class requiredAnnotation); |
| 2668 | 2649 |
| 2669 private native void nativeRemoveJavascriptInterface(long nativeContentViewCo reImpl, | 2650 private native void nativeRemoveJavascriptInterface(long nativeContentViewCo reImpl, |
| 2670 String name); | 2651 String name); |
| 2671 | 2652 |
| 2672 private native void nativeWasResized(long nativeContentViewCoreImpl); | 2653 private native void nativeWasResized(long nativeContentViewCoreImpl); |
| 2673 | 2654 |
| 2674 private native void nativeSetAccessibilityEnabled( | 2655 private native void nativeSetAccessibilityEnabled( |
| 2675 long nativeContentViewCoreImpl, boolean enabled); | 2656 long nativeContentViewCoreImpl, boolean enabled); |
| 2676 | 2657 |
| 2677 private native void nativeSetTextTrackSettings(long nativeContentViewCoreImp l, | 2658 private native void nativeSetTextTrackSettings(long nativeContentViewCoreImp l, |
| 2678 boolean textTracksEnabled, String textTrackBackgroundColor, String t extTrackFontFamily, | 2659 boolean textTracksEnabled, String textTrackBackgroundColor, String t extTrackFontFamily, |
| 2679 String textTrackFontStyle, String textTrackFontVariant, String textT rackTextColor, | 2660 String textTrackFontStyle, String textTrackFontVariant, String textT rackTextColor, |
| 2680 String textTrackTextShadow, String textTrackTextSize); | 2661 String textTrackTextShadow, String textTrackTextSize); |
| 2681 | 2662 |
| 2682 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque); | 2663 private native void nativeSetBackgroundOpaque(long nativeContentViewCoreImpl , boolean opaque); |
| 2683 private native boolean nativeIsTouchDragDropEnabled(long nativeContentViewCo reImpl); | 2664 private native boolean nativeIsTouchDragDropEnabled(long nativeContentViewCo reImpl); |
| 2684 private native void nativeOnDragEvent(long nativeContentViewCoreImpl, int ac tion, int x, int y, | 2665 private native void nativeOnDragEvent(long nativeContentViewCoreImpl, int ac tion, int x, int y, |
| 2685 int screenX, int screenY, String[] mimeTypes, String content); | 2666 int screenX, int screenY, String[] mimeTypes, String content); |
| 2686 } | 2667 } |
| OLD | NEW |