Index: content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
index 3493dfef590fc0fe5740ccf545029b8efa968368..91ea2954f7e6e2d62aa9dc9942abcf4af4626453 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java |
@@ -360,6 +360,11 @@ public class ContentViewCore |
// ResultReceiver in the InputMethodService (IME app) gets gc'ed. |
private ShowKeyboardResultReceiver mShowKeyboardResultReceiver; |
+ // Whether this ContentViewCore has view focus. |
+ private boolean mHasViewFocus; |
+ // Whether this ContentViewCore has window focus. |
+ private boolean mHasWindowFocus; |
+ |
// The list of observers that are notified when ContentViewCore changes its WindowAndroid. |
private final ObserverList<WindowAndroidChangedObserver> mWindowAndroidChangedObservers; |
@@ -665,6 +670,8 @@ public class ContentViewCore |
} |
mContainerView = containerView; |
+ onFocusChangedInternal(getRealWindowFocusedState(), containerView.hasFocus(), |
+ false /* hideKeyboardOnBlur */); |
mContainerView.setClickable(true); |
if (mSelectionPopupController != null) { |
mSelectionPopupController.setContainerView(containerView); |
@@ -680,6 +687,19 @@ public class ContentViewCore |
} |
} |
+ /** |
+ * Note: We don't use View#hasWindowFocus() because it returns incorrect values when the View |
+ * doesn't have View focus. |
+ * @return Whether the containerView actually has Window focus. |
+ */ |
+ private boolean getRealWindowFocusedState() { |
+ int[] states = mContainerView.getDrawableState(); |
+ for (int state : states) { |
+ if ((state & android.R.attr.state_window_focused) != 0) return true; |
+ } |
+ return false; |
+ } |
+ |
@CalledByNative |
private void onNativeContentViewCoreDestroyed(long nativeContentViewCore) { |
assert nativeContentViewCore == mNativeContentViewCore; |
@@ -1329,22 +1349,35 @@ public class ContentViewCore |
* @see View#onWindowFocusChanged(boolean) |
*/ |
public void onWindowFocusChanged(boolean hasWindowFocus) { |
+ if (mHasWindowFocus == hasWindowFocus) return; |
mImeAdapter.onWindowFocusChanged(hasWindowFocus); |
if (!hasWindowFocus) resetGestureDetection(); |
mSelectionPopupController.onWindowFocusChanged(hasWindowFocus); |
for (mGestureStateListenersIterator.rewind(); mGestureStateListenersIterator.hasNext();) { |
mGestureStateListenersIterator.next().onWindowFocusChanged(hasWindowFocus); |
} |
+ onFocusChangedInternal(hasWindowFocus, mHasViewFocus, true /* hideKeyboardOnBlur */); |
+ } |
+ |
+ public void onFocusChanged(boolean hasViewFocus, boolean hideKeyboardOnBlur) { |
+ if (mHasViewFocus == hasViewFocus) return; |
+ onFocusChangedInternal(mHasWindowFocus, hasViewFocus, hideKeyboardOnBlur); |
} |
- public void onFocusChanged(boolean gainFocus, boolean hideKeyboardOnBlur) { |
- mImeAdapter.onViewFocusChanged(gainFocus, hideKeyboardOnBlur); |
+ private void onFocusChangedInternal( |
+ boolean hasWindowFocus, boolean hasViewFocus, boolean hideKeyboardOnBlur) { |
+ boolean hadInputFocus = mHasWindowFocus && mHasViewFocus; |
+ boolean hasInputFocus = hasWindowFocus && hasViewFocus; |
+ mHasWindowFocus = hasWindowFocus; |
+ mHasViewFocus = hasViewFocus; |
+ if (hasInputFocus == hadInputFocus) return; |
+ mImeAdapter.onViewFocusChanged(hasInputFocus, hideKeyboardOnBlur); |
if (mJoystickScrollProvider != null) { |
- mJoystickScrollProvider.setEnabled(gainFocus && !isFocusedNodeEditable()); |
+ mJoystickScrollProvider.setEnabled(hasInputFocus && !isFocusedNodeEditable()); |
} |
- if (gainFocus) { |
+ if (hasInputFocus) { |
restoreSelectionPopupsIfNecessary(); |
} else { |
cancelRequestToScrollFocusedEditableNodeIntoView(); |
@@ -1359,7 +1392,7 @@ public class ContentViewCore |
clearSelection(); |
} |
} |
- if (mNativeContentViewCore != 0) nativeSetFocus(mNativeContentViewCore, gainFocus); |
+ if (mNativeContentViewCore != 0) nativeSetFocus(mNativeContentViewCore, hasInputFocus); |
} |
/** |