Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2059)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java

Issue 1403813003: [Contextual Search] Fixes ContentView regressions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
index 9c9cbc55762a8e7191073c1cf8d2ded0d5830495..5d5a4216b1e141e82d24a66ad82b4738c30c789c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -8,6 +8,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.WebContentsFactory;
+import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
import org.chromium.chrome.browser.externalnav.ExternalNavigationHandler;
import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
import org.chromium.components.navigation_interception.NavigationParams;
@@ -50,12 +51,25 @@ public class OverlayPanelContent {
private WebContentsObserver mWebContentsObserver;
/**
- * If the ContentViewCore has loaded a URL.
+ * Whether the ContentViewCore has started loading a URL.
*/
- private boolean mDidLoadAnyUrl;
+ private boolean mDidStartLoadingUrl;
/**
- * If the content view is currently being displayed.
+ * Whether the ContentViewCore is processing a pending navigation.
+ * NOTE(pedrosimonetti): This is being used to prevent redirections on the SERP to
+ * interpreted as a regular navigation, which should cause the Contextual Search Panel
+ * to be promoted as a Tab. This was added to work around a server bug that has been fixed.
+ * Just checking for whether the Content has been touched is enough to determine whether a
+ * navigation should be promoted (assuming it was caused by the touch), as done in
+ * {@link ContextualSearchManager#shouldPromoteSearchNavigation()}.
+ * For more details, see crbug.com/441048
+ * TODO(pedrosimonetti): remove this from M48 or move it to Contextual Search Panel.
+ */
+ private boolean mIsProcessingPendingNavigation;
+
+ /**
+ * Whether the content view is currently being displayed.
*/
private boolean mIsContentViewShowing;
@@ -65,9 +79,9 @@ public class OverlayPanelContent {
private ContentViewClient mContentViewClient;
/**
- * The observer used by this object to inform inplementers of different events.
+ * The observer used by this object to inform implementers of different events.
*/
- private OverlayContentDelegate mOverlayObserver;
+ private OverlayContentDelegate mContentDelegate;
/**
* Used to observe progress bar events.
@@ -92,7 +106,7 @@ public class OverlayPanelContent {
public boolean shouldIgnoreNavigation(NavigationParams navigationParams) {
// TODO(mdjones): Rather than passing the two navigation params, instead consider
// passing a boolean to make this API simpler.
- return !mOverlayObserver.shouldInterceptNavigation(mExternalNavHandler,
+ return !mContentDelegate.shouldInterceptNavigation(mExternalNavHandler,
navigationParams);
}
}
@@ -102,15 +116,15 @@ public class OverlayPanelContent {
// ============================================================================================
/**
- * @param overlayObserver An observer for events that occur on this content. If null is passed
+ * @param contentDelegate An observer for events that occur on this content. If null is passed
* for this parameter, the default one will be used.
- * @param progresObserver An observer for progress related events.
+ * @param progressObserver An observer for progress related events.
* @param activity The ChromeActivity that contains this object.
*/
- public OverlayPanelContent(OverlayContentDelegate overlayObserver,
+ public OverlayPanelContent(OverlayContentDelegate contentDelegate,
OverlayContentProgressObserver progressObserver, ChromeActivity activity) {
mNativeOverlayPanelContentPtr = nativeInit();
- mOverlayObserver = overlayObserver;
+ mContentDelegate = contentDelegate;
mProgressObserver = progressObserver;
mActivity = activity;
@@ -135,39 +149,23 @@ public class OverlayPanelContent {
};
}
- /**
- * Create a largely empty OverlayPanelContent for testing.
- */
- @VisibleForTesting
- public OverlayPanelContent() {
- // NOTE(mdjones): This constructor is intentionally sparse for testing.
- mWebContentsDelegate = null;
- }
-
// ============================================================================================
// ContentViewCore related
// ============================================================================================
/**
- * @param observer The OverlayContentDelegate to use.
- */
- @VisibleForTesting
- public void setOverlayObserver(OverlayContentDelegate observer) {
- mOverlayObserver = observer;
- }
-
- /**
* Create a new ContentViewCore that will be managed by this panel.
- * TODO(mdjones): Make this private and create a new instance of this class per request.
*/
- public void createNewContentView() {
- // If the ContentViewCore has already been created, but never used,
- // then there's no need to create a new one.
- if (mContentViewCore != null && !mDidLoadAnyUrl) {
- return;
+ private void createNewContentView() {
+ if (mContentViewCore != null) {
+ // If the ContentViewCore has already been created, but never used,
+ // then there's no need to create a new one.
+ if (!mDidStartLoadingUrl) return;
+
+ destroyContentView();
}
- destroyContentView();
+ System.out.println("ctxs --- OverlayPanelContent.createNewContentView");
mContentViewCore = new ContentViewCore(mActivity);
if (mContentViewClient == null) {
@@ -189,7 +187,7 @@ public class OverlayPanelContent {
new WebContentsObserver(mContentViewCore.getWebContents()) {
@Override
public void didStartLoading(String url) {
- mOverlayObserver.onContentLoadStarted(url);
+ mContentDelegate.onContentLoadStarted(url);
}
@Override
@@ -197,7 +195,7 @@ public class OverlayPanelContent {
boolean isMainFrame, String validatedUrl, boolean isErrorPage,
boolean isIframeSrcdoc) {
if (isMainFrame) {
- mOverlayObserver.onMainFrameLoadStarted(validatedUrl);
+ mContentDelegate.onMainFrameLoadStarted(validatedUrl);
}
}
@@ -205,17 +203,15 @@ public class OverlayPanelContent {
public void didNavigateMainFrame(String url, String baseUrl,
boolean isNavigationToDifferentPage, boolean isNavigationInPage,
int httpResultCode) {
- // TODO(mdjones): Instead of tracking this, create a new instance of this
- // class per request.
- mDidLoadAnyUrl = false;
- mOverlayObserver.onMainFrameNavigation(url,
+ mIsProcessingPendingNavigation = false;
+ mContentDelegate.onMainFrameNavigation(url,
isHttpFailureCode(httpResultCode));
}
@Override
public void didFinishLoad(long frameId, String validatedUrl,
boolean isMainFrame) {
- mOverlayObserver.onContentLoadFinished();
+ mContentDelegate.onContentLoadFinished();
}
};
@@ -223,15 +219,15 @@ public class OverlayPanelContent {
nativeSetInterceptNavigationDelegate(mNativeOverlayPanelContentPtr,
mInterceptNavigationDelegate, mContentViewCore.getWebContents());
- mOverlayObserver.onContentViewCreated(mContentViewCore);
+ mContentDelegate.onContentViewCreated(mContentViewCore);
}
/**
* Destroy this panel's ContentViewCore.
- * TODO(mdjones): Make this private.
*/
- public void destroyContentView() {
+ private void destroyContentView() {
if (mContentViewCore != null) {
+ System.out.println("ctxs --- OverlayPanelContent.destroyContentView");
nativeDestroyWebContents(mNativeOverlayPanelContentPtr);
mContentViewCore.getWebContents().destroy();
mContentViewCore.destroy();
@@ -241,21 +237,22 @@ public class OverlayPanelContent {
mWebContentsObserver = null;
}
- mOverlayObserver.onContentViewDestroyed();
- }
+ mDidStartLoadingUrl = false;
+ mIsProcessingPendingNavigation = false;
- // This should be called last here. The setSearchContentViewVisibility method
- // will change the visibility the SearchContentView but also set the value of the
- // internal property mIsSearchContentViewShowing. If we call this after deleting
- // the SearchContentView, it will be faster, because only the internal property
- // will be changed, since there will be no need to change the visibility of the
- // SearchContentView.
- //
- // Also, this should be called outside the block above because tests will not
- // create a ContentView, therefore if this call is placed inside the block,
- // it will not be called on tests, which will cause some tests to fail.
- setVisibility(false);
+ setVisibility(false);
+ // After everything has been disposed, notify the observer.
+ mContentDelegate.onContentViewDestroyed();
+ }
+ }
+
+ /**
+ * @return Whether the ContentViewCore was created.
+ */
+ @VisibleForTesting
+ public boolean didCreateContentView() {
+ return mContentViewCore != null;
}
/**
@@ -263,16 +260,25 @@ public class OverlayPanelContent {
* @param url The URL that should be loaded.
*/
public void loadUrl(String url) {
+ System.out.println("ctxs --- OverlayPanelContent.loadUrl");
createNewContentView();
if (mContentViewCore != null && mContentViewCore.getWebContents() != null) {
- mDidLoadAnyUrl = true;
+ mDidStartLoadingUrl = true;
+ mIsProcessingPendingNavigation = true;
mContentViewCore.getWebContents().getNavigationController().loadUrl(
new LoadUrlParams(url));
- mContentViewCore.onShow();
}
}
+ /**
+ * Notifies that the Panel has been touched. Calling this method will turn the Content
+ * visible, causing it to be rendered.
+ */
+ public void notifyPanelTouched() {
+ setVisibility(true);
+ }
+
// ============================================================================================
// Utilities
// ============================================================================================
@@ -292,10 +298,10 @@ public class OverlayPanelContent {
}
/**
- * @return true if the panel loaded a URL.
+ * @return Whether a pending navigation if being processed.
*/
- public boolean didLoadAnyUrl() {
- return mDidLoadAnyUrl;
+ public boolean isProcessingPendingNavigation() {
+ return mIsProcessingPendingNavigation;
}
/**
@@ -319,7 +325,7 @@ public class OverlayPanelContent {
* Sets the visibility of the Search Content View.
* @param isVisible True to make it visible.
*/
- public void setVisibility(boolean isVisible) {
+ private void setVisibility(boolean isVisible) {
if (mIsContentViewShowing == isVisible) return;
mIsContentViewShowing = isVisible;
@@ -330,14 +336,20 @@ public class OverlayPanelContent {
if (mContentViewCore == null) {
createNewContentView();
}
+
+ // NOTE(pedrosimonetti): Calling onShow() on the ContentViewCore will cause the page
+ // to be rendered. This has a side effect of causing the page to be included in
+ // your Web History (if enabled). For this reason, onShow() should only be called
+ // when we know for sure the page will be seen by the user.
if (mContentViewCore != null) mContentViewCore.onShow();
- mOverlayObserver.onContentViewSeen();
+ if (mContentViewCore != null) System.out.println("ctxs --- mContentViewCore.onShow");
+
+ mContentDelegate.onContentViewSeen();
} else {
if (mContentViewCore != null) mContentViewCore.onHide();
- destroyContentView();
}
- mOverlayObserver.onVisibilityChanged(isVisible);
+ mContentDelegate.onVisibilityChanged(isVisible);
}
/**
@@ -389,7 +401,7 @@ public class OverlayPanelContent {
/**
* Remove the list history entry from this panel if it was within a certain timeframe.
* @param historyUrl The URL to remove.
- * @param urlTimeMS The time the URL was navigated to.
+ * @param urlTimeMs The time the URL was navigated to.
*/
public void removeLastHistoryEntry(String historyUrl, long urlTimeMs) {
nativeRemoveLastHistoryEntry(mNativeOverlayPanelContentPtr, historyUrl, urlTimeMs);
@@ -400,8 +412,15 @@ public class OverlayPanelContent {
*/
@VisibleForTesting
public void destroy() {
- destroyContentView();
- nativeDestroy(mNativeOverlayPanelContentPtr);
+ if (mContentViewCore != null) {
+ destroyContentView();
+ }
+
+ // Tests will not create the native pointer, so we need to check if it's not zero
+ // otherwise calling nativeDestroy with zero will make Chrome crash.
+ if (mNativeOverlayPanelContentPtr != 0L) {
+ nativeDestroy(mNativeOverlayPanelContentPtr);
+ }
}
// Native calls.

Powered by Google App Engine
This is Rietveld 408576698