Index: content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
diff --git a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
index 679523249b08b25c8a1cf50a9441352dc7952ea9..8d9c66e4913e7dbcb70f356c1bf969a0af14d8e1 100644 |
--- a/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
+++ b/content/public/android/java/src/org/chromium/content/browser/SelectionPopupController.java |
@@ -194,7 +194,11 @@ |
public boolean showActionMode() { |
if (isEmpty()) return false; |
- destroyActionModeAndKeepSelection(); |
+ // Just refreshes the view if it is already showing. |
+ if (isActionModeValid()) { |
+ invalidateActionMode(); |
+ return true; |
+ } |
if (mView.getParent() != null) { |
// On ICS, startActionMode throws an NPE when getParent() is null. |
@@ -289,6 +293,28 @@ |
// Should be nulled out in case #onDestroyActionMode() is not invoked in response. |
mActionMode = null; |
+ } |
+ } |
+ |
+ /** |
+ * @see ActionMode#invalidate() |
+ * Note that invalidation will also reset visibility state. The caller |
+ * should account for this when making subsequent visibility updates. |
+ */ |
+ private void invalidateActionMode() { |
+ if (!isActionModeValid()) return; |
+ if (mHidden) { |
+ assert canHideActionMode(); |
+ mHidden = false; |
+ mView.removeCallbacks(mRepeatingHideRunnable); |
+ mPendingInvalidateContentRect = false; |
+ } |
+ |
+ // Try/catch necessary for framework bug, crbug.com/446717. |
+ try { |
+ mActionMode.invalidate(); |
+ } catch (NullPointerException e) { |
+ Log.w(TAG, "Ignoring NPE from ActionMode.invalidate() as workaround for L", e); |
} |
} |