Merge from Chromium at DEPS revision 33.0.1750.126

This commit was generated by merge_to_master.py.

Change-Id: I963083558dc7f89f4b841561b519ae011f7a12f3
diff --git a/AUTHORS b/AUTHORS
index 9692411..23347b8 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -100,6 +100,7 @@
 Gnanasekar Somanathan <gnanasekar.s@samsung.com>
 Goutham Jagannatha <wrm364@motorola.com>
 Grzegorz Czajkowski <g.czajkowski@samsung.com>
+Guangzhen Li <guangzhen.li@intel.com>
 Gyuyoung Kim <gyuyoung.kim@samsung.com>
 Habib Virji <habib.virji@samsung.com>
 Haitao Feng <haitao.feng@intel.com>
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
index e3876cd..22e7c7d 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
@@ -58,28 +58,30 @@
 
         @Override
         public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) {
-            if (isMainFrame)
+            if (isMainFrame) {
                 AwContentsClient.this.onPageFinished(validatedUrl);
+            }
         }
 
         @Override
         public void didFailLoad(boolean isProvisionalLoad,
                 boolean isMainFrame, int errorCode, String description, String failingUrl) {
-            if (errorCode == NetError.ERR_ABORTED) {
-                // This error code is generated for the following reasons:
-                // - WebView.stopLoading is called,
-                // - the navigation is intercepted by the embedder via shouldOverrideNavigation.
-                //
-                // The Android WebView does not notify the embedder of these situations using this
-                // error code with the WebViewClient.onReceivedError callback.
-                return;
+            if (isMainFrame) {
+                if (errorCode != NetError.ERR_ABORTED) {
+                    // This error code is generated for the following reasons:
+                    // - WebView.stopLoading is called,
+                    // - the navigation is intercepted by the embedder via shouldOverrideNavigation.
+                    //
+                    // The Android WebView does not notify the embedder of these situations using
+                    // this error code with the WebViewClient.onReceivedError callback.
+                    AwContentsClient.this.onReceivedError(
+                            ErrorCodeConversionHelper.convertErrorCode(errorCode), description,
+                                    failingUrl);
+                }
+                // Need to call onPageFinished after onReceivedError (if there is an error) for
+                // backwards compatibility with the classic webview.
+                AwContentsClient.this.onPageFinished(failingUrl);
             }
-            if (!isMainFrame) {
-                // The Android WebView does not notify the embedder of sub-frame failures.
-                return;
-            }
-            AwContentsClient.this.onReceivedError(
-                    ErrorCodeConversionHelper.convertErrorCode(errorCode), description, failingUrl);
         }
 
         @Override
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
index 4e6fbdd..66e4f1e 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
@@ -55,11 +55,6 @@
             @Override
             public void onReceiveValue(Boolean value) {
                 proceedSslError(value.booleanValue(), id);
-                if (!value) {
-                    // For backward compatibility with the classic
-                    // webview, call onPageFinished after canceling ssl error.
-                    AwContentsClientBridge.this.mClient.onPageFinished(url);
-                }
             }
         };
         mClient.onReceivedSslError(callback, sslError);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
index 7d467b8..e7f358d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldOverrideUrlLoadingTest.java
@@ -32,60 +32,6 @@
     private static final String REDIRECT_TARGET_PATH = "/redirect_target.html";
     private static final String TITLE = "TITLE";
 
-    private static class TestAwContentsClient
-            extends org.chromium.android_webview.test.TestAwContentsClient {
-
-        public static class ShouldOverrideUrlLoadingHelper extends CallbackHelper {
-            private String mShouldOverrideUrlLoadingUrl;
-            private String mPreviousShouldOverrideUrlLoadingUrl;
-            private boolean mShouldOverrideUrlLoadingReturnValue = false;
-            void setShouldOverrideUrlLoadingUrl(String url) {
-                mShouldOverrideUrlLoadingUrl = url;
-            }
-            void setPreviousShouldOverrideUrlLoadingUrl(String url) {
-                mPreviousShouldOverrideUrlLoadingUrl = url;
-            }
-            void setShouldOverrideUrlLoadingReturnValue(boolean value) {
-                mShouldOverrideUrlLoadingReturnValue = value;
-            }
-            public String getShouldOverrideUrlLoadingUrl() {
-                assert getCallCount() > 0;
-                return mShouldOverrideUrlLoadingUrl;
-            }
-            public String getPreviousShouldOverrideUrlLoadingUrl() {
-                assert getCallCount() > 1;
-                return mPreviousShouldOverrideUrlLoadingUrl;
-            }
-            public boolean getShouldOverrideUrlLoadingReturnValue() {
-                return mShouldOverrideUrlLoadingReturnValue;
-            }
-            public void notifyCalled(String url) {
-                mPreviousShouldOverrideUrlLoadingUrl = mShouldOverrideUrlLoadingUrl;
-                mShouldOverrideUrlLoadingUrl = url;
-                notifyCalled();
-            }
-        }
-
-        @Override
-        public boolean shouldOverrideUrlLoading(String url) {
-            super.shouldOverrideUrlLoading(url);
-            boolean returnValue =
-                mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingReturnValue();
-            mShouldOverrideUrlLoadingHelper.notifyCalled(url);
-            return returnValue;
-        }
-
-        private ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper;
-
-        public TestAwContentsClient() {
-            mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper();
-        }
-
-        public ShouldOverrideUrlLoadingHelper getShouldOverrideUrlLoadingHelper() {
-            return mShouldOverrideUrlLoadingHelper;
-        }
-    }
-
     private TestWebServer mWebServer;
 
     @Override
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
index aaaa6cc..93f07fb 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -13,8 +13,6 @@
 import org.chromium.content.browser.test.util.TestCallbackHelperContainer;
 import org.chromium.net.test.util.TestWebServer;
 
-import java.util.concurrent.TimeUnit;
-
 /**
  * Tests for the ContentViewClient.onPageFinished() method.
  */
