| 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 f1ec78fa60e76a54ec2f032283be995bf1122539..e5404e006c45d1e9d65897446dd8dc5efa6c26c5 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
|
| @@ -6,7 +6,6 @@ package org.chromium.chrome.browser.contextualsearch;
|
|
|
| import android.app.Activity;
|
| import android.view.View;
|
| -import android.view.View.MeasureSpec;
|
| import android.view.ViewGroup;
|
| import android.view.ViewTreeObserver;
|
| import android.view.ViewTreeObserver.OnGlobalFocusChangeListener;
|
| @@ -19,7 +18,6 @@ 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.WebContentsFactory;
|
| import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchControl;
|
| import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel.PanelState;
|
| import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel.StateChangeReason;
|
| @@ -43,9 +41,6 @@ import org.chromium.chrome.browser.tabmodel.TabModelSelector;
|
| import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
|
| import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
|
| import org.chromium.components.navigation_interception.NavigationParams;
|
| -import org.chromium.components.web_contents_delegate_android.WebContentsDelegateAndroid;
|
| -import org.chromium.content.browser.ContentView;
|
| -import org.chromium.content.browser.ContentViewClient;
|
| import org.chromium.content.browser.ContentViewCore;
|
| import org.chromium.content.browser.ContextualSearchClient;
|
| import org.chromium.content_public.browser.GestureStateListener;
|
| @@ -94,7 +89,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
|
|
| private final WindowAndroid mWindowAndroid;
|
| private WebContentsObserver mSearchWebContentsObserver;
|
| - private final WebContentsDelegateAndroid mWebContentsDelegate;
|
| private ContextualSearchContentViewDelegate mSearchContentViewDelegate;
|
| private final ContextualSearchTabPromotionDelegate mTabPromotionDelegate;
|
| private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
|
| @@ -182,26 +176,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
|
|
| mSelectionController = new ContextualSearchSelectionController(activity, this);
|
|
|
| - mWebContentsDelegate = new WebContentsDelegateAndroid() {
|
| - @Override
|
| - public void onLoadStarted() {
|
| - super.onLoadStarted();
|
| - mSearchPanelDelegate.onLoadStarted();
|
| - }
|
| -
|
| - @Override
|
| - public void onLoadStopped() {
|
| - super.onLoadStopped();
|
| - mSearchPanelDelegate.onLoadStopped();
|
| - }
|
| -
|
| - @Override
|
| - public void onLoadProgressChanged(int progress) {
|
| - super.onLoadProgressChanged(progress);
|
| - mSearchPanelDelegate.onLoadProgressChanged(progress);
|
| - }
|
| - };
|
| -
|
| final View controlContainer = mActivity.findViewById(R.id.control_container);
|
| mOnFocusChangeListener = new OnGlobalFocusChangeListener() {
|
| @Override
|
| @@ -268,6 +242,8 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| @Override
|
| public void setContextualSearchPanelDelegate(ContextualSearchPanelDelegate delegate) {
|
| mSearchPanelDelegate = delegate;
|
| +
|
| + mSearchPanelDelegate.setChromeActivity(mActivity);
|
| }
|
|
|
| @Override
|
| @@ -307,7 +283,8 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| /**
|
| * @return The Base Page's {@link ContentViewCore}.
|
| */
|
| - @Nullable private ContentViewCore getBaseContentView() {
|
| + @Override
|
| + @Nullable public ContentViewCore getBaseContentView() {
|
| return mSelectionController.getBaseContentView();
|
| }
|
|
|
| @@ -383,7 +360,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| mLoadedSearchUrlTimeMs = 0L;
|
| mWereSearchResultsSeen = false;
|
|
|
| - mNetworkCommunicator.destroySearchContentView();
|
| mSearchRequest = null;
|
|
|
| if (mIsShowingPromo && !mDidLogPromoOutcome) {
|
| @@ -458,9 +434,6 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| removeLastSearchVisit();
|
| }
|
|
|
| - // Make sure we'll create a new Content View when needed.
|
| - mNetworkCommunicator.destroySearchContentView();
|
| -
|
| boolean isTap = mSelectionController.getSelectionType() == SelectionType.TAP;
|
| boolean didRequestSurroundings = false;
|
| if (isTap && mPolicy.shouldPreviousTapResolve(
|
| @@ -714,10 +687,10 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| boolean shouldPreload = !doPreventPreload && mPolicy.shouldPrefetchSearchResult(true);
|
| mSearchRequest = new ContextualSearchRequest(searchTerm, alternateTerm, shouldPreload);
|
| mDidLoadResolvedSearchRequest = false;
|
| - if (mIsSearchContentViewShowing) {
|
| + if (mSearchPanelDelegate.isContentViewShowing()) {
|
| mSearchRequest.setNormalPriority();
|
| }
|
| - if (mIsSearchContentViewShowing || shouldPreload) {
|
| + if (mSearchPanelDelegate.isContentViewShowing() || shouldPreload) {
|
| loadSearchUrl();
|
| }
|
| mPolicy.logSearchTermResolutionDetails(searchTerm,
|
| @@ -734,7 +707,7 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| */
|
| private void loadSearchUrl() {
|
| mLoadedSearchUrlTimeMs = System.currentTimeMillis();
|
| - mNetworkCommunicator.loadUrl(mSearchRequest.getSearchUrl());
|
| + mSearchPanelDelegate.loadUrlInPanel(mSearchRequest.getSearchUrl());
|
| mDidLoadResolvedSearchRequest = true;
|
|
|
| // TODO(pedrosimonetti): If the user taps on a word and quickly after that taps on the
|
| @@ -743,7 +716,8 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| // to coordinate with Chrome-Android folks to come up with a proper fix for this.
|
| // For now, we force the ContentView to be displayed by calling onShow() again
|
| // when a URL is being loaded. See: crbug.com/398206
|
| - if (mIsSearchContentViewShowing && mSearchPanelDelegate.getContentViewCore() != null) {
|
| + if (mSearchPanelDelegate.isContentViewShowing()
|
| + && mSearchPanelDelegate.getContentViewCore() != null) {
|
| mSearchPanelDelegate.getContentViewCore().onShow();
|
| }
|
| }
|
| @@ -795,7 +769,8 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| * a load of a user-visible search result.
|
| * @param isFailure Whether the navigation failed.
|
| */
|
| - private void onContextualSearchRequestNavigation(boolean isFailure) {
|
| + @Override
|
| + public void onContextualSearchRequestNavigation(boolean isFailure) {
|
| if (mSearchRequest == null) return;
|
|
|
| if (mSearchRequest.isUsingLowPriority()) {
|
| @@ -817,7 +792,7 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| mSearchRequest.setHasFailed();
|
| mSearchRequest.setNormalPriority();
|
| // If the content view is showing, load at normal priority now.
|
| - if (mIsSearchContentViewShowing) {
|
| + if (mSearchPanelDelegate.isContentViewShowing()) {
|
| loadSearchUrl();
|
| } else {
|
| mDidLoadResolvedSearchRequest = false;
|
| @@ -835,125 +810,25 @@ 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.
|
| */
|
| - private void onSearchResultsLoaded() {
|
| + @Override
|
| + public void onSearchResultsLoaded() {
|
| if (mSearchRequest == null) return;
|
|
|
| mSearchPanelDelegate.onSearchResultsLoaded(mSearchRequest.wasPrefetch());
|
| - }
|
| -
|
| - /**
|
| - * Creates a new Content View Core to display search results, if needed.
|
| - */
|
| - private void createNewSearchContentViewCoreIfNeeded() {
|
| - if (mSearchPanelDelegate.getContentViewCore() == null) {
|
| - mNetworkCommunicator.createNewSearchContentView();
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void loadUrl(String url) {
|
| - createNewSearchContentViewCoreIfNeeded();
|
| - if (mSearchPanelDelegate.getContentViewCore() != null
|
| - && mSearchPanelDelegate.getContentViewCore().getWebContents() != null) {
|
| - mDidLoadAnyUrl = true;
|
| - mSearchPanelDelegate.getContentViewCore().getWebContents()
|
| - .getNavigationController().loadUrl(new LoadUrlParams(url));
|
| - }
|
| - }
|
| -
|
| - @Override
|
| - public void createNewSearchContentView() {
|
| - if (mSearchPanelDelegate.getContentViewCore() != null) {
|
| - mNetworkCommunicator.destroySearchContentView();
|
| - }
|
|
|
| - final ContentViewCore cvc = new ContentViewCore(mActivity);
|
| -
|
| - // Adds a ContentViewClient to override the default fullscreen size.
|
| - if (!mSearchPanelDelegate.isFullscreenSizePanel()) {
|
| - cvc.setContentViewClient(new ContentViewClient() {
|
| - @Override
|
| - public int getDesiredWidthMeasureSpec() {
|
| - return MeasureSpec.makeMeasureSpec(
|
| - mSearchPanelDelegate.getSearchContentViewWidthPx(),
|
| - MeasureSpec.EXACTLY);
|
| - }
|
| -
|
| - @Override
|
| - public int getDesiredHeightMeasureSpec() {
|
| - return MeasureSpec.makeMeasureSpec(
|
| - mSearchPanelDelegate.getSearchContentViewHeightPx(),
|
| - MeasureSpec.EXACTLY);
|
| - }
|
| - });
|
| + // 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 != null && mSearchRequest.getHasFailed();
|
| + if (shouldClearHistory && mSearchPanelDelegate.getContentViewCore() != null) {
|
| + mSearchPanelDelegate.getContentViewCore().getWebContents().getNavigationController()
|
| + .clearHistory();
|
| }
|
| -
|
| - ContentView cv = new ContentView(mActivity, cvc);
|
| - // Creates an initially hidden WebContents which gets shown when the panel is opened.
|
| - cvc.initialize(cv, cv,
|
| - WebContentsFactory.createWebContents(false, true), mWindowAndroid);
|
| -
|
| - // Transfers the ownership of the WebContents to the native ContextualSearchPanel.
|
| - mSearchPanelDelegate.setWebContents(cvc, mWebContentsDelegate);
|
| -
|
| - mSearchWebContentsObserver =
|
| - new WebContentsObserver(cvc.getWebContents()) {
|
| - @Override
|
| - public void didStartLoading(String url) {
|
| - mDidPromoteSearchNavigation = false;
|
| - }
|
| -
|
| - @Override
|
| - public void didStartProvisionalLoadForFrame(long frameId, long parentFrameId,
|
| - boolean isMainFrame, String validatedUrl, boolean isErrorPage,
|
| - boolean isIframeSrcdoc) {
|
| - if (isMainFrame) onExternalNavigation(validatedUrl);
|
| - }
|
| -
|
| - @Override
|
| - public void didNavigateMainFrame(String url, String baseUrl,
|
| - boolean isNavigationToDifferentPage, boolean isNavigationInPage,
|
| - int httpResultCode) {
|
| - mNetworkCommunicator.handleDidNavigateMainFrame(url, httpResultCode);
|
| - }
|
| -
|
| - @Override
|
| - public void didFinishLoad(long frameId, String validatedUrl,
|
| - boolean isMainFrame) {
|
| - onSearchResultsLoaded();
|
| -
|
| - // 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 != null && mSearchRequest.getHasFailed();
|
| - if (shouldClearHistory && cvc != null) {
|
| - cvc.getWebContents().getNavigationController()
|
| - .clearHistory();
|
| - }
|
| - }
|
| - };
|
| -
|
| - mSearchContentViewDelegate.setContextualSearchContentViewCore(cvc);
|
| - mInterceptNavigationDelegate = new InterceptNavigationDelegateImpl();
|
| - mSearchPanelDelegate.setInterceptNavigationDelegate(mInterceptNavigationDelegate,
|
| - cvc.getWebContents());
|
| - }
|
| -
|
| - @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);
|
| - }
|
| - mDidLoadAnyUrl = false;
|
| }
|
|
|
| /**
|
| @@ -973,63 +848,16 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| return mSearchPanelDelegate.didTouchSearchContentView() && !mDidLoadAnyUrl;
|
| }
|
|
|
| - /**
|
| - * Called to check if an external navigation is being done and take the appropriate action:
|
| - * Auto-promotes the panel into a separate tab if that's not already being done.
|
| - * @param url The URL we are navigating to.
|
| - */
|
| - private void onExternalNavigation(String url) {
|
| - if (mSearchPanelDelegate.isFullscreenSizePanel()) {
|
| - // Consider the ContentView height to be fullscreen, and inform the system that
|
| - // the Toolbar is always visible (from the Compositor's perspective), even though
|
| - // the Toolbar and Base Page might be offset outside the screen. This means the
|
| - // renderer will consider the ContentView height to be the fullscreen height
|
| - // minus the Toolbar height.
|
| - //
|
| - // This is necessary to fix the bugs: crbug.com/510205 and crbug.com/510206
|
| - mSearchPanelDelegate.getContentViewCore().getWebContents()
|
| - .updateTopControlsState(false, true, false);
|
| - } else {
|
| - mSearchPanelDelegate.getContentViewCore().getWebContents()
|
| - .updateTopControlsState(true, false, false);
|
| - }
|
| -
|
| - if (!mDidPromoteSearchNavigation
|
| - && !BLACKLISTED_URL.equals(url)
|
| - && !url.startsWith(INTENT_URL_PREFIX)
|
| - && shouldPromoteSearchNavigation()) {
|
| - // Do not promote to a regular tab if we're loading our Resolved Search
|
| - // URL, otherwise we'll promote it when prefetching the Serp.
|
| - // Don't promote URLs when they are navigating to an intent - this is
|
| - // handled by the InterceptNavigationDelegate which uses a faster
|
| - // maximizing animation.
|
| - mDidPromoteSearchNavigation = true;
|
| - mSearchPanelDelegate.maximizePanelThenPromoteToTab(StateChangeReason.SERP_NAVIGATION);
|
| - }
|
| + @Override
|
| + public void onContentViewCreated(ContentViewCore contentView) {
|
| + mSearchContentViewDelegate.setContextualSearchContentViewCore(contentView);
|
| }
|
|
|
| @Override
|
| - public void destroySearchContentView() {
|
| - if (mSearchPanelDelegate.getContentViewCore() != null
|
| - && mSearchContentViewDelegate != null) {
|
| - mSearchPanelDelegate.destroyWebContents();
|
| + public void onContentViewDestroyed() {
|
| + if (mSearchContentViewDelegate != null) {
|
| mSearchContentViewDelegate.releaseContextualSearchContentViewCore();
|
| - mSearchPanelDelegate.getContentViewCore().getWebContents().destroy();
|
| - mSearchPanelDelegate.getContentViewCore().destroy();
|
| - mSearchPanelDelegate.resetContentViewCore();
|
| - if (mSearchWebContentsObserver != null) {
|
| - mSearchWebContentsObserver.destroy();
|
| - mSearchWebContentsObserver = null;
|
| - }
|
| }
|
| -
|
| - // 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.
|
| - setSearchContentViewVisibility(false);
|
| }
|
|
|
| @Override
|
| @@ -1102,23 +930,13 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| }
|
|
|
| @Override
|
| - public void resetSearchContentViewScroll() {
|
| - if (mSearchPanelDelegate.getContentViewCore() != null) {
|
| - mSearchPanelDelegate.getContentViewCore().scrollTo(0, 0);
|
| - }
|
| - }
|
| -
|
| - @Override
|
| public float getSearchContentViewVerticalScroll() {
|
| return mSearchPanelDelegate.getContentViewCore() != null
|
| ? mSearchPanelDelegate.getContentViewCore().computeVerticalScrollOffset() : -1.f;
|
| }
|
|
|
| @Override
|
| - public void setSearchContentViewVisibility(boolean isVisible) {
|
| - if (mIsSearchContentViewShowing == isVisible) return;
|
| -
|
| - mIsSearchContentViewShowing = isVisible;
|
| + public void onContentViewVisibilityChanged(boolean isVisible) {
|
| if (isVisible) {
|
| mWereSearchResultsSeen = true;
|
| // If there's no current request, then either a search term resolution
|
| @@ -1134,18 +952,7 @@ public class ContextualSearchManager extends ContextualSearchObservable
|
| mSearchRequest.setNormalPriority();
|
| loadSearchUrl();
|
| }
|
| - // The CVC is created with the search request, but if none was made we'll need
|
| - // one in order to display an empty panel.
|
| - createNewSearchContentViewCoreIfNeeded();
|
| - if (mSearchPanelDelegate.getContentViewCore() != null) {
|
| - mSearchPanelDelegate.getContentViewCore().onShow();
|
| - }
|
| - mSearchPanelDelegate.setWasSearchContentViewSeen();
|
| mPolicy.updateCountersForOpen();
|
| - } else {
|
| - if (mSearchPanelDelegate.getContentViewCore() != null) {
|
| - mSearchPanelDelegate.getContentViewCore().onHide();
|
| - }
|
| }
|
| }
|
|
|
|
|