| Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
|
| index b42064c877b624d1a66408c9fa19a409e4dbec9e..4599d630ae3bb0b119f5c034efed204e35f4d209 100644
|
| --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
|
| @@ -13,6 +13,7 @@ import android.net.Uri;
|
| import android.os.Build;
|
| import android.os.SystemClock;
|
| import android.support.v4.view.ViewCompat;
|
| +import android.support.v7.widget.RecyclerView;
|
| import android.view.ContextMenu;
|
| import android.view.LayoutInflater;
|
| import android.view.Menu;
|
| @@ -22,6 +23,7 @@ import android.view.View;
|
| import org.chromium.base.ApiCompatibilityUtils;
|
| import org.chromium.base.Callback;
|
| import org.chromium.base.CommandLine;
|
| +import org.chromium.base.Log;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.VisibleForTesting;
|
| import org.chromium.base.metrics.RecordHistogram;
|
| @@ -69,6 +71,8 @@ import org.chromium.chrome.browser.tabmodel.TabModelUtils;
|
| import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
|
| import org.chromium.chrome.browser.util.UrlUtilities;
|
| import org.chromium.content_public.browser.LoadUrlParams;
|
| +import org.chromium.content_public.browser.NavigationController;
|
| +import org.chromium.content_public.browser.NavigationEntry;
|
| import org.chromium.content_public.common.Referrer;
|
| import org.chromium.net.NetworkChangeNotifier;
|
| import org.chromium.ui.base.DeviceFormFactor;
|
| @@ -86,6 +90,7 @@ import jp.tomorrowkey.android.gifplayer.BaseGifImage;
|
| */
|
| public class NewTabPage
|
| implements NativePage, InvalidationAwareThumbnailProvider, TemplateUrlServiceObserver {
|
| + private static final String TAG = "NewTabPage";
|
|
|
| // MostVisitedItem Context menu item IDs.
|
| static final int ID_OPEN_IN_NEW_WINDOW = 0;
|
| @@ -103,6 +108,9 @@ public class NewTabPage
|
| private static final int CTA_IMAGE_CLICKED = 1;
|
| private static final int ANIMATED_LOGO_CLICKED = 2;
|
|
|
| + // Key for the scroll position data that may be stored in a navigation entry.
|
| + private static final String NAVIGATION_ENTRY_SCROLL_POSITION_KEY = "NewTabPageScrollPosition";
|
| +
|
| private static final String CHROME_CONTENT_SUGGESTIONS_REFERRER =
|
| "https://www.googleapis.com/auth/chrome-content-suggestions";
|
|
|
| @@ -665,6 +673,20 @@ public class NewTabPage
|
| public void onHidden(Tab tab) {
|
| if (mIsLoaded) recordNTPInteractionTime();
|
| }
|
| +
|
| + @Override
|
| + public void onPageLoadStarted(Tab tab, String url) {
|
| + if (mTab.getWebContents() == null) return;
|
| +
|
| + NavigationController controller = mTab.getWebContents().getNavigationController();
|
| + int index = controller.getLastCommittedEntryIndex();
|
| + NavigationEntry entry = controller.getEntryAtIndex(index);
|
| + if (entry == null) return;
|
| +
|
| + assert isNTPUrl(entry.getUrl());
|
| + controller.setEntryExtraData(index, NAVIGATION_ENTRY_SCROLL_POSITION_KEY,
|
| + Integer.toString(mNewTabPageView.getScrollPosition()));
|
| + }
|
| };
|
| mTab.addObserver(mTabObserver);
|
| mMostVisitedSites = buildMostVisitedSites(mProfile);
|
| @@ -677,7 +699,8 @@ public class NewTabPage
|
|
|
| LayoutInflater inflater = LayoutInflater.from(activity);
|
| mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_page_view, null);
|
| - mNewTabPageView.initialize(mNewTabPageManager, mSearchProviderHasLogo, mSnippetsBridge);
|
| + mNewTabPageView.initialize(mNewTabPageManager, mSearchProviderHasLogo, mSnippetsBridge,
|
| + getScrollPositionFromNavigationEntry());
|
|
|
| RecordHistogram.recordBooleanHistogram(
|
| "NewTabPage.MobileIsUserOnline", NetworkChangeNotifier.isOnline());
|
| @@ -837,6 +860,29 @@ public class NewTabPage
|
| }
|
|
|
| /**
|
| + * Returns the value of the adapter scroll position that was stored in the last committed
|
| + * navigation entry. Returns {@code RecyclerView.NO_POSITION} if there is no last committed
|
| + * navigation entry, or if no data is found.
|
| + * @return The adapter scroll position.
|
| + */
|
| + private int getScrollPositionFromNavigationEntry() {
|
| + if (mTab.getWebContents() == null) return RecyclerView.NO_POSITION;
|
| +
|
| + NavigationController controller = mTab.getWebContents().getNavigationController();
|
| + int index = controller.getLastCommittedEntryIndex();
|
| + String scrollPositionData =
|
| + controller.getEntryExtraData(index, NAVIGATION_ENTRY_SCROLL_POSITION_KEY);
|
| + if (scrollPositionData == null) return RecyclerView.NO_POSITION;
|
| +
|
| + try {
|
| + return Integer.parseInt(scrollPositionData);
|
| + } catch (NumberFormatException e) {
|
| + Log.w(TAG, "Bad data found for scroll position: %s", scrollPositionData, e);
|
| + return RecyclerView.NO_POSITION;
|
| + }
|
| + }
|
| +
|
| + /**
|
| * @return Whether the NTP has finished loaded.
|
| */
|
| @VisibleForTesting
|
|
|