Add freeze tab menu option

  Adds a freeze tab menu option hidden behind about:debug for now.

Change-Id: I1b321de6a5dbcb13e87f6e658439f727970b0e4f
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 3974a9c..6a951c2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -81,8 +81,10 @@
 import com.android.browser.search.SearchEngine;
 import com.android.common.Search;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.Calendar;
 import java.util.HashMap;
@@ -1494,6 +1496,7 @@
                 final MenuItem counter = menu.findItem(R.id.dump_counters_menu_id);
                 counter.setVisible(showDebugSettings);
                 counter.setEnabled(showDebugSettings);
+                menu.findItem(R.id.freeze_tab_menu_id).setVisible(showDebugSettings);
 
                 final MenuItem newtab = menu.findItem(R.id.new_tab_menu_id);
                 newtab.setEnabled(getTabControl().canCreateNewTab());
@@ -1600,6 +1603,26 @@
                 getCurrentTopWebView().showFindDialog(null, true);
                 break;
 
+            case R.id.freeze_tab_menu_id:
+                // TODO: Show error messages
+                WebView source = getCurrentTopWebView();
+                if (source == null) break;
+                Tab t = createNewTab(false, true, false);
+                if (t == null) break;
+                WebView pinned = t.getWebView();
+                if (pinned == null) break;
+                try {
+                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                    source.saveViewState(bos);
+                    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
+                    pinned.loadViewState(bis);
+                    bis.close();
+                    bos.close();
+                } catch (IOException e) {
+                    closeTab(t);
+                }
+                break;
+
             case R.id.save_webarchive_menu_id:
                 String state = Environment.getExternalStorageState();
                 if (!Environment.MEDIA_MOUNTED.equals(state)) {