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

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java

Issue 1326643003: Overlay content is its own class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@move-panel-functionality
Patch Set: flip booleans for testing renamed api Created 5 years, 3 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/contextualsearch/ContextualSearchManager.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
index d6144848ec55fe7689e731dc24640f5b93b3b21a..f0bc5d9e78d217c61660a3c947477be07ae696fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -18,6 +18,7 @@ import org.chromium.base.VisibleForTesting;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.compositor.bottombar.OverlayContentDelegate;
import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel.PanelState;
import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel.StateChangeReason;
import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanelDelegate;
@@ -106,6 +107,12 @@ public class ContextualSearchManager extends ContextualSearchObservable
private boolean mWasActivatedByTap;
private boolean mIsInitialized;
+ /**
+ * This boolean is used for loading content after a long-press when content is not immediately
+ * loaded.
+ */
+ private boolean mShouldLoadDelayedSearch;
+
private boolean mIsShowingPromo;
private boolean mDidLogPromoOutcome;
@@ -466,8 +473,16 @@ public class ContextualSearchManager extends ContextualSearchObservable
removeLastSearchVisit();
}
+ mSearchPanelDelegate.setSearchContentViewVisibility(false);
+
boolean isTap = mSelectionController.getSelectionType() == SelectionType.TAP;
boolean didRequestSurroundings = false;
+
+ if (isTap) {
+ // If the user action was not a long-press, immediately start loading content.
+ mShouldLoadDelayedSearch = false;
+ }
+
if (isTap && mPolicy.shouldPreviousTapResolve(
mNetworkCommunicator.getBasePageUrl())) {
mNetworkCommunicator.startSearchTermResolutionRequest(
@@ -757,6 +772,134 @@ public class ContextualSearchManager extends ContextualSearchObservable
return mPolicy.isTapSupported();
}
+ // ============================================================================================
+ // OverlayContentDelegate
+ // ============================================================================================
+
+ @Override
+ public OverlayContentDelegate getOverlayContentDelegate() {
+ return new SearchOverlayContentDelegate();
+ }
+
+ /**
+ * Implementation of OverlayContentDelegate. Made public for testing purposes.
+ */
+ public class SearchOverlayContentDelegate extends OverlayContentDelegate {
+
+ public SearchOverlayContentDelegate() {}
+
+ @Override
+ public void onMainFrameLoadStarted(String url) {
+ onExternalNavigation(url);
+ }
+
+ @Override
+ public void onMainFrameNavigation(String url, boolean isFailure) {
+ if (shouldPromoteSearchNavigation()) {
+ onExternalNavigation(url);
+ } else {
+ // Could be just prefetching, check if that failed.
+ onContextualSearchRequestNavigation(isFailure);
+ }
+ }
+
+ @Override
+ public void onContentLoadStarted(String url) {
+ mDidPromoteSearchNavigation = false;
+ }
+
+ @Override
+ public void onContentLoadFinished() {
+ if (mSearchRequest == null) return;
+
+ mSearchPanelDelegate.onSearchResultsLoaded(mSearchRequest.wasPrefetch());
+
+ // Any time we place a page in a ContentViewCore, clear history if needed.
+ // This prevents error URLs from appearing in the Tab's history stack.
+ // Also please note that clearHistory() will not
+ // clear the current entry (search results page in this case),
+ // and it will not work properly if there are pending navigations.
+ // That's why we need to clear the history here, after the navigation
+ // is completed.
+ boolean shouldClearHistory = mSearchRequest.getHasFailed();
+ if (shouldClearHistory && mSearchPanelDelegate.getContentViewCore() != null) {
+ mSearchPanelDelegate.getContentViewCore().getWebContents().getNavigationController()
+ .clearHistory();
+ }
+ }
+
+ @Override
+ public void onVisibilityChanged(boolean isVisible) {
+ if (isVisible) {
+ mWereSearchResultsSeen = true;
+ // If there's no current request, then either a search term resolution
+ // is in progress or we should do a verbatim search now.
+ if (mSearchRequest == null
+ && mPolicy.shouldCreateVerbatimRequest(mSelectionController,
+ mNetworkCommunicator.getBasePageUrl())) {
+ mSearchRequest = new ContextualSearchRequest(
+ mSelectionController.getSelectedText());
+ mDidLoadResolvedSearchRequest = false;
+ }
+ if ((mSearchRequest != null && !mDidLoadResolvedSearchRequest)
+ || mShouldLoadDelayedSearch) {
+ // mShouldLoadDelayedSearch is used in the long-press case to load content.
+ // Since content is now created and destroyed for each request, was impossible
+ // to know if content was already loaded or recently needed to be; this is for
+ // the case where it needed to be.
+ mSearchRequest.setNormalPriority();
+ loadSearchUrl();
+ }
+ mShouldLoadDelayedSearch = true;
+ mPolicy.updateCountersForOpen();
+ }
+ }
+
+ @Override
+ public void onContentViewCreated(ContentViewCore contentViewCore) {
+ // TODO(mdjones): Move SearchContentViewDelegate ownership to panel.
+ mSearchContentViewDelegate.setContextualSearchContentViewCore(contentViewCore);
+ }
+
+ @Override
+ public void onContentViewDestroyed() {
+ if (mSearchContentViewDelegate != null) {
+ mSearchContentViewDelegate.releaseContextualSearchContentViewCore();
+ }
+ }
+
+ @Override
+ public void onContentViewSeen() {
+ mSearchPanelDelegate.setWasSearchContentViewSeen();
+ }
+
+ @Override
+ public boolean shouldInterceptNavigation(ExternalNavigationHandler externalNavHandler,
+ NavigationParams navigationParams) {
+ mTabRedirectHandler.updateNewUrlLoading(navigationParams.pageTransitionType,
+ navigationParams.isRedirect,
+ navigationParams.hasUserGesture || navigationParams.hasUserGestureCarryover,
+ mActivity.getLastUserInteractionTime(), TabRedirectHandler.INVALID_ENTRY_INDEX);
+ ExternalNavigationParams params = new ExternalNavigationParams.Builder(
+ navigationParams.url, false, navigationParams.referrer,
+ navigationParams.pageTransitionType, navigationParams.isRedirect)
+ .setApplicationMustBeInForeground(true)
+ .setRedirectHandler(mTabRedirectHandler)
+ .setIsMainFrame(navigationParams.isMainFrame)
+ .build();
+ if (externalNavHandler.shouldOverrideUrlLoading(params)
+ != OverrideUrlLoadingResult.NO_OVERRIDE) {
+ mSearchPanelDelegate.maximizePanelThenPromoteToTab(StateChangeReason.TAB_PROMOTION,
+ INTERCEPT_NAVIGATION_PROMOTION_ANIMATION_DURATION_MS);
+ return false;
+ }
+ if (navigationParams.isExternalProtocol) {
+ return false;
+ }
+ return true;
+ }
+ }
+
// --------------------------------------------------------------------------------------------
// Search Content View
// --------------------------------------------------------------------------------------------
@@ -832,72 +975,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
}
/**
- * Called when the Search Content view has finished loading to record how long it takes the SERP
- * to load after opening the panel.
- */
- @Override
- public void onSearchResultsLoaded() {
- if (mSearchRequest == null) return;
-
- mSearchPanelDelegate.onSearchResultsLoaded(mSearchRequest.wasPrefetch());
-
- // Any time we place a page in a ContentViewCore, clear history if needed.
- // This prevents error URLs from appearing in the Tab's history stack.
- // Also please note that clearHistory() will not
- // clear the current entry (search results page in this case),
- // and it will not work properly if there are pending navigations.
- // That's why we need to clear the history here, after the navigation
- // is completed.
- boolean shouldClearHistory = mSearchRequest.getHasFailed();
- if (shouldClearHistory && mSearchPanelDelegate.getContentViewCore() != null) {
- mSearchPanelDelegate.getContentViewCore().getWebContents().getNavigationController()
- .clearHistory();
- }
- }
-
- @Override
- public void handleDidNavigateMainFrame(String url, int httpResultCode) {
- if (shouldPromoteSearchNavigation()) {
- onExternalNavigation(url);
- } else {
- // Could be just prefetching, check if that failed.
- boolean isFailure = isHttpFailureCode(httpResultCode);
- onContextualSearchRequestNavigation(isFailure);
- }
- }
-
- @Override
- public void onStartedLoading() {
- mDidPromoteSearchNavigation = false;
- }
-
- @Override
- public boolean shouldInterceptNavigation(
- ExternalNavigationHandler externalNavHandler, NavigationParams navigationParams) {
- mTabRedirectHandler.updateNewUrlLoading(navigationParams.pageTransitionType,
- navigationParams.isRedirect,
- navigationParams.hasUserGesture || navigationParams.hasUserGestureCarryover,
- mActivity.getLastUserInteractionTime(), TabRedirectHandler.INVALID_ENTRY_INDEX);
- ExternalNavigationParams params = new ExternalNavigationParams.Builder(
- navigationParams.url, false, navigationParams.referrer,
- navigationParams.pageTransitionType, navigationParams.isRedirect)
- .setApplicationMustBeInForeground(true)
- .setRedirectHandler(mTabRedirectHandler)
- .setIsMainFrame(navigationParams.isMainFrame)
- .build();
- if (externalNavHandler.shouldOverrideUrlLoading(params)
- != OverrideUrlLoadingResult.NO_OVERRIDE) {
- mSearchPanelDelegate.maximizePanelThenPromoteToTab(StateChangeReason.TAB_PROMOTION,
- INTERCEPT_NAVIGATION_PROMOTION_ANIMATION_DURATION_MS);
- return true;
- }
- if (navigationParams.isExternalProtocol) {
- return true;
- }
- return false;
- }
-
- /**
* @return Whether the given HTTP result code represents a failure or not.
*/
private boolean isHttpFailureCode(int httpResultCode) {
@@ -920,7 +997,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
* Auto-promotes the panel into a separate tab if that's not already being done.
* @param url The URL we are navigating to.
*/
- @Override
public void onExternalNavigation(String url) {
mSearchPanelDelegate.updateTopControlState();
@@ -939,19 +1015,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
}
@Override
- public void onContentViewCreated(ContentViewCore contentView) {
- // TODO(mdjones): Move SearchContentViewDelegate ownership to panel.
- mSearchContentViewDelegate.setContextualSearchContentViewCore(contentView);
- }
-
- @Override
- public void onContentViewDestroyed() {
- if (mSearchContentViewDelegate != null) {
- mSearchContentViewDelegate.releaseContextualSearchContentViewCore();
- }
- }
-
- @Override
public void openResolvedSearchUrlInNewTab() {
if (mSearchRequest != null && mSearchRequest.getSearchUrl() != null) {
openUrlInNewTab(mSearchRequest.getSearchUrl());
@@ -1026,7 +1089,10 @@ public class ContextualSearchManager extends ContextualSearchObservable
? mSearchPanelDelegate.getContentViewCore().computeVerticalScrollOffset() : -1.f;
}
- @Override
+ /**
+ * This is called when the search panel is shown or is hidden.
+ * @param isVisible True if the panel is now visible.
+ */
public void onContentViewVisibilityChanged(boolean isVisible) {
if (isVisible) {
mWereSearchResultsSeen = true;
@@ -1039,10 +1105,16 @@ public class ContextualSearchManager extends ContextualSearchObservable
mSelectionController.getSelectedText());
mDidLoadResolvedSearchRequest = false;
}
- if (mSearchRequest != null && !mDidLoadResolvedSearchRequest) {
+ if ((mSearchRequest != null && !mDidLoadResolvedSearchRequest)
+ || mShouldLoadDelayedSearch) {
+ // mShouldLoadDelayedSearch is used in the long-press case to load content. Since
+ // content is now created and destroyed for each request, was impossible to know if
+ // content was already loaded or recently needed to be; this is for the case where
+ // it needed to be.
mSearchRequest.setNormalPriority();
loadSearchUrl();
}
+ mShouldLoadDelayedSearch = true;
mPolicy.updateCountersForOpen();
}
}

Powered by Google App Engine
This is Rietveld 408576698