@@ -26,7 +24,11 @@
     @Override
     public void setUp() throws Exception {
         super.setUp();
-        mContentsClient = new TestAwContentsClient();
+        setTestAwContentsClient(new TestAwContentsClient());
+    }
+
+    private void setTestAwContentsClient(TestAwContentsClient contentsClient) throws Exception {
+        mContentsClient = contentsClient;
         final AwTestContainerView testContainerView =
                 createAwTestContainerViewOnMainSync(mContentsClient);
         mAwContents = testContainerView.getAwContents();
@@ -49,27 +51,79 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testOnPageFinishedCalledAfterError() throws Throwable {
+        setTestAwContentsClient(new TestAwContentsClient() {
+            private boolean isOnReceivedErrorCalled = false;
+            private boolean isOnPageFinishedCalled = false;
+
+            @Override
+            public void onReceivedError(int errorCode, String description, String failingUrl) {
+                isOnReceivedErrorCalled = true;
+                // Make sure onReceivedError is called before onPageFinished
+                assertEquals(false, isOnPageFinishedCalled);
+                super.onReceivedError(errorCode, description, failingUrl);
+            }
+
+            @Override
+            public void onPageFinished(String url) {
+                isOnPageFinishedCalled = true;
+                // Make sure onReceivedError is called before onPageFinished
+                assertEquals(true, isOnReceivedErrorCalled);
+                super.onPageFinished(url);
+            }
+        });
+
         TestCallbackHelperContainer.OnReceivedErrorHelper onReceivedErrorHelper =
                 mContentsClient.getOnReceivedErrorHelper();
         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
                 mContentsClient.getOnPageFinishedHelper();
 
-        assertEquals(0, onReceivedErrorHelper.getCallCount());
-
-        String url = "http://localhost:7/non_existent";
+        String invalidUrl = "http://localhost:7/non_existent";
         int onReceivedErrorCallCount = onReceivedErrorHelper.getCallCount();
         int onPageFinishedCallCount = onPageFinishedHelper.getCallCount();
-        loadUrlAsync(mAwContents, url);
+        loadUrlSync(mAwContents, onPageFinishedHelper, invalidUrl);
 
-        onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount,
-                                              1 /* numberOfCallsToWaitFor */,
-                                              WAIT_TIMEOUT_MS,
-                                              TimeUnit.MILLISECONDS);
-        onPageFinishedHelper.waitForCallback(onPageFinishedCallCount,
-                                             1 /* numberOfCallsToWaitFor */,
-                                             WAIT_TIMEOUT_MS,
-                                             TimeUnit.MILLISECONDS);
-        assertEquals(1, onReceivedErrorHelper.getCallCount());
+        assertEquals(invalidUrl, onReceivedErrorHelper.getFailingUrl());
+        assertEquals(invalidUrl, onPageFinishedHelper.getUrl());
+    }
+
+    @MediumTest
+    @Feature({"AndroidWebView"})
+    public void testOnPageFinishedCalledAfterRedirectedUrlIsOverridden() throws Throwable {
+        /*
+         * If url1 is redirected url2, and url2 load is overridden, onPageFinished should still be
+         * called for url2.
+         * Steps:
+         * 1. load url1. url1 onPageStarted
+         * 2. server redirects url1 to url2. url2 onPageStarted
+         * 3. shouldOverridedUrlLoading called for url2 and returns true
+         * 4. url2 onPageFinishedCalled
+         */
+
+        TestWebServer webServer = null;
+        try {
+            webServer = new TestWebServer(false);
+            final String redirectTargetPath = "/redirect_target.html";
+            final String redirectTargetUrl = webServer.setResponse(redirectTargetPath,
+                    "<html><body>hello world</body></html>", null);
+            final String redirectUrl = webServer.setRedirect("/302.html", redirectTargetUrl);
+
+            final TestAwContentsClient.ShouldOverrideUrlLoadingHelper urlOverrideHelper =
+                    mContentsClient.getShouldOverrideUrlLoadingHelper();
+            // Override the load of redirectTargetUrl
+            urlOverrideHelper.setShouldOverrideUrlLoadingReturnValue(true);
+
+            TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
+                mContentsClient.getOnPageFinishedHelper();
+
+            final int currentOnPageFinishedCallCount = onPageFinishedHelper.getCallCount();
+            loadUrlAsync(mAwContents, redirectUrl);
+
+            onPageFinishedHelper.waitForCallback(currentOnPageFinishedCallCount);
+            // onPageFinished needs to be called for redirectTargetUrl, but not for redirectUrl
+            assertEquals(redirectTargetUrl, onPageFinishedHelper.getUrl());
+        } finally {
+            if (webServer != null) webServer.shutdown();
+        }
     }
 
     @MediumTest
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java
index 70c8fc2..97cb7f1 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/TestAwContentsClient.java
@@ -23,6 +23,7 @@
     private final AddMessageToConsoleHelper mAddMessageToConsoleHelper;
     private final OnScaleChangedHelper mOnScaleChangedHelper;
     private final PictureListenerHelper mPictureListenerHelper;
+    private final ShouldOverrideUrlLoadingHelper mShouldOverrideUrlLoadingHelper;
 
     public TestAwContentsClient() {
         super(ThreadUtils.getUiThreadLooper());
@@ -33,6 +34,7 @@
         mAddMessageToConsoleHelper = new AddMessageToConsoleHelper();
         mOnScaleChangedHelper = new OnScaleChangedHelper();
         mPictureListenerHelper = new PictureListenerHelper();
+        mShouldOverrideUrlLoadingHelper = new ShouldOverrideUrlLoadingHelper();
     }
 
     public OnPageStartedHelper getOnPageStartedHelper() {
@@ -51,6 +53,10 @@
         return mOnEvaluateJavaScriptResultHelper;
     }
 
+    public ShouldOverrideUrlLoadingHelper getShouldOverrideUrlLoadingHelper() {
+        return mShouldOverrideUrlLoadingHelper;
+    }
+
     public AddMessageToConsoleHelper getAddMessageToConsoleHelper() {
         return mAddMessageToConsoleHelper;
     }
@@ -167,4 +173,44 @@
     public void onNewPicture(Picture picture) {
         mPictureListenerHelper.notifyCalled(picture);
     }
+
+    public static class ShouldOverrideUrlLoadingHelper extends CallbackHelper {
+        private String mShouldOverrideUrlLoadingUrl;
+        private String mPreviousShouldOverrideUrlLoadingUrl;
+        private boolean mShouldOverrideUrlLoadingReturnValue = false;
+        void setShouldOverrideUrlLoadingUrl(String url) {
+            mShouldOverrideUrlLoadingUrl = url;
+        }
+        void setPreviousShouldOverrideUrlLoadingUrl(String url) {
+            mPreviousShouldOverrideUrlLoadingUrl = url;
+        }
+        void setShouldOverrideUrlLoadingReturnValue(boolean value) {
+            mShouldOverrideUrlLoadingReturnValue = value;
+        }
+        public String getShouldOverrideUrlLoadingUrl() {
+            assert getCallCount() > 0;
+            return mShouldOverrideUrlLoadingUrl;
+        }
+        public String getPreviousShouldOverrideUrlLoadingUrl() {
+            assert getCallCount() > 1;
+            return mPreviousShouldOverrideUrlLoadingUrl;
+        }
+        public boolean getShouldOverrideUrlLoadingReturnValue() {
+            return mShouldOverrideUrlLoadingReturnValue;
+        }
+        public void notifyCalled(String url) {
+            mPreviousShouldOverrideUrlLoadingUrl = mShouldOverrideUrlLoadingUrl;
+            mShouldOverrideUrlLoadingUrl = url;
+            notifyCalled();
+        }
+    }
+
+    @Override
+    public boolean shouldOverrideUrlLoading(String url) {
+        super.shouldOverrideUrlLoading(url);
+        boolean returnValue =
+            mShouldOverrideUrlLoadingHelper.getShouldOverrideUrlLoadingReturnValue();
+        mShouldOverrideUrlLoadingHelper.notifyCalled(url);
+        return returnValue;
+    }
 }
diff --git a/build/util/LASTCHANGE b/build/util/LASTCHANGE
index c888255..345fd18 100644
--- a/build/util/LASTCHANGE
+++ b/build/util/LASTCHANGE
@@ -1 +1 @@
-LASTCHANGE=251877
+LASTCHANGE=252176
diff --git a/build/util/LASTCHANGE.blink b/build/util/LASTCHANGE.blink
index 88c386e..b2aa772 100644
--- a/build/util/LASTCHANGE.blink
+++ b/build/util/LASTCHANGE.blink
@@ -1 +1 @@
-LASTCHANGE=167220
+LASTCHANGE=167404
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index 3973fb8..1331ca2 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -909,7 +909,8 @@
   CleanUpGLIfNeeded();
 
   default_resource_type_ = Bitmap;
-  max_texture_size_ = INT_MAX / 2;
+  // Pick an arbitrary limit here similar to what hardware might.
+  max_texture_size_ = 16 * 1024;
   best_texture_format_ = RGBA_8888;
 }
 
diff --git a/chrome/VERSION b/chrome/VERSION
index 60c4287..c9a982c 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=33
 MINOR=0
 BUILD=1750
-PATCH=115
+PATCH=126
diff --git a/chrome/browser/chrome_page_zoom.cc b/chrome/browser/chrome_page_zoom.cc
index ae596ce..8fb9cf9 100644
--- a/chrome/browser/chrome_page_zoom.cc
+++ b/chrome/browser/chrome_page_zoom.cc
@@ -65,14 +65,13 @@
 }
 
 void Zoom(content::WebContents* web_contents, content::PageZoom zoom) {
-  content::RenderViewHost* host = web_contents->GetRenderViewHost();
   double current_zoom_level = web_contents->GetZoomLevel();
   double default_zoom_level =
       Profile::FromBrowserContext(web_contents->GetBrowserContext())->
           GetPrefs()->GetDouble(prefs::kDefaultZoomLevel);
 
   if (zoom == content::PAGE_ZOOM_RESET) {
-    host->SetZoomLevel(default_zoom_level);
+    web_contents->SetZoomLevel(default_zoom_level);
     content::RecordAction(UserMetricsAction("ZoomNormal"));
     return;
   }
@@ -90,7 +89,7 @@
       if (content::ZoomValuesEqual(zoom_level, current_zoom_level))
         continue;
       if (zoom_level < current_zoom_level) {
-        host->SetZoomLevel(zoom_level);
+        web_contents->SetZoomLevel(zoom_level);
         content::RecordAction(UserMetricsAction("ZoomMinus"));
         return;
       }
@@ -105,7 +104,7 @@
       if (content::ZoomValuesEqual(zoom_level, current_zoom_level))
         continue;
       if (zoom_level > current_zoom_level) {
-        host->SetZoomLevel(zoom_level);
+        web_contents->SetZoomLevel(zoom_level);
         content::RecordAction(UserMetricsAction("ZoomPlus"));
         return;
       }
diff --git a/chrome/browser/chromeos/login/auth_sync_observer.cc b/chrome/browser/chromeos/login/auth_sync_observer.cc
index 4c623c2..c5b80bf 100644
--- a/chrome/browser/chromeos/login/auth_sync_observer.cc
+++ b/chrome/browser/chromeos/login/auth_sync_observer.cc
@@ -10,6 +10,8 @@
 #include "chrome/browser/sync/profile_sync_service.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/common/pref_names.h"
+#include "content/public/browser/user_metrics.h"
+#include "content/public/common/user_metrics_action.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 
 class Profile;
@@ -43,6 +45,7 @@
          UserManager::Get()->IsLoggedInAsLocallyManagedUser());
   ProfileSyncService* sync_service =
       ProfileSyncServiceFactory::GetForProfile(profile_);
+  User* user = UserManager::Get()->GetUserByProfile(profile_);
   GoogleServiceAuthError::State state =
       sync_service->GetAuthError().state();
   if (state != GoogleServiceAuthError::NONE &&
@@ -54,21 +57,40 @@
     // TODO(nkostylev): Remove after crosbug.com/25978 is implemented.
     LOG(WARNING) << "Invalidate OAuth token because of a sync error: "
                  << sync_service->GetAuthError().ToString();
-    std::string email = profile_->GetProfileName();
-    if (email.empty() && UserManager::Get()->IsLoggedInAsLocallyManagedUser()) {
-      std::string sync_id =
-          profile_->GetPrefs()->GetString(prefs::kManagedUserId);
-      const User* user =
-          UserManager::Get()->GetSupervisedUserManager()->FindBySyncId(sync_id);
-      if (user)
-        email = user->email();
-    }
+    std::string email = user->email();
     DCHECK(!email.empty());
     // TODO(nkostyelv): Change observer after active user has changed.
-    UserManager::Get()->SaveUserOAuthStatus(
-        gaia::CanonicalizeEmail(email),
+    User::OAuthTokenStatus old_status = user->oauth_token_status();
+    UserManager::Get()->SaveUserOAuthStatus(email,
         User::OAUTH2_TOKEN_STATUS_INVALID);
+    if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED &&
+        old_status != User::OAUTH2_TOKEN_STATUS_INVALID) {
+       // Attempt to restore token from file.
+       UserManager::Get()->GetSupervisedUserManager()->LoadSupervisedUserToken(
+           profile_,
+           base::Bind(&AuthSyncObserver::OnSupervisedTokenLoaded,
+               base::Unretained(this)));
+       content::RecordAction(
+           content::UserMetricsAction(
+               "ManagedUsers_Chromeos_Sync_Invalidated"));
+    }
+  } else if (state == GoogleServiceAuthError::NONE) {
+    if (user->GetType() == User::USER_TYPE_LOCALLY_MANAGED &&
+        user->oauth_token_status() == User::OAUTH2_TOKEN_STATUS_INVALID) {
+      LOG(ERROR) <<
+          "Got an incorrectly invalidated token case, restoring token status.";
+      UserManager::Get()->SaveUserOAuthStatus(
+          user->email(),
+          User::OAUTH2_TOKEN_STATUS_VALID);
+       content::RecordAction(
+           content::UserMetricsAction("ManagedUsers_Chromeos_Sync_Recovered"));
+    }
   }
 }
 
+void AuthSyncObserver::OnSupervisedTokenLoaded(const std::string& token) {
+  UserManager::Get()->GetSupervisedUserManager()->ConfigureSyncWithToken(
+      profile_, token);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/auth_sync_observer.h b/chrome/browser/chromeos/login/auth_sync_observer.h
index acfa063..063736a 100644
--- a/chrome/browser/chromeos/login/auth_sync_observer.h
+++ b/chrome/browser/chromeos/login/auth_sync_observer.h
@@ -35,6 +35,9 @@
   // ProfileSyncServiceObserver implementation.
   virtual void OnStateChanged() OVERRIDE;
 
+  // Called on attempt to restore supervised user token.
+  void OnSupervisedTokenLoaded(const std::string& token);
+
   Profile* profile_;
 
   DISALLOW_COPY_AND_ASSIGN(AuthSyncObserver);
diff --git a/chrome/browser/chromeos/login/fake_supervised_user_manager.cc b/chrome/browser/chromeos/login/fake_supervised_user_manager.cc
index af53e1a..d051917 100644
--- a/chrome/browser/chromeos/login/fake_supervised_user_manager.cc
+++ b/chrome/browser/chromeos/login/fake_supervised_user_manager.cc
@@ -55,4 +55,10 @@
   return std::string();
 }
 
+void FakeSupervisedUserManager::LoadSupervisedUserToken(
+    Profile * profile,
+    const LoadTokenCallback& callback) {
+  callback.Run("token");
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/fake_supervised_user_manager.h b/chrome/browser/chromeos/login/fake_supervised_user_manager.h
index d68ead1..e23e525 100644
--- a/chrome/browser/chromeos/login/fake_supervised_user_manager.h
+++ b/chrome/browser/chromeos/login/fake_supervised_user_manager.h
@@ -38,6 +38,12 @@
   virtual void SetCreationTransactionUserId(const std::string& user_id)
       OVERRIDE {}
   virtual void CommitCreationTransaction() OVERRIDE {}
+  virtual void LoadSupervisedUserToken(
+      Profile * profile,
+      const LoadTokenCallback& callback) OVERRIDE;
+  virtual void ConfigureSyncWithToken(
+      Profile* profile,
+      const std::string& token) OVERRIDE {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(FakeSupervisedUserManager);
diff --git a/chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.cc b/chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.cc
index f4a4f25..e3a21ae 100644
--- a/chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.cc
+++ b/chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.cc
@@ -4,42 +4,22 @@
 
 #include "chrome/browser/chromeos/login/managed/locally_managed_user_login_flow.h"
 
-#include "base/file_util.h"
-#include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/prefs/pref_registry_simple.h"
 #include "base/prefs/pref_service.h"
-#include "base/threading/sequenced_worker_pool.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/login/login_display_host_impl.h"
 #include "chrome/browser/chromeos/login/login_utils.h"
 #include "chrome/browser/chromeos/login/managed/locally_managed_user_constants.h"
 #include "chrome/browser/chromeos/login/managed/locally_managed_user_creation_screen.h"
+#include "chrome/browser/chromeos/login/supervised_user_manager.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/managed_mode/managed_user_service.h"
-#include "chrome/browser/managed_mode/managed_user_service_factory.h"
 #include "content/public/browser/browser_thread.h"
 
 using content::BrowserThread;
 
 namespace chromeos {
 
-namespace {
-
-std::string LoadSyncToken(base::FilePath profile_dir) {
-  std::string token;
-  base::FilePath token_file =
-      profile_dir.Append(kManagedUserTokenFilename);
-  LOG(INFO) << "Loading" << token_file.value();
-  if (!base::ReadFileToString(token_file, &token)) {
-    return std::string();
-  }
-  return token;
-}
-
-} // namespace
-
 LocallyManagedUserLoginFlow::LocallyManagedUserLoginFlow(
     const std::string& user_id)
     : ExtendedUserFlow(user_id),
@@ -78,10 +58,11 @@
 
 void LocallyManagedUserLoginFlow::ConfigureSync(const std::string& token) {
   data_loaded_ = true;
+
   // TODO(antrim): add error handling (no token loaded).
   // See also: http://crbug.com/312751
-  if (!token.empty())
-    ManagedUserServiceFactory::GetForProfile(profile_)->InitSync(token);
+  UserManager::Get()->GetSupervisedUserManager()->ConfigureSyncWithToken(
+      profile_, token);
 
   LoginUtils::Get()->DoBrowserLaunch(profile_, host());
   profile_ = NULL;
@@ -91,12 +72,8 @@
 void LocallyManagedUserLoginFlow::LaunchExtraSteps(
     Profile* profile) {
   profile_ = profile;
-  base::FilePath profile_dir = ProfileHelper::GetProfilePathByUserIdHash(
-      UserManager::Get()->GetUserByProfile(profile)->username_hash());
-  PostTaskAndReplyWithResult(
-      content::BrowserThread::GetBlockingPool(),
-      FROM_HERE,
-      base::Bind(&LoadSyncToken, profile_dir),
+  UserManager::Get()->GetSupervisedUserManager()->LoadSupervisedUserToken(
+      profile,
       base::Bind(
            &LocallyManagedUserLoginFlow::OnSyncSetupDataLoaded,
            weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/chromeos/login/supervised_user_manager.h b/chrome/browser/chromeos/login/supervised_user_manager.h
index 4b116a8..254706a 100644
--- a/chrome/browser/chromeos/login/supervised_user_manager.h
+++ b/chrome/browser/chromeos/login/supervised_user_manager.h
@@ -8,7 +8,9 @@
 #include <string>
 
 #include "base/basictypes.h"
+#include "base/callback.h"
 #include "base/strings/string16.h"
+#include "chrome/browser/profiles/profile.h"
 
 class PrefRegistrySimple;
 
@@ -21,6 +23,9 @@
 // lookup methods that make sense only for supervised users.
 class SupervisedUserManager {
  public:
+  typedef base::Callback<void(const std::string& /* token */)>
+      LoadTokenCallback;
+
   // Registers user manager preferences.
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
@@ -81,6 +86,14 @@
   // Remove locally managed user creation transaction record.
   virtual void CommitCreationTransaction() = 0;
 
+  // Loads a sync oauth token in background, and passes it to callback.
+  virtual void LoadSupervisedUserToken(Profile* profile,
+                                       const LoadTokenCallback& callback) = 0;
+
+  // Configures sync service with oauth token.
+  virtual void ConfigureSyncWithToken(Profile* profile,
+                                      const std::string& token) = 0;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(SupervisedUserManager);
 };
diff --git a/chrome/browser/chromeos/login/supervised_user_manager_impl.cc b/chrome/browser/chromeos/login/supervised_user_manager_impl.cc
index 8b5bf98..cbd9966 100644
--- a/chrome/browser/chromeos/login/supervised_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/supervised_user_manager_impl.cc
@@ -4,15 +4,22 @@
 
 #include "chrome/browser/chromeos/login/supervised_user_manager_impl.h"
 
+#include "base/file_util.h"
+#include "base/files/file_path.h"
 #include "base/prefs/pref_registry_simple.h"
 #include "base/prefs/pref_service.h"
 #include "base/prefs/scoped_user_pref_update.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/sequenced_worker_pool.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/login/managed/locally_managed_user_constants.h"
 #include "chrome/browser/chromeos/login/user_manager_impl.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/managed_mode/managed_user_service.h"
+#include "chrome/browser/managed_mode/managed_user_service_factory.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "content/public/browser/browser_thread.h"
 #include "google_apis/gaia/gaia_auth_util.h"
@@ -53,6 +60,16 @@
 const char kLocallyManagedUserCreationTransactionUserId[] =
     "LocallyManagedUserCreationTransactionUserId";
 
+std::string LoadSyncToken(base::FilePath profile_dir) {
+  std::string token;
+  base::FilePath token_file =
+      profile_dir.Append(chromeos::kManagedUserTokenFilename);
+  VLOG(1) << "Loading" << token_file.value();
+  if (!base::ReadFileToString(token_file, &token))
+    return std::string();
+  return token;
+}
+
 } // namespace
 
 namespace chromeos {
@@ -332,5 +349,24 @@
   }
 }
 
+void SupervisedUserManagerImpl::LoadSupervisedUserToken(
+    Profile* profile,
+    const LoadTokenCallback& callback) {
+  // TODO(antrim): use profile->GetPath() once we sure it is safe.
+  base::FilePath profile_dir = ProfileHelper::GetProfilePathByUserIdHash(
+      UserManager::Get()->GetUserByProfile(profile)->username_hash());
+  PostTaskAndReplyWithResult(
+      content::BrowserThread::GetBlockingPool(),
+      FROM_HERE,
+      base::Bind(&LoadSyncToken, profile_dir),
+      callback);
+}
+
+void SupervisedUserManagerImpl::ConfigureSyncWithToken(
+    Profile* profile,
+    const std::string& token) {
+  if (!token.empty())
+    ManagedUserServiceFactory::GetForProfile(profile)->InitSync(token);
+}
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/supervised_user_manager_impl.h b/chrome/browser/chromeos/login/supervised_user_manager_impl.h
index e31766e..737c484 100644
--- a/chrome/browser/chromeos/login/supervised_user_manager_impl.h
+++ b/chrome/browser/chromeos/login/supervised_user_manager_impl.h
@@ -42,6 +42,12 @@
   virtual void SetCreationTransactionUserId(const std::string& user_id)
       OVERRIDE;
   virtual void CommitCreationTransaction() OVERRIDE;
+  virtual void LoadSupervisedUserToken(
+      Profile * profile,
+      const LoadTokenCallback& callback) OVERRIDE;
+  virtual void ConfigureSyncWithToken(
+      Profile* profile,
+      const std::string& token) OVERRIDE;
 
  private:
   friend class UserManager;
diff --git a/chrome/browser/component_updater/component_updater_configurator.cc b/chrome/browser/component_updater/component_updater_configurator.cc
index c7be37d..daacf83 100644
--- a/chrome/browser/component_updater/component_updater_configurator.cc
+++ b/chrome/browser/component_updater/component_updater_configurator.cc
@@ -157,7 +157,7 @@
 }
 
 int ChromeConfigurator::NextCheckDelay() {
-  return fast_update_ ? 3 : (2 * kDelayOneHour);
+  return fast_update_ ? 3 : (6 * kDelayOneHour);
 }
 
 int ChromeConfigurator::StepDelayMedium() {
diff --git a/chrome/browser/component_updater/component_updater_service.cc b/chrome/browser/component_updater/component_updater_service.cc
index ffad89c..2ed6614 100644
--- a/chrome/browser/component_updater/component_updater_service.cc
+++ b/chrome/browser/component_updater/component_updater_service.cc
@@ -884,7 +884,7 @@
 
   // If there are updates pending we do a short wait, otherwise we take
   // a longer delay until we check the components again.
-  ScheduleNextRun(num_updates_pending > 0 ? kStepDelayShort : kStepDelayMedium);
+  ScheduleNextRun(num_updates_pending > 0 ? kStepDelayShort : kStepDelayLong);
 }
 
 void CrxUpdateService::OnParseUpdateResponseFailed(
diff --git a/chrome/browser/managed_mode/managed_mode_url_filter.cc b/chrome/browser/managed_mode/managed_mode_url_filter.cc
index d60255f..2d04acd 100644
--- a/chrome/browser/managed_mode/managed_mode_url_filter.cc
+++ b/chrome/browser/managed_mode/managed_mode_url_filter.cc
@@ -35,10 +35,11 @@
 
 namespace {
 
-const char* kStandardSchemes[] = {
+// URL schemes not in this list (e.g., file:// and chrome://) will always be
+// allowed.
+const char* kFilteredSchemes[] = {
   "http",
   "https",
-  "file",
   "ftp",
   "gopher",
   "ws",
@@ -200,9 +201,9 @@
 }
 
 // static
-bool ManagedModeURLFilter::HasStandardScheme(const GURL& url) {
-  for (size_t i = 0; i < arraysize(kStandardSchemes); ++i) {
-      if (url.scheme() == kStandardSchemes[i])
+bool ManagedModeURLFilter::HasFilteredScheme(const GURL& url) {
+  for (size_t i = 0; i < arraysize(kFilteredSchemes); ++i) {
+      if (url.scheme() == kFilteredSchemes[i])
         return true;
     }
   return false;
@@ -256,7 +257,7 @@
   DCHECK(CalledOnValidThread());
 
   // URLs with a non-standard scheme (e.g. chrome://) are always allowed.
-  if (!HasStandardScheme(url))
+  if (!HasFilteredScheme(url))
     return ALLOW;
 
   // Check manual overrides for the exact URL.
diff --git a/chrome/browser/managed_mode/managed_mode_url_filter.h b/chrome/browser/managed_mode/managed_mode_url_filter.h
index 84457ca..c43326a 100644
--- a/chrome/browser/managed_mode/managed_mode_url_filter.h
+++ b/chrome/browser/managed_mode/managed_mode_url_filter.h
@@ -57,7 +57,7 @@
   // Returns true if the URL has a standard scheme. Only URLs with standard
   // schemes are filtered.
   // This method is public for testing.
-  static bool HasStandardScheme(const GURL& url);
+  static bool HasFilteredScheme(const GURL& url);
 
   // Returns true if the |host| matches the pattern. A pattern is a hostname
   // with one or both of the following modifications:
diff --git a/chrome/browser/managed_mode/managed_mode_url_filter_unittest.cc b/chrome/browser/managed_mode/managed_mode_url_filter_unittest.cc
index a8b839f..e1091e4 100644
--- a/chrome/browser/managed_mode/managed_mode_url_filter_unittest.cc
+++ b/chrome/browser/managed_mode/managed_mode_url_filter_unittest.cc
@@ -55,8 +55,12 @@
   EXPECT_TRUE(IsURLWhitelisted("https://x.mail.google.com/"));
   EXPECT_TRUE(IsURLWhitelisted("http://x.y.google.com/a/b"));
   EXPECT_FALSE(IsURLWhitelisted("http://youtube.com/"));
+
   EXPECT_TRUE(IsURLWhitelisted("bogus://youtube.com/"));
   EXPECT_TRUE(IsURLWhitelisted("chrome://youtube.com/"));
+  EXPECT_TRUE(IsURLWhitelisted("chrome://extensions/"));
+  EXPECT_TRUE(IsURLWhitelisted("chrome-extension://foo/main.html"));
+  EXPECT_TRUE(IsURLWhitelisted("file:///home/chronos/user/Downloads/img.jpg"));
 }
 
 TEST_F(ManagedModeURLFilterTest, Inactive) {
@@ -183,21 +187,28 @@
   EXPECT_TRUE(IsURLWhitelisted("http://www.example.com/foo/?bar=baz#ref"));
 }
 
-TEST_F(ManagedModeURLFilterTest, HasStandardScheme) {
+TEST_F(ManagedModeURLFilterTest, HasFilteredScheme) {
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("http://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("http://example.com")));
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("https://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("https://example.com")));
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("ftp://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("ftp://example.com")));
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("gopher://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("gopher://example.com")));
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("ws://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("ws://example.com")));
   EXPECT_TRUE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("wss://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("wss://example.com")));
+
   EXPECT_FALSE(
-      ManagedModeURLFilter::HasStandardScheme(GURL("wtf://example.com")));
+      ManagedModeURLFilter::HasFilteredScheme(GURL("file://example.com")));
+  EXPECT_FALSE(
+      ManagedModeURLFilter::HasFilteredScheme(GURL("filesystem://80cols.com")));
+  EXPECT_FALSE(
+      ManagedModeURLFilter::HasFilteredScheme(GURL("chrome://example.com")));
+  EXPECT_FALSE(
+      ManagedModeURLFilter::HasFilteredScheme(GURL("wtf://example.com")));
 }
 
 TEST_F(ManagedModeURLFilterTest, HostMatchesPattern) {
diff --git a/chrome/browser/ui/gtk/zoom_bubble_gtk.cc b/chrome/browser/ui/gtk/zoom_bubble_gtk.cc
index 8c70cd2..cf73519 100644
--- a/chrome/browser/ui/gtk/zoom_bubble_gtk.cc
+++ b/chrome/browser/ui/gtk/zoom_bubble_gtk.cc
@@ -218,7 +218,7 @@
   double default_zoom_level = Profile::FromBrowserContext(
       web_contents_->GetBrowserContext())->GetPrefs()->GetDouble(
           prefs::kDefaultZoomLevel);
-  web_contents_->GetRenderViewHost()->SetZoomLevel(default_zoom_level);
+  web_contents_->SetZoomLevel(default_zoom_level);
 }
 
 gboolean ZoomBubbleGtk::OnMouseEnter(GtkWidget* widget,
diff --git a/components/policy/core/common/policy_loader_win.cc b/components/policy/core/common/policy_loader_win.cc
index 26f9364..0befaa2 100644
--- a/components/policy/core/common/policy_loader_win.cc
+++ b/components/policy/core/common/policy_loader_win.cc
@@ -125,6 +125,7 @@
   const PolicyMap::Entry* map_entry =
       policy->Get(policy::key::kExtensionInstallForcelist);
   if (map_entry && map_entry->value) {
+    int invalid_policies = 0;
     const base::ListValue* policy_list_value = NULL;
     if (!map_entry->value->GetAsList(&policy_list_value))
       return;
@@ -139,8 +140,10 @@
       if (pos == std::string::npos)
         continue;
       // Only allow custom update urls in enterprise environments.
-      if (!LowerCaseEqualsASCII(entry.substr(pos), kExpectedWebStoreUrl))
+      if (!LowerCaseEqualsASCII(entry.substr(pos), kExpectedWebStoreUrl)) {
         entry = kBlockedExtensionPrefix + entry;
+        invalid_policies++;
+      }
 
       filtered_values->AppendString(entry);
     }
@@ -148,6 +151,8 @@
                 map_entry->level, map_entry->scope,
                 filtered_values.release(),
                 map_entry->external_data_fetcher);
+    UMA_HISTOGRAM_COUNTS("EnterpriseCheck.InvalidPoliciesDetected",
+                         invalid_policies);
   }
 }
 
diff --git a/content/browser/browser_plugin/browser_plugin_embedder.cc b/content/browser/browser_plugin/browser_plugin_embedder.cc
index 1418f97..18bfc25 100644
--- a/content/browser/browser_plugin/browser_plugin_embedder.cc
+++ b/content/browser/browser_plugin/browser_plugin_embedder.cc
@@ -8,6 +8,7 @@
 #include "content/browser/browser_plugin/browser_plugin_guest.h"
 #include "content/browser/browser_plugin/browser_plugin_guest_manager.h"
 #include "content/browser/browser_plugin/browser_plugin_host_factory.h"
+#include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/browser_plugin/browser_plugin_constants.h"
 #include "content/common/browser_plugin/browser_plugin_messages.h"
@@ -22,6 +23,7 @@
 #include "content/public/common/result_codes.h"
 #include "content/public/common/url_constants.h"
 #include "net/base/escape.h"
+#include "ui/events/keycodes/keyboard_codes.h"
 
 namespace content {
 
@@ -79,15 +81,58 @@
   ++next_get_render_view_request_id_;
 }
 
+bool BrowserPluginEmbedder::DidSendScreenRectsCallback(
+   BrowserPluginGuest* guest) {
+  static_cast<RenderViewHostImpl*>(
+      guest->GetWebContents()->GetRenderViewHost())->SendScreenRects();
+  // Not handled => Iterate over all guests.
+  return false;
+}
+
 void BrowserPluginEmbedder::DidSendScreenRects() {
-  GetBrowserPluginGuestManager()->DidSendScreenRects(
-      static_cast<WebContentsImpl*>(web_contents()));
+  WebContentsImpl* embedder =
+      static_cast<WebContentsImpl*>(web_contents());
+  GetBrowserPluginGuestManager()->ForEachGuest(embedder, base::Bind(
+      &BrowserPluginEmbedder::DidSendScreenRectsCallback,
+      base::Unretained(this)));
+}
+
+bool BrowserPluginEmbedder::UnlockMouseIfNecessaryCallback(
+    const NativeWebKeyboardEvent& event,
+    BrowserPluginGuest* guest) {
+  return guest->UnlockMouseIfNecessary(event);
 }
 
 bool BrowserPluginEmbedder::HandleKeyboardEvent(
     const NativeWebKeyboardEvent& event) {
-  return GetBrowserPluginGuestManager()->UnlockMouseIfNecessary(
-      static_cast<WebContentsImpl*>(web_contents()), event);
+  if ((event.type != blink::WebInputEvent::RawKeyDown) ||
+      (event.windowsKeyCode != ui::VKEY_ESCAPE) ||
+      (event.modifiers & blink::WebInputEvent::InputModifiers)) {
+    return false;
+  }
+
+  WebContentsImpl* embedder =
+      static_cast<WebContentsImpl*>(web_contents());
+  return GetBrowserPluginGuestManager()->ForEachGuest(embedder, base::Bind(
+      &BrowserPluginEmbedder::UnlockMouseIfNecessaryCallback,
+      base::Unretained(this),
+      event));
+}
+
+bool BrowserPluginEmbedder::SetZoomLevelCallback(
+    double level, BrowserPluginGuest* guest) {
+  guest->GetWebContents()->SetZoomLevel(level);
+  // Not handled => Iterate over all guests.
+  return false;
+}
+
+void BrowserPluginEmbedder::SetZoomLevel(double level) {
+  WebContentsImpl* embedder =
+      static_cast<WebContentsImpl*>(web_contents());
+  GetBrowserPluginGuestManager()->ForEachGuest(embedder, base::Bind(
+      &BrowserPluginEmbedder::SetZoomLevelCallback,
+      base::Unretained(this),
+      level));
 }
 
 void BrowserPluginEmbedder::RenderProcessGone(base::TerminationStatus status) {
diff --git a/content/browser/browser_plugin/browser_plugin_embedder.h b/content/browser/browser_plugin/browser_plugin_embedder.h
index c2c2a50..107fa61 100644
--- a/content/browser/browser_plugin/browser_plugin_embedder.h
+++ b/content/browser/browser_plugin/browser_plugin_embedder.h
@@ -67,6 +67,9 @@
     factory_ = factory;
   }
 
+  // Sets the zoom level for all guests within this embedder.
+  void SetZoomLevel(double level);
+
   // WebContentsObserver implementation.
   virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE;
   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
@@ -98,6 +101,13 @@
 
   BrowserPluginGuestManager* GetBrowserPluginGuestManager();
 
+  bool DidSendScreenRectsCallback(BrowserPluginGuest* guest);
+
+  bool SetZoomLevelCallback(double level, BrowserPluginGuest* guest);
+
+  bool UnlockMouseIfNecessaryCallback(const NativeWebKeyboardEvent& event,
+                                      BrowserPluginGuest* guest);
+
   // Message handlers.
 
   void OnAllocateInstanceID(int request_id);
diff --git a/content/browser/browser_plugin/browser_plugin_guest_manager.cc b/content/browser/browser_plugin/browser_plugin_guest_manager.cc
index 82d0565..ed91c1f 100644
--- a/content/browser/browser_plugin/browser_plugin_guest_manager.cc
+++ b/content/browser/browser_plugin/browser_plugin_guest_manager.cc
@@ -16,7 +16,6 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
 #include "net/base/escape.h"
-#include "ui/events/keycodes/keyboard_codes.h"
 
 namespace content {
 
@@ -227,40 +226,17 @@
                                                sync_point);
 }
 
-void BrowserPluginGuestManager::DidSendScreenRects(
-    WebContentsImpl* embedder_web_contents) {
-  // TODO(lazyboy): Generalize iterating over guest instances and performing
-  // actions on the guests.
+bool BrowserPluginGuestManager::ForEachGuest(
+    WebContentsImpl* embedder_web_contents, const GuestCallback& callback) {
   for (GuestInstanceMap::iterator it =
            guest_web_contents_by_instance_id_.begin();
-               it != guest_web_contents_by_instance_id_.end(); ++it) {
+       it != guest_web_contents_by_instance_id_.end(); ++it) {
     BrowserPluginGuest* guest = it->second->GetBrowserPluginGuest();
-    if (embedder_web_contents == guest->embedder_web_contents()) {
-      static_cast<RenderViewHostImpl*>(
-          guest->GetWebContents()->GetRenderViewHost())->SendScreenRects();
-    }
-  }
-}
+    if (embedder_web_contents != guest->embedder_web_contents())
+      continue;
 
-bool BrowserPluginGuestManager::UnlockMouseIfNecessary(
-    WebContentsImpl* embedder_web_contents,
-    const NativeWebKeyboardEvent& event) {
-  if ((event.type != blink::WebInputEvent::RawKeyDown) ||
-      (event.windowsKeyCode != ui::VKEY_ESCAPE) ||
-      (event.modifiers & blink::WebInputEvent::InputModifiers)) {
-    return false;
-  }
-
-  // TODO(lazyboy): Generalize iterating over guest instances and performing
-  // actions on the guests.
-  for (GuestInstanceMap::iterator it =
-           guest_web_contents_by_instance_id_.begin();
-               it != guest_web_contents_by_instance_id_.end(); ++it) {
-    BrowserPluginGuest* guest = it->second->GetBrowserPluginGuest();
-    if (embedder_web_contents == guest->embedder_web_contents()) {
-      if (guest->UnlockMouseIfNecessary(event))
-        return true;
-    }
+    if (callback.Run(guest))
+      return true;
   }
   return false;
 }
diff --git a/content/browser/browser_plugin/browser_plugin_guest_manager.h b/content/browser/browser_plugin/browser_plugin_guest_manager.h
index 1ce9a9f..5f3b3b9 100644
--- a/content/browser/browser_plugin/browser_plugin_guest_manager.h
+++ b/content/browser/browser_plugin/browser_plugin_guest_manager.h
@@ -36,7 +36,6 @@
 class SiteInstance;
 class WebContents;
 class WebContentsImpl;
-struct NativeWebKeyboardEvent;
 
 // WARNING: All APIs should be guarded with a process ID check like
 // CanEmbedderAccessInstanceIDMaybeKill, to prevent abuse by normal renderer
@@ -86,10 +85,9 @@
   bool CanEmbedderAccessInstanceIDMaybeKill(int embedder_render_process_id,
                                             int instance_id) const;
 
-  void DidSendScreenRects(WebContentsImpl* embedder_web_contents);
-
-  bool UnlockMouseIfNecessary(WebContentsImpl* embedder_web_contents_,
-                              const NativeWebKeyboardEvent& event);
+  typedef base::Callback<bool(BrowserPluginGuest*)> GuestCallback;
+  bool ForEachGuest(WebContentsImpl* embedder_web_contents,
+                    const GuestCallback& callback);
 
   void OnMessageReceived(const IPC::Message& message, int render_process_id);
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index b19331f..5c246db 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -2104,10 +2104,6 @@
   Send(new ViewMsg_ClearFocusedNode(GetRoutingID()));
 }
 
-void RenderViewHostImpl::SetZoomLevel(double level) {
-  Send(new ViewMsg_SetZoomLevel(GetRoutingID(), level));
-}
-
 void RenderViewHostImpl::Zoom(PageZoom zoom) {
   Send(new ViewMsg_Zoom(GetRoutingID(), zoom));
 }
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 13ff167..e92b939 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -207,7 +207,6 @@
   virtual void SetAltErrorPageURL(const GURL& url) OVERRIDE;
   virtual void SetWebUIProperty(const std::string& name,
                                 const std::string& value) OVERRIDE;
-  virtual void SetZoomLevel(double level) OVERRIDE;
   virtual void Zoom(PageZoom zoom) OVERRIDE;
   virtual void SyncRendererPrefs() OVERRIDE;
   virtual void ToggleSpeechInput() OVERRIDE;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index ac681ea..c5765d5 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2051,6 +2051,13 @@
   return id;
 }
 
+void WebContentsImpl::SetZoomLevel(double level) {
+  Send(new ViewMsg_SetZoomLevel(GetRoutingID(), level));
+  BrowserPluginEmbedder* embedder = GetBrowserPluginEmbedder();
+  if (embedder)
+    embedder->SetZoomLevel(level);
+}
+
 bool WebContentsImpl::FocusLocationBarByDefault() {
   NavigationEntry* entry = controller_.GetVisibleEntry();
   if (entry && entry->GetURL() == GURL(kAboutBlankURL))
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 0db67f2..4920224 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -268,6 +268,7 @@
                             bool is_favicon,
                             uint32_t max_bitmap_size,
                             const ImageDownloadCallback& callback) OVERRIDE;
+  virtual void SetZoomLevel(double level) OVERRIDE;
 #if defined(OS_ANDROID)
   virtual base::android::ScopedJavaLocalRef<jobject> GetJavaWebContents()
       OVERRIDE;
diff --git a/content/public/browser/render_view_host.h b/content/public/browser/render_view_host.h
index 366ad0d..f2efd36 100644
--- a/content/public/browser/render_view_host.h
+++ b/content/public/browser/render_view_host.h
@@ -253,9 +253,6 @@
   virtual void SetWebUIProperty(const std::string& name,
                                 const std::string& value) = 0;
 
-  // Set the zoom level for the current main frame
-  virtual void SetZoomLevel(double level) = 0;
-
   // Changes the zoom level for the current main frame.
   virtual void Zoom(PageZoom zoom) = 0;
 
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index a195ba3..0f59c77 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -466,6 +466,10 @@
                             uint32_t max_bitmap_size,
                             const ImageDownloadCallback& callback) = 0;
 
+  // Sets the zoom level for the current page and all BrowserPluginGuests
+  // within the page.
+  virtual void SetZoomLevel(double level) = 0;
+
 #if defined(OS_ANDROID)
   CONTENT_EXPORT static WebContents* FromJavaWebContents(
       jobject jweb_contents_android);
diff --git a/sandbox/linux/suid/sandbox.c b/sandbox/linux/suid/sandbox.c
index a161e19..238a647 100644
--- a/sandbox/linux/suid/sandbox.c
+++ b/sandbox/linux/suid/sandbox.c
@@ -58,6 +58,15 @@
   _exit(1);
 }
 
+static void ExitWithErrorSignalHandler(int signal) {
+  const char msg[] = "\nThe setuid sandbox got signaled, exiting.\n";
+  if (-1 == write(2, msg, sizeof(msg) - 1)) {
+    // Do nothing.
+  }
+
+  _exit(1);
+}
+
 // We will chroot() to the helper's /proc/self directory. Anything there will
 // not exist anymore if we make sure to wait() for the helper.
 //
@@ -195,6 +204,15 @@
   int exit_code = -1;
   siginfo_t reaped_child_info;
 
+  // Don't "Core" on SIGABRT. SIGABRT is sent by the Chrome OS session manager
+  // when things are hanging.
+  // Here, the current process is going to waitid() and _exit(), so there is no
+  // point in generating a crash report. The child process is the one
+  // blocking us.
+  if (signal(SIGABRT, ExitWithErrorSignalHandler) == SIG_ERR) {
+    FatalError("Failed to change signal handler");
+  }
+
   int wait_ret =
     HANDLE_EINTR(waitid(P_PID, child_pid, &reaped_child_info, WEXITED));