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 d934aa9b86569434e8f089c2f2c2635636510bc9..264d2e8cd6d86c806b385bcb4c557df632641521 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,8 @@ 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.text.TextUtils; |
import android.view.ContextMenu; |
import android.view.LayoutInflater; |
import android.view.Menu; |
@@ -22,6 +24,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; |
@@ -70,6 +73,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; |
@@ -87,6 +92,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; |
@@ -104,6 +110,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"; |
@@ -671,6 +680,29 @@ public class NewTabPage |
public void onHidden(Tab tab) { |
if (mIsLoaded) recordNTPInteractionTime(); |
} |
+ |
+ @Override |
+ public void onPageLoadStarted(Tab tab, String url) { |
+ int scrollPosition = mNewTabPageView.getScrollPosition(); |
+ if (scrollPosition == RecyclerView.NO_POSITION) return; |
+ |
+ if (mTab.getWebContents() == null) return; |
+ |
+ NavigationController controller = mTab.getWebContents().getNavigationController(); |
+ int index = controller.getLastCommittedEntryIndex(); |
+ NavigationEntry entry = controller.getEntryAtIndex(index); |
+ if (entry == null) return; |
+ |
+ // At least under test conditions this method may be called initially for the load |
+ // of the NTP itself, at which point the last committed entry is not for the NTP |
+ // yet. This method will then be called a second time when the user navigates away, |
+ // at which point the last committed entry is for the NTP. The extra data must only |
+ // be set in the latter case. |
+ if (!isNTPUrl(entry.getUrl())) return; |
+ |
+ controller.setEntryExtraData(index, NAVIGATION_ENTRY_SCROLL_POSITION_KEY, |
+ Integer.toString(scrollPosition)); |
+ } |
}; |
mTab.addObserver(mTabObserver); |
mMostVisitedSites = buildMostVisitedSites(mProfile); |
@@ -683,7 +715,8 @@ public class NewTabPage |
LayoutInflater inflater = LayoutInflater.from(activity); |
mNewTabPageView = (NewTabPageView) inflater.inflate(R.layout.new_tab_page_view, null); |
- mNewTabPageView.initialize(mNewTabPageManager, mSearchProviderHasLogo); |
+ mNewTabPageView.initialize( |
+ mNewTabPageManager, mSearchProviderHasLogo, getScrollPositionFromNavigationEntry()); |
RecordHistogram.recordBooleanHistogram( |
"NewTabPage.MobileIsUserOnline", NetworkChangeNotifier.isOnline()); |
@@ -843,6 +876,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 (TextUtils.isEmpty(scrollPositionData)) 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 |