Merge "Import revised translations."
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 8ca151a..da98a1c 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -317,7 +317,10 @@
             if (urlData.isEmpty()) {
                 loadUrl(webView, mSettings.getHomePage());
             } else {
-                loadUrlDataIn(t, urlData);
+                // monkey protection against delayed start
+                if (t != null) {
+                    loadUrlDataIn(t, urlData);
+                }
             }
         } else {
             mTabControl.restoreState(icicle, currentTab, restoreIncognitoTabs,
@@ -2088,9 +2091,12 @@
     }
 
     protected void setActiveTab(Tab tab) {
-        mTabControl.setCurrentTab(tab);
-        // the tab is guaranteed to have a webview after setCurrentTab
-        mUi.setActiveTab(tab);
+        // monkey protection against delayed start
+        if (tab != null) {
+            mTabControl.setCurrentTab(tab);
+            // the tab is guaranteed to have a webview after setCurrentTab
+            mUi.setActiveTab(tab);
+        }
     }
 
     protected void closeEmptyChildTab() {
diff --git a/src/com/android/browser/GoogleAccountLogin.java b/src/com/android/browser/GoogleAccountLogin.java
index 3712490..f4ccfd1 100644
--- a/src/com/android/browser/GoogleAccountLogin.java
+++ b/src/com/android/browser/GoogleAccountLogin.java
@@ -41,6 +41,7 @@
 import android.preference.PreferenceManager;
 import android.util.Log;
 import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
 import android.webkit.WebView;
 import android.webkit.WebViewClient;
 
@@ -86,6 +87,12 @@
         mWebView = new WebView(mActivity);
         mRunnable = runnable;
 
+        // XXX: Doing pre-login causes onResume to skip calling
+        // resumeWebViewTimers. So to avoid problems with timers not running, we
+        // duplicate the work here using the off-screen WebView.
+        CookieSyncManager.getInstance().startSync();
+        mWebView.resumeTimers();
+
         mWebView.setWebViewClient(new WebViewClient() {
             @Override
             public boolean shouldOverrideUrlLoading(WebView view, String url) {
diff --git a/src/com/android/browser/ScrollWebView.java b/src/com/android/browser/ScrollWebView.java
index 1d7f23a..2bf07e1 100644
--- a/src/com/android/browser/ScrollWebView.java
+++ b/src/com/android/browser/ScrollWebView.java
@@ -33,6 +33,7 @@
     private boolean mIsCancelled;
     private boolean mBackgroundRemoved = false;
     private boolean mUserInitiated = false;
+    private TitleBarBase mTitleBar;
 
     /**
      * @param context
@@ -70,6 +71,11 @@
         super(context);
     }
 
+    @Override
+    protected int getTitleHeight() {
+        return (mTitleBar != null) ? mTitleBar.getEmbeddedHeight() : 0;
+    }
+
     // scroll runnable implementation
     public void run() {
         if (!mIsCancelled && (mScrollListener != null)) {
@@ -84,6 +90,7 @@
     @Override
     public void setEmbeddedTitleBar(final View title) {
         super.setEmbeddedTitleBar(title);
+        mTitleBar = (TitleBarBase) title;
         if (title != null && mScrollListener != null) {
             // allow the scroll listener to initialize its state
             post(this);
diff --git a/src/com/android/browser/TitleBarBase.java b/src/com/android/browser/TitleBarBase.java
index 2b64aa3..46136db 100644
--- a/src/com/android/browser/TitleBarBase.java
+++ b/src/com/android/browser/TitleBarBase.java
@@ -113,6 +113,10 @@
         }
     }
 
+    public int getEmbeddedHeight() {
+        return getHeight();
+    }
+
     // UrlInputListener implementation
 
     /**
diff --git a/src/com/android/browser/TitleBarXLarge.java b/src/com/android/browser/TitleBarXLarge.java
index c732da8..85935a0 100644
--- a/src/com/android/browser/TitleBarXLarge.java
+++ b/src/com/android/browser/TitleBarXLarge.java
@@ -163,6 +163,11 @@
         }
     }
 
+    @Override
+    public int getEmbeddedHeight() {
+        return mContainer.getHeight();
+    }
+
     void setUseQuickControls(boolean useQuickControls) {
         mUseQuickControls = useQuickControls;
         mUrlInput.setUseQuickControls(mUseQuickControls);
@@ -292,7 +297,7 @@
                 mVoiceSearchIndicator.setVisibility(View.VISIBLE);
             }
             mWebIcon.setImageResource(R.drawable.ic_search_holo_dark);
-            updateSearchMode();
+            updateSearchMode(false);
         } else {
             mGoButton.setVisibility(View.GONE);
             mVoiceSearch.setVisibility(View.GONE);
@@ -342,8 +347,8 @@
         }
     }
 
-    private void updateSearchMode() {
-        setSearchMode(TextUtils.isEmpty(mUrlInput.getText()));
+    private void updateSearchMode(boolean userEdited) {
+        setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getText()));
     }
 
     private void setSearchMode(boolean voiceSearchEnabled) {
@@ -370,7 +375,7 @@
     public void afterTextChanged(Editable s) {
         if (mUrlInput.hasFocus()) {
             // check if input field is empty and adjust voice search state
-            updateSearchMode();
+            updateSearchMode(true);
             // clear voice mode when user types
             setInVoiceMode(false, null);
         }
diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java
index 3033db4..94b1651 100644
--- a/src/com/android/browser/provider/BrowserProvider2.java
+++ b/src/com/android/browser/provider/BrowserProvider2.java
@@ -1142,12 +1142,20 @@
                     values.put(Bookmarks.DATE_MODIFIED, now);
                     values.put(Bookmarks.DIRTY, 1);
 
+                    String accountType = values
+                            .getAsString(Bookmarks.ACCOUNT_TYPE);
+                    String accountName = values
+                            .getAsString(Bookmarks.ACCOUNT_NAME);
+                    boolean hasParent = values.containsKey(Bookmarks.PARENT);
+                    if (hasParent) {
+                        // Let's make sure it's valid
+                        long parentId = values.getAsLong(Bookmarks.PARENT);
+                        hasParent = isValidParent(
+                                accountType, accountName, parentId);
+                    }
+
                     // If no parent is set default to the "Bookmarks Bar" folder
-                    if (!values.containsKey(Bookmarks.PARENT)) {
-                        String accountType = values
-                                .getAsString(Bookmarks.ACCOUNT_TYPE);
-                        String accountName = values
-                                .getAsString(Bookmarks.ACCOUNT_NAME);
+                    if (!hasParent) {
                         values.put(Bookmarks.PARENT,
                                 queryDefaultFolderId(accountName, accountType));
                     }
@@ -1226,6 +1234,27 @@
         }
     }
 
+    private boolean isValidParent(String accountType, String accountName,
+            long parentId) {
+        Uri uri = Bookmarks.buildFolderUri(parentId);
+        Cursor c = query(uri,
+                new String[] { Bookmarks.ACCOUNT_NAME, Bookmarks.ACCOUNT_TYPE },
+                null, null, null);
+        try {
+            if (c.moveToFirst()) {
+                String parentName = c.getString(0);
+                String parentType = c.getString(1);
+                if (TextUtils.equals(accountName, parentName)
+                        && TextUtils.equals(accountType, parentType)) {
+                    return true;
+                }
+            }
+            return false;
+        } finally {
+            c.close();
+        }
+    }
+
     private void filterSearchClient(String[] selectionArgs) {
         if (selectionArgs != null) {
             for (int i = 0; i < selectionArgs.length; i++) {