Make sure preloaded tabs have unique IDs.

Bug: 5251821
Change-Id: I6dd7561a2461805912268a5faf967199cf39fd8c
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index ff1ad0e..67c42dd 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -2168,6 +2168,7 @@
             }
         }
         Tab t = tabControl.getTab();
+        t.refreshIdAfterPreload();
         mTabControl.addPreloadedTab(t);
         addTab(t);
         setActiveTab(t);
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 69213cd..3b283cc 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1435,6 +1435,15 @@
         };
     }
 
+    /**
+     * This is used to get a new ID when the tab has been preloaded, before it is displayed and
+     * added to TabControl. Preloaded tabs can be created before restoreInstanceState, leading
+     * to overlapping IDs between the preloaded and restored tabs.
+     */
+    public void refreshIdAfterPreload() {
+        mId = TabControl.getNextId();
+    }
+
     public void updateShouldCaptureThumbnails() {
         if (mWebViewController.shouldCaptureThumbnails()) {
             synchronized (Tab.this) {
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 932a811..0668b74 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -170,6 +170,12 @@
     }
 
     void addPreloadedTab(Tab tab) {
+        for (Tab current : mTabs) {
+            if (current != null && current.getId() == tab.getId()) {
+                throw new IllegalStateException("Tab with id " + tab.getId() + " already exists: "
+                        + current.toString());
+            }
+        }
         mTabs.add(tab);
         tab.setController(mController);
         mController.onSetWebView(tab, tab.getWebView